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.api.BindingCodecTree;
25 import org.opendaylight.mdsal.binding.dom.codec.impl.DefaultBindingCodecTreeFactory;
26 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
27 import org.opendaylight.yang.gen.v1.mdsal.query.norev.Foo;
28 import org.opendaylight.yang.gen.v1.mdsal.query.norev.FooBuilder;
29 import org.opendaylight.yang.gen.v1.mdsal.query.norev.first.grp.System;
30 import org.opendaylight.yang.gen.v1.mdsal.query.norev.first.grp.SystemBuilder;
31 import org.opendaylight.yang.gen.v1.mdsal.query.norev.first.grp.SystemKey;
32 import org.opendaylight.yang.gen.v1.mdsal.query.norev.second.grp.Alarms;
33 import org.opendaylight.yang.gen.v1.mdsal.query.norev.second.grp.AlarmsBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelList;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.top.level.list.NestedList;
37 import org.opendaylight.yangtools.yang.binding.DataObject;
38 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
39 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
40 import org.opendaylight.yangtools.yang.common.Empty;
41 import org.opendaylight.yangtools.yang.common.Uint64;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
45 public class QueryBuilderTest {
46 private static final Logger LOG = LoggerFactory.getLogger(QueryBuilderTest.class);
47 private static BindingCodecTree CODEC;
49 private final QueryFactory factory = new DefaultQueryFactory(CODEC);
50 private QueryExecutor executor;
53 public static final void beforeClass() {
54 CODEC = new DefaultBindingCodecTreeFactory().create(BindingRuntimeHelpers.createRuntimeContext());
58 public static final void afterClass() {
63 public void before() {
64 executor = SimpleQueryExecutor.builder(CODEC)
66 .setSystem(BindingMap.of(
67 new SystemBuilder().setName("first").setAlarms(BindingMap.of(
70 .setCritical(Empty.getInstance())
71 .setAffectedUsers(BindingMap.of(
76 .setAffectedUsers(BindingMap.of(
81 .setCritical(Empty.getInstance())
82 .setAffectedUsers(BindingMap.of(
85 new SystemBuilder().setName("second").setAlarms(BindingMap.of(
88 .setCritical(Empty.getInstance())
89 .setAffectedUsers(BindingMap.of(
99 final Stopwatch sw = Stopwatch.createStarted();
100 final QueryExpression<TopLevelList> query = factory.querySubtree(InstanceIdentifier.create(Top.class))
101 .extractChild(TopLevelList.class)
103 .childObject(NestedList.class)
104 .leaf(NestedList::getName).contains("foo")
105 .and().leaf(TopLevelList::getName).valueEquals("bar")
107 LOG.info("Query built in {}", sw);
109 assertEquals(0, execute(query).getItems().size());
113 public void testFindCriticalAlarms() {
114 final Stopwatch sw = Stopwatch.createStarted();
115 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
116 .extractChild(System.class)
117 .extractChild(Alarms.class)
119 .leaf(Alarms::getCritical).nonNull()
121 LOG.info("Query built in {}", sw);
123 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
124 assertEquals(3, items.size());
128 public void testFindNonCriticalAlarms() {
129 final Stopwatch sw = Stopwatch.createStarted();
130 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
131 .extractChild(System.class)
132 .extractChild(Alarms.class)
134 .leaf(Alarms::getCritical).isNull()
136 LOG.info("Query built in {}", sw);
138 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
139 assertEquals(1, items.size());
143 public void testFindZeroAlarms() {
144 final Stopwatch sw = Stopwatch.createStarted();
145 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
146 .extractChild(System.class)
147 .extractChild(Alarms.class)
149 .leaf(Alarms::getId).valueEquals(Uint64.ZERO)
151 LOG.info("Query built in {}", sw);
153 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
154 assertEquals(2, items.size());
158 public void testFindSystemFirstAlarmOne() {
159 final Stopwatch sw = Stopwatch.createStarted();
160 final QueryExpression<Alarms> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
161 .extractChild(System.class, new SystemKey("first"))
162 .extractChild(Alarms.class)
164 .leaf(Alarms::getId).valueEquals(Uint64.ZERO)
166 LOG.info("Query built in {}", sw);
168 final List<? extends Item<@NonNull Alarms>> items = execute(query).getItems();
169 assertEquals(1, items.size());
173 public void testFindSystemFirstWithAlarmOne() {
174 final Stopwatch sw = Stopwatch.createStarted();
175 final QueryExpression<System> query = factory.querySubtree(InstanceIdentifier.create(Foo.class))
176 .extractChild(System.class, new SystemKey("first"))
178 .childObject(Alarms.class)
179 .leaf(Alarms::getId).valueEquals(Uint64.ZERO)
181 LOG.info("Query built in {}", sw);
183 final List<? extends Item<@NonNull System>> items = execute(query).getItems();
184 assertEquals(1, items.size());
188 private <T extends @NonNull DataObject> QueryResult<T> execute(final QueryExpression<T> query) {
189 final Stopwatch sw = Stopwatch.createStarted();
190 final QueryResult<T> result = executor.executeQuery(query);
191 LOG.info("Query executed in {}", sw);