/* * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.mdsal.binding.dom.adapter.query; import static org.junit.Assert.assertEquals; import com.google.common.base.Stopwatch; import java.util.List; import org.eclipse.jdt.annotation.NonNull; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.opendaylight.mdsal.binding.api.query.QueryExecutor; import org.opendaylight.mdsal.binding.api.query.QueryExpression; import org.opendaylight.mdsal.binding.api.query.QueryFactory; import org.opendaylight.mdsal.binding.api.query.QueryResult; import org.opendaylight.mdsal.binding.api.query.QueryResult.Item; import org.opendaylight.mdsal.binding.api.query.QueryStructureException; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy; import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext; import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.yang.gen.v1.mdsal.query.norev.Foo; import org.opendaylight.yang.gen.v1.mdsal.query.norev.FooBuilder; import org.opendaylight.yang.gen.v1.mdsal.query.norev.first.grp.System; import org.opendaylight.yang.gen.v1.mdsal.query.norev.first.grp.SystemBuilder; import org.opendaylight.yang.gen.v1.mdsal.query.norev.second.grp.Alarms; import org.opendaylight.yang.gen.v1.mdsal.query.norev.second.grp.AlarmsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.Top; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.TopLevelList; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.test.binding.rev140701.two.level.list.top.level.list.NestedList; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.common.Uint64; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class QueryBuilderTest { private static final Logger LOG = LoggerFactory.getLogger(QueryBuilderTest.class); private static BindingNormalizedNodeCodecRegistry CODEC; private final QueryFactory factory = new DefaultQueryFactory(CODEC); private QueryExecutor executor; @BeforeClass public static void beforeClass() { ModuleInfoBackedContext ctx = ModuleInfoBackedContext.create(); ctx.addModuleInfos(BindingReflections.loadModuleInfos()); final SchemaContext schemaContext = ctx.tryToCreateSchemaContext().get(); CODEC = new BindingNormalizedNodeCodecRegistry( BindingRuntimeContext.create(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(), schemaContext)); } @AfterClass public static final void afterClass() { CODEC = null; } @Before public void before() { executor = SimpleQueryExecutor.builder(CODEC.getCodecContext()) .add(new FooBuilder() .setSystem(List.of( new SystemBuilder().setName("first").setAlarms(List.of( new AlarmsBuilder() .setId(Uint64.ZERO) .setCritical(Empty.getInstance()) .setAffectedUsers(List.of( // TODO: fill )).build(), new AlarmsBuilder() .setId(Uint64.ONE) .setAffectedUsers(List.of( // TODO: fill )).build(), new AlarmsBuilder() .setId(Uint64.TWO) .setCritical(Empty.getInstance()) .setAffectedUsers(List.of( // TODO: fill )).build())).build(), new SystemBuilder().setName("second").setAlarms(List.of( new AlarmsBuilder() .setId(Uint64.ZERO) .setCritical(Empty.getInstance()) .setAffectedUsers(List.of( // TODO: fill )).build())).build() )) .build()) .build(); } @Test public void bar() throws QueryStructureException { final Stopwatch sw = Stopwatch.createStarted(); final QueryExpression query = factory.querySubtree(InstanceIdentifier.create(Top.class)) .extractChild(TopLevelList.class) .matching() .childObject(NestedList.class) .leaf(NestedList::getName).contains("foo") .and().leaf(TopLevelList::getName).valueEquals("bar") .build(); LOG.info("Query built in {}", sw); assertEquals(0, execute(query).getItems().size()); } @Test public void testFindCriticalAlarms() throws QueryStructureException { final Stopwatch sw = Stopwatch.createStarted(); final QueryExpression query = factory.querySubtree(InstanceIdentifier.create(Foo.class)) .extractChild(System.class) .extractChild(Alarms.class) .matching() .leaf(Alarms::getCritical).nonNull() .build(); LOG.info("Query built in {}", sw); final List> items = execute(query).getItems(); assertEquals(3, items.size()); } @Test public void testFindNonCriticalAlarms() throws QueryStructureException { final Stopwatch sw = Stopwatch.createStarted(); final QueryExpression query = factory.querySubtree(InstanceIdentifier.create(Foo.class)) .extractChild(System.class) .extractChild(Alarms.class) .matching() .leaf(Alarms::getCritical).isNull() .build(); LOG.info("Query built in {}", sw); final List> items = execute(query).getItems(); assertEquals(1, items.size()); } @Test public void testFindZeroAlarms() throws QueryStructureException { final Stopwatch sw = Stopwatch.createStarted(); final QueryExpression query = factory.querySubtree(InstanceIdentifier.create(Foo.class)) .extractChild(System.class) .extractChild(Alarms.class) .matching() .leaf(Alarms::getId).valueEquals(Uint64.ZERO) .build(); LOG.info("Query built in {}", sw); final List> items = execute(query).getItems(); assertEquals(2, items.size()); } private QueryResult execute(final QueryExpression query) { final Stopwatch sw = Stopwatch.createStarted(); final QueryResult result = executor.executeQuery(query); LOG.info("Query executed in {}", sw); return result; } }