blob: a55532a216c089e5fab84208a445b9a239e78333 [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.
*=========================================================================
*/
/*
* IUMRMultiIndexesMultiRegionJUnitTest.java
*
* Created on September 30, 2005, 2:54 PM
*/
package com.gemstone.gemfire.cache.query.functional;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
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.CacheUtils;
import com.gemstone.gemfire.cache.query.Index;
import com.gemstone.gemfire.cache.query.IndexType;
import com.gemstone.gemfire.cache.query.Query;
import com.gemstone.gemfire.cache.query.QueryService;
import com.gemstone.gemfire.cache.query.SelectResults;
import com.gemstone.gemfire.cache.query.data.Address;
import com.gemstone.gemfire.cache.query.data.Employee;
import com.gemstone.gemfire.cache.query.data.Portfolio;
import com.gemstone.gemfire.cache.query.data.Position;
import com.gemstone.gemfire.cache.query.data.Quote;
import com.gemstone.gemfire.cache.query.data.Restricted;
import com.gemstone.gemfire.cache.query.internal.QueryObserverAdapter;
import com.gemstone.gemfire.cache.query.internal.QueryObserverHolder;
import com.gemstone.gemfire.cache.query.internal.index.IndexManager;
import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
/**
*
* @author vjadhav
*/
@Category(IntegrationTest.class)
public class IUMRMultiIndexesMultiRegionJUnitTest {
@Before
public void setUp() throws java.lang.Exception {
CacheUtils.startCache();
}
@After
public void tearDown() throws java.lang.Exception {
CacheUtils.closeCache();
}
@Test
public void testMultiIteratorsMultiRegion1() throws Exception {
Object r[][]= new Object[4][2];
QueryService qs;
qs = CacheUtils.getQueryService();
Position.resetCounter();
//Create Regions
Region r1 = CacheUtils.createRegion("portfolio1", Portfolio.class);
for(int i=0;i<4;i++){
r1.put(i+"", new Portfolio(i));
}
Region r2 = CacheUtils.createRegion("portfolio2", Portfolio.class);
for(int i=0;i<4;i++){
r2.put(i+"", new Portfolio(i));
}
Set add1 = new HashSet();
add1.add(new Address("411045", "Baner"));
add1.add(new Address("411001", "DholePatilRd"));
Region r3 = CacheUtils.createRegion("employees", Employee.class);
for(int i=0;i<4;i++){
r3.put(i+"", new Employee("empName",(20+i),i,"Mr.",(5000+i),add1));
}
String queries[] = {
// Test case No. IUMR021
"SELECT DISTINCT * FROM /portfolio1 pf1, /portfolio2 pf2, /employees e WHERE pf1.status = 'active'",
//"SELECT DISTINCT * FROM /portfolio1 pf1, pf1.positions.values posit1, /portfolio2 pf2, /employees e WHERE posit1.secId='IBM'"
};
//Execute Queries without Indexes
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
r[i][0] = q.execute();
} catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
//Create Indexes
qs.createIndex("statusIndexPf1",IndexType.FUNCTIONAL,"status","/portfolio1");
qs.createIndex("statusIndexPf2",IndexType.FUNCTIONAL,"status","/portfolio2");
//Execute Queries with Indexes
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
QueryObserverImpl observer = new QueryObserverImpl();
QueryObserverHolder.setInstance(observer);
r[i][1] = q.execute();
if(!observer.isIndexesUsed){
fail("Index is NOT uesd");
}
Iterator itr = observer.indexesUsed.iterator();
while(itr.hasNext()){
String indexUsed = itr.next().toString();
if( !(indexUsed).equals("statusIndexPf1")){
fail("<statusIndexPf1> was expected but found "+indexUsed);
}
//assertEquals("statusIndexPf1",itr.next().toString());
}
int indxs = observer.indexesUsed.size();
CacheUtils.log("**************************************************Indexes Used :::::: "+indxs+" Index Name: "+observer.indexName);
} catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
StructSetOrResultsSet ssOrrs = new StructSetOrResultsSet();
ssOrrs.CompareQueryResultsWithoutAndWithIndexes(r,queries.length,queries);
}//end of test1
@Test
public void testMultiIteratorsMultiRegion2() throws Exception{
Object r[][]= new Object[4][2];
QueryService qs;
qs = CacheUtils.getQueryService();
Position.resetCounter();
//Create Regions
Region r1 = CacheUtils.createRegion("portfolio1", Portfolio.class);
for(int i=0;i<4;i++){
r1.put(i+"", new Portfolio(i));
}
Region r2 = CacheUtils.createRegion("portfolio2", Portfolio.class);
for(int i=0;i<4;i++){
r2.put(i+"", new Portfolio(i));
}
Set add1 = new HashSet();
add1.add(new Address("411045", "Baner"));
add1.add(new Address("411001", "DholePatilRd"));
Region r3 = CacheUtils.createRegion("employees", Employee.class);
for(int i=0;i<4;i++){
r3.put(i+"", new Employee("empName",(20+i),i,"Mr.",(5000+i),add1));
}
String queries[] = {
//Test case No. IUMR022
//Both the Indexes Must get used. Presently only one Index is being used.
"SELECT DISTINCT * FROM /portfolio1 pf1, /portfolio2 pf2, /employees e1 WHERE pf1.status = 'active' AND e1.empId < 10"
};
//Execute Queries without Indexes
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
r[i][0] = q.execute();
} catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
//Create Indexes & Execute the queries
qs.createIndex("statusIndexPf1",IndexType.FUNCTIONAL,"pf1.status","/portfolio1 pf1");
qs.createIndex("empIdIndex",IndexType.FUNCTIONAL,"e.empId","/employees e");
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
QueryObserverImpl observer = new QueryObserverImpl();
QueryObserverHolder.setInstance(observer);
r[i][1] = q.execute();
if(!observer.isIndexesUsed){
fail("Index is NOT uesd");
}
int indxs = observer.indexesUsed.size();
CacheUtils.log("**************************************************Indexes Used :::::: "+indxs+" Index Name: "+observer.indexName);
if(indxs!=2){
fail("Both the idexes are not getting used.Only "+indxs+" index is getting used");
}
Iterator itr = observer.indexesUsed.iterator();
String temp;
while(itr.hasNext()){
temp = itr.next().toString();
if( temp.equals("statusIndexPf1")){
break;
}else if(temp.equals("empIdIndex")){
break;
}else{
fail("indices used do not match with those which are expected to be used" +
"<statusIndexPf1> and <empIdIndex> were expected but found " +itr.next());
}
//assertEquals("statusIndexPf1",itr.next().toString());
}
} catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
StructSetOrResultsSet ssORrs = new StructSetOrResultsSet();
ssORrs.CompareQueryResultsWithoutAndWithIndexes(r, queries.length,queries);
}//end of test2
@Test
public void testMultiIteratorsMultiRegion3() throws Exception{
Object r[][]= new Object[9][2];
QueryService qs;
qs = CacheUtils.getQueryService();
Position.resetCounter();
//Create Regions
Region r1 = CacheUtils.createRegion("portfolio1", Portfolio.class);
for(int i=0;i<4;i++){
r1.put(i+"", new Portfolio(i));
}
Region r2 = CacheUtils.createRegion("portfolio2", Portfolio.class);
for(int i=0;i<4;i++){
r2.put(i+"", new Portfolio(i));
}
String queries[] = {
//Test Case No. IUMR004
"SELECT DISTINCT * FROM /portfolio1 pf1, /portfolio2 pf2, pf1.positions.values posit1," +
" pf2.positions.values posit2 WHERE posit1.secId='IBM' AND posit2.secId='IBM'",
//Test Case No.IUMR023
"SELECT DISTINCT * FROM /portfolio1 pf1,/portfolio2 pf2, pf1.positions.values posit1," +
" pf2.positions.values posit2 WHERE posit1.secId='IBM' OR posit2.secId='IBM'",
"SELECT DISTINCT * FROM /portfolio1 pf1, pf1.collectionHolderMap.values coll1," +
" pf1.positions.values posit1, /portfolio2 pf2, pf2.collectionHolderMap.values coll2, pf2.positions.values posit2 " +
" WHERE posit1.secId='IBM' AND posit2.secId='IBM'",
//Test Case No. IUMR005
"SELECT DISTINCT * FROM /portfolio1 pf1,/portfolio2 pf2, pf1.positions.values posit1, pf2.positions.values posit2," +
" pf1.collectionHolderMap.values coll1,pf2.collectionHolderMap.values coll2 " +
" WHERE posit1.secId='IBM' OR posit2.secId='IBM'",
//Test Case No. IUMR006
"SELECT DISTINCT coll1 as collHldrMap1 , coll2 as CollHldrMap2 FROM /portfolio1 pf1, /portfolio2 pf2, pf1.positions.values posit1, pf2.positions.values posit2," +
" pf1.collectionHolderMap.values coll1,pf2.collectionHolderMap.values coll2 " +
" WHERE posit1.secId='IBM' OR posit2.secId='IBM'",
};
// Execute Queries Without Indexes
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
r[i][0] = q.execute();
} catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
//Create Indexes and Execute the Queries
qs.createIndex("secIdIndexPf1",IndexType.FUNCTIONAL,"pos11.secId","/portfolio1 pf1, pf1.collectionHolderMap.values coll1, pf1.positions.values pos11");
qs.createIndex("secIdIndexPf2",IndexType.FUNCTIONAL,"pos22.secId","/portfolio2 pf2, pf2.collectionHolderMap.values coll2, pf2.positions.values pos22");
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
QueryObserverImpl observer = new QueryObserverImpl();
QueryObserverHolder.setInstance(observer);
//try {Thread.sleep(5000);} catch(Exception e){}
r[i][1] = q.execute();
if(!observer.isIndexesUsed){
fail("Index is NOT uesd");
}
int indxs = observer.indexesUsed.size();
if(indxs!=2){
fail("Both the idexes are not getting used.Only "+indxs+" index is getting used");
}
CacheUtils.log("**************************************************Indexes Used :::::: "+indxs);
Iterator itr = observer.indexesUsed.iterator();
String temp;
while(itr.hasNext()){
temp = itr.next().toString();
if(temp.equals("secIdIndexPf1")){
break;
}else if(temp.equals("secIdIndexPf2")){
break;
}else{
fail("indices used do not match with those which are expected to be used" +
"<secIdIndexPf1> and <secIdIndexPf2> were expected but found " +itr.next());
}
}
} catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
//Verify the Query Results
StructSetOrResultsSet ssORrs = new StructSetOrResultsSet();
ssORrs.CompareQueryResultsWithoutAndWithIndexes(r, queries.length,queries);
}// end of test3
@Test
public void testMultiIteratorsMultiRegion4() throws Exception{
Object r[][]= new Object[4][2];
QueryService qs;
qs = CacheUtils.getQueryService();
Position.resetCounter();
//Create Regions
Region r1 = CacheUtils.createRegion("portfolio1", Portfolio.class);
for(int i=0;i<4;i++){
r1.put(i+"", new Portfolio(i));
}
Region r2 = CacheUtils.createRegion("portfolio2", Portfolio.class);
for(int i=0;i<4;i++){
r2.put(i+"", new Portfolio(i));
}
String queries[] = {
//Test case No. IUMR024
//Both the Indexes Must get used. Presently only one Index is being used.
"SELECT DISTINCT * FROM /portfolio1 pf1, pf1.positions.values posit1, /portfolio2 pf2, pf2.positions.values posit2 WHERE pf2.status='active' AND posit1.secId='IBM'"
};
//Execute Queries without Indexes
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
r[i][0] = q.execute();
} catch (Exception e) {
e.printStackTrace();
}
}
//Create Indexes
qs.createIndex("secIdIndexPf1",IndexType.FUNCTIONAL,"pos11.secId","/portfolio1 pf1, pf1.positions.values pos11");
qs.createIndex("statusIndexPf2",IndexType.FUNCTIONAL,"pf2.status","/portfolio2 pf2");
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
QueryObserverImpl observer = new QueryObserverImpl();
QueryObserverHolder.setInstance(observer);
r[i][1] = q.execute();
if(!observer.isIndexesUsed){
fail("Index is NOT uesd");
}
int indxs = observer.indexesUsed.size();
if(indxs!=2){
fail("Both the idexes are not getting used.Only "+indxs+" index is getting used");
}
CacheUtils.log("**************************************************Indexes Used :::::: "+indxs);
Iterator itr = observer.indexesUsed.iterator();
String temp;
while(itr.hasNext()){
temp = itr.next().toString();
if(temp.equals("secIdIndexPf1")){
break;
}else if(temp.equals("statusIndexPf2")){
break;
}else{
fail("indices used do not match with those which are expected to be used" +
"<statusIndexPf1> and <statusIndexPf2> were expected but found " +itr.next());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//Verify the Query Results
StructSetOrResultsSet ssORrs = new StructSetOrResultsSet();
ssORrs.CompareQueryResultsWithoutAndWithIndexes(r, queries.length,queries);
}//end of test4
@Test
public void testMultiIteratorsMultiRegion5() throws Exception{
Object r[][]= new Object[4][2];
QueryService qs;
qs = CacheUtils.getQueryService();
Position.resetCounter();
//Create Regions
Region r1 = CacheUtils.createRegion("portfolio1", Portfolio.class);
for(int i=0;i<4;i++){
r1.put(i+"", new Portfolio(i));
}
Region r2 = CacheUtils.createRegion("portfolio2", Portfolio.class);
for(int i=0;i<4;i++){
r2.put(i+"", new Portfolio(i));
}
Set add1 = new HashSet();
add1.add(new Address("411045", "Baner"));
add1.add(new Address("411001", "DholePatilRd"));
Region r3 = CacheUtils.createRegion("employees", Employee.class);
for(int i=0;i<4;i++){
r3.put(i+"", new Employee("empName",(20+i),i,"Mr.",(5000+i),add1));
}
String queries[] = {
//Test case IUMR025
//Three of the idexes must get used.. Presently only one Index is being used.
"SELECT DISTINCT * FROM /portfolio1 pf1, /portfolio2 pf2, /employees e1 WHERE pf1.status = 'active' AND pf2.status = 'active' AND e1.empId < 10"
};
// Execute Queries without Indexes
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
QueryObserverImpl observer = new QueryObserverImpl();
QueryObserverHolder.setInstance(observer);
r[i][0] = q.execute();
} catch (Exception e) {
e.printStackTrace();
}
}
//Create Indexes and Execute the Queries
qs.createIndex("statusIndexPf1",IndexType.FUNCTIONAL,"pf1.status","/portfolio1 pf1");
qs.createIndex("statusIndexPf2",IndexType.FUNCTIONAL,"pf2.status","/portfolio2 pf2");
qs.createIndex("empIdIndex",IndexType.FUNCTIONAL,"empId","/employees");
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
QueryObserverImpl observer = new QueryObserverImpl();
QueryObserverHolder.setInstance(observer);
r[i][1] = q.execute();
if(!observer.isIndexesUsed){
fail("Index is NOT uesd");
}
int indxs = observer.indexesUsed.size();
if(indxs!=3){
fail("Three of the idexes are not getting used. Only "+indxs+" index is getting used");
}
CacheUtils.log("**************************************************Indexes Used :::::: "+indxs);
Iterator itr = observer.indexesUsed.iterator();
String temp;
while(itr.hasNext()){
temp = itr.next().toString();
if(temp.equals("statusIndexPf1")){
break;
}else if(temp.equals("statusIndexPf2")){
break;
}else if(temp.equals("empIdIndex")){
break;
}else{
fail("indices used do not match with those which are expected to be used" +
"<statusIndexPf1>, <statusIndexPf2> and <empIdIndex> were expected but found " +itr.next());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//Verify the Query Results
StructSetOrResultsSet ssORrs = new StructSetOrResultsSet();
ssORrs.CompareQueryResultsWithoutAndWithIndexes(r, queries.length,queries);
}//end of test5
@Test
public void testMultiIteratorsMultiRegion6() throws Exception{
Object r[][]= new Object[4][2];
QueryService qs;
qs = CacheUtils.getQueryService();
Position.resetCounter();
//Create Regions
Region r1 = CacheUtils.createRegion("portfolio1", Portfolio.class);
for(int i=0;i<4;i++){
r1.put(i+"", new Portfolio(i));
}
Region r2 = CacheUtils.createRegion("portfolio2", Portfolio.class);
for(int i=0;i<4;i++){
r2.put(i+"", new Portfolio(i));
}
String queries[] = {
//Both the Indexes Must get used. Presently only one Index is being used.
" SELECT DISTINCT * FROM /portfolio1 pf1, /portfolio2 pf2, pf1.positions.values posit1," +
" pf2.positions.values posit2 WHERE posit1.secId='IBM' AND posit2.secId='IBM' ",
" SELECT DISTINCT * FROM /portfolio1 pf1, pf1.collectionHolderMap.values coll1," +
" pf1.positions.values posit1, /portfolio2 pf2, pf2.collectionHolderMap.values coll2, pf2.positions.values posit2 " +
" WHERE posit1.secId='IBM' AND posit2.secId='IBM'",
};
// Execute Queries Without Indexes
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
r[i][0] = q.execute();
} catch (Exception e) {
e.printStackTrace();
}
}
//Create Indexes and Execute the Queries
qs.createIndex("secIdIndexPf1",IndexType.FUNCTIONAL,"pos11.secId","/portfolio1 pf1, pf1.positions.values pos11");
qs.createIndex("secIdIndexPf2",IndexType.FUNCTIONAL,"pos22.secId","/portfolio2 pf2, pf2.positions.values pos22");
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
QueryObserverImpl observer = new QueryObserverImpl();
QueryObserverHolder.setInstance(observer);
r[i][1] = q.execute();
if(!observer.isIndexesUsed){
fail("Index is NOT uesd");
}
int indxs = observer.indexesUsed.size();
if(indxs!=2){
fail("Both the idexes are not getting used.Only "+indxs+" index is getting used");
}
CacheUtils.log("**************************************************Indexes Used :::::: "+indxs);
Iterator itr = observer.indexesUsed.iterator();
String temp;
while(itr.hasNext()){
temp = itr.next().toString();
if(temp.equals("secIdIndexPf1")){
break;
}else if(temp.equals("secIdIndexPf2")){
break;
}else{
fail("indices used do not match with those which are expected to be used" +
"<secIdIndexPf1> and <secIdIndexPf2> were expected but found " +itr.next());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//Verify the Query Results
StructSetOrResultsSet ssORrs = new StructSetOrResultsSet();
ssORrs.CompareQueryResultsWithoutAndWithIndexes(r, queries.length,queries);
}// end of test6
@Test
public void testMultiIteratorsMultiRegion7() throws Exception{
Object r[][]= new Object[4][2];
QueryService qs;
qs = CacheUtils.getQueryService();
Position.resetCounter();
//Create Regions
Region r1 = CacheUtils.createRegion("portfolio1", Portfolio.class);
for(int i=0;i<4;i++){
r1.put(i+"", new Portfolio(i));
}
Region r2 = CacheUtils.createRegion("portfolio2", Portfolio.class);
for(int i=0;i<4;i++){
r2.put(i+"", new Portfolio(i));
}
String queries[] = {
//Task IUMR007
"SELECT DISTINCT coll1 as collHldrMap1 , coll2 as CollHldrMap2 FROM /portfolio1 pf1, /portfolio2 pf2, pf1.positions.values posit1,pf2.positions.values posit2," +
"pf1.collectionHolderMap.values coll1, pf2.collectionHolderMap.values coll2 " +
"WHERE posit1.secId='IBM' OR posit2.secId='IBM'",
};
// Execute Queries Without Indexes
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
r[i][0] = q.execute();
} catch (Exception e) {
e.printStackTrace();
}
}
//Create Indexes and Execute the Queries
qs.createIndex("secIdIndexPf1",IndexType.FUNCTIONAL,"pos11.secId","/portfolio1 pf1, pf1.positions.values pos11");
qs.createIndex("secIdIndexPf2",IndexType.FUNCTIONAL,"pos22.secId","/portfolio2 pf2, pf2.collectionHolderMap.values coll2, pf2.positions.values pos22");
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
QueryObserverImpl observer = new QueryObserverImpl();
QueryObserverHolder.setInstance(observer);
r[i][1] = q.execute();
if(!observer.isIndexesUsed){
fail("Index is NOT uesd");
}
int indxs = observer.indexesUsed.size();
if(indxs!=2){
fail("Both the idexes are not getting used.Only "+indxs+" index is getting used");
}
CacheUtils.log("**************************************************Indexes Used :::::: "+indxs);
Iterator itr = observer.indexesUsed.iterator();
String temp;
while(itr.hasNext()){
temp = itr.next().toString();
if(temp.equals("secIdIndexPf1")){
break;
}else if(temp.equals("secIdIndexPf2")){
break;
}else{
fail("indices used do not match with those which are expected to be used" +
"<secIdIndexPf1> and <secIdIndexPf2> were expected but found " +itr.next());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//Verify the Query Results
StructSetOrResultsSet ssORrs = new StructSetOrResultsSet();
ssORrs.CompareQueryResultsWithoutAndWithIndexes(r, queries.length,queries);
}// end of test7
@Test
public void testMultiIteratorsMultiRegion8() throws Exception {
Object r[][]= new Object[4][2];
QueryService qs;
qs = CacheUtils.getQueryService();
Position.resetCounter();
//Create Regions
Region r1 = CacheUtils.createRegion("portfolio1", Portfolio.class);
for(int i=0;i<4;i++){
r1.put(i+"", new Portfolio(i));
}
Region r2 = CacheUtils.createRegion("portfolio2", Portfolio.class);
for(int i=0;i<4;i++){
r2.put(i+"", new Portfolio(i));
}
Set add1 = new HashSet();
add1.add(new Address("411045", "Baner"));
add1.add(new Address("411001", "DholePatilRd"));
Region r3 = CacheUtils.createRegion("employees", Employee.class);
for(int i=0;i<4;i++){
r3.put(i+"", new Employee("empName",(20+i),i,"Mr.",(5000+i),add1));
}
String queries[] = {
"SELECT DISTINCT * FROM /portfolio1 pf1, pf1.positions.values posit1, /portfolio2 pf2, /employees e WHERE posit1.secId='IBM'"
};
//Execute Queries without Indexes
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
r[i][0] = q.execute();
} catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
//Create Indexes
qs.createIndex("statusIndexPf1",IndexType.FUNCTIONAL,"status","/portfolio1");
qs.createIndex("secIdIndexPf1",IndexType.FUNCTIONAL,"posit1.secId","/portfolio1 pf1, pf1.positions.values posit1");
//Execute Queries with Indexes
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
QueryObserverImpl observer = new QueryObserverImpl();
QueryObserverHolder.setInstance(observer);
r[i][1] = q.execute();
if(!observer.isIndexesUsed){
fail("Index is NOT uesd");
}
Iterator itr = observer.indexesUsed.iterator();
assertEquals("secIdIndexPf1",itr.next().toString());
int indxs = observer.indexesUsed.size();
CacheUtils.log("**************************************************Indexes Used :::::: "+indxs+" Index Name: "+observer.indexName);
} catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
StructSetOrResultsSet ssOrrs = new StructSetOrResultsSet();
ssOrrs.CompareQueryResultsWithoutAndWithIndexes(r,queries.length,queries);
}//end of test8
@Test
public void testBasicCompositeIndexUsage() throws Exception {
try {
IndexManager.TEST_RANGEINDEX_ONLY = true;
QueryService qs;
qs = CacheUtils.getQueryService();
Position.resetCounter();
//Create Regions
Region r1 = CacheUtils.createRegion("portfolio", Portfolio.class);
for(int i=0;i<1000;i++){
r1.put(i+"", new Portfolio(i));
}
Set add1 = new HashSet();
add1.add(new Address("411045", "Baner"));
add1.add(new Address("411001", "DholePatilRd"));
Region r2 = CacheUtils.createRegion("employee", Employee.class);
for(int i=0;i<1000;i++){
r2.put(i+"", new Employee("empName",(20+i), i /*empId*/,"Mr.",(5000+i),add1));
}
String queriesWithResCount[][] = {
// Test case No. IUMR021
{"SELECT DISTINCT * FROM /portfolio pf, /employee emp WHERE pf.ID = emp.empId", 1000+""},
{"SELECT * FROM /portfolio pf, /employee emp WHERE pf.ID = emp.empId", ""+1000},
{"SELECT pf.status, emp.empId, pf.getType() FROM /portfolio pf, /employee emp WHERE pf.ID = emp.empId", ""+1000},
/*
* Following query returns more (999001) than expected (1000) results as pf.ID > 0 conditions is evalusted first for
* all Portfolio and Employee objects (999 * 1000) and then other condition with AND is executed for pf.ID = 0 and
* pf.status = ''active' and pf.ID = emp.ID. So total results are 999001.
*
* For expected results correct parenthesis must be used as in next query.
*
* @author Shobhit
*/
{"SELECT pf.status, emp.empId, pf.getType() FROM /portfolio pf, /employee emp WHERE pf.ID = emp.empId AND pf.status='active' OR pf.ID > 0", ""+999001},
{"SELECT * FROM /portfolio pf, /employee emp WHERE pf.ID = emp.empId AND (pf.status='active' OR pf.ID > 499)", ""+750},
{"SELECT pf.status, emp.empId, pf.getType() FROM /portfolio pf, /employee emp WHERE pf.ID = emp.empId AND (pf.status='active' OR pf.ID > 499)", ""+750},
//"SELECT DISTINCT * FROM /portfolio1 pf1, pf1.positions.values posit1, /portfolio2 pf2, /employees e WHERE posit1.secId='IBM'"
};
String queries[] = new String[queriesWithResCount.length];
Object r[][]= new Object[queries.length][2];
//Execute Queries without Indexes
long t1 = -1;
long t2 = -1;
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
queries[i]=queriesWithResCount[i][0];
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
t1 = System.currentTimeMillis();
r[i][0] = q.execute();
assertTrue(r[i][0] instanceof SelectResults);
assertEquals(Integer.parseInt(queriesWithResCount[i][1]), ((SelectResults)r[i][0]).size());
t2 = System.currentTimeMillis();
float x = (t2-t1)/1000f;
CacheUtils.log("Executing query: " + queries[i] + " without index. Time taken is " +x + "seconds");
} catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
//Create Indexes
qs.createIndex("idIndexPf",IndexType.FUNCTIONAL,"ID","/portfolio");
qs.createIndex("statusIndexPf",IndexType.FUNCTIONAL,"status","/portfolio");
qs.createIndex("empIdIndexPf2",IndexType.FUNCTIONAL,"empId","/employee");
//Execute Queries with Indexes
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
QueryObserverImpl observer = new QueryObserverImpl();
QueryObserverHolder.setInstance(observer);
t1 = System.currentTimeMillis();
r[i][1] = q.execute();
assertTrue(r[i][0] instanceof SelectResults);
assertEquals(Integer.parseInt(queriesWithResCount[i][1]), ((SelectResults)r[i][0]).size());
t2 = System.currentTimeMillis();
float x = (t2-t1)/1000f;
CacheUtils.log("Executing query: " + queries[i] + " with index created. Time taken is " + x + "seconds");
if(!observer.isIndexesUsed && i != 3 /* For join query without parenthesis */){
fail("Index is NOT uesd for query" + queries[i]);
}
Iterator itr = observer.indexesUsed.iterator();
while(itr.hasNext()){
String temp = itr.next().toString();
if( !(temp.equals("idIndexPf") || temp.equals("empIdIndexPf2") || temp.equals("statusIndexPf"))){
fail("<idIndexPf> or <empIdIndexPf2> was expected but found "+temp.toString());
}
//assertEquals("statusIndexPf1",itr.next().toString());
}
if (i != 3 /* For join query without parenthesis */) {
int indxs = observer.indexesUsed.size();
assertTrue("Indexes used is not of size >= 2",indxs >= 2);
CacheUtils.log("**************************************************Indexes Used :::::: "+indxs+" Index Name: "+observer.indexName);
}
} catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
StructSetOrResultsSet ssOrrs = new StructSetOrResultsSet();
ssOrrs.CompareQueryResultsWithoutAndWithIndexes(r,queries.length, queries);
}finally {
IndexManager.TEST_RANGEINDEX_ONLY = false;
}
}//end of test1
// !!!:ezoerner:20081031 disabled because it throws
// UnsupportedOperationException: Cannot do an equi-join between a region having a RangeIndex and a region having a CompactRangeIndex.
@Test
public void testBasicCompositeIndexUsageWithOneIndexExpansionAndTruncation() throws Exception {
try {
IndexManager.TEST_RANGEINDEX_ONLY = true;
Object r[][]= new Object[1][2];
QueryService qs;
qs = CacheUtils.getQueryService();
Position.resetCounter();
//Create Regions
Region r1 = CacheUtils.createRegion("portfolio", Portfolio.class);
for(int i=0;i<1000;i++){
r1.put(i+"", new Portfolio(i));
}
Set add1 = new HashSet();
add1.add(new Address("411045", "Baner"));
add1.add(new Address("411001", "DholePatilRd"));
Region r2 = CacheUtils.createRegion("employee", Employee.class);
for(int i=0;i<1000;i++){
r2.put(i+"", new Employee("empName",(20+i),i,"Mr.",(5000+i),add1));
}
String queries[] = {
// Test case No. IUMR021
"SELECT DISTINCT * FROM /portfolio pf, pf.positions pos, /employee emp WHERE pf.iD = emp.empId",
//"SELECT DISTINCT * FROM /portfolio1 pf1, pf1.positions.values posit1, /portfolio2 pf2, /employees e WHERE posit1.secId='IBM'"
};
//Execute Queries without Indexes
long t1 = -1;
long t2 = -1;
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
t1 = System.currentTimeMillis();
r[i][0] = q.execute();
t2 = System.currentTimeMillis();
float x = (t2-t1)/1000f;
CacheUtils.log("Executing query: " + queries[i] + " without index. Time taken is " + x + "seconds");
} catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
//Create Indexes
qs.createIndex("idIndexPf",IndexType.FUNCTIONAL,"iD","/portfolio pf , pf.collectionHolderMap");
qs.createIndex("empIdIndexPf2",IndexType.FUNCTIONAL,"empId","/employee");
//Execute Queries with Indexes
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
QueryObserverImpl observer = new QueryObserverImpl();
QueryObserverHolder.setInstance(observer);
t1 = System.currentTimeMillis();
r[i][1] = q.execute();
t2 = System.currentTimeMillis();
float x = (t2-t1)/1000f;
CacheUtils.log("Executing query: " + queries[i] + " with index created. Time taken is " + x + " seconds");
if(!observer.isIndexesUsed){
fail("Index is NOT uesd");
}
Iterator itr = observer.indexesUsed.iterator();
while(itr.hasNext()){
String temp = itr.next().toString();
if( !(temp.equals("idIndexPf") || temp.equals("empIdIndexPf2"))){
fail("<idIndexPf> or <empIdIndexPf2> was expected but found "+temp.toString());
}
//assertEquals("statusIndexPf1",itr.next().toString());
}
int indxs = observer.indexesUsed.size();
assertTrue("Indexes used is not of size = 2",indxs == 2);
CacheUtils.log("**************************************************Indexes Used :::::: "+indxs+" Index Name: "+observer.indexName);
} catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
StructSetOrResultsSet ssOrrs = new StructSetOrResultsSet();
ssOrrs.CompareQueryResultsWithoutAndWithIndexes(r,queries.length,queries);
}finally {
IndexManager.TEST_RANGEINDEX_ONLY = false;
}
}//end of test1
//Asif: Equijoin between range index & compact index is not supported so
// allowing the test to run with Range index only
@Test
public void testBasicCompositeIndexUsageWithMultipleIndexes()
throws Exception
{
try {
IndexManager.TEST_RANGEINDEX_ONLY = true;
Object r[][] = new Object[1][2];
QueryService qs;
qs = CacheUtils.getQueryService();
Position.resetCounter();
// Create Regions
Region r1 = CacheUtils.createRegion("portfolio", Portfolio.class);
for (int i = 0; i < 1000; i++) {
r1.put(i + "", new Portfolio(i));
}
Set add1 = new HashSet();
add1.add(new Address("411045", "Baner"));
add1.add(new Address("411001", "DholePatilRd"));
Region r2 = CacheUtils.createRegion("employee", Employee.class);
for (int i = 0; i < 1000; i++) {
r2.put(i + "", new Employee("empName", (20 + i), i, "Mr.", (5000 + i),
add1));
}
String queries[] = {
// Test case No. IUMR021
"SELECT DISTINCT * FROM /portfolio pf, pf.positions pos, /employee emp WHERE pf.iD = emp.empId and pf.status='active' and emp.age > 900",
// "SELECT DISTINCT * FROM /portfolio1 pf1, pf1.positions.values posit1, /portfolio2 pf2, /employees e WHERE posit1.secId='IBM'"
};
// Execute Queries without Indexes
long t1 = -1;
long t2 = -1;
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
t1 = System.currentTimeMillis();
r[i][0] = q.execute();
t2 = System.currentTimeMillis();
float x = (t2 - t1) / 1000f;
CacheUtils.log("Executing query: " + queries[i]
+ " without index. Time taken is " + x + "seconds");
}
catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
// Create Indexes
qs.createIndex("idIndexPf", IndexType.FUNCTIONAL, "iD",
"/portfolio pf , pf.collectionHolderMap");
qs.createIndex("empIdIndexPf2", IndexType.FUNCTIONAL, "empId",
"/employee");
// qs.createIndex("statusIndexPf2",IndexType.FUNCTIONAL,"status","/portfolio pf , pf.positions");
qs.createIndex("ageIndexemp", IndexType.FUNCTIONAL, "age",
"/employee emp ");
// Execute Queries with Indexes
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
QueryObserverImpl observer = new QueryObserverImpl();
QueryObserverHolder.setInstance(observer);
t1 = System.currentTimeMillis();
r[i][1] = q.execute();
t2 = System.currentTimeMillis();
float x = (t2 - t1) / 1000f;
CacheUtils.log("Executing query: " + queries[i]
+ " with index created. Time taken is " + x + " seconds");
if (!observer.isIndexesUsed) {
fail("Index is NOT uesd");
}
Iterator itr = observer.indexesUsed.iterator();
while (itr.hasNext()) {
String temp = itr.next().toString();
if (!(temp.equals("ageIndexemp") || temp.equals("idIndexPf")
|| temp.equals("empIdIndexPf2") || temp
.equals("statusIndexPf2"))) {
fail("<idIndexPf> or <empIdIndexPf2> was expected but found "
+ temp.toString());
}
// assertEquals("statusIndexPf1",itr.next().toString());
}
int indxs = observer.indexesUsed.size();
assertTrue("Indexes used is not of size = 3", indxs == 3);
System.out
.println("**************************************************Indexes Used :::::: "
+ indxs + " Index Name: " + observer.indexName);
}
catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
StructSetOrResultsSet ssOrrs = new StructSetOrResultsSet();
ssOrrs.CompareQueryResultsWithoutAndWithIndexes(r, queries.length,queries);
}
finally {
IndexManager.TEST_RANGEINDEX_ONLY = false;
}
}//end of test1
// !!!:ezoerner:20081031 disabled because it throws
// UnsupportedOperationException: Cannot do an equi-join between a region having a RangeIndex and a region having a CompactRangeIndex.
@Test
public void testAssertionBug() {
try {
IndexManager.TEST_RANGEINDEX_ONLY = true;
Region region1 = CacheUtils.createRegion("Quotes1",Quote.class);
Region region2 = CacheUtils.createRegion("Quotes2",Quote.class);
Region region3 = CacheUtils.createRegion("Restricted1",Restricted.class);
for (int i=0; i<10; i++){
region1.put(new Integer(i), new Quote(i));
region2.put(new Integer(i), new Quote(i));
region3.put(new Integer(i), new Restricted(i));
}
QueryService qs = CacheUtils.getQueryService();
//////////creating indexes on region Quotes1
qs.createIndex("Quotes1Region-quoteIdStrIndex", IndexType.PRIMARY_KEY, "q.quoteIdStr", "/Quotes1 q");
//qs.createIndex("Quotes1Region-cusipIndex1", IndexType.FUNCTIONAL, "q.cusip", "/Quotes1 q, q.restrict r");
qs.createIndex("Quotes1Region-quoteTypeIndex", IndexType.FUNCTIONAL, "q.quoteType", "/Quotes1 q, q.restrict r");
qs.createIndex("Quotes1Region-dealerPortfolioIndex", IndexType.FUNCTIONAL, "q.dealerPortfolio", "/Quotes1 q, q.restrict r");
qs.createIndex("Quotes1Region-channelNameIndex", IndexType.FUNCTIONAL, "q.channelName", "/Quotes1 q, q.restrict r");
qs.createIndex("Quotes1Region-priceTypeIndex", IndexType.FUNCTIONAL, "q.priceType", "/Quotes1 q, q.restrict r");
qs.createIndex("Quotes1Region-lowerQtyIndex", IndexType.FUNCTIONAL, "q.lowerQty", "/Quotes1 q, q.restrict r");
qs.createIndex("Quotes1Region-upperQtyIndex", IndexType.FUNCTIONAL, "q.upperQty", "/Quotes1 q, q.restrict r");
qs.createIndex("Quotes1Restricted-quoteTypeIndex", IndexType.FUNCTIONAL, "r.quoteType", "/Quotes1 q, q.restrict r");
qs.createIndex("Quotes1Restricted-minQtyIndex", IndexType.FUNCTIONAL, "r.minQty", "/Quotes1 q, q.restrict r");
qs.createIndex("Quotes1Restricted-maxQtyIndex", IndexType.FUNCTIONAL, "r.maxQty", "/Quotes1 q, q.restrict r");
//////////creating indexes on region Quotes2
qs.createIndex("Quotes2Region-quoteIdStrIndex", IndexType.PRIMARY_KEY, "q.quoteIdStr", "/Quotes2 q");
//qs.createIndex("Quotes1Region-cusipIndex2", IndexType.FUNCTIONAL, "q.cusip", "/Quotes2 q, q.restrict r");
qs.createIndex("Quotes2Region-quoteTypeIndex", IndexType.FUNCTIONAL, "q.quoteType", "/Quotes2 q, q.restrict r");
qs.createIndex("Quotes2Region-dealerPortfolioIndex", IndexType.FUNCTIONAL, "q.dealerPortfolio", "/Quotes2 q, q.restrict r");
qs.createIndex("Quotes2Region-channelNameIndex", IndexType.FUNCTIONAL, "q.channelName", "/Quotes2 q, q.restrict r");
qs.createIndex("Quotes2Region-priceTypeIndex", IndexType.FUNCTIONAL, "q.priceType", "/Quotes2 q, q.restrict r");
qs.createIndex("Quotes2Region-lowerQtyIndex", IndexType.FUNCTIONAL, "q.lowerQty", "/Quotes2 q, q.restrict r");
qs.createIndex("Quotes2Region-upperQtyIndex", IndexType.FUNCTIONAL, "q.upperQty", "/Quotes2 q, q.restrict r");
qs.createIndex("Quotes2Restricted-quoteTypeIndex", IndexType.FUNCTIONAL, "r.quoteType", "/Quotes2 q, q.restrict r");
qs.createIndex("Quotes2Restricted-minQtyIndex", IndexType.FUNCTIONAL, "r.minQty", "/Quotes2 q, q.restrict r");
qs.createIndex("Quotes2Restricted-maxQtyIndex", IndexType.FUNCTIONAL, "r.maxQty", "/Quotes2 q, q.restrict r");
//////////creating indexes on region Restricted1
//qs.createIndex("RestrictedRegion-cusip", IndexType.FUNCTIONAL, "r.cusip", "/Restricted1 r");
qs.createIndex("RestrictedRegion-quoteTypeIndex", IndexType.FUNCTIONAL, "r.quoteType", "/Restricted1 r");
qs.createIndex("RestrictedRegion-minQtyIndex", IndexType.FUNCTIONAL, "r.minQty", "/Restricted1 r");
qs.createIndex("RestrictedRegion-maxQtyIndex-1", IndexType.FUNCTIONAL, "r.maxQty", "/Restricted1 r");
Query q = qs.newQuery("SELECT DISTINCT q.cusip, q.quoteType, q.dealerPortfolio, q.channelName, q.dealerCode, q.priceType, q.price, q.lowerQty, q.upperQty, q.ytm, r.minQty, r.maxQty, r.incQty FROM /Quotes1 q, /Restricted1 r WHERE q.cusip = r.cusip AND q.quoteType = r.quoteType");
q.execute();
}catch(Exception e) {
e.printStackTrace();
fail("Test failed bcoz of exception "+e);
}finally {
IndexManager.TEST_RANGEINDEX_ONLY = false;
}
}
// !!!:ezoerner:20081031 disabled because it throws
// UnsupportedOperationException: Cannot do an equi-join between a region having a RangeIndex and a region having a CompactRangeIndex.
@Test
public void testBasicCompositeIndexUsageInAllGroupJunction() throws Exception {
try {
IndexManager.TEST_RANGEINDEX_ONLY = true;
Object r[][]= new Object[1][2];
QueryService qs;
qs = CacheUtils.getQueryService();
Position.resetCounter();
//Create Regions
Region r1 = CacheUtils.createRegion("portfolio", Portfolio.class);
for(int i=0;i<100;i++){
r1.put(i+"", new Portfolio(i));
}
Region r3 = CacheUtils.createRegion("portfolio3", Portfolio.class);
for(int i=0;i<10;i++){
r3.put(i+"", new Portfolio(i));
}
Set add1 = new HashSet();
add1.add(new Address("411045", "Baner"));
add1.add(new Address("411001", "DholePatilRd"));
Region r2 = CacheUtils.createRegion("employee", Employee.class);
for(int i=0;i<100;i++){
r2.put(i+"", new Employee("empName",(20+i),i,"Mr.",(5000+i),add1));
}
String queries[] = {
// Test case No. IUMR021
"SELECT DISTINCT * FROM /portfolio pf, pf.positions pos, /portfolio3 pf3, /employee emp WHERE pf.iD = emp.empId and pf.status='active' and emp.age > 50 and pf3.status='active'",
//"SELECT DISTINCT * FROM /portfolio1 pf1, pf1.positions.values posit1, /portfolio2 pf2, /employees e WHERE posit1.secId='IBM'"
};
//Execute Queries without Indexes
long t1 = -1;
long t2 = -1;
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
t1 = System.currentTimeMillis();
r[i][0] = q.execute();
t2 = System.currentTimeMillis();
float x = (t2-t1)/1000f;
CacheUtils.log("Executing query: " + queries[i] + " without index. Time taken is " + x + "seconds");
} catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
//Create Indexes
qs.createIndex("idIndexPf",IndexType.FUNCTIONAL,"iD","/portfolio pf , pf.collectionHolderMap");
qs.createIndex("empIdIndexPf2",IndexType.FUNCTIONAL,"empId","/employee");
qs.createIndex("statusIndexPf3",IndexType.FUNCTIONAL,"status","/portfolio3 pf3 ");
qs.createIndex("ageIndexemp",IndexType.FUNCTIONAL,"age","/employee emp ");
//Execute Queries with Indexes
for (int i = 0; i < queries.length; i++) {
Query q = null;
try {
q = CacheUtils.getQueryService().newQuery(queries[i]);
CacheUtils.getLogger().info("Executing query: " + queries[i]);
QueryObserverImpl observer = new QueryObserverImpl();
QueryObserverHolder.setInstance(observer);
t1 = System.currentTimeMillis();
r[i][1] = q.execute();
t2 = System.currentTimeMillis();
float x = (t2-t1)/1000f;
CacheUtils.log("Executing query: " + queries[i] + " with index created. Time taken is " + x + " seconds");
if(!observer.isIndexesUsed){
fail("Index is NOT uesd");
}
Iterator itr = observer.indexesUsed.iterator();
while(itr.hasNext()){
String temp = itr.next().toString();
if( !(temp.equals("ageIndexemp")||temp.equals("idIndexPf") || temp.equals("empIdIndexPf2") || temp.equals("statusIndexPf3"))){
fail("<idIndexPf> or <empIdIndexPf2> was expected but found "+temp.toString());
}
//assertEquals("statusIndexPf1",itr.next().toString());
}
int indxs = observer.indexesUsed.size();
assertTrue("Indexes used is not of size = 4 but of size = "+indxs,indxs == 4);
CacheUtils.log("**************************************************Indexes Used :::::: "+indxs+" Index Name: "+observer.indexName);
} catch (Exception e) {
e.printStackTrace();
fail(q.getQueryString());
}
}
StructSetOrResultsSet ssOrrs = new StructSetOrResultsSet();
ssOrrs.CompareQueryResultsWithoutAndWithIndexes(r,queries.length,queries);
}finally {
IndexManager.TEST_RANGEINDEX_ONLY = false;
}
}//end of test1
class QueryObserverImpl extends QueryObserverAdapter{
boolean isIndexesUsed = false;
ArrayList indexesUsed = new ArrayList();
String indexName;
public void beforeIndexLookup(Index index, int oper, Object key) {
indexName = index.getName();
indexesUsed.add(index.getName());
}
public void afterIndexLookup(Collection results) {
if(results != null){
isIndexesUsed = true;
}
}
}
}//end of class