/* Copyright [2013-2014] eBay Software Foundation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ /** * */ /* Copyright 2012 eBay Software Foundation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package com.ebay.cloud.cms.query.service; import java.util.List; import org.codehaus.jackson.node.ObjectNode; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; import com.ebay.cloud.cms.dal.entity.IEntity; import com.ebay.cloud.cms.dal.search.IQueryExplanation; import com.ebay.cloud.cms.metadata.model.MetaClass; import com.ebay.cloud.cms.query.MongoBaseTest; import com.ebay.cloud.cms.query.exception.QueryException.QueryErrCodeEnum; import com.ebay.cloud.cms.query.optimizer.QueryOptimizeException; import com.ebay.cloud.cms.query.parser.QueryParseException; /** * @author liasu * */ public class SetQueryServiceTest extends MongoBaseTest { /** * A.(b || c) */ @SuppressWarnings("unchecked") @Test public void testUnion() { raptorContext.setAllowFullTableScan(true); String query = "ApplicationService{*}.(services[@name=~\"srp-app.*\"]{*} || updateStrategies{*})"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(2, result.getEntities().size()); IEntity entity = result.getEntities().get(0); List<IEntity> services = (List<IEntity>) entity.getFieldValues("services"); Assert.assertTrue(services.size() > 0); for (IEntity serv : services) { // service are projected more than just _oid and _type Assert.assertTrue(serv.getFieldNames().size() > 2); Assert.assertEquals("ServiceInstance", serv.getType()); } List<IEntity> strategies = (List<IEntity>) entity.getFieldValues("updateStrategies"); Assert.assertTrue(strategies.size() > 0); for (IEntity strategy : strategies) { // strategies are projected more than just _oid and _type Assert.assertTrue(strategy.getFieldNames().size() > 2); Assert.assertEquals("UpdateStrategy", strategy.getType()); } System.out.println(entity); } /** * A.(b && c) */ @Test public void testIntersection() { String query = "ApplicationService.(services[@name=~\"srp-app.*\"] && updateStrategies[@name=\"1-100-novalid\"])"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(0, result.getEntities().size()); } /** * A.(b && c) */ @Test @SuppressWarnings("unchecked") public void testIntersection2() { String query = "ApplicationService{*}.(services[@name=~\"srp-app.*\"]{*} && updateStrategies[@name=\"1-25-50-100\" or @name=\"1-100\"]{*})"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(2, result.getEntities().size()); IEntity entity = result.getEntities().get(0); List<IEntity> services = (List<IEntity>) entity.getFieldValues("services"); Assert.assertTrue(services.size() > 0); for (IEntity serv : services) { // service are projected more than just _oid and _type Assert.assertTrue(serv.getFieldNames().size() > 2); Assert.assertEquals("ServiceInstance", serv.getType()); } List<IEntity> strategies = (List<IEntity>) entity.getFieldValues("updateStrategies"); Assert.assertTrue(strategies.size() > 0); for (IEntity strategy : strategies) { // strategies are projected more than just _oid and _type Assert.assertTrue(strategy.getFieldNames().size() > 2); Assert.assertEquals("UpdateStrategy", strategy.getType()); } System.out.println(entity); } @Test public void testIntersection3() { String query = "ServiceInstance{*}.(appService.(services || updateStrategies) && runsOn[@_oid=\"4fbb314fc681caf13e283a7b\"]{*})"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(1, result.getEntities().size()); } @Test public void testIntersection4() { String query = "ServiceInstance{*}.(appService && runsOn[@_oid=\"4fbb314fc681caf13e283a7b\"]{*})"; // raptorContext.setHint(1); IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(1, result.getEntities().size()); raptorContext.setHint(0); } /** * A.b.(c && d) */ @Test @SuppressWarnings("unchecked") public void testDeepIntersection() { String query = "Environment{*}.applications{*}.(services[@name=~\"srp-app.*\"]{*} && updateStrategies[@name=\"1-25-50-100\" or @name=\"1-100\"]{*})"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(1, result.getEntities().size()); Assert.assertEquals(1, result.getEntities().get(0).getFieldValues("applications").size()); IEntity entity = (IEntity) result.getEntities().get(0).getFieldValues("applications").get(0); List<IEntity> services = (List<IEntity>) entity.getFieldValues("services"); Assert.assertTrue(services.size() > 0); for (IEntity serv : services) { // service are projected more than just _oid and _type Assert.assertTrue(serv.getFieldNames().size() > 2); Assert.assertEquals("ServiceInstance", serv.getType()); } List<IEntity> strategies = (List<IEntity>) entity.getFieldValues("updateStrategies"); Assert.assertTrue(strategies.size() > 0); for (IEntity strategy : strategies) { // strategies are projected more than just _oid and _type Assert.assertTrue(strategy.getFieldNames().size() > 2); Assert.assertEquals("UpdateStrategy", strategy.getType()); } System.out.println(entity); } /** * A.b.(c || d) */ @Test @SuppressWarnings("unchecked") public void testDeepUnion() { raptorContext.setAllowFullTableScan(true); String query = "Environment{*}.applications{*}.(services[@name=~\"srp-app.*\"]{*} || updateStrategies{*})"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(1, result.getEntities().size()); Assert.assertTrue(result.getEntities().get(0).getFieldNames().size() > 2); Assert.assertEquals(1, result.getEntities().get(0).getFieldValues("applications").size()); IEntity appEntity = (IEntity) result.getEntities().get(0).getFieldValues("applications").get(0); // at least _oid, _type, services, updateStrategies Assert.assertTrue(appEntity.getFieldNames().size() > 4); List<IEntity> services = (List<IEntity>) appEntity.getFieldValues("services"); Assert.assertEquals(10, services.size()); for (IEntity serv : services) { // service are projected more than just _oid and _type Assert.assertTrue(serv.getFieldNames().size() > 2); Assert.assertEquals("ServiceInstance", serv.getType()); } List<IEntity> strategies = (List<IEntity>) appEntity.getFieldValues("updateStrategies"); Assert.assertTrue(strategies.size() == 2); for (IEntity strategy : strategies) { // strategies are projected more than just _oid and _type Assert.assertTrue(strategy.getFieldNames().size() > 2); Assert.assertEquals("UpdateStrategy", strategy.getType()); } System.out.println(appEntity); } /** * A.(c || d || e) */ @Test public void testMultipleUnion() { String query = "Compute[@fqdns=\"slc4-0003.ebay.com\"]{*}.(parentCluster[@_oid=\"CLguf6sdle\"] || activeManifestRef[@_oid=\"B-N-D-1.20111108154904.0\"] || activeManifestCur[@_oid=\"Black-Pearl-1.20111103221326.0\"])"; IQueryResult result = queryService.query(query, stratusContext); Assert.assertEquals(1, result.getEntities().size()); } @Test public void testMultipleUnion02() { String query = "Compute[@fqdns=\"slc4-0003.ebay.com\"]{*}.(parentCluster[@_oid=\"CLguf6sdle-invalid\"] || activeManifestRef[@_oid=\"B-N-D-1.20111108154904.0-unknown\"] || activeManifestCur[@_oid=\"Black-Pearl-1.20111103221326.0-unknown\"])"; IQueryResult result = queryService.query(query, stratusContext); Assert.assertEquals(0, result.getEntities().size()); } @Test public void testMultipleUnion03() { String query = "Compute[@fqdns=\"slc4-0003.ebay.com\"]{*}." + "( <VPool>parentCluster[@_oid=\"CLguf6sdle\"] " + "|| activeManifestRef[@_oid=\"B-N-D-1.20111108154904.0-unknown\"] " + "|| activeManifestCur[@_oid=\"Black-Pearl-1.20111103221326.0-unknown\"])"; IQueryResult result = queryService.query(query, stratusContext); Assert.assertEquals(1, result.getEntities().size()); } /** * A.(c && d && e) */ @Test public void testMultipleIntersection() { String query = "Compute[@fqdns=\"slc4-0003.ebay.com\"]{*}." + "( <VPool>parentCluster[@_oid=\"CLguf6sdle\"] " + "&& activeManifestRef[@_oid=\"B-N-D-1.20111108154904.0\"] " + "&& activeManifestCur[@_oid=\"Black-Pearl-1.20111103221326.0\"])"; IQueryResult result = queryService.query(query, stratusContext); Assert.assertEquals(1, result.getEntities().size()); } /** * A.(c && d && e) */ @Test public void testMultipleIntersection2() { String query = "Compute[@fqdns=\"slc4-0003.ebay.com\"]{*}." + "( <VPool>parentCluster[@_oid=\"CLguf6sdle-invalid\"] " + "&& activeManifestRef[@_oid=\"B-N-D-1.20111108154904.0\"] " + "&& activeManifestCur[@_oid=\"Black-Pearl-1.20111103221326.0\"])"; IQueryResult result = queryService.query(query, stratusContext); Assert.assertEquals(0, result.getEntities().size()); } /** * A.(b && c || d) */ @Test public void testUnionAdjentIntersection() { String query = "Compute[@fqdns=\"slc4-0003.ebay.com\"]{*}." + "( <VPool>parentCluster[@_oid=\"CLguf6sdle\"] " + "&& activeManifestRef[@_oid=\"B-N-D-1.20111108154904.0\"]" + "|| activeManifestCur[@_oid=\"Black-Pearl-1.20111103221326.0\"])"; IQueryResult result = queryService.query(query, stratusContext); Assert.assertEquals(1, result.getEntities().size()); } /** * A.(b && c || d) */ @Test public void testUnionAdjentIntersection1() { String query = "Compute[@fqdns=\"slc4-0003.ebay.com\"]{*}." + "( <VPool>parentCluster[@_oid=\"CLguf6sdle-invalid\"] " + "&& activeManifestRef[@_oid=\"B-N-D-1.20111108154904.0\"]" + "|| activeManifestCur[@_oid=\"Black-Pearl-1.20111103221326.0\"])"; IQueryResult result = queryService.query(query, stratusContext); Assert.assertEquals(1, result.getEntities().size()); } /** * A.(b && c || d) -- project on no result path */ @Test public void testUnionAdjentIntersection1_invalid_projection() { String query = "Compute[@fqdns=\"slc4-0003.ebay.com\"]." + "( <VPool>parentCluster[@_oid=\"CLguf6sdle-invalid\"]{*} " + "&& activeManifestRef[@_oid=\"B-N-D-1.20111108154904.0\"]" + "|| activeManifestCur[@_oid=\"Black-Pearl-1.20111103221326.0\"])"; IQueryResult result = queryService.query(query, stratusContext); Assert.assertEquals(0, result.getEntities().size()); } /** * A.(b || c && d) * * Note for the projection: * b, c, d should all be projection, no miss */ @SuppressWarnings("unchecked") @Test public void testUnionAdjentIntersection2() { String query = "Compute[@fqdns=\"slc4-0003.ebay.com\"]{*}." + "( <VPool>parentCluster[@_oid=\"CLguf6sdle\"]{*} " + "|| activeManifestRef[@_oid=\"B-N-D-1.20111108154904.0\"]{*} " + "&& activeManifestCur[@_oid=\"Black-Pearl-1.20111103221326.0\"] {*})"; IQueryResult result = queryService.query(query, stratusContext); Assert.assertEquals(1, result.getEntities().size()); IEntity entity = result.getEntities().get(0); List<IEntity> clusters = (List<IEntity>)entity.getFieldValues("parentCluster"); Assert.assertTrue(clusters.size() > 0); for (IEntity ent :clusters) { Assert.assertTrue(ent.getFieldNames().size() > 2); System.out.println(ent.getFieldNames()); } List<IEntity> activeManifestRefs = (List<IEntity>)entity.getFieldValues("activeManifestRef"); Assert.assertTrue(activeManifestRefs.size() > 0); for (IEntity ent :activeManifestRefs) { Assert.assertTrue(ent.getFieldNames().size() > 2); System.out.println(ent.getFieldNames()); } List<IEntity> activeManifestCurs = (List<IEntity>)entity.getFieldValues("activeManifestCur"); Assert.assertTrue(activeManifestCurs.size() > 0); for (IEntity ent :activeManifestCurs) { Assert.assertTrue(ent.getFieldNames().size() > 2); System.out.println(ent.getFieldNames()); } } /** * A.(b[invalid filter] || c && d) */ @Test public void testUnionAdjentIntersection3() { String query = "Compute[@fqdns=\"slc4-0003.ebay.com\"]{*}." + "( <VPool>parentCluster[@_oid=\"CLguf6sdle-invalid\"] " + "|| activeManifestRef[@_oid=\"B-N-D-1.20111108154904.0\"] " + "&& activeManifestCur[@_oid=\"Black-Pearl-1.20111103221326.0\"])"; IQueryResult result = queryService.query(query, stratusContext); Assert.assertEquals(1, result.getEntities().size()); } /** * * A.b.(c.d || e) */ @SuppressWarnings("unchecked") @Test public void testJoinInSet() { String query = "Environment{*}.applications{*}.(services[@name=~\"srp-app.*\"]{*}.runsOn[@name=~\"compute.*\"] || updateStrategies{*})"; QueryContext context = newQueryContext(raptorContext); context.setAllowFullTableScan(true); IQueryResult result = queryService.query(query, context); Assert.assertEquals(1, result.getEntities().size()); Assert.assertEquals(1, result.getEntities().get(0).getFieldValues("applications").size()); IEntity entity = (IEntity) result.getEntities().get(0).getFieldValues("applications").get(0); List<IEntity> services = (List<IEntity>) entity.getFieldValues("services"); Assert.assertTrue(services.size() > 0); for (IEntity serv : services) { // service are projected more than just _oid and _type Assert.assertTrue(serv.getFieldNames().size() > 2); Assert.assertEquals("ServiceInstance", serv.getType()); } List<IEntity> strategies = (List<IEntity>) entity.getFieldValues("updateStrategies"); Assert.assertTrue(strategies.size() > 0); for (IEntity strategy : strategies) { // strategies are projected more than just _oid and _type Assert.assertTrue(strategy.getFieldNames().size() > 2); Assert.assertEquals("UpdateStrategy", strategy.getType()); } System.out.println(entity); } @Test public void testJoinInSet2() { String query = "Environment{*}.applications{*}.(services[@name=~\"srp-app.*\"]{*}.runsOn[@name=\"compute\"] && updateStrategies{*})"; QueryContext context = newQueryContext(raptorContext); IQueryResult result = queryService.query(query, context); Assert.assertEquals(0, result.getEntities().size()); } /** * A.b.(c.d && e.f) */ @Test public void testMultiJoinInset() { } /** * A.(b.(c.d && e) && f) */ @Test @SuppressWarnings("unchecked") public void testMultiLevelSet() { String query = "Environment.( " + "applications{*}." + " ( services[@name=~\"srp-app.*\"]{*}.runsOn[@name=~\"compute.*\"] " + " && updateStrategies{*}) " + "&&" + " cos[@_oid=\"4fbb314fc681caf13e283a77\"] " + ")"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(1, result.getEntities().size()); for (IEntity entity : result.getEntities()) { System.out.println(entity); Assert.assertEquals("ApplicationService", entity.getType()); Assert.assertTrue(entity.getFieldNames().size() > 2); List<IEntity> services = (List<IEntity>) entity.getFieldValues("services"); Assert.assertTrue(!services.isEmpty()); for (IEntity servEntity : services) { Assert.assertTrue(entity.getFieldNames().size() > 2); Assert.assertEquals("ServiceInstance", servEntity.getType()); } List<IEntity> strategies = (List<IEntity>) entity.getFieldValues("updateStrategies"); Assert.assertTrue(!strategies.isEmpty()); for (IEntity strategy : strategies) { Assert.assertTrue(entity.getFieldNames().size() > 2); Assert.assertEquals("UpdateStrategy", strategy.getType()); } } } /** * A.(b.(c.d && e) && f) */ @Test public void testMultiLevelSet2() { String query = "Environment.( " + "applications{*}." + " ( services[@name=~\"srp-app.*\"]{*}.runsOn[@name=~\"compute.*\"] " + " && updateStrategies{*}) " + "&&" + " cos[@_oid=\"4fbb314fc681caf13e283a77-invalid\"] " + ")"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(0, result.getEntities().size()); } /** * A.(b.(c.d || e) && f) */ @Test public void testMultiLevelSet3() { String query = "Environment.( " + "applications{*}." + " ( services[@name=~\"srp-app.*\"]{*}.runsOn[@name=~\"compute.*\"] " + " || " + " updateStrategies{*} ) " + "&&" + " cos[@_oid=\"4fbb314fc681caf13e283a77\"] " + ")"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(1, result.getEntities().size()); } /** * A.(b.(c.d || e) && f) */ @Test public void testMultiLevelSet4() { String query = "Environment.( " + "applications{*}." + " ( services[@name=~\"srp-app.*\"]{*}.runsOn[@name=~\"compute.*\"] " + " || " + " updateStrategies{*} ) " + "&&" + " cos[@_oid=\"4fbb314fc681caf13e283a77-valid\"] " + ")"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(0, result.getEntities().size()); } /** * A.(b.(c.d && e) || f) */ @Test public void testMultiLevelSet5() { String query = "Environment.( " + "applications{*}." + " ( services[@name=~\"srp-app.*\"]{*}.runsOn[@name=~\"compute-invalid.*\"] " + " && " + " updateStrategies{*} ) " + "&&" + " cos[@_oid=\"4fbb314fc681caf13e283a77\"] " + ")"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(0, result.getEntities().size()); } /** * A.((b || c) && d) * * Note for the projection: * b, c, d should all be projection, no miss */ @SuppressWarnings("unchecked") @Test public void testMultiLevelSet6() { String query = "Compute[@fqdns=\"slc4-0003.ebay.com\"]{*}." + "( (<VPool>parentCluster[@_oid=\"CLguf6sdle\"]{*} " + "|| activeManifestRef[@_oid=\"B-N-D-1.20111108154904.0\"]{*}) " + "&& activeManifestCur[@_oid=\"Black-Pearl-1.20111103221326.0\"] {*})"; IQueryResult result = queryService.query(query, stratusContext); Assert.assertEquals(1, result.getEntities().size()); IEntity entity = result.getEntities().get(0); List<IEntity> clusters = (List<IEntity>)entity.getFieldValues("parentCluster"); Assert.assertTrue(clusters.size() > 0); for (IEntity ent :clusters) { Assert.assertTrue(ent.getFieldNames().size() > 2); System.out.println(ent.getFieldNames()); } List<IEntity> activeManifestRefs = (List<IEntity>)entity.getFieldValues("activeManifestRef"); Assert.assertTrue(activeManifestRefs.size() > 0); for (IEntity ent :activeManifestRefs) { Assert.assertTrue(ent.getFieldNames().size() > 2); System.out.println(ent.getFieldNames()); } List<IEntity> activeManifestCurs = (List<IEntity>)entity.getFieldValues("activeManifestCur"); Assert.assertTrue(activeManifestCurs.size() > 0); for (IEntity ent :activeManifestCurs) { Assert.assertTrue(ent.getFieldNames().size() > 2); System.out.println(ent.getFieldNames()); } } /** * b is referenced in A; c and d are embed in b. * * A.b.(c && d) * */ @Test public void testEmbed() { } /** * b is embed in a; c and d are embed in b. * * A.b.(c && d) */ @Test public void testEmbed2() { } /** * b is embed in a; c and d are embed in b. * * A.b.(c.(d&&e) && f.(g||h)) */ @Test public void testEmbed3() { } /** * * Manifest.versions.(approval[] || packages[].version[]) embed embed refer * embed */ @Test public void testEmbed4() { String query = "Manifest[@name=\"Dummy Manifest Bundle-0-0001\"]{*}." + "versions[@name=~\"Dummy ManifestVersion.*\"]{*}." + "(" + "approvals[@name=~\"Dummy.*\"]{*}.classOfService[@_oid=\"4fbd4ec123456123456a5d\"] " + "|| " + "packages[@_oid=\"4fbdaccec681643199735a60\"]{*}.versions[@name=~\"Dummy PackageVersion Bundle.*\"]{*}" + ")"; IQueryResult result = queryService.query(query, deployContext); Assert.assertEquals(1, result.getEntities().size()); Assert.assertTrue(result.getEntities().get(0).getFieldNames().size() > 2); } /** * * Manifest.versions.(approval[] || packages[].version[]) embed embed refer * embed */ @Test public void testEmbed5() { String query = "Manifest[@name=\"Dummy Manifest Bundle-0-0001\"]{*}." + "versions[@name=~\"Dummy ManifestVersion.*\"]." + "(" + "approvals[@name=~\"Dummy.*\"]{*}.classOfService[@_oid=\"4fbd4ec123456123456a5d\"] " + "|| " + "packages[@_oid=\"4fbdaccec681643199735a60\"]{*}.versions[@name=~\"Dummy PackageInvalid.*\"]{*}" + ")"; IQueryResult result = queryService.query(query, deployContext); Assert.assertEquals(1, result.getEntities().size()); Assert.assertTrue(result.getEntities().get(0).getFieldNames().size() > 2); } /** * * Manifest.versions.(approval[] || packages[].version[]) embed embed refer * embed */ @Test public void testEmbed5_reverseOrder() { String query = "Manifest[@name=\"Dummy Manifest Bundle-0-0001\"]{*}." + "versions[@name=~\"Dummy ManifestVersion.*\"]." + "(" + "packages[@_oid=\"4fbdaccec681643199735a60\"]{*}.versions[@name=~\"Dummy PackageInvalid.*\"]{*}" + "|| " + "approvals[@name=~\"Dummy.*\"]{*}.classOfService[@_oid=\"4fbd4ec123456123456a5d\"] " + ")"; IQueryResult result = queryService.query(query, deployContext); Assert.assertEquals(1, result.getEntities().size()); Assert.assertTrue(result.getEntities().get(0).getFieldNames().size() > 2); } /** * * Manifest.versions.(approval[] && packages[].version[]) embed embed refer * embed */ @Test public void testEmbed6() { String query = "Manifest[@name=\"Dummy Manifest Bundle-0-0001\"]{*}." + "versions[@name=~\"Dummy ManifestVersion.*\"]{*}." + "(" + "approvals[@name=~\"Dummy.*\"]{*}.classOfService[@_oid=\"4fbd4ec123456123456a5d\"] " + "&& " + "packages[@_oid=\"4fbdaccec681643199735a60\"]{*}.versions[@name=~\"Dummy PackageVersion Bundle.*\"]{*}" + ")"; IQueryResult result = queryService.query(query, deployContext); Assert.assertEquals(1, result.getEntities().size()); Assert.assertTrue(result.getEntities().get(0).getFieldNames().size() > 2); } /** * * Manifest.versions.(approval[] && packages[].version[]) embed embed refer * embed */ @Test public void testEmbed6_reverse() { String query = "Manifest[@name=\"Dummy Manifest Bundle-0-0001\"]{*}." + "versions[@name=~\"Dummy ManifestVersion.*\"]{*}." + "(" + "packages[@_oid=\"4fbdaccec681643199735a60\"]{*}.versions[@name=~\"Dummy PackageVersion Bundle.*\"]{*}" + "&& " + "approvals[@name=~\"Dummy.*\"]{*}.classOfService[@_oid=\"4fbd4ec123456123456a5d\"] " + ")"; IQueryResult result = queryService.query(query, deployContext); Assert.assertEquals(1, result.getEntities().size()); Assert.assertTrue(result.getEntities().get(0).getFieldNames().size() > 2); } /** * * Manifest.versions.(approval[] && packages[].version[]) embed embed refer * embed */ @Test public void testEmbed7() { String query = "Manifest[@name=\"Dummy Manifest Bundle-0-0001\"]{*}." + "versions[@name=~\"Dummy ManifestVersion.*\"]{*}." + "(" + "approvals[@name=~\"Dummy.*\"]{*}.classOfService[@_oid=\"4fbd4ec123456123456a5d\"] " + "&& " + "packages[@_oid=\"4fbdaccec681643199735a60\"]{*}.versions[@name=~\"Dummy PackageInvalid.*\"]{*}" + ")"; deployContext.setHint(-1); deployContext.setSkips(null); deployContext.setLimits(null); IQueryResult result = queryService.query(query, deployContext); Assert.assertEquals(0, result.getEntities().size()); } /** * * Manifest.versions.(approval[] && packages[].version[]) embed embed refer * embed */ @Test public void testEmbed7_reverse() { String query = "Manifest[@name=\"Dummy Manifest Bundle-0-0001\"]{*}." + "versions[@name=~\"Dummy ManifestVersion.*\"]{*}." + "(" + "packages[@_oid=\"4fbdaccec681643199735a60\"]{*}.versions[@name=~\"Dummy PackageInvalid.*\"]{*}" + "&& " + "approvals[@name=~\"Dummy.*\"]{*}.classOfService[@_oid=\"4fbd4ec123456123456a5d\"] " + ")"; deployContext.setHint(-1); deployContext.setSkips(null); deployContext.setLimits(null); IQueryResult result = queryService.query(query, deployContext); Assert.assertEquals(0, result.getEntities().size()); } @Test public void testEmbed08() { raptorContext.setAllowFullTableScan(true); String query = "Company{*}.department.(team{@name}.person{@name} && squad{@name}.human{@name})"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(1, result.getEntities().size()); } @Test public void testProject1() { raptorContext.setAllowFullTableScan(true); String query = "ApplicationService.(services[@name=~\"srp-app.*\"]{*} || updateStrategies{*})"; IQueryResult result = queryService.query(query, raptorContext); for (IEntity entity : result.getEntities()) { String type = entity.getType(); System.out.println(type); Assert.assertTrue(type.equals("ServiceInstance") || type.equals("UpdateStrategy")); Assert.assertTrue(entity.getFieldNames().size() > 2); } } /** * A.(b || c) */ @Test public void testProject2() { raptorContext.setAllowFullTableScan(true); String query = "ApplicationService.(services[@name=~\"srp-app.*\"] || updateStrategies{*})"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(4, result.getEntities().size()); for (IEntity entity : result.getEntities()) { Assert.assertEquals("UpdateStrategy", entity.getType()); Assert.assertTrue(entity.getFieldNames().size() > 2); } } /** * Test a missed projection in middle of the query path. * Cases are most the same as the testJoinInSet. */ @Test @SuppressWarnings("unchecked") public void testProject3() { raptorContext.setAllowFullTableScan(true); String query = "Environment{*}.applications.(services[@name=~\"srp-app.*\"]{*}.runsOn[@name=~\"compute.*\"] || updateStrategies{*})"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(1, result.getEntities().size()); Assert.assertEquals(1, result.getEntities().get(0).getFieldValues("applications").size()); IEntity entity = (IEntity) result.getEntities().get(0).getFieldValues("applications").get(0); List<IEntity> services = (List<IEntity>) entity.getFieldValues("services"); Assert.assertTrue(services.size() > 0); for (IEntity serv : services) { // service are projected more than just _oid and _type Assert.assertTrue(serv.getFieldNames().size() > 2); Assert.assertEquals("ServiceInstance", serv.getType()); } List<IEntity> strategies = (List<IEntity>) entity.getFieldValues("updateStrategies"); Assert.assertTrue(strategies.size() > 0); for (IEntity strategy : strategies) { // strategies are projected more than just _oid and _type Assert.assertTrue(strategy.getFieldNames().size() > 2); Assert.assertEquals("UpdateStrategy", strategy.getType()); } System.out.println(entity); } @Test public void testProject4() { raptorContext.setAllowFullTableScan(true); String query = "ApplicationService.(services[@name=~\"srp-appddbc.*\"]{*} || updateStrategies{*})"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(4, result.getEntities().size()); for (IEntity entity : result.getEntities()) { String type = entity.getType(); if ("UpdateStrategy".equals(type)) { Assert.assertTrue(entity.getFieldNames().size() > 2); } else { Assert.fail("projection test failure, expect ServiceInstance or UpdateStrategy only, but get " + type); } } } @Test public void testProject5() { raptorContext.setAllowFullTableScan(true); String query = "ApplicationService.(services[@name=\"srp-app:Raptor-00001\"]{*} || updateStrategies{*})"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(5, result.getEntities().size()); int serviceCount = 0; int strategyCount = 0; for (IEntity entity : result.getEntities()) { String type = entity.getType(); if ("ServiceInstance".equals(type)) { Assert.assertTrue(entity.getFieldNames().size() > 2); serviceCount++; } else if ("UpdateStrategy".equals(type)) { Assert.assertTrue(entity.getFieldNames().size() > 2); strategyCount ++; } else { Assert.fail("projection test failure, expect ServiceInstance or UpdateStrategy only, but get " + type); } } Assert.assertEquals(4, strategyCount); Assert.assertEquals(1, serviceCount); } /** * A.((b && c) || (d || e)) -- make sure not miss of the multiple reference fields */ @Test public void testProjection5() { } @Test public void testNoProject() { String query = "ApplicationService.(services[@name=~\"srp-app.*\"] && updateStrategies)"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(15, result.getEntities().size()); boolean hasStartegy = false; boolean hasService = false; for (IEntity entity : result.getEntities()) { Assert.assertTrue("UpdateStrategy".equals(entity.getType()) || "ServiceInstance".equals(entity.getType())); Assert.assertTrue(entity.getFieldNames().size() > 2); hasService |= "ServiceInstance".equals(entity.getType()); hasStartegy |= "UpdateStrategy".equals(entity.getType()); } Assert.assertTrue(hasStartegy && hasService); } // // /** // * A.(b && c) // */ // @Test // public void testPassThroughQuery1() { // String query = "ApplicationService.(services[@name=~\"srp-appdbc.*\"] && updateStrategies{*})"; // IQueryResult result = queryService.query(query, raptorContext); // Assert.assertEquals(0, result.getEntities().size()); // } // // @Test // public void testPassThroughQuery2() { // String query = "ApplicationService.(services[@name=~\"srp-app.*\"]{*} && updateStrategies{*})"; // IQueryResult result = queryService.query(query, raptorContext); // Assert.assertEquals(12, result.getEntities().size()); // } // // /** // * Test pass through in multiple level cases // * // * A.b.(c && d) // */ // @Test // public void testPassThroughQuery3() { // String query = "Environment{*}.applications.(services[@name=~\"srp-app.*\"]{*}.runsOn[@name=~\"compute.*\"] && updateStrategies{*})"; // IQueryResult result = queryService.query(query, raptorContext); // Assert.assertEquals(1, result.getEntities().size()); // } @Test public void testQueryPlan() { String query = "Environment{*}.applications.(services[@name=~\"srp-app.*\"]{*}.runsOn[@name=~\"compute.*\"] && updateStrategies{*})"; raptorContext.setExplain(true); IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(1, result.getEntities().size()); Assert.assertTrue(result.getExplanations().size() > 0); } @Test public void testDNSIntegeration() { String query = "DNS.(networkaddress[@_oid=\"testNetworkAddress1\"] && fqdn{*})"; IQueryResult result = queryService.query(query, stratusContext); Assert.assertEquals(1, result.getEntities().size()); Assert.assertEquals("FQDN", result.getEntities().get(0).getType()); } @Test public void testDNSIntegeration2() { String query = "DNS.(fqdn{*} && networkaddress[@_oid=\"testNetworkAddress2\"])"; IQueryResult result = queryService.query(query, stratusContext); Assert.assertEquals(2, result.getEntities().size()); for (IEntity entity :result.getEntities()) { Assert.assertEquals("FQDN", entity.getType()); } } /** * A.(b && c || d || e) */ @Test public void testMultipleSet01() { cmsdbContext.setAllowFullTableScan(false); String query ="LBVirtualIP[@resourceId=\"192.168.3.5:80\"]{*}." + "(networkAddress{@resourceId, @address} " + "&& poolMaps{*}.pool{*}." + " (lbService{*} || services{*}.lbMember{*}.(networkAddress{*})) " + "|| monitor{*} " + "|| lbService.networkAddress{@resourceId, @address})"; //String query = "LBVirtualIP[@resourceId=\"192.168.3.5:80\"]{*}.(networkAddress{@resourceId, @address} || poolMaps{*}.pool{*}.(lbService{*} || services{*}.lbMember{*}.(networkAddress{*} || monitors{@resourceId})) || pools{*}.(lbService || services{*}.lbMember{*}.(networkAddress{*} || monitors{@resourceId})) || lbService.networkAddress{@resourceId, @address})"; IQueryResult result = queryService.query(query, cmsdbContext); Assert.assertEquals(1, result.getEntities().size()); IEntity entity = result.getEntities().get(0); verifyLBVirtualIP(entity); } /** * A.(b || c.(d || e) || f) */ @Test public void testMultipleSet02() { String query = "LBVirtualIP[@resourceId=\"192.168.3.5:80\"]{*}." + "(networkAddress{@resourceId, @address} " + "|| poolMaps{*}.pool{*}.(lbService{*} || services{*}.lbMember{*}.(networkAddress{*} || monitors{@resourceId})) " + "|| monitor{*} " + "|| lbService.networkAddress{@resourceId, @address})"; IQueryResult result = queryService.query(query, cmsdbContext); Assert.assertEquals(1, result.getEntities().size()); IEntity entity = result.getEntities().get(0); verifyLBVirtualIP(entity); } /** * A.(b || (c || d) || e) */ @Test public void testMultipleSet03(){ String query = "LBVirtualIP[@resourceId=\"192.168.3.5:80\"]{*}." + "(networkAddress{@resourceId, @address} " + "|| (poolMaps{*}.pool{*}.(lbService{*} || services{*}.lbMember{*}.(networkAddress{*} || monitors{@resourceId}))) " + "|| lbService.networkAddress{@resourceId, @address})"; IQueryResult result = queryService.query(query, cmsdbContext); Assert.assertEquals(1, result.getEntities().size()); IEntity entity = result.getEntities().get(0); verifyLBVirtualIP(entity); } /** * A.(b || (c || d) || e) */ @Test public void testMultipleSet03_nega(){ String query = "LBVirtualIP[@resourceId=\"192.168.3.5:80\"]{*}." + "(networkAddress{@resourceId, @address} " + "|| (poolMaps{*}.pool{*}.(lbService{*} || services{*}.lbMember{*}.(networkAddress{*} || monitors{@resourceId}))) " + "|| lbService.networkAddress{@resourceId, @address})"; IQueryResult result = queryService.query(query, cmsdbContext); Assert.assertEquals(1, result.getEntities().size()); IEntity entity = result.getEntities().get(0); verifyLBVirtualIP(entity); } @SuppressWarnings("unchecked") private void verifyLBVirtualIP(IEntity entity) { Assert.assertEquals("LBVirtualIP", entity.getType()); IEntity net = (IEntity)entity.getFieldValues("networkAddress").get(0); List<String> resources = (List<String>) net.getFieldValues("resourceId"); Assert.assertEquals(resources.size(), 1); String resourceId = (String) resources.get(0); Assert.assertEquals("192.168.3.5", resourceId); List<String> addresses = (List<String>) net.getFieldValues("address"); Assert.assertEquals(addresses.size(), 1); String address = (String) addresses.get(0); Assert.assertEquals("192.168.3.5", address); List<IEntity> poolMaps = (List<IEntity>) entity.getFieldValues("poolMaps"); Assert.assertEquals(poolMaps.size(), 1); List<IEntity> pools = (List<IEntity>) poolMaps.get(0).getFieldValues("pool"); Assert.assertEquals(pools.size(), 1); List<IEntity> services = (List<IEntity>)pools.get(0).getFieldValues("services"); //Assert.assertEquals(services.size(), 1); List<IEntity> lbMembers = (List<IEntity>) services.get(0).getFieldValues("lbMember"); List<IEntity> networks = (List<IEntity>) lbMembers.get(0).getFieldValues("networkAddress"); resources = (List<String>) networks.get(0).getFieldValues("resourceId"); Assert.assertEquals(resources.size(), 1); resourceId = (String) resources.get(0); Assert.assertEquals("192.168.3.5", resourceId); addresses = (List<String>) networks.get(0).getFieldValues("address"); address = (String) addresses.get(0); Assert.assertEquals("192.168.3.5", address); } /** * A.((b && c) || d && e) */ @Test public void testMultipleSet04(){ cmsdbContext.setAllowFullTableScan(true); try { String query = "DNSRecord.((fqdn{*} && cname{*}) || fqdn{*} && networkAddress{*})"; IQueryResult result = queryService.query(query, cmsdbContext); Assert.assertEquals(4, result.getEntities().size()); } catch (QueryParseException qpe) { // } } @Ignore @Test public void testMultipleSet05(){ String query = "Environment.applications.(appService!ServiceInstance.runsOn && appService!ServiceInstance.runsOn{*})"; //String query = "Environment.applications.appService!ServiceInstance.runsOn{*}"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(9, result.getEntities().size()); for (IEntity entity : result.getEntities()) { Assert.assertTrue(entity.getFieldNames().size() > 2); } } /** * CMS-3486 */ @Ignore @Test public void testSet_dupPath() { String query = "Dep.team[@_oid =& Dep[@_oid=~\"dep00[01]\"].(team{@_oid} && team.person[@_oid=\"Dep!dep000!team!team010!person!person012\"])]{*}"; try { queryService.query(query, raptorContext); Assert.fail(); } catch (QueryParseException e) { // expected Assert.assertEquals(QueryErrCodeEnum.SYNTAX_ERROR.getErrorCode(), e.getErrorCode()); System.out.println(e.getMessage()); } } /** * CMS-3752 */ @Test public void testSet_dupPath_reverseSameName() { String query = "LBService[@resourceId=\"192.168.3.1\"]{*}.(lbService!LBVirtualIP{*} || lbService!LBPool{*}.services{*})"; IQueryResult result = queryService.query(query, cmsdbContext); Assert.assertEquals(1, result.getEntities().size()); IEntity iEntity = result.getEntities().get(0); Assert.assertTrue(iEntity.hasField("lbService!LBVirtualIP")); Assert.assertTrue(iEntity.hasField("lbService!LBPool")); } @Test public void testUnion_costOptimize() { raptorContext.setAllowFullTableScan(false); String query = "ApplicationService{*}.(services[@name=~\"srp-app.*\"]{*} || updateStrategies{*})"; try { queryService.query(query, raptorContext); Assert.fail(); } catch (QueryOptimizeException qoe) { // expected Assert.assertEquals(QueryErrCodeEnum.REJECT_FULL_TABLE_SCAN.getErrorCode(), qoe.getErrorCode()); } } @Test public void testUnion_costOptimize_1() { raptorContext.setAllowFullTableScan(false); MetaClass serviceMeta = raptorMetaService.getMetaClass("ServiceInstance"); MetaClass updateMeta = raptorMetaService.getMetaClass("UpdateStrategy"); try { // serviceMeta.setAllowFullTableScan(true); updateMeta.setAllowFullTableScan(true); String query = "ApplicationService{*}.(services{*} || updateStrategies{*})"; queryService.query(query, raptorContext); } finally { // restore setting serviceMeta.setAllowFullTableScan(false); updateMeta.setAllowFullTableScan(false); } } /* * A.(b || b) */ @Test @SuppressWarnings("unchecked") public void testSameSubPathUnion1() { raptorContext.setAllowFullTableScan(true); String query = "ApplicationService{*}.(services[@name=~\"srp-app:Raptor-00001\"]{*} || services[@name=~\"srp-app:Raptor-00002\"]{*})"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(2, result.getEntities().size()); IEntity entity = result.getEntities().get(0); List<IEntity> services = (List<IEntity>) entity.getFieldValues("services"); Assert.assertEquals(2, services.size()); for (IEntity serv : services) { // service are projected more than just _oid and _type Assert.assertTrue(serv.getFieldNames().size() > 2); Assert.assertEquals("ServiceInstance", serv.getType()); } } /* * A.(b && b) * no results */ @Test public void testSameSubPathUnion2() { raptorContext.setAllowFullTableScan(true); String query = "ApplicationService{*}.(services[@name=\"srp-app:Raptor-00001\"]{*} && services[@name=\"srp-app:Raptor-00011\"]{*})"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(0, result.getEntities().size()); } /* * A.(b && b) * Merged results */ @Test @SuppressWarnings("unchecked") public void testSameSubPathUnion3() { raptorContext.setAllowFullTableScan(true); String query = "ApplicationService{*}.(services[@https=true]{@name, @https, @healthStatus} && services[@healthStatus=\"down\"]{@activeManifestDiff, @https, @healthStatus})"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(1, result.getEntities().size()); IEntity entity = result.getEntities().get(0); List<IEntity> services = (List<IEntity>) entity.getFieldValues("services"); Assert.assertEquals(4, services.size()); for (IEntity serv : services) { Assert.assertEquals("ServiceInstance", serv.getType()); // service are projected more than just _oid and _type Assert.assertTrue(serv.getFieldNames().size() > 2); Boolean https = (Boolean)serv.getFieldValues("https").get(0); String health = (String)serv.getFieldValues("healthStatus").get(0); if (https) { Assert.assertNotNull(serv.getFieldValues("name").get(0)); } if (health.equals("down")) { Assert.assertNotNull(serv.getFieldValues("activeManifestDiff").get(0)); } } } /* * A.(b || b) */ @Test @SuppressWarnings("unchecked") public void testSameSubPathUnion4() { raptorContext.setAllowFullTableScan(true); String query = "ServiceInstance{*}.(runsOn[@assetStatus=\"unknown\"]{*} || runsOn[@name=\"compute-00002\"]{*})"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(1, result.getEntities().size()); IEntity entity = result.getEntities().get(0); List<IEntity> computes = (List<IEntity>) entity.getFieldValues("runsOn"); Assert.assertEquals(1, computes.size()); IEntity compute = computes.get(0); // service are projected more than just _oid and _type Assert.assertTrue(compute.getFieldNames().size() > 2); Assert.assertEquals("Compute", compute.getType()); } /* * A.(b || b && b) * Merged results */ @Test @SuppressWarnings("unchecked") public void testSameSubPathUnion5() { raptorContext.setAllowFullTableScan(true); String query = "ServiceInstance{*}.(runsOn[@location=~\"phx\"]{*} || runsOn[@location=\"pxc\"]{*} && runsOn[@assetStatus=\"deprecated\"]{*})"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(5, result.getEntities().size()); List<IEntity> serviceInstances = result.getEntities(); for (IEntity si : serviceInstances) { IEntity compute = ((List<IEntity>)si.getFieldValues("runsOn")).get(0); // service are projected more than just _oid and _type Assert.assertTrue(compute.getFieldNames().size() > 2); Assert.assertEquals("Compute", compute.getType()); String assetStatus = (String)compute.getFieldValues("assetStatus").get(0); String location = (String)compute.getFieldValues("location").get(0); if (location.equals("pxc")) { Assert.assertEquals("deprecated", assetStatus); } else { Assert.assertEquals("phx", location); } } } /* * A.(b && (b || b)) * Merged results */ @Test @SuppressWarnings("unchecked") public void testSameSubPathUnion10() { cmsdbContext.setAllowFullTableScan(true); String query = "NodeServer{@resourceId}.(capacities[@type=\"slot\" and @total=12]{@available,@type,@total} && (capacities[@type=\"cpu\" and @total=24]{@used,@type,@total} || capacities[@type=\"memory\" and @total=77298925568]{@used,@type,@available}))"; IQueryResult result = queryService.query(query, cmsdbContext); Assert.assertEquals(1, result.getEntities().size()); List<IEntity> capacities = (List<IEntity>) result.getEntities().get(0).getFieldValues("capacities"); Assert.assertEquals(3, capacities.size()); for (IEntity capa : capacities) { // service are projected more than just _oid and _type Assert.assertTrue(capa.getFieldNames().size() > 2); Assert.assertEquals("ResourceCapacity", capa.getType()); } } /* * A.((b || b) && (b && b)) * Merged results */ @Test @SuppressWarnings("unchecked") public void testSameSubPathUnion6() { raptorContext.setAllowFullTableScan(true); String query = "ServiceInstance{*}.((runsOn[@location=~\"phx\"]{*} || runsOn[@location=\"pxc\"]{*}) && (runsOn[@assetStatus=\"deprecated\"]{*} && runsOn[@label=\"laptop\"]{*}))"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(3, result.getEntities().size()); List<IEntity> serviceInstances = result.getEntities(); for (IEntity si : serviceInstances) { IEntity compute = ((List<IEntity>)si.getFieldValues("runsOn")).get(0); // service are projected more than just _oid and _type Assert.assertTrue(compute.getFieldNames().size() > 2); Assert.assertEquals("Compute", compute.getType()); String label = (String)compute.getFieldValues("label").get(0); String assetStatus = (String)compute.getFieldValues("assetStatus").get(0); String location = (String)compute.getFieldValues("location").get(0); Assert.assertEquals("laptop", label); Assert.assertEquals("deprecated", assetStatus); Assert.assertTrue("pxc".equals(location) || "phx".equals(location)); } } /* * A.(b && b || b.(c && c || c))) * Merged results */ @Test @SuppressWarnings("unchecked") public void testSameSubPathUnion11() { raptorContext.setAllowFullTableScan(true); raptorContext.setHint(-1); String query = "Dep{@label}.(team[@_oid=~\"Dep!dep.*!team!team010$\"]{@_oid}.person[@_oid=~\".*person012$\"]{@_oid} && team[@_oid=~\"Dep!dep.*!team!team[023][12]0$\"]{@_oid}.person[@_oid=~\".*person021$\"]{@name} || team[@_oid=~\"Dep!dep.*!team!team[02][12]0$\"]{@name}.(person[@_oid=~ \".*person!person[0123][12][12]$\"]{@address} && person[@_oid=~ \".*person!person.*11$\"]{@age} || person[@_oid=~ \".*person!person012$\"]{@name}))"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(2, result.getEntities().size()); int teamSize = 0; int personSize = 0; for (IEntity dep : result.getEntities()) { List<IEntity> teams = (List<IEntity>) dep.getFieldValues("team"); teamSize += teams.size(); for (IEntity team : teams) { List<IEntity> persons = (List<IEntity>) team.getFieldValues("person"); personSize += persons.size(); } } Assert.assertEquals(3, teamSize); Assert.assertEquals(4, personSize); } @Test @SuppressWarnings("unchecked") public void testSameSubPathEmbedUnion1() { cmsdbContext.setAllowFullTableScan(true); String query = "AssetServer[@type=\"bm\" and @healthState=~\"healthy\"].(nodeServer[@nodeType=\"vmm\" ]{@resourceId}.capacities[@type=\"slot\" and @available=0]{@used,@type} && nodeServer[@nodeType=\"vmm\" ]{@resourceId}.capacities[@type=\"cpu\" and @available>0]{@used,@available})"; IQueryResult result = queryService.query(query, cmsdbContext); Assert.assertEquals(1, result.getEntities().size()); IEntity entity = result.getEntities().get(0); List<IEntity> capacities = (List<IEntity>) entity.getFieldValues("capacities"); Assert.assertEquals(2, capacities.size()); IEntity capacity1 = capacities.get(0); Assert.assertEquals("slot", capacity1.getFieldValues("type").get(0)); Long available1 = (Long)capacity1.getFieldValues("used").get(0); Assert.assertEquals(12, available1.longValue()); IEntity capacity2 = capacities.get(1); Assert.assertEquals("cpu", capacity2.getFieldValues("type").get(0)); Long available2 = (Long)capacity2.getFieldValues("available").get(0); Assert.assertEquals(23, available2.longValue()); } @Test public void testSameSubPathEmbedUnion2() { cmsdbContext.setAllowFullTableScan(true); String query = "NodeServer[@nodeType=\"vmm\"]{@resourceId}.(capacities[@type=\"slot\" and @available=0]{@used,@type} && capacities[@type=\"cpu\" and @available=0]{@used,@available})"; IQueryResult result = queryService.query(query, cmsdbContext); Assert.assertEquals(0, result.getEntities().size()); } @Test @SuppressWarnings("unchecked") public void testSameSubPathEmbedUnion3() { cmsdbContext.setAllowFullTableScan(true); String query = "NodeServer[@nodeType=\"vmm\"]{*}.(capacities[@type=\"slot\"]{*} || capacities[@type=\"cpu\"]{*})"; IQueryResult result = queryService.query(query, cmsdbContext); Assert.assertEquals(1, result.getEntities().size()); IEntity entity = result.getEntities().get(0); List<IEntity> capacities = (List<IEntity>) entity.getFieldValues("capacities"); Assert.assertEquals(2, capacities.size()); IEntity capacity1 = capacities.get(0); Assert.assertEquals("slot", capacity1.getFieldValues("type").get(0)); Long available1 = (Long)capacity1.getFieldValues("used").get(0); Assert.assertEquals(12, available1.longValue()); IEntity capacity2 = capacities.get(1); Assert.assertEquals("cpu", capacity2.getFieldValues("type").get(0)); Long available2 = (Long)capacity2.getFieldValues("available").get(0); Assert.assertEquals(23, available2.longValue()); } /** * A || A */ @Test public void testRootLevelUnion1() { raptorContext.setAllowFullTableScan(true); String query = "Compute[@name=\"compute-00001\"]{@label} || Compute[@assetStatus=\"normal\"]{@name}"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(5, result.getEntities().size()); for (IEntity comp : result.getEntities()) { Assert.assertTrue(comp.getFieldNames().size() > 2); Assert.assertEquals("Compute", comp.getType()); String name = (String)comp.getFieldValues("name").get(0); if (name.equals("compute-00001")) { Assert.assertEquals(1, comp.getFieldValues("label").size()); } } } /** * A.c || A.c */ @Test public void testRootLevelUnion2() { raptorContext.setAllowFullTableScan(true); String query = "ServiceInstance[@name=\"srp-app:Raptor-00010\"].runsOn{@name,@location,@assetStatus} || ServiceInstance.runsOn[@location=\"pxc\"]{@name,@location,@label}"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(4, result.getEntities().size()); for (IEntity comp : result.getEntities()) { Assert.assertTrue(comp.getFieldNames().size() > 2); Assert.assertEquals("Compute", comp.getType()); String name = (String)comp.getFieldValues("name").get(0); if (name.equals("srp-app:Raptor-00010")) { Assert.assertNotNull(comp.getFieldValues("assetStatus").get(0)); } String location = (String)comp.getFieldValues("location").get(0); if (location.equals("pxc")) { Assert.assertNotNull(comp.getFieldValues("label").get(0)); } } } /** * A.c || B.c */ @Test public void testRootLevelUnion3() { raptorContext.setAllowFullTableScan(true); String query = "ServiceInstance[@name=\"srp-app:Raptor-00002\"].runsOn || Cluster[@name=\"cluster-00001\"].computes"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(6, result.getEntities().size()); for (IEntity comp : result.getEntities()) { Assert.assertTrue(comp.getFieldNames().size() > 2); Assert.assertEquals("Compute", comp.getType()); } } /** * A.c && B.c */ @Test public void testRootLevelIntersection01() { raptorContext.setAllowFullTableScan(true); String query = "ServiceInstance[@name=\"srp-app:Raptor-00002\"].runsOn && Cluster[@name=\"cluster-00001\"].computes"; try { queryService.query(query, raptorContext); Assert.fail(); } catch (QueryParseException e) { Assert.assertEquals(QueryErrCodeEnum.INTERSECTION_ON_DIFFERENT_ROOT_METACLASS.getErrorCode(), e.getErrorCode()); } } /** * A.c && A.c */ @Test public void testRootLevelIntersection02() { raptorContext.setAllowFullTableScan(true); String query = "ServiceInstance[@name=\"srp-app:Raptor-00010\"].runsOn{@name,@location,@assetStatus} && ServiceInstance.runsOn[@location=\"pxc\"]{@name,@location,@label}"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(1, result.getEntities().size()); for (IEntity comp : result.getEntities()) { Assert.assertTrue(comp.getFieldNames().size() > 2); Assert.assertEquals("Compute", comp.getType()); Assert.assertNotNull(comp.getFieldValues("name").get(0)); Assert.assertNotNull(comp.getFieldValues("location").get(0)); Assert.assertNotNull(comp.getFieldValues("label").get(0)); Assert.assertNotNull(comp.getFieldValues("assetStatus").get(0)); } } @Test public void testRootLevelSetAggregation() { raptorContext.setAllowFullTableScan(true); String query = "ServiceInstance<@https, @activeManifestDiff>{ @https, $max(@port)} || ServiceInstance[@name=\"srp-app:Raptor-00002\"]"; try { queryService.query(query, raptorContext); Assert.fail(); } catch (QueryParseException e) { Assert.assertEquals(QueryErrCodeEnum.ROOT_LEVEL_JOIN_WITH_AGG.getErrorCode(), e.getErrorCode()); } } @Test public void testEmbedSameUnionPath() { raptorContext.setAllowFullTableScan(true); raptorContext.setHint(-1); String query = "Dep[@_oid=\"dep000\"]{@_oid}.(team[@_oid=\"Dep!dep000!team!team010\"].person[@_oid=\"Dep!dep000!team!team010!person!person011\"] && team[@_oid=\"Dep!dep000!team!team010\"].person[@_oid=\"Dep!dep000!team!team010!person!person012\"])"; IQueryResult result = queryService.query(query, raptorContext); Assert.assertEquals(1, result.getEntities().size()); } @Test public void testSameCostSubSet01() { QueryContext context = newQueryContext(CMSDB_REPO, RAPTOR_MAIN_BRANCH_ID); context.setSmallTableThreshold(0); context.setAllowFullTableScan(true); context.setHint(-1); context.setExplain(true); String query = "DNSRecord.(fqdn[@resourceId=~\".*\"] && networkAddress{@address,@resourceId})"; IQueryResult result = queryService.query(query, context); Assert.assertEquals(1, result.getEntities().size()); List<IQueryExplanation> explains = result.getExplanations(); ObjectNode objectNode = (ObjectNode) explains.get(0).getJsonExplanation(); String queryType0 = objectNode.get("criteria").get("$and").get(0).get("_t").getTextValue(); Assert.assertTrue(queryType0.equals("FQDN")); objectNode = (ObjectNode) explains.get(1).getJsonExplanation(); String queryType1 = objectNode.get("criteria").get("$and").get(0).get("_t").getTextValue(); Assert.assertTrue(queryType1.equals("DNSRecord")); objectNode = (ObjectNode) explains.get(2).getJsonExplanation(); String queryType2 = objectNode.get("criteria").get("$and").get(0).get("_t").getTextValue(); Assert.assertTrue(queryType2.equals("NetworkAddress")); } @Test public void testSameCostSubSet02() { QueryContext context = newQueryContext(STRATUS_REPO, RAPTOR_MAIN_BRANCH_ID); context.setSmallTableThreshold(0); context.setAllowFullTableScan(true); context.setHint(-1); context.setExplain(true); String query = "Compute{*}.(<VPool>parentCluster && activeManifestRef && activeManifestCur[@_oid=~\"B.*\")"; IQueryResult result = queryService.query(query, context); Assert.assertEquals(1, result.getEntities().size()); List<IQueryExplanation> explains = result.getExplanations(); ObjectNode objectNode = (ObjectNode) explains.get(0).getJsonExplanation(); String queryType0 = objectNode.get("criteria").get("$and").get(0).get("_t").getTextValue(); Assert.assertEquals("Manifest", queryType0); String queryReg = objectNode.get("criteria").get("$and").get(2).get("_i").get("$regex").get("$regex").getTextValue(); Assert.assertEquals("B.*", queryReg); objectNode = (ObjectNode) explains.get(1).getJsonExplanation(); String queryType1 = objectNode.get("criteria").get("$and").get(0).get("_t").getTextValue(); Assert.assertEquals("Compute", queryType1); objectNode = (ObjectNode) explains.get(2).getJsonExplanation(); String queryType2 = objectNode.get("criteria").get("$and").get(0).get("_t").getTextValue(); Assert.assertEquals("VPool", queryType2); objectNode = (ObjectNode) explains.get(3).getJsonExplanation(); String queryType3 = objectNode.get("criteria").get("$and").get(0).get("_t").getTextValue(); Assert.assertEquals("Manifest", queryType3); } }