Skip to content

Commit 46300f2

Browse files
committed
wip
1 parent efc0240 commit 46300f2

8 files changed

Lines changed: 1741 additions & 54 deletions

File tree

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

Lines changed: 79 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
package org.eclipse.rdf4j.sail.lmdb;
1313

1414
import java.io.IOException;
15-
import java.util.HashMap;
1615
import java.util.Map;
16+
import java.util.concurrent.ConcurrentHashMap;
1717

1818
import org.eclipse.rdf4j.model.IRI;
1919
import org.eclipse.rdf4j.model.Resource;
@@ -31,15 +31,19 @@
3131
class LmdbEvaluationStatistics extends EvaluationStatistics {
3232

3333
private static final Logger log = LoggerFactory.getLogger(LmdbEvaluationStatistics.class);
34+
private static final int SHARED_CACHE_MAX_ENTRIES = 262_144;
35+
private static final Map<SharedCardinalityKey, Double> sharedCardinalityCache = new ConcurrentHashMap<>();
3436

3537
private final ValueStore valueStore;
3638

3739
private final TripleStore tripleStore;
38-
private final Map<CardinalityKey, Double> cardinalityCache = new HashMap<>();
40+
private final int tripleStoreIdentity;
41+
private final Map<CardinalityKey, Double> cardinalityCache = new ConcurrentHashMap<>();
3942

4043
public LmdbEvaluationStatistics(ValueStore valueStore, TripleStore tripleStore) {
4144
this.valueStore = valueStore;
4245
this.tripleStore = tripleStore;
46+
this.tripleStoreIdentity = System.identityHashCode(tripleStore);
4347
}
4448

4549
@Override
@@ -116,17 +120,31 @@ private double cardinality(Resource subj, IRI pred, Value obj, Resource context)
116120
}
117121
}
118122

119-
return tripleStore.cardinality(subjID, predID, objID, contextID);
120-
121-
// CardinalityKey key = new CardinalityKey(subjID, predID, objID, contextID);
122-
// Double cached = cardinalityCache.get(key);
123-
// if (cached != null) {
124-
// return cached;
125-
// }
126-
//
127-
// double cardinality = tripleStore.cardinality(subjID, predID, objID, contextID);
128-
// cardinalityCache.put(key, cardinality);
129-
// return cardinality;
123+
CardinalityKey key = new CardinalityKey(subjID, predID, objID, contextID);
124+
Double cached = cardinalityCache.get(key);
125+
if (cached != null) {
126+
return cached;
127+
}
128+
129+
long revisionId = valueStore.getRevision().getRevisionId();
130+
SharedCardinalityKey sharedKey = new SharedCardinalityKey(tripleStoreIdentity, revisionId, key);
131+
Double sharedCached = sharedCardinalityCache.get(sharedKey);
132+
if (sharedCached != null) {
133+
cardinalityCache.put(key, sharedCached);
134+
return sharedCached;
135+
}
136+
137+
double cardinality = tripleStore.cardinality(subjID, predID, objID, contextID);
138+
cardinalityCache.put(key, cardinality);
139+
cacheSharedCardinality(sharedKey, cardinality);
140+
return cardinality;
141+
}
142+
143+
private static void cacheSharedCardinality(SharedCardinalityKey key, double cardinality) {
144+
if (sharedCardinalityCache.size() >= SHARED_CACHE_MAX_ENTRIES) {
145+
sharedCardinalityCache.clear();
146+
}
147+
sharedCardinalityCache.put(key, cardinality);
130148
}
131149

132150
private static final class CardinalityKey {
@@ -166,4 +184,52 @@ public int hashCode() {
166184
return result;
167185
}
168186
}
187+
188+
private static final class SharedCardinalityKey {
189+
private final int tripleStoreIdentity;
190+
private final long revisionId;
191+
private final long subjID;
192+
private final long predID;
193+
private final long objID;
194+
private final long contextID;
195+
private final int hashCode;
196+
197+
private SharedCardinalityKey(int tripleStoreIdentity, long revisionId, CardinalityKey cardinalityKey) {
198+
this.tripleStoreIdentity = tripleStoreIdentity;
199+
this.revisionId = revisionId;
200+
this.subjID = cardinalityKey.subjID;
201+
this.predID = cardinalityKey.predID;
202+
this.objID = cardinalityKey.objID;
203+
this.contextID = cardinalityKey.contextID;
204+
int hash = Integer.hashCode(tripleStoreIdentity);
205+
hash = 31 * hash + Long.hashCode(revisionId);
206+
hash = 31 * hash + Long.hashCode(subjID);
207+
hash = 31 * hash + Long.hashCode(predID);
208+
hash = 31 * hash + Long.hashCode(objID);
209+
hash = 31 * hash + Long.hashCode(contextID);
210+
this.hashCode = hash;
211+
}
212+
213+
@Override
214+
public boolean equals(Object obj) {
215+
if (this == obj) {
216+
return true;
217+
}
218+
if (!(obj instanceof SharedCardinalityKey)) {
219+
return false;
220+
}
221+
SharedCardinalityKey other = (SharedCardinalityKey) obj;
222+
return tripleStoreIdentity == other.tripleStoreIdentity
223+
&& revisionId == other.revisionId
224+
&& subjID == other.subjID
225+
&& predID == other.predID
226+
&& objID == other.objID
227+
&& contextID == other.contextID;
228+
}
229+
230+
@Override
231+
public int hashCode() {
232+
return hashCode;
233+
}
234+
}
169235
}

core/sail/lmdb/src/test/java/org/eclipse/rdf4j/sail/lmdb/benchmark/ThemeQueryBenchmark.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ private void captureQueryPlanSnapshot() throws IOException {
262262
.addReflectiveGetter("lmdbStore.writable", store, "isWritable")
263263
.addReflectiveGetter("lmdbConfig.tripleIndexes", storeConfig, "getTripleIndexes")
264264
.addReflectiveGetter("lmdbConfig.forceSync", storeConfig, "getForceSync")
265+
.addReflectiveGetter("lmdbConfig.pageCardinalityEstimator", storeConfig, "getPageCardinalityEstimator")
265266
.addReflectiveField("lmdbConfig.autoGrow", storeConfig, "autoGrow")
266267
.addReflectiveGetter("lmdbConfig.valueDbSize", storeConfig, "getValueDBSize")
267268
.addReflectiveGetter("lmdbConfig.tripleDbSize", storeConfig, "getTripleDBSize");

0 commit comments

Comments
 (0)