blob: 012a2fb838e9952ef179ab03a29cb93c939e4640 [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* one or more patents listed at http://www.pivotal.io/patents.
*=========================================================================
*/
/*
* QueryServiceJUnitTest.java
* JUnit based test
*
* Created on March 8, 2005, 4:53 PM
*/
package com.gemstone.gemfire.cache.query;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.util.Collection;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import com.gemstone.gemfire.cache.Region;
import com.gemstone.gemfire.cache.query.data.Portfolio;
import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
/**
*
* @author vaibhav
*/
@Category(IntegrationTest.class)
public class QueryServiceJUnitTest {
@Before
public void setUp() throws java.lang.Exception {
CacheUtils.startCache();
Region region = CacheUtils.createRegion("Portfolios", Portfolio.class);
for(int i=0;i<5;i++){
region.put(i+"",new Portfolio(i));
}
}
@After
public void tearDown() throws java.lang.Exception {
CacheUtils.closeCache();
}
// tests to make sure no exception is thrown when a valid query is created
// and an invalid query throws an exception
@Test
public void testNewQuery() throws Exception {
CacheUtils.log("testNewQuery");
QueryService qs = CacheUtils.getQueryService();
qs.newQuery("SELECT DISTINCT * FROM /root");
try {
qs.newQuery("SELET DISTINCT * FROM /root");
fail("Should have thrown an InvalidQueryException");
}
catch (QueryInvalidException e) {
//pass
}
}
@Test
public void testCreateIndex() throws Exception {
CacheUtils.log("testCreateIndex");
QueryService qs = CacheUtils.getQueryService();
// DebuggerSupport.waitForJavaDebugger(CacheUtils.getLogger());
Index index = qs.createIndex("statusIndex", IndexType.FUNCTIONAL,"status","/Portfolios");
try{
index = qs.createIndex("statusIndex", IndexType.FUNCTIONAL,"status","/Portfolios");
if(index != null)
fail("QueryService.createIndex allows duplicate index names");
}
catch(IndexNameConflictException e) {
}
try{
index = qs.createIndex("statusIndex1", IndexType.FUNCTIONAL,"status","/Portfolios");
if(index != null)
fail("QueryService.createIndex allows duplicate indexes");
}
catch(IndexExistsException e) {
}
}
@Test
public void testIndexDefinitions() throws Exception{
Object[][] testDataFromClauses = {
{"status", "/Portfolios", Boolean.TRUE},
{"status", "/Portfolios.entries", Boolean.FALSE},
{"status", "/Portfolios.values", Boolean.TRUE},
{"status", "/Portfolios.keys", Boolean.TRUE},
{"status", "/Portfolios p", Boolean.TRUE},
{"status", "/Portfolio", Boolean.FALSE},
{"status", "/Portfolio.positions", Boolean.FALSE},
{"status", "/Portfolios p, p.positions", Boolean.TRUE},
};
runCreateIndexTests(testDataFromClauses);
Object[][] testDataIndexExpr = {
{"positions", "/Portfolios", Boolean.FALSE},
{"status.length", "/Portfolios", Boolean.TRUE},
{"p.status", "/Portfolios p", Boolean.TRUE},
{"p.getStatus()", "/Portfolios p", Boolean.TRUE},
{"pos.value.secId", "/Portfolios p, p.positions pos", Boolean.TRUE},
{"pos.getValue().getSecId()", "/Portfolios p, p.positions pos", Boolean.TRUE},
{"pos.getValue.secId", "/Portfolios p, p.positions pos", Boolean.TRUE},
{"secId", "/Portfolios p, p.positions", Boolean.FALSE},
{"is_defined(status)", "/Portfolios", Boolean.FALSE},
{"is_undefined(status)", "/Portfolios", Boolean.FALSE},
{"NOT(status = null)", "/Portfolios", Boolean.FALSE},
{"$1", "/Portfolios", Boolean.FALSE},
};
runCreateIndexTests(testDataIndexExpr);
}
private void runCreateIndexTests(Object testData[][]) throws Exception{
QueryService qs = CacheUtils.getQueryService();
qs.removeIndexes();
for(int i=0;i<testData.length;i++){
//CacheUtils.log("indexExpr="+testData[i][0]+" from="+testData[i][1]);
Index index = null;
try{
String indexedExpr = (String)testData[i][0];
String fromClause = (String)testData[i][1];
// if (indexedExpr.equals("status") && i == 7) DebuggerSupport.waitForJavaDebugger(CacheUtils.getLogger());
index = qs.createIndex("index"+i, IndexType.FUNCTIONAL, indexedExpr, fromClause);
if(testData[i][2] == Boolean.TRUE && index == null){
fail("QueryService.createIndex unable to create index for indexExpr="+testData[i][0]+" from="+testData[i][1]);
}else if(testData[i][2] == Boolean.FALSE && index != null){
fail("QueryService.createIndex allows to create index for un-supported index definition (indexExpr="+testData[i][0]+" from="+testData[i][1]+")");
}
//CacheUtils.log((index == null ? "" : index.toString()));
}catch(Exception e){
//e.printStackTrace();
//CacheUtils.log("NOT ALLOWDED "+e);
if(testData[i][2] == Boolean.TRUE){
e.printStackTrace();
fail("QueryService.createIndex unable to create index for indexExpr="+testData[i][0]+" from="+testData[i][1]);
}
} finally{
if(index != null)
qs.removeIndex(index);
}
//CacheUtils.log("");
}
}
public void atestGetIndex() throws Exception{
CacheUtils.log("testGetIndex");
QueryService qs = CacheUtils.getQueryService();
Object testData[][] ={
{"status", "/Portfolios", Boolean.TRUE},
{"status", "/Portfolios.values", Boolean.FALSE},
{"status", "/Portfolios p", Boolean.TRUE},
{"p.status", "/Portfolios p", Boolean.TRUE},
{"status", "/Portfolios.values x", Boolean.FALSE},
{"x.status", "/Portfolios.values x", Boolean.FALSE},
{"status", "/Portfolio", Boolean.FALSE},
{"p.status", "/Portfolios", Boolean.FALSE},
{"ID", "/Portfolios", Boolean.FALSE},
{"p.ID", "/Portfolios p", Boolean.FALSE},
{"is_defined(status)", "/Portfolios", Boolean.FALSE},
};
Region r = CacheUtils.getRegion("/Portfolios");
Index index = qs.createIndex("statusIndex", IndexType.FUNCTIONAL, "status", "/Portfolios");
assertNotNull(qs.getIndex(r, "statusIndex"));
qs.removeIndex(index);
index = qs.createIndex("statusIndex", IndexType.FUNCTIONAL, "p.status", "/Portfolios p");
assertNotNull(qs.getIndex(r, "statusIndex"));
qs.removeIndex(index);
index = qs.createIndex("statusIndex", IndexType.FUNCTIONAL, "status", "/Portfolios.values");
assertNotNull(qs.getIndex(r, "statusIndex"));
qs.removeIndex(index);
index = qs.createIndex("statusIndex", IndexType.FUNCTIONAL, "p.status", "/Portfolios.values p");
assertNotNull(qs.getIndex(r, "statusIndex"));
qs.removeIndex(index);
}
// no longer support getting indexes by fromClause, type, and indexedExpression, so this commented out
// private void runGetIndexTests(Object testData[][]){
// for(int i=0;i<testData.length;i++){
// try{
// Index index = CacheUtils.getQueryService().getIndex((String)testData[i][1],IndexType.FUNCTIONAL,(String)testData[i][0]);
// if(testData[i][2] == Boolean.TRUE && index == null){
// fail("QueryService.getIndex unable to find index for indexExpr="+testData[i][0]+" from="+testData[i][1]);
// }else if(testData[i][2] == Boolean.FALSE && index != null){
// fail("QueryService.getIndex return non-matching index for indexExpr="+testData[i][0]+" from="+testData[i][1]);
// }
// }catch(Exception e){
// }
// }
// }
@Test
public void testRemoveIndex() throws Exception{
CacheUtils.log("testRemoveIndex");
QueryService qs = CacheUtils.getQueryService();
Index index = qs.createIndex("statusIndex", IndexType.FUNCTIONAL, "p.status", "/Portfolios p");
qs.removeIndex(index);
index = qs.getIndex(CacheUtils.getRegion("/Portfolios"), "statusIndex");
if(index !=null)
fail("QueryService.removeIndex is not removing index");
}
@Test
public void testRemoveIndexes() throws Exception{
CacheUtils.log("testRemoveIndexes");
CacheUtils.createRegion("Ptfs", Portfolio.class);
CacheUtils.createRegion("Ptfs1", Portfolio.class);
QueryService qs = CacheUtils.getQueryService();
qs.createIndex("statusIndex", IndexType.FUNCTIONAL,"status","/Portfolios");
qs.createIndex("statusIndex", IndexType.FUNCTIONAL,"status","/Ptfs");
qs.removeIndexes();
Collection allIndexes = qs.getIndexes();
if(allIndexes.size() != 0)
fail("QueryService.removeIndexes() does not removes all indexes");
}
@Test
public void testGetIndexes() throws Exception{
CacheUtils.log("testGetIndexes");
CacheUtils.createRegion("Ptfs", Portfolio.class);
CacheUtils.createRegion("Ptfs1", Portfolio.class);
QueryService qs = CacheUtils.getQueryService();
qs.createIndex("statusIndex", IndexType.FUNCTIONAL,"status","/Portfolios");
qs.createIndex("statusIndex", IndexType.FUNCTIONAL,"status","/Ptfs");
Collection allIndexes = qs.getIndexes();
if(allIndexes.size() != 2)
fail("QueryService.getIndexes() does not return correct indexes");
}
}