/* * 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. */ /* * QueryServiceJUnitTest.java JUnit based test * * Created on March 8, 2005, 4:53 PM */ package org.apache.geode.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.Ignore; import org.junit.Test; import org.junit.experimental.categories.Category; import org.apache.geode.cache.Region; import org.apache.geode.cache.query.data.Portfolio; import org.apache.geode.test.junit.categories.IntegrationTest; /** * */ @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(""); } } @Ignore @Test public void testGetIndex() 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"); } }