package org.xenei.jdbc4sparql.sparql; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; 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.sql.SQLDataException; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.junit.Before; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.xenei.jdbc4sparql.iface.Column; import org.xenei.jdbc4sparql.iface.ColumnDef; 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.ItemName; 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.sparql.items.QueryColumnInfo; import org.xenei.jdbc4sparql.sparql.items.QueryItemCollection; import org.xenei.jdbc4sparql.sparql.items.QueryTableInfo; import org.xenei.jdbc4sparql.utils.ElementExtractor; import com.hp.hpl.jena.graph.NodeFactory; import com.hp.hpl.jena.sparql.core.TriplePath; import com.hp.hpl.jena.sparql.core.Var; import com.hp.hpl.jena.sparql.syntax.ElementGroup; import com.hp.hpl.jena.sparql.syntax.ElementPathBlock; public class QueryInfoSetTest { private QueryInfoSet queryInfo; private Column column; private ColumnName cName; private Table table; private TableName tName; private Column column2; private ColumnName cName2; private Table table2; private TableName tName2; private List<Column> cols2; @Before public void setup() { queryInfo = new QueryInfoSet(); column = mock(Column.class); cName = new ColumnName("catalog", "schema", "table", "column"); when(column.getName()).thenReturn(cName); when(column.getQuerySegmentFmt()).thenReturn(" { %s <b> %s } "); when(column.hasQuerySegments()).thenReturn(true); final ColumnDef colDef = mock(ColumnDef.class); when(column.getColumnDef()).thenReturn(colDef); when(colDef.getType()).thenReturn(java.sql.Types.VARCHAR); table = mock(Table.class); tName = new TableName("catalog", "schema", "table"); when(table.getName()).thenReturn(tName); when(table.getQuerySegmentFmt()).thenReturn("{ ?tbl <a> %s }"); when(table.getColumn(eq("column"))).thenReturn(column); final List<Column> cols = new ArrayList<Column>(); cols.add(column); when(table.getColumns()).thenAnswer(new ColumnAnswer(cols)); column2 = mock(Column.class); cName2 = new ColumnName("catalog", "schema2", "table", "column"); when(column2.getName()).thenReturn(cName2); when(column2.getQuerySegmentFmt()).thenReturn(" { %s <b> %s } "); when(column2.hasQuerySegments()).thenReturn(true); table2 = mock(Table.class); tName2 = new TableName("catalog", "schema2", "table"); when(table2.getName()).thenReturn(tName2); when(table2.getQuerySegmentFmt()).thenReturn("{ ?tbl <a> %s }"); when(table2.getColumn(eq("column"))).thenReturn(column2); cols2 = new ArrayList<Column>(); cols2.add(column2); when(table2.getColumns()).thenAnswer(new ColumnAnswer(cols2)); } 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(); } } @Test public void testAddColumn() { final QueryColumnInfo columnInfo = new QueryColumnInfo(column); queryInfo.addColumn(columnInfo); final QueryColumnInfo found = queryInfo.findColumn(column);// queryInfo.findColumnByGUID(cName); assertEquals(found, columnInfo); } @Test public void testAddDefinedColumns() throws SQLDataException { final ElementGroup queryElementGroup = new ElementGroup(); final QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, queryElementGroup, table, false); queryInfo.addTable(tableInfo); queryInfo.addDefinedColumns(Collections.<String> emptyList()); final ElementExtractor extractor = new ElementExtractor( ElementPathBlock.class); extractor.visit(queryElementGroup); ElementPathBlock epb = (ElementPathBlock) extractor.getExtracted().get( 0); TriplePath pth = epb.patternElts().next(); assertEquals(Var.alloc("tbl"), pth.asTriple().getSubject()); assertEquals(NodeFactory.createURI("a"), pth.asTriple().getPredicate()); assertEquals(Var.alloc(tName.getGUID()), pth.asTriple().getObject()); epb = (ElementPathBlock) extractor.getExtracted().get(1); pth = epb.patternElts().next(); assertEquals(Var.alloc(tName.getGUID()), pth.asTriple().getSubject()); assertEquals(NodeFactory.createURI("b"), pth.asTriple().getPredicate()); assertEquals(Var.alloc(cName.getGUID()), pth.asTriple().getObject()); } // @Test // private void testGetSchemasInQuery() // { // Column column2 = mock( Column.class ); // ColumnName cName2 = new ColumnName( "catalog", "schema2", "table", // "column"); // when( column2.getName()).thenReturn( cName2 ); // when( column2.getQuerySegmentFmt() ).thenReturn( " { %s <b> %s } "); // // Table table2 = mock( Table.class ); // TableName tName2 = new TableName( "catalog", "schema", "table" ); // when( table2.getName() ).thenReturn( tName2 ); // when( table2.getQuerySegmentFmt()).thenReturn( "{ ?tbl <a> %s }"); // // List<Column> cols = new ArrayList<Column>(); // cols.add(column2); // when( table2.getColumns()).thenReturn( cols.iterator() ); // //queryInfo.addTable(table2 ); // // //List<String> schemas = queryInfo.getSchemasInQuery(); // } @Test public void testAddTable() { final ElementGroup queryElementGroup = new ElementGroup(); final QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, queryElementGroup, table, false); queryInfo.addTable(tableInfo); assertEquals(NameSegments.TTTF, tableInfo.getSegments()); assertEquals(1, queryInfo.getTables().size()); assertEquals(tableInfo.getGUID(), queryInfo.getTables().iterator() .next().getGUID()); final QueryTableInfo tableInfo2 = new QueryTableInfo(queryInfo, queryElementGroup, table2, false); queryInfo.addTable(tableInfo2); assertEquals(NameSegments.TTTF, tableInfo.getSegments()); assertEquals(NameSegments.TTTF, tableInfo2.getSegments()); assertEquals(2, queryInfo.getTables().size()); final Set<String> guids = new HashSet<String>(); for (final QueryTableInfo qti : queryInfo.getTables()) { guids.add(qti.getGUID()); } assertEquals(2, guids.size()); assertTrue(guids.contains(tableInfo.getGUID())); assertTrue(guids.contains(tableInfo2.getGUID())); } @Test public void testContainsColumn() throws SQLDataException { assertFalse(queryInfo.containsColumn(cName2)); queryInfo.addColumn(new QueryColumnInfo(column2)); assertTrue(queryInfo.containsColumn(cName2)); final ElementGroup queryElementGroup = new ElementGroup(); final QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, queryElementGroup, table, false); queryInfo.addTable(tableInfo); queryInfo.addDefinedColumns(Collections.<String> emptyList()); ; assertTrue(queryInfo.containsColumn(cName)); assertTrue(queryInfo.containsColumn(new TableName("catalog", "schema2", "table"))); assertFalse(queryInfo.containsColumn(new TableName("catalog", "schema2", "table2"))); assertTrue(queryInfo .containsColumn(new SchemaName("catalog", "schema2"))); assertFalse(queryInfo.containsColumn(new SchemaName("catalog", "schema3"))); assertTrue(queryInfo.containsColumn(new CatalogName("catalog"))); assertFalse(queryInfo.containsColumn(new CatalogName("catalog2"))); } @Test public void testFindColumn() throws SQLDataException { assertNull(queryInfo.findColumn(cName2)); queryInfo.addColumn(new QueryColumnInfo(column2)); assertEquals(cName2, queryInfo.findColumn(cName2).getName()); assertEquals(cName2, queryInfo.findColumn(new ColumnName(cName2)) .getName()); final ElementGroup queryElementGroup = new ElementGroup(); final QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, queryElementGroup, table, false); queryInfo.addTable(tableInfo); queryInfo.addDefinedColumns(Collections.<String> emptyList()); assertEquals(cName, queryInfo.findColumn(cName).getName()); assertNull(queryInfo.findColumn(new ColumnName("catalog", "schema2", "table", "column2"))); } // @Test // public void testFindColumnByGUID() { // assertNull(queryInfo.findColumnByGUID(cName2)); // queryInfo.addColumn(new QueryColumnInfo(column2)); // assertEquals(cName2, queryInfo.findColumnByGUID(cName2).getName()); // assertEquals(cName2, queryInfo.findColumnByGUID(new ColumnName(cName2)) // .getName()); // // ElementGroup queryElementGroup = new ElementGroup(); // QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, // queryElementGroup, table, false); // queryInfo.addTable(tableInfo); // queryInfo.addRequiredColumns(); // assertEquals(cName, queryInfo.findColumnByGUID(cName).getName()); // // assertNull(queryInfo.findColumnByGUID(new ColumnName("catalog", // "schema2", "table", "column2"))); // // } @Test public void testGetColumnByName_ColumnName() throws SQLDataException { try { queryInfo.getColumn(cName2); fail("Should have thrown IllegalArgumentException"); } catch (final IllegalArgumentException expected) { } queryInfo.addColumn(new QueryColumnInfo(column2)); assertEquals(cName2, queryInfo.getColumn(cName2).getName()); assertEquals(cName2, queryInfo.getColumn(new ColumnName(cName2)) .getName()); final ElementGroup queryElementGroup = new ElementGroup(); final QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, queryElementGroup, table, false); queryInfo.addTable(tableInfo); queryInfo.addDefinedColumns(Collections.<String> emptyList()); assertEquals(cName, queryInfo.getColumn(cName).getName()); try { queryInfo.getColumn(new ColumnName("catalog", "schema2", "table", "column2")); } catch (final IllegalArgumentException expected) { } } @Test public void testGetColumnIndex() throws SQLDataException { assertEquals(-1, queryInfo.getColumnIndex(cName2)); queryInfo.addColumn(new QueryColumnInfo(column2)); assertEquals(0, queryInfo.getColumnIndex(cName2)); assertEquals(0, queryInfo.getColumnIndex(new ColumnName(cName2))); final ElementGroup queryElementGroup = new ElementGroup(); final QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, queryElementGroup, table, false); queryInfo.addTable(tableInfo); queryInfo.addDefinedColumns(Collections.<String> emptyList()); assertEquals(1, queryInfo.getColumnIndex(cName)); assertEquals(-1, queryInfo.getColumnIndex(new ColumnName("catalog", "schema2", "table", "column2"))); } @Test public void testGetColumns() throws SQLDataException { assertEquals(0, queryInfo.getColumns().size()); final QueryColumnInfo colInfo1 = new QueryColumnInfo(column2); queryInfo.addColumn(colInfo1); assertEquals(1, queryInfo.getColumns().size()); final ElementGroup queryElementGroup = new ElementGroup(); final QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, queryElementGroup, table, false); queryInfo.addTable(tableInfo); queryInfo.addDefinedColumns(Collections.<String> emptyList()); final QueryItemCollection<QueryColumnInfo, Column, ColumnName> cols = queryInfo .getColumns(); assertEquals(2, cols.size()); assertEquals(colInfo1, cols.get(0)); assertEquals(queryInfo.getColumn(cName), cols.get(1)); } @Test public void testGetTable() { assertNull(queryInfo.getTable(table.getName())); final ElementGroup queryElementGroup = new ElementGroup(); final QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, queryElementGroup, table, false); queryInfo.addTable(tableInfo); assertEquals(tableInfo, queryInfo.getTable(table.getName())); assertNull(queryInfo.getTable(table2.getName())); final ElementGroup queryElementGroup2 = new ElementGroup(); final QueryTableInfo tableInfo2 = new QueryTableInfo(queryInfo, queryElementGroup2, table2, false); queryInfo.addTable(tableInfo2); assertEquals(tableInfo, queryInfo.getTable(table.getName())); assertEquals(tableInfo2, queryInfo.getTable(table2.getName())); assertNull(queryInfo.getTable(new TableName("catalog", "schema", "table3"))); } @Test public void testGetTables() { assertEquals(0, queryInfo.getTables().size()); final ElementGroup queryElementGroup = new ElementGroup(); final QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, queryElementGroup, table, false); assertEquals(0, queryInfo.getTables().size()); queryInfo.addTable(tableInfo); assertEquals(1, queryInfo.getTables().size()); final ElementGroup queryElementGroup2 = new ElementGroup(); final QueryTableInfo tableInfo2 = new QueryTableInfo(queryInfo, queryElementGroup2, table2, false); assertEquals(1, queryInfo.getTables().size()); queryInfo.addTable(tableInfo2); final QueryItemCollection<QueryTableInfo, Table, TableName> lst = queryInfo .getTables(); assertEquals(2, lst.size()); assertEquals(tableInfo, lst.get(0)); assertEquals(tableInfo2, lst.get(1)); } @Test public void testListColumns() throws SQLDataException { assertEquals(0, queryInfo.listColumns(cName).size()); assertEquals(0, queryInfo.listColumns(tName).size()); assertEquals(0, queryInfo.listColumns(cName2).size()); assertEquals(0, queryInfo.listColumns(tName2).size()); assertEquals(0, queryInfo.listColumns(ItemName.WILD).size()); queryInfo.addColumn(new QueryColumnInfo(column2)); assertEquals(0, queryInfo.listColumns(cName).size()); assertEquals(0, queryInfo.listColumns(tName).size()); assertEquals(1, queryInfo.listColumns(cName2).size()); assertEquals(1, queryInfo.listColumns(tName2).size()); assertEquals(1, queryInfo.listColumns(ItemName.WILD).size()); final ElementGroup queryElementGroup = new ElementGroup(); final QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, queryElementGroup, table, false); queryInfo.addTable(tableInfo); queryInfo.addDefinedColumns(Collections.<String> emptyList()); assertEquals(1, queryInfo.listColumns(cName).size()); assertEquals(1, queryInfo.listColumns(tName).size()); assertEquals(1, queryInfo.listColumns(cName2).size()); assertEquals(1, queryInfo.listColumns(tName2).size()); assertEquals(2, queryInfo.listColumns(ItemName.WILD).size()); } @Test public void testListTables() throws SQLDataException { assertEquals(0, queryInfo.listTables(cName).size()); assertEquals(0, queryInfo.listTables(tName).size()); assertEquals(0, queryInfo.listTables(cName2).size()); assertEquals(0, queryInfo.listTables(tName2).size()); assertEquals(0, queryInfo.listTables(ItemName.WILD).size()); queryInfo.addColumn(new QueryColumnInfo(column2)); assertEquals(0, queryInfo.listTables(cName).size()); assertEquals(0, queryInfo.listTables(tName).size()); assertEquals(0, queryInfo.listTables(cName2).size()); assertEquals(0, queryInfo.listTables(tName2).size()); assertEquals(0, queryInfo.listTables(ItemName.WILD).size()); final ElementGroup queryElementGroup = new ElementGroup(); final QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, queryElementGroup, table, false); queryInfo.addTable(tableInfo); queryInfo.addDefinedColumns(Collections.<String> emptyList()); assertEquals(1, queryInfo.listTables(cName).size()); assertEquals(1, queryInfo.listTables(tName).size()); assertEquals(0, queryInfo.listTables(cName2).size()); assertEquals(0, queryInfo.listTables(tName2).size()); assertEquals(1, queryInfo.listTables(ItemName.WILD).size()); final ElementGroup queryElementGroup2 = new ElementGroup(); final QueryTableInfo tableInfo2 = new QueryTableInfo(queryInfo, queryElementGroup2, table2, false); queryInfo.addTable(tableInfo2); queryInfo.addDefinedColumns(Collections.<String> emptyList()); assertEquals(1, queryInfo.listTables(cName).size()); assertEquals(1, queryInfo.listTables(tName).size()); assertEquals(1, queryInfo.listTables(cName2).size()); assertEquals(1, queryInfo.listTables(tName2).size()); assertEquals(2, queryInfo.listTables(ItemName.WILD).size()); } @Test public void testScanTablesForColumn() { final ColumnName cNameWild = new ColumnName(cName, NameSegments.FFFT); assertNull(queryInfo.scanTablesForColumn(cNameWild)); assertNull(queryInfo.scanTablesForColumn(cName)); assertNull(queryInfo.scanTablesForColumn(cName2)); queryInfo.addColumn(new QueryColumnInfo(column2)); assertNull(queryInfo.scanTablesForColumn(cName)); assertNotNull(queryInfo.scanTablesForColumn(cName2)); assertNotNull(queryInfo.scanTablesForColumn(cNameWild)); final ElementGroup queryElementGroup = new ElementGroup(); final QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, queryElementGroup, table, false); queryInfo.addTable(tableInfo); assertNotNull(queryInfo.scanTablesForColumn(cName)); assertNotNull(queryInfo.scanTablesForColumn(cName2)); assertEquals(1, queryInfo.listTables(cName).size()); assertEquals(0, queryInfo.listTables(cName2).size()); try { queryInfo.scanTablesForColumn(cNameWild); fail("Should have thrown IllegalArgumentException"); } catch (final IllegalArgumentException e) { assertTrue(e.getMessage() .startsWith("column was found in multiple")); } final ElementGroup queryElementGroup2 = new ElementGroup(); final QueryTableInfo tableInfo2 = new QueryTableInfo(queryInfo, queryElementGroup2, table2, false); queryInfo.addTable(tableInfo2); assertNotNull(queryInfo.scanTablesForColumn(cName)); assertNotNull(queryInfo.scanTablesForColumn(cName2)); assertEquals(1, queryInfo.listTables(cName).size()); assertEquals(1, queryInfo.listTables(cName2).size()); try { queryInfo.scanTablesForColumn(cNameWild); fail("Should have thrown IllegalArgumentException"); } catch (final IllegalArgumentException e) { assertTrue(e.getMessage() .startsWith("column was found in multiple")); } } @Test public void testSetMinimumColumnSegments() throws SQLDataException { queryInfo.addColumn(new QueryColumnInfo(column2)); final ElementGroup queryElementGroup = new ElementGroup(); final QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, queryElementGroup, table, false); queryInfo.addTable(tableInfo); queryInfo.addDefinedColumns(Collections.<String> emptyList()); queryInfo.setMinimumColumnSegments(); NameSegments expected = NameSegments.FFTF; for (final QueryTableInfo tableInfoChk : queryInfo.getTables()) { assertEquals(expected, tableInfoChk.getSegments()); } expected = NameSegments.FFFT; for (final QueryColumnInfo columnInfoChk : queryInfo.getColumns()) { assertEquals(expected, columnInfoChk.getSegments()); } final ElementGroup queryElementGroup2 = new ElementGroup(); final QueryTableInfo tableInfo2 = new QueryTableInfo(queryInfo, queryElementGroup2, table2, false); queryInfo.addTable(tableInfo2); queryInfo.setMinimumColumnSegments(); expected = NameSegments.FTTF; for (final QueryTableInfo tableInfoChk : queryInfo.getTables()) { assertEquals(expected, tableInfoChk.getSegments()); } expected = NameSegments.FTTT; for (final QueryColumnInfo columnInfoChk : queryInfo.getColumns()) { assertEquals(expected, columnInfoChk.getSegments()); } } // // @Test // public void testFindColumnByGUID_ColumnName() { // QueryColumnInfo colInfo = queryInfo.findColumnByGUID(cName); // assertNull( colInfo ); // // ElementGroup queryElementGroup = new ElementGroup(); // QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, // queryElementGroup, table, false); // queryInfo.addTable( tableInfo ); // queryInfo.addRequiredColumns(); // // colInfo = queryInfo.findColumnByGUID(cName); // assertNotNull( colInfo ); // assertEquals( cName.getGUID(), colInfo.getName().getGUID() ); // assertEquals( cName.getGUID(), colInfo.getGUID() ); // } // @Test public void testFindColumnByGUIDVar_String() throws SQLDataException { QueryColumnInfo colInfo = queryInfo .findColumnByGUIDVar(cName.getGUID()); assertNull(colInfo); final ElementGroup queryElementGroup = new ElementGroup(); final QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, queryElementGroup, table, false); queryInfo.addTable(tableInfo); queryInfo.addDefinedColumns(Collections.<String> emptyList()); colInfo = queryInfo.findColumnByGUIDVar(cName.getGUID()); assertNotNull(colInfo); assertEquals(cName.getGUID(), colInfo.getName().getGUID()); assertEquals(cName.getGUID(), colInfo.getGUID()); } // @Test // public void testScanTablesForColumnByGUID() { // QueryColumnInfo colInfo = queryInfo.scanTablesForColumnByGUID(cName); // assertNull( colInfo ); // // ElementGroup queryElementGroup = new ElementGroup(); // QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, // queryElementGroup, table, false); // queryInfo.addTable( tableInfo ); // queryInfo.addRequiredColumns(); // // colInfo = queryInfo.scanTablesForColumnByGUID(cName); // assertNotNull( colInfo ); // assertEquals( cName.getGUID(), colInfo.getName().getGUID() ); // assertEquals( cName.getGUID(), colInfo.getGUID() ); // } // @Test // public void testScanTablesForColumnByGUID_beforeRequired() { // QueryColumnInfo colInfo = queryInfo.scanTablesForColumnByGUID(cName); // assertNull( colInfo ); // // ElementGroup queryElementGroup = new ElementGroup(); // QueryTableInfo tableInfo = new QueryTableInfo(queryInfo, // queryElementGroup, table, false); // queryInfo.addTable( tableInfo ); // queryElementGroup = new ElementGroup(); // tableInfo = new QueryTableInfo(queryInfo, // queryElementGroup, table2, false); // queryInfo.addTable( tableInfo ); // // colInfo = queryInfo.scanTablesForColumnByGUID(cName); // assertNotNull( colInfo ); // assertEquals( cName.getGUID(), colInfo.getName().getGUID() ); // assertEquals( cName.getGUID(), colInfo.getGUID() ); // } // @Test // public void testGetForceTypeF() throws SQLDataException { // final QueryColumnInfo columnInfo = new QueryColumnInfo(column, false); // final ForceTypeF f = queryInfo.getForceTypeF(columnInfo); // assertNotNull(f); // final QueryColumnInfo alias = columnInfo.createAlias(tName // .getColumnName("alias")); // final ForceTypeF f2 = queryInfo.getForceTypeF(alias); // assertEquals(f, f2); // } // // @Test // public void testGetCheckTypeF() throws SQLDataException { // final QueryColumnInfo columnInfo = new QueryColumnInfo(column, false); // final CheckTypeF f = queryInfo.getCheckTypeF(columnInfo); // assertNotNull(f); // final QueryColumnInfo alias = columnInfo.createAlias(tName // .getColumnName("alias")); // final CheckTypeF f2 = queryInfo.getCheckTypeF(alias); // assertEquals(f, f2); // } }