/* * Licensed to the Apache Software Foundation (ASF) under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional information regarding * copyright ownership. The ASF licenses this file to You 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. */ /* * Created on Oct 13, 2005 * * */ package org.apache.geode.cache.query.internal; 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.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Set; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; import org.apache.geode.cache.Region; import org.apache.geode.cache.query.CacheUtils; import org.apache.geode.cache.query.SelectResults; import org.apache.geode.cache.query.data.Address; import org.apache.geode.cache.query.data.Employee; import org.apache.geode.cache.query.data.Portfolio; import org.apache.geode.cache.query.internal.types.ObjectTypeImpl; import org.apache.geode.test.junit.categories.IntegrationTest; /** * * */ @Category(IntegrationTest.class) public class QueryUtilsJUnitTest { Region region; @Before public void setUp() throws Exception { CacheUtils.startCache(); } @After public void tearDown() throws Exception { CacheUtils.closeCache(); } @Test public void testObtainTheBottomMostCompiledValue() { QCompiler compiler = new QCompiler(); // List list = compiler.compileFromClause("/portfolio p, p.positions"); CompiledRegion cr = new CompiledRegion("/portfolio"); CompiledID cid = new CompiledID("id"); CompiledPath cp1 = new CompiledPath(new CompiledPath(cid, "path1"), "path2"); CompiledPath cp2 = new CompiledPath(new CompiledPath(cr, "path1"), "path2"); assertEquals(QueryUtils.obtainTheBottomMostCompiledValue(cr), cr); assertEquals(QueryUtils.obtainTheBottomMostCompiledValue(cid), cid); assertEquals(QueryUtils.obtainTheBottomMostCompiledValue(cp1), cid); assertEquals(QueryUtils.obtainTheBottomMostCompiledValue(cp2), cr); } @Test public void testCutDownAndExpandIndexResultsWithNoCutDownAndTwoFinalIters() { try { region = CacheUtils.createRegion("portfolio", Portfolio.class); Portfolio[] po = new Portfolio[] {new Portfolio(0), new Portfolio(1), new Portfolio(2), new Portfolio(3)}; region.put("0", new Portfolio(0)); region.put("1", new Portfolio(1)); region.put("2", new Portfolio(2)); region.put("3", new Portfolio(3)); // compileFromClause returns a List<CompiledIteratorDef> QCompiler compiler = new QCompiler(); List list = compiler.compileFromClause("/portfolio p, p.positions"); ExecutionContext context = new ExecutionContext(null, CacheUtils.getCache()); context.newScope(context.assosciateScopeID()); RuntimeIterator[] indexToItrMappping = new RuntimeIterator[1]; RuntimeIterator expand = null; boolean set = false; Iterator iter = list.iterator(); while (iter.hasNext()) { CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next(); context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context)); RuntimeIterator rIter = iterDef.getRuntimeIterator(context); if (!set) { set = true; indexToItrMappping[0] = rIter; } else { expand = rIter; } context.bindIterator(rIter); context.addToIndependentRuntimeItrMap(iterDef); } List finalList = new ArrayList(); finalList.add(indexToItrMappping[0]); finalList.add(expand); ResultsSet indexResult = new ResultsSet(new ObjectTypeImpl(Portfolio.class)); for (int i = 0; i < po.length; ++i) indexResult.add(po[i]); List expandList = new LinkedList(); expandList.add(expand); List dataList = new ArrayList(); dataList.add(indexResult); dataList.add(indexToItrMappping); dataList.add(expandList); dataList.add(finalList); dataList.add(context); dataList.add(new ArrayList()); SelectResults results = QueryUtils.testCutDownAndExpandIndexResults(dataList); /* * SelectResults results = QueryUtils.cutDownAndExpandIndexResults( indexResult, * indexToItrMappping, expandList, finalList, context, new ArrayList()); */ assertTrue("Resultset obtained not of type StructBag", results instanceof StructBag); StructBag st = (StructBag) results; assertTrue("StructBag not of size expected as 8", st.size() == 8); } catch (Exception e) { e.printStackTrace(); fail("Test failed because of exception " + e); } } @Test public void testCutDownAndExpandIndexResultsWithNoCutDownAndThreeFinalIters() { try { region = CacheUtils.createRegion("portfolio", Portfolio.class); Portfolio[] po = new Portfolio[] {new Portfolio(0), new Portfolio(1), new Portfolio(2), new Portfolio(3)}; region.put("0", new Portfolio(0)); region.put("1", new Portfolio(1)); region.put("2", new Portfolio(2)); region.put("3", new Portfolio(3)); Region r3 = CacheUtils.createRegion("employees", Employee.class); Set add1 = new HashSet(); add1.add(new Address("411045", "Baner")); add1.add(new Address("411001", "DholePatilRd")); for (int i = 0; i < 4; i++) { r3.put(i + "", new Employee("empName", (20 + i), i, "Mr.", (5000 + i), add1)); } // compileFromClause returns a List<CompiledIteratorDef> QCompiler compiler = new QCompiler(); List list = compiler.compileFromClause("/portfolio p, p.positions, /employees e"); ExecutionContext context = new ExecutionContext(null, CacheUtils.getCache()); context.newScope(context.assosciateScopeID()); RuntimeIterator[] indexToItrMappping = new RuntimeIterator[1]; RuntimeIterator expand[] = new RuntimeIterator[2]; boolean set = false; int j = 0; Iterator iter = list.iterator(); while (iter.hasNext()) { CompiledIteratorDef iterDef = (CompiledIteratorDef) iter.next(); context.addDependencies(new CompiledID("dummy"), iterDef.computeDependencies(context)); RuntimeIterator rIter = iterDef.getRuntimeIterator(context); if (!set) { set = true; indexToItrMappping[0] = rIter; } else { expand[j++] = rIter; } context.bindIterator(rIter); context.addToIndependentRuntimeItrMap(iterDef); } List finalList = new ArrayList(); finalList.add(indexToItrMappping[0]); ResultsSet indexResult = new ResultsSet(new ObjectTypeImpl(Portfolio.class)); for (int i = 0; i < po.length; ++i) indexResult.add(po[i]); List expandList = new LinkedList(); expandList.add(expand[0]); expandList.add(expand[1]); finalList.addAll(expandList); List dataList = new ArrayList(); dataList.add(indexResult); dataList.add(indexToItrMappping); dataList.add(expandList); dataList.add(finalList); dataList.add(context); dataList.add(new ArrayList()); SelectResults results = QueryUtils.testCutDownAndExpandIndexResults(dataList); assertTrue("Resultset obtained not of type structbag", results instanceof StructBag); StructBag st = (StructBag) results; assertTrue("StructSet not of size expected as 32", st.size() == 32); } catch (Exception e) { e.printStackTrace(); fail("Test failed because of exception " + e); } } /* * @Test public void testCutDownAndExpandIndexResultsWithManyFinalIters() { region = * CacheUtils.createRegion("portfolio", Portfolio.class); Portfolio[] po = new Portfolio[] { new * Portfolio(0), new Portfolio(1), new Portfolio(2), new Portfolio(3)}; region.put("0", new * Portfolio(0)); region.put("1", new Portfolio(1)); region.put("2", new Portfolio(2)); * region.put("3", new Portfolio(3)); * * Region r3 = CacheUtils.createRegion("employees", Employee.class); Set add1 = new HashSet(); * add1.add(new Address("411045", "Baner")); add1.add(new Address("411001", "DholePatilRd")); * for(int i=0;i<4;i++){ r3.put(i+"", new Employee("empName",(20+i),i,"Mr.",(5000+i),add1)); } // * compileFromClause returns a List<CompiledIteratorDef> QCompiler compiler = new * QCompiler(CacheUtils.getLogger()); List list = compiler. * compileFromClause("/portfolio p1, p1.positions, /employees e, /portfolio p2, p2.positions"); * ExecutionContext context = new ExecutionContext(null, CacheUtils.getCache()); * context.newScope(); RuntimeIterator[] indexToItrMappping = new RuntimeIterator[1]; * RuntimeIterator expand[] = new RuntimeIterator[2]; boolean set = false; int j = 0; try { * Iterator iter = list.iterator(); while (iter.hasNext()) { CompiledIteratorDef iterDef = * (CompiledIteratorDef) iter.next(); context.addDependencies(new CompiledID("dummy"), iterDef * .computeDependencies(context)); RuntimeIterator rIter = iterDef.getRuntimeIterator(context); if * (!set) { set = true; indexToItrMappping[0] = rIter; } else { expand[j++] = rIter; } * context.bindIterator(rIter); context.addToIndependentRuntimeItrMap(iterDef); } List finalList = * new ArrayList(); finalList.add(indexToItrMappping[0]); * * //ResultsSet indexResult = new ResultsSet(new ObjectTypeImpl( Portfolio.class)); ResultsSet * indexResult = new ResultsSet(new ObjectTypeImpl( Portfolio.class)); for (int i = 0; i < * po.length; ++i) indexResult.add(po[i]); List expandList = new LinkedList(); * expandList.add(expand[0]); expandList.add(expand[1]); finalList.addAll(expandList); * SelectResults results = QueryUtils.cutDownAndExpandIndexResults( indexResult, * indexToItrMappping, expandList, finalList, context, new ArrayList()); * assertTrue("Resultset obtaine dnot of type strcutset", results instanceof StructSet); StructSet * st = (StructSet) results; assertTrue("StructSet not of size expected as 32", st.size() == 32); * } catch (Exception e) { e.printStackTrace(); fail("Test failed because of exception " + e); } } */ }