/* * This file is part of jdbc4sparql jsqlparser implementation. * * jdbc4sparql jsqlparser implementation is free software: you can redistribute * it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * jdbc4sparql jsqlparser implementation is distributed in the hope that it will * be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with jdbc4sparql jsqlparser implementation. If not, see * <http://www.gnu.org/licenses/>. */ package org.xenei.jdbc4sparql.sparql.visitor; import java.util.Arrays; import java.util.List; import org.junit.Assert; import org.junit.Test; import org.xenei.jdbc4sparql.iface.name.ColumnName; import org.xenei.jdbc4sparql.iface.name.NameSegments; import org.xenei.jdbc4sparql.impl.NameUtils; import com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.sparql.core.Var; import com.hp.hpl.jena.sparql.core.VarExprList; import com.hp.hpl.jena.sparql.expr.E_Bound; import com.hp.hpl.jena.sparql.expr.E_Equals; import com.hp.hpl.jena.sparql.expr.E_LogicalNot; import com.hp.hpl.jena.sparql.expr.E_NotEquals; import com.hp.hpl.jena.sparql.expr.Expr; import com.hp.hpl.jena.sparql.expr.ExprVar; import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueString; 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; public class LocalSparqlVisitorTest extends AbstractSparqlVisitorTest { @Test public void testInnerJoinParse() throws Exception { final String fmt = "%s" + NameUtils.SPARQL_DOT + "%s"; final String[] colNames = { String.format(fmt, "foo", "StringCol"), String.format(fmt, "foo", "NullableStringCol"), String.format(fmt, "foo", "IntCol"), "NullableIntCol", String.format(fmt, "bar", "BarStringCol"), String.format(fmt, "bar", "BarNullableStringCol"), String.format(fmt, "bar", "BarIntCol") }; final Query q = getQuery("SELECT * FROM foo inner join bar using (NullableIntCol)"); tests.put(ElementBind.class, 8); tests.put(ElementFilter.class, 2); tests.put(ElementOptional.class, 2); results = validate(q, tests); final List<Var> vLst = q.getProjectVars(); Assert.assertEquals(7, vLst.size()); for (final Var v : vLst) { Assert.assertTrue(Arrays.asList(colNames).contains(v.getName())); } for (final Element el : results.get(ElementBind.class).lst) { final ElementBind bind = (ElementBind) el; Assert.assertTrue(q.getProjectVars().contains(bind.getVar())); } } @Test public void testMethodParse() throws Exception { final Query q = getQuery("SELECT count( IntCol ) FROM foo"); tests.put(ElementBind.class, 1); tests.put(ElementFilter.class, 1); tests.put(ElementOptional.class, 2); results = validate(q, tests); final VarExprList vLst = q.getProject(); Assert.assertEquals(1, vLst.getExprs().size()); } @Test public void testMethodWithAliasParse() throws Exception { final Query q = getQuery("SELECT count( IntCol ) AS bar FROM foo"); tests.put(ElementBind.class, 1); tests.put(ElementFilter.class, 1); tests.put(ElementOptional.class, 2); results = validate(q, tests); Assert.assertEquals(1, q.getProject().size()); Assert.assertEquals(1, q.getProjectVars().size()); Assert.assertEquals("bar", q.getProjectVars().get(0).getVarName()); } @Test public void testNoColParse() throws Exception { final String[] colNames = { "StringCol", "NullableStringCol", "IntCol", "NullableIntCol" }; final Query q = getQuery("SELECT * FROM foo"); tests.put(ElementBind.class, 4); tests.put(ElementFilter.class, 1); tests.put(ElementOptional.class, 2); results = validate(q, tests); final List<Var> vLst = q.getProjectVars(); Assert.assertEquals(4, vLst.size()); for (final Var v : vLst) { Assert.assertTrue(Arrays.asList(colNames).contains(v.getName())); } for (final Element el : results.get(ElementBind.class).lst) { final ElementBind bind = (ElementBind) el; Assert.assertTrue(q.getProjectVars().contains(bind.getVar())); } } @Test public void testSpecColParse() throws Exception { final Query q = getQuery("SELECT StringCol FROM foo"); tests.put(ElementBind.class, 1); tests.put(ElementFilter.class, 1); tests.put(ElementOptional.class, 2); results = validate(q, tests); final List<Var> vLst = q.getProjectVars(); Assert.assertEquals(1, vLst.size()); Assert.assertEquals(Var.alloc("StringCol"), vLst.get(0)); // 1 required column final ElementBind eb = (ElementBind) results.get(ElementBind.class).lst .get(0); Assert.assertEquals("StringCol", eb.getVar().getName()); } @Test public void testSpecColWithAliasParse() throws Exception { final Query q = getQuery("SELECT StringCol AS bar FROM foo"); tests.put(ElementBind.class, 1); tests.put(ElementFilter.class, 1); tests.put(ElementOptional.class, 2); results = validate(q, tests); final List<Var> vLst = q.getProjectVars(); Assert.assertEquals(1, vLst.size()); Assert.assertEquals(Var.alloc("bar"), vLst.get(0)); final ElementBind eb = (ElementBind) results.get(ElementBind.class).lst .get(0); Assert.assertEquals("bar", eb.getVar().getName()); } @Test public void testSpecColWithEqnParse() throws Exception { final Query q = getQuery("SELECT StringCol FROM foo WHERE StringCol != 'baz'"); tests.put(ElementBind.class, 1); tests.put(ElementFilter.class, 2); tests.put(ElementOptional.class, 2); results = validate(q, tests); // 1 required column final ElementBind eb = (ElementBind) results.get(ElementBind.class).lst .get(0); Assert.assertEquals("StringCol", eb.getVar().getName()); // should be the last one final Expr expr = ((ElementFilter) results.get(ElementFilter.class).lst .get(1)).getExpr(); Assert.assertTrue(expr instanceof E_NotEquals); final E_NotEquals expr2 = (E_NotEquals) expr; Assert.assertEquals("StringCol", ((ExprVar) (expr2.getArg1())).getVarName()); Assert.assertEquals("baz", ((NodeValueString) (expr2.getArg2())).asString()); final List<Var> vLst = q.getProjectVars(); Assert.assertEquals(1, vLst.size()); Assert.assertEquals(Var.alloc("StringCol"), vLst.get(0)); } @Test public void testTableAliasParse() throws Exception { final Query q = getQuery("SELECT StringCol FROM foo bar WHERE StringCol != 'baz'"); tests.put(ElementBind.class, 1); tests.put(ElementFilter.class, 2); tests.put(ElementOptional.class, 2); tests.put(ElementPathBlock.class, 5); results = validate(q, tests); final List<Var> vLst = q.getProjectVars(); Assert.assertEquals(1, vLst.size()); Assert.assertEquals(Var.alloc("StringCol"), vLst.get(0)); final ElementBind eb = (ElementBind) results.get(ElementBind.class).lst .get(0); Assert.assertEquals("StringCol", eb.getVar().getName()); // should be the last one final Expr expr = ((ElementFilter) results.get(ElementFilter.class).lst .get(1)).getExpr(); Assert.assertTrue(expr instanceof E_NotEquals); final E_NotEquals expr2 = (E_NotEquals) expr; Assert.assertEquals("StringCol", ((ExprVar) (expr2.getArg1())).getVarName()); Assert.assertEquals("baz", ((NodeValueString) (expr2.getArg2())).asString()); verifyTable(results.get(ElementPathBlock.class), tableName.getGUID()); } @Test public void testTwoTableJoin() throws Exception { final String[] columnNames = { "foo" + NameUtils.SPARQL_DOT + "IntCol", "foo" + NameUtils.SPARQL_DOT + "StringCol", "foo" + NameUtils.SPARQL_DOT + "NullableStringCol", "foo" + NameUtils.SPARQL_DOT + "NullableIntCol", "bar" + NameUtils.SPARQL_DOT + "BarStringCol", "bar" + NameUtils.SPARQL_DOT + "BarNullableStringCol", "bar" + NameUtils.SPARQL_DOT + "BarIntCol", "bar" + NameUtils.SPARQL_DOT + "NullableIntCol" }; final Query q = getQuery("SELECT * FROM foo, bar WHERE foo.IntCol = bar.BarIntCol"); tests.put(ElementBind.class, columnNames.length); tests.put(ElementFilter.class, 3); // 2 from each table tests.put(ElementOptional.class, 4); results = validate(q, tests); final List<Var> vLst = q.getProjectVars(); Assert.assertEquals(columnNames.length, vLst.size()); for (final Var v : vLst) { final ColumnName tn = ColumnName.getNameInstance("testCatalog", "testSchema", "table", v.getName()); tn.setUsedSegments(NameSegments.FFTT); Assert.assertTrue("missing " + tn.getSPARQLName(), Arrays.asList(columnNames).contains(tn.getSPARQLName())); } final Expr expr = ((ElementFilter) results.get(ElementFilter.class).lst .get(2)).getExpr(); Assert.assertTrue(expr instanceof E_Equals); final E_Equals expr2 = (E_Equals) expr; Assert.assertEquals("foo" + NameUtils.SPARQL_DOT + "IntCol", ((ExprVar) (expr2.getArg1())).getVarName()); Assert.assertEquals("bar" + NameUtils.SPARQL_DOT + "BarIntCol", ((ExprVar) (expr2.getArg2())).getVarName()); } @Test public void testCountNullableColumn() throws Exception { final Query q = getQuery("select count(NullableIntCol) from foo"); tests.put(ElementBind.class, 1); tests.put(ElementFilter.class, 1); tests.put(ElementOptional.class, 2); results = validate(q, tests); } @Test public void testColumnByNotNull() throws Exception { final Query q = getQuery("select IntCol from foo WHERE NullableIntCol IS NULL"); tests.put(ElementBind.class, 2); tests.put(ElementFilter.class, 2); tests.put(ElementOptional.class, 2); results = validate(q, tests); Expr expr = ((ElementFilter) results.get(ElementFilter.class).lst .get(1)).getExpr(); Assert.assertTrue(expr instanceof E_LogicalNot); expr = ((E_LogicalNot) expr).getArg(); Assert.assertTrue(expr instanceof E_Bound); Assert.assertEquals("v_39a47853_59fe_3101_9dc3_57a586635865", ((E_Bound) expr).getArg().asVar().getName()); } }