diff --git a/.circleci/config.yml b/.circleci/config.yml index 3ed02d579d..ecf8ddf99a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -200,7 +200,7 @@ jobs: - maven-cache_v3-<< parameters.maven-image >>- - run: name: "Check generate site" - command: mvn clean site site:stage -DskipTests + command: mvn clean site site:stage -Dmaven.test.skip=true deploy-snapshot: docker: diff --git a/CHANGELOG.md b/CHANGELOG.md index ffb6a2c7a8..1fe5253d5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## 6.10.1 [2026-03-24] + +### Bug Fixes + +1. [#862](https://github.com/influxdata/influxdb-client-java/pull/862): Improved tags parsing. + - Supports InfluxQL queries involving tag keys and values that incorporate escaped special characters such as commas. e.g. (`"my_data,model\,\ uin=Droid\,\ C3PO ..."`) + - This support is stable for InfluxDB Enterprise v1.x databases and InfluxDB v2.x databases using legacy v1 query contexts - e.g (`/query?db=test_data`). + - Influxdb OSS v1.x uses slightly different escape semantics. Use of escaped commas or spaces in tag keys and values with this database can lead to unexpected behavior. Support for special tags with OSS 1.x is not included with this hotfix release. + ## 6.10.0 [2023-07-28] ### Bug Fixes diff --git a/client-core/pom.xml b/client-core/pom.xml index aa93034f9c..b8b5b32f7f 100644 --- a/client-core/pom.xml +++ b/client-core/pom.xml @@ -28,7 +28,7 @@ influxdb-client com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT influxdb-client-core @@ -66,7 +66,7 @@ scm:git:git@github.com:influxdata/influxdb-client-java.git scm:git:git@github.com:influxdata/influxdb-client-java.git https://github.com/influxdata/influxdb-client-java/tree/master - v6.10.0 + HEAD diff --git a/client-kotlin/README.md b/client-kotlin/README.md index 24be0c91bf..8a1747dc0e 100644 --- a/client-kotlin/README.md +++ b/client-kotlin/README.md @@ -303,26 +303,26 @@ The latest version for Maven dependency: com.influxdb influxdb-client-kotlin - 6.10.0 + 6.10.1 ``` Or when using with Gradle: ```groovy dependencies { - implementation "com.influxdb:influxdb-client-kotlin:6.10.0" + implementation "com.influxdb:influxdb-client-kotlin:6.10.1" } ``` ### Snapshot Repository -The snapshots are deployed into [OSS Snapshot repository](https://oss.sonatype.org/content/repositories/snapshots/). +The snapshots are deployed into [OSS Snapshot repository](https://central.sonatype.com/repository/maven-snapshots/). #### Maven ```xml ossrh OSS Snapshot repository - https://oss.sonatype.org/content/repositories/snapshots/ + https://central.sonatype.com/repository/maven-snapshots/ false @@ -334,6 +334,6 @@ The snapshots are deployed into [OSS Snapshot repository](https://oss.sonatype.o #### Gradle ``` repositories { - maven { url "https://oss.sonatype.org/content/repositories/snapshots" } + maven { url "https://central.sonatype.com/repository/maven-snapshots" } } ``` diff --git a/client-kotlin/pom.xml b/client-kotlin/pom.xml index ef25802651..a198c7d3a6 100644 --- a/client-kotlin/pom.xml +++ b/client-kotlin/pom.xml @@ -26,7 +26,7 @@ influxdb-client com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT 4.0.0 @@ -72,7 +72,7 @@ scm:git:git@github.com:influxdata/influxdb-client-java.git scm:git:git@github.com:influxdata/influxdb-client-java.git https://github.com/influxdata/influxdb-client-java/tree/master - v6.10.0 + HEAD diff --git a/client-legacy/README.md b/client-legacy/README.md index 44bff4aa4d..76cc321c8e 100644 --- a/client-legacy/README.md +++ b/client-legacy/README.md @@ -162,26 +162,26 @@ The latest version for Maven dependency: com.influxdb influxdb-client-flux - 6.10.0 + 6.10.1 ``` Or when using with Gradle: ```groovy dependencies { - implementation "com.influxdb:influxdb-client-flux:6.10.0" + implementation "com.influxdb:influxdb-client-flux:6.10.1" } ``` ### Snapshot Repository -The snapshots are deployed into [OSS Snapshot repository](https://oss.sonatype.org/content/repositories/snapshots/). +The snapshots are deployed into [OSS Snapshot repository](https://central.sonatype.com/repository/maven-snapshots/). #### Maven ```xml ossrh OSS Snapshot repository - https://oss.sonatype.org/content/repositories/snapshots/ + https://central.sonatype.com/repository/maven-snapshots/ false @@ -193,6 +193,6 @@ The snapshots are deployed into [OSS Snapshot repository](https://oss.sonatype.o #### Gradle ``` repositories { - maven { url "https://oss.sonatype.org/content/repositories/snapshots" } + maven { url "https://central.sonatype.com/repository/maven-snapshots" } } ``` diff --git a/client-legacy/pom.xml b/client-legacy/pom.xml index 2013916daa..e290f6154b 100644 --- a/client-legacy/pom.xml +++ b/client-legacy/pom.xml @@ -28,7 +28,7 @@ com.influxdb influxdb-client - 6.10.0 + 6.10.1-SNAPSHOT influxdb-client-flux @@ -66,7 +66,7 @@ scm:git:git@github.com:influxdata/influxdb-client-java.git scm:git:git@github.com:influxdata/influxdb-client-java.git https://github.com/influxdata/influxdb-client-java/tree/master - v6.10.0 + HEAD diff --git a/client-osgi/pom.xml b/client-osgi/pom.xml index 769974ba23..9b46ecc5c0 100644 --- a/client-osgi/pom.xml +++ b/client-osgi/pom.xml @@ -28,7 +28,7 @@ influxdb-client com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT influxdb-client-osgi @@ -65,7 +65,7 @@ scm:git:git@github.com:influxdata/influxdb-client-java.git scm:git:git@github.com:influxdata/influxdb-client-java.git https://github.com/influxdata/influxdb-client-java/tree/master - v6.10.0 + HEAD diff --git a/client-reactive/README.md b/client-reactive/README.md index 609d6b6793..2b9298234f 100644 --- a/client-reactive/README.md +++ b/client-reactive/README.md @@ -433,26 +433,26 @@ The latest version for Maven dependency: com.influxdb influxdb-client-reactive - 6.10.0 + 6.10.1 ``` Or when using with Gradle: ```groovy dependencies { - implementation "com.influxdb:influxdb-client-reactive:6.10.0" + implementation "com.influxdb:influxdb-client-reactive:6.10.1" } ``` ### Snapshot Repository -The snapshots are deployed into [OSS Snapshot repository](https://oss.sonatype.org/content/repositories/snapshots/). +The snapshots are deployed into [OSS Snapshot repository](https://central.sonatype.com/repository/maven-snapshots/). #### Maven ```xml ossrh OSS Snapshot repository - https://oss.sonatype.org/content/repositories/snapshots/ + https://central.sonatype.com/repository/maven-snapshots/ false @@ -464,6 +464,6 @@ The snapshots are deployed into [OSS Snapshot repository](https://oss.sonatype.o #### Gradle ``` repositories { - maven { url "https://oss.sonatype.org/content/repositories/snapshots" } + maven { url "https://central.sonatype.com/repository/maven-snapshots" } } ``` diff --git a/client-reactive/pom.xml b/client-reactive/pom.xml index 39a7c7ea65..3b494365e2 100644 --- a/client-reactive/pom.xml +++ b/client-reactive/pom.xml @@ -26,7 +26,7 @@ influxdb-client com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT 4.0.0 @@ -68,7 +68,7 @@ scm:git:git@github.com:influxdata/influxdb-client-java.git scm:git:git@github.com:influxdata/influxdb-client-java.git https://github.com/influxdata/influxdb-client-java/tree/master - v6.10.0 + HEAD diff --git a/client-scala/README.md b/client-scala/README.md index d2006db80c..393ca2eee3 100644 --- a/client-scala/README.md +++ b/client-scala/README.md @@ -257,14 +257,14 @@ The latest version for Maven dependency: com.influxdb influxdb-client-scala_2.12 - 6.10.0 + 6.10.1 ``` Or when using with Gradle: ```groovy dependencies { - implementation "com.influxdb:influxdb-client-scala_2.12:6.10.0" + implementation "com.influxdb:influxdb-client-scala_2.12:6.10.1" } ``` @@ -275,26 +275,26 @@ The latest version for Maven dependency: com.influxdb influxdb-client-scala_2.13 - 6.10.0 + 6.10.1 ``` Or when using with Gradle: ```groovy dependencies { - implementation "com.influxdb:influxdb-client-scala_2.13:6.10.0" + implementation "com.influxdb:influxdb-client-scala_2.13:6.10.1" } ``` ### Snapshot Repository -The snapshots are deployed into [OSS Snapshot repository](https://oss.sonatype.org/content/repositories/snapshots/). +The snapshots are deployed into [OSS Snapshot repository](https://central.sonatype.com/repository/maven-snapshots/). #### Maven ```xml ossrh OSS Snapshot repository - https://oss.sonatype.org/content/repositories/snapshots/ + https://central.sonatype.com/repository/maven-snapshots/ false @@ -306,6 +306,6 @@ The snapshots are deployed into [OSS Snapshot repository](https://oss.sonatype.o #### Gradle ``` repositories { - maven { url "https://oss.sonatype.org/content/repositories/snapshots" } + maven { url "https://central.sonatype.com/repository/maven-snapshots" } } ``` diff --git a/client-scala/cross/2.12/pom.xml b/client-scala/cross/2.12/pom.xml index 73dbf7d430..907be840f7 100644 --- a/client-scala/cross/2.12/pom.xml +++ b/client-scala/cross/2.12/pom.xml @@ -26,7 +26,7 @@ influxdb-client com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT ../../../pom.xml 4.0.0 @@ -68,7 +68,7 @@ scm:git:git@github.com:influxdata/influxdb-client-java.git scm:git:git@github.com:influxdata/influxdb-client-java.git https://github.com/influxdata/influxdb-client-java/tree/master - v6.10.0 + HEAD diff --git a/client-scala/cross/2.13/pom.xml b/client-scala/cross/2.13/pom.xml index 41c1840cfa..368bd007cc 100644 --- a/client-scala/cross/2.13/pom.xml +++ b/client-scala/cross/2.13/pom.xml @@ -26,7 +26,7 @@ influxdb-client com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT ../../../pom.xml 4.0.0 @@ -68,7 +68,7 @@ scm:git:git@github.com:influxdata/influxdb-client-java.git scm:git:git@github.com:influxdata/influxdb-client-java.git https://github.com/influxdata/influxdb-client-java/tree/master - v6.10.0 + HEAD diff --git a/client-test/pom.xml b/client-test/pom.xml index 1c872b670c..a113f5762f 100644 --- a/client-test/pom.xml +++ b/client-test/pom.xml @@ -28,7 +28,7 @@ influxdb-client com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT influxdb-client-test @@ -68,7 +68,7 @@ scm:git:git@github.com:influxdata/influxdb-client-java.git scm:git:git@github.com:influxdata/influxdb-client-java.git https://github.com/influxdata/influxdb-client-java/tree/master - v6.10.0 + HEAD diff --git a/client-utils/pom.xml b/client-utils/pom.xml index 031eeb3424..cc419e5268 100644 --- a/client-utils/pom.xml +++ b/client-utils/pom.xml @@ -28,7 +28,7 @@ influxdb-client com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT influxdb-client-utils @@ -66,7 +66,7 @@ scm:git:git@github.com:influxdata/influxdb-client-java.git scm:git:git@github.com:influxdata/influxdb-client-java.git https://github.com/influxdata/influxdb-client-java/tree/master - v6.10.0 + HEAD diff --git a/client/README.md b/client/README.md index 0539e7b531..97bbb884e8 100644 --- a/client/README.md +++ b/client/README.md @@ -1322,26 +1322,26 @@ The latest version for Maven dependency: com.influxdb influxdb-client-java - 6.10.0 + 6.10.1 ``` Or when using with Gradle: ```groovy dependencies { - implementation "com.influxdb:influxdb-client-java:6.10.0" + implementation "com.influxdb:influxdb-client-java:6.10.1" } ``` ### Snapshot Repository -The snapshots are deployed into [OSS Snapshot repository](https://oss.sonatype.org/content/repositories/snapshots/). +The snapshots are deployed into [OSS Snapshot repository](https://central.sonatype.com/repository/maven-snapshots/). #### Maven ```xml ossrh OSS Snapshot repository - https://oss.sonatype.org/content/repositories/snapshots/ + https://central.sonatype.com/repository/maven-snapshots/ false @@ -1353,7 +1353,7 @@ The snapshots are deployed into [OSS Snapshot repository](https://oss.sonatype.o #### Gradle ``` repositories { - maven { url "https://oss.sonatype.org/content/repositories/snapshots" } + maven { url "https://central.sonatype.com/repository/maven-snapshots" } } ``` diff --git a/client/pom.xml b/client/pom.xml index 053b7e723a..2a68650e61 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -26,7 +26,7 @@ influxdb-client com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT 4.0.0 @@ -68,7 +68,7 @@ scm:git:git@github.com:influxdata/influxdb-client-java.git scm:git:git@github.com:influxdata/influxdb-client-java.git https://github.com/influxdata/influxdb-client-java/tree/master - v6.10.0 + HEAD diff --git a/client/src/main/java/com/influxdb/client/internal/InfluxQLQueryApiImpl.java b/client/src/main/java/com/influxdb/client/internal/InfluxQLQueryApiImpl.java index f02f6d97e9..9926b04969 100644 --- a/client/src/main/java/com/influxdb/client/internal/InfluxQLQueryApiImpl.java +++ b/client/src/main/java/com/influxdb/client/internal/InfluxQLQueryApiImpl.java @@ -120,7 +120,9 @@ static InfluxQLQueryResult readInfluxQLResult( // All other columns are dynamically parsed final int dynamicColumnsStartIndex = 2; - try (CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT.builder().setIgnoreEmptyLines(false).build())) { + try (CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT.builder() + .setIgnoreEmptyLines(false) + .build())) { for (CSVRecord csvRecord : parser) { if (cancellable.isCancelled()) { break; @@ -180,11 +182,84 @@ static InfluxQLQueryResult readInfluxQLResult( private static Map parseTags(@Nonnull final String value) { final Map tags = new HashMap<>(); - if (value.length() > 0) { - for (String entry : value.split(",")) { - final String[] kv = entry.split("="); - tags.put(kv[0], kv[1]); + if (value.isEmpty()) { + return tags; + } + + StringBuilder currentKey = new StringBuilder(); + StringBuilder currentValue = new StringBuilder(); + boolean inValue = false; + boolean escaped = false; + boolean firstEscaped = false; + + for (int i = 0; i < value.length(); i++) { + char c = value.charAt(i); + + if (escaped) { + // current character is escaped - treat it as a literal + if (inValue) { + currentValue.append(c); + } else { + currentKey.append(c); + } + escaped = false; + continue; + } + + if (c == '\\') { + // start escape sequence + // preserve escape character + if (firstEscaped) { + escaped = true; + firstEscaped = false; + continue; + } + if (inValue) { + currentValue.append(c); + } else { + currentKey.append(c); + } + firstEscaped = true; + continue; } + + if (firstEscaped) { + firstEscaped = false; + continue; + } + + if (!inValue && c == '=') { + // unescaped '=' marks copula + inValue = true; + continue; + } + + if (inValue && c == ',') { + // unescaped comma separates key value pairs + // finalize + String key = currentKey.toString(); + String val = currentValue.toString(); + if (!key.isEmpty()) { + tags.put(key, val); + } + currentKey.setLength(0); + currentValue.setLength(0); + inValue = false; + continue; + } + + if (inValue) { + currentValue.append(c); + } else { + currentKey.append(c); + } + } + + // finalize last key/value pair if any + String key = currentKey.toString(); + String val = currentValue.toString(); + if (inValue && !key.isEmpty()) { + tags.put(key, val); } return tags; diff --git a/client/src/test/java/com/influxdb/client/ITInfluxQLQueryApi.java b/client/src/test/java/com/influxdb/client/ITInfluxQLQueryApi.java index 45dcda1a58..b3be45baa5 100644 --- a/client/src/test/java/com/influxdb/client/ITInfluxQLQueryApi.java +++ b/client/src/test/java/com/influxdb/client/ITInfluxQLQueryApi.java @@ -24,7 +24,10 @@ import java.io.IOException; import java.math.BigDecimal; import java.time.Instant; +import java.util.HashMap; +import java.util.Map; +import com.influxdb.LogLevel; import com.influxdb.client.domain.Bucket; import com.influxdb.client.domain.DBRPCreate; import com.influxdb.client.domain.InfluxQLQuery; @@ -81,7 +84,6 @@ void testShowDatabases() { .contains(DATABASE_NAME); } - @Test void testQueryData() { InfluxQLQueryResult result = influxQLQueryApi.query(new InfluxQLQuery("SELECT FIRST(\"free\") FROM \"influxql\"", DATABASE_NAME)); @@ -94,6 +96,31 @@ void testQueryData() { }); } + @Test + void testQueryWithTagsWithEscapedChars() { + Bucket bucket = influxDBClient.getBucketsApi().findBucketByName("my-bucket"); + influxDBClient.getWriteApiBlocking() + .writePoint(bucket.getId(), bucket.getOrgID(), new Point("specialTags") + .time(1655900000, WritePrecision.S) + .addField("free", 10) + .addTag("host", "A") + .addTag("region", "west") + .addTag("location", "vancouver\\,\\ BC") + .addTag("model\\,\\ uid","droid\\,\\ C3PO") + ); + + Map expectedTags = new HashMap<>(); + expectedTags.put("host", "A"); + expectedTags.put("region", "west"); + expectedTags.put("location", "vancouver\\,\\ BC"); + expectedTags.put("model\\,\\ uid","droid\\,\\ C3PO"); + + InfluxQLQueryResult result = influxQLQueryApi.query( + new InfluxQLQuery("SELECT * FROM \"specialTags\" GROUP BY *", DATABASE_NAME)); + + Assertions.assertThat(result.getResults().get(0).getSeries().get(0).getTags()).isEqualTo(expectedTags); + } + @Test void testQueryDataWithConversion() { InfluxQLQueryResult result = influxQLQueryApi.query( diff --git a/client/src/test/java/com/influxdb/client/internal/InfluxQLQueryApiImplTest.java b/client/src/test/java/com/influxdb/client/internal/InfluxQLQueryApiImplTest.java index 0f7f94bf1a..2fbf059e3c 100644 --- a/client/src/test/java/com/influxdb/client/internal/InfluxQLQueryApiImplTest.java +++ b/client/src/test/java/com/influxdb/client/internal/InfluxQLQueryApiImplTest.java @@ -24,13 +24,21 @@ import java.io.IOException; import java.io.StringReader; import java.time.Instant; +import java.util.AbstractMap; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; import com.influxdb.Cancellable; import com.influxdb.query.InfluxQLQueryResult; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; +import javax.annotation.Nonnull; + class InfluxQLQueryApiImplTest { private static final Cancellable NO_CANCELLING = new Cancellable() { @@ -44,6 +52,166 @@ public boolean isCancelled() { } }; + private static Map mapOf(@Nonnull final String... valuePairs) { + Map map = new HashMap<>(); + if (valuePairs.length % 2 != 0) { + throw new IllegalArgumentException("value pairs must be even"); + } + for (int i = 0; i < valuePairs.length; i += 2) { + map.put(valuePairs[i], valuePairs[i + 1]); + } + return map; + } + + private static void assertParsedTags( + @Nonnull final String rawTags, + @Nonnull final Map expectedTags + ) throws IOException { + + StringReader reader = new StringReader( + "name,tags,time,value\n" + + "m,\"" + rawTags + "\",1,1\n" + ); + InfluxQLQueryResult result = InfluxQLQueryApiImpl.readInfluxQLResult(reader, NO_CANCELLING, null); + + Assertions.assertThat(result.getResults()).hasSize(1); + Assertions.assertThat(result.getResults().get(0).getSeries()).hasSize(1); + Assertions.assertThat(result.getResults().get(0).getSeries().get(0).getTags()).isEqualTo(expectedTags); + } + + @Test + void readInfluxQLResultWithMalformedAndBoundaryTagCases() throws IOException { + assertParsedTags("", mapOf()); + assertParsedTags("host=", mapOf("host", "")); + assertParsedTags("host=a,host=b", mapOf("host", "b")); + assertParsedTags("host=a,broken", mapOf("host", "a")); + assertParsedTags("=a,host=b", mapOf("host", "b")); + assertParsedTags("host=a,", mapOf("host", "a")); + assertParsedTags(",host=a", mapOf(",host", "a")); + assertParsedTags("a=1,,b=2", mapOf("a", "1", ",b", "2")); + assertParsedTags("a=foo\\", mapOf("a", "foo\\")); + assertParsedTags("k\\\\==v\\\\=1", mapOf("k\\=", "v\\=1")); + assertParsedTags("k\\\\,x=v\\\\,y,b=2", mapOf("k\\,x", "v\\,y", "b", "2")); + assertParsedTags("k\\\\=x", mapOf()); + } + + @Test + void readInfluxQLResultWithTagCommas() throws IOException { + InfluxQLQueryResult.Series.ValueExtractor extractValue = (columnName, rawValue, resultIndex, seriesName) -> { + if (resultIndex == 0 && seriesName.equals("data1")){ + switch (columnName){ + case "time": return Instant.ofEpochSecond(Long.parseLong(rawValue)); + case "first": + return Double.valueOf(rawValue); + } + } + return rawValue; + }; + + // Note that escapes in tags returned from server are themselves escaped + List testTags = Arrays.asList( + "location=Cheb_CZ", //simpleTag + "region=us-east-1,host=server1", // standardTags * 2 + "location=Cheb\\\\,\\\\ CZ", // simpleTag with value comma and space + "location=Cheb_CZ,branch=Munchen_DE", // multiple tags with underscore + "location=Cheb\\\\,\\\\ CZ,branch=Munchen\\\\,\\\\ DE", // multiple tags with comma and space + "model\\\\,\\\\ uin=C3PO", // tag with comma space in key + "model\\\\,\\\\ uin=Droid\\\\,\\\\ C3PO", // tag with comma space in key and value + "model\\\\,\\\\ uin=Droid\\\\,\\\\ C3PO,location=Cheb\\\\,\\\\ CZ,branch=Munchen\\\\,\\\\ DE", // comma space in key and val + "silly\\\\,\\\\=long\\\\,tag=a\\\\,b\\\\\\\\\\,\\\\ c\\\\,\\\\ d", // multi commas in k and v plus escaped reserved chars + "region=us\\\\,\\\\ east-1,host\\\\,\\\\ name=ser\\\\,\\\\ ver1" // legacy broken tags + ); + + Map> expectedTagsMap = Stream.of( + // 1. simpleTag + new AbstractMap.SimpleImmutableEntry<>(testTags.get(0), + mapOf("location", "Cheb_CZ")), + // 2. standardTags * 2 + new AbstractMap.SimpleImmutableEntry<>(testTags.get(1), + mapOf( + "region", "us-east-1", + "host", "server1" + )), + // 3. simpleTag with value comma and space + new AbstractMap.SimpleImmutableEntry<>(testTags.get(2), + mapOf("location", "Cheb\\,\\ CZ")), + // 4. multiple tags with underscore + new AbstractMap.SimpleImmutableEntry<>(testTags.get(3), + mapOf( + "location", "Cheb_CZ", + "branch", "Munchen_DE" + )), + // 5. multiple tags with comma and space + new AbstractMap.SimpleImmutableEntry<>(testTags.get(4), + mapOf( + "location", "Cheb\\,\\ CZ", + "branch", "Munchen\\,\\ DE" + )), + // 6. tag with comma and space in key + new AbstractMap.SimpleImmutableEntry<>(testTags.get(5), + mapOf("model\\,\\ uin", "C3PO")), + // 7. tag with comma and space in key and value + new AbstractMap.SimpleImmutableEntry<>(testTags.get(6), + mapOf("model\\,\\ uin", "Droid\\,\\ C3PO")), + // 8. comma space in key and val with multiple tags + new AbstractMap.SimpleImmutableEntry<>(testTags.get(7), + mapOf( + "model\\,\\ uin", "Droid\\,\\ C3PO", + "location", "Cheb\\,\\ CZ", + "branch", "Munchen\\,\\ DE" + )), + // 9. multiple commas in key and value + new AbstractMap.SimpleImmutableEntry<>(testTags.get(8), + mapOf( + "silly\\,\\=long\\,tag", "a\\,b\\\\\\,\\ c\\,\\ d" + )), + // legacy broken tags + new AbstractMap.SimpleImmutableEntry<>(testTags.get(9), + mapOf( + "region", "us\\,\\ east-1", + "host\\,\\ name", "ser\\,\\ ver1" + )) + ).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + StringReader reader = new StringReader("name,tags,time,first\n" + + "data1,\"" + testTags.get(0) + "\",1483225200,42\n" + + "data1,\"" + testTags.get(1) + "\",1483225200,42\n" + + "data1,\"" + testTags.get(2) + "\",1483225200,42\n" + + "data1,\"" + testTags.get(3) + "\",1483225200,42\n" + + "data1,\"" + testTags.get(4) + "\",1483225200,42\n" + + "data1,\"" + testTags.get(5) + "\",1483225200,42\n" + + "data1,\"" + testTags.get(6) + "\",1483225200,42\n" + + "data1,\"" + testTags.get(7) + "\",1483225200,42\n" + + "data1,\"" + testTags.get(8) + "\",1483225200,42\n" + + "\n" + + "name,tags,time,usage_user,usage_system\n" + + "cpu,\"" + testTags.get(9) + "\",1483225200,13.57,1.4\n" + ); + + InfluxQLQueryResult result = InfluxQLQueryApiImpl.readInfluxQLResult(reader, NO_CANCELLING, extractValue); + List results = result.getResults(); + int index = 0; + for(InfluxQLQueryResult.Result r : results) { + for(InfluxQLQueryResult.Series s : r.getSeries()){ + Assertions.assertThat(s.getTags()).isEqualTo(expectedTagsMap.get(testTags.get(index++))); + if(index < 10) { + Assertions.assertThat(s.getColumns()).containsOnlyKeys("time", "first"); + InfluxQLQueryResult.Series.Record valRec = s.getValues().get(0); + Assertions.assertThat(valRec.getValueByKey("first")).isEqualTo(Double.valueOf("42.0")); + Assertions.assertThat(valRec.getValueByKey("time")).isEqualTo(Instant.ofEpochSecond(1483225200L)); + } else if (index == 10) { + Assertions.assertThat(s.getColumns()).containsOnlyKeys("time", "usage_user", "usage_system"); + InfluxQLQueryResult.Series.Record valRec = s.getValues().get(0); + // No value extractor created for "cpu" series + Assertions.assertThat(valRec.getValueByKey("time")).isEqualTo("1483225200"); + Assertions.assertThat(valRec.getValueByKey("usage_user")).isEqualTo("13.57"); + Assertions.assertThat(valRec.getValueByKey("usage_system")).isEqualTo("1.4"); + } + } + } + Assertions.assertThat(index).isEqualTo(testTags.size()); + } + @Test void readInfluxQLResult() throws IOException { InfluxQLQueryResult.Series.ValueExtractor extractValues = (columnName, rawValue, resultIndex, seriesName) -> { diff --git a/examples/pom.xml b/examples/pom.xml index c60e2b136a..37641991a1 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -27,12 +27,12 @@ influxdb-client com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT true - 6.10.0 + 6.10.1-SNAPSHOT 4.0.0 @@ -171,7 +171,7 @@ ossrh OSS Snapshot repository - https://oss.sonatype.org/content/repositories/snapshots/ + https://central.sonatype.com/repository/maven-snapshots/ false @@ -182,4 +182,4 @@ - \ No newline at end of file + diff --git a/flux-dsl/README.md b/flux-dsl/README.md index 46d07e0a2e..bf1b2912f9 100644 --- a/flux-dsl/README.md +++ b/flux-dsl/README.md @@ -1097,26 +1097,26 @@ The latest version for Maven dependency: com.influxdb flux-dsl - 6.10.0 + 6.10.1 ``` Or when using with Gradle: ```groovy dependencies { - implementation "com.influxdb:flux-dsl:6.10.0" + implementation "com.influxdb:flux-dsl:6.10.1" } ``` ### Snapshot Repository -The snapshots are deployed into [OSS Snapshot repository](https://oss.sonatype.org/content/repositories/snapshots/). +The snapshots are deployed into [OSS Snapshot repository](https://central.sonatype.com/repository/maven-snapshots/). #### Maven ```xml ossrh OSS Snapshot repository - https://oss.sonatype.org/content/repositories/snapshots/ + https://central.sonatype.com/repository/maven-snapshots/ false @@ -1128,6 +1128,6 @@ The snapshots are deployed into [OSS Snapshot repository](https://oss.sonatype.o #### Gradle ``` repositories { - maven { url "https://oss.sonatype.org/content/repositories/snapshots" } + maven { url "https://central.sonatype.com/repository/maven-snapshots" } } ``` diff --git a/flux-dsl/pom.xml b/flux-dsl/pom.xml index dc8f62db69..e4f4634a83 100644 --- a/flux-dsl/pom.xml +++ b/flux-dsl/pom.xml @@ -28,7 +28,7 @@ influxdb-client com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT flux-dsl @@ -66,7 +66,7 @@ scm:git:git@github.com:influxdata/influxdb-client-java.git scm:git:git@github.com:influxdata/influxdb-client-java.git https://github.com/influxdata/influxdb-client-java/tree/master - v6.10.0 + HEAD diff --git a/karaf/karaf-assembly/pom.xml b/karaf/karaf-assembly/pom.xml index dc130b7b7b..ec16c0f4ec 100644 --- a/karaf/karaf-assembly/pom.xml +++ b/karaf/karaf-assembly/pom.xml @@ -28,7 +28,7 @@ influxdb-karaf com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT influxdb-karaf-assembly diff --git a/karaf/karaf-features/pom.xml b/karaf/karaf-features/pom.xml index f879586f53..03329c48dc 100644 --- a/karaf/karaf-features/pom.xml +++ b/karaf/karaf-features/pom.xml @@ -28,7 +28,7 @@ influxdb-karaf com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT influxdb-karaf-features diff --git a/karaf/karaf-kar/pom.xml b/karaf/karaf-kar/pom.xml index b74bfff510..199d996d4e 100644 --- a/karaf/karaf-kar/pom.xml +++ b/karaf/karaf-kar/pom.xml @@ -28,7 +28,7 @@ influxdb-karaf com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT influxdb-karaf-kar @@ -82,7 +82,7 @@ ${project.groupId} influxdb-karaf-features - 6.10.0 + 6.10.1-SNAPSHOT features xml diff --git a/karaf/pom.xml b/karaf/pom.xml index b0195602ff..63855e6a02 100644 --- a/karaf/pom.xml +++ b/karaf/pom.xml @@ -28,7 +28,7 @@ influxdb-client com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT influxdb-karaf @@ -67,7 +67,7 @@ scm:git:git@github.com:influxdata/influxdb-client-java.git scm:git:git@github.com:influxdata/influxdb-client-java.git https://github.com/influxdata/influxdb-client-java/tree/master - v6.10.0 + HEAD diff --git a/pom.xml b/pom.xml index 8d76484ad1..ce4ae7c52f 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ com.influxdb influxdb-client - 6.10.0 + 6.10.1-SNAPSHOT pom @@ -87,17 +87,17 @@ scm:git:git@github.com:influxdata/influxdb-client-java.git scm:git:git@github.com:influxdata/influxdb-client-java.git http://github.com/influxdata/influxdb-client-java/tree/master - v6.10.0 + HEAD ossrh - https://oss.sonatype.org/content/repositories/snapshots + https://central.sonatype.com/repository/maven-snapshots ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2/ + https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2/ GitHubPages @@ -409,7 +409,7 @@ true ossrh - https://oss.sonatype.org/ + https://ossrh-staging-api.central.sonatype.com/ true @@ -538,38 +538,38 @@ com.influxdb influxdb-client-test - 6.10.0 + 6.10.1-SNAPSHOT test com.influxdb influxdb-client-core - 6.10.0 + 6.10.1-SNAPSHOT com.influxdb influxdb-client-utils - 6.10.0 + 6.10.1-SNAPSHOT com.influxdb influxdb-client-java - 6.10.0 + 6.10.1-SNAPSHOT com.influxdb influxdb-client-reactive - 6.10.0 + 6.10.1-SNAPSHOT com.influxdb influxdb-client-flux - 6.10.0 + 6.10.1-SNAPSHOT diff --git a/spring/pom.xml b/spring/pom.xml index 39b2927110..e57eec556a 100644 --- a/spring/pom.xml +++ b/spring/pom.xml @@ -26,7 +26,7 @@ influxdb-client com.influxdb - 6.10.0 + 6.10.1-SNAPSHOT 4.0.0 @@ -68,7 +68,7 @@ scm:git:git@github.com:influxdata/influxdb-client-java.git scm:git:git@github.com:influxdata/influxdb-client-java.git https://github.com/influxdata/influxdb-client-java/tree/master - v6.10.0 + HEAD