package org.xenei.jdbc4sparql.sparql; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.lang.reflect.Field; import java.sql.SQLDataException; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.xenei.jdbc4sparql.iface.Catalog; import org.xenei.jdbc4sparql.iface.Column; import org.xenei.jdbc4sparql.iface.ColumnDef; import org.xenei.jdbc4sparql.iface.Key; import org.xenei.jdbc4sparql.iface.KeySegment; 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.NameSegments; import org.xenei.jdbc4sparql.iface.name.SchemaName; import org.xenei.jdbc4sparql.iface.name.TableName; import org.xenei.jdbc4sparql.impl.NameUtils; import org.xenei.jdbc4sparql.impl.rdf.RdfCatalog; import org.xenei.jdbc4sparql.impl.virtual.VirtualCatalog; import org.xenei.jdbc4sparql.sparql.items.QueryColumnInfo; import org.xenei.jdbc4sparql.sparql.items.QueryItemCollection; import org.xenei.jdbc4sparql.sparql.items.QueryTableInfo; import org.xenei.jdbc4sparql.sparql.parser.SparqlParser; import org.xenei.jdbc4sparql.sparql.parser.jsqlparser.SparqlParserImpl; import org.xenei.jdbc4sparql.sparql.parser.jsqlparser.functions.FunctionColumn; import org.xenei.jdbc4sparql.sparql.parser.jsqlparser.functions.FunctionColumnDef; import org.xenei.jdbc4sparql.utils.ElementExtractor; import com.hp.hpl.jena.graph.NodeFactory; import com.hp.hpl.jena.graph.Triple; import com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.query.SortCondition; import com.hp.hpl.jena.sparql.core.TriplePath; import com.hp.hpl.jena.sparql.core.Var; import com.hp.hpl.jena.sparql.core.VarExprList; import com.hp.hpl.jena.sparql.expr.E_UUID; import com.hp.hpl.jena.sparql.expr.Expr; import com.hp.hpl.jena.sparql.expr.ExprAggregator; import com.hp.hpl.jena.sparql.expr.ExprVar; import com.hp.hpl.jena.sparql.expr.aggregate.AggCount; import com.hp.hpl.jena.sparql.expr.aggregate.Aggregator; import com.hp.hpl.jena.sparql.syntax.Element; import com.hp.hpl.jena.sparql.syntax.ElementBind; import com.hp.hpl.jena.sparql.syntax.ElementFilter; import com.hp.hpl.jena.sparql.syntax.ElementOptional; import com.hp.hpl.jena.sparql.syntax.ElementPathBlock; import com.hp.hpl.jena.sparql.syntax.ElementSubQuery; import com.hp.hpl.jena.sparql.syntax.ElementUnion; public class SparqlQueryBuilderTest { private Map<String, Catalog> catalogs; private SparqlParser parser; private SparqlQueryBuilder builder; private VirtualCatalog vCat; private Catalog catalog; private CatalogName catName; private Schema schema; private SchemaName sName; private Table table; private TableName tName; private Column column2; private ColumnName col2Name; private Column column; private ColumnName colName; private ColumnDef colDef; private List<Column> cols; @Before public void setup() { catName = new CatalogName("TestCatalog"); sName = catName.getSchemaName("testSchema"); tName = sName.getTableName("testTable"); colName = tName.getColumnName("testColumn"); col2Name = tName.getColumnName("testColumn2"); parser = new SparqlParserImpl(); catalog = mock(Catalog.class); when(catalog.getName()).thenReturn(catName); when(catalog.getShortName()).thenReturn(catName.getShortName()); catalogs = new HashMap<String, Catalog>(); catalogs.put("TestCatalog", catalog); vCat = new VirtualCatalog(); catalogs.put(VirtualCatalog.NAME, vCat); schema = mock(Schema.class); when(schema.getName()).thenReturn(sName); table = mock(Table.class); when(table.getName()).thenReturn(tName); when(table.hasQuerySegments()).thenReturn(true); when(table.getQuerySegmentFmt()).thenReturn("%1$s <a> 'table' . "); colDef = mock(ColumnDef.class); when(colDef.getType()).thenReturn(java.sql.Types.VARCHAR); column = mock(Column.class); when(column.getName()).thenReturn(colName); when(column.hasQuerySegments()).thenReturn(true); when(column.getQuerySegmentFmt()).thenReturn("%1$s <of> %2$s . "); when(column.getColumnDef()).thenReturn(colDef); when(table.getColumn(eq(colName.getShortName()))).thenReturn(column); column2 = mock(Column.class); when(column2.getName()).thenReturn(col2Name); when(column2.hasQuerySegments()).thenReturn(true); when(column2.getQuerySegmentFmt()).thenReturn("%1$s <of> %2$s . "); when(column2.getColumnDef()).thenReturn(colDef); when(column2.isOptional()).thenReturn(true); when(table.getColumn(eq(col2Name.getShortName()))).thenReturn(column2); cols = new ArrayList<Column>(); cols.add(column); cols.add(column2); when(table.getColumns()).thenAnswer(new ColumnAnswer(cols)); when(table.getColumnList()).thenReturn(cols); builder = new SparqlQueryBuilder(catalogs, parser, catalog, schema); } private static SparqlQueryBuilder createBuilder(final String tableName) { final CatalogName catName = new CatalogName("TestCatalog"); final SchemaName sName = catName.getSchemaName("testSchema"); final TableName tName = sName.getTableName(tableName); final ColumnName colName = tName.getColumnName("testColumn"); final ColumnName col2Name = tName.getColumnName("testColumn2"); final SparqlParserImpl parser = new SparqlParserImpl(); final RdfCatalog catalog = mock(RdfCatalog.class); when(catalog.getName()).thenReturn(catName); when(catalog.getShortName()).thenReturn(catName.getShortName()); final Map<String, Catalog> catalogs = new HashMap<String, Catalog>(); catalogs.put("TestCatalog", catalog); final Schema schema = mock(Schema.class); when(schema.getName()).thenReturn(sName); final Table table = mock(Table.class); when(table.getName()).thenReturn(tName); when(table.hasQuerySegments()).thenReturn(true); when(table.getQuerySegmentFmt()).thenReturn("%1$s <a> 'table' . "); final ColumnDef colDef = mock(ColumnDef.class); when(colDef.getType()).thenReturn(java.sql.Types.VARCHAR); final Column column = mock(Column.class); when(column.getName()).thenReturn(colName); when(column.hasQuerySegments()).thenReturn(true); when(column.getQuerySegmentFmt()).thenReturn("%1$s <of> %2$s . "); when(column.getColumnDef()).thenReturn(colDef); when(table.getColumn(eq(colName.getShortName()))).thenReturn(column); final Column column2 = mock(Column.class); when(column2.getName()).thenReturn(col2Name); when(column2.hasQuerySegments()).thenReturn(true); when(column2.getQuerySegmentFmt()).thenReturn("%1$s <of> %2$s . "); when(column2.getColumnDef()).thenReturn(colDef); when(column2.isOptional()).thenReturn(true); when(table.getColumn(eq(col2Name.getShortName()))).thenReturn(column2); final ArrayList<Column> cols = new ArrayList<Column>(); cols.add(column); cols.add(column2); when(table.getColumns()).thenAnswer(new ColumnAnswer(cols)); final SparqlQueryBuilder builder = new SparqlQueryBuilder(catalogs, parser, catalog, schema); builder.addTable(table, tName, false); return builder; } private static class ColumnAnswer implements Answer<Iterator<Column>> { List<Column> cols; ColumnAnswer(final List<Column> cols) { this.cols = cols; } @Override public Iterator<Column> answer(final InvocationOnMock invocation) throws Throwable { return cols.iterator(); } } private Query getQuery() throws Exception { final Field f = SparqlQueryBuilder.class.getDeclaredField("query"); f.setAccessible(true); return (Query) f.get(builder); } private QueryInfoSet getInfoSet() throws Exception { final Field f = SparqlQueryBuilder.class.getDeclaredField("infoSet"); f.setAccessible(true); return (QueryInfoSet) f.get(builder); } @Test public void testAddTable_Required() throws Exception { builder.addTable(table, tName, false); final QueryInfoSet infoSet = getInfoSet(); final QueryItemCollection<QueryTableInfo, Table, TableName> tableInfoList = infoSet .getTables(); assertEquals(1, tableInfoList.size()); final QueryTableInfo tableInfo = tableInfoList.get(0); assertEquals(tName, tableInfo.getName()); assertEquals(table, tableInfo.getTable()); assertEquals(false, tableInfo.isOptional()); assertEquals(table.getName().getGUID(), tName.getGUID()); } @Test public void testAddTable_WithAlias() throws Exception { final TableName alias = new TableName(catName.getCatalog(), sName.getSchema(), "tableAlias"); builder.addTable(table, alias, false); final QueryInfoSet infoSet = getInfoSet(); final QueryItemCollection<QueryTableInfo, Table, TableName> tableInfoList = infoSet .getTables(); assertEquals(1, tableInfoList.size()); final QueryTableInfo tableInfo = tableInfoList.get(0); assertEquals(alias, tableInfo.getName()); assertEquals(table, tableInfo.getTable()); assertEquals(false, tableInfo.isOptional()); assertEquals(table.getName().getGUID(), tName.getGUID()); // alias name GUID does not match assertNotEquals(table.getName().getGUID(), alias.getGUID()); // but GUID for table associated with alias does. final QueryTableInfo aliasTable = infoSet.getTable(alias); assertEquals(table.getName().getGUID(), aliasTable.getGUID()); } @Test public void testAddTable_Optional() throws Exception { builder.addTable(table, tName, true); final QueryInfoSet infoSet = getInfoSet(); final QueryItemCollection<QueryTableInfo, Table, TableName> tableInfoList = infoSet .getTables(); assertEquals(1, tableInfoList.size()); final QueryTableInfo tableInfo = tableInfoList.get(0); assertEquals(tName, tableInfo.getName()); assertEquals(table, tableInfo.getTable()); assertEquals(true, tableInfo.isOptional()); assertEquals(table.getName().getGUID(), tName.getGUID()); } @Test public void testAddRequiredColumns() throws Exception { builder.addTable(table, tName, false); builder.addDefinedColumns(); final QueryInfoSet infoSet = getInfoSet(); final QueryItemCollection<QueryTableInfo, Table, TableName> tableInfoList = infoSet .getTables(); assertEquals(1, tableInfoList.size()); final QueryTableInfo tableInfo = tableInfoList.get(0); assertEquals(tName, tableInfo.getName()); assertEquals(table, tableInfo.getTable()); final QueryItemCollection<QueryColumnInfo, Column, ColumnName> columnInfoList = infoSet .getColumns(); assertEquals(2, columnInfoList.size()); QueryColumnInfo columnInfo = columnInfoList.get(0); assertEquals(colName, columnInfo.getName()); assertEquals(column, columnInfo.getColumn()); columnInfo = columnInfoList.get(1); assertEquals(col2Name, columnInfo.getName()); assertEquals(column2, columnInfo.getColumn()); final Query query = getQuery(); final ElementExtractor extractor = new ElementExtractor( ElementPathBlock.class); query.getQueryPattern().visit(extractor); final List<Element> lst = extractor.getExtracted(); assertEquals(3, lst.size()); } @Test public void testAddColumnToQuery() throws Exception { builder.addTable(table, tName, false); builder.addDefinedColumns(); builder.setSegmentCount(); builder.addColumnToQuery(col2Name, true); QueryTableInfo tableInfo = builder.getTable(tName); builder.addVar(col2Name); final QueryInfoSet infoSet = getInfoSet(); final QueryItemCollection<QueryTableInfo, Table, TableName> tableInfoList = infoSet .getTables(); assertEquals(1, tableInfoList.size()); tableInfo = tableInfoList.get(0); assertEquals(tName, tableInfo.getName()); assertEquals(table, tableInfo.getTable()); final QueryItemCollection<QueryColumnInfo, Column, ColumnName> columnInfoList = new QueryItemCollection<QueryColumnInfo, Column, ColumnName>( infoSet.getColumns()); assertEquals(2, columnInfoList.size()); assertTrue(columnInfoList.contains(colName)); assertTrue(columnInfoList.contains(column)); assertTrue(columnInfoList.contains(col2Name)); assertTrue(columnInfoList.contains(column2)); final Query query = builder.build(); final ElementExtractor extractor = new ElementExtractor( ElementPathBlock.class); query.getQueryPattern().visit(extractor); List<Element> lst = extractor.getExtracted(); assertEquals(3, lst.size()); List<TriplePath> etb = ((ElementPathBlock) lst.get(0)).getPattern() .getList(); assertEquals(1, etb.size()); final Var tVar = Var.alloc(tName.getGUID()); TriplePath t = new TriplePath(new Triple(tVar, NodeFactory.createURI("a"), NodeFactory.createLiteral("table"))); assertTrue(etb.contains(t)); etb = ((ElementPathBlock) lst.get(1)).getPattern().getList(); assertEquals(1, etb.size()); t = new TriplePath(new Triple(tVar, NodeFactory.createURI("of"), Var.alloc(colName.getGUID()))); assertTrue(etb.contains(t)); etb = ((ElementPathBlock) lst.get(2)).getPattern().getList(); assertEquals(1, etb.size()); t = new TriplePath(new Triple(tVar, NodeFactory.createURI("of"), Var.alloc(col2Name.getGUID()))); assertTrue(etb.contains(t)); query.getQueryPattern().visit( extractor.setMatchType(ElementFilter.class).reset()); lst = extractor.getExtracted(); assertEquals(1, lst.size()); // final ExpressionExtractor eExtractor = new ExpressionExtractor( // CheckTypeF.class); // ((ElementFilter) lst.get(0)).getExpr().visit(eExtractor); // final List<Expr> eExpr = eExtractor.getExtracted(); // assertEquals(2, eExpr.size()); // ElementBind query.getQueryPattern().visit( extractor.setMatchType(ElementBind.class).reset()); lst = extractor.getExtracted(); assertEquals(1, lst.size()); } @Test public void testAddAlias() throws Exception { final ColumnName alias = new ColumnName("testCatalog", "testSchema", "testTable", "alias"); alias.setUsedSegments(NameSegments.FFFT); builder.addTable(table, tName, false); builder.addDefinedColumns(); builder.setSegmentCount(); builder.addAlias(col2Name, alias); builder.addVar(alias); final QueryInfoSet infoSet = getInfoSet(); final QueryItemCollection<QueryTableInfo, Table, TableName> tableInfoList = infoSet .getTables(); assertEquals(1, tableInfoList.size()); final QueryTableInfo tableInfo = tableInfoList.get(0); assertEquals(tName, tableInfo.getName()); assertEquals(table, tableInfo.getTable()); final QueryItemCollection<QueryColumnInfo, Column, ColumnName> columnInfoList = new QueryItemCollection<QueryColumnInfo, Column, ColumnName>( infoSet.getColumns()); assertEquals(3, columnInfoList.size()); assertTrue(columnInfoList.contains(colName)); assertTrue(columnInfoList.contains(column)); assertTrue(columnInfoList.contains(alias)); assertTrue(columnInfoList.contains(column2)); assertTrue(columnInfoList.contains(col2Name)); final Query query = builder.build(); final ElementExtractor extractor = new ElementExtractor( ElementBind.class); query.getQueryPattern().visit(extractor); final List<Element> lst = extractor.getExtracted(); assertEquals(1, lst.size()); assertEquals("alias", ((ElementBind) lst.get(0)).getVar().getName()); } @Test public void testAddFilter() throws Exception { final Query query = getQuery(); assertNull(query.getQueryPattern()); final Expr expr = new E_UUID(); builder.addFilter(expr); final ElementExtractor extractor = new ElementExtractor( ElementFilter.class); query.getQueryPattern().visit(extractor); final List<Element> eLst = extractor.getExtracted(); assertEquals(1, eLst.size()); } @Test public void testAddColumn() throws Exception { QueryColumnInfo columnInfo = null; try { columnInfo = builder.addColumn(col2Name, true); fail("Should have thrown SQLException"); } catch (final SQLException e) { // expected } final QueryTableInfo tableInfo = builder.addTable(table, tName, false); columnInfo = builder.addColumn(col2Name, true); assertNotNull(columnInfo); assertEquals(col2Name, columnInfo.getName()); final QueryInfoSet infoSet = getInfoSet(); assertNotNull(infoSet.getColumn(col2Name)); final Query query = getQuery(); final ElementExtractor extractor = new ElementExtractor( ElementOptional.class); query.getQueryPattern().visit(extractor); List<Element> eLst = extractor.getExtracted(); assertEquals(1, eLst.size()); eLst.get(0).visit( extractor.reset().setMatchType(ElementPathBlock.class)); eLst = extractor.getExtracted(); assertEquals(1, eLst.size()); final ElementPathBlock epb = (ElementPathBlock) eLst.get(0); final List<TriplePath> tLst = epb.getPattern().getList(); assertEquals(1, tLst.size()); final Triple t = tLst.get(0).asTriple(); final Triple t2 = new Triple(tableInfo.getGUIDVar(), NodeFactory.createURI("of"), columnInfo.getGUIDVar()); assertEquals(t2, t); } @Test public void testAddGroupBy() throws Exception { final Query query = getQuery(); assertEquals(0, query.getGroupBy().size()); final Expr expr = new E_UUID(); ; builder.addGroupBy(expr); final VarExprList eLst = query.getGroupBy(); assertEquals(1, eLst.size()); final Var v = eLst.getVars().get(0); final Expr e = eLst.getExpr(v); assertEquals(expr, e); } @Test public void testAddOrderBy() throws Exception { final Query query = getQuery(); assertNull(query.getOrderBy()); final Expr expr = new E_UUID(); builder.addOrderBy(expr, true); final List<SortCondition> eLst = query.getOrderBy(); assertEquals(1, eLst.size()); final SortCondition sc = eLst.get(0); assertEquals(expr, sc.getExpression()); assertEquals(Query.ORDER_ASCENDING, sc.getDirection()); } @Test public void testAddUnion() throws Exception { final List<SparqlQueryBuilder> builders = new ArrayList<SparqlQueryBuilder>(); final SparqlQueryBuilder builder1 = createBuilder("table1"); builder1.addDefinedColumns(); builder1.setAllColumns(); final SparqlQueryBuilder builder2 = createBuilder("table2"); builder2.addDefinedColumns(); builder2.setAllColumns(); builders.add(builder1); builders.add(builder2); builder.addUnion(builders); final Query query = getQuery(); final ElementExtractor extractor = new ElementExtractor( ElementUnion.class); query.getQueryPattern().visit(extractor); List<Element> lst = extractor.getExtracted(); assertEquals(1, lst.size()); query.getQueryPattern().visit( extractor.reset().setMatchType(ElementSubQuery.class)); lst = extractor.getExtracted(); assertEquals(2, lst.size()); } @Test public void testUsing() throws Exception { // setup a second table final TableName tName2 = sName.getTableName("testTable2"); final ColumnName colName_2 = tName2.getColumnName("testColumn"); final ColumnName col2Name_2 = tName2.getColumnName("testColumn2"); final Column column_2 = mock(Column.class); when(column_2.getName()).thenReturn(colName_2); when(column_2.hasQuerySegments()).thenReturn(true); when(column_2.getQuerySegmentFmt()).thenReturn("%1$s <of> %2$s . "); when(column_2.getColumnDef()).thenReturn(colDef); final Column column2_2 = mock(Column.class); when(column2_2.getName()).thenReturn(col2Name_2); when(column2_2.hasQuerySegments()).thenReturn(true); when(column2_2.getQuerySegmentFmt()).thenReturn("%1$s <of> %2$s . "); when(column2_2.getColumnDef()).thenReturn(colDef); when(column2_2.isOptional()).thenReturn(true); final Table table2 = mock(Table.class); when(table2.getName()).thenReturn(tName2); when(table2.getQuerySegmentFmt()).thenReturn("%1$s <a> 'table' . "); when(table2.getColumn(eq(colName_2.getShortName()))).thenReturn( column_2); when(table2.getColumn(eq(col2Name_2.getShortName()))).thenReturn( column2_2); final List<Column> cols_2 = new ArrayList<Column>(); cols_2.add(column_2); cols_2.add(column2_2); when(table2.getColumns()).thenAnswer(new ColumnAnswer(cols_2)); when(table2.getColumnList()).thenReturn(cols_2); // setup complete builder.addTable(table, tName, false); builder.addTable(table2, tName2, false); builder.addUsing(colName.getShortName()); builder.addDefinedColumns(); builder.setAllColumns(); final Field f = SparqlQueryBuilder.class .getDeclaredField("columnsInUsing"); f.setAccessible(true); final List<String> inUsing = (List<String>) f.get(builder); assertEquals(1, inUsing.size()); assertEquals(colName.getShortName(), inUsing.get(0)); final Query query = builder.build(); // fail("incomplete Test"); } @Test public void testAddVar_ColumnName() throws Exception { final Query query = getQuery(); assertEquals(0, query.getProjectVars().size()); builder.addTable(table, tName, true); builder.addVar(colName); final List<Var> vLst = query.getProjectVars(); assertEquals(1, vLst.size()); assertEquals(Var.alloc(colName.getSPARQLName()), vLst.get(0)); final VarExprList eLst = query.getProject(); assertEquals(1, eLst.size()); final Var v = eLst.getVars().get(0); final Expr e = eLst.getExpr(v); assertNull(e); assertEquals(Var.alloc(colName.getSPARQLName()), v); } @Test public void testAddVar_Expr_String() throws Exception { final Query query = getQuery(); assertEquals(0, query.getProjectVars().size()); final Expr expr = new E_UUID(); builder.addVar(expr, "foo"); final List<Var> vLst = query.getProjectVars(); assertEquals(1, vLst.size()); assertEquals(Var.alloc("foo"), vLst.get(0)); final VarExprList eLst = query.getProject(); assertEquals(1, eLst.size()); final Var v = eLst.getVars().get(0); final Expr e = eLst.getExpr(v); assertEquals(expr, e); assertEquals(Var.alloc("foo"), v); } @Test public void testAddVar_Expr_ColumnName() throws Exception { final Query query = getQuery(); assertEquals(0, query.getProjectVars().size()); final Expr expr = new E_UUID(); final ColumnName alias = new ColumnName("", "", "", "alias"); alias.setUsedSegments(NameSegments.FFFT); builder.registerFunctionColumn(alias, java.sql.Types.INTEGER); builder.addVar(expr, alias); final List<Var> vLst = query.getProjectVars(); assertEquals(1, vLst.size()); assertEquals(Var.alloc(alias.getSPARQLName()), vLst.get(0)); final VarExprList eLst = query.getProject(); assertEquals(1, eLst.size()); final Var v = eLst.getVars().get(0); final Expr e = eLst.getExpr(v); assertEquals(expr, e); assertEquals(Var.alloc(alias.getSPARQLName()), v); } @Test public void testRegisterFunctionColumn() throws Exception { final ColumnName cName = new ColumnName("", "", "", "func"); final QueryColumnInfo columnInfo = builder.registerFunctionColumn( cName, java.sql.Types.INTEGER); final QueryInfoSet infoSet = getInfoSet(); final QueryItemCollection<QueryColumnInfo, Column, ColumnName> cols = infoSet .getColumns(); assertEquals(1, cols.size()); assertEquals(columnInfo, cols.get(0)); final Column col = cols.get(0).getColumn(); assertTrue(col instanceof FunctionColumn); final ColumnDef cd = col.getColumnDef(); assertTrue(cd instanceof FunctionColumnDef); assertEquals(java.sql.Types.INTEGER, cd.getType()); assertFalse(col.hasQuerySegments()); } @Test public void testRegisterFunction() throws Exception { final ColumnName cName = new ColumnName("", "", "", "func"); final QueryColumnInfo columnInfo = builder.registerFunction(cName, java.sql.Types.INTEGER); final QueryInfoSet infoSet = getInfoSet(); final QueryItemCollection<QueryColumnInfo, Column, ColumnName> cols = infoSet .getColumns(); assertEquals(1, cols.size()); assertEquals(columnInfo, cols.get(0)); final Column col = cols.get(0).getColumn(); assertTrue(col instanceof FunctionColumn); final ColumnDef cd = col.getColumnDef(); assertTrue(cd instanceof FunctionColumnDef); assertEquals(java.sql.Types.INTEGER, cd.getType()); assertFalse(col.hasQuerySegments()); } @Test public void testRegister() throws Exception { final Aggregator agg = new AggCount(); final ExprAggregator expr = builder.register(agg, java.sql.Types.INTEGER, "alias"); assertEquals(agg, expr.getAggregator()); final QueryInfoSet infoSet = getInfoSet(); final QueryItemCollection<QueryColumnInfo, Column, ColumnName> cols = infoSet .getColumns(); assertEquals(1, cols.size()); assertEquals("alias", cols.get(0).getVar().getName()); final Column col = cols.get(0).getColumn(); assertTrue(col instanceof FunctionColumn); final ColumnDef cd = col.getColumnDef(); assertTrue(cd instanceof FunctionColumnDef); assertEquals(java.sql.Types.INTEGER, cd.getType()); assertFalse(col.hasQuerySegments()); } @Test public void testGetCatalog() { final Catalog cat = builder.getCatalog(); assertNotNull(cat); assertEquals(catalog, cat); } @Test public void testGetCatalogName() { final String s = builder.getCatalogName(); assertNotNull(s); assertEquals(catName.getCatalog(), s); } @Test public void testGetCatalog_String() { final Catalog cat = builder.getCatalog(VirtualCatalog.NAME); assertNotNull(cat); assertEquals(vCat, cat); } @Test public void testGetColumn_ColumnName() throws SQLDataException { builder.addTable(table, tName, false); builder.addDefinedColumns(); final QueryColumnInfo columnInfo = builder.getColumn(colName); assertNotNull(columnInfo); assertEquals(colName, columnInfo.getName()); assertEquals(column, columnInfo.getColumn()); } @Test public void testGetColumnCount() throws Exception { builder.addTable(table, tName, false); builder.addDefinedColumns(); builder.setAllColumns(); builder.build(); assertEquals(2, builder.getColumnCount()); } @Test public void testGetColumn_Int() throws Exception { builder.addTable(table, tName, false); builder.addDefinedColumns(); builder.setAllColumns(); builder.build(); final QueryColumnInfo columnInfo = builder.getColumn(0); assertNotNull(columnInfo); assertEquals(colName.getGUID(), columnInfo.getGUID()); assertEquals(column, columnInfo.getColumn()); } @Test public void testGetColumnIndex() throws Exception { builder.addTable(table, tName, false); builder.addDefinedColumns(); builder.setAllColumns(); builder.build(); final int i = builder.getColumnIndex(colName.getSPARQLName()); assertEquals(0, i); } @Test public void testGetDefaultSchemaName() { final String s = builder.getDefaultSchemaName(); assertNotNull(s); assertEquals(sName.getShortName(), s); } @Test public void testGetDefaultSchema() { final Schema s = builder.getDefaultSchema(); assertNotNull(s); assertEquals(schema, s); } @Test public void testGetDefaultTableName() { String s = builder.getDefaultTableName(); assertNull(s); builder.addTable(table, tName, false); s = builder.getDefaultTableName(); assertNotNull(s); assertEquals(table.getName().getShortName(), s); // create a second table final Table table2 = mock(Table.class); when(table2.getName()).thenReturn(sName.getTableName("table2")); when(table2.hasQuerySegments()).thenReturn(false); builder.addTable(table2, table2.getName(), false); s = builder.getDefaultTableName(); assertNull(s); } @Test public void testGetSegments() { NameSegments s = builder.getSegments(); assertNotNull(s); assertEquals(NameSegments.ALL, s); builder.addTable(table, tName, false); s = builder.getSegments(); assertNotNull(s); assertEquals(NameSegments.ALL, s); builder.addColumnToQuery(colName, false); s = builder.getSegments(); assertNotNull(s); assertEquals(NameSegments.ALL, s); builder.setSegmentCount(); s = builder.getSegments(); assertNotNull(s); assertEquals(NameSegments.FFFT, s); } @Test public void testGetTable() { assertNull(builder.getTable(tName)); builder.addTable(table, tName, false); final QueryTableInfo tableInfo = builder.getTable(tName); assertNotNull(tableInfo); assertEquals(tName, tableInfo.getName()); assertEquals(table, tableInfo.getTable()); } @Test public void testSetAllColumns() throws Exception { builder.addTable(table, tName, false); builder.addDefinedColumns(); builder.setAllColumns(); final QueryInfoSet infoSet = getInfoSet(); assertEquals(2, infoSet.getColumns().size()); final Iterator<Column> cols = table.getColumns(); while (cols.hasNext()) { assertNotNull(infoSet.getColumn(cols.next().getName())); } } @Test public void testSetDistinct() throws Exception { final Query query = getQuery(); assertFalse(query.isDistinct()); builder.setDistinct(); assertTrue(query.isDistinct()); } @Test public void testSetHaving() throws Exception { final Query query = getQuery(); final Expr expr = new E_UUID(); builder.setHaving(expr); assertNotNull(query.getHavingExprs()); assertEquals(1, query.getHavingExprs().size()); assertEquals(expr, query.getHavingExprs().get(0)); } @Test public void testSetKey() throws Exception { builder.addTable(table, tName, false); builder.addDefinedColumns(); builder.setAllColumns(); final KeySegment segment = new KeySegment() { @Override public int compare(final Comparable<Object>[] o1, final Comparable<Object>[] o2) { return Utils.compare(getIdx(), isAscending(), o1, o2); } @Override public String getId() { return "TestKeySegment"; } @Override public short getIdx() { return 0; } @Override public boolean isAscending() { return true; } }; final Key key = new Key<KeySegment>() { @Override public int compare(final Comparable<Object>[] o1, final Comparable<Object>[] o2) { return Utils.compare(getSegments(), o1, o2); } @Override public String getId() { return "TestKey"; } @Override public String getKeyName() { // TODO Auto-generated method stub return null; } @Override public List<KeySegment> getSegments() { return Arrays.asList(new KeySegment[] { segment }); } @Override public boolean isUnique() { return true; } }; builder.setKey(key); final Query query = getQuery(); assertTrue(query.isDistinct()); final List<SortCondition> lst = query.getOrderBy(); assertEquals(1, lst.size()); final SortCondition sc = lst.get(0); assertEquals(Query.ORDER_ASCENDING, sc.getDirection()); assertEquals(new ExprVar(colName.getSPARQLName()), sc.getExpression()); } @Test public void testSetLimit() throws Exception { final Query query = getQuery(); assertEquals(Query.NOLIMIT, query.getLimit()); builder.setLimit(5L); assertEquals(5L, query.getLimit()); builder.setLimit(Query.NOLIMIT); assertEquals(Query.NOLIMIT, query.getLimit()); } @Test public void testSetOffset() throws Exception { final Query query = getQuery(); assertEquals(Query.NOLIMIT, query.getOffset()); builder.setOffset(5L); assertEquals(5L, query.getOffset()); builder.setOffset(Query.NOLIMIT); assertEquals(Query.NOLIMIT, query.getOffset()); } @Test public void testSetOrderBy() throws Exception { builder.addTable(table, tName, false); builder.addDefinedColumns(); builder.setAllColumns(); final KeySegment segment = new KeySegment() { @Override public int compare(final Comparable<Object>[] o1, final Comparable<Object>[] o2) { return Utils.compare(getIdx(), isAscending(), o1, o2); } @Override public String getId() { return "TestKeySegment"; } @Override public short getIdx() { return 0; } @Override public boolean isAscending() { return true; } }; final Key key = new Key<KeySegment>() { @Override public int compare(final Comparable<Object>[] o1, final Comparable<Object>[] o2) { return Utils.compare(getSegments(), o1, o2); } @Override public String getId() { return "TestKey"; } @Override public String getKeyName() { // TODO Auto-generated method stub return null; } @Override public List<KeySegment> getSegments() { return Arrays.asList(new KeySegment[] { segment }); } @Override public boolean isUnique() { return true; } }; builder.setOrderBy(key); final Query query = getQuery(); assertFalse(query.isDistinct()); final List<SortCondition> lst = query.getOrderBy(); assertEquals(1, lst.size()); final SortCondition sc = lst.get(0); assertEquals(Query.ORDER_ASCENDING, sc.getDirection()); assertEquals(new ExprVar(colName.getSPARQLName()), sc.getExpression()); } @Test public void testSetGUID() throws Exception { final QueryInfoSet infoSet = getInfoSet(); assertFalse(infoSet.useGUID()); builder.setUseGUID(true); assertTrue(infoSet.useGUID()); builder.setUseGUID(false); assertFalse(infoSet.useGUID()); } @Test public void testGetColumn_Node() throws Exception { final Var n = Var.alloc("testColumn"); try { builder.getColumn(n); fail("Should have thrown IllegalArgumentException"); } catch (final IllegalArgumentException expected) { } final QueryTableInfo tableInfo = builder.addTable(table, tName, false); builder.addTableColumns(tableInfo); builder.setAllColumns(); // reset for size final QueryColumnInfo columnInfo = builder.getColumn(n); assertEquals(colName.getSPARQLName(), columnInfo.getName() .getSPARQLName()); assertEquals(column, columnInfo.getColumn()); } @Test public void testGetTable_Node() throws Exception { final Var n = Var.alloc("testSchema" + NameUtils.SPARQL_DOT + "testTable"); assertNull(builder.getTable(n)); final QueryTableInfo tableInfo = builder.addTable(table, tName, false); builder.addTableColumns(tableInfo); builder.setAllColumns(); // reset for size final QueryTableInfo tableInfo2 = builder.getTable(n); assertEquals(tableInfo, tableInfo2); assertEquals(tName, tableInfo2.getName()); assertEquals(table, tableInfo2.getTable()); } @Test public void testGetResultColumns() throws SQLException { List<QueryColumnInfo> lst = builder.getResultColumns(); assertNotNull(lst); assertTrue(lst.isEmpty()); final QueryTableInfo tableInfo = builder.addTable(table, tName, false); builder.addTableColumns(tableInfo); builder.setAllColumns(); // lst = builder.getResultColumns(); // assertTrue( lst.isEmpty() ); // // builder.build(); lst = builder.getResultColumns(); assertEquals(2, lst.size()); } }