Example #1
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);
            }
        }
Example #2
0
 public ValuesResponse GetValues(ValuesQueryParameters parameters)
 {
     using (var session = _sessionFactory.OpenSession())
     {
         ValuesResponse values;
         return(_complexMetricValuesRetriever.TryGet(parameters, out values) ? values : _simpleMetricValuesRetriever.GetSimpleMetric(parameters, session));
     }
 }
Example #3
0
        public ValuesResponse GetSimpleMetric(ValuesQueryParameters parameters, ISession session)
        {
            var query = session.QueryOver <Measurement>()
                        .Where(x => x.Timestamp > parameters.From).And(x => x.Timestamp < parameters.To)
                        .JoinQueryOver(x => x.Sensor)
                        .Where(x => x.Guid == parameters.Id);
            var measurementsRowCount = query.RowCount();

            if (measurementsRowCount > MaxMeasurementsLimit)
            {
                throw new ArgumentException("Too big date/time range.");
            }

            var measurements = query.List();

            return(new ValuesResponse
            {
                Measurements = _pathBuilder.CreateForSensor(parameters.Id),
                Values = measurements.Select(x => _mapper.Map <SensorValue>(x)).ToArray()
            });
        }
Example #4
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());
        }