package org.xenei.jdbc4sparql.sparql.parser.jsqlparser; import static org.junit.Assert.assertEquals; 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.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import net.sf.jsqlparser.statement.select.AllColumns; import net.sf.jsqlparser.statement.select.AllTableColumns; import net.sf.jsqlparser.statement.select.SelectExpressionItem; 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.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.NameUtils; 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 com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.sparql.core.Var; public class SparqlSelectItemVisitorTest { /** * An iterator over the columns * */ private static class ColumnIterator implements Answer<Iterator<Column>> { private final List<Column> lst; ColumnIterator(final List<Column> lst) { this.lst = lst; } @Override public Iterator<Column> answer(final InvocationOnMock invocation) throws Throwable { return lst.iterator(); } } private SparqlSelectItemVisitor visitor; private SparqlQueryBuilder queryBuilder; private Query query; private QueryInfoSet queryInfoSet; private QueryColumnInfo columnInfo; private ColumnName columnName; private TableName tableName; private Map<String, Catalog> catalogs; private Catalog catalog; private CatalogName catalogName; private Schema schema; private SchemaName schemaName; private List<Column> colList; @Test public void allColumnsTest() throws SQLException { final AllColumns allColumns = new AllColumns(); visitor.visit(allColumns); final List<Var> lst = query.getProjectVars(); assertEquals(1, lst.size()); assertEquals(columnName.getSPARQLName(), lst.get(0).getName()); } @Test public void allTableColumnsTest() throws SQLException { final net.sf.jsqlparser.schema.Table table = new net.sf.jsqlparser.schema.Table( "testSchema", "testTable"); final AllTableColumns allTableColumns = new AllTableColumns(table); visitor.visit(allTableColumns); final List<Var> lst = query.getProjectVars(); assertEquals(1, lst.size()); assertEquals(columnName.getSPARQLName(), lst.get(0).getName()); } @Test public void selectExpressionTest() throws SQLException { final SelectExpressionItem selectExpression = new SelectExpressionItem(); final net.sf.jsqlparser.schema.Table tbl = new net.sf.jsqlparser.schema.Table( "testSchema", "testTable"); final net.sf.jsqlparser.schema.Column col = new net.sf.jsqlparser.schema.Column( tbl, "testCol"); selectExpression.setExpression(col); visitor.visit(selectExpression); final List<Var> lv = query.getProjectVars(); assertEquals( Var.alloc("testSchema" + NameUtils.SPARQL_DOT + "testTable" + NameUtils.SPARQL_DOT + "testCol"), lv.get(0).asNode()); } @Before public void setup() throws Exception { colList = new ArrayList<Column>(); catalogs = new HashMap<String, Catalog>(); 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); tableName = schemaName.getTableName("testTable"); final Table table = mock(Table.class); when(table.getName()).thenReturn(tableName); when(table.getColumns()).thenAnswer(new ColumnIterator(colList)); columnName = tableName.getColumnName("testCol"); final Column column = mock(Column.class); when(column.getName()).thenReturn(columnName); when(table.getColumn(eq("testCol"))).thenReturn(column); colList.add(column); columnInfo = new QueryColumnInfo(column); queryInfoSet = new QueryInfoSet(); queryInfoSet.addColumn(columnInfo); final SparqlParser parser = mock(SparqlParser.class); queryBuilder = new SparqlQueryBuilder(catalogs, parser, catalog, schema); queryBuilder.addTable(table, tableName, false); final Field f = SparqlQueryBuilder.class.getDeclaredField("query"); f.setAccessible(true); ; query = (Query) f.get(queryBuilder); visitor = new SparqlSelectItemVisitor(queryBuilder); } }