Ejemplo n.º 1
0
        private MultiReadResult <TKey, TEntry> Convert(List <TKey> requiredIds, InfluxResultSet <TEntry> resultSet, Sort sort)
        {
            IDictionary <string, ReadResult <TKey, TEntry> > results = new Dictionary <string, ReadResult <TKey, TEntry> >();

            foreach (var id in requiredIds)
            {
                results[_keyConverter.Convert(id)] = new ReadResult <TKey, TEntry>(id, sort);
            }

            for (int i = 0; i < requiredIds.Count; i++)
            {
                var id     = requiredIds[i];
                var result = resultSet.Results.FirstOrDefault(x => x.StatementId == i);
                if (result != null)
                {
                    var serie = result.Series.FirstOrDefault();
                    if (serie != null)
                    {
                        results[_keyConverter.Convert(id)] = new ReadResult <TKey, TEntry>(id, sort, serie.Rows);
                    }
                }
            }

            return(new MultiReadResult <TKey, TEntry>(results.Values.ToDictionary(x => x.Key)));
        }
        /// <summary>
        /// Perform your graph presentation stuff here. (Updates every refresh interval)
        /// </summary>
        private async void DrawData()
        {
            InfluxResultSet <DynamicInfluxRow> result = await _influxController.SimpleQuery(QueryBuilder.ItemTimeSpan(_Database, _RetentionPolicy, _Item, _TimeSpan));

            //var series = result.Results[0].Series[0].Name;

            var series = result.Results[0].Series[0];

            Debug.Log("result: " + result.Results[0].Series.Count + " rows: " + series.Rows.Count);

            /// This is how you can do if using Chart And Graph.

            /**
             * if (_graph != null)
             * {
             *  _graph.DataSource.StartBatch();  // start a new update batch
             *  _graph.DataSource.ClearCategory("CPU Load");  // clear the categories we have created in the inspector
             *
             *  foreach (DynamicInfluxRow row in series.Rows)
             *  {
             *      _graph.DataSource.AddPointToCategory("CPU Load", row.GetTimestamp().Value, float.Parse(row.GetField("value").ToString()));
             *  }
             *  _graph.DataSource.EndBatch(); // end the update batch . this call will render the graph
             * }
             */
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Query the database and return the dataset async
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public async Task <InfluxResultSet <DynamicInfluxRow> > SimpleQuery(string query)
        {
            InfluxClient client = new InfluxClient(new Uri(_InfluxHost), _Username, _Password);
            //Debug.Log("Querying Database with: " + query);
            InfluxResultSet <DynamicInfluxRow> resultSet = await client.ReadAsync <DynamicInfluxRow>(_Database, query);

            client.Dispose();
            return(resultSet);
        }
Ejemplo n.º 4
0
        public async Task <InfluxResult <DynamicInfluxRow> > ReadMeasurementById(string measurementId)
        {
            InfluxResultSet <DynamicInfluxRow> resultSet = await _influxClient.ReadAsync <DynamicInfluxRow>(TimeSeriesSettings.InfluxDatabase,
                                                                                                            "SELECT * FROM " + "\"" + measurementId + "\"");

            // resultSet will contain 1 result in the Results collection (or multiple if you execute multiple queries at once)
            InfluxResult <DynamicInfluxRow> result = resultSet.Results[0];

            return(result);
        }
Ejemplo n.º 5
0
        private SegmentedReadResult <TKey, TEntry> Convert(TKey id, InfluxResultSet <TEntry> resultSet, int segmentSize)
        {
            var      list    = resultSet.Results.FirstOrDefault()?.Series.FirstOrDefault()?.Rows;
            var      entries = (List <TEntry>)list;
            DateTime?to      = null;

            if (entries.Count > 0)
            {
                to = ((IEntry)entries[entries.Count - 1]).GetTimestamp();
            }
            var continuationToken = new ContinuationToken(entries.Count == segmentSize, to);

            return(new SegmentedReadResult <TKey, TEntry>(id, Sort.Descending, continuationToken, entries, CreateDeleteFunction(id, continuationToken, entries)));
        }
Ejemplo n.º 6
0
        public async Task <InfluxResult <DynamicInfluxRow> > ReadMeasurementById(string measurementId, string from, string to, string step)
        {
            StringBuilder query = new StringBuilder($"SELECT last(*) FROM \"{measurementId}\"");
            Dictionary <string, string> parameters = new Dictionary <string, string>();

            bool hasStartTime = !string.IsNullOrWhiteSpace(from);
            bool hasEndTime   = !string.IsNullOrWhiteSpace(to);

            if (hasStartTime || hasEndTime)
            {
                query.Append(" WHERE ");
                if (hasStartTime)
                {
                    query.Append("time >= $from");
                    parameters.Add("from", from);
                }
                if (hasStartTime && hasEndTime)
                {
                    query.Append(" AND ");
                }
                if (hasEndTime)
                {
                    query.Append("time <= $to");
                    parameters.Add("to", to);
                }
            }

            // Vibrant.InfluxDB.Client substitutes all parameters with single quotes (e.g. ...GROUP BY time('1m'))
            // but InfluxDB requires parameter for time(<interval>) function without quotes (e.g. ...time(1m))
            // so, the <step> string parameter should be validated in controller when received from user
            if (!string.IsNullOrWhiteSpace(step))
            {
                query.Append($" GROUP BY time({step})");
            }

            InfluxResultSet <DynamicInfluxRow> resultSet = await _influxClient.ReadAsync <DynamicInfluxRow>(TimeSeriesSettings.InfluxDatabase, query.ToString(), parameters);

            // resultSet will contain 1 result in the Results collection (or multiple if you execute multiple queries at once)
            InfluxResult <DynamicInfluxRow> result = resultSet.Results[0];

            return(result);
        }
Ejemplo n.º 7
0
        private async Task <bool> ConsumeNextQueryResultAsync()
        {
            // read the next object from the object iterator (stream)
            var queryResult = _objectIterator.ReadNext <QueryResult>();

            if (queryResult == null)
            {
                _currentResultSet = null;
                return(false);
            }

            // if we found something, construct a normal result object, and initialize our indices
            _currentResultSet = await ResultSetFactory.CreateAsync <TInfluxRow>(_client, new[] { queryResult }, _db, true, _options).ConfigureAwait(false);

            _currentResultIndex = -1;
            _currentSerieIndex  = -1;

            // indicate we found something
            return(true);
        }
Ejemplo n.º 8
0
        public async Task <RoomData[]> GetRuuviTagData()
        {
            InfluxResultSet <RoomData> result = await _influxClient.ReadAsync <RoomData>(_configuration.InfluxDbName, _query.Value);

            return(result.Results[0].Series.Select(MapToRoomData).ToArray());
        }
Ejemplo n.º 9
0
        private MultiReadResult <TKey, TEntry> Convert(IEnumerable <TKey> requiredIds, InfluxResultSet <TEntry> resultSet, Sort sort)
        {
            IDictionary <string, ReadResult <TKey, TEntry> > results = new Dictionary <string, ReadResult <TKey, TEntry> >();

            foreach (var id in requiredIds)
            {
                results[_keyConverter.Convert(id)] = new ReadResult <TKey, TEntry>(id, sort);
            }

            foreach (var result in resultSet.Results)
            {
                var serie = result.Series.FirstOrDefault();
                if (serie != null)
                {
                    ReadResult <TKey, TEntry> r;
                    if (results.TryGetValue(serie.Name, out r))
                    {
                        results[serie.Name] = new ReadResult <TKey, TEntry>(r.Key, sort, serie.Rows);
                    }
                }
            }

            return(new MultiReadResult <TKey, TEntry>(results.Values.ToDictionary(x => x.Key)));
        }
Ejemplo n.º 10
0
        private MultiTaggedReadResult <TEntry, TMeasureType> Convert(TMeasureType measureType, FieldQueryInfo[] fields, InfluxResultSet <DynamicInfluxRow> resultSet, Sort sort)
        {
            var output = new Dictionary <TagCollection, TaggedReadResult <TEntry, TMeasureType> >();

            var measureTypeName = measureType.GetName();
            var result          = resultSet.Results.FirstOrDefault();

            if (result != null)
            {
                foreach (var serie in result.Series)
                {
                    List <TEntry> entries = new List <TEntry>();

                    foreach (var row in serie.Rows)
                    {
                        // move all fields to new entry
                        IAggregatableEntry entry = new TEntry();
                        entry.SetTimestamp(row.GetTimestamp().Value);
                        entry.SetCount((int)(long)row.GetField(ReservedNames.Count));
                        for (int i = 0; i < fields.Length; i++)
                        {
                            var name = fields[i].FieldInfo.Key;
                            entry.SetField(name, row.GetField(name));
                        }
                        entries.Add((TEntry)entry);
                    }

                    var tags             = new TagCollection(serie.GroupedTags.ToDictionary(x => x.Key, x => (string)x.Value));
                    var taggedReadResiæt = new TaggedReadResult <TEntry, TMeasureType>(tags, sort, entries);

                    output.Add(tags, taggedReadResiæt);
                }
            }

            return(new MultiTaggedReadResult <TEntry, TMeasureType>(measureType, output));
        }