Skip to content

Commit 12e42bd

Browse files
committed
working on new ID based join iterator
1 parent d731024 commit 12e42bd

File tree

2 files changed

+268
-27
lines changed

2 files changed

+268
-27
lines changed

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

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
import org.eclipse.rdf4j.sail.lmdb.config.LmdbStoreConfig;
8989
import org.eclipse.rdf4j.sail.lmdb.model.LmdbValue;
9090
import org.eclipse.rdf4j.sail.lmdb.util.GroupMatcher;
91+
import org.eclipse.rdf4j.sail.lmdb.util.IndexKeyReaders;
9192
import org.eclipse.rdf4j.sail.lmdb.util.IndexKeyWriters;
9293
import org.lwjgl.PointerBuffer;
9394
import org.lwjgl.system.MemoryStack;
@@ -1725,6 +1726,7 @@ class TripleIndex implements DupIndex {
17251726

17261727
private final char[] fieldSeq;
17271728
private final IndexKeyWriters.KeyWriter keyWriter;
1729+
private final IndexKeyReaders.KeyToQuadReader keyReader;
17281730
private final IndexKeyWriters.MatcherFactory matcherFactory;
17291731
private final int dbiExplicit, dbiInferred;
17301732
private final boolean dupsortEnabled;
@@ -1737,6 +1739,7 @@ public TripleIndex(String fieldSeq, boolean dupsortEnabled) throws IOException {
17371739
this.fieldSeq = fieldSeq.toCharArray();
17381740
this.keyWriter = IndexKeyWriters.forFieldSeq(fieldSeq);
17391741
this.matcherFactory = IndexKeyWriters.matcherFactory(fieldSeq);
1742+
this.keyReader = IndexKeyReaders.forFieldSeq(fieldSeq);
17401743
this.indexMap = getIndexes(this.fieldSeq);
17411744
this.patternScoreFunction = PatternScoreFunctions.forFieldSeq(fieldSeq);
17421745
// open database and use native sort order without comparator
@@ -2044,33 +2047,7 @@ void keyToQuad(ByteBuffer key, long[] quad) {
20442047
}
20452048

20462049
void keyToQuad(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
2047-
for (int i = 0; i < indexMap.length; i++) {
2048-
int component = indexMap[i];
2049-
long bound;
2050-
switch (component) {
2051-
case SUBJ_IDX:
2052-
bound = subj;
2053-
break;
2054-
case PRED_IDX:
2055-
bound = pred;
2056-
break;
2057-
case OBJ_IDX:
2058-
bound = obj;
2059-
break;
2060-
case CONTEXT_IDX:
2061-
bound = context;
2062-
break;
2063-
default:
2064-
bound = LmdbValue.UNKNOWN_ID;
2065-
break;
2066-
}
2067-
if (bound != LmdbValue.UNKNOWN_ID) {
2068-
Varint.skipUnsigned(key);
2069-
quad[component] = bound;
2070-
} else {
2071-
quad[component] = Varint.readUnsigned(key);
2072-
}
2073-
}
2050+
keyReader.read(key, subj, pred, obj, context, quad);
20742051
}
20752052

20762053
@Override
Lines changed: 264 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,264 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 Eclipse RDF4J contributors.
3+
*
4+
* All rights reserved. This program and the accompanying materials
5+
* are made available under the terms of the Eclipse Distribution License v1.0
6+
* which accompanies this distribution, and is available at
7+
* http://www.eclipse.org/org/documents/edl-v10.php.
8+
*
9+
* SPDX-License-Identifier: BSD-3-Clause
10+
*******************************************************************************/
11+
package org.eclipse.rdf4j.sail.lmdb.util;
12+
13+
import java.nio.ByteBuffer;
14+
15+
import org.eclipse.rdf4j.sail.lmdb.Varint;
16+
import org.eclipse.rdf4j.sail.lmdb.model.LmdbValue;
17+
18+
public final class IndexKeyReaders {
19+
20+
private static final int SUBJ_IDX = 0;
21+
private static final int PRED_IDX = 1;
22+
private static final int OBJ_IDX = 2;
23+
private static final int CONTEXT_IDX = 3;
24+
25+
private IndexKeyReaders() {
26+
}
27+
28+
@FunctionalInterface
29+
public interface KeyToQuadReader {
30+
void read(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad);
31+
}
32+
33+
public static KeyToQuadReader forFieldSeq(String fieldSeq) {
34+
switch (fieldSeq) {
35+
case "spoc":
36+
return IndexKeyReaders::spoc;
37+
case "spco":
38+
return IndexKeyReaders::spco;
39+
case "sopc":
40+
return IndexKeyReaders::sopc;
41+
case "socp":
42+
return IndexKeyReaders::socp;
43+
case "scpo":
44+
return IndexKeyReaders::scpo;
45+
case "scop":
46+
return IndexKeyReaders::scop;
47+
case "psoc":
48+
return IndexKeyReaders::psoc;
49+
case "psco":
50+
return IndexKeyReaders::psco;
51+
case "posc":
52+
return IndexKeyReaders::posc;
53+
case "pocs":
54+
return IndexKeyReaders::pocs;
55+
case "pcso":
56+
return IndexKeyReaders::pcso;
57+
case "pcos":
58+
return IndexKeyReaders::pcos;
59+
case "ospc":
60+
return IndexKeyReaders::ospc;
61+
case "oscp":
62+
return IndexKeyReaders::oscp;
63+
case "opsc":
64+
return IndexKeyReaders::opsc;
65+
case "opcs":
66+
return IndexKeyReaders::opcs;
67+
case "ocsp":
68+
return IndexKeyReaders::ocsp;
69+
case "ocps":
70+
return IndexKeyReaders::ocps;
71+
case "cspo":
72+
return IndexKeyReaders::cspo;
73+
case "csop":
74+
return IndexKeyReaders::csop;
75+
case "cpso":
76+
return IndexKeyReaders::cpso;
77+
case "cpos":
78+
return IndexKeyReaders::cpos;
79+
case "cosp":
80+
return IndexKeyReaders::cosp;
81+
case "cops":
82+
return IndexKeyReaders::cops;
83+
default:
84+
throw new IllegalArgumentException("Unsupported field sequence: " + fieldSeq);
85+
}
86+
}
87+
88+
private static void readAndStore(ByteBuffer key, long[] quad, int componentIndex, long bound) {
89+
if (bound != LmdbValue.UNKNOWN_ID) {
90+
Varint.skipUnsigned(key);
91+
quad[componentIndex] = bound;
92+
} else {
93+
quad[componentIndex] = Varint.readUnsigned(key);
94+
}
95+
}
96+
97+
private static void spoc(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
98+
readAndStore(key, quad, SUBJ_IDX, subj);
99+
readAndStore(key, quad, PRED_IDX, pred);
100+
readAndStore(key, quad, OBJ_IDX, obj);
101+
readAndStore(key, quad, CONTEXT_IDX, context);
102+
}
103+
104+
private static void spco(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
105+
readAndStore(key, quad, SUBJ_IDX, subj);
106+
readAndStore(key, quad, PRED_IDX, pred);
107+
readAndStore(key, quad, CONTEXT_IDX, context);
108+
readAndStore(key, quad, OBJ_IDX, obj);
109+
}
110+
111+
private static void sopc(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
112+
readAndStore(key, quad, SUBJ_IDX, subj);
113+
readAndStore(key, quad, OBJ_IDX, obj);
114+
readAndStore(key, quad, PRED_IDX, pred);
115+
readAndStore(key, quad, CONTEXT_IDX, context);
116+
}
117+
118+
private static void socp(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
119+
readAndStore(key, quad, SUBJ_IDX, subj);
120+
readAndStore(key, quad, OBJ_IDX, obj);
121+
readAndStore(key, quad, CONTEXT_IDX, context);
122+
readAndStore(key, quad, PRED_IDX, pred);
123+
}
124+
125+
private static void scpo(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
126+
readAndStore(key, quad, SUBJ_IDX, subj);
127+
readAndStore(key, quad, CONTEXT_IDX, context);
128+
readAndStore(key, quad, PRED_IDX, pred);
129+
readAndStore(key, quad, OBJ_IDX, obj);
130+
}
131+
132+
private static void scop(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
133+
readAndStore(key, quad, SUBJ_IDX, subj);
134+
readAndStore(key, quad, CONTEXT_IDX, context);
135+
readAndStore(key, quad, OBJ_IDX, obj);
136+
readAndStore(key, quad, PRED_IDX, pred);
137+
}
138+
139+
private static void psoc(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
140+
readAndStore(key, quad, PRED_IDX, pred);
141+
readAndStore(key, quad, SUBJ_IDX, subj);
142+
readAndStore(key, quad, OBJ_IDX, obj);
143+
readAndStore(key, quad, CONTEXT_IDX, context);
144+
}
145+
146+
private static void psco(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
147+
readAndStore(key, quad, PRED_IDX, pred);
148+
readAndStore(key, quad, SUBJ_IDX, subj);
149+
readAndStore(key, quad, CONTEXT_IDX, context);
150+
readAndStore(key, quad, OBJ_IDX, obj);
151+
}
152+
153+
private static void posc(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
154+
readAndStore(key, quad, PRED_IDX, pred);
155+
readAndStore(key, quad, OBJ_IDX, obj);
156+
readAndStore(key, quad, SUBJ_IDX, subj);
157+
readAndStore(key, quad, CONTEXT_IDX, context);
158+
}
159+
160+
private static void pocs(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
161+
readAndStore(key, quad, PRED_IDX, pred);
162+
readAndStore(key, quad, OBJ_IDX, obj);
163+
readAndStore(key, quad, CONTEXT_IDX, context);
164+
readAndStore(key, quad, SUBJ_IDX, subj);
165+
}
166+
167+
private static void pcso(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
168+
readAndStore(key, quad, PRED_IDX, pred);
169+
readAndStore(key, quad, CONTEXT_IDX, context);
170+
readAndStore(key, quad, SUBJ_IDX, subj);
171+
readAndStore(key, quad, OBJ_IDX, obj);
172+
}
173+
174+
private static void pcos(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
175+
readAndStore(key, quad, PRED_IDX, pred);
176+
readAndStore(key, quad, CONTEXT_IDX, context);
177+
readAndStore(key, quad, OBJ_IDX, obj);
178+
readAndStore(key, quad, SUBJ_IDX, subj);
179+
}
180+
181+
private static void ospc(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
182+
readAndStore(key, quad, OBJ_IDX, obj);
183+
readAndStore(key, quad, SUBJ_IDX, subj);
184+
readAndStore(key, quad, PRED_IDX, pred);
185+
readAndStore(key, quad, CONTEXT_IDX, context);
186+
}
187+
188+
private static void oscp(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
189+
readAndStore(key, quad, OBJ_IDX, obj);
190+
readAndStore(key, quad, SUBJ_IDX, subj);
191+
readAndStore(key, quad, CONTEXT_IDX, context);
192+
readAndStore(key, quad, PRED_IDX, pred);
193+
}
194+
195+
private static void opsc(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
196+
readAndStore(key, quad, OBJ_IDX, obj);
197+
readAndStore(key, quad, PRED_IDX, pred);
198+
readAndStore(key, quad, SUBJ_IDX, subj);
199+
readAndStore(key, quad, CONTEXT_IDX, context);
200+
}
201+
202+
private static void opcs(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
203+
readAndStore(key, quad, OBJ_IDX, obj);
204+
readAndStore(key, quad, PRED_IDX, pred);
205+
readAndStore(key, quad, CONTEXT_IDX, context);
206+
readAndStore(key, quad, SUBJ_IDX, subj);
207+
}
208+
209+
private static void ocsp(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
210+
readAndStore(key, quad, OBJ_IDX, obj);
211+
readAndStore(key, quad, CONTEXT_IDX, context);
212+
readAndStore(key, quad, SUBJ_IDX, subj);
213+
readAndStore(key, quad, PRED_IDX, pred);
214+
}
215+
216+
private static void ocps(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
217+
readAndStore(key, quad, OBJ_IDX, obj);
218+
readAndStore(key, quad, CONTEXT_IDX, context);
219+
readAndStore(key, quad, PRED_IDX, pred);
220+
readAndStore(key, quad, SUBJ_IDX, subj);
221+
}
222+
223+
private static void cspo(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
224+
readAndStore(key, quad, CONTEXT_IDX, context);
225+
readAndStore(key, quad, SUBJ_IDX, subj);
226+
readAndStore(key, quad, PRED_IDX, pred);
227+
readAndStore(key, quad, OBJ_IDX, obj);
228+
}
229+
230+
private static void csop(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
231+
readAndStore(key, quad, CONTEXT_IDX, context);
232+
readAndStore(key, quad, SUBJ_IDX, subj);
233+
readAndStore(key, quad, OBJ_IDX, obj);
234+
readAndStore(key, quad, PRED_IDX, pred);
235+
}
236+
237+
private static void cpso(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
238+
readAndStore(key, quad, CONTEXT_IDX, context);
239+
readAndStore(key, quad, PRED_IDX, pred);
240+
readAndStore(key, quad, SUBJ_IDX, subj);
241+
readAndStore(key, quad, OBJ_IDX, obj);
242+
}
243+
244+
private static void cpos(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
245+
readAndStore(key, quad, CONTEXT_IDX, context);
246+
readAndStore(key, quad, PRED_IDX, pred);
247+
readAndStore(key, quad, OBJ_IDX, obj);
248+
readAndStore(key, quad, SUBJ_IDX, subj);
249+
}
250+
251+
private static void cosp(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
252+
readAndStore(key, quad, CONTEXT_IDX, context);
253+
readAndStore(key, quad, OBJ_IDX, obj);
254+
readAndStore(key, quad, SUBJ_IDX, subj);
255+
readAndStore(key, quad, PRED_IDX, pred);
256+
}
257+
258+
private static void cops(ByteBuffer key, long subj, long pred, long obj, long context, long[] quad) {
259+
readAndStore(key, quad, CONTEXT_IDX, context);
260+
readAndStore(key, quad, OBJ_IDX, obj);
261+
readAndStore(key, quad, PRED_IDX, pred);
262+
readAndStore(key, quad, SUBJ_IDX, subj);
263+
}
264+
}

0 commit comments

Comments
 (0)