blob: 304d5e9b0341bccc91eb874b65b73af24b4b890f [file] [log] [blame]
/*
* 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.
*/
package org.apache.geode.cache.query.functional;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.Serializable;
import java.text.ParseException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.geode.cache.Cache;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.RegionShortcut;
import org.apache.geode.cache.query.CacheUtils;
import org.apache.geode.cache.query.Query;
import org.apache.geode.cache.query.QueryService;
import org.apache.geode.cache.query.SelectResults;
import org.apache.geode.distributed.internal.DistributionConfig;
import org.apache.geode.pdx.JSONFormatter;
import org.apache.geode.test.junit.categories.OQLQueryTest;
@Category({OQLQueryTest.class})
public class QueryUndefinedJUnitTest implements Serializable {
private static String regionName = "test";
@Before
public void setUp() throws Exception {
System.setProperty(DistributionConfig.GEMFIRE_PREFIX + "Query.VERBOSE", "true");
CacheUtils.startCache();
}
@After
public void tearDown() throws Exception {
CacheUtils.closeCache();
}
private static String[] queries = new String[] {"select * from /test WHERE age != 25",
"select * from /test WHERE age !=25 AND flag = true",
"select * from /test WHERE age != 25 AND age > 0 and age < 100",
"select * from /test WHERE age != 25 OR age > 0", "select * from /test WHERE age > 0",
"select * from /test WHERE age IN (select t.age from /test t)", "select t.age from /test t",
"select * from /test WHERE age != 25 and flag = false",
"select * from /test WHERE age IN (select t.age from /test t) and age != 25"};
// the test will be validating against the May date, so expected values revolve around month of
// May
private static int[] expectedResults = new int[] {2, 2, 1, 3, 2, 3, 3, 0, 2};
private void executeQueryTest(Cache cache, String[] queries, int[] expectedResults) {
CacheUtils.log("********Execute Query Test********");
QueryService queryService = cache.getQueryService();
Query query = null;
String queryString = null;
int numQueries = queries.length;
try {
for (int i = 0; i < numQueries; i++) {
queryString = queries[i];
query = queryService.newQuery(queries[i]);
SelectResults result = (SelectResults) query.execute();
assertEquals(queries[i], expectedResults[i], result.size());
}
} catch (Exception e) {
e.printStackTrace();
fail("Query " + queryString + ":" + query + " Execution Failed!");
}
CacheUtils.log("********Completed Executing Query Test********");
// Destroy current Region for other tests
cache.getRegion(regionName).destroyRegion();
}
@Test
public void testJSONUndefinedValuePR() throws Exception {
Region region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.PARTITION).create(regionName);
createJSONData(region);
executeQueryTest(CacheUtils.getCache(), queries, expectedResults);
}
@Test
public void testJSONUndefinedValueWithIndexPR() throws Exception {
Region region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.PARTITION).create(regionName);
createJSONData(region);
CacheUtils.getQueryService().createIndex("ageIndex", "age", "/test");
executeQueryTest(CacheUtils.getCache(), queries, expectedResults);
}
@Test
public void testJSONUndefinedValueWithHashIndexPR() throws Exception {
Region region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.PARTITION).create(regionName);
createJSONData(region);
CacheUtils.getQueryService().createHashIndex("ageIndex", "age", "/test");
executeQueryTest(CacheUtils.getCache(), queries, expectedResults);
}
@Test
public void testJSONUndefinedValueRR() throws Exception {
Region region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.REPLICATE).create(regionName);
createJSONData(region);
executeQueryTest(CacheUtils.getCache(), queries, expectedResults);
}
@Test
public void testJSONUndefinedValueWithIndexRR() throws Exception {
Region region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.REPLICATE).create(regionName);
createJSONData(region);
CacheUtils.getQueryService().createIndex("ageIndex", "age", "/test");
executeQueryTest(CacheUtils.getCache(), queries, expectedResults);
}
@Test
public void testJSONUndefinedValueWithHashIndexRR() throws Exception {
Region region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.REPLICATE).create(regionName);
createJSONData(region);
CacheUtils.getQueryService().createHashIndex("ageIndex", "age", "/test");
executeQueryTest(CacheUtils.getCache(), queries, expectedResults);
}
@Test
public void testObjectUndefinedValuePR() throws Exception {
Region region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.PARTITION).create(regionName);
createObjectData(region);
executeQueryTest(CacheUtils.getCache(), queries, expectedResults);
}
@Test
public void testObjectUndefinedValueWithIndexPR() throws Exception {
Region region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.PARTITION).create(regionName);
createObjectData(region);
CacheUtils.getQueryService().createIndex("ageIndex", "age", "/test");
executeQueryTest(CacheUtils.getCache(), queries, expectedResults);
}
@Test
public void testObjectUndefinedValueWithHashIndexPR() throws Exception {
Region region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.PARTITION).create(regionName);
createObjectData(region);
CacheUtils.getQueryService().createHashIndex("ageIndex", "age", "/test");
executeQueryTest(CacheUtils.getCache(), queries, expectedResults);
}
@Test
public void testObjectUndefinedValueRR() throws Exception {
Region region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.PARTITION).create(regionName);
createObjectData(region);
executeQueryTest(CacheUtils.getCache(), queries, expectedResults);
}
@Test
public void testObjectUndefinedValueWithIndexRR() throws Exception {
Region region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.PARTITION).create(regionName);
createObjectData(region);
CacheUtils.getQueryService().createIndex("ageIndex", "age", "/test");
executeQueryTest(CacheUtils.getCache(), queries, expectedResults);
}
@Test
public void testObjectUndefinedValueWithHashIndexRR() throws Exception {
Region region =
CacheUtils.getCache().createRegionFactory(RegionShortcut.PARTITION).create(regionName);
createObjectData(region);
CacheUtils.getQueryService().createHashIndex("ageIndex", "age", "/test");
executeQueryTest(CacheUtils.getCache(), queries, expectedResults);
}
private void createJSONData(Region region) throws ParseException {
String obj1 = "{\"_id\": \"10002\", \"age\": 26, \"flag\": true }";
String obj2 = "{\"_id\": \"10001\", \"age\": 25, \"flag\": true }";
String obj3 = "{\"_id\": \"10003\", \"flag\": true }";
region.put("value1", JSONFormatter.fromJSON(obj1));
region.put("value2", JSONFormatter.fromJSON(obj2));
region.put("value3", JSONFormatter.fromJSON(obj3));
}
private void createObjectData(Region region) throws ParseException {
String obj1 = "{\"_id\": \"10002\", \"age\": 26, \"flag\": true }";
String obj2 = "{\"_id\": \"10001\", \"age\": 25, \"flag\": true }";
String obj3 = "{\"_id\": \"10003\", \"flag\": true }";
region.put("value1", new PersonType1("10002", 26, true));
region.put("value2", new PersonType1("10001", 25, true));
region.put("value3", new PersonType2("10003", true));
}
public class PersonType1 implements Serializable {
public String name;
public int age;
public boolean flag;
public PersonType1(String name, int age, boolean flag) {
this.name = name;
this.age = age;
this.flag = flag;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class PersonType2 implements Serializable {
public String name;
public boolean flag;
public PersonType2(String name, boolean flag) {
this.name = name;
this.flag = flag;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
}