From: <mrp...@us...> - 2011-01-21 16:35:08
|
Revision: 4157 http://bigdata.svn.sourceforge.net/bigdata/?rev=4157&view=rev Author: mrpersonick Date: 2011-01-21 16:35:02 +0000 (Fri, 21 Jan 2011) Log Message: ----------- working through tck failures Modified Paths: -------------- branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/controller/SubqueryOp.java branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/join/PipelineJoin.java branches/QUADS_QUERY_BRANCH/bigdata-sails/src/java/com/bigdata/rdf/sail/Rule2BOpUtility.java branches/QUADS_QUERY_BRANCH/bigdata-sails/src/java/com/bigdata/rdf/sail/sop/SOp2BOpUtility.java Modified: branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/controller/SubqueryOp.java =================================================================== --- branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/controller/SubqueryOp.java 2011-01-21 14:28:17 UTC (rev 4156) +++ branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/controller/SubqueryOp.java 2011-01-21 16:35:02 UTC (rev 4157) @@ -156,17 +156,17 @@ } - public String toString() { - - final StringBuilder sb = new StringBuilder(super.toString()); - sb.append("\n{\n"); - final PipelineOp subquery = (PipelineOp) - getRequiredProperty(Annotations.SUBQUERY); - sb.append(BOpUtility.toString(subquery)); - sb.append("\n}"); - return sb.toString(); - - } +// public String toString() { +// +// final StringBuilder sb = new StringBuilder(super.toString()); +// sb.append("\n{\n"); +// final PipelineOp subquery = (PipelineOp) +// getRequiredProperty(Annotations.SUBQUERY); +// sb.append(BOpUtility.toString(subquery)); +// sb.append("\n}"); +// return sb.toString(); +// +// } /** * Evaluates the arguments of the operator as subqueries. The arguments are Modified: branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/join/PipelineJoin.java =================================================================== --- branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/join/PipelineJoin.java 2011-01-21 14:28:17 UTC (rev 4156) +++ branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/bop/join/PipelineJoin.java 2011-01-21 16:35:02 UTC (rev 4157) @@ -1684,9 +1684,11 @@ final IBindingSet bs = bindingSets[bindex]; - if(!BOpUtility.isConsistent(constraints, bs)) { - // Failed by the constraint on the join. - continue; + if (constraints != null) { + if(!BOpUtility.isConsistent(constraints, bs)) { + // Failed by the constraint on the join. + continue; + } } if (log.isTraceEnabled()) Modified: branches/QUADS_QUERY_BRANCH/bigdata-sails/src/java/com/bigdata/rdf/sail/Rule2BOpUtility.java =================================================================== --- branches/QUADS_QUERY_BRANCH/bigdata-sails/src/java/com/bigdata/rdf/sail/Rule2BOpUtility.java 2011-01-21 14:28:17 UTC (rev 4156) +++ branches/QUADS_QUERY_BRANCH/bigdata-sails/src/java/com/bigdata/rdf/sail/Rule2BOpUtility.java 2011-01-21 16:35:02 UTC (rev 4157) @@ -620,12 +620,12 @@ // } // just add all the constraints to the very last tail for now -// if (i == (order.length-1) && rule.getConstraintCount() > 0) { -// final Iterator<IConstraint> it = rule.getConstraints(); -// while (it.hasNext()) { -// constraints.add(it.next()); -// } -// } + if (i == (order.length-1) && rule.getConstraintCount() > 0) { + final Iterator<IConstraint> it = rule.getConstraints(); + while (it.hasNext()) { + constraints.add(it.next()); + } + } // annotations for this join. final List<NV> anns = new LinkedList<NV>(); @@ -730,23 +730,23 @@ } - if (rule.getConstraintCount() > 0) { - final Iterator<IConstraint> it = rule.getConstraints(); - while (it.hasNext()) { - final IConstraint c = it.next(); - final int condId = idFactory.incrementAndGet(); - final PipelineOp condOp = applyQueryHints( - new ConditionalRoutingOp(new BOp[]{left}, - NV.asMap(new NV[]{// - new NV(BOp.Annotations.BOP_ID,condId), - new NV(ConditionalRoutingOp.Annotations.CONDITION, c), - })), queryHints); - left = condOp; - if (log.isDebugEnabled()) { - log.debug("adding conditional routing op: " + condOp); - } - } - } +// if (rule.getConstraintCount() > 0) { +// final Iterator<IConstraint> it = rule.getConstraints(); +// while (it.hasNext()) { +// final IConstraint c = it.next(); +// final int condId = idFactory.incrementAndGet(); +// final PipelineOp condOp = applyQueryHints( +// new ConditionalRoutingOp(new BOp[]{left}, +// NV.asMap(new NV[]{// +// new NV(BOp.Annotations.BOP_ID,condId), +// new NV(ConditionalRoutingOp.Annotations.CONDITION, c), +// })), queryHints); +// left = condOp; +// if (log.isDebugEnabled()) { +// log.debug("adding conditional routing op: " + condOp); +// } +// } +// } if (log.isInfoEnabled()) { // just for now while i'm debugging Modified: branches/QUADS_QUERY_BRANCH/bigdata-sails/src/java/com/bigdata/rdf/sail/sop/SOp2BOpUtility.java =================================================================== --- branches/QUADS_QUERY_BRANCH/bigdata-sails/src/java/com/bigdata/rdf/sail/sop/SOp2BOpUtility.java 2011-01-21 14:28:17 UTC (rev 4156) +++ branches/QUADS_QUERY_BRANCH/bigdata-sails/src/java/com/bigdata/rdf/sail/sop/SOp2BOpUtility.java 2011-01-21 16:35:02 UTC (rev 4157) @@ -27,6 +27,7 @@ package com.bigdata.rdf.sail.sop; +import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; @@ -47,6 +48,7 @@ import com.bigdata.bop.NV; import com.bigdata.bop.PipelineOp; import com.bigdata.bop.ap.Predicate; +import com.bigdata.bop.bset.ConditionalRoutingOp; import com.bigdata.bop.controller.SubqueryOp; import com.bigdata.bop.controller.Union; import com.bigdata.bop.engine.QueryEngine; @@ -161,13 +163,22 @@ * join groups, and thus should be translated into ConditionalRoutingOps * for maximum efficiency. */ - final Collection<IConstraint> conditionals = + final Collection<IConstraint> preConditionals = new LinkedList<IConstraint>(); - final IRule rule = rule(join, conditionals); + /* + * These are constraints that use variables bound by subqueries, and + * thus cannot be attached to the predicates in this group. They are + * handled by ConditionalRoutingOps at the end of the group, after + * the subqueries have run. + */ + final Collection<IConstraint> postConditionals = + new LinkedList<IConstraint>(); + final IRule rule = rule(join, preConditionals, postConditionals); + PipelineOp left = Rule2BOpUtility.convert( - rule, conditionals, idFactory, db, queryEngine, queryHints); + rule, preConditionals, idFactory, db, queryEngine, queryHints); /* * Start with left=<this join group> and add a SubqueryOp for each @@ -190,9 +201,26 @@ new NV(SubqueryOp.Annotations.SUBQUERY, subquery),// new NV(SubqueryOp.Annotations.OPTIONAL,optional)// ); + if (log.isInfoEnabled()) { + log.info("adding a subquery: " + subqueryId + "\n" + left); + } } } + for (IConstraint c : postConditionals) { + final int condId = idFactory.incrementAndGet(); + final PipelineOp condOp = + new ConditionalRoutingOp(new BOp[]{left}, + NV.asMap(new NV[]{// + new NV(BOp.Annotations.BOP_ID,condId), + new NV(ConditionalRoutingOp.Annotations.CONDITION, c), + })); + left = condOp; + if (log.isDebugEnabled()) { + log.debug("adding post-conditional routing op: " + condOp); + } + } + if (!left.getEvaluationContext() .equals(BOpEvaluationContext.CONTROLLER) && !(left instanceof SubqueryOp)) { @@ -258,7 +286,8 @@ } protected static IRule rule(final SOpGroup group, - final Collection<IConstraint> conditionals) { + final Collection<IConstraint> preConditionals, + final Collection<IConstraint> postConditionals) { final Collection<IPredicate> preds = new LinkedList<IPredicate>(); final Collection<IConstraint> constraints = new LinkedList<IConstraint>(); @@ -266,36 +295,20 @@ /* * Gather up all the variables used by non-optional parent join groups */ - final Set<IVariable<?>> variables = new HashSet<IVariable<?>>(); + final Set<IVariable<?>> nonOptParentVars = new HashSet<IVariable<?>>(); SOpGroup parent = group; while ((parent = parent.getParent()) != null) { if (isNonOptionalJoinGroup(parent)) - collectPredicateVariables(variables, parent); + collectPredicateVariables(nonOptParentVars, parent); } + /* + * Gather up all the predicates in this group. + */ for (SOp sop : group) { final BOp bop = sop.getBOp(); if (bop instanceof IPredicate) { preds.add((IPredicate) bop); - } else if (bop instanceof IConstraint) { - final IConstraint c = (IConstraint) bop; - /* - * This constraint is a conditional if all of its variables - * appear in non-optional parent join groups - */ - final Iterator<IVariable<?>> vars = - BOpUtility.getSpannedVariables(c); - boolean conditional = true; - while (vars.hasNext()) { - final IVariable<?> v = vars.next(); - conditional &= variables.contains(v); - } - if (conditional) - conditionals.add(c); - else - constraints.add(c); - } else { - throw new IllegalArgumentException("illegal operator: " + sop); } } @@ -317,8 +330,95 @@ } } + /* + * Gather up all the variables used by predicates in this group + */ + final Set<IVariable<?>> groupVars = new HashSet<IVariable<?>>(); + for (IPredicate bop : preds) { + for (BOp arg : bop.args()) { + if (arg instanceof IVariable<?>) { + final IVariable<?> v = (IVariable<?>) arg; + groupVars.add(v); + } + } + } + + /* + * Gather up the constraints, segregating into three categories: + * -constraints: all variables used by predicates in this group + * -pre-conditionals: all variables already bound by parent group(s) + * -post-conditionals: some or all variables bound in subqueries + */ + for (SOp sop : group) { + final BOp bop = sop.getBOp(); + if (bop instanceof IConstraint) { + final IConstraint c = (IConstraint) bop; + + { // find the pre-conditionals + + final Iterator<IVariable<?>> constraintVars = + BOpUtility.getSpannedVariables(c); + + /* + * This constraint is a pre-conditional if all of its variables + * appear in non-optional parent join groups + */ + boolean preConditional = true; + while (constraintVars.hasNext()) { + final IVariable<?> v = constraintVars.next(); + preConditional &= nonOptParentVars.contains(v); + } + if (preConditional) { + preConditionals.add(c); + continue; + } + + } + + { // find the post-conditionals + + final Iterator<IVariable<?>> constraintVars = + BOpUtility.getSpannedVariables(c); + + /* + * This constraint is a post-conditional if not all of its + * variables appear in this join group or non-optional parent + * groups (bound by subqueries) + */ + boolean postConditional = false; + while (constraintVars.hasNext()) { + final IVariable<?> v = constraintVars.next(); + if (!nonOptParentVars.contains(v) && + !groupVars.contains(v)) { + postConditional = true; + break; + } + } + if (postConditional) { + postConditionals.add(c); + continue; + } + + } + + /* + * Neither pre nor post conditional, but a constraint on the + * predicates in this group. done this roundabout way for the + * benefit of the RTO + */ + constraints.add(c); + } + } + final IVariable<?>[] required = group.getTree().getRequiredVars(); + if (log.isInfoEnabled()) { + log.info("preds: " + Arrays.toString(preds.toArray())); + log.info("constraints: " + Arrays.toString(constraints.toArray())); + log.info("preConds: " + Arrays.toString(preConditionals.toArray())); + log.info("postConds: " + Arrays.toString(postConditionals.toArray())); + } + final IRule rule = new Rule( "dummy rule", null, // head This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |