From: Joan Pujol Date: Tue, 6 Jul 2021 18:01:15 +0000 (+0200) Subject: [influxdb] Fix queries with data migrated from InfluxDB1 without item tags (#10937) X-Git-Url: https://git.basschouten.com/?a=commitdiff_plain;h=26258e8ef500927ac63acab04bd1602c79a4ea27;p=openhab-addons.git [influxdb] Fix queries with data migrated from InfluxDB1 without item tags (#10937) Signed-off-by: Joan Pujol --- diff --git a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/InfluxDBConstants.java b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/InfluxDBConstants.java index 06e95b2dcb..64e86b1b7d 100644 --- a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/InfluxDBConstants.java +++ b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/InfluxDBConstants.java @@ -32,4 +32,5 @@ public class InfluxDBConstants { public static final String TAG_CATEGORY_NAME = "category"; public static final String TAG_TYPE_NAME = "type"; public static final String TAG_LABEL_NAME = "label"; + public static final String FIELD_MEASUREMENT_NAME = "_measurement"; } diff --git a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx2/Influx2FilterCriteriaQueryCreatorImpl.java b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx2/Influx2FilterCriteriaQueryCreatorImpl.java index 5f1676d717..bcd9ec96fb 100644 --- a/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx2/Influx2FilterCriteriaQueryCreatorImpl.java +++ b/bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx2/Influx2FilterCriteriaQueryCreatorImpl.java @@ -66,10 +66,18 @@ public class Influx2FilterCriteriaQueryCreatorImpl implements FilterCriteriaQuer String itemName = criteria.getItemName(); if (itemName != null) { String measurementName = calculateMeasurementName(itemName); + boolean needsToUseItemTagName = !measurementName.equals(itemName); + flux = flux.filter(measurement().equal(measurementName)); - if (!measurementName.equals(itemName)) { - flux = flux.filter(tag("item").equal(itemName)); + if (needsToUseItemTagName) { + flux = flux.filter(tag(TAG_ITEM_NAME).equal(itemName)); } + + if (needsToUseItemTagName) + flux = flux.keep(new String[] { FIELD_MEASUREMENT_NAME, COLUMN_TIME_NAME_V2, COLUMN_VALUE_NAME_V2, + TAG_ITEM_NAME }); + else + flux = flux.keep(new String[] { FIELD_MEASUREMENT_NAME, COLUMN_TIME_NAME_V2, COLUMN_VALUE_NAME_V2 }); } if (criteria.getState() != null && criteria.getOperator() != null) { diff --git a/bundles/org.openhab.persistence.influxdb/src/test/java/org/openhab/persistence/influxdb/internal/InfluxFilterCriteriaQueryCreatorImplTest.java b/bundles/org.openhab.persistence.influxdb/src/test/java/org/openhab/persistence/influxdb/internal/InfluxFilterCriteriaQueryCreatorImplTest.java index 3b0ed51a0a..dd423798b0 100644 --- a/bundles/org.openhab.persistence.influxdb/src/test/java/org/openhab/persistence/influxdb/internal/InfluxFilterCriteriaQueryCreatorImplTest.java +++ b/bundles/org.openhab.persistence.influxdb/src/test/java/org/openhab/persistence/influxdb/internal/InfluxFilterCriteriaQueryCreatorImplTest.java @@ -79,8 +79,10 @@ public class InfluxFilterCriteriaQueryCreatorImplTest { assertThat(queryV1, equalTo("SELECT \"value\"::field,\"item\"::tag FROM origin.sampleItem;")); String queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY); - assertThat(queryV2, equalTo("from(bucket:\"origin\")\n\t" + "|> range(start:-100y)\n\t" - + "|> filter(fn: (r) => r[\"_measurement\"] == \"sampleItem\")")); + assertThat(queryV2, + equalTo("from(bucket:\"origin\")\n\t" + "|> range(start:-100y)\n\t" + + "|> filter(fn: (r) => r[\"_measurement\"] == \"sampleItem\")\n\t" + + "|> keep(columns:[\"_measurement\", \"_time\", \"_value\"])")); } @Test @@ -112,7 +114,8 @@ public class InfluxFilterCriteriaQueryCreatorImplTest { String queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY); String expectedQueryV2 = String.format( "from(bucket:\"origin\")\n\t" + "|> range(start:%s, stop:%s)\n\t" - + "|> filter(fn: (r) => r[\"_measurement\"] == \"sampleItem\")", + + "|> filter(fn: (r) => r[\"_measurement\"] == \"sampleItem\")\n\t" + + "|> keep(columns:[\"_measurement\", \"_time\", \"_value\"])", INFLUX2_DATE_FORMATTER.format(now.toInstant()), INFLUX2_DATE_FORMATTER.format(tomorrow.toInstant())); assertThat(queryV2, equalTo(expectedQueryV2)); } @@ -130,6 +133,7 @@ public class InfluxFilterCriteriaQueryCreatorImplTest { assertThat(queryV2, equalTo("from(bucket:\"origin\")\n\t" + "|> range(start:-100y)\n\t" + "|> filter(fn: (r) => r[\"_measurement\"] == \"sampleItem\")\n\t" + + "|> keep(columns:[\"_measurement\", \"_time\", \"_value\"])\n\t" + "|> filter(fn: (r) => (r[\"_field\"] == \"value\" and r[\"_value\"] <= 90))")); } @@ -144,7 +148,8 @@ public class InfluxFilterCriteriaQueryCreatorImplTest { String queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY); assertThat(queryV2, equalTo("from(bucket:\"origin\")\n\t" + "|> range(start:-100y)\n\t" - + "|> filter(fn: (r) => r[\"_measurement\"] == \"sampleItem\")\n\t" + "|> limit(n:10, offset:20)")); + + "|> filter(fn: (r) => r[\"_measurement\"] == \"sampleItem\")\n\t" + + "|> keep(columns:[\"_measurement\", \"_time\", \"_value\"])\n\t" + "|> limit(n:10, offset:20)")); } @Test @@ -159,6 +164,7 @@ public class InfluxFilterCriteriaQueryCreatorImplTest { assertThat(queryV2, equalTo("from(bucket:\"origin\")\n\t" + "|> range(start:-100y)\n\t" + "|> filter(fn: (r) => r[\"_measurement\"] == \"sampleItem\")\n\t" + + "|> keep(columns:[\"_measurement\", \"_time\", \"_value\"])\n\t" + "|> sort(desc:false, columns:[\"_time\"])")); } @@ -189,7 +195,8 @@ public class InfluxFilterCriteriaQueryCreatorImplTest { assertThat(queryV2, equalTo("from(bucket:\"origin\")\n\t" + "|> range(start:-100y)\n\t" + "|> filter(fn: (r) => r[\"_measurement\"] == \"measurementName\")\n\t" - + "|> filter(fn: (r) => r[\"item\"] == \"sampleItem\")")); + + "|> filter(fn: (r) => r[\"item\"] == \"sampleItem\")\n\t" + + "|> keep(columns:[\"_measurement\", \"_time\", \"_value\", \"item\"])")); when(metadataRegistry.get(metadataKey)) .thenReturn(new Metadata(metadataKey, "", Map.of("key1", "val1", "key2", "val2"))); @@ -198,7 +205,9 @@ public class InfluxFilterCriteriaQueryCreatorImplTest { assertThat(queryV1, equalTo("SELECT \"value\"::field,\"item\"::tag FROM origin.sampleItem;")); queryV2 = instanceV2.createQuery(criteria, RETENTION_POLICY); - assertThat(queryV2, equalTo("from(bucket:\"origin\")\n\t" + "|> range(start:-100y)\n\t" - + "|> filter(fn: (r) => r[\"_measurement\"] == \"sampleItem\")")); + assertThat(queryV2, + equalTo("from(bucket:\"origin\")\n\t" + "|> range(start:-100y)\n\t" + + "|> filter(fn: (r) => r[\"_measurement\"] == \"sampleItem\")\n\t" + + "|> keep(columns:[\"_measurement\", \"_time\", \"_value\"])")); } }