diff --git a/CHANGELOG.md b/CHANGELOG.md index c4d26fcf6..2a310a8a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### Features 1. [#376](https://github.com/influxdata/influxdb-client-csharp/pull/376): Add `FluxRecord.Row` which stores response data in a list +1. [#404](https://github.com/influxdata/influxdb-client-csharp/pull/404): Expose `FluxCsvParser` as `AnnotatedCsvParser` ### Dependencies Update dependencies: diff --git a/Client.Core/Flux/Serialization/AnnotatedCsvParser.cs b/Client.Core/Flux/Serialization/AnnotatedCsvParser.cs new file mode 100644 index 000000000..a7173c054 --- /dev/null +++ b/Client.Core/Flux/Serialization/AnnotatedCsvParser.cs @@ -0,0 +1,48 @@ +using System.Collections.Generic; +using System.Threading; +using InfluxDB.Client.Core.Flux.Domain; +using InfluxDB.Client.Core.Flux.Internal; + +namespace InfluxDB.Client.Core.Flux.Serialization +{ + public interface IAnnotatedCsvParser + { + /// + /// Parsing query results in annotated CSV format into list of . + /// + /// Query results in annotated CSV format + /// To cancel the parsing + /// Parsed Annotated CSV into list of + List Parse(string annotatedCsv, CancellationToken cancellationToken = default); + } + + /// + /// Parser for processing Annotated CSV. + /// + public class AnnotatedCsvParser : IAnnotatedCsvParser + { + private readonly FluxCsvParser _parser; + + /// + /// Public constructor. + /// + public AnnotatedCsvParser() + { + _parser = new FluxCsvParser(); + } + + /// + /// Parsing query results in annotated CSV format into list of . + /// + /// Query results in annotated CSV format + /// To cancel the parsing + /// Parsed Annotated CSV into list of + public List Parse(string annotatedCsv, CancellationToken cancellationToken = default) + { + var consumer = new FluxCsvParser.FluxResponseConsumerTable(); + _parser.ParseFluxResponse(annotatedCsv, cancellationToken, consumer); + + return consumer.Tables; + } + } +} \ No newline at end of file diff --git a/Client.Legacy.Test/FluxCsvParserTest.cs b/Client.Legacy.Test/FluxCsvParserTest.cs index d6a85d986..157c92f09 100644 --- a/Client.Legacy.Test/FluxCsvParserTest.cs +++ b/Client.Legacy.Test/FluxCsvParserTest.cs @@ -7,6 +7,7 @@ using InfluxDB.Client.Core.Flux.Domain; using InfluxDB.Client.Core.Flux.Exceptions; using InfluxDB.Client.Core.Flux.Internal; +using InfluxDB.Client.Core.Flux.Serialization; using NodaTime; using NodaTime.Text; using NUnit.Framework; @@ -793,6 +794,23 @@ public void ParseDuplicateColumnNames() Assert.AreEqual(25.3, tables[0].Records[0].Row[7]); } + [Test] + public void AnnotatedCsvParser() + { + const string data = + "#datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,string,string,string,string,long,long,string\n" + + "#group,false,false,true,true,true,true,true,true,false,false,false\n" + + "#default,_result,,,,,,,,,,\n" + + ",result,table,_start,_stop,_field,_measurement,host,region,_value2,value1,value_str\n" + + ",,0,1677-09-21T00:12:43.145224192Z,2018-07-16T11:21:02.547596934Z,free,mem,A,west,121,11,test\n" + + ",,1,1677-09-21T00:12:43.145224192Z,2018-07-16T11:21:02.547596934Z,free,mem,B,west,484,22,test\n" + + ",,2,1677-09-21T00:12:43.145224192Z,2018-07-16T11:21:02.547596934Z,usage_system,cpu,A,west,1444,38,test\n" + + ",,3,1677-09-21T00:12:43.145224192Z,2018-07-16T11:21:02.547596934Z,user_usage,cpu,A,west,2401,49,test"; + + var tables = new AnnotatedCsvParser().Parse(data); + Assert.AreEqual(4, tables.Count); + } + private List ParseFluxResponse(string data) { var consumer = new FluxCsvParser.FluxResponseConsumerTable();