Skip to content

Commit 2b5354d

Browse files
committed
working on new ID based join iterator
1 parent 7812d82 commit 2b5354d

4 files changed

Lines changed: 27 additions & 22 deletions

File tree

core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/LmdbOverlayEvaluationDataset.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,8 +292,8 @@ public RecordIterator getOrderedRecordIterator(long[] binding, int subjIndex, in
292292
return getRecordIteratorInternal(binding, subjIndex, predIndex, objIndex, ctxIndex, patternIds, keyBuffers,
293293
bindingReuse, quadReuse);
294294
}
295-
return getOrderedRecordIterator(binding, subjIndex, predIndex, objIndex, ctxIndex, patternIds, order,
296-
bindingReuse, quadReuse);
295+
return LmdbEvaluationDataset.super.getOrderedRecordIterator(binding, subjIndex, predIndex, objIndex, ctxIndex,
296+
patternIds, order, keyBuffers, bindingReuse, quadReuse);
297297
}
298298

299299
@Override

core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/LmdbSailStore.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1582,7 +1582,6 @@ public void close() {
15821582
if (base != null) {
15831583
base.close();
15841584
base = null;
1585-
lmdbBase = null;
15861585
}
15871586
}
15881587
}

core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/join/LmdbIdJoinIterator.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public class LmdbIdJoinIterator extends LookAheadIteration<BindingSet> {
3838

3939
@FunctionalInterface
4040
interface RecordIteratorFactory {
41-
RecordIterator apply(long[] leftRecord) throws QueryEvaluationException;
41+
RecordIterator apply(long[] leftRecord, RecordIterator reuse) throws QueryEvaluationException;
4242
}
4343

4444
private static final RecordIterator EMPTY_RECORD_ITERATOR = new RecordIterator() {
@@ -228,6 +228,7 @@ private Value resolveValue(long id, int position, ValueStore valueStore) throws
228228
private final BindingSet initialBindings;
229229
private final ValueStore valueStore;
230230

231+
private RecordIterator reusableRightIterator;
231232
private RecordIterator currentRightIterator;
232233
private long[] currentLeftRecord;
233234
private BindingSet currentLeftBinding;
@@ -263,21 +264,38 @@ protected BindingSet getNextElement() throws QueryEvaluationException {
263264
}
264265
return result;
265266
}
266-
currentRightIterator.close();
267+
RecordIterator completed = currentRightIterator;
267268
currentRightIterator = null;
269+
if (completed != EMPTY_RECORD_ITERATOR) {
270+
reusableRightIterator = completed;
271+
} else {
272+
reusableRightIterator = null;
273+
}
274+
completed.close();
268275
}
269276

270277
long[] leftRecord = nextRecord(leftIterator);
271278
if (leftRecord == null) {
279+
reusableRightIterator = null;
272280
return null;
273281
}
274282

275283
currentLeftRecord = leftRecord;
276284
currentLeftBinding = null;
277285

278-
currentRightIterator = rightFactory.apply(leftRecord);
286+
RecordIterator reuseCandidate = reusableRightIterator;
287+
if (reuseCandidate == EMPTY_RECORD_ITERATOR) {
288+
reuseCandidate = null;
289+
}
290+
291+
currentRightIterator = rightFactory.apply(leftRecord, reuseCandidate);
279292
if (currentRightIterator == null) {
280293
currentRightIterator = emptyRecordIterator();
294+
reusableRightIterator = null;
295+
} else if (currentRightIterator == EMPTY_RECORD_ITERATOR) {
296+
reusableRightIterator = null;
297+
} else {
298+
reusableRightIterator = currentRightIterator;
281299
}
282300
}
283301
}

core/sail/lmdb/src/main/java/org/eclipse/rdf4j/sail/lmdb/join/LmdbIdJoinQueryEvaluationStep.java

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,6 @@ public CloseableIteration<BindingSet> evaluate(BindingSet bindings) {
188188
}
189189

190190
final RecordIterator[] leftReuseHolder = new RecordIterator[1];
191-
final RecordIterator[] rightReuseHolder = new RecordIterator[1];
192191

193192
if (!"false".equalsIgnoreCase(System.getProperty("rdf4j.lmdb.experimentalTwoPatternArrayJoin", "true"))) {
194193
ValueStore valueStore = dataset.getValueStore();
@@ -216,7 +215,7 @@ public CloseableIteration<BindingSet> evaluate(BindingSet bindings) {
216215
long[] bindingSnapshot = new long[initialBinding.length];
217216
long[] rightScratch = new long[initialBinding.length];
218217
long[] rightQuadScratch = new long[4];
219-
LmdbIdJoinIterator.RecordIteratorFactory rightFactory = leftRecord -> {
218+
LmdbIdJoinIterator.RecordIteratorFactory rightFactory = (leftRecord, reuse) -> {
220219
System.arraycopy(initialBinding, 0, bindingSnapshot, 0, initialBinding.length);
221220
for (String name : leftInfo.getVariableNames()) {
222221
int pos = bindingInfo.getIndex(name);
@@ -228,13 +227,7 @@ public CloseableIteration<BindingSet> evaluate(BindingSet bindings) {
228227
}
229228
}
230229
RecordIterator iter = dataset.getRecordIterator(bindingSnapshot, subjIdx, predIdx, objIdx, ctxIdx,
231-
patternIds, keyBuffersFor(rightPattern), rightScratch, rightQuadScratch,
232-
rightReuseHolder[0]);
233-
if (iter != null && iter != LmdbIdJoinIterator.emptyRecordIterator()) {
234-
rightReuseHolder[0] = iter;
235-
} else {
236-
rightReuseHolder[0] = null;
237-
}
230+
patternIds, keyBuffersFor(rightPattern), rightScratch, rightQuadScratch, reuse);
238231
return iter;
239232
};
240233

@@ -252,19 +245,14 @@ patternIds, keyBuffersFor(rightPattern), rightScratch, rightQuadScratch,
252245
leftReuseHolder[0] = null;
253246
}
254247

255-
LmdbIdJoinIterator.RecordIteratorFactory rightFactory = leftRecord -> {
248+
LmdbIdJoinIterator.RecordIteratorFactory rightFactory = (leftRecord, reuse) -> {
256249
MutableBindingSet bs = context.createBindingSet();
257250
bindings.forEach(binding -> bs.addBinding(binding.getName(), binding.getValue()));
258251
if (!leftInfo.applyRecord(leftRecord, bs, valueStore)) {
259252
return LmdbIdJoinIterator.emptyRecordIterator();
260253
}
261254
RecordIterator rightIter = dataset.getRecordIterator(rightPattern, bs, keyBuffersFor(rightPattern),
262-
rightReuseHolder[0]);
263-
if (rightIter != null && rightIter != LmdbIdJoinIterator.emptyRecordIterator()) {
264-
rightReuseHolder[0] = rightIter;
265-
} else {
266-
rightReuseHolder[0] = null;
267-
}
255+
reuse);
268256
return rightIter;
269257
};
270258

0 commit comments

Comments
 (0)