blob: 1a91e43cf1fbec05a2d1d02cee0df07d7a4db550 [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.
*/
/*
* IndexCreationInternalsJUnitTest.java JUnit based test
*
* Created on February 22, 2005, 11:24 AM
*/
package org.apache.geode.cache.query.internal.index;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.List;
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.QueryInvalidException;
import org.apache.geode.cache.query.internal.CompiledID;
import org.apache.geode.cache.query.internal.CompiledIteratorDef;
import org.apache.geode.cache.query.internal.CompiledPath;
import org.apache.geode.cache.query.internal.CompiledRegion;
import org.apache.geode.cache.query.internal.QCompiler;
import org.apache.geode.cache.query.internal.types.TypeUtils;
import org.apache.geode.internal.cache.LocalRegion;
import org.apache.geode.test.dunit.ThreadUtils;
import org.apache.geode.test.junit.categories.OQLIndexTest;
@Category({OQLIndexTest.class})
public class IndexCreationInternalsJUnitTest {
protected String childThreadName1 = "";
protected String childThreadName2 = "";
@Before
public void setUp() throws Exception {
CacheUtils.startCache();
}
@After
public void tearDown() throws Exception {
CacheUtils.closeCache();
}
@Test
public void testLoneFromClause() throws Exception {
// compileFromClause returns a List<CompiledIteratorDef>
QCompiler compiler = new QCompiler();
List list = compiler.compileFromClause("/pos p, p.positions");
assertEquals(2, list.size());
CompiledIteratorDef first = (CompiledIteratorDef) list.get(0);
assertEquals("p", first.getName());
assertEquals("/pos", ((CompiledRegion) first.getCollectionExpr()).getRegionPath());
assertEquals(TypeUtils.OBJECT_TYPE, first.getElementType());
CompiledIteratorDef second = (CompiledIteratorDef) list.get(1);
assertNull(second.getName());
CompiledPath path = (CompiledPath) second.getCollectionExpr();
assertEquals("p", ((CompiledID) path.getReceiver()).getId());
assertEquals("positions", path.getTailID());
assertEquals(TypeUtils.OBJECT_TYPE, second.getElementType());
}
@Test
public void testLoneProjectionAttributes() throws Exception {
// compileProjectionAttributes returns a List or null.
// null if '*', or a List<Object[2]>.
// The two-element Object arrays are:
// 0: a String, the field name, or null if no identifier provided
// 1: The CompiledValue for the projection expression.
QCompiler compiler = new QCompiler();
List list = compiler.compileProjectionAttributes("*");
assertNull(list);
compiler = new QCompiler();
list = compiler.compileProjectionAttributes("ID, status");
assertEquals(2, list.size());
Object[] firstProj = (Object[]) list.get(0);
assertEquals(2, firstProj.length);
assertNull(firstProj[0]); // no field name
CompiledID id1 = (CompiledID) firstProj[1];
assertEquals("ID", id1.getId());
Object[] secondProj = (Object[]) list.get(1);
assertEquals(2, secondProj.length);
assertNull(secondProj[0]); // no field name
CompiledID id2 = (CompiledID) secondProj[1];
assertEquals("status", id2.getId());
// test two ways of specifying the field names
compiler = new QCompiler();
list = compiler.compileProjectionAttributes("x: ID, y: status");
assertEquals(2, list.size());
firstProj = (Object[]) list.get(0);
assertEquals(2, firstProj.length);
assertEquals("x", firstProj[0]);
id1 = (CompiledID) firstProj[1];
assertEquals("ID", id1.getId());
secondProj = (Object[]) list.get(1);
assertEquals(2, secondProj.length);
assertEquals("y", secondProj[0]);
id2 = (CompiledID) secondProj[1];
assertEquals("status", id2.getId());
// the following is invalid
try {
compiler = new QCompiler();
list = compiler.compileProjectionAttributes("ID x, status y");
fail("Should have thrown a QueryInvalidException");
} catch (QueryInvalidException e) {
// pass
}
// test three ways of specifying the field names
compiler = new QCompiler();
list = compiler.compileProjectionAttributes("ID AS x, status as y");
assertEquals(2, list.size());
firstProj = (Object[]) list.get(0);
assertEquals(2, firstProj.length);
assertEquals("x", firstProj[0]);
id1 = (CompiledID) firstProj[1];
assertEquals("ID", id1.getId());
secondProj = (Object[]) list.get(1);
assertEquals(2, secondProj.length);
assertEquals("y", secondProj[0]);
id2 = (CompiledID) secondProj[1];
assertEquals("status", id2.getId());
}
@Test
public void testGenerationOfCanonicalizedIteratorNames() {
try {
Region rgn = CacheUtils.createRegion("dummy", null);
final IndexManager imgr = new IndexManager(CacheUtils.getCache(), rgn);
((LocalRegion) rgn).setIndexManager(imgr);
String name = imgr.putCanonicalizedIteratorNameIfAbsent("dummy");
assertTrue(
"Error as the iterator name was expected as index_iter1 , but is actually " + name,
name.equals("index_iter1"));
} catch (Exception e) {
fail("Exception in running the test " + e);
}
}
@Test
public void testConcurrentGenerationOfCanonicalizedIteratorNames() {
try {
Region rgn = CacheUtils.createRegion("dummy", null);
final IndexManager imgr = new IndexManager(CacheUtils.getCache(), rgn);
((LocalRegion) rgn).setIndexManager(imgr);
String name = imgr.putCanonicalizedIteratorNameIfAbsent("dummy");
assertTrue(
"Error as the iterator name was expected as index_iter1 , but is actually " + name,
name.equals("index_iter1"));
Thread th1 = new Thread(new Runnable() {
@Override
public void run() {
IndexCreationInternalsJUnitTest.this.childThreadName1 =
imgr.putCanonicalizedIteratorNameIfAbsent("index_iter1.coll1");
}
});
Thread th2 = new Thread(new Runnable() {
@Override
public void run() {
IndexCreationInternalsJUnitTest.this.childThreadName2 =
imgr.putCanonicalizedIteratorNameIfAbsent("index_iter1.coll1");
}
});
th1.start();
th2.start();
name = imgr.putCanonicalizedIteratorNameIfAbsent("index_iter1.coll1");
ThreadUtils.join(th1, 30 * 1000);
ThreadUtils.join(th2, 30 * 1000);
if (!(name.equals(this.childThreadName1) && name.equals(this.childThreadName2))) {
fail("Canonicalization name generation test failed in concurrent scenario as first name is "
+ this.childThreadName1 + "and second is " + name + " and third is "
+ this.childThreadName2);
}
System.out.print(" Canonicalized name = " + name);
} catch (Exception e) {
fail("Exception in running the test " + e);
}
}
}