*/
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.QueryStructureException;
+import org.opendaylight.mdsal.binding.api.query.QueryResult;
+import org.opendaylight.mdsal.binding.api.query.QueryResult.Item;
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.first.grp.SystemKey;
+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() {
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())
+ public void bar() {
+ 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() {
+ 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() {
+ 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() {
+ 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());
+ }
+
+ @Test
+ public void testFindSystemFirstAlarmOne() {
+ final Stopwatch sw = Stopwatch.createStarted();
+ final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
+ .extractChild(System.class, new SystemKey("first"))
+ .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(1, items.size());
+ }
+
+ @Test
+ public void testFindSystemFirstWithAlarmOne() {
+ final Stopwatch sw = Stopwatch.createStarted();
+ final QueryExpression<System> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
+ .extractChild(System.class, new SystemKey("first"))
+ .matching()
+ .childObject(Alarms.class)
+ .leaf(Alarms::getId).valueEquals(Uint64.ZERO)
+ .build();
+ LOG.info("Query built in {}", sw);
+
+ final List<? extends Item<@NonNull System>> items = execute(query).getItems();
+ assertEquals(1, 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;
}
}