/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.query.sql.visitor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.lang.BetweenCriteria;
import org.teiid.query.sql.lang.CompareCriteria;
import org.teiid.query.sql.lang.Delete;
import org.teiid.query.sql.lang.GroupBy;
import org.teiid.query.sql.lang.Insert;
import org.teiid.query.sql.lang.IsNullCriteria;
import org.teiid.query.sql.lang.MatchCriteria;
import org.teiid.query.sql.lang.OrderBy;
import org.teiid.query.sql.lang.Query;
import org.teiid.query.sql.lang.SPParameter;
import org.teiid.query.sql.lang.Select;
import org.teiid.query.sql.lang.StoredProcedure;
import org.teiid.query.sql.lang.SubquerySetCriteria;
import org.teiid.query.sql.lang.UnaryFromClause;
import org.teiid.query.sql.lang.Update;
import org.teiid.query.sql.navigator.DeepPreOrderNavigator;
import org.teiid.query.sql.symbol.AliasSymbol;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.ExpressionSymbol;
import org.teiid.query.sql.symbol.Function;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Symbol;
public class TestStaticSymbolMappingVisitor extends TestCase {
// ################################## FRAMEWORK ################################
public TestStaticSymbolMappingVisitor(String name) {
super(name);
}
// ################################## TEST HELPERS ################################
private Map getSymbolMap() {
HashMap map = new HashMap();
map.put(exampleElement(true, 0), exampleElement(false, 0));
map.put(exampleElement(true, 1), exampleElement(false, 1));
map.put(exampleElement(true, 2), exampleElement(false, 2));
map.put(exampleGroup(true, 0), exampleGroup(false, 0));
map.put(exampleGroup(true, 1), exampleGroup(false, 1));
return map;
}
private ElementSymbol exampleElement(boolean old, int i) {
ElementSymbol element = null;
if(old) {
element = new ElementSymbol("OLDE" + i); //$NON-NLS-1$
} else {
element = new ElementSymbol("NEWE" + i); //$NON-NLS-1$
}
return element;
}
private GroupSymbol exampleGroup(boolean old, int i) {
if(old) {
return new GroupSymbol("OLDG" + i); //$NON-NLS-1$
}
return new GroupSymbol("NEWG" + i); //$NON-NLS-1$
}
private void helpTest(LanguageObject obj, Map symbolMap) {
// Get old elements and groups
List oldSymbols = (List) ElementCollectorVisitor.getElements(obj, false);
GroupCollectorVisitor.getGroups(obj, oldSymbols);
// Run symbol mapper
StaticSymbolMappingVisitor visitor = new StaticSymbolMappingVisitor(symbolMap);
DeepPreOrderNavigator.doVisit(obj, visitor);
// Get new elements and groups
List newSymbols = (List) ElementCollectorVisitor.getElements(obj, false);
GroupCollectorVisitor.getGroups(obj, newSymbols);
// Check number of elements and groups
assertEquals("Different number of symbols after mapping: ", oldSymbols.size(), newSymbols.size()); //$NON-NLS-1$
// Compare mapped elements
Iterator oldIter = oldSymbols.iterator();
Iterator newIter = newSymbols.iterator();
while(oldIter.hasNext()) {
Symbol oldSymbol = (Symbol) oldIter.next();
Symbol newSymbol = (Symbol) newIter.next();
Symbol expectedSymbol = (Symbol) symbolMap.get(oldSymbol);
assertEquals("Did not get correct mapped symbol: ", expectedSymbol, newSymbol); //$NON-NLS-1$
}
}
// ################################## ACTUAL TESTS ################################
public void testVisitCompareCriteria() {
CompareCriteria cc = new CompareCriteria(exampleElement(true, 0), CompareCriteria.EQ, exampleElement(true, 1));
helpTest(cc, getSymbolMap());
}
public void testVisitDelete1() {
Delete delete = new Delete(exampleGroup(true, 0));
helpTest(delete, getSymbolMap());
}
public void testVisitDelete2() {
Delete delete = new Delete(exampleGroup(true, 0));
delete.setCriteria(new CompareCriteria(exampleElement(true, 0), CompareCriteria.EQ, exampleElement(true, 1)));
helpTest(delete, getSymbolMap());
}
public void testVisitGroupBy() {
GroupBy gb = new GroupBy();
gb.addSymbol(exampleElement(true, 0));
gb.addSymbol(exampleElement(true, 1));
helpTest(gb, getSymbolMap());
}
public void testVisitInsert1() {
Insert insert = new Insert();
insert.setGroup(exampleGroup(true, 0));
List vars = new ArrayList();
vars.add(exampleElement(true, 0));
vars.add(exampleElement(true, 1));
insert.setVariables(vars);
List values = new ArrayList();
values.add(new Constant("abc")); //$NON-NLS-1$
values.add(new Constant("abc")); //$NON-NLS-1$
insert.setValues(values);
helpTest(insert, getSymbolMap());
}
public void testVisitInsert2() {
Insert insert = new Insert();
insert.setGroup(exampleGroup(true, 0));
List values = new ArrayList();
values.add(new Constant("abc")); //$NON-NLS-1$
values.add(new Constant("abc")); //$NON-NLS-1$
insert.setValues(values);
helpTest(insert, getSymbolMap());
}
public void testVisitIsNullCriteria() {
IsNullCriteria inc = new IsNullCriteria(exampleElement(true, 0));
helpTest(inc, getSymbolMap());
}
public void testVisitMatchCriteria() {
MatchCriteria mc = new MatchCriteria(exampleElement(true, 0), new Constant("abc")); //$NON-NLS-1$
helpTest(mc, getSymbolMap());
}
public void testVisitBetweenCriteria() {
BetweenCriteria bc = new BetweenCriteria(exampleElement(true, 0), new Constant(new Integer(1000)), new Constant(new Integer(2000)));
helpTest(bc, getSymbolMap());
}
public void testVisitOrderBy() {
OrderBy ob = new OrderBy();
ob.addVariable(exampleElement(true, 0));
ob.addVariable(exampleElement(true, 1));
ob.addVariable(new AliasSymbol("abc", exampleElement(true, 2))); //$NON-NLS-1$
helpTest(ob, getSymbolMap());
}
public void testVisitSelect1() {
Select select = new Select();
helpTest(select, getSymbolMap());
}
public void testVisitSelect2() {
Select select = new Select();
MultipleElementSymbol all = new MultipleElementSymbol();
select.addSymbol(all);
helpTest(select, getSymbolMap());
}
public void testVisitSelect3() {
Select select = new Select();
MultipleElementSymbol all = new MultipleElementSymbol();
all.addElementSymbol(exampleElement(true, 0));
select.addSymbol(all);
helpTest(select, getSymbolMap());
}
public void testVisitSelect4() {
Select select = new Select();
select.addSymbol( new ExpressionSymbol(
"x", new Function("length", new Expression[] {exampleElement(true, 0)})) ); //$NON-NLS-1$ //$NON-NLS-2$
select.addSymbol( new MultipleElementSymbol("abc.*") ); //$NON-NLS-1$
select.addSymbol( exampleElement(true, 1) );
helpTest(select,getSymbolMap());
}
public void testVisitSubquerySetCriteria() {
SubquerySetCriteria ssc = new SubquerySetCriteria();
ssc.setExpression(new Function("length", new Expression[] {exampleElement(true, 0)})); //$NON-NLS-1$
ssc.setCommand(new Query());
helpTest(ssc,getSymbolMap());
}
public void testVisitUnaryFromClause() {
UnaryFromClause ufc = new UnaryFromClause(exampleGroup(true, 0));
helpTest(ufc, getSymbolMap());
}
public void testVisitUpdate1() {
Update update = new Update();
update.setGroup(exampleGroup(true, 0));
update.addChange(exampleElement(true, 0), new Constant("abc")); //$NON-NLS-1$
update.addChange(exampleElement(true, 1), new Constant("abc")); //$NON-NLS-1$
helpTest(update, getSymbolMap());
}
public void testVisitUpdate2() {
Update update = new Update();
update.setGroup(exampleGroup(true, 0));
update.addChange(exampleElement(true, 0), new Constant("abc")); //$NON-NLS-1$
update.addChange(exampleElement(true, 1), new Constant("abc")); //$NON-NLS-1$
update.setCriteria(new CompareCriteria(exampleElement(true, 2), CompareCriteria.LT, new Constant("xyz"))); //$NON-NLS-1$
helpTest(update, getSymbolMap());
}
public void testVisitAliasSymbol() {
AliasSymbol as = new AliasSymbol("abc", exampleElement(true, 0)); //$NON-NLS-1$
helpTest(as, getSymbolMap());
}
public void testVisitAllSymbol() {
MultipleElementSymbol as = new MultipleElementSymbol();
ArrayList elements = new ArrayList();
elements.add(exampleElement(true, 0));
elements.add(exampleElement(true, 1));
as.setElementSymbols(elements);
helpTest(as, getSymbolMap());
}
public void testVisitMultipleElementSymbol() {
MultipleElementSymbol aigs = new MultipleElementSymbol("OLDG0.*"); //$NON-NLS-1$
ArrayList elements = new ArrayList();
elements.add(exampleElement(true, 0));
elements.add(exampleElement(true, 1));
aigs.setElementSymbols(elements);
helpTest(aigs, getSymbolMap());
}
public void testFunction1() {
Function f = new Function("concat", new Expression[] {}); //$NON-NLS-1$
helpTest(f, getSymbolMap());
}
public void testFunction2() {
Function f = new Function("concat", new Expression[] {exampleElement(true, 0), exampleElement(true, 1) }); //$NON-NLS-1$
helpTest(f, getSymbolMap());
}
public void testFunction3() {
Function f1 = new Function("concat", new Expression[] {exampleElement(true, 0), exampleElement(true, 1) }); //$NON-NLS-1$
Function f2 = new Function("length", new Expression[] { f1 }); //$NON-NLS-1$
helpTest(f2, getSymbolMap());
}
public void testMapMultipleElementSymbolName() {
MultipleElementSymbol aigs = new MultipleElementSymbol("OLDG0"); //$NON-NLS-1$
ArrayList<ElementSymbol> elements = new ArrayList<ElementSymbol>();
elements.add(exampleElement(true, 0));
elements.add(exampleElement(true, 1));
aigs.setElementSymbols(elements);
// Run symbol mapper
StaticSymbolMappingVisitor visitor = new StaticSymbolMappingVisitor(getSymbolMap());
DeepPreOrderNavigator.doVisit(aigs, visitor);
// Check name of all in group symbol
assertEquals("MultipleElementSymbol name did not get mapped correctly: ", "NEWG0.*", aigs.toString()); //$NON-NLS-1$ //$NON-NLS-2$
}
public void testExecName() {
StoredProcedure exec = new StoredProcedure();
exec.setProcedureName(exampleGroup(true, 1).getName());
exec.setProcedureID("proc"); //$NON-NLS-1$
// Run symbol mapper
StaticSymbolMappingVisitor visitor = new StaticSymbolMappingVisitor(getSymbolMap());
DeepPreOrderNavigator.doVisit(exec, visitor);
// Check that group got mapped
assertEquals("Procedure name did not get mapped correctly: ", exampleGroup(false, 1).getName(), exec.getProcedureName()); //$NON-NLS-1$
}
public void testExecParamElement() {
StoredProcedure exec = new StoredProcedure();
exec.setProcedureName("pm1.proc1"); //$NON-NLS-1$
exec.setProcedureID("proc"); //$NON-NLS-1$
SPParameter param1 = new SPParameter(1, exampleElement(true, 1));
exec.setParameter(param1);
// Run symbol mapper
StaticSymbolMappingVisitor visitor = new StaticSymbolMappingVisitor(getSymbolMap());
DeepPreOrderNavigator.doVisit(exec, visitor);
// Check that element got switched
assertEquals("Stored proc param did not get mapped correctly: ", exampleElement(false, 1), param1.getExpression()); //$NON-NLS-1$
}
public void testExecParamFunction() {
StoredProcedure exec = new StoredProcedure();
exec.setProcedureName("pm1.proc1"); //$NON-NLS-1$
exec.setProcedureID("proc"); //$NON-NLS-1$
Function f = new Function("length", new Expression[] { exampleElement(true, 1) }); //$NON-NLS-1$
SPParameter param1 = new SPParameter(1, f);
exec.setParameter(param1);
// Run symbol mapper
StaticSymbolMappingVisitor visitor = new StaticSymbolMappingVisitor(getSymbolMap());
DeepPreOrderNavigator.doVisit(exec, visitor);
// Check that element got switched
Function afterFunc = (Function) param1.getExpression();
assertEquals("Stored proc param did not get mapped correctly: ", exampleElement(false, 1), afterFunc.getArg(0)); //$NON-NLS-1$
}
public void testExecParamNestedFunction() {
StoredProcedure exec = new StoredProcedure();
exec.setProcedureName("pm1.proc1"); //$NON-NLS-1$
exec.setProcedureID("proc"); //$NON-NLS-1$
Function f = new Function("length", new Expression[] { exampleElement(true, 1) }); //$NON-NLS-1$
Function f2 = new Function("+", new Expression[] { f, new Constant(new Integer(1)) }); //$NON-NLS-1$
SPParameter param1 = new SPParameter(1, f2);
exec.setParameter(param1);
// Run symbol mapper
StaticSymbolMappingVisitor visitor = new StaticSymbolMappingVisitor(getSymbolMap());
DeepPreOrderNavigator.doVisit(exec, visitor);
// Check that element got switched
Function afterFunc = (Function) param1.getExpression();
Function innerFunc = (Function) afterFunc.getArgs()[0];
assertEquals("Stored proc param did not get mapped correctly: ", exampleElement(false, 1), innerFunc.getArg(0)); //$NON-NLS-1$
}
}