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.ServiceLoader;
16 import java.util.stream.Collectors;
17 import org.eclipse.jdt.annotation.NonNull;
18 import org.junit.AfterClass;
19 import org.junit.Before;
20 import org.junit.BeforeClass;
21 import org.junit.Test;
22 import org.opendaylight.mdsal.binding.api.query.QueryExecutor;
23 import org.opendaylight.mdsal.binding.api.query.QueryExpression;
24 import org.opendaylight.mdsal.binding.api.query.QueryFactory;
25 import org.opendaylight.mdsal.binding.api.query.QueryResult;
26 import org.opendaylight.mdsal.binding.api.query.QueryResult.Item;
27 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
28 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
29 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
30 import org.opendaylight.yang.gen.v1.mdsal.query.norev.Foo;
31 import org.opendaylight.yang.gen.v1.mdsal.query.norev.FooBuilder;
32 import org.opendaylight.yang.gen.v1.mdsal.query.norev.first.grp.System;
33 import org.opendaylight.yang.gen.v1.mdsal.query.norev.first.grp.SystemBuilder;
34 import org.opendaylight.yang.gen.v1.mdsal.query.norev.first.grp.SystemKey;
35 import org.opendaylight.yang.gen.v1.mdsal.query.norev.second.grp.Alarms;
36 import org.opendaylight.yang.gen.v1.mdsal.query.norev.second.grp.AlarmsBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelList;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.top.level.list.NestedList;
40 import org.opendaylight.yangtools.yang.binding.DataObject;
41 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
42 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
43 import org.opendaylight.yangtools.yang.common.Empty;
44 import org.opendaylight.yangtools.yang.common.Uint64;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
48 public class QueryBuilderTest {
49 private static final Logger LOG = LoggerFactory.getLogger(QueryBuilderTest.class);
50 private static BindingCodecTree CODEC;
52 private final QueryFactory factory = new DefaultQueryFactory(CODEC);
53 private QueryExecutor executor;
56 public static final void beforeClass() {
57 CODEC = ServiceLoader.load(BindingCodecTreeFactory.class).findFirst().orElseThrow()
58 .create(BindingRuntimeHelpers.createRuntimeContext());
62 public static final void afterClass() {
67 public void before() {
68 executor = SimpleQueryExecutor.builder(CODEC)
70 .setSystem(BindingMap.of(
71 new SystemBuilder().setName("first").setAlarms(BindingMap.of(
74 .setCritical(Empty.value())
75 .setAffectedUsers(BindingMap.of(
80 .setAffectedUsers(BindingMap.of(
85 .setCritical(Empty.value())
86 .setAffectedUsers(BindingMap.of(
89 new SystemBuilder().setName("second").setAlarms(BindingMap.of(
92 .setCritical(Empty.value())
93 .setAffectedUsers(BindingMap.of(
103 final Stopwatch sw = Stopwatch.createStarted();
104 final QueryExpression<TopLevelList> query = factory.querySubtree(InstanceIdentifier.create(Top.class))
105 .extractChild(TopLevelList.class)
107 .childObject(NestedList.class)
108 .leaf(NestedList::getName).contains("foo")
109 .and().leaf(TopLevelList::getName).valueEquals("bar")
111 LOG.info("Query built in {}", sw);
113 assertEquals(0, execute(query).getItems().size());
117 public void testFindCriticalAlarms() {
118 final Stopwatch sw = Stopwatch.createStarted();
119 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
120 .extractChild(System.class)
121 .extractChild(Alarms.class)
123 .leaf(Alarms::getCritical).nonNull()
125 LOG.info("Query built in {}", sw);
127 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
128 assertEquals(3, items.size());
132 public void testFindNonCriticalAlarms() {
133 final Stopwatch sw = Stopwatch.createStarted();
134 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
135 .extractChild(System.class)
136 .extractChild(Alarms.class)
138 .leaf(Alarms::getCritical).isNull()
140 LOG.info("Query built in {}", sw);
142 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
143 assertEquals(1, items.size());
147 public void testFindZeroAlarms() {
148 final Stopwatch sw = Stopwatch.createStarted();
149 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
150 .extractChild(System.class)
151 .extractChild(Alarms.class)
153 .leaf(Alarms::getId).valueEquals(Uint64.ZERO)
155 LOG.info("Query built in {}", sw);
157 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
158 assertEquals(2, items.size());
160 List<Alarms> verifiedResult = items.stream()
162 .filter(object -> object.getId().equals(Uint64.ZERO))
163 .collect(Collectors.toList());
164 assertNotNull(verifiedResult);
165 assertEquals(2, verifiedResult.size());
169 public void testFindSystemFirstAlarmOne() {
170 final Stopwatch sw = Stopwatch.createStarted();
171 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
172 .extractChild(System.class, new SystemKey("first"))
173 .extractChild(Alarms.class)
175 .leaf(Alarms::getId).valueEquals(Uint64.ZERO)
177 LOG.info("Query built in {}", sw);
179 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
180 assertEquals(1, items.size());
184 public void testFindGreaterThanAlarms() {
185 final Stopwatch sw = Stopwatch.createStarted();
186 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
187 .extractChild(System.class)
188 .extractChild(Alarms.class)
190 .leaf(Alarms::getId).greaterThan(Uint64.ONE)
192 LOG.info("Query built in {}", sw);
194 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
195 assertEquals(1, items.size());
199 public void testFindGreaterThanOrEqualsAlarms() {
200 final Stopwatch sw = Stopwatch.createStarted();
201 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
202 .extractChild(System.class)
203 .extractChild(Alarms.class)
205 .leaf(Alarms::getId).greaterThanOrEqual(Uint64.ONE)
207 LOG.info("Query built in {}", sw);
209 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
210 assertEquals(2, items.size());
214 public void testFindLessThanAlarms() {
215 final Stopwatch sw = Stopwatch.createStarted();
216 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
217 .extractChild(System.class)
218 .extractChild(Alarms.class)
220 .leaf(Alarms::getId).lessThan(Uint64.ONE)
222 LOG.info("Query built in {}", sw);
224 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
225 assertEquals(2, items.size());
229 public void testFindLessThanOrEqualsAlarms() {
230 final Stopwatch sw = Stopwatch.createStarted();
231 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
232 .extractChild(System.class)
233 .extractChild(Alarms.class)
235 .leaf(Alarms::getId).lessThanOrEqual(Uint64.ONE)
237 LOG.info("Query built in {}", sw);
239 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
240 assertEquals(3, items.size());
244 public void testFindSystemFirstWithAlarmOne() {
245 final Stopwatch sw = Stopwatch.createStarted();
246 final QueryExpression<System> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
247 .extractChild(System.class, new SystemKey("first"))
249 .childObject(Alarms.class)
250 .leaf(Alarms::getId).valueEquals(Uint64.ZERO)
252 LOG.info("Query built in {}", sw);
254 final List<? extends Item<@NonNull System>> items = execute(query).getItems();
255 assertEquals(1, items.size());
259 private <T extends @NonNull DataObject> QueryResult<T> execute(final QueryExpression<T> query) {
260 final Stopwatch sw = Stopwatch.createStarted();
261 final QueryResult<T> result = executor.executeQuery(query);
262 LOG.info("Query executed in {}", sw);