package org.xenei.jdbc4sparql.sparql.items;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
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.List;
import org.junit.Before;
import org.junit.Test;
import org.xenei.jdbc4sparql.iface.Column;
import org.xenei.jdbc4sparql.iface.Table;
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.TableName;
import org.xenei.jdbc4sparql.impl.NameUtils;
import org.xenei.jdbc4sparql.sparql.QueryInfoSet;
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 QueryTableInfoTest {
private QueryTableInfo tableInfo;
private QueryInfoSet infoSet;
private Table table;
private TableName tableName;
private ElementGroup queryElementGroup;
@Before
public void setup() {
infoSet = new QueryInfoSet();
queryElementGroup = new ElementGroup();
table = mock(Table.class);
tableName = new TableName("catalog", "schema", "table");
when(table.getName()).thenReturn(tableName);
tableInfo = new QueryTableInfo(infoSet, queryElementGroup, table, false);
}
@Test
public void testSegments() {
assertEquals("C:false S:true T:true C:false", tableInfo.getSegments()
.toString());
assertEquals("schema.table", tableInfo.getName().getDBName());
tableInfo.setSegments(NameSegments.CATALOG);
assertEquals("C:true S:false T:true C:false", tableInfo.getSegments()
.toString());
assertEquals("table", tableInfo.getName().getDBName());
tableInfo.setSegments(NameSegments.SCHEMA);
assertEquals("C:false S:true T:true C:false", tableInfo.getSegments()
.toString());
assertEquals("schema.table", tableInfo.getName().getDBName());
tableInfo.setSegments(NameSegments.TABLE);
assertEquals("C:false S:true T:true C:false", tableInfo.getSegments()
.toString());
assertEquals("schema.table", tableInfo.getName().getDBName());
tableInfo.setSegments(NameSegments.FFTT);
assertEquals("C:false S:false T:true C:false", tableInfo.getSegments()
.toString());
assertEquals("table", tableInfo.getName().getDBName());
tableInfo.setSegments(NameSegments.TTTT);
assertEquals("C:true S:true T:true C:false", tableInfo.getSegments()
.toString());
assertEquals("schema.table", tableInfo.getName().getDBName());
}
@Test
public void testGetName() {
final ItemName name = tableInfo.getName();
assertTrue(name == tableName);
}
@Test
public void testGetVar() {
final String dbName = "schema" + NameUtils.SPARQL_DOT + "table";
final Var v = tableInfo.getVar();
assertEquals(dbName, v.getName());
}
@Test
public void testGetAlias() {
final String varName = tableInfo.getName().getGUID();
assertNotNull(tableInfo.getGUIDVar());
assertEquals(varName, tableInfo.getGUIDVar().getVarName());
}
@Test
public void testIsOptional() {
assertFalse(tableInfo.isOptional());
tableInfo.setOptional(true);
assertTrue(tableInfo.isOptional());
}
@Test
public void testAddColumnToQuery_Column() {
Column column;
ColumnName columnName;
columnName = new ColumnName("catalog", "schema", "table", "column");
column = mock(Column.class);
when(column.getName()).thenReturn(columnName);
final QueryColumnInfo columnInfo = tableInfo.addColumnToQuery(column);
assertEquals(column.getName().getSPARQLName(), columnInfo.getName()
.getSPARQLName());
}
@Test
public void testAddColumnToQuery_Column_ColumnName_Optional() {
Column column;
ColumnName columnName;
columnName = new ColumnName("catalog", "schema", "table", "column");
column = mock(Column.class);
when(column.getName()).thenReturn(columnName);
final ColumnName columnName2 = new ColumnName("catalog", "schema",
"table", "column2");
final QueryColumnInfo columnInfo = tableInfo.addColumnToQuery(column,
columnName2, true);
assertEquals(columnName2.getSPARQLName(), columnInfo.getName()
.getSPARQLName());
}
@Test
public void testAddColumnToQuery_Column_Optional() {
Column column;
ColumnName columnName;
columnName = new ColumnName("catalog", "schema", "table", "column");
column = mock(Column.class);
when(column.getName()).thenReturn(columnName);
final QueryColumnInfo columnInfo = tableInfo.addColumnToQuery(column,
true);
assertEquals(column.getName().getSPARQLName(), columnInfo.getName()
.getSPARQLName());
}
@Test
public void testAddDefinedColumns() throws SQLDataException {
when(table.getQuerySegmentFmt()).thenReturn("{ ?tbl <a> %s }");
Column column;
ColumnName columnName;
columnName = new ColumnName("catalog", "schema", "table", "column");
column = mock(Column.class);
when(column.getName()).thenReturn(columnName);
when(column.getQuerySegmentFmt()).thenReturn(" { %s <b> %s } ");
when(column.hasQuerySegments()).thenReturn(true);
final List<Column> cols = new ArrayList<Column>();
cols.add(column);
when(table.getColumns()).thenReturn(cols.iterator());
tableInfo.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(tableInfo.getGUIDVar(), pth.asTriple().getObject());
epb = (ElementPathBlock) extractor.getExtracted().get(1);
pth = epb.patternElts().next();
assertEquals(tableInfo.getGUIDVar(), pth.asTriple().getSubject());
assertEquals(NodeFactory.createURI("b"), pth.asTriple().getPredicate());
assertEquals(Var.alloc("v_906819fe_e4e6_30eb_8431_4483a755c4f4"), pth
.asTriple().getObject());
}
}