Newer
Older
package adql.query.constraint;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.util.Iterator;
import org.junit.BeforeClass;
import org.junit.Test;
import adql.query.ADQLList;
import adql.query.ADQLObject;
import adql.query.ADQLOrder;
import adql.query.ADQLQuery;
import adql.query.ClauseSelect;
import adql.query.constraint.In;
import adql.query.from.ADQLTable;
import adql.query.operand.ADQLColumn;
import adql.query.operand.ADQLOperand;
import adql.query.operand.StringConstant;
import adql.search.IReplaceHandler;
import adql.search.SimpleReplaceHandler;
import adql.translator.ADQLTranslator;
import adql.translator.PostgreSQLTranslator;
public class TestIN {
private static ADQLTranslator translator = null;
@BeforeClass
public static void setUpBeforeClass(){
translator = new PostgreSQLTranslator();
}
@Test
public void testIN(){
// Test with a simple list of values (here, string constants):
In myIn = new In(new ADQLColumn("typeObj"), new ADQLOperand[]{new StringConstant("galaxy"),new StringConstant("star"),new StringConstant("planet"),new StringConstant("nebula")}, true);
// check the ADQL:
assertEquals("typeObj NOT IN ('galaxy' , 'star' , 'planet' , 'nebula')", myIn.toADQL());
// check the SQL translation:
try{
assertEquals(myIn.toADQL(), translator.translate(myIn));
}catch(Exception ex){
ex.printStackTrace();
fail("This test should have succeeded because the IN statement is correct and theoretically well supported by the POSTGRESQL translator!");
}
// Test with a sub-query:
ADQLQuery subQuery = new ADQLQuery();
ClauseSelect select = subQuery.getSelect();
select.setDistinctColumns(true);
select.setLimit(10);
select.add(new ADQLColumn("typeObj"));
subQuery.setFrom(new ADQLTable("Objects"));
ADQLList<ADQLOrder> orderBy = subQuery.getOrderBy();
orderBy.add(new ADQLOrder(1));
myIn.setSubQuery(subQuery);
// check the ADQL:
assertEquals("typeObj NOT IN (SELECT DISTINCT TOP 10 typeObj\nFROM Objects\nORDER BY 1 ASC)", myIn.toADQL());
// check the SQL translation:
try{
assertEquals("typeObj NOT IN (SELECT DISTINCT typeObj AS \"typeObj\"\nFROM Objects\nORDER BY 1 ASC\nLimit 10)", translator.translate(myIn));
}catch(Exception ex){
ex.printStackTrace();
fail("This test should have succeeded because the IN statement is correct and theoretically well supported by the POSTGRESQL translator!");
}
// Test after replacement inside this IN statement:
gmantele
committed
IReplaceHandler sHandler = new SimpleReplaceHandler(true){
gmantele
committed
public boolean match(ADQLObject obj){
return (obj instanceof ADQLColumn) && ((ADQLColumn)obj).getColumnName().equals("typeObj");
}
@Override
gmantele
committed
public ADQLObject getReplacer(ADQLObject objToReplace){
return new ADQLColumn("type");
}
};
sHandler.searchAndReplace(myIn);
assertEquals(2, sHandler.getNbMatch());
assertEquals(sHandler.getNbMatch(), sHandler.getNbReplacement());
Iterator<ADQLObject> results = sHandler.iterator();
while(results.hasNext())
assertEquals("typeObj", results.next().toADQL());
assertEquals("type NOT IN (SELECT DISTINCT TOP 10 type\nFROM Objects\nORDER BY 1 ASC)", myIn.toADQL());