@Override public ExternalSet clone() { final ExternalTupleSet clone = (ExternalTupleSet) super.clone(); clone.setProjectionExpr(this.tupleExpr.clone()); clone.tableVarMap = Maps.newHashMap(); for(final String s: this.tableVarMap.keySet()) { clone.tableVarMap.put(s,this.tableVarMap.get(s)); } clone.supportedVarOrders = Maps.newHashMap(); for(final String s: this.supportedVarOrders.keySet()) { clone.supportedVarOrders.put(s,this.supportedVarOrders.get(s)); } return clone; }
private List<TupleExpr> getPlans(final TupleExpr te) { final NodeCollector nc = new NodeCollector(); te.visit(nc); final Set<QueryModelNode> nodeSet = nc.getNodeSet(); final List<Filter> filterList = nc.getFilterSet(); final Projection projection = nc.getProjection().clone(); final List<TupleExpr> queryPlans = Lists.newArrayList(); final Collection<List<QueryModelNode>> plans = Collections2.permutations(nodeSet); for (final List<QueryModelNode> p : plans) { if (p.size() == 0) { throw new IllegalArgumentException("Tuple must contain at least one node!"); } else if (p.size() == 1) { queryPlans.add(te); } else { queryPlans.add(buildTuple(p, filterList, projection)); } } return queryPlans; }
private TupleExpr buildTuple(final List<QueryModelNode> nodes, final List<Filter> filters, final Projection projection) { final Projection proj = projection.clone(); Join join = null; join = new Join((TupleExpr) nodes.get(0).clone(), (TupleExpr) nodes.get(1).clone()); for (int i = 2; i < nodes.size(); i++) { join = new Join(join, (TupleExpr) nodes.get(i).clone()); } if (filters.size() == 0) { proj.setArg(join); return proj; } else { TupleExpr queryPlan = join; for (final Filter f : filters) { final Filter filt = f.clone(); filt.setArg(queryPlan); queryPlan = filt; } proj.setArg(queryPlan); return proj; } }
@Override public void meet(Order node) { for (OrderElem e : node.getElements()) { e.visit(this); } if (variablesProjected) { QueryModelNode parent = node.getParentNode(); if (projection == parent) { node.replaceWith(node.getArg().clone()); node.setArg(projection.clone()); Order replacement = node.clone(); projection.replaceWith(replacement); QueryModelNode distinct = replacement.getParentNode(); if (distinct instanceof Distinct) { distinct.replaceWith(new Reduced(replacement.clone())); } } } }
@Override public void meet(Order node) { for (OrderElem e : node.getElements()) { e.visit(this); } if (variablesProjected) { QueryModelNode parent = node.getParentNode(); if (projection == parent) { node.replaceWith(node.getArg().clone()); node.setArg(projection.clone()); Order replacement = node.clone(); projection.replaceWith(replacement); QueryModelNode distinct = replacement.getParentNode(); if (distinct instanceof Distinct) { distinct.replaceWith(new Reduced(replacement.clone())); } } } }