public static ExprList collectExprs(Op op, ExprList result) { if (op instanceof OpLeftJoin) { OpLeftJoin x = (OpLeftJoin) op; if (x.getExprs() != null) { result.addAll(x.getExprs()); } collectExprs(x.getLeft(), result); collectExprs(x.getRight(), result); } else if (op instanceof OpFilter) { OpFilter x = (OpFilter) op; result.addAll(x.getExprs()); collectExprs(x.getSubOp(), result); } else if (op instanceof OpJoin) { OpJoin x = (OpJoin) op; collectExprs(x.getLeft(), result); collectExprs(x.getRight(), result); } else if (op instanceof OpUnion) { System.out.println( "Warning: Collecting expressions from unions. Since the same vars may appear within different (parts of) unions, it may be ambiguous to which part the expression refers."); OpUnion x = (OpUnion) op; collectExprs(x.getLeft(), result); collectExprs(x.getRight(), result); } else if (op instanceof OpQuadPattern) { } else if (op instanceof OpSequence) { OpSequence x = (OpSequence) op; for (Op element : x.getElements()) { collectExprs(element, result); } } else { throw new RuntimeException("Not implemented. Type: " + op.getClass()); } return result; }