Fix DOMQueryPredicate comparable matches 94/94794/4
authorPeter Suna <peter.suna@pantheon.tech>
Fri, 22 Jan 2021 15:12:05 +0000 (16:12 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 26 Jan 2021 08:39:08 +0000 (09:39 +0100)
Boundary condition checking is wrong here due negation brainfart:
gte/gt and lte/lt should include/exclude 0, not the other way around.

JIRA: MDSAL-653
Change-Id: Ieaaf5b4fe0367d9e59cd03a2c177898d909e6ce8
Signed-off-by: Peter Suna <peter.suna@pantheon.tech>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 14cf7ecef0d125b84406c534662c932419d9dfa7)

binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/query/QueryBuilderTest.java
dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/query/DOMQueryPredicate.java

index 983929fcfb6f3fffb39eb6765413bfc68c4a879b..2029eb605e0bc465dae35c28ff3b9688d76bed74 100644 (file)
@@ -176,6 +176,66 @@ public class QueryBuilderTest {
         assertEquals(1, items.size());
     }
 
+    @Test
+    public void testFindGreaterThanAlarms() {
+        final Stopwatch sw = Stopwatch.createStarted();
+        final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
+            .extractChild(System.class)
+            .extractChild(Alarms.class)
+            .matching()
+            .leaf(Alarms::getId).greaterThan(Uint64.ONE)
+            .build();
+        LOG.info("Query built in {}", sw);
+
+        final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
+        assertEquals(1, items.size());
+    }
+
+    @Test
+    public void testFindGreaterThanOrEqualsAlarms() {
+        final Stopwatch sw = Stopwatch.createStarted();
+        final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
+            .extractChild(System.class)
+            .extractChild(Alarms.class)
+            .matching()
+            .leaf(Alarms::getId).greaterThanOrEqual(Uint64.ONE)
+            .build();
+        LOG.info("Query built in {}", sw);
+
+        final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
+        assertEquals(2, items.size());
+    }
+
+    @Test
+    public void testFindLessThanAlarms() {
+        final Stopwatch sw = Stopwatch.createStarted();
+        final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
+            .extractChild(System.class)
+            .extractChild(Alarms.class)
+            .matching()
+            .leaf(Alarms::getId).lessThan(Uint64.ONE)
+            .build();
+        LOG.info("Query built in {}", sw);
+
+        final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
+        assertEquals(2, items.size());
+    }
+
+    @Test
+    public void testFindLessThanOrEqualsAlarms() {
+        final Stopwatch sw = Stopwatch.createStarted();
+        final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
+            .extractChild(System.class)
+            .extractChild(Alarms.class)
+            .matching()
+            .leaf(Alarms::getId).lessThanOrEqual(Uint64.ONE)
+            .build();
+        LOG.info("Query built in {}", sw);
+
+        final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
+        assertEquals(3, items.size());
+    }
+
     @Test
     public void testFindSystemFirstWithAlarmOne() {
         final Stopwatch sw = Stopwatch.createStarted();
index fd6266131b1ccaa5c58e69d2e360ebee10d6bf82..556c183b1d9cc45402bd8266ddf592de7bcb18a8 100644 (file)
@@ -316,7 +316,7 @@ public final class DOMQueryPredicate implements Immutable {
 
         @Override
         boolean testCompare(final int valueToData) {
-            return valueToData <= 0;
+            return valueToData < 0;
         }
     }
 
@@ -332,7 +332,7 @@ public final class DOMQueryPredicate implements Immutable {
 
         @Override
         boolean testCompare(final int valueToData) {
-            return valueToData < 0;
+            return valueToData <= 0;
         }
     }
 
@@ -348,7 +348,7 @@ public final class DOMQueryPredicate implements Immutable {
 
         @Override
         boolean testCompare(final int valueToData) {
-            return valueToData >= 0;
+            return valueToData > 0;
         }
     }
 
@@ -364,7 +364,7 @@ public final class DOMQueryPredicate implements Immutable {
 
         @Override
         boolean testCompare(final int valueToData) {
-            return valueToData > 0;
+            return valueToData >= 0;
         }
     }
 
@@ -420,6 +420,13 @@ public final class DOMQueryPredicate implements Immutable {
             return data != null && testCompare(value().compareTo((T) data));
         }
 
+        /**
+         * Evaluate the result of {@code value().compareTo(data)}. Note this result is an inversion of what the match
+         * may be named.
+         *
+         * @param valueToData {@link Comparable#compareTo(Object)} result
+         * @return True if the result indicates a match
+         */
         abstract boolean testCompare(int valueToData);
     }