2 * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.mdsal.binding.dom.adapter.query;
10 import static org.junit.Assert.assertEquals;
12 import com.google.common.base.Stopwatch;
13 import java.util.List;
14 import org.eclipse.jdt.annotation.NonNull;
15 import org.junit.AfterClass;
16 import org.junit.BeforeClass;
17 import org.junit.Test;
18 import org.opendaylight.mdsal.binding.api.query.QueryExecutor;
19 import org.opendaylight.mdsal.binding.api.query.QueryExpression;
20 import org.opendaylight.mdsal.binding.api.query.QueryFactory;
21 import org.opendaylight.mdsal.binding.api.query.QueryResult;
22 import org.opendaylight.mdsal.binding.api.query.QueryResult.Item;
23 import org.opendaylight.mdsal.binding.api.query.QueryStructureException;
24 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry;
25 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
26 import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
27 import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
28 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
29 import org.opendaylight.yang.gen.v1.mdsal.query.norev.Foo;
30 import org.opendaylight.yang.gen.v1.mdsal.query.norev.FooBuilder;
31 import org.opendaylight.yang.gen.v1.mdsal.query.norev.first.grp.System;
32 import org.opendaylight.yang.gen.v1.mdsal.query.norev.first.grp.SystemBuilder;
33 import org.opendaylight.yang.gen.v1.mdsal.query.norev.second.grp.Alarms;
34 import org.opendaylight.yang.gen.v1.mdsal.query.norev.second.grp.AlarmsBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelList;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.top.level.list.NestedList;
38 import org.opendaylight.yangtools.yang.binding.DataObject;
39 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
40 import org.opendaylight.yangtools.yang.common.Empty;
41 import org.opendaylight.yangtools.yang.common.Uint64;
42 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
46 public class QueryBuilderTest {
47 private static final Logger LOG = LoggerFactory.getLogger(QueryBuilderTest.class);
48 private static BindingNormalizedNodeCodecRegistry CODEC;
49 private static QueryExecutor EXECUTOR;
51 private final QueryFactory factory = new DefaultQueryFactory(CODEC);
54 public static void beforeClass() {
55 ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
56 ctx.addModuleInfos(BindingReflections.loadModuleInfos());
57 final SchemaContext schemaContext = ctx.tryToCreateSchemaContext().get();
59 CODEC = new BindingNormalizedNodeCodecRegistry(
60 BindingRuntimeContext.create(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), schemaContext));
61 EXECUTOR = SimpleQueryExecutor.builder(CODEC.getCodecContext())
64 new SystemBuilder().setName("first").setAlarms(List.of(
67 .setCritical(Empty.getInstance())
68 .setAffectedUsers(List.of(
73 .setAffectedUsers(List.of(
78 .setCritical(Empty.getInstance())
79 .setAffectedUsers(List.of(
82 new SystemBuilder().setName("second").setAlarms(List.of(
85 .setCritical(Empty.getInstance())
86 .setAffectedUsers(List.of(
95 public static void afterClass() {
101 public void bar() throws QueryStructureException {
102 final Stopwatch sw = Stopwatch.createStarted();
103 final QueryExpression<TopLevelList> query = factory.querySubtree(InstanceIdentifier.create(Top.class))
104 .extractChild(TopLevelList.class)
106 .childObject(NestedList.class)
107 .leaf(NestedList::getName).contains("foo")
108 .and().leaf(TopLevelList::getName).valueEquals("bar")
110 LOG.info("Query built in {}", sw);
112 assertEquals(0, execute(query).getItems().size());
116 public void testFindCriticalAlarms() throws QueryStructureException {
117 final Stopwatch sw = Stopwatch.createStarted();
118 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
119 .extractChild(System.class)
120 .extractChild(Alarms.class)
122 .leaf(Alarms::getCritical).nonNull()
124 LOG.info("Query built in {}", sw);
126 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
127 assertEquals(3, items.size());
131 public void testFindNonCriticalAlarms() throws QueryStructureException {
132 final Stopwatch sw = Stopwatch.createStarted();
133 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
134 .extractChild(System.class)
135 .extractChild(Alarms.class)
137 .leaf(Alarms::getCritical).isNull()
139 LOG.info("Query built in {}", sw);
141 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
142 assertEquals(1, items.size());
146 public void testFindZeroAlarms() throws QueryStructureException {
147 final Stopwatch sw = Stopwatch.createStarted();
148 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
149 .extractChild(System.class)
150 .extractChild(Alarms.class)
152 .leaf(Alarms::getId).valueEquals(Uint64.ZERO)
154 LOG.info("Query built in {}", sw);
156 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
157 assertEquals(2, items.size());
160 private static <T extends @NonNull DataObject> QueryResult<T> execute(final QueryExpression<T> query) {
161 final Stopwatch sw = Stopwatch.createStarted();
162 final QueryResult<T> result = EXECUTOR.executeQuery(query);
163 LOG.info("Query executed in {}", sw);