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;
11 import static org.junit.Assert.assertNotNull;
13 import com.google.common.base.Stopwatch;
14 import java.util.List;
15 import java.util.stream.Collectors;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.junit.AfterClass;
18 import org.junit.Before;
19 import org.junit.BeforeClass;
20 import org.junit.Test;
21 import org.opendaylight.mdsal.binding.api.query.QueryExecutor;
22 import org.opendaylight.mdsal.binding.api.query.QueryExpression;
23 import org.opendaylight.mdsal.binding.api.query.QueryFactory;
24 import org.opendaylight.mdsal.binding.api.query.QueryResult;
25 import org.opendaylight.mdsal.binding.api.query.QueryResult.Item;
26 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
27 import org.opendaylight.mdsal.binding.dom.codec.impl.DefaultBindingCodecTreeFactory;
28 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
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.binding.util.BindingMap;
42 import org.opendaylight.yangtools.yang.common.Empty;
43 import org.opendaylight.yangtools.yang.common.Uint64;
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 BindingCodecTree CODEC;
51 private final QueryFactory factory = new DefaultQueryFactory(CODEC);
52 private QueryExecutor executor;
55 public static final void beforeClass() {
56 CODEC = new DefaultBindingCodecTreeFactory().create(BindingRuntimeHelpers.createRuntimeContext());
60 public static final void afterClass() {
65 public void before() {
66 executor = SimpleQueryExecutor.builder(CODEC)
68 .setSystem(BindingMap.of(
69 new SystemBuilder().setName("first").setAlarms(BindingMap.of(
72 .setCritical(Empty.value())
73 .setAffectedUsers(BindingMap.of(
78 .setAffectedUsers(BindingMap.of(
83 .setCritical(Empty.value())
84 .setAffectedUsers(BindingMap.of(
87 new SystemBuilder().setName("second").setAlarms(BindingMap.of(
90 .setCritical(Empty.value())
91 .setAffectedUsers(BindingMap.of(
101 final Stopwatch sw = Stopwatch.createStarted();
102 final QueryExpression<TopLevelList> query = factory.querySubtree(InstanceIdentifier.create(Top.class))
103 .extractChild(TopLevelList.class)
105 .childObject(NestedList.class)
106 .leaf(NestedList::getName).contains("foo")
107 .and().leaf(TopLevelList::getName).valueEquals("bar")
109 LOG.info("Query built in {}", sw);
111 assertEquals(0, execute(query).getItems().size());
115 public void testFindCriticalAlarms() {
116 final Stopwatch sw = Stopwatch.createStarted();
117 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
118 .extractChild(System.class)
119 .extractChild(Alarms.class)
121 .leaf(Alarms::getCritical).nonNull()
123 LOG.info("Query built in {}", sw);
125 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
126 assertEquals(3, items.size());
130 public void testFindNonCriticalAlarms() {
131 final Stopwatch sw = Stopwatch.createStarted();
132 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
133 .extractChild(System.class)
134 .extractChild(Alarms.class)
136 .leaf(Alarms::getCritical).isNull()
138 LOG.info("Query built in {}", sw);
140 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
141 assertEquals(1, items.size());
145 public void testFindZeroAlarms() {
146 final Stopwatch sw = Stopwatch.createStarted();
147 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
148 .extractChild(System.class)
149 .extractChild(Alarms.class)
151 .leaf(Alarms::getId).valueEquals(Uint64.ZERO)
153 LOG.info("Query built in {}", sw);
155 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
156 assertEquals(2, items.size());
158 List<Alarms> verifiedResult = items.stream()
160 .filter(object -> object.getId().equals(Uint64.ZERO))
161 .collect(Collectors.toList());
162 assertNotNull(verifiedResult);
163 assertEquals(2, verifiedResult.size());
167 public void testFindSystemFirstAlarmOne() {
168 final Stopwatch sw = Stopwatch.createStarted();
169 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
170 .extractChild(System.class, new SystemKey("first"))
171 .extractChild(Alarms.class)
173 .leaf(Alarms::getId).valueEquals(Uint64.ZERO)
175 LOG.info("Query built in {}", sw);
177 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
178 assertEquals(1, items.size());
182 public void testFindGreaterThanAlarms() {
183 final Stopwatch sw = Stopwatch.createStarted();
184 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
185 .extractChild(System.class)
186 .extractChild(Alarms.class)
188 .leaf(Alarms::getId).greaterThan(Uint64.ONE)
190 LOG.info("Query built in {}", sw);
192 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
193 assertEquals(1, items.size());
197 public void testFindGreaterThanOrEqualsAlarms() {
198 final Stopwatch sw = Stopwatch.createStarted();
199 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
200 .extractChild(System.class)
201 .extractChild(Alarms.class)
203 .leaf(Alarms::getId).greaterThanOrEqual(Uint64.ONE)
205 LOG.info("Query built in {}", sw);
207 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
208 assertEquals(2, items.size());
212 public void testFindLessThanAlarms() {
213 final Stopwatch sw = Stopwatch.createStarted();
214 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
215 .extractChild(System.class)
216 .extractChild(Alarms.class)
218 .leaf(Alarms::getId).lessThan(Uint64.ONE)
220 LOG.info("Query built in {}", sw);
222 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
223 assertEquals(2, items.size());
227 public void testFindLessThanOrEqualsAlarms() {
228 final Stopwatch sw = Stopwatch.createStarted();
229 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
230 .extractChild(System.class)
231 .extractChild(Alarms.class)
233 .leaf(Alarms::getId).lessThanOrEqual(Uint64.ONE)
235 LOG.info("Query built in {}", sw);
237 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
238 assertEquals(3, items.size());
242 public void testFindSystemFirstWithAlarmOne() {
243 final Stopwatch sw = Stopwatch.createStarted();
244 final QueryExpression<System> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
245 .extractChild(System.class, new SystemKey("first"))
247 .childObject(Alarms.class)
248 .leaf(Alarms::getId).valueEquals(Uint64.ZERO)
250 LOG.info("Query built in {}", sw);
252 final List<? extends Item<@NonNull System>> items = execute(query).getItems();
253 assertEquals(1, items.size());
257 private <T extends @NonNull DataObject> QueryResult<T> execute(final QueryExpression<T> query) {
258 final Stopwatch sw = Stopwatch.createStarted();
259 final QueryResult<T> result = executor.executeQuery(query);
260 LOG.info("Query executed in {}", sw);