public List <MeasurementV2> ToMeasurements(TOA5 toa5) { List <MeasurementV2> measurements = new List <MeasurementV2>(); foreach (IObservation obs in toa5.Observations) { foreach (Variable variable in toa5.Metadata.Variables) { // Skip TIMESTAMP and RECORD if (variable.FieldName == "TIMESTAMP" || variable.FieldName == "RECORD") { continue; } MeasurementV2 measurement = CreateMeasurementFromVariable( variable, obs, toa5.Metadata); if (measurement != null) { measurements.Add(measurement); } } } return(measurements); }
// TODO: Much of this is copy/pasted from DocumentDbMeasurementV2Transformer, consider move logic to a shared class // WARNING: This assumes one physicalQuantity per Measurement -- it returns null Measurement on first PhysicalQuantity with value of null private MeasurementV2 CreateMeasurementFromVariable( Variable variable, T observation, Metadata metadata) { // Look up property based on string, get value var value = observation .GetType() .GetProperty( variable.FieldName .Replace("(", "") .Replace(")", "")) .GetValue(observation, null); // Ensure value is a number, don't create Measurement on null value (assumes Measurement only has one PhysicalQuantity) if (!(value is double? || value is decimal?|| value is int?)) { return(null); } string measurementName = Map.GetMeasurementName(variable.FieldName); // Check if variable is in list to be mapped if (String.IsNullOrEmpty(measurementName)) { return(null); } DateTime?measurementDateTime = Map.GetDateTimeMeasurement(observation); List <PhysicalQuantityV2> physicalQuantities = new List <PhysicalQuantityV2>() { new PhysicalQuantityV2( (double?)value, variable.Units, DateTime.UtcNow, EtlEventId) }; MeasurementV2 m = new MeasurementV2( "Measurement", measurementName, measurementDateTime, physicalQuantities); return(m); }
public List <U> Transform(TidyData tidyData) { List <U> samples = new List <U>(); foreach (T observation in tidyData.Observations) { // Maps class specific data, returns null if not able to map U sample = Map.GetSample(observation); if (sample == null) { continue; } sample.Type = DocumentType; sample.Project = Project; sample.AreaOfInterest = AreaOfInterest; sample.PartitionKey = $"{sample.Type}_{sample.AreaOfInterest}_{sample.Name}"; sample.Schema = Schema; sample.Measurements = new List <MeasurementV2>(); foreach (Variable variable in tidyData.Metadata.Variables) { // Create MeasurementV2s // Use a mapper that defines the variables to keep // if(variable in mappers.VariablesToKeep) MeasurementV2 measurement = CreateMeasurementFromVariable( variable, observation, tidyData.Metadata); if (measurement != null) { sample.Measurements.Add(measurement); } } samples.Add(sample); } return(samples); }
public static bool IsMeasurementRoughlyEqual( MeasurementV2 first, MeasurementV2 second) { return(first.AreaOfInterest == second.AreaOfInterest && first.Location == second.Location && first.PartitionKey == second.PartitionKey && first.PhysicalQuantities.Count == second.PhysicalQuantities.Count && ArePhysicalQuantityV2RoughlyEqual(first.PhysicalQuantities[0], second.PhysicalQuantities[0]) && first.Project == second.Project && first.Schema == second.Schema && first.TimestepSec == second.TimestepSec && first.Type == second.Type && first._attachments == second._attachments && first._etag == second._etag && first._rid == second._rid && first._self == second._self && first._ts == second._ts); }
private MeasurementV2 CreateMeasurementFromVariable( Variable variable, IObservation observation, Metadata metadata) { // Look up property based on string, get value var value = observation .GetType() .GetProperty( variable.FieldName .Replace("(", "") .Replace(")", "")) .GetValue(observation, null); // Ensure value is a number if (!(value is double? || value is decimal?|| value is int? || value is null)) { return(null); } string name = map.GetMeasurementName(variable.FieldName); // Check if variable is in list to be mapped if (String.IsNullOrEmpty(name)) { return(null); } DateTime measurementDateTime = new DateTime(observation.TIMESTAMP.Ticks, DateTimeKind.Utc); List <PhysicalQuantityV2> physicalQuantities = new List <PhysicalQuantityV2>() { new PhysicalQuantityV2( (double?)value, variable.Units, DateTime.UtcNow, EtlEventId) }; LocationV2 location = new LocationV2("Point", map.GetLatFromStation(metadata), map.GetLonFromStation(metadata)); string areaOfInterest = map.GetFieldID(metadata); MeasurementV2 m = new MeasurementV2( DocumentType, name, Schema, Project, areaOfInterest, location, measurementDateTime, physicalQuantities, Timestep); return(m); }