/// <inheritdoc/> public static Protobuf.TimeSeriesPayload Append(this Protobuf.TimeSeriesPayload payload, IEnumerable <Protobuf.DataPoint> dataPoints) { payload = new Protobuf.TimeSeriesPayload(payload); var originTimestamp = (payload.Timestep.Count > 0) ? payload.LastTimestamp : dataPoints.First().Timestamp; var timeOffsets = dataPoints.Select(_ => _.Timestamp).TimestampToStepLength(originTimestamp).ToList(); payload.Timestep.AddRange(timeOffsets); var values = dataPoints.Where(_ => _.MeasurementCase == Protobuf.DataPoint.MeasurementOneofCase.Value).Select(_ => _.Value); var longitudes = dataPoints.Where(_ => _.MeasurementCase == Protobuf.DataPoint.MeasurementOneofCase.Coordinate).Select(_ => _.Coordinate.Longitude); var latitudes = dataPoints.Where(_ => _.MeasurementCase == Protobuf.DataPoint.MeasurementOneofCase.Coordinate).Select(_ => _.Coordinate.Latitude); if (payload.PayloadCase == Protobuf.TimeSeriesPayload.PayloadOneofCase.None) { switch (dataPoints.First().MeasurementCase) { case Protobuf.DataPoint.MeasurementOneofCase.Value: payload.Values = new Protobuf.TimeSeriesPayload.Types.Values(); break; case Protobuf.DataPoint.MeasurementOneofCase.Coordinate: payload.Coordinates = new Protobuf.TimeSeriesPayload.Types.Coordinates(); break; } } payload.Values?.Value?.AddRange(values); payload.Coordinates?.Longitudes?.AddRange(longitudes); payload.Coordinates?.Latitudes?.AddRange(latitudes); payload.LastTimestamp = dataPoints.Last().Timestamp; return(payload); }
/// <summary> /// /// </summary> /// <param name="dataPoints"></param> /// <returns></returns> public static IEnumerable <byte> Compress(IEnumerable <DataPoint <dynamic> > dataPoints) { if (dataPoints.Select(_ => _.TimeSeries).Distinct().Count() > 1) { throw new Exception("Unable to compress data points: All data points must come from the same time series."); } var timeSeries = ByteString.CopyFrom(dataPoints.First().TimeSeries.Value.ToByteArray()); var firstTimestamp = dataPoints.First().Timestamp.Value; var protobufDataPoints = dataPoints.Select(_ => _.ToProtobuf()).ToArray(); var frame = new Protobuf.TimeSeriesFrame { TimeSeries = timeSeries, Timestamp = (ulong)firstTimestamp }; var payload = new Protobuf.TimeSeriesPayload(); payload = payload.Append(protobufDataPoints); frame.UncompressedPayload = payload; frame = frame.Compress(); var encoded = frame.ToByteArray(); byte[] length = BitConverter.GetBytes((int)encoded.Length); return(length.Concat(encoded)); }