public async Task <ListResponse <TelemetryReportData> > GetForDeviceTypeAsync(DeviceRepository deviceRepo, string deviceTypeId, string recordType, ListRequest request, EntityHeader org, EntityHeader user)
        {
            if (deviceRepo.Instance == null)
            {
                return(ListResponse <TelemetryReportData> .FromError("No associated instance."));
            }

            await base.AuthorizeOrgAccessAsync(user, org, typeof(TelemetryReportData));

            var instance = await _deploymentInstanceRepo.GetInstanceAsync(deviceRepo.Instance.Id);

            if (instance.LogStorage.Value == LogStorage.Local)
            {
                var proxy = _proxyFactory.Create <ITelemetryService>(new ProxySettings {
                    OrganizationId = org.Id, InstanceId = deviceRepo.Instance.Id
                });
                return(await proxy.GetForDeviceTypeAsync(deviceTypeId, recordType, request));
            }
            else
            {
                return(await _telemetryService.GetForDeviceTypeAsync(deviceTypeId, recordType, request));
            }
        }
        public async Task <LagoVista.Core.Models.UIMetaData.ListResponse <DataStreamResult> > GetItemsAsync(string deviceId, LagoVista.Core.Models.UIMetaData.ListRequest request)
        {
            //TODO: Next chunk of code sux, likely much better way but will probably want to build a more robust filtering system at some point.
            ISearchResponse <Dictionary <string, object> > result = null;

            if (String.IsNullOrEmpty(request.StartDate) && String.IsNullOrEmpty(request.EndDate))
            {
                result = await _client.SearchAsync <Dictionary <string, object> >(src => src.From(0)
                                                                                  .Index(_stream.ESIndexName)
                                                                                  .Type(_stream.ESTypeName)
                                                                                  .From(request.PageIndex *request.PageSize)
                                                                                  .Size(request.PageSize)
                                                                                  .Sort(srt => srt.Descending(new Field("sortOrder"))));
            }
            else if (String.IsNullOrEmpty(request.StartDate))
            {
                var endTicks = request.EndDate.ToDateTime().Ticks;
                result = await _client.SearchAsync <Dictionary <string, object> >(src => src.From(0)
                                                                                  .Index(_stream.ESIndexName)
                                                                                  .Type(_stream.ESTypeName)
                                                                                  .Query(qry =>
                                                                                         qry.Range(rng => rng
                                                                                                   .Field("sortOrder")
                                                                                                   .LessThanOrEquals(endTicks)
                                                                                                   ))
                                                                                  .From(request.PageIndex *request.PageSize)
                                                                                  .Size(request.PageSize)
                                                                                  .Sort(srt => srt.Descending(new Field("sortOrder"))));
            }
            else if (String.IsNullOrEmpty(request.EndDate))
            {
                var startTicks = request.StartDate.ToDateTime().Ticks;

                result = await _client.SearchAsync <Dictionary <string, object> >(src => src.From(0)
                                                                                  .Index(_stream.ESIndexName)
                                                                                  .Type(_stream.ESTypeName)
                                                                                  .Query(qry =>
                                                                                         qry.Range(rng => rng
                                                                                                   .Field("sortOrder")
                                                                                                   .GreaterThanOrEquals(startTicks)
                                                                                                   ))
                                                                                  .From(request.PageIndex *request.PageSize)
                                                                                  .Size(request.PageSize)
                                                                                  .Sort(srt => srt.Descending(new Field("sortOrder"))));
            }
            else
            {
                var startTicks = request.StartDate.ToDateTime().Ticks;
                var endTicks   = request.EndDate.ToDateTime().Ticks;

                result = await _client.SearchAsync <Dictionary <string, object> >(src => src.From(0)
                                                                                  .Index(_stream.ESIndexName)
                                                                                  .Type(_stream.ESTypeName)
                                                                                  .Query(qry =>
                                                                                         qry.Range(rng => rng
                                                                                                   .Field("sortOrder")
                                                                                                   .GreaterThanOrEquals(startTicks)
                                                                                                   .LessThanOrEquals(endTicks)
                                                                                                   ))
                                                                                  .From(request.PageIndex *request.PageSize)
                                                                                  .Size(request.PageSize)
                                                                                  .Sort(srt => srt.Descending(new Field("sortOrder"))));
            }

            if (result.IsValid)
            {
                var records = new List <DataStreamResult>();
                foreach (var record in result.Documents)
                {
                    records.Add(new DataStreamResult()
                    {
                        /* Newtonsoft assumes the value is date time for something that looks like a date, time this dual conversion gets our standard ISO8601 date string */
                        Timestamp = record[_stream.TimeStampFieldName].ToString().ToDateTime().ToJSONString(),
                        Fields    = record
                    });
                }

                var response = Core.Models.UIMetaData.ListResponse <DataStreamResult> .Create(records);

                response.PageIndex      = request.PageIndex;
                response.PageSize       = records.Count;
                response.HasMoreRecords = response.PageSize == request.PageSize;

                return(response);
            }
            else
            {
                if (result.OriginalException != null)
                {
                    return(ListResponse <DataStreamResult> .FromError(result.OriginalException.Message));
                }
                else
                {
                    return(ListResponse <DataStreamResult> .FromError(result.DebugInformation));
                }
            }
        }
示例#3
0
        public async Task <ListResponse <DataStreamResult> > GetItemsAsync(string deviceId, LagoVista.Core.Models.UIMetaData.ListRequest request)
        {
            var filter = TableQuery.GenerateFilterCondition(nameof(Models.DataStreamTSEntity.PartitionKey), QueryComparisons.Equal, deviceId);

            var dateFilter = String.Empty;

            /* FYI - less than and greater than are reversed because the data is inserted wiht row keys in descending order */
            if (!String.IsNullOrEmpty(request.StartDate) && !String.IsNullOrEmpty(request.EndDate))
            {
                var startRowKey = request.StartDate.ToDateTime().ToInverseTicksRowKey();
                var endRowKey   = request.EndDate.ToDateTime().ToInverseTicksRowKey();

                dateFilter = TableQuery.CombineFilters(
                    TableQuery.GenerateFilterCondition(nameof(Models.DataStreamTSEntity.RowKey), QueryComparisons.LessThanOrEqual, startRowKey.ToString()),
                    TableOperators.And,
                    TableQuery.GenerateFilterCondition(nameof(Models.DataStreamTSEntity.RowKey), QueryComparisons.GreaterThanOrEqual, endRowKey.ToString())
                    );
            }
            else if (String.IsNullOrEmpty(request.StartDate) && !String.IsNullOrEmpty(request.EndDate))
            {
                var endRowKey = request.EndDate.ToDateTime().ToInverseTicksRowKey();
                dateFilter = TableQuery.GenerateFilterCondition(nameof(Models.DataStreamTSEntity.RowKey), QueryComparisons.GreaterThanOrEqual, endRowKey.ToString());
            }
            else if (String.IsNullOrEmpty(request.EndDate) && !String.IsNullOrEmpty(request.StartDate))
            {
                var startRowKey = request.StartDate.ToDateTime().ToInverseTicksRowKey();
                dateFilter = TableQuery.GenerateFilterCondition(nameof(Models.DataStreamTSEntity.RowKey), QueryComparisons.LessThanOrEqual, startRowKey.ToString());
            }

            if (!String.IsNullOrEmpty(dateFilter))
            {
                filter = TableQuery.CombineFilters(filter, TableOperators.And, dateFilter);
            }

            var query = new TableQuery <DynamicTableEntity>().Where(filter).Take(request.PageSize);

            var numberRetries = 5;
            var retryCount    = 0;
            var completed     = false;

            while (retryCount++ < numberRetries && !completed)
            {
                try
                {
                    TableQuerySegment <DynamicTableEntity> results;
                    if (!String.IsNullOrEmpty(request.NextPartitionKey) && !String.IsNullOrEmpty(request.NextRowKey))
                    {
                        var token = new TableContinuationToken()
                        {
                            NextPartitionKey = request.NextPartitionKey,
                            NextRowKey       = request.NextRowKey
                        };

                        results = await _cloudTable.ExecuteQuerySegmentedAsync <DynamicTableEntity>(query, token);
                    }
                    else
                    {
                        results = await _cloudTable.ExecuteQuerySegmentedAsync <DynamicTableEntity>(query, new TableContinuationToken());
                    }

                    var listResponse = new ListResponse <DataStreamResult>
                    {
                        NextRowKey       = results.ContinuationToken?.NextRowKey,
                        NextPartitionKey = results.ContinuationToken?.NextPartitionKey,
                        PageSize         = results.Count(),
                        HasMoreRecords   = results.ContinuationToken != null,
                    };

                    var resultSet = new List <DataStreamResult>();

                    foreach (var item in results)
                    {
                        var result = new DataStreamResult();
                        foreach (var property in item.Properties)
                        {
                            result.Add(property.Key, property.Value.PropertyAsObject);
                        }

                        switch (_stream.DateStorageFormat.Value)
                        {
                        case DateStorageFormats.Epoch:
                            long epoch = Convert.ToInt64(item.Properties[_stream.TimestampFieldName]);
                            result.Timestamp = DateTimeOffset.FromUnixTimeSeconds(epoch).DateTime.ToJSONString();
                            break;

                        case DateStorageFormats.ISO8601:
                            result.Timestamp = item.Properties[_stream.TimestampFieldName].StringValue.ToDateTime().ToJSONString();
                            break;
                        }

                        resultSet.Add(result);
                    }


                    listResponse.Model = resultSet;

                    return(listResponse);
                }
                catch (Exception ex)
                {
                    if (retryCount == numberRetries)
                    {
                        _logger.AddException("AzureTableStorageConnector_GetItemsAsync", ex);
                        return(ListResponse <DataStreamResult> .FromError(ex.Message));
                    }
                    else
                    {
                        _logger.AddCustomEvent(LagoVista.Core.PlatformSupport.LogLevel.Warning, "AzureTableStorageConnector_GetItemsAsync", "", ex.Message.ToKVP("exceptionMessage"), ex.GetType().Name.ToKVP("exceptionType"), retryCount.ToString().ToKVP("retryCount"));
                    }
                    await Task.Delay(retryCount * 250);
                }
                finally
                {
                }
            }

            _logger.AddException("AzureTableStorageConnector_GetItemsAsync", new Exception("Unexpected end of method"));
            return(ListResponse <DataStreamResult> .FromError("Unexpected end of method."));
        }