File tree Expand file tree Collapse file tree
core/queryalgebra/model/src/main/java/org/eclipse/rdf4j/query/algebra/helpers/collectors Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1515import java .util .List ;
1616
1717import org .eclipse .rdf4j .query .algebra .Filter ;
18+ import org .eclipse .rdf4j .query .algebra .Join ;
1819import org .eclipse .rdf4j .query .algebra .QueryModelNode ;
1920import org .eclipse .rdf4j .query .algebra .StatementPattern ;
21+ import org .eclipse .rdf4j .query .algebra .TupleExpr ;
2022import 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 );
You can’t perform that action at this time.
0 commit comments