Skip to content

Commit 617909f

Browse files
committed
wip
1 parent faedd30 commit 617909f

3 files changed

Lines changed: 36 additions & 19 deletions

File tree

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

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
import java.util.ArrayList;
1515
import java.util.List;
16-
import java.util.Set;
1716

1817
import org.eclipse.rdf4j.query.BindingSet;
1918
import org.eclipse.rdf4j.query.Dataset;
@@ -65,10 +64,6 @@ public void meet(Difference difference) {
6564
difference.replaceWith(leftArg);
6665
return;
6766
}
68-
if (disjoint(leftArg.getBindingNames(), rightArg.getBindingNames())) {
69-
difference.replaceWith(leftArg);
70-
return;
71-
}
7267
if (enableUnionSplit && rightArg instanceof Union) {
7368
Union union = (Union) rightArg;
7469
List<TupleExpr> branches = new ArrayList<>();
@@ -84,18 +79,6 @@ public void meet(Difference difference) {
8479
}
8580
}
8681

87-
private static boolean disjoint(Set<String> leftBindings, Set<String> rightBindings) {
88-
if (leftBindings.isEmpty() || rightBindings.isEmpty()) {
89-
return true;
90-
}
91-
for (String name : leftBindings) {
92-
if (rightBindings.contains(name)) {
93-
return false;
94-
}
95-
}
96-
return true;
97-
}
98-
9982
private static void collectUnionBranches(TupleExpr expr, boolean variableScopeChange, List<TupleExpr> branches) {
10083
if (expr instanceof Union && ((Union) expr).isVariableScopeChange() == variableScopeChange) {
10184
Union union = (Union) expr;

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,10 @@ private void applyUnionCommonPrefixPullUp(BeGroupNode group, Set<BeUnionNode> un
205205
index++;
206206
continue;
207207
}
208+
if (leavesEmptyBranch(union, common)) {
209+
index++;
210+
continue;
211+
}
208212
double baseCost = costEstimator.estimateGroupCost(group);
209213
BeUndoToken undo = new BeUndoToken();
210214
undo.capture(group);
@@ -394,6 +398,38 @@ private List<StatementPattern> leadingStatementPatterns(BeGroupNode branch) {
394398
return patterns;
395399
}
396400

401+
private boolean leavesEmptyBranch(BeUnionNode union, List<StatementPattern> common) {
402+
Map<StatementPatternKey, Integer> counts = countPatterns(common);
403+
for (BeGroupNode branch : union.getBranches()) {
404+
if (branchWouldBeEmpty(branch, new HashMap<>(counts))) {
405+
return true;
406+
}
407+
}
408+
return false;
409+
}
410+
411+
private boolean branchWouldBeEmpty(BeGroupNode branch, Map<StatementPatternKey, Integer> removalCounts) {
412+
int totalPatterns = 0;
413+
for (BeNode child : branch.getChildren()) {
414+
if (!(child instanceof BeBgpNode)) {
415+
return false;
416+
}
417+
totalPatterns += ((BeBgpNode) child).getStatementPatterns().size();
418+
}
419+
int removed = 0;
420+
for (BeNode child : branch.getChildren()) {
421+
for (StatementPattern pattern : ((BeBgpNode) child).getStatementPatterns()) {
422+
StatementPatternKey key = StatementPatternKey.of(pattern);
423+
Integer remaining = removalCounts.get(key);
424+
if (remaining != null && remaining > 0) {
425+
removalCounts.put(key, remaining - 1);
426+
removed++;
427+
}
428+
}
429+
}
430+
return removed == totalPatterns;
431+
}
432+
397433
private Map<StatementPatternKey, Integer> countPatterns(List<StatementPattern> patterns) {
398434
Map<StatementPatternKey, Integer> counts = new HashMap<>();
399435
for (StatementPattern pattern : patterns) {

core/sail/memory/src/test/java/org/eclipse/rdf4j/sail/memory/MemoryStoreSparqlUoOptimizerTest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ private void assertUnionCommonPrefix(boolean useSparqlUo) {
110110
}
111111
}
112112

113-
114113
private void assertMinusInsideOptional(boolean useSparqlUo) {
115114
SailRepository repo = createRepository(useSparqlUo);
116115
try (RepositoryConnection connection = repo.getConnection()) {
@@ -233,7 +232,6 @@ private SailRepository createRepository(boolean useSparqlUo) {
233232
return repository;
234233
}
235234

236-
237235
private EvaluationStrategyFactory createStandardPipelineFactory(MemoryStore store) {
238236
DefaultEvaluationStrategyFactory factory = new DefaultEvaluationStrategyFactory(
239237
store.getFederatedServiceResolver()) {

0 commit comments

Comments
 (0)