using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Linq;
using GSF.Data;
using GSF.TimeSeries.UI;
using GSF.TimeSeries.UI.DataModels;
namespace PowerCalculations.UI.DataModels
{
public class Phasor : DataModelBase
{
#region [ Members ]
private int m_id;
private int m_deviceId;
private string m_deviceName;
private string m_label;
private string m_type;
private string m_phase;
private int m_sourceIndex;
private Measurement m_angleMeasurement;
#endregion
#region [ Properties ]
public int ID
{
get { return m_id; }
set
{
if (m_id == value) return;
m_id = value;
OnPropertyChanged(nameof(ID));
}
}
public int DeviceID
{
get { return m_deviceId; }
set
{
if (m_deviceId == value) return;
m_deviceId = value;
OnPropertyChanged(nameof(DeviceID));
}
}
public string DeviceName
{
get { return m_deviceName; }
set
{
if (m_deviceName == value) return;
m_deviceName = value;
OnPropertyChanged(nameof(DeviceName));
}
}
public string Label
{
get { return m_label; }
set
{
if (m_label == value) return;
m_label = value;
OnPropertyChanged(nameof(Label));
}
}
public string Type
{
get { return m_type; }
set
{
if (m_type == value) return;
m_type = value;
OnPropertyChanged(nameof(Type));
}
}
public string Phase
{
get { return m_phase; }
set
{
if (m_phase == value) return;
m_phase = value;
OnPropertyChanged(nameof(Phase));
}
}
public int SourceIndex
{
get { return m_sourceIndex; }
set
{
if (m_sourceIndex == value) return;
m_sourceIndex = value;
OnPropertyChanged(nameof(SourceIndex));
}
}
private Measurement m_magnitudeMeasurement;
public Measurement MagnitudeMeasurement
{
get { return m_magnitudeMeasurement; }
set
{
if (m_magnitudeMeasurement == value) return;
m_magnitudeMeasurement = value;
OnPropertyChanged(nameof(MagnitudeMeasurement));
}
}
public Measurement AngleMeasurement
{
get { return m_angleMeasurement; }
set
{
if (m_angleMeasurement == value) return;
m_angleMeasurement = value;
OnPropertyChanged(nameof(AngleMeasurement));
}
}
#endregion
#region [ Statics ]
///
/// LoadKeys information as an style list.
///
/// to connection to database.
/// The type of phasors to load
/// Collection of .
public static IList LoadKeys(AdoDataConnection database, PhasorType filter = PhasorType.Any)
{
var createdConnection = false;
try
{
createdConnection = CreateConnection(ref database);
var phasorList = new List();
var query = "SELECT ID FROM Phasor";
if (filter != PhasorType.Any)
{
query += string.Format(" Where Type = '{0}'", filter == PhasorType.Voltage ? "V" : "I");
}
var calculationTable = database.Connection.RetrieveData(database.AdapterType, query, DefaultTimeout);
foreach (DataRow row in calculationTable.Rows)
{
phasorList.Add(row.ConvertField("Id"));
}
return phasorList;
}
finally
{
if (createdConnection && database != null)
database.Dispose();
}
}
///
/// Loads information as an style list.
///
/// to connection to database.
/// Keys of the measurement to be loaded from the database
/// Collection of .
public static ObservableCollection Load(AdoDataConnection database, IList keys)
{
var createdConnection = false;
try
{
createdConnection = CreateConnection(ref database);
Phasor[] phasorList = null;
if (keys != null && keys.Count > 0)
{
var commaSeparatedKeys = keys.Select(key => key.ToString()).Aggregate((str1, str2) => str1 + "," + str2);
var query = string.Format("select p.id, p.deviceid, d.acronym as DeviceAcronym, p.label, p.type, p.phase, p.sourceindex, mags.signalid as mag_signalid, angles.signalid as angle_signalid " +
"from phasor p left join measurement mags " +
"on mags.deviceid = p.deviceid and mags.phasorsourceindex = p.sourceindex and mags.signaltypeid in (1,3) " +
"left join measurement angles " +
"on angles.deviceid = p.deviceid and angles.phasorsourceindex = p.sourceindex and angles.signaltypeid in (2,4) " +
"left join device d " +
"on p.deviceid = d.id " +
"where p.id in ({0})", commaSeparatedKeys);
var phasorTable = database.Connection.RetrieveData(database.AdapterType, query, DefaultTimeout);
phasorList = new Phasor[phasorTable.Rows.Count];
foreach (DataRow row in phasorTable.Rows)
{
var id = row.ConvertField("Id");
var deviceId = row.ConvertField("DeviceId");
var deviceName = row.ConvertField("DeviceAcronym");
var label = row.ConvertField("Label");
var type = row.ConvertField("Type");
var phase = row.ConvertField("Phase");
var sourceIndex = row.ConvertField("SourceIndex");
var magnitudeSignalId = database.Guid(row, "mag_signalId");
var angleSignalId = database.Guid(row, "angle_signalId");
var measurements = Measurement.LoadFromKeys(database, (new[] {magnitudeSignalId, angleSignalId}).ToList());
phasorList[keys.IndexOf(id)] = new Phasor
{
ID = id,
DeviceID = deviceId,
DeviceName = deviceName,
Label = label,
Type = type,
Phase = phase,
SourceIndex = sourceIndex,
MagnitudeMeasurement = measurements.FirstOrDefault(m => m.SignalID == magnitudeSignalId),
AngleMeasurement = measurements.FirstOrDefault(m => m.SignalID == angleSignalId)
};
}
}
return new ObservableCollection(phasorList ?? new Phasor[0]);
}
finally
{
if (createdConnection && database != null)
database.Dispose();
}
}
#endregion
}
}