package org.xenei.jdbc4sparql.sparql.parser.jsqlparser.functions;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jsqlparser.expression.DoubleValue;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import org.junit.Before;
import org.junit.Test;
import org.xenei.jdbc4sparql.iface.Catalog;
import org.xenei.jdbc4sparql.iface.Schema;
import org.xenei.jdbc4sparql.iface.Table;
import org.xenei.jdbc4sparql.iface.name.CatalogName;
import org.xenei.jdbc4sparql.iface.name.ColumnName;
import org.xenei.jdbc4sparql.iface.name.SchemaName;
import org.xenei.jdbc4sparql.iface.name.TableName;
import org.xenei.jdbc4sparql.impl.virtual.VirtualCatalog;
import org.xenei.jdbc4sparql.sparql.QueryInfoSet;
import org.xenei.jdbc4sparql.sparql.SparqlQueryBuilder;
import org.xenei.jdbc4sparql.sparql.items.QueryColumnInfo;
import org.xenei.jdbc4sparql.sparql.parser.SparqlParser;
import org.xenei.jdbc4sparql.sparql.parser.jsqlparser.SparqlExprVisitor;
import org.xenei.jdbc4sparql.sparql.parser.jsqlparser.SparqlExprVisitor.AliasInfo;
import org.xenei.jdbc4sparql.sparql.parser.jsqlparser.SparqlExprVisitor.ExprColumn;
import org.xenei.jdbc4sparql.sparql.parser.jsqlparser.proxies.ExprInfo;
import com.hp.hpl.jena.sparql.expr.E_NumAbs;
import com.hp.hpl.jena.sparql.expr.E_NumCeiling;
import com.hp.hpl.jena.sparql.expr.E_NumFloor;
import com.hp.hpl.jena.sparql.expr.E_NumRound;
import com.hp.hpl.jena.sparql.expr.E_Random;
import com.hp.hpl.jena.sparql.expr.Expr;
import com.hp.hpl.jena.sparql.expr.ExprAggregator;
import com.hp.hpl.jena.sparql.expr.aggregate.AggCountVar;
import com.hp.hpl.jena.sparql.expr.aggregate.AggMax;
import com.hp.hpl.jena.sparql.expr.aggregate.AggMin;
import com.hp.hpl.jena.sparql.expr.aggregate.AggSum;
import com.hp.hpl.jena.sparql.expr.aggregate.Aggregator;
import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueDouble;
public class NumericFunctionHandlerTests {
private NumericFunctionHandler handler;
private List<Expression> lst2;
private ExpressionList expressionList;
private SparqlQueryBuilder queryBuilder;
private QueryInfoSet queryInfoSet;
private QueryColumnInfo columnInfo;
private ColumnName columnName;
private TableName tableName;
private net.sf.jsqlparser.schema.Column col;
private net.sf.jsqlparser.schema.Table tbl;
private Function func;
private Map<String, Catalog> catalogs;
private Catalog catalog;
private CatalogName catalogName;
private Schema schema;
private SchemaName schemaName;
private AliasInfo alias;
public NumericFunctionHandlerTests() {
}
@Before
public void setup() throws Exception {
tbl = new net.sf.jsqlparser.schema.Table("testSchema", "testTable");
col = new net.sf.jsqlparser.schema.Column(tbl, "testCol");
columnName = new ColumnName("testCatalog", "testSchema", "testTable",
"testCol");
final org.xenei.jdbc4sparql.iface.Column column = mock(org.xenei.jdbc4sparql.iface.Column.class);
when(column.getName()).thenReturn(columnName);
columnInfo = new QueryColumnInfo(column);
queryInfoSet = new QueryInfoSet();
queryInfoSet.addColumn(columnInfo);
tableName = columnName.getTableName();
org.xenei.jdbc4sparql.iface.Table table = mock(org.xenei.jdbc4sparql.iface.Table.class);
when(table.getName()).thenReturn(tableName);
catalogs = new HashMap<String, Catalog>();
final SparqlParser parser = mock(SparqlParser.class);
catalog = mock(Catalog.class);
catalogName = new CatalogName("testCatalog");
when(catalog.getName()).thenReturn(catalogName);
when(catalog.getShortName()).thenReturn("testCatalog");
catalogs.put("testCatalog", catalog);
catalogs.put(VirtualCatalog.NAME, new VirtualCatalog());
schema = mock(Schema.class);
schemaName = catalogName.getSchemaName("testSchema");
when(schema.getName()).thenReturn(schemaName);
table = mock(Table.class);
final TableName tableName = schemaName.getTableName("testTable");
when(table.getColumn(eq("testCol"))).thenReturn(column);
queryBuilder = new SparqlQueryBuilder(catalogs, parser, catalog, schema);
queryBuilder.addTable(table, tableName, false);
final SparqlExprVisitor visitor = new SparqlExprVisitor(queryBuilder,
false, false);
alias = visitor.new AliasInfo("Alias", false);
func = new Function();
handler = new NumericFunctionHandler(queryBuilder);
lst2 = new ArrayList<Expression>();
expressionList = new ExpressionList(lst2);
}
@Test
public void testAbsFunction() throws SQLException {
func.setName("abs");
lst2.add(new DoubleValue("2.5"));
func.setParameters(expressionList);
final ExprInfo exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
final Expr expr = exprInfo.getExpr();
assertTrue(expr instanceof E_NumAbs);
final E_NumAbs expr2 = (E_NumAbs) expr;
final List<Expr> lst = expr2.getArgs();
assertEquals(1, lst.size());
assertTrue(lst.get(0) instanceof NodeValueDouble);
final NodeValueDouble n = (NodeValueDouble) lst.get(0);
assertEquals(Double.valueOf(2.5), Double.valueOf(n.getDouble()));
}
@Test
public void testCeilFunction() throws SQLException {
func.setName("ceil");
lst2.add(new DoubleValue("2.5"));
func.setParameters(expressionList);
final ExprInfo exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
final Expr expr = exprInfo.getExpr();
assertTrue(expr instanceof E_NumCeiling);
final E_NumCeiling expr2 = (E_NumCeiling) expr;
final List<Expr> lst = expr2.getArgs();
assertEquals(1, lst.size());
assertTrue(lst.get(0) instanceof NodeValueDouble);
final NodeValueDouble n = (NodeValueDouble) lst.get(0);
assertEquals(Double.valueOf(2.5), Double.valueOf(n.getDouble()));
}
@Test
public void testCountFunction() throws SQLException {
func.setName("count");
lst2.add(col);
func.setParameters(expressionList);
final ExprInfo exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
final Expr expr = exprInfo.getExpr();
assertTrue(expr instanceof ExprAggregator);
final ExprAggregator agg = (ExprAggregator) expr;
assertTrue(agg.getAggregator() instanceof AggCountVar);
final Aggregator agg2 = agg.getAggregator();
final Expr expr2 = agg2.getExpr();
assertTrue(expr2 instanceof ExprColumn);
assertEquals(columnName, ((ExprColumn) expr2).getColumnInfo().getName());
}
@Test
public void testFloorFunction() throws SQLException {
func.setName("floor");
lst2.add(new DoubleValue("2.5"));
func.setParameters(expressionList);
final ExprInfo exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
final Expr expr = exprInfo.getExpr();
assertTrue(expr instanceof E_NumFloor);
final E_NumFloor expr2 = (E_NumFloor) expr;
final List<Expr> lst = expr2.getArgs();
assertEquals(1, lst.size());
assertTrue(lst.get(0) instanceof NodeValueDouble);
final NodeValueDouble n = (NodeValueDouble) lst.get(0);
assertEquals(Double.valueOf(2.5), Double.valueOf(n.getDouble()));
}
@Test
public void testMaxFunction() throws SQLException {
func.setName("max");
lst2.add(col);
func.setParameters(expressionList);
final ExprInfo exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
final Expr expr = exprInfo.getExpr();
assertTrue(expr instanceof ExprAggregator);
final ExprAggregator agg = (ExprAggregator) expr;
assertTrue(agg.getAggregator() instanceof AggMax);
final Aggregator agg2 = agg.getAggregator();
final Expr expr2 = agg2.getExpr();
assertTrue(expr2 instanceof ExprColumn);
assertEquals(columnName, ((ExprColumn) expr2).getColumnInfo().getName());
}
@Test
public void testMinFunction() throws SQLException {
func.setName("min");
lst2.add(col);
func.setParameters(expressionList);
final ExprInfo exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
final Expr expr = exprInfo.getExpr();
assertTrue(expr instanceof ExprAggregator);
final ExprAggregator agg = (ExprAggregator) expr;
assertTrue(agg.getAggregator() instanceof AggMin);
final Aggregator agg2 = agg.getAggregator();
final Expr expr2 = agg2.getExpr();
assertTrue(expr2 instanceof ExprColumn);
assertEquals(columnName, ((ExprColumn) expr2).getColumnInfo().getName());
}
@Test
public void testRandFunction() throws SQLException {
func.setName("rand");
// func.setParameters(expressionList);
final ExprInfo exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
final Expr expr = exprInfo.getExpr();
assertTrue(expr instanceof E_Random);
final E_Random expr2 = (E_Random) expr;
final List<Expr> lst = expr2.getArgs();
assertEquals(0, lst.size());
}
@Test
public void testRoundFunction() throws SQLException {
func.setName("round");
lst2.add(new DoubleValue("2.5"));
func.setParameters(expressionList);
final ExprInfo exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
final Expr expr = exprInfo.getExpr();
assertTrue(expr instanceof E_NumRound);
final E_NumRound expr2 = (E_NumRound) expr;
final List<Expr> lst = expr2.getArgs();
assertEquals(1, lst.size());
assertTrue(lst.get(0) instanceof NodeValueDouble);
final NodeValueDouble n = (NodeValueDouble) lst.get(0);
assertEquals(Double.valueOf(2.5), Double.valueOf(n.getDouble()));
}
@Test
public void testSumFunction() throws SQLException {
func.setName("sum");
lst2.add(col);
func.setParameters(expressionList);
final ExprInfo exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
final Expr expr = exprInfo.getExpr();
assertTrue(expr instanceof ExprAggregator);
final ExprAggregator agg = (ExprAggregator) expr;
assertTrue(agg.getAggregator() instanceof AggSum);
final Aggregator agg2 = agg.getAggregator();
final Expr expr2 = agg2.getExpr();
assertTrue(expr2 instanceof ExprColumn);
assertEquals(columnName, ((ExprColumn) expr2).getColumnInfo().getName());
}
}