]> git.basschouten.com Git - openhab-addons.git/commitdiff
[influxdb] Fix previous item state performance issues (#11993)
authorJoan Pujol <joanpujol@gmail.com>
Sat, 15 Jan 2022 15:39:19 +0000 (16:39 +0100)
committerGitHub <noreply@github.com>
Sat, 15 Jan 2022 15:39:19 +0000 (16:39 +0100)
Fixes #11878

Signed-off-by: Joan Pujol <joanpujol@gmail.com>
bundles/org.openhab.persistence.influxdb/src/main/java/org/openhab/persistence/influxdb/internal/influx2/Influx2FilterCriteriaQueryCreatorImpl.java
bundles/org.openhab.persistence.influxdb/src/test/java/org/openhab/persistence/influxdb/internal/InfluxFilterCriteriaQueryCreatorImplTest.java

index 9bb62af45a13e86bd9fb8966a929d8a2b0f25b44..606f77ebe2685544c9c8e7c7f73b4643d0bdd16f 100644 (file)
@@ -87,19 +87,31 @@ public class Influx2FilterCriteriaQueryCreatorImpl implements FilterCriteriaQuer
             flux = flux.filter(restrictions);
         }
 
-        if (criteria.getOrdering() != null) {
-            boolean desc = criteria.getOrdering() == FilterCriteria.Ordering.DESCENDING;
-            flux = flux.sort().withDesc(desc).withColumns(new String[] { COLUMN_TIME_NAME_V2 });
-        }
-
-        if (criteria.getPageSize() != Integer.MAX_VALUE) {
-            flux = flux.limit(criteria.getPageSize()).withPropertyValue("offset",
-                    criteria.getPageNumber() * criteria.getPageSize());
-        }
+        flux = applyOrderingAndPageSize(criteria, flux);
 
         return flux.toString();
     }
 
+    private Flux applyOrderingAndPageSize(FilterCriteria criteria, Flux flux) {
+        var lastOptimization = criteria.getOrdering() == FilterCriteria.Ordering.DESCENDING
+                && criteria.getPageSize() == 1;
+
+        if (lastOptimization) {
+            flux = flux.last();
+        } else {
+            if (criteria.getOrdering() != null) {
+                boolean desc = criteria.getOrdering() == FilterCriteria.Ordering.DESCENDING;
+                flux = flux.sort().withDesc(desc).withColumns(new String[] { COLUMN_TIME_NAME_V2 });
+            }
+
+            if (criteria.getPageSize() != Integer.MAX_VALUE) {
+                flux = flux.limit(criteria.getPageSize()).withPropertyValue("offset",
+                        criteria.getPageNumber() * criteria.getPageSize());
+            }
+        }
+        return flux;
+    }
+
     private String calculateMeasurementName(String itemName) {
         String name = itemName;
 
index 5a59591c910cf3babdca777532b9e2ddc7758718..7ae4f46ce35f1de03bfde6bb0e1c6197db7be097 100644 (file)
@@ -168,6 +168,18 @@ public class InfluxFilterCriteriaQueryCreatorImplTest {
                         + "|> sort(desc:false, columns:[\"_time\"])"));
     }
 
+    @Test
+    public void testPreviousState() {
+        FilterCriteria criteria = createBaseCriteria();
+        criteria.setOrdering(FilterCriteria.Ordering.DESCENDING);
+        criteria.setPageSize(1);
+        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"
+                        + "|> keep(columns:[\"_measurement\", \"_time\", \"_value\"])\n\t" + "|> last()"));
+    }
+
     private FilterCriteria createBaseCriteria() {
         return createBaseCriteria(ITEM_NAME);
     }