Example #1
0
        /// <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));
        }
Example #3
0
        /// <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);
        }