From: <mrp...@us...> - 2014-02-22 18:34:02
|
Revision: 7869 http://sourceforge.net/p/bigdata/code/7869 Author: mrpersonick Date: 2014-02-22 18:33:55 +0000 (Sat, 22 Feb 2014) Log Message: ----------- get the asBound predicate right when the sidVar is bound in the incoming solution Modified Paths: -------------- branches/RDR/bigdata-rdf/src/java/com/bigdata/rdf/sparql/ast/optimizers/StaticOptimizer.java branches/RDR/bigdata-rdf/src/java/com/bigdata/rdf/spo/SPOPredicate.java Modified: branches/RDR/bigdata-rdf/src/java/com/bigdata/rdf/sparql/ast/optimizers/StaticOptimizer.java =================================================================== --- branches/RDR/bigdata-rdf/src/java/com/bigdata/rdf/sparql/ast/optimizers/StaticOptimizer.java 2014-02-22 18:22:38 UTC (rev 7868) +++ branches/RDR/bigdata-rdf/src/java/com/bigdata/rdf/sparql/ast/optimizers/StaticOptimizer.java 2014-02-22 18:33:55 UTC (rev 7869) @@ -14,7 +14,9 @@ import com.bigdata.rdf.sparql.ast.IReorderableNode; 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.StaticAnalysis; +import com.bigdata.rdf.sparql.ast.VarNode; import com.bigdata.rdf.sparql.ast.eval.AST2BOpContext; import com.bigdata.rdf.sparql.ast.optimizers.ASTStaticJoinOptimizer.Annotations; @@ -231,8 +233,20 @@ order[0] = preferredFirstTail; order[1] = preferredFirstTail == 0 ? 1 : 0; } else { - order[0] = cardinality(0) <= cardinality(1) ? 0 : 1; - order[1] = cardinality(0) <= cardinality(1) ? 1 : 0; + if (cardinality(0) == cardinality(1) && + nodes.get(0) instanceof StatementPatternNode && + nodes.get(1) instanceof StatementPatternNode) { + final VarNode sid0 = ((StatementPatternNode) nodes.get(0)).sid(); + final VarNode sid1 = ((StatementPatternNode) nodes.get(1)).sid(); + if (sid0 != null && sid1 == null) { + order[0] = 1; + order[1] = 0; + } + } + if (order[0] == -1) { + order[0] = cardinality(0) <= cardinality(1) ? 0 : 1; + order[1] = cardinality(0) <= cardinality(1) ? 1 : 0; + } } return computeJoinCardinality(getTail(0), getTail(1)); } Modified: branches/RDR/bigdata-rdf/src/java/com/bigdata/rdf/spo/SPOPredicate.java =================================================================== --- branches/RDR/bigdata-rdf/src/java/com/bigdata/rdf/spo/SPOPredicate.java 2014-02-22 18:22:38 UTC (rev 7868) +++ branches/RDR/bigdata-rdf/src/java/com/bigdata/rdf/spo/SPOPredicate.java 2014-02-22 18:33:55 UTC (rev 7869) @@ -26,6 +26,7 @@ import java.util.Map; import com.bigdata.bop.BOp; +import com.bigdata.bop.Constant; import com.bigdata.bop.IBindingSet; import com.bigdata.bop.IVariable; import com.bigdata.bop.IVariableOrConstant; @@ -33,6 +34,7 @@ import com.bigdata.bop.ap.Predicate; import com.bigdata.rdf.internal.IV; import com.bigdata.rdf.internal.impl.bnode.SidIV; +import com.bigdata.rdf.sparql.ast.FilterNode; import com.bigdata.relation.rule.IAccessPathExpander; /** @@ -353,6 +355,80 @@ @Override public SPOPredicate asBound(final IBindingSet bindingSet) { + final IVariable<?> sidVar = sid(); + + if (sidVar != null && bindingSet.isBound(sidVar)) { + + final Object obj = bindingSet.get(sidVar).get(); + + // prior predicate bound something other than a sid to a sid var + if (obj instanceof SidIV == false) { + + // inconsistent + return null; + + } + + final SidIV sidIV = (SidIV) obj; + + final ISPO spo = sidIV.getInlineValue(); + + final IV s = spo.s(); + + final IV p = spo.p(); + + final IV o = spo.o(); + + // TODO implement RDR in quads mode +// final IV c = spo.c(); + + if (this.s().isConstant() && !this.s().get().equals(s)) { + + // inconsistent + return null; + + } else { + + bindingSet.set((IVariable) this.s(), new Constant<IV>(s)); + + } + + if (this.p().isConstant() && !this.p().get().equals(p)) { + + // inconsistent + return null; + + } else { + + bindingSet.set((IVariable) this.p(), new Constant<IV>(p)); + + } + + if (this.o().isConstant() && !this.o().get().equals(o)) { + + // inconsistent + return null; + + } else { + + bindingSet.set((IVariable) this.o(), new Constant<IV>(o)); + + } + + // TODO implement RDR in quads mode +// if (this.c().isConstant() && !this.c().get().equals(c)) { +// +// // inconsistent +// return null; +// +// } else { +// +// bindingSet.set((IVariable) this.c(), new Constant<IV>(c)); +// +// } + + } + return (SPOPredicate) new SPOPredicate(argsCopy(), annotationsRef()) ._asBound(bindingSet); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |