Esempio n. 1
0
        /// <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));
        }