rdf-stores
Version:
A TypeScript/JavaScript implementation of the RDF/JS store interface with support for quoted triples.
153 lines • 6.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RdfStoreIndexNestedRecordQuoted = void 0;
const OrderUtils_1 = require("../OrderUtils");
const RdfStoreIndexNestedRecord_1 = require("./RdfStoreIndexNestedRecord");
/**
* An RDF store index that is implemented using nested records with optimized quoted triple support.
*/
class RdfStoreIndexNestedRecordQuoted extends RdfStoreIndexNestedRecord_1.RdfStoreIndexNestedRecord {
constructor(options) {
super(options);
this.features = {
quotedTripleFiltering: true,
};
}
*getQuotedPatternKeys(map, term) {
for (const quotedTripleEncoded of this.dictionary.findQuotedTriplesEncoded(term)) {
if (quotedTripleEncoded in map) {
yield quotedTripleEncoded;
}
}
}
*find(terms) {
const ids = (0, OrderUtils_1.encodeOptionalTerms)(terms, this.dictionary);
if (!ids) {
return;
}
const [id0, id1, id2, id3] = ids;
const [term0, term1, term2, term3] = terms;
const [quotedTerm0, quotedTerm1, quotedTerm2, quotedTerm3] = (0, OrderUtils_1.arePatternsQuoted)(terms);
let partialQuad0;
let partialQuad1;
let partialQuad2;
let partialQuad3;
let map1;
let map2;
let map3;
const map0 = this.nestedRecords;
const map0Keys = (term0 !== undefined ?
(quotedTerm0 ? this.getQuotedPatternKeys(map0, term0) : (id0 in map0 ? [id0] : [])) :
Object.keys(map0));
for (const key1 of map0Keys) {
map1 = map0[key1];
partialQuad0 = !quotedTerm0 && term0 ? term0 : this.dictionary.decode(Number.parseInt(key1, 10));
const map1Keys = (term1 !== undefined ?
(quotedTerm1 ? this.getQuotedPatternKeys(map1, term1) : (id1 in map1 ? [id1] : [])) :
Object.keys(map1));
for (const key2 of map1Keys) {
map2 = map1[key2];
partialQuad1 = !quotedTerm1 && term1 ? term1 : this.dictionary.decode(Number.parseInt(key2, 10));
const map2Keys = (term2 !== undefined ?
(quotedTerm2 ? this.getQuotedPatternKeys(map2, term2) : (id2 in map2 ? [id2] : [])) :
Object.keys(map2));
for (const key3 of map2Keys) {
map3 = map2[key3];
partialQuad2 = !quotedTerm2 && term2 ? term2 : this.dictionary.decode(Number.parseInt(key3, 10));
const map3Keys = (term3 !== undefined ?
(quotedTerm3 ? this.getQuotedPatternKeys(map3, term3) : (id3 in map3 ? [id3] : [])) :
Object.keys(map3));
for (const key4 of map3Keys) {
partialQuad3 = !quotedTerm3 && term3 ? term3 : this.dictionary.decode(Number.parseInt(key4, 10));
yield [partialQuad0, partialQuad1, partialQuad2, partialQuad3];
}
}
}
}
}
// The code below is nearly identical. We duplicate because abstraction would result in a significant performance hit.
*findEncoded(ids, terms) {
const [id0, id1, id2, id3] = ids;
const [term0, term1, term2, term3] = terms;
const [quotedTerm0, quotedTerm1, quotedTerm2, quotedTerm3] = (0, OrderUtils_1.arePatternsQuoted)(terms);
let map1;
let map2;
let map3;
const map0 = this.nestedRecords;
const map0Keys = (term0 !== undefined ?
(quotedTerm0 ? this.getQuotedPatternKeys(map0, term0) : (id0 in map0 ? [id0] : [])) :
Object.keys(map0));
for (const key1 of map0Keys) {
map1 = map0[key1];
const map1Keys = (term1 !== undefined ?
(quotedTerm1 ? this.getQuotedPatternKeys(map1, term1) : (id1 in map1 ? [id1] : [])) :
Object.keys(map1));
for (const key2 of map1Keys) {
map2 = map1[key2];
const map2Keys = (term2 !== undefined ?
(quotedTerm2 ? this.getQuotedPatternKeys(map2, term2) : (id2 in map2 ? [id2] : [])) :
Object.keys(map2));
for (const key3 of map2Keys) {
map3 = map2[key3];
const map3Keys = (term3 !== undefined ?
(quotedTerm3 ? this.getQuotedPatternKeys(map3, term3) : (id3 in map3 ? [id3] : [])) :
Object.keys(map3));
for (const key4 of map3Keys) {
yield [
Number.parseInt(key1, 10),
Number.parseInt(key2, 10),
Number.parseInt(key3, 10),
Number.parseInt(key4, 10),
];
}
}
}
}
}
count(terms) {
let count = 0;
const ids = (0, OrderUtils_1.encodeOptionalTerms)(terms, this.dictionary);
if (!ids) {
return 0;
}
const [id0, id1, id2, id3] = ids;
const [term0, term1, term2, term3] = terms;
const [quotedTerm0, quotedTerm1, quotedTerm2, quotedTerm3] = (0, OrderUtils_1.arePatternsQuoted)(terms);
let map1;
let map2;
let map3;
const map0 = this.nestedRecords;
const map0Keys = (term0 !== undefined ?
(quotedTerm0 ? this.getQuotedPatternKeys(map0, term0) : (id0 in map0 ? [id0] : [])) :
Object.keys(map0));
for (const key1 of map0Keys) {
map1 = map0[key1];
const map1Keys = (term1 !== undefined ?
(quotedTerm1 ? this.getQuotedPatternKeys(map1, term1) : (id1 in map1 ? [id1] : [])) :
Object.keys(map1));
for (const key2 of map1Keys) {
map2 = map1[key2];
const map2Keys = (term2 !== undefined ?
(quotedTerm2 ? this.getQuotedPatternKeys(map2, term2) : (id2 in map2 ? [id2] : [])) :
Object.keys(map2));
for (const key3 of map2Keys) {
map3 = map2[key3];
if (term3 !== undefined) {
if (quotedTerm3) {
count += [...this.getQuotedPatternKeys(map3, term3)].length;
}
else if (id3 in map3) {
count++;
}
}
else {
count += Object.keys(map3).length;
}
}
}
}
return count;
}
}
exports.RdfStoreIndexNestedRecordQuoted = RdfStoreIndexNestedRecordQuoted;
//# sourceMappingURL=RdfStoreIndexNestedRecordQuoted.js.map