Skip to content

Commit 5aea936

Browse files
committed
GH-5294 make the StatementPatternCollector less recursive
1 parent babd10b commit 5aea936

1 file changed

Lines changed: 33 additions & 0 deletions

File tree

core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/collectors/StatementPatternCollector.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
import java.util.List;
1616

1717
import org.eclipse.rdf4j.query.algebra.Filter;
18+
import org.eclipse.rdf4j.query.algebra.Join;
1819
import org.eclipse.rdf4j.query.algebra.QueryModelNode;
1920
import org.eclipse.rdf4j.query.algebra.StatementPattern;
21+
import org.eclipse.rdf4j.query.algebra.TupleExpr;
2022
import org.eclipse.rdf4j.query.algebra.helpers.AbstractSimpleQueryModelVisitor;
2123

2224
/**
@@ -46,6 +48,37 @@ public void meet(Filter node) {
4648
node.getArg().visit(this);
4749
}
4850

51+
@Override
52+
public void meet(Join node) throws RuntimeException {
53+
TupleExpr leftArg = node.getLeftArg();
54+
TupleExpr rightArg = node.getRightArg();
55+
56+
// INSERT clause is often a deeply nested join. Recursive approach may cause stack overflow. Attempt
57+
// non-recursive (or at least less-recursive) approach first.
58+
while (true) {
59+
if (leftArg instanceof Join && !(rightArg instanceof Join)) {
60+
rightArg.visit(this);
61+
62+
Join join = (Join) leftArg;
63+
leftArg = join.getLeftArg();
64+
rightArg = join.getRightArg();
65+
66+
} else if (rightArg instanceof Join && !(leftArg instanceof Join)) {
67+
leftArg.visit(this);
68+
69+
Join join = (Join) rightArg;
70+
leftArg = join.getLeftArg();
71+
rightArg = join.getRightArg();
72+
73+
} else {
74+
leftArg.visit(this);
75+
rightArg.visit(this);
76+
return;
77+
}
78+
}
79+
80+
}
81+
4982
@Override
5083
public void meet(StatementPattern node) {
5184
statementPatterns.add(node);

0 commit comments

Comments
 (0)