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.Before;
17 import org.junit.BeforeClass;
18 import org.junit.Test;
19 import org.opendaylight.mdsal.binding.api.query.QueryExecutor;
20 import org.opendaylight.mdsal.binding.api.query.QueryExpression;
21 import org.opendaylight.mdsal.binding.api.query.QueryFactory;
22 import org.opendaylight.mdsal.binding.api.query.QueryResult;
23 import org.opendaylight.mdsal.binding.api.query.QueryResult.Item;
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.first.grp.SystemKey;
34 import org.opendaylight.yang.gen.v1.mdsal.query.norev.second.grp.Alarms;
35 import org.opendaylight.yang.gen.v1.mdsal.query.norev.second.grp.AlarmsBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelList;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.top.level.list.NestedList;
39 import org.opendaylight.yangtools.yang.binding.DataObject;
40 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
41 import org.opendaylight.yangtools.yang.common.Empty;
42 import org.opendaylight.yangtools.yang.common.Uint64;
43 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
47 public class QueryBuilderTest {
48 private static final Logger LOG = LoggerFactory.getLogger(QueryBuilderTest.class);
49 private static BindingNormalizedNodeCodecRegistry CODEC;
51 private final QueryFactory factory = new DefaultQueryFactory(CODEC);
52 private QueryExecutor executor;
55 public static void beforeClass() {
56 ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create();
57 ctx.addModuleInfos(BindingReflections.loadModuleInfos());
58 final SchemaContext schemaContext = ctx.tryToCreateSchemaContext().get();
60 CODEC = new BindingNormalizedNodeCodecRegistry(
61 BindingRuntimeContext.create(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), schemaContext));
65 public static final void afterClass() {
70 public void before() {
71 executor = SimpleQueryExecutor.builder(CODEC.getCodecContext())
74 new SystemBuilder().setName("first").setAlarms(List.of(
77 .setCritical(Empty.getInstance())
78 .setAffectedUsers(List.of(
83 .setAffectedUsers(List.of(
88 .setCritical(Empty.getInstance())
89 .setAffectedUsers(List.of(
92 new SystemBuilder().setName("second").setAlarms(List.of(
95 .setCritical(Empty.getInstance())
96 .setAffectedUsers(List.of(
106 final Stopwatch sw = Stopwatch.createStarted();
107 final QueryExpression<TopLevelList> query = factory.querySubtree(InstanceIdentifier.create(Top.class))
108 .extractChild(TopLevelList.class)
110 .childObject(NestedList.class)
111 .leaf(NestedList::getName).contains("foo")
112 .and().leaf(TopLevelList::getName).valueEquals("bar")
114 LOG.info("Query built in {}", sw);
116 assertEquals(0, execute(query).getItems().size());
120 public void testFindCriticalAlarms() {
121 final Stopwatch sw = Stopwatch.createStarted();
122 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
123 .extractChild(System.class)
124 .extractChild(Alarms.class)
126 .leaf(Alarms::getCritical).nonNull()
128 LOG.info("Query built in {}", sw);
130 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
131 assertEquals(3, items.size());
135 public void testFindNonCriticalAlarms() {
136 final Stopwatch sw = Stopwatch.createStarted();
137 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
138 .extractChild(System.class)
139 .extractChild(Alarms.class)
141 .leaf(Alarms::getCritical).isNull()
143 LOG.info("Query built in {}", sw);
145 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
146 assertEquals(1, items.size());
150 public void testFindZeroAlarms() {
151 final Stopwatch sw = Stopwatch.createStarted();
152 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
153 .extractChild(System.class)
154 .extractChild(Alarms.class)
156 .leaf(Alarms::getId).valueEquals(Uint64.ZERO)
158 LOG.info("Query built in {}", sw);
160 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
161 assertEquals(2, items.size());
165 public void testFindSystemFirstAlarmOne() {
166 final Stopwatch sw = Stopwatch.createStarted();
167 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
168 .extractChild(System.class, new SystemKey("first"))
169 .extractChild(Alarms.class)
171 .leaf(Alarms::getId).valueEquals(Uint64.ZERO)
173 LOG.info("Query built in {}", sw);
175 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
176 assertEquals(1, items.size());
180 public void testFindSystemFirstWithAlarmOne() {
181 final Stopwatch sw = Stopwatch.createStarted();
182 final QueryExpression<System> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
183 .extractChild(System.class, new SystemKey("first"))
185 .childObject(Alarms.class)
186 .leaf(Alarms::getId).valueEquals(Uint64.ZERO)
188 LOG.info("Query built in {}", sw);
190 final List<? extends Item<@NonNull System>> items = execute(query).getItems();
191 assertEquals(1, items.size());
195 private <T extends @NonNull DataObject> QueryResult<T> execute(final QueryExpression<T> query) {
196 final Stopwatch sw = Stopwatch.createStarted();
197 final QueryResult<T> result = executor.executeQuery(query);
198 LOG.info("Query executed in {}", sw);