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); }
/// <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); }
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)); }
/// <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))); }
private static bool IsNowOrFuture(QboxDataQuery query) { return(query.From >= DateTime.UtcNow || query.To > DateTime.UtcNow); }