public void ParsesRequestObject()
        {
            var request = new TimeSeriesAnalyticsRequest()
            {
                Window     = Windows.Minutes,
                WindowSize = 1,
            };

            var serializerSettings = new JsonSerializerSettings();

            serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

            request.Fields.Add(new TimeSeriesAnalyticsRequestField()
            {
                Name = "int1", Operation = Operations.Average
            });

            var json = JsonConvert.SerializeObject(request, serializerSettings);

            Console.WriteLine(json);
        }
        public async Task DataStream_Postgres_Stream_Request_Test()
        {
            var stream    = GetValidStream();
            var connector = new PostgresqlConnector(_logger);

            AssertSuccessful(await connector.InitAsync(stream));

            var deviceId = "DEV001";

            var recordCount = 20;

            for (var idx = 0; idx < 20; ++idx)
            {
                var dateStamp = DateTime.Now.AddSeconds((idx - recordCount) * 20);
                AssertSuccessful(await AddRecord(connector, stream, deviceId, idx + 300, idx + 200, dateStamp.ToJSONString()));
            }

            var request = new TimeSeriesAnalyticsRequest()
            {
                Window     = Windows.Minutes,
                WindowSize = 1,
            };

            request.Fields.Add(new TimeSeriesAnalyticsRequestField()
            {
                Name = "int1", Operation = Operations.Average
            });

            var results = await connector.GetTimeSeriesAnalyticsAsync(request, new Core.Models.UIMetaData.ListRequest()
            {
                PageSize = 50
            });

            foreach (var result in results.Model)
            {
                Console.WriteLine(result);
            }
        }
 public Task <ListResponse <DataStreamResult> > GetTimeSeriesAnalyticsAsync(TimeSeriesAnalyticsRequest request, ListRequest listRequest)
 {
     throw new NotImplementedException("AWS S3 does not support stream");
 }
示例#4
0
        public async Task <ListResponse <DataStreamResult> > GetDataAsync(string datastreamid, [FromBody] TimeSeriesAnalyticsRequest request)
        {
            var dataStream = await _dataStreamManager.LoadFullDataStreamConfigurationAsync(datastreamid, OrgEntityHeader, UserEntityHeader);

            var connectorResult = DataStreamServices.GetConnector(dataStream.Result.StreamType.Value, _adminlogger);
            var connector       = connectorResult.Result;

            if (request.ListRequest == null)
            {
                request.ListRequest = new ListRequest()
                {
                    PageSize  = 50,
                    PageIndex = 1
                };
            }

            return(await connector.GetTimeSeriesAnalyticsAsync(request, request.ListRequest));
        }
        public async Task <ListResponse <DataStreamResult> > GetTimeSeriesAnalyticsAsync(TimeSeriesAnalyticsRequest request, ListRequest listRequest)
        {
            var fields     = new List <string>();
            var windowType = "";

            switch (request.Window)
            {
            case Windows.Seconds: windowType = "seconds"; break;

            case Windows.Minutes: windowType = "minutes"; break;

            case Windows.Hours: windowType = "hours"; break;

            case Windows.Days: windowType = "days"; break;

            case Windows.Months: windowType = "months"; break;

            case Windows.Years: windowType = "years"; break;
            }

            var sql = new StringBuilder($"select time_bucket('{request.WindowSize} {windowType}', {_stream.TimestampFieldName}) as period");

            fields.Add("period");
            sql.Append($", {_stream.DeviceIdFieldName}");
            fields.Add(_stream.DeviceIdFieldName);

            foreach (var method in request.Fields)
            {
                var operationType = "";
                switch (method.Operation)
                {
                case Operations.Average: operationType = "avg"; break;

                case Operations.Minimum: operationType = "min"; break;

                case Operations.Maximum: operationType = "max"; break;

                case Operations.Count: operationType = "count"; break;

                case Operations.Sum: operationType = "sum"; break;

                case Operations.Interpolate: operationType = "interpolate"; break;
                }

                if (String.IsNullOrEmpty(operationType))
                {
                    sql.Append($", {method.Name}");
                    fields.Add(method.Name);
                }
                else
                {
                    var fieldName = $"{operationType}_{method.Name}";
                    sql.Append($", {operationType}({method.Name}) as {fieldName}");
                    fields.Add(fieldName);
                }
            }

            sql.AppendLine();

            sql.AppendLine($"  from  {_stream.DbSchema}.{_stream.DbTableName}");
            sql.AppendLine($"  where 1 = 1"); /* just used to establish a where clause we can use by appending "and x = y" */

            foreach (var filterItem in request.Filter)
            {
                sql.AppendLine($"  and {filterItem.Key} = @parm{filterItem.Key}");
            }

            sql.AppendLine($"  group by period, {_stream.DeviceIdFieldName}");
            sql.AppendLine($"  order by period desc");
            sql.AppendLine($"   LIMIT {listRequest.PageSize} OFFSET {listRequest.PageSize * Math.Max(listRequest.PageIndex - 1, 0)} ");

            var responseItems = new List <DataStreamResult>();

            using (var cn = OpenConnection(_stream.DbName))
                using (var cmd = new NpgsqlCommand())
                {
                    cmd.Connection  = cn;
                    cmd.CommandText = sql.ToString();
                    Console.WriteLine(cmd.CommandText);

                    if (!String.IsNullOrEmpty(listRequest.NextRowKey))
                    {
                        cmd.Parameters.AddWithValue($"@lastDateStamp", listRequest.NextRowKey.ToDateTime());
                    }

                    if (!String.IsNullOrEmpty(listRequest.StartDate))
                    {
                        cmd.Parameters.AddWithValue($"@startDateStamp", listRequest.StartDate.ToDateTime());
                    }

                    if (!String.IsNullOrEmpty(listRequest.EndDate))
                    {
                        cmd.Parameters.AddWithValue($"@endDateStamp", listRequest.EndDate.ToDateTime());
                    }

                    foreach (var filterItem in request.Filter)
                    {
                        cmd.Parameters.AddWithValue($"@parm{filterItem.Key}", filterItem.Value);
                    }

                    cmd.CommandType = System.Data.CommandType.Text;

                    using (var rdr = await cmd.ExecuteReaderAsync())
                    {
                        while (rdr.Read())
                        {
                            var resultItem = new DataStreamResult();
                            for (var idx = 0; idx < rdr.FieldCount; ++idx)
                            {
                                resultItem.Add(fields[idx], rdr[idx]);
                            }

                            responseItems.Add(resultItem);
                        }
                    }
                }

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

            response.Model          = responseItems;
            response.PageSize       = responseItems.Count;
            response.PageIndex      = listRequest.PageIndex;
            response.HasMoreRecords = responseItems.Count == listRequest.PageSize && listRequest.PageSize > 0;
            if (response.HasMoreRecords)
            {
                response.NextRowKey = responseItems.Last().Timestamp;
            }

            return(response);
        }