示例#1
0
        private SensorValue[] CountComplexValues(ComplexMetric metric, ValuesResponse simpleValues, ValuesQueryParameters parameters)
        {
            var values     = new List <SensorValue>();
            var windowSize = TimeSpan.FromMilliseconds(metric.WindowSize);

            // TODO this can be optimized if needed
            for (var valueDate = parameters.From;
                 valueDate < parameters.To;
                 valueDate += TimeSpan.FromMilliseconds(metric.Frequency))
            {
                var aggregateValues =
                    simpleValues.Values.Where(x => x.Timestamp < valueDate && x.Timestamp >= valueDate - windowSize);
                if (!aggregateValues.Any())
                {
                    continue;
                }

                var newValue = new SensorValue()
                {
                    Value     = aggregateValues.Select(x => x.Value).Average(),
                    Timestamp = valueDate
                };
                values.Add(newValue);
            }
            return(values.ToArray());
        }
示例#2
0
        public bool TryGet(ValuesQueryParameters parameters, out ValuesResponse values)
        {
            using (var session = _sessionFactory.OpenSession())
            {
                var metric = session.QueryOver <ComplexMetric>()
                             .Where(x => x.Guid == parameters.Id)
                             .SingleOrDefault();

                if (metric == null)
                {
                    values = null;
                    return(false);
                }

                var simpleValues = _simpleValuesRetriever.GetSimpleMetric(
                    new ValuesQueryParameters
                {
                    Id   = metric.Sensor.Guid,
                    From = parameters.From - TimeSpan.FromMilliseconds(metric.WindowSize),
                    To   = parameters.To
                }, session);

                var complexValues = CountComplexValues(metric, simpleValues, parameters);

                values = new ValuesResponse
                {
                    Measurements = _pathBuilder.CreateForSensor(parameters.Id),
                    Values       = complexValues
                };
                return(true);
            }
        }