From: <mrp...@us...> - 2013-01-03 22:36:16
|
Revision: 6804 http://bigdata.svn.sourceforge.net/bigdata/?rev=6804&view=rev Author: mrpersonick Date: 2013-01-03 22:36:08 +0000 (Thu, 03 Jan 2013) Log Message: ----------- fixed the negative parser tests Modified Paths: -------------- branches/BIGDATA_RELEASE_1_2_0/bigdata-rdf/src/java/com/bigdata/rdf/sparql/ast/FunctionRegistry.java branches/BIGDATA_RELEASE_1_2_0/bigdata-rdf/src/java/com/bigdata/rdf/sparql/ast/eval/AST2BOpUtility.java branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/java/com/bigdata/rdf/sail/sparql/Bigdata2ASTSPARQLParser.java branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/java/com/bigdata/rdf/sail/sparql/BigdataExprBuilder.java branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/java/com/bigdata/rdf/sail/sparql/UpdateExprBuilder.java branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/test/com/bigdata/rdf/sail/sparql/AbstractBigdataExprBuilderTestCase.java branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/test/com/bigdata/rdf/sail/sparql/BigdataSPARQL2ASTParserTest.java branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/test/com/bigdata/rdf/sail/sparql/TestBigdataExprBuilder.java Modified: branches/BIGDATA_RELEASE_1_2_0/bigdata-rdf/src/java/com/bigdata/rdf/sparql/ast/FunctionRegistry.java =================================================================== --- branches/BIGDATA_RELEASE_1_2_0/bigdata-rdf/src/java/com/bigdata/rdf/sparql/ast/FunctionRegistry.java 2013-01-02 19:25:55 UTC (rev 6803) +++ branches/BIGDATA_RELEASE_1_2_0/bigdata-rdf/src/java/com/bigdata/rdf/sparql/ast/FunctionRegistry.java 2013-01-03 22:36:08 UTC (rev 6804) @@ -13,10 +13,13 @@ import com.bigdata.bop.BOp; import com.bigdata.bop.Constant; +import com.bigdata.bop.IBindingSet; import com.bigdata.bop.IConstant; import com.bigdata.bop.IValueExpression; import com.bigdata.bop.IVariable; import com.bigdata.bop.IVariableOrConstant; +import com.bigdata.bop.ImmutableBOp; +import com.bigdata.bop.NV; import com.bigdata.bop.aggregate.AggregateBase; import com.bigdata.bop.aggregate.IAggregate; import com.bigdata.bop.rdf.aggregate.GROUP_CONCAT; @@ -32,7 +35,6 @@ import com.bigdata.rdf.internal.constraints.DateBOp.DateOp; import com.bigdata.rdf.internal.constraints.DigestBOp; import com.bigdata.rdf.internal.constraints.DigestBOp.DigestOp; -import com.bigdata.rdf.internal.constraints.EBVBOp; import com.bigdata.rdf.internal.constraints.EncodeForURIBOp; import com.bigdata.rdf.internal.constraints.FalseBOp; import com.bigdata.rdf.internal.constraints.FuncBOp; @@ -70,7 +72,6 @@ import com.bigdata.rdf.internal.constraints.SubstrBOp; import com.bigdata.rdf.internal.constraints.TrueBOp; import com.bigdata.rdf.internal.constraints.UcaseBOp; -import com.bigdata.rdf.internal.constraints.XSDBooleanIVValueExpression; import com.bigdata.rdf.internal.constraints.XsdStrBOp; import com.bigdata.rdf.sparql.ast.eval.AST2BOpUtility; import com.bigdata.rdf.sparql.ast.optimizers.IASTOptimizer; @@ -1005,21 +1006,31 @@ if (functionURI == null) throw new IllegalArgumentException("functionURI is null"); - final Factory f = factories.get(functionURI); +// final Factory f = factories.get(functionURI); +// +// if (f == null) { +// /* +// * TODO If we eagerly translate FunctionNodes in the AST to IV value +// * expressions then we should probably attach a function which will +// * result in a runtime type error when it encounters value +// * expression for a function URI which was not known to the backend. +// * However, if we handle this translation lazily then this might not +// * be an issue. +// */ +// throw new IllegalArgumentException("unknown function: " +// + functionURI); +// } - if (f == null) { - /* - * TODO If we eagerly translate FunctionNodes in the AST to IV value - * expressions then we should probably attach a function which will - * result in a runtime type error when it encounters value - * expression for a function URI which was not known to the backend. - * However, if we handle this translation lazily then this might not - * be an issue. - */ - throw new IllegalArgumentException("unknown function: " - + functionURI); + final Factory f; + if (factories.containsKey(functionURI)) { + + f = factories.get(functionURI); + + } else { + + f = new UnknownFunctionFactory(functionURI); } - + return f.create(globals, scalarValues, args); } @@ -1570,5 +1581,74 @@ } } + + private static class UnknownFunctionFactory implements Factory { + + private URI functionURI; + + public UnknownFunctionFactory(final URI functionURI) { + + this.functionURI = functionURI; + + } + + @Override + public IValueExpression<? extends IV> create( + final GlobalAnnotations globals, + final Map<String, Object> scalarValues, + final ValueExpressionNode... args) { + return new UnknownFunctionBOp(functionURI); + + } + + } + + public static class UnknownFunctionBOp + extends ImmutableBOp implements IValueExpression<IV> { + + private static final long serialVersionUID = 1L; + + private static final String FUNCTION_URI = "FUNCTION_URI"; + + public UnknownFunctionBOp(final URI functionURI) { + + this(BOp.NOARGS, NV.asMap(FUNCTION_URI, functionURI)); + + } + + /** + * Required deep copy constructor. + * + * @param op + */ + public UnknownFunctionBOp(final UnknownFunctionBOp op) { + + super(op); + + } + + /** + * Required shallow copy constructor. + * + * @param args + * The operands. + * @param op + * The operation. + */ + public UnknownFunctionBOp(final BOp[] args, Map<String, Object> anns) { + + super(args, anns); + + } + + public IV get(final IBindingSet bindingSet) { + + throw new UnsupportedOperationException( + "unknown function: " + getRequiredProperty(FUNCTION_URI)); + + } + + } + } Modified: branches/BIGDATA_RELEASE_1_2_0/bigdata-rdf/src/java/com/bigdata/rdf/sparql/ast/eval/AST2BOpUtility.java =================================================================== --- branches/BIGDATA_RELEASE_1_2_0/bigdata-rdf/src/java/com/bigdata/rdf/sparql/ast/eval/AST2BOpUtility.java 2013-01-02 19:25:55 UTC (rev 6803) +++ branches/BIGDATA_RELEASE_1_2_0/bigdata-rdf/src/java/com/bigdata/rdf/sparql/ast/eval/AST2BOpUtility.java 2013-01-03 22:36:08 UTC (rev 6804) @@ -131,6 +131,7 @@ import com.bigdata.rdf.sparql.ast.UnionNode; import com.bigdata.rdf.sparql.ast.ValueExpressionNode; import com.bigdata.rdf.sparql.ast.VarNode; +import com.bigdata.rdf.sparql.ast.FunctionRegistry.UnknownFunctionBOp; import com.bigdata.rdf.sparql.ast.optimizers.ASTExistsOptimizer; import com.bigdata.rdf.sparql.ast.optimizers.ASTJoinOrderByTypeOptimizer; import com.bigdata.rdf.sparql.ast.optimizers.ASTNamedSubqueryOptimizer; @@ -4296,6 +4297,17 @@ return ve; } + + if (op instanceof UnknownFunctionBOp) { + + /* + * We want to defer on unknown functions until execution + * time (to allow simple parsing to succeed). + */ + + return ve; + + } } Modified: branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/java/com/bigdata/rdf/sail/sparql/Bigdata2ASTSPARQLParser.java =================================================================== --- branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/java/com/bigdata/rdf/sail/sparql/Bigdata2ASTSPARQLParser.java 2013-01-02 19:25:55 UTC (rev 6803) +++ branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/java/com/bigdata/rdf/sail/sparql/Bigdata2ASTSPARQLParser.java 2013-01-03 22:36:08 UTC (rev 6804) @@ -59,14 +59,17 @@ import com.bigdata.rdf.sparql.ast.ASTContainer; import com.bigdata.rdf.sparql.ast.DatasetNode; import com.bigdata.rdf.sparql.ast.IDataSetNode; +import com.bigdata.rdf.sparql.ast.IQueryNode; import com.bigdata.rdf.sparql.ast.QueryHints; import com.bigdata.rdf.sparql.ast.QueryRoot; import com.bigdata.rdf.sparql.ast.StatementPatternNode; import com.bigdata.rdf.sparql.ast.Update; import com.bigdata.rdf.sparql.ast.UpdateRoot; +import com.bigdata.rdf.sparql.ast.eval.AST2BOpContext; import com.bigdata.rdf.sparql.ast.eval.AST2BOpUtility; import com.bigdata.rdf.sparql.ast.hints.QueryHintScope; import com.bigdata.rdf.sparql.ast.optimizers.ASTQueryHintOptimizer; +import com.bigdata.rdf.sparql.ast.optimizers.ASTSetValueExpressionsOptimizer; import com.bigdata.rdf.store.AbstractTripleStore; /** @@ -419,9 +422,31 @@ queryRoot.setDataset(dataSetNode); } + + /* + * I think here we could set the value expressions and do last- + * minute validation. + */ + final ASTSetValueExpressionsOptimizer opt = + new ASTSetValueExpressionsOptimizer(); + + final AST2BOpContext context2 = new AST2BOpContext(ast, context.tripleStore); + + final QueryRoot queryRoot2 = (QueryRoot) + opt.optimize(context2, queryRoot, null); + + BigdataExprBuilder.verifyAggregate(queryRoot2); return ast; + } catch (IllegalArgumentException e) { + + throw new MalformedQueryException(e.getMessage(), e); + + } catch (VisitorException e) { + + throw new MalformedQueryException(e.getMessage(), e); + } catch (ParseException e) { throw new MalformedQueryException(e.getMessage(), e); Modified: branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/java/com/bigdata/rdf/sail/sparql/BigdataExprBuilder.java =================================================================== --- branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/java/com/bigdata/rdf/sail/sparql/BigdataExprBuilder.java 2013-01-02 19:25:55 UTC (rev 6803) +++ branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/java/com/bigdata/rdf/sail/sparql/BigdataExprBuilder.java 2013-01-03 22:36:08 UTC (rev 6804) @@ -42,6 +42,7 @@ import java.util.Set; import org.apache.log4j.Logger; +import org.openrdf.query.algebra.TupleExpr; import com.bigdata.bop.BOp; import com.bigdata.bop.IBindingSet; @@ -186,7 +187,7 @@ handleBindings(astQuery, queryRoot); - verifyAggregate(queryRoot); +// verifyAggregate(queryRoot); return queryRoot; @@ -266,7 +267,7 @@ handleBindings(node, queryRoot); - verifyAggregate(queryRoot); +// verifyAggregate(queryRoot); return queryRoot; @@ -418,7 +419,7 @@ handleBindings(node, queryRoot); - verifyAggregate(queryRoot); +// verifyAggregate(queryRoot); return queryRoot; @@ -1027,24 +1028,34 @@ * * @throws VisitorException */ - private void verifyAggregate(final QueryBase queryBase) + public static void verifyAggregate(final QueryBase queryBase) throws VisitorException { - if(true) - return; +// if(true) +// return; /* - * FIXME The following code has some dependencies on whether or not the + * The following code has some dependencies on whether or not the * value expressions have been cached. That is not done until we get * into AST2BOpUtility. I have worked some hacks to support this in * FunctionRegistry.isAggregate() and StaticAnalysis.isAggregate(). * However, the code is still hitting some edge cases. * + * MP: I fixed this by running the ASTSetValueOptimizer earlier in the + * parsing process - ie. in Bigdata2ASTSPARQLParser.parseQuery2. + * * There is some commented out code from openrdf that depends on setting * a flag for the expression if an AggregationCollector reports at least * one aggregation in a projection element. We could do this same thing * here but we still need to have the logic to figure out what is an * invalid aggregate. + * + * MP: I think the place to go look for reference is Sesame's + * TupleExprBuilder, especially: + * + * public TupleExpr visit(ASTSelect node, Object data) + * + * And also look at the AggregateCollector. */ final ProjectionNode projection = queryBase.getProjection() == null ? null Modified: branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/java/com/bigdata/rdf/sail/sparql/UpdateExprBuilder.java =================================================================== --- branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/java/com/bigdata/rdf/sail/sparql/UpdateExprBuilder.java 2013-01-02 19:25:55 UTC (rev 6803) +++ branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/java/com/bigdata/rdf/sail/sparql/UpdateExprBuilder.java 2013-01-03 22:36:08 UTC (rev 6804) @@ -38,6 +38,7 @@ import org.openrdf.query.algebra.StatementPattern.Scope; import com.bigdata.bop.BOpUtility; +import com.bigdata.rdf.internal.IV; import com.bigdata.rdf.model.BigdataBNode; import com.bigdata.rdf.model.BigdataResource; import com.bigdata.rdf.model.BigdataStatement; @@ -237,6 +238,21 @@ graphPattern = parentGP; + // no blank nodes in DELETE WHERE statement patterns + final Iterator<StatementPatternNode> itr = BOpUtility.visitAll( + whereClause, StatementPatternNode.class); + + while (itr.hasNext()) { + + final StatementPatternNode sp = itr.next(); + + // Blank nodes are not permitted in DELETE WHERE. + // Note: predicate can never be a blank node (always URI) + assertNotAnonymousVariable(sp.s()); + assertNotAnonymousVariable(sp.o()); + + } + final DeleteInsertGraph op = new DeleteInsertGraph(); op.setWhereClause(whereClause); @@ -788,12 +804,13 @@ while (itr.hasNext()) { final StatementPatternNode sp = itr.next(); - + if (!allowVars) { // Variables not permitted in INSERT DATA or DELETE DATA. assertNotVariable(sp.s()); assertNotVariable(sp.p()); assertNotVariable(sp.o()); + assertNotVariable(sp.c()); } if (!allowBlankNodes) { // Blank nodes are not permitted in DELETE DATA. @@ -840,6 +857,9 @@ */ private void assertNotVariable(final TermNode t) throws VisitorException { + if (t == null) + return; + if (!t.isVariable()) return; @@ -849,6 +869,9 @@ // Blank node (versus a variable) return; } + + throw new VisitorException( + "Variable not permitted in this context: " + t); } @@ -861,17 +884,26 @@ private void assertNotAnonymousVariable(final TermNode t) throws VisitorException { - if (!t.isVariable()) - return; + if (t.isVariable()) { - final VarNode v = (VarNode) t; + final VarNode v = (VarNode) t; + + if (v.isAnonymous()) + throw new VisitorException( + "BlankNode not permitted in this context: " + t); + + } else { + + final IV iv = t.getValueExpression().get(); + + if (iv.isBNode()) + throw new VisitorException( + "BlankNode not permitted in this context: " + t); + + } - if (v.isAnonymous()) - throw new VisitorException( - "BlankNode not permitted in this context: " + t); - } - + /** * Convert the {@link TermNode} to a {@link BigdataValue}. IFF the * {@link TermNode} is an anonymous variable, then it is converted into a Modified: branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/test/com/bigdata/rdf/sail/sparql/AbstractBigdataExprBuilderTestCase.java =================================================================== --- branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/test/com/bigdata/rdf/sail/sparql/AbstractBigdataExprBuilderTestCase.java 2013-01-02 19:25:55 UTC (rev 6803) +++ branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/test/com/bigdata/rdf/sail/sparql/AbstractBigdataExprBuilderTestCase.java 2013-01-03 22:36:08 UTC (rev 6804) @@ -27,6 +27,9 @@ package com.bigdata.rdf.sail.sparql; +import java.util.Collection; +import java.util.Iterator; +import java.util.LinkedList; import java.util.Properties; import junit.framework.TestCase; @@ -35,6 +38,7 @@ import org.openrdf.query.MalformedQueryException; import com.bigdata.bop.BOp; +import com.bigdata.bop.BOpUtility; import com.bigdata.bop.engine.AbstractQueryEngineTestCase; import com.bigdata.journal.BufferMode; import com.bigdata.journal.ITx; @@ -50,6 +54,7 @@ import com.bigdata.rdf.sparql.ast.IQueryNode; import com.bigdata.rdf.sparql.ast.QueryRoot; import com.bigdata.rdf.sparql.ast.UpdateRoot; +import com.bigdata.rdf.sparql.ast.ValueExpressionNode; import com.bigdata.rdf.sparql.ast.VarNode; import com.bigdata.rdf.store.AbstractTripleStore; import com.bigdata.rdf.store.LocalTripleStore; @@ -235,9 +240,28 @@ protected QueryRoot parse(final String queryStr, final String baseURI) throws MalformedQueryException { - return new Bigdata2ASTSPARQLParser(tripleStore).parseQuery2(queryStr, + final QueryRoot ast = new Bigdata2ASTSPARQLParser(tripleStore).parseQuery2(queryStr, baseURI).getOriginalAST(); + + final Collection<ValueExpressionNode> nodes = + new LinkedList<ValueExpressionNode>(); + + final Iterator<ValueExpressionNode> itr = BOpUtility.visitAll( + ast, ValueExpressionNode.class); + while (itr.hasNext()) { + + final ValueExpressionNode node = itr.next(); + nodes.add(node); + + } + + for (ValueExpressionNode node : nodes) { + node.invalidate(); + } + + return ast; + } /** Modified: branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/test/com/bigdata/rdf/sail/sparql/BigdataSPARQL2ASTParserTest.java =================================================================== --- branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/test/com/bigdata/rdf/sail/sparql/BigdataSPARQL2ASTParserTest.java 2013-01-02 19:25:55 UTC (rev 6803) +++ branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/test/com/bigdata/rdf/sail/sparql/BigdataSPARQL2ASTParserTest.java 2013-01-03 22:36:08 UTC (rev 6804) @@ -278,45 +278,45 @@ */ public void test_syntax_update_bad_03() throws MalformedQueryException { - final String query = "DELETE DATA { ?s <p> <o> }"; + final String query = "DELETE DATA { ?s <:p> <:o> }"; - parseOperation(query); + negativeTest(query); } /** Variable in INSERT DATA's data. */ public void test_syntax_update_bad_04() throws MalformedQueryException { - final String query = "INSERT DATA { GRAPH ?g {<s> <p> <o> } }"; + final String query = "INSERT DATA { GRAPH ?g {<:s> <:p> <:o> } }"; - parseOperation(query); + negativeTest(query); } /** Too many separators (in UPDATE request) */ public void test_syntax_update_bad_08() throws MalformedQueryException { - final String query = "CREATE GRAPH <g> ;; LOAD <remote> into GRAPH <g>"; + final String query = "CREATE GRAPH <:g> ;; LOAD <:remote> into GRAPH <:g>"; - parseOperation(query); + negativeTest(query); } /** Too many separators (in UPDATE request) */ public void test_syntax_update_bad_09() throws MalformedQueryException { - final String query = "CREATE GRAPH <g> ; LOAD <remote> into GRAPH <g> ;;"; + final String query = "CREATE GRAPH <:g> ; LOAD <:remote> into GRAPH <:g> ;;"; - parseOperation(query); + negativeTest(query); } /** BNode in DELETE WHERE */ public void test_syntax_update_bad_10() throws MalformedQueryException { - final String query = "DELETE WHERE { _:a <p> <o> }"; + final String query = "DELETE WHERE { _:a <:p> <:o> }"; - parseOperation(query); + negativeTest(query); } Modified: branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/test/com/bigdata/rdf/sail/sparql/TestBigdataExprBuilder.java =================================================================== --- branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/test/com/bigdata/rdf/sail/sparql/TestBigdataExprBuilder.java 2013-01-02 19:25:55 UTC (rev 6803) +++ branches/BIGDATA_RELEASE_1_2_0/bigdata-sails/src/test/com/bigdata/rdf/sail/sparql/TestBigdataExprBuilder.java 2013-01-03 22:36:08 UTC (rev 6804) @@ -200,6 +200,8 @@ * <pre> * SELECT ?s where {?s ?p ?o} GROUP BY ?o * </pre> + * + * MP: Pretty sure this is an illegal query? */ public void test_groupBy_bareVar() throws MalformedQueryException, TokenMgrError, ParseException { @@ -243,6 +245,8 @@ * <pre> * SELECT ?s where {?s ?p ?o} GROUP BY (?o AS ?z) * </pre> + * + * MP: Pretty sure this is an illegal query? */ public void test_groupBy_bindExpr() throws MalformedQueryException, TokenMgrError, ParseException { @@ -288,6 +292,8 @@ * <pre> * SELECT ?s where {?s ?p ?o} GROUP BY str(?o) * </pre> + * + * MP: Pretty sure this is an illegal query? */ public void test_groupBy_functionCall() throws MalformedQueryException, TokenMgrError, ParseException { @@ -337,6 +343,8 @@ * <pre> * SELECT ?s where {?s ?p ?o} HAVING (?o GT ?s) * </pre> + * + * MP: Pretty sure this is an illegal query? */ public void test_having() throws MalformedQueryException, TokenMgrError, ParseException { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |