Skip to content

Commit 0c31c56

Browse files
committed
more potential optimisations
1 parent 0286771 commit 0c31c56

5 files changed

Lines changed: 32 additions & 6 deletions

File tree

core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/JoinKeyCacheIterator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,18 +112,19 @@ private CacheEntry evaluateRight(BindingSet leftBindings) {
112112
return CacheEntry.empty();
113113
}
114114
List<BindingSet> results = new ArrayList<>();
115+
boolean cacheable = true;
115116
try {
116117
while (iteration.hasNext()) {
117118
BindingSet candidate = iteration.next();
118119
results.add(stripLeftBindings(candidate));
119120
if (maxResultsPerKey > 0 && results.size() > maxResultsPerKey) {
120-
return new CacheEntry(results, false);
121+
cacheable = false;
121122
}
122123
}
123124
} finally {
124125
iteration.close();
125126
}
126-
return new CacheEntry(results, true);
127+
return new CacheEntry(results, cacheable);
127128
}
128129

129130
private BindingSet stripLeftBindings(BindingSet candidate) {

core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/iterator/LeftJoinKeyCacheIterator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,18 +117,19 @@ private CacheEntry evaluateRight(BindingSet leftBindings) {
117117
return CacheEntry.empty();
118118
}
119119
List<BindingSet> results = new ArrayList<>();
120+
boolean cacheable = true;
120121
try {
121122
while (iteration.hasNext()) {
122123
BindingSet candidate = iteration.next();
123124
results.add(stripLeftBindings(candidate));
124125
if (maxResultsPerKey > 0 && results.size() > maxResultsPerKey) {
125-
return new CacheEntry(results, false);
126+
cacheable = false;
126127
}
127128
}
128129
} finally {
129130
iteration.close();
130131
}
131-
return new CacheEntry(results, true);
132+
return new CacheEntry(results, cacheable);
132133
}
133134

134135
private BindingSet stripLeftBindings(BindingSet candidate) {

core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/SparqlUoOptimizer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ public SparqlUoOptimizer(EvaluationStatistics evaluationStatistics, SparqlUoConf
6666
public void optimize(TupleExpr tupleExpr, Dataset dataset, BindingSet bindings) {
6767
PARENT_REFERENCE_CLEANER.optimize(tupleExpr, dataset, bindings);
6868
tupleExpr.visit(new SparqlUoVisitor());
69-
optionalFilterJoinOptimizer.optimize(tupleExpr, dataset, bindings);
69+
if (config.enableOptionalFilterJoin()) {
70+
optionalFilterJoinOptimizer.optimize(tupleExpr, dataset, bindings);
71+
}
7072
}
7173

7274
private class SparqlUoVisitor extends AbstractQueryModelVisitor<RuntimeException> {

core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/SparqlUoQueryOptimizerPipeline.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class SparqlUoQueryOptimizerPipeline implements QueryOptimizerPipeline {
3232
private final MinusOptimizer minusOptimizer;
3333
private final ExistsConstantOptimizer existsConstantOptimizer;
3434
private final QueryJoinOptimizer joinOptimizer;
35+
private final boolean enableOptionalFilterJoin;
3536

3637
public SparqlUoQueryOptimizerPipeline(EvaluationStrategy strategy, TripleSource tripleSource,
3738
EvaluationStatistics evaluationStatistics) {
@@ -51,6 +52,7 @@ public SparqlUoQueryOptimizerPipeline(EvaluationStrategy strategy, TripleSource
5152
this.existsConstantOptimizer = new ExistsConstantOptimizer();
5253
this.joinOptimizer = new QueryJoinOptimizer(evaluationStatistics, strategy.isTrackResultSize(), tripleSource,
5354
false);
55+
this.enableOptionalFilterJoin = config.enableOptionalFilterJoin();
5456
}
5557

5658
@Override
@@ -73,7 +75,9 @@ public Iterable<QueryOptimizer> getOptimizers() {
7375
if (optimizer instanceof FilterOptimizer) {
7476
optimizers.add(optimizer);
7577
optimizers.add(unionCommonFilterBindingSetOptimizer);
76-
optimizers.add(optionalFilterJoinOptimizer);
78+
if (enableOptionalFilterJoin) {
79+
optimizers.add(optionalFilterJoinOptimizer);
80+
}
7781
if (!statementPatternInserted) {
7882
optimizers.add(unionCommonStatementPatternOptimizer);
7983
statementPatternInserted = true;

core/queryalgebra/evaluation/src/main/java/org/eclipse/rdf4j/query/algebra/evaluation/optimizer/sparqluo/SparqlUoConfig.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public final class SparqlUoConfig {
2121
public static final String PROP_SIMULATE_JOIN_ORDER = "rdf4j.sparqluo.simulateJoinOrder";
2222
public static final String PROP_MAX_BSA_UNION_DISTRIBUTION = "rdf4j.sparqluo.maxBindingSetAssignmentUnionSize";
2323
public static final String PROP_ENABLE_MINUS_UNION_SPLIT = "rdf4j.sparqluo.enableMinusUnionSplit";
24+
public static final String PROP_ENABLE_OPTIONAL_FILTER_JOIN = "rdf4j.sparqluo.enableOptionalFilterJoin";
2425

2526
public static final boolean DEFAULT_ALLOW_NON_IMPROVING = false;
2627
public static final double DEFAULT_VAR_DOMAIN = 10.0;
@@ -30,6 +31,7 @@ public final class SparqlUoConfig {
3031
public static final boolean DEFAULT_SIMULATE_JOIN_ORDER = true;
3132
public static final int DEFAULT_MAX_BSA_UNION_DISTRIBUTION = 32;
3233
public static final boolean DEFAULT_ENABLE_MINUS_UNION_SPLIT = true;
34+
public static final boolean DEFAULT_ENABLE_OPTIONAL_FILTER_JOIN = true;
3335

3436
private final boolean allowNonImprovingTransforms;
3537
private final double assumedVarDomainCardinality;
@@ -39,6 +41,7 @@ public final class SparqlUoConfig {
3941
private final boolean simulateJoinOrder;
4042
private final int maxBindingSetAssignmentUnionSize;
4143
private final boolean enableMinusUnionSplit;
44+
private final boolean enableOptionalFilterJoin;
4245

4346
private SparqlUoConfig(Builder builder) {
4447
this.allowNonImprovingTransforms = builder.allowNonImprovingTransforms;
@@ -50,6 +53,7 @@ private SparqlUoConfig(Builder builder) {
5053
this.maxBindingSetAssignmentUnionSize = nonNegativeOrDefault(builder.maxBindingSetAssignmentUnionSize,
5154
DEFAULT_MAX_BSA_UNION_DISTRIBUTION);
5255
this.enableMinusUnionSplit = builder.enableMinusUnionSplit;
56+
this.enableOptionalFilterJoin = builder.enableOptionalFilterJoin;
5357
}
5458

5559
public static SparqlUoConfig defaultConfig() {
@@ -90,6 +94,10 @@ public static SparqlUoConfig fromSystemProperties() {
9094
if (enableMinusUnionSplit != null) {
9195
builder.enableMinusUnionSplit(enableMinusUnionSplit);
9296
}
97+
Boolean enableOptionalFilterJoin = readBoolean(PROP_ENABLE_OPTIONAL_FILTER_JOIN);
98+
if (enableOptionalFilterJoin != null) {
99+
builder.enableOptionalFilterJoin(enableOptionalFilterJoin);
100+
}
93101
return builder.build();
94102
}
95103

@@ -129,6 +137,10 @@ public boolean enableMinusUnionSplit() {
129137
return enableMinusUnionSplit;
130138
}
131139

140+
public boolean enableOptionalFilterJoin() {
141+
return enableOptionalFilterJoin;
142+
}
143+
132144
private static Boolean readBoolean(String property) {
133145
String value = System.getProperty(property);
134146
if (value == null) {
@@ -182,6 +194,7 @@ public static final class Builder {
182194
private boolean simulateJoinOrder = DEFAULT_SIMULATE_JOIN_ORDER;
183195
private int maxBindingSetAssignmentUnionSize = DEFAULT_MAX_BSA_UNION_DISTRIBUTION;
184196
private boolean enableMinusUnionSplit = DEFAULT_ENABLE_MINUS_UNION_SPLIT;
197+
private boolean enableOptionalFilterJoin = DEFAULT_ENABLE_OPTIONAL_FILTER_JOIN;
185198

186199
private Builder() {
187200
}
@@ -226,6 +239,11 @@ public Builder enableMinusUnionSplit(boolean enableMinusUnionSplit) {
226239
return this;
227240
}
228241

242+
public Builder enableOptionalFilterJoin(boolean enableOptionalFilterJoin) {
243+
this.enableOptionalFilterJoin = enableOptionalFilterJoin;
244+
return this;
245+
}
246+
229247
public SparqlUoConfig build() {
230248
return new SparqlUoConfig(this);
231249
}

0 commit comments

Comments
 (0)