/// <inheritdoc/> public static Protobuf.TimeSeriesFrame Compress(this Protobuf.TimeSeriesFrame frame) { ByteString payload; switch (frame.PayloadCase) { case Protobuf.TimeSeriesFrame.PayloadOneofCase.UncompressedPayload: payload = ByteString.CopyFrom(Ionic.Zlib.ZlibStream.CompressBuffer(frame.UncompressedPayload.ToByteArray())); break; case Protobuf.TimeSeriesFrame.PayloadOneofCase.CompressedPayload: payload = frame.CompressedPayload; break; case Protobuf.TimeSeriesFrame.PayloadOneofCase.None: payload = null; break; default: throw new Exception(); } return(new Protobuf.TimeSeriesFrame(frame) { CompressedPayload = 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)); }
/// <inheritdoc/> public static IEnumerable <DataPoint <dynamic> > DataPoints(this Protobuf.TimeSeriesFrame frame) { var timeSeriesId = new Guid(frame.TimeSeries.ToByteArray()); frame = frame.Uncompress(); var timestamps = frame.UncompressedPayload.Timestep .Aggregate((IEnumerable <long>) new List <long> { (long)frame.Timestamp }, (offsets, step) => offsets.Append(offsets.Last() + (long)step)) .Skip(1); var values = frame.UncompressedPayload.Values?.Value; var longitudes = frame.UncompressedPayload.Coordinates?.Longitudes; var latitudes = frame.UncompressedPayload.Coordinates?.Latitudes; var coordinates = longitudes?.Zip(latitudes, (longitude, latitude) => new Coordinate { Longitude = new Measurement <float> { Value = longitude }, Latitude = new Measurement <float> { Value = latitude } }); IEnumerable <DataPoint <dynamic> > dataPoints; switch (frame.UncompressedPayload.PayloadCase) { case Protobuf.TimeSeriesPayload.PayloadOneofCase.Values: dataPoints = timestamps.Zip(values, (timestamp, value) => new DataPoint <dynamic> { TimeSeries = timeSeriesId, Timestamp = timestamp, Value = value }); break; case Protobuf.TimeSeriesPayload.PayloadOneofCase.Coordinates: dataPoints = timestamps.Zip(coordinates, (timestamp, coordinate) => new DataPoint <dynamic> { TimeSeries = timeSeriesId, Timestamp = timestamp, Value = coordinate }); break; default: throw new Exception(); } return(dataPoints); }