Revert "Add support for keyed entries"
[mdsal.git] / binding / mdsal-binding-dom-adapter / src / test / java / org / opendaylight / mdsal / binding / dom / adapter / query / QueryBuilderTest.java
index eadf0e44e4ae7b3ed5d5a042cb8ae771225e1dbb..d9b8d78623a67ac301712db2eeeeeed45b070762 100644 (file)
@@ -7,26 +7,49 @@
  */
 package org.opendaylight.mdsal.binding.dom.adapter.query;
 
+import static org.junit.Assert.assertEquals;
+
+import com.google.common.base.Stopwatch;
+import java.util.List;
+import org.eclipse.jdt.annotation.NonNull;
+import org.junit.AfterClass;
+import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.opendaylight.mdsal.binding.api.query.QueryExecutor;
 import org.opendaylight.mdsal.binding.api.query.QueryExpression;
 import org.opendaylight.mdsal.binding.api.query.QueryFactory;
+import org.opendaylight.mdsal.binding.api.query.QueryResult;
+import org.opendaylight.mdsal.binding.api.query.QueryResult.Item;
 import org.opendaylight.mdsal.binding.api.query.QueryStructureException;
 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
 import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
 import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
+import org.opendaylight.yang.gen.v1.mdsal.query.norev.Foo;
+import org.opendaylight.yang.gen.v1.mdsal.query.norev.FooBuilder;
+import org.opendaylight.yang.gen.v1.mdsal.query.norev.first.grp.System;
+import org.opendaylight.yang.gen.v1.mdsal.query.norev.first.grp.SystemBuilder;
+import org.opendaylight.yang.gen.v1.mdsal.query.norev.second.grp.Alarms;
+import org.opendaylight.yang.gen.v1.mdsal.query.norev.second.grp.AlarmsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.top.level.list.NestedList;
+import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Empty;
+import org.opendaylight.yangtools.yang.common.Uint64;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class QueryBuilderTest {
+    private static final Logger LOG = LoggerFactory.getLogger(QueryBuilderTest.class);
     private static BindingNormalizedNodeCodecRegistry CODEC;
 
     private final QueryFactory factory = new DefaultQueryFactory(CODEC);
+    private QueryExecutor executor;
 
     @BeforeClass
     public static void beforeClass() {
@@ -38,19 +61,110 @@ public class QueryBuilderTest {
             BindingRuntimeContext.create(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), schemaContext));
     }
 
+    @AfterClass
+    public static final void afterClass() {
+        CODEC = null;
+    }
+
+    @Before
+    public void before() {
+        executor = SimpleQueryExecutor.builder(CODEC.getCodecContext())
+            .add(new FooBuilder()
+                .setSystem(List.of(
+                    new SystemBuilder().setName("first").setAlarms(List.of(
+                        new AlarmsBuilder()
+                            .setId(Uint64.ZERO)
+                            .setCritical(Empty.getInstance())
+                            .setAffectedUsers(List.of(
+                                // TODO: fill
+                            )).build(),
+                        new AlarmsBuilder()
+                            .setId(Uint64.ONE)
+                            .setAffectedUsers(List.of(
+                                // TODO: fill
+                            )).build(),
+                        new AlarmsBuilder()
+                            .setId(Uint64.TWO)
+                            .setCritical(Empty.getInstance())
+                            .setAffectedUsers(List.of(
+                                // TODO: fill
+                                )).build())).build(),
+                    new SystemBuilder().setName("second").setAlarms(List.of(
+                        new AlarmsBuilder()
+                        .setId(Uint64.ZERO)
+                        .setCritical(Empty.getInstance())
+                        .setAffectedUsers(List.of(
+                            // TODO: fill
+                        )).build())).build()
+                    ))
+                .build())
+            .build();
+    }
+
     @Test
     public void bar() throws QueryStructureException {
-        final QueryExpression<TopLevelList> query = factory.querySubtree(InstanceIdentifier.builder(Top.class).build())
+        final Stopwatch sw = Stopwatch.createStarted();
+        final QueryExpression<TopLevelList> query = factory.querySubtree(InstanceIdentifier.create(Top.class))
                 .extractChild(TopLevelList.class)
                 .matching()
                     .childObject(NestedList.class)
                     .leaf(NestedList::getName).contains("foo")
                     .and().leaf(TopLevelList::getName).valueEquals("bar")
                 .build();
-//
-//        // Execution start
-//        final Result<TopLevelList> result = query.getResult();
-//        // Execution fetch
-//        final TopLevelList value = result.getValue();
+        LOG.info("Query built in {}", sw);
+
+        assertEquals(0, execute(query).getItems().size());
+    }
+
+    @Test
+    public void testFindCriticalAlarms() throws QueryStructureException {
+        final Stopwatch sw = Stopwatch.createStarted();
+        final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
+            .extractChild(System.class)
+            .extractChild(Alarms.class)
+                .matching()
+                    .leaf(Alarms::getCritical).nonNull()
+                .build();
+        LOG.info("Query built in {}", sw);
+
+        final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
+        assertEquals(3, items.size());
+    }
+
+    @Test
+    public void testFindNonCriticalAlarms() throws QueryStructureException {
+        final Stopwatch sw = Stopwatch.createStarted();
+        final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
+            .extractChild(System.class)
+            .extractChild(Alarms.class)
+                .matching()
+                    .leaf(Alarms::getCritical).isNull()
+                .build();
+        LOG.info("Query built in {}", sw);
+
+        final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
+        assertEquals(1, items.size());
+    }
+
+    @Test
+    public void testFindZeroAlarms() throws QueryStructureException {
+        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).valueEquals(Uint64.ZERO)
+                .build();
+        LOG.info("Query built in {}", sw);
+
+        final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
+        assertEquals(2, items.size());
+    }
+
+    private <T extends @NonNull DataObject> QueryResult<T> execute(final QueryExpression<T> query) {
+        final Stopwatch sw = Stopwatch.createStarted();
+        final QueryResult<T> result = executor.executeQuery(query);
+        LOG.info("Query executed in {}", sw);
+        return result;
     }
 }