@Override public void meet(Union union) { super.meet(union); TupleExpr leftArg = union.getLeftArg(); TupleExpr rightArg = union.getRightArg(); if (leftArg instanceof EmptySet) { union.replaceWith(rightArg); } else if (rightArg instanceof EmptySet) { union.replaceWith(leftArg); } else if (leftArg instanceof SingletonSet && rightArg instanceof SingletonSet) { union.replaceWith(leftArg); } }
@Override public void meet(Union union) { super.meet(union); TupleExpr leftArg = union.getLeftArg(); TupleExpr rightArg = union.getRightArg(); if (leftArg instanceof EmptySet) { union.replaceWith(rightArg); } else if (rightArg instanceof EmptySet) { union.replaceWith(leftArg); } else if (leftArg instanceof SingletonSet && rightArg instanceof SingletonSet) { union.replaceWith(leftArg); } }
@Override public void meet(Union union) { super.meet(union); TupleExpr leftArg = union.getLeftArg(); TupleExpr rightArg = union.getRightArg(); if (leftArg instanceof EmptySet) { union.replaceWith(rightArg); } else if (rightArg instanceof EmptySet) { union.replaceWith(leftArg); } else if (leftArg instanceof SingletonSet && rightArg instanceof SingletonSet) { union.replaceWith(leftArg); } }
@Override public void meet(Union union) { super.meet(union); TupleExpr leftArg = union.getLeftArg(); TupleExpr rightArg = union.getRightArg(); if (leftArg instanceof EmptySet) { union.replaceWith(rightArg); } else if (rightArg instanceof EmptySet) { union.replaceWith(leftArg); } else if (leftArg instanceof SingletonSet && rightArg instanceof SingletonSet) { union.replaceWith(leftArg); } }
private void addOwners(Union node, List<Owned<TupleExpr>> ows) { if (ows.size() == 1) { RepositoryConnection o = ows.get(0).getOwner(); if (o != null) { // every element is used by the same owner node.replaceWith(new OwnedTupleExpr(o, node.clone())); } } else { TupleExpr replacement = null; for (Owned<TupleExpr> e : ows) { RepositoryConnection o = e.getOwner(); TupleExpr union = e.getOperation(); if (o == null) { // multiple owners for (TupleExpr arg : getUnionArgs(union)) { replacement = replacement == null ? arg.clone() : new Union(replacement, arg.clone()); } } else { OwnedTupleExpr arg = new OwnedTupleExpr(o, union); replacement = replacement == null ? arg : new Union(replacement, arg); } } node.replaceWith(replacement); } }
private void addOwners(Union node, List<Owned<TupleExpr>> ows) { if (ows.size() == 1) { RepositoryConnection owner = ows.get(0).getOwner(); if (owner != null) { // every element is used by the same owner node.replaceWith(new OwnedTupleExpr(owner, node.clone())); } } else { TupleExpr replacement = null; for (Owned<TupleExpr> e : ows) { RepositoryConnection owner = e.getOwner(); TupleExpr union = e.getOperation(); if (owner == null) { // multiple owners for (TupleExpr arg : getUnionArgs(union)) { replacement = replacement == null ? arg.clone() : new Union(replacement, arg.clone()); // NOPMD } } else { OwnedTupleExpr arg = new OwnedTupleExpr(owner, union); // NOPMD replacement = replacement == null ? arg : new Union( // NOPMD replacement, arg); } } node.replaceWith(replacement); } }
@Override public void meet(Union union) { super.meet(union); TupleExpr leftArg = union.getLeftArg(); TupleExpr rightArg = union.getRightArg(); if (leftArg instanceof Join && rightArg instanceof Join) { Join leftJoinArg = (Join)leftArg; Join rightJoin = (Join)rightArg; if (leftJoinArg.getLeftArg().equals(rightJoin.getLeftArg())) { // factor out the left-most join argument Join newJoin = new Join(); union.replaceWith(newJoin); newJoin.setLeftArg(leftJoinArg.getLeftArg()); newJoin.setRightArg(union); union.setLeftArg(leftJoinArg.getRightArg()); union.setRightArg(rightJoin.getRightArg()); union.visit(this); } } } }
@Override public void meet(Union node) throws RuntimeException { super.meet(node); TupleExpr l = node.getLeftArg(); TupleExpr r = node.getRightArg(); if (!(l instanceof SelectQuery && r instanceof SelectQuery)) return; SelectQuery left = (SelectQuery)l; SelectQuery right = (SelectQuery)r; if (left.isComplex() || right.isComplex()) return; UnionItem union = new UnionItem("u" + aliasCount++); union.addUnion(left.getFrom().clone()); union.addUnion(right.getFrom().clone()); SelectQuery query = new SelectQuery(); query.setFrom(union); mergeSelectClause(query, left); mergeSelectClause(query, right); addProjectionsFromUnion(query, union); node.replaceWith(query); }