Пример #1
0
        private static QboxDataQuery GetDrillDownQboxDataQuery(DateTime measureTime, QboxQueryResolution resolution, bool adjustHours)
        {
            QboxQueryResolution resolutionNew = resolution - 1;
            var query = new QboxDataQuery
            {
                AdjustHours = adjustHours,
                Resolution  = resolutionNew,
                From        = resolution.TruncateTime(measureTime)
            };

            switch (resolution)
            {
            case QboxQueryResolution.QuarterOfHour:
            case QboxQueryResolution.Hour:
            case QboxQueryResolution.Day:
                query.To = query.From.AddDays(1);
                break;

            case QboxQueryResolution.Month:
                query.To = query.From.AddMonths(1);
                break;

            case QboxQueryResolution.Year:
                query.To = query.From.AddYears(1);
                break;

            default:
                throw new NotSupportedException();
            }

            return(query);
        }
Пример #2
0
        /// <inheritdoc cref="IQboxCounterDataCache.GetOrCreateAsync(string, QboxDataQuery, Func{Task{QboxPagedDataQueryResult{QboxCounterData}}})"/>
        public async Task <QboxPagedDataQueryResult <QboxCounterData> > GetOrCreateAsync(
            string serialNumber,
            QboxDataQuery query,
            Func <Task <QboxPagedDataQueryResult <QboxCounterData> > > getDataFunc)
        {
            Guard.NotNullOrEmpty(serialNumber, nameof(serialNumber));
            Guard.NotNull(query, nameof(query));
            Guard.NotNull(getDataFunc, nameof(getDataFunc));

            if (IsNowOrFuture(query))
            {
                _logger.LogInformation("Query {Query} is a realtime query, getting fresh data from Azure Table Storage", JsonConvert.SerializeObject(query));

                return(await getDataFunc());
            }

            var(start, end) = query.Resolution.GetTruncatedTimeFrame(query.From, query.To);
            query.From      = start;
            query.To        = end;

            string key = ConstructCacheKey(serialNumber, start, end, query.Resolution);

            var cacheEntry = await _cache.GetAsync <QboxPagedDataQueryResult <QboxCounterData> >(key);

            if (cacheEntry == null)
            {
                // Key not in cache, so get data.
                cacheEntry = await getDataFunc();

                // Save data in cache.
                await _cache.SetAsync(key, cacheEntry, _defaultDistributedCacheEntryOptions);
            }

            return(cacheEntry);
        }
Пример #3
0
        public async Task <ActionResult> QueryAsync([NotNull, FromBody] QboxDataQuery query)
        {
            Guard.NotNull(query, nameof(query));

            var    claimsIdentity = (Auth0ClaimsIdentity)User.Identities.First(i => i is Auth0ClaimsIdentity);
            string serialNumber   = claimsIdentity.AppMetadata["qboxSerialNumber"].ToString();

            if (await _registrationService.GetQboxRegistrationDetailsAsync(serialNumber) == null)
            {
                return(BadRequest());
            }

            _logger.LogInformation("Querying {SerialNumber} with {Query}", serialNumber, JsonConvert.SerializeObject(query));

            var result = await _dataQueryService.QueryAsync(serialNumber, query);

            return(Ok(result));
        }
Пример #4
0
        /// <inheritdoc cref="IDataQueryService.QueryAsync(string, QboxDataQuery)"/>
        public async Task <QboxPagedDataQueryResult <QboxCounterData> > QueryAsync(string serialNumber, QboxDataQuery query)
        {
            Guard.NotNullOrEmpty(serialNumber, nameof(serialNumber));
            Guard.NotNull(query, nameof(query));

            return(await _cache.GetOrCreateAsync(serialNumber, query, () => _azureTablesService.QueryDataAsync(serialNumber, query.From, query.To, query.Resolution, query.AdjustHours)));
        }
Пример #5
0
 private static bool IsNowOrFuture(QboxDataQuery query)
 {
     return(query.From >= DateTime.UtcNow || query.To > DateTime.UtcNow);
 }