Skip to content

Commit b5973b6

Browse files
committed
working on new ID based join iterator
1 parent 7c72ba9 commit b5973b6

2 files changed

Lines changed: 78 additions & 46 deletions

File tree

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

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
package org.eclipse.rdf4j.sail.lmdb;
1212

1313
import java.io.IOException;
14+
import java.util.Arrays;
1415
import java.util.Collections;
1516
import java.util.LinkedHashMap;
1617
import java.util.Map;
@@ -101,6 +102,82 @@ public long getId(long[] record, String varName) {
101102
return record[i];
102103
}
103104

105+
public long[] createInitialBinding(BindingSet bindings, ValueStore valueStore) throws QueryEvaluationException {
106+
long[] binding = new long[size()];
107+
Arrays.fill(binding, LmdbValue.UNKNOWN_ID);
108+
if (bindings == null || bindings.isEmpty()) {
109+
return binding;
110+
}
111+
112+
if (prepared != null) {
113+
for (Entry entry : prepared) {
114+
Value value = entry.getter.apply(bindings);
115+
if (value == null) {
116+
continue;
117+
}
118+
long id = resolveId(valueStore, value);
119+
if (id == LmdbValue.UNKNOWN_ID) {
120+
return null;
121+
}
122+
binding[entry.recordIndex] = id;
123+
}
124+
return binding;
125+
}
126+
127+
if (bindings instanceof ArrayBindingSet) {
128+
ArrayBindingSet abs = (ArrayBindingSet) bindings;
129+
for (Map.Entry<String, Integer> entry : indexByVar.entrySet()) {
130+
Function<ArrayBindingSet, Value> getter = abs.getDirectGetValue(entry.getKey());
131+
if (getter == null) {
132+
continue;
133+
}
134+
Value value = getter.apply(abs);
135+
if (value == null) {
136+
continue;
137+
}
138+
long id = resolveId(valueStore, value);
139+
if (id == LmdbValue.UNKNOWN_ID) {
140+
return null;
141+
}
142+
binding[entry.getValue()] = id;
143+
}
144+
return binding;
145+
}
146+
147+
for (Map.Entry<String, Integer> entry : indexByVar.entrySet()) {
148+
Value value = bindings.getValue(entry.getKey());
149+
if (value == null) {
150+
continue;
151+
}
152+
long id = resolveId(valueStore, value);
153+
if (id == LmdbValue.UNKNOWN_ID) {
154+
return null;
155+
}
156+
binding[entry.getValue()] = id;
157+
}
158+
return binding;
159+
}
160+
161+
private static long resolveId(ValueStore valueStore, Value value) throws QueryEvaluationException {
162+
if (value == null) {
163+
return LmdbValue.UNKNOWN_ID;
164+
}
165+
if (value instanceof LmdbValue) {
166+
LmdbValue lmdbValue = (LmdbValue) value;
167+
if (lmdbValue.getValueStoreRevision().getValueStore() == valueStore) {
168+
long id = lmdbValue.getInternalID();
169+
if (id != LmdbValue.UNKNOWN_ID) {
170+
return id;
171+
}
172+
}
173+
}
174+
try {
175+
return valueStore.getId(value);
176+
} catch (IOException e) {
177+
throw new QueryEvaluationException(e);
178+
}
179+
}
180+
104181
@Override
105182
public boolean applyRecord(long[] record, MutableBindingSet target, ValueStore valueStore)
106183
throws QueryEvaluationException {

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

Lines changed: 1 addition & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ public CloseableIteration<BindingSet> evaluate(BindingSet bindings) {
147147
}
148148

149149
ValueStore valueStore = dataset.getValueStore();
150-
long[] initialBinding = createInitialBinding(finalInfo, bindings, valueStore);
150+
long[] initialBinding = finalInfo.createInitialBinding(bindings, valueStore);
151151
if (initialBinding == null) {
152152
return new EmptyIteration<>();
153153
}
@@ -175,51 +175,6 @@ private LmdbEvaluationDataset resolveDataset() {
175175
.orElseThrow(() -> new IllegalStateException("No active LMDB dataset available for join evaluation"));
176176
}
177177

178-
private static long[] createInitialBinding(IdBindingInfo info, BindingSet bindings, ValueStore valueStore)
179-
throws QueryEvaluationException {
180-
long[] binding = new long[info.size()];
181-
Arrays.fill(binding, LmdbValue.UNKNOWN_ID);
182-
if (bindings == null || bindings.isEmpty()) {
183-
return binding;
184-
}
185-
for (String name : info.getVariableNames()) {
186-
Value value = bindings.getValue(name);
187-
if (value == null) {
188-
continue;
189-
}
190-
long id = resolveId(valueStore, value);
191-
if (id == LmdbValue.UNKNOWN_ID) {
192-
return null;
193-
}
194-
int index = info.getIndex(name);
195-
if (index >= 0) {
196-
binding[index] = id;
197-
}
198-
}
199-
return binding;
200-
}
201-
202-
private static long resolveId(ValueStore valueStore, Value value) throws QueryEvaluationException {
203-
if (value == null) {
204-
return LmdbValue.UNKNOWN_ID;
205-
}
206-
if (value instanceof LmdbValue) {
207-
LmdbValue lmdbValue = (LmdbValue) value;
208-
if (lmdbValue.getValueStoreRevision().getValueStore() == valueStore) {
209-
long id = lmdbValue.getInternalID();
210-
if (id != LmdbValue.UNKNOWN_ID) {
211-
return id;
212-
}
213-
}
214-
}
215-
try {
216-
long id = valueStore.getId(value);
217-
return id;
218-
} catch (IOException e) {
219-
throw new QueryEvaluationException(e);
220-
}
221-
}
222-
223178
public static boolean flattenBGP(TupleExpr expr, List<StatementPattern> out) {
224179
if (expr instanceof StatementPattern) {
225180
out.add((StatementPattern) expr);

0 commit comments

Comments
 (0)