/*
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 junit.framework.Assert;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.node.ArrayNode;
import org.junit.Test;
import com.ebay.cloud.cms.dal.entity.IEntity;
import com.ebay.cloud.cms.dal.entity.JsonEntity;
import com.ebay.cloud.cms.entmgr.branch.IBranch;
import com.ebay.cloud.cms.entmgr.entity.EntityContext;
import com.ebay.cloud.cms.entmgr.utils.RegistrationUtils;
import com.ebay.cloud.cms.metadata.model.MetaClass;
import com.ebay.cloud.cms.metadata.model.MetaField;
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.util.TestUtils;
/**
* Sepearated test class that focus on embed related cases.
*
* @author liasu
*
*/
public class EmbedQueryServiceTest extends MongoBaseTest {
@Test
public void integerNot() {
IQueryResult result = null;
// case 1
String query = "NodeServer.capacities[@resourceId=\"1001.7.2.57:slot\" and not @total != -2]";
result = queryService.query(query, cmsdbContext);
Assert.assertEquals(0, result.getEntities().size());
// case 2
String notQuery = "NodeServer.capacities[@resourceId=\"1001.7.2.57:slot\" and not @total != 2 ]";
result = queryService.query(notQuery, cmsdbContext);
Assert.assertEquals(1, result.getEntities().size());
}
/**
* CMS-4623
*/
@Test
public void integerEq() {
IQueryResult result = null;
raptorContext.setAllowFullTableScan(true);
String query = "AllowFullTableScanParentTest.embed[@number = 1]";
result = queryService.query(query, raptorContext);
Assert.assertEquals(1, result.getEntities().size());
}
protected static EntityContext newEntityContext() {
EntityContext context = new EntityContext();
context.setSourceIp("127.0.0.1");
context.setModifier("unitTestUser");
context.setRegistration(RegistrationUtils.getDefaultDalImplementation(dataSource));
context.setFetchFieldProperty(true);
context.setDbConfig(dbConfig);
return context;
}
@Test
public void decimalNegative() {
String decimalQuery = null;
IQueryResult result = null;
MetaClass exprClass = raptorMetaService.getMetaClass("ExpressionTest");
JsonEntity exprEntity = new JsonEntity(exprClass);
exprEntity.setBranchId(IBranch.DEFAULT_BRANCH);
exprEntity.addFieldValue("name", "expression-test");
exprEntity.addFieldValue("i", 3);
exprEntity.addFieldValue("i1", 3);
exprEntity.addFieldValue("d1", 1.0);
exprEntity.addFieldValue("d", 3.0);
EntityContext context = newEntityContext();
context.setRegistration(TestUtils.getDefaultDalImplementation(dataSource));
entityService.create(exprEntity, context);
raptorContext.setAllowFullTableScan(true);
// case 3
decimalQuery = "ExpressionTest[@d > 2.1 ]";
result = queryService.query(decimalQuery, raptorContext);
Assert.assertEquals(1, result.getEntities().size());
decimalQuery = "ExpressionTest[not @d > 2.1 ]";
result = queryService.query(decimalQuery, raptorContext);
Assert.assertEquals(0, result.getEntities().size());
// case 4
decimalQuery = "ExpressionTest[@d1 > -2.1 ]";
result = queryService.query(decimalQuery, raptorContext);
Assert.assertEquals(1, result.getEntities().size());
decimalQuery = "ExpressionTest[not @d1 < -2.1 ]";
result = queryService.query(decimalQuery, raptorContext);
Assert.assertEquals(1, result.getEntities().size());
}
@Test
public void testQuery_filter() {
raptorContext.setAllowFullTableScan(true);
String queryString = "Dep.team[@name=\"dev-team-020\"]{@label, @isLargeTeam}";
IQueryResult result = queryService.query(queryString, raptorContext);
List<IEntity> entities = result.getEntities();
Assert.assertNotNull(entities);
IEntity entity = entities.get(0);
Assert.assertEquals(4, entity.getFieldNames().size());
Assert.assertFalse(entity.getFieldNames().contains("name"));
}
@Test
public void testQuery_embedSet() {
raptorContext.setAllowFullTableScan(false);
String query = "AllowFullTableScanParentTest.(embed && embed2)";
try {
queryService.query(query, raptorContext);
Assert.fail();
} catch (QueryOptimizeException qoe) {
// expected
Assert.assertEquals(
QueryErrCodeEnum.REJECT_FULL_TABLE_SCAN.getErrorCode(),
qoe.getErrorCode());
}
}
@Test
public void testQuery_embedSet2() {
raptorContext.setAllowFullTableScan(false);
String query = "AllowFullTableScanParentTest.(embed || embed2)";
try {
queryService.query(query, raptorContext);
Assert.fail();
} catch (QueryOptimizeException qoe) {
// expected
Assert.assertEquals(
QueryErrCodeEnum.REJECT_FULL_TABLE_SCAN.getErrorCode(),
qoe.getErrorCode());
}
}
/**
* CMS-3721
*/
@Test
public void testQuery_embedSet3() {
raptorContext.setAllowFullTableScan(true);
String query = "AllowFullTableScanParentTest.(embed && embed2)";
IQueryResult result = queryService.query(query, raptorContext);
}
/**
* CMS-3721
*/
@Test
public void testQuery_embedSet4() {
raptorContext.setAllowFullTableScan(true);
String query = "AllowFullTableScanParentTest.(embed || embed2)";
IQueryResult result = queryService.query(query, raptorContext);
}
/**
* CMS-3767
*/
@Test
public void testQuery_embedSet5() {
cmsdbContext.setAllowFullTableScan(true);
String query = "LBService.(capacities && runsOn.nodeServer!AssetServer.networkControllers.port.networkPorts!Vlan.subnets)";
IQueryResult result = queryService.query(query, cmsdbContext);
}
/**
* CMS-4108
*/
@Test
public void embedSet_hint() {
String query = "AssetServer{@resourceId}.(configuredTo[@resourceId=~\"P1G2\"] && networkControllers.port)";
QueryContext context = new QueryContext(CMSDB_REPO,
IBranch.DEFAULT_BRANCH);
context.setDbConfig(cmsdbContext.getDbConfig());
context.setAllowFullTableScan(true);
context.getCursor().setHint(1);
context.setRegistration(TestUtils.getDefaultDalImplementation(dataSource));
IQueryResult result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
}
@Test
public void embedSet_nohint() {
String query = "AssetServer{*}.(configuredTo[@resourceId=~\"^P1G2\"/s] && networkControllers.port)";
QueryContext context = new QueryContext(CMSDB_REPO,
IBranch.DEFAULT_BRANCH);
context.setDbConfig(cmsdbContext.getDbConfig());
context.setAllowFullTableScan(false);
context.setExplain(true);
context.setRegistration(TestUtils.getDefaultDalImplementation(dataSource));
IQueryResult result = null;
// no hint
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
// hint = 0
context.getCursor().setHint(0);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
// hint = 1
context.getCursor().setHint(1);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("SkuConfiguration", getFirstExecutedMetaClass(result));
// hint = 2
context.getCursor().setHint(2);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass1(result));
// hint = 3
context.getCursor().setHint(3);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("NetworkPort", getFirstExecutedMetaClass(result));
}
/**
* CMS-4108
*/
@Test
public void embedHint() {
String query = "AssetServer[@_creator=\"CloudMgr\" or @resourceOwner=\"CloudMgr\"].networkControllers{@resourceId}.port{@resourceId}";
QueryContext context = new QueryContext(CMSDB_REPO,
IBranch.DEFAULT_BRANCH);
context.setDbConfig(cmsdbContext.getDbConfig());
context.setAllowFullTableScan(true);
context.setExplain(true);
context.setRegistration(TestUtils.getDefaultDalImplementation(dataSource));
IQueryResult result = null;
result = queryService.query(query, context);
Assert.assertEquals(2, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass(result));
// hint = 0
context.getCursor().setHint(0);
result = queryService.query(query, context);
Assert.assertEquals(2, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass(result));
// hint = 1
context.getCursor().setHint(1);
result = queryService.query(query, context);
Assert.assertEquals(2, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass(result));
// hint = 2
context.getCursor().setHint(2);
result = queryService.query(query, context);
Assert.assertEquals(2, result.getEntities().size());
Assert.assertEquals("NetworkPort", getFirstExecutedMetaClass(result));
// hint = 3
context.getCursor().setHint(3);
result = queryService.query(query, context);
Assert.assertEquals(2, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass(result));
}
String getFirstExecutedMetaClass(IQueryResult result) {
return result.getExplanations().get(0).getJsonExplanation()
.get("criteria").get("$and").get(0).get("_t").getTextValue();
}
@Test
public void embedSetHint_criteriaOnNonEmbed() {
String query = "AssetServer.networkControllers.port.networkPorts!Vlan.subnets[@_oid=\"51afafe9e4b01696e74867fc\"]{@resourceId}";
QueryContext context = new QueryContext(CMSDB_REPO,
IBranch.DEFAULT_BRANCH);
context.setDbConfig(cmsdbContext.getDbConfig());
context.setAllowFullTableScan(false);
context.setExplain(true);
context.setRegistration(TestUtils.getDefaultDalImplementation(dataSource));
IQueryResult result = null;
// no hint
result = queryService.query(query, context);
Assert.assertEquals(2, result.getEntities().size());
Assert.assertEquals("Subnet", getFirstExecutedMetaClass(result));
// hint = 0
context.setHint(0);
result = queryService.query(query, context);
Assert.assertEquals(2, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass(result));
// hint = 1
context.setHint(1);
result = queryService.query(query, context);
Assert.assertEquals(2, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass(result));
// hint = 2
context.setHint(2);
result = queryService.query(query, context);
Assert.assertEquals(2, result.getEntities().size());
Assert.assertEquals("NetworkPort", getFirstExecutedMetaClass(result));
// hint = 3
context.setHint(3);
result = queryService.query(query, context);
Assert.assertEquals(2, result.getEntities().size());
Assert.assertEquals("Vlan", getFirstExecutedMetaClass(result));
// hint = 4
context.setHint(4);
result = queryService.query(query, context);
Assert.assertEquals(2, result.getEntities().size());
Assert.assertEquals("Subnet", getFirstExecutedMetaClass(result));
}
/**
* A.(embed_b.ref1 && ref2.embed_c) with hint=3
*/
@Test
public void testEmbedSet_tail() {
String query = "Manifest{*}."
+ "versions{*}."
+ "("
+ "approvals[@name=~\"Dummy.*\"]{*}.classOfService[@_oid=\"4fbd4ec123456123456a5d\"] "
+ "&& "
+ "packages[@_oid=\"4fbdaccec681643199735a60\"]{*}.versions[@name=~\"Dummy PackageVersion Bundle.*\"]{*}"
+ ")";
QueryContext context = new QueryContext(DEPLOY_REPO,
IBranch.DEFAULT_BRANCH);
context.setDbConfig(deployContext.getDbConfig());
context.setAllowFullTableScan(false);
context.setRegistration(TestUtils.getDefaultDalImplementation(dataSource));
context.setExplain(true);
IQueryResult result = null;
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
context.setHint(0);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("Manifest", getFirstExecutedMetaClass1(result));
context.setHint(1);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("Manifest", getFirstExecutedMetaClass1(result));
context.setHint(2);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("Manifest", getFirstExecutedMetaClass1(result));
context.setHint(3);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("DeployClassOfService", getFirstExecutedMetaClass(result));
context.setHint(4);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("Package", getFirstExecutedMetaClass1(result));
context.setHint(5);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("Package", getFirstExecutedMetaClass1(result));
}
/**
* A.(embed_b.ref1 && ref2.embed_c) with hint=3
*/
@Test
public void testEmbedSet_tail02() {
String query = "Manifest{*}."
+ "versions{*}."
+ "("
+ "packages[@_oid=\"4fbdaccec681643199735a60\"]{*}.versions[@name=~\"Dummy PackageVersion Bundle.*\"]{*}"
+ "&& "
+ "approvals[@name=~\"Dummy.*\"]{*}.classOfService[@_oid=\"4fbd4ec123456123456a5d\"] "
+ ")";
QueryContext context = new QueryContext(DEPLOY_REPO,
IBranch.DEFAULT_BRANCH);
context.setDbConfig(deployContext.getDbConfig());
context.setAllowFullTableScan(false);
context.setRegistration(TestUtils.getDefaultDalImplementation(dataSource));
context.setExplain(true);
IQueryResult result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
context.setHint(0);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("Manifest", getFirstExecutedMetaClass1(result));
context.setHint(1);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("Manifest", getFirstExecutedMetaClass1(result));
context.setHint(2);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("Package", getFirstExecutedMetaClass1(result));
context.setHint(3);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("Package", getFirstExecutedMetaClass1(result));
context.setHint(4);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("Manifest", getFirstExecutedMetaClass1(result));
context.setHint(5);
result = queryService.query(query, context);
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("DeployClassOfService", getFirstExecutedMetaClass(result));
}
/*
* A.(b && (b || b)) Merged results
*/
@Test
@SuppressWarnings("unchecked")
public void testRefEmbed00() {
cmsdbContext.setAllowFullTableScan(true);
cmsdbContext.setExplain(true);
String query = "NodeServer{@resourceId}.(networkAddress[@_oid=\"51f9766f171b7e36601ac23c\"]{@resourceId} && capacities{@available})";
IQueryResult result = queryService.query(query, cmsdbContext);
Assert.assertEquals(1, result.getEntities().size());
getExecutedMetaClass(result, cmsdbContext);
List<IEntity> capacities = (List<IEntity>) result.getEntities().get(0)
.getFieldValues("capacities");
Assert.assertEquals(1, 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());
}
}
private void getExecutedMetaClass(IQueryResult result, QueryContext cmsdbContext) {
MetaClass mc = cmsdbMetaService.getMetaClass("NodeServer");
MetaField field = mc.getFieldByName("networkAddress");
ArrayNode andNodes = (ArrayNode) result.getExplanations().get(1)
.getJsonExplanation().get("criteria").get("$and");
boolean hasId = false;
// FIXME: flatten will have different explanation
if (cmsdbContext.getRegistration().registrationId.equals("hierarchy")) {
JsonNode node = andNodes.get(1).get("$and").get(0).get("$and").get(1);
hasId |= node.has(field.getValueDbName() + "._i");
Assert.assertTrue(hasId);
}
}
private String getFirstExecutedMetaClass1(IQueryResult result) {
return result.getExplanations().get(0).getJsonExplanation()
.get("criteria").get("$and").get(0).get("$and").get(0)
.get("_t").getTextValue();
}
/*
* A.b.(c && d)
*/
@Test
public void testRefEmbed01() {
QueryContext context = new QueryContext(CMSDB_REPO,
IBranch.DEFAULT_BRANCH);
context.setDbConfig(deployContext.getDbConfig());
context.setAllowFullTableScan(false);
context.setExplain(true);
context.setRegistration(TestUtils.getDefaultDalImplementation(dataSource));
String query = "AssetServer{@resourceId}.managementServer.(networkAddress[@_oid=\"51f97481171b7e36601aa781\"]{@resourceId} && capacities{@available})";
// no hint
IQueryResult result = queryService.query(query, context);
Assert.assertEquals(5, result.getEntities().size());
Assert.assertEquals("NetworkAddress", getFirstExecutedMetaClass(result));
// hint = 0
context.setHint(0);
result = queryService.query(query, context);
Assert.assertEquals(5, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass(result));
// hint = 1
context.setHint(1);
result = queryService.query(query, context);
Assert.assertEquals(5, result.getEntities().size());
Assert.assertEquals("NodeServer", getFirstExecutedMetaClass1(result));
// hint = 2
context.setHint(2);
result = queryService.query(query, context);
Assert.assertEquals(5, result.getEntities().size());
Assert.assertEquals("NetworkAddress", getFirstExecutedMetaClass(result));
// hint = 3
context.setHint(3);
result = queryService.query(query, context);
Assert.assertEquals(5, result.getEntities().size());
Assert.assertEquals("NodeServer", getFirstExecutedMetaClass1(result));
}
/*
* A.b.(c || d)
*/
@Test
public void testRefEmbed02() {
QueryContext context = new QueryContext(CMSDB_REPO,
IBranch.DEFAULT_BRANCH);
context.setDbConfig(deployContext.getDbConfig());
context.setAllowFullTableScan(true);
context.setExplain(true);
context.setRegistration(TestUtils.getDefaultDalImplementation(dataSource));
String query = "AssetServer.managementServer{@_oid}.(networkAddress{@resourceId} || capacities[@_oid=\"NodeServer!51f97481171b7e36601aa785!capacities!5216e063171bd2d7a58c67d5\"]{@available})";
IQueryResult result = null;
// no hint
result = queryService.query(query, context);
Assert.assertEquals(6, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass(result));
// hint = 0
context.setHint(0);
result = queryService.query(query, context);
Assert.assertEquals(6, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass(result));
// hint = 1
context.setHint(1);
result = queryService.query(query, context);
Assert.assertEquals(6, result.getEntities().size());
Assert.assertEquals("NodeServer", getFirstExecutedMetaClass1(result));
// hint = 2
context.setHint(2);
result = queryService.query(query, context);
Assert.assertEquals(6, result.getEntities().size());
Assert.assertEquals("NetworkAddress", getFirstExecutedMetaClass(result));
// hint = 3
context.setHint(3);
result = queryService.query(query, context);
Assert.assertEquals(6, result.getEntities().size());
Assert.assertEquals("NodeServer", getFirstExecutedMetaClass1(result));
}
@Test
public void testRefEmbed03() {
QueryContext context = new QueryContext(CMSDB_REPO,
IBranch.DEFAULT_BRANCH);
context.setDbConfig(deployContext.getDbConfig());
context.setAllowFullTableScan(false);
context.setExplain(true);
context.setRegistration(TestUtils.getDefaultDalImplementation(dataSource));
String query = "AssetServer.(networkControllers[@resourceId=\"005056B603F8\"]{@resourceOwner} && managementServer.(networkAddress && capacities{@available}))";
// no hint
IQueryResult result = queryService.query(query, context);
Assert.assertEquals(3, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass1(result));
// hint = 0
context.setHint(0);
result = queryService.query(query, context);
Assert.assertEquals(3, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass1(result));
// hint = 1
context.setHint(1);
result = queryService.query(query, context);
Assert.assertEquals(3, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass1(result));
// hint = 2
context.setHint(2);
result = queryService.query(query, context);
Assert.assertEquals(3, result.getEntities().size());
Assert.assertEquals("NodeServer", getFirstExecutedMetaClass1(result));
// hint = 3
context.setHint(3);
result = queryService.query(query, context);
Assert.assertEquals(3, result.getEntities().size());
Assert.assertEquals("NetworkAddress", getFirstExecutedMetaClass(result));
// hint = 4
context.setHint(4);
result = queryService.query(query, context);
Assert.assertEquals(3, result.getEntities().size());
Assert.assertEquals("NodeServer", getFirstExecutedMetaClass1(result));
}
@Test
public void testRefEmbed04() {
QueryContext context = new QueryContext(CMSDB_REPO,
IBranch.DEFAULT_BRANCH);
context.setDbConfig(deployContext.getDbConfig());
context.setAllowFullTableScan(true);
context.setExplain(true);
context.setRegistration(TestUtils.getDefaultDalImplementation(dataSource));
String query = "AssetServer.(networkControllers[@resourceId=\"005056B603F8\"]{@resourceOwner} || managementServer.(networkAddress || capacities{@available}))";
// no hint
IQueryResult result = queryService.query(query, context);
Assert.assertEquals(18, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass1(result));
// hint = 0
context.setHint(0);
result = queryService.query(query, context);
Assert.assertEquals(18, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass1(result));
// hint = 1
context.setHint(1);
result = queryService.query(query, context);
Assert.assertEquals(18, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass1(result));
// hint = 2
context.setHint(2);
result = queryService.query(query, context);
Assert.assertEquals(18, result.getEntities().size());
Assert.assertEquals("NodeServer", getFirstExecutedMetaClass1(result));
// hint = 3
context.setHint(3);
result = queryService.query(query, context);
Assert.assertEquals(18, result.getEntities().size());
Assert.assertEquals("NetworkAddress", getFirstExecutedMetaClass(result));
// hint = 4
context.setHint(4);
result = queryService.query(query, context);
Assert.assertEquals(18, result.getEntities().size());
Assert.assertEquals("NodeServer", getFirstExecutedMetaClass1(result));
}
/*
* A.b.(c && d)
* CMS-4226
*/
@Test
public void testRefEmbed05() {
QueryContext context = new QueryContext(CMSDB_REPO, IBranch.DEFAULT_BRANCH);
context.setDbConfig(deployContext.getDbConfig());
context.setAllowFullTableScan(false);
context.setExplain(true);
context.setRegistration(TestUtils.getDefaultDalImplementation(dataSource));
String query = "AssetServer[@resourceId=\"Uuid-564D07D6-7C82-9CEC-7028-364219411198\"]{@resourceId}.managementServer.capacities{@available}";
context.getCursor().setLimits(new int[] { 1, 1, 1 });
IQueryResult result = queryService.query(query, context);
Assert.assertFalse(result.hasMoreResults());
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass(result));
Assert.assertEquals("NodeServer",
result.getExplanations().get(1).getJsonExplanation().get("criteria").get("$and").get(0).get("_t").getTextValue());
Assert.assertTrue(result.getExplanations().get(1).getJsonExplanation().get("criteria").get("$and").get(1)
.has("_i"));
}
@Test
public void testRefEmbed06() {
QueryContext context = new QueryContext(CMSDB_REPO, IBranch.DEFAULT_BRANCH);
context.setDbConfig(deployContext.getDbConfig());
context.setAllowFullTableScan(false);
context.setExplain(true);
context.setRegistration(TestUtils.getDefaultDalImplementation(dataSource));
String query = "AssetServer{@resourceId}.( networkControllers.port.networkPorts!Vlan[@resourceId=\"lvs2-ra00400:01\"] && nodeServer.capacities{@resourceId, @total})";
// no hint
IQueryResult result = queryService.query(query, context);
Assert.assertFalse(result.hasMoreResults());
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("Vlan", getFirstExecutedMetaClass(result));
// hint = 0
context.setHint(0);
result = queryService.query(query, context);
Assert.assertFalse(result.hasMoreResults());
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass1(result));
// hint = 1
context.setHint(1);
result = queryService.query(query, context);
Assert.assertFalse(result.hasMoreResults());
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("AssetServer", getFirstExecutedMetaClass1(result));
// hint = 2
context.setHint(2);
result = queryService.query(query, context);
Assert.assertFalse(result.hasMoreResults());
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("NetworkPort", getFirstExecutedMetaClass(result));
// hint = 3
context.setHint(3);
result = queryService.query(query, context);
Assert.assertFalse(result.hasMoreResults());
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("Vlan", getFirstExecutedMetaClass(result));
// hint = 4
context.setHint(4);
result = queryService.query(query, context);
Assert.assertFalse(result.hasMoreResults());
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("NodeServer", getFirstExecutedMetaClass(result));
// hint = 5
context.setHint(5);
result = queryService.query(query, context);
Assert.assertFalse(result.hasMoreResults());
Assert.assertEquals(1, result.getEntities().size());
Assert.assertEquals("NodeServer", getFirstExecutedMetaClass(result));
}
}