Skip to content

Commit 5a39a65

Browse files
committedMar 12, 2023
moves to a simpler and faster serialization technique that uses keys alone and does not require values; eliminates repeated term serialization
1 parent c9a91ba commit 5a39a65

File tree

12 files changed

+277
-305
lines changed

12 files changed

+277
-305
lines changed
 

‎package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "quadstore",
3-
"version": "11.0.8",
3+
"version": "12.0.0-alpha.2",
44
"description": "A LevelDB-backed graph database for Node.js and the browser. Supports quads, RDF/JS interfaces and SPARQL queries.",
55
"keywords": [
66
"node",

‎src/get/index.ts

+7-9
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,9 @@ import { ResultType, LevelQuery } from '../types';
1717
import { arrStartsWith } from '../utils/stuff';
1818
import { emptyObject, separator } from '../utils/constants';
1919
import { LevelIterator } from './leveliterator';
20-
import { quadReader, quadWriter, writePattern } from '../serialization';
20+
import {quadReader, twoStepsQuadWriter, writePattern} from '../serialization';
2121
import { SortingIterator } from './sortingiterator';
2222
import { AbstractLevel } from 'abstract-level';
23-
import { viewUint8ArrayAsUint16Array } from '../serialization/utils';
2423

2524
const SORTING_KEY = Symbol();
2625

@@ -47,9 +46,8 @@ const getLevelQueryForIndex = (pattern: Pattern, index: InternalIndex, prefixes:
4746
[indexQuery.gte ? 'gte' : 'gt']: indexQuery.gt,
4847
[indexQuery.lte ? 'lte' : 'lt']: indexQuery.lt,
4948
keys: true,
50-
values: true,
49+
values: false,
5150
keyEncoding: 'utf8',
52-
valueEncoding: 'view',
5351
};
5452
if (typeof opts.limit === 'number') {
5553
levelOpts.limit = opts.limit;
@@ -78,8 +76,8 @@ export const getStream = async (store: Quadstore, pattern: Pattern, opts: GetOpt
7876

7977
if (levelQueryFull !== null) {
8078
const { index, level, order } = levelQueryFull;
81-
let iterator: AsyncIterator<Quad> = new LevelIterator(store.db.iterator(level), (key: string, value: Uint8Array) => {
82-
return quadReader.read(key, index.prefix.length, viewUint8ArrayAsUint16Array(value), 0, index.terms, dataFactory, prefixes);
79+
let iterator: AsyncIterator<Quad> = new LevelIterator(store.db.iterator(level), (key: string) => {
80+
return quadReader.read(key, index.prefix.length, index.terms, dataFactory, prefixes);
8381
});
8482
return { type: ResultType.QUADS, order, iterator, index: index.terms, resorted: false };
8583
}
@@ -88,12 +86,12 @@ export const getStream = async (store: Quadstore, pattern: Pattern, opts: GetOpt
8886

8987
if (levelQueryNoOpts !== null) {
9088
const { index, level, order } = levelQueryNoOpts;
91-
let iterator: AsyncIterator<Quad> = new LevelIterator(store.db.iterator(level), (key: string, value: Uint8Array) => {
92-
return quadReader.read(key, index.prefix.length, viewUint8ArrayAsUint16Array(value), 0, index.terms, dataFactory, prefixes);
89+
let iterator: AsyncIterator<Quad> = new LevelIterator(store.db.iterator(level), (key: string) => {
90+
return quadReader.read(key, index.prefix.length, index.terms, dataFactory, prefixes);
9391
});
9492
if (typeof opts.order !== 'undefined' && !arrStartsWith(opts.order, order)) {
9593
const digest = (item: Quad): SortableQuad => {
96-
(item as SortableQuad)[SORTING_KEY] = quadWriter.write('', undefined, 0, item, <TermName[]>opts.order, prefixes) + separator;
94+
(item as SortableQuad)[SORTING_KEY] = twoStepsQuadWriter.ingest(item, prefixes).write('', <TermName[]>opts.order) + separator;
9795
return (item as SortableQuad);
9896
};
9997
const compare = opts.reverse === true ? compareSortableQuadsReverse : compareSortableQuads;

‎src/quadstore.ts

+17-23
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,16 @@ import {
4848
defaultIndexes,
4949
separator,
5050
levelPutOpts,
51-
levelDelOpts,
51+
levelDelOpts, emptyValue,
5252
} from './utils/constants';
5353
import { consumeOneByOne } from './utils/consumeonebyone';
5454
import { consumeInBatches } from './utils/consumeinbatches';
5555
import { uid } from './utils/uid';
5656
import { getApproximateSize, getStream } from './get';
5757
import { Scope } from './scope';
58-
import { quadWriter } from './serialization/quads';
59-
import { viewUint16ArrayAsUint8Array } from './serialization/utils';
58+
import {twoStepsQuadWriter} from './serialization/quads';
59+
import {Util} from 'n3';
60+
import prefixes = Util.prefixes;
6061

6162
export class Quadstore implements Store {
6263

@@ -183,13 +184,13 @@ export class Quadstore implements Store {
183184
return await getApproximateSize(this, pattern, opts);
184185
}
185186

186-
private _batchPut(quad: Quad, value: Uint16Array, baseValueOffset: number, batch: AbstractChainedBatch<any, any, any>): AbstractChainedBatch<any, any, any> {
187-
const { indexes } = this;
188-
for (let i = 0, il = indexes.length, index, valueOffset; i < il; i += 1) {
189-
valueOffset = baseValueOffset + i * 16;
187+
private _batchPut(quad: Quad, batch: AbstractChainedBatch<any, any, any>): AbstractChainedBatch<any, any, any> {
188+
const { indexes, prefixes } = this;
189+
twoStepsQuadWriter.ingest(quad, prefixes);
190+
for (let i = 0, il = indexes.length, index; i < il; i += 1) {
190191
index = indexes[i];
191-
const key = quadWriter.write(index.prefix, value, valueOffset, quad, index.terms, this.prefixes);
192-
batch = batch.put(key, viewUint16ArrayAsUint8Array(value, valueOffset, 16), levelPutOpts);
192+
const key = twoStepsQuadWriter.write(index.prefix, index.terms);
193+
batch = batch.put(key, emptyValue, levelPutOpts);
193194
}
194195
return batch;
195196
}
@@ -201,35 +202,32 @@ export class Quadstore implements Store {
201202
if (opts.scope) {
202203
quad = opts.scope.parseQuad(quad, batch);
203204
}
204-
const value = new Uint16Array(16 * indexes.length);
205-
this._batchPut(quad, value, 0, batch);
205+
this._batchPut(quad, batch);
206206
await this.writeBatch(batch, opts);
207207
return { type: ResultType.VOID };
208208
}
209209

210210
async multiPut(quads: Quad[], opts: PutOpts = emptyObject): Promise<VoidResult> {
211211
this.ensureReady();
212212
const { indexes, db } = this;
213-
const value = new Uint16Array(16 * indexes.length * quads.length);
214-
let valueOffset = 0;
215213
let batch = db.batch();
216214
for (let q = 0, ql = quads.length, quad; q < ql; q += 1) {
217215
quad = quads[q];
218-
valueOffset = q * indexes.length * 16;
219216
if (opts.scope) {
220217
quad = opts.scope.parseQuad(quad, batch);
221218
}
222-
this._batchPut(quad, value, valueOffset, batch);
219+
this._batchPut(quad, batch);
223220
}
224221
await this.writeBatch(batch, opts);
225222
return { type: ResultType.VOID };
226223
}
227224

228225
private _batchDel(quad: Quad, batch: AbstractChainedBatch<any, any, any>): AbstractChainedBatch<any, any, any> {
229-
const { indexes } = this;
226+
const { indexes, prefixes } = this;
227+
twoStepsQuadWriter.ingest(quad, prefixes);
230228
for (let i = 0, il = indexes.length, index; i < il; i += 1) {
231229
index = indexes[i];
232-
const key = quadWriter.write(index.prefix, undefined, 0, quad, index.terms, this.prefixes);
230+
const key = twoStepsQuadWriter.write(index.prefix, index.terms);
233231
batch = batch.del(key, levelDelOpts);
234232
}
235233
return batch;
@@ -259,8 +257,7 @@ export class Quadstore implements Store {
259257
const { indexes, db } = this;
260258
const batch = db.batch();
261259
this._batchDel(oldQuad, batch);
262-
const value = new Uint16Array(16 * indexes.length);
263-
this._batchPut(newQuad, value, 0, batch);
260+
this._batchPut(newQuad, batch);
264261
await this.writeBatch(batch, opts);
265262
return { type: ResultType.VOID };
266263
}
@@ -273,12 +270,9 @@ export class Quadstore implements Store {
273270
oldQuad = oldQuads[oq];
274271
this._batchDel(oldQuad, batch);
275272
}
276-
const value = new Uint16Array(16 * indexes.length * newQuads.length);
277-
let valueOffset = 0;
278273
for (let nq = 0, nql = newQuads.length, newQuad; nq < nql; nq += 1) {
279-
valueOffset = nq * indexes.length * 16;
280274
newQuad = newQuads[nq];
281-
this._batchPut(newQuad, value, valueOffset, batch);
275+
this._batchPut(newQuad, batch);
282276
}
283277
await this.writeBatch(batch, opts);
284278
return { type: ResultType.VOID };

‎src/serialization/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11

2-
export { quadWriter, quadReader } from './quads';
2+
export { twoStepsQuadWriter, quadReader } from './quads';
33
export { writePattern } from './patterns';

‎src/serialization/patterns.ts

+43-20
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,30 @@
11

22
import type { Literal } from 'rdf-js';
3-
import type { InternalIndex, Pattern, Prefixes, IndexQuery } from '../types';
3+
import type {InternalIndex, Pattern, Prefixes, IndexQuery, SerializedTerm} from '../types';
44

55
import * as xsd from './xsd';
66
import { encode } from './fpstring';
77
import { separator, boundary } from '../utils/constants';
88
import { blankNodeWriter, defaultGraphWriter, genericLiteralWriter, langStringLiteralWriter, namedNodeWriter,
99
numericLiteralWriter, stringLiteralWriter } from './terms';
1010

11+
const serialized: SerializedTerm = {
12+
type: '',
13+
value: '',
14+
lengths: '',
15+
};
1116

1217
const patternLiteralWriter = {
13-
write(term: Literal) {
18+
write(term: Literal, prefixes: Prefixes) {
1419
if (term.language) {
15-
return langStringLiteralWriter.write(undefined, 0, term, separator);
20+
langStringLiteralWriter.write(term, serialized, prefixes);
21+
return;
1622
}
1723
if (term.datatype) {
1824
switch (term.datatype.value) {
1925
case xsd.string:
20-
return stringLiteralWriter.write(undefined, 0, term);
26+
stringLiteralWriter.write(term, serialized, prefixes);
27+
return;
2128
case xsd.integer:
2229
case xsd.double:
2330
case xsd.decimal:
@@ -33,14 +40,18 @@ const patternLiteralWriter = {
3340
case xsd.unsignedShort:
3441
case xsd.unsignedByte:
3542
case xsd.positiveInteger:
36-
return numericLiteralWriter.write(undefined, 0, term, separator, encode(term.value), true);
43+
numericLiteralWriter.write(term, serialized, prefixes, true, encode(term.value));
44+
return;
3745
case xsd.dateTime:
38-
return numericLiteralWriter.write(undefined, 0, term, separator, encode(new Date(term.value).valueOf()), true);
46+
numericLiteralWriter.write(term, serialized, prefixes, true, encode(new Date(term.value).valueOf()));
47+
return;
3948
default:
40-
return genericLiteralWriter.write(undefined, 0, term, separator);
49+
genericLiteralWriter.write(term, serialized, prefixes);
50+
return;
4151
}
4252
}
43-
return stringLiteralWriter.write(undefined, 0, term);
53+
stringLiteralWriter.write(term, serialized, prefixes);
54+
return;
4455
}
4556
};
4657

@@ -69,43 +80,55 @@ export const writePattern = (pattern: Pattern, index: InternalIndex, prefixes: P
6980
case 'Range':
7081
didRange = true;
7182
if (term.gt) {
72-
gt += patternLiteralWriter.write(term.gt);
83+
patternLiteralWriter.write(term.gt, prefixes);
84+
gt += serialized.value;
7385
gte = false;
7486
} else if (term.gte) {
75-
gt += patternLiteralWriter.write(term.gte);
87+
patternLiteralWriter.write(term.gte, prefixes);
88+
gt += serialized.value;
7689
gte = true;
7790
}
7891
if (term.lt) {
79-
lt += patternLiteralWriter.write(term.lt);
92+
patternLiteralWriter.write(term.lt, prefixes);
93+
lt += serialized.value;
8094
lte = false;
8195
} else if (term.lte) {
82-
lt += patternLiteralWriter.write(term.lte);
96+
patternLiteralWriter.write(term.lte, prefixes);
97+
lt += serialized.value;
8398
lte = true;
8499
}
85100
break;
86101
case 'Literal':
87102
didLiteral = true;
88-
gt += patternLiteralWriter.write(term);
103+
patternLiteralWriter.write(term, prefixes);
104+
gt += serialized.value;
89105
gte = true;
90-
lt += patternLiteralWriter.write(term);
106+
patternLiteralWriter.write(term, prefixes);
107+
lt += serialized.value;
91108
lte = true;
92109
break;
93110
case 'NamedNode':
94-
gt += namedNodeWriter.write(undefined, 0, term, prefixes);
111+
namedNodeWriter.write(term, serialized, prefixes);
112+
gt += serialized.value;
95113
gte = true;
96-
lt += namedNodeWriter.write(undefined, 0, term, prefixes);
114+
namedNodeWriter.write(term, serialized, prefixes);
115+
lt += serialized.value;
97116
lte = true;
98117
break;
99118
case 'BlankNode':
100-
gt += blankNodeWriter.write(undefined, 0, term);
119+
blankNodeWriter.write(term, serialized, prefixes);
120+
gt += serialized.value;
101121
gte = true;
102-
lt += blankNodeWriter.write(undefined, 0, term);
122+
blankNodeWriter.write(term, serialized, prefixes);
123+
lt += serialized.value;
103124
lte = true;
104125
break;
105126
case 'DefaultGraph':
106-
gt += defaultGraphWriter.write(undefined, 0, term);
127+
defaultGraphWriter.write(term, serialized, prefixes);
128+
gt += serialized.value;
107129
gte = true;
108-
lt += defaultGraphWriter.write(undefined, 0, term);
130+
defaultGraphWriter.write(term, serialized, prefixes);
131+
lt += serialized.value;
109132
lte = true;
110133
break;
111134
}

‎src/serialization/quads.ts

+46-20
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,65 @@
11

2-
import type { DataFactory, Term } from 'rdf-js';
3-
import type { Prefixes, Quad, TermName } from '../types';
2+
import type {DataFactory, Quad_Graph, Quad_Object, Quad_Predicate, Quad_Subject, Term} from 'rdf-js';
3+
import type {Prefixes, Quad, SerializedTerm, TermName} from '../types';
44

55
import { separator } from '../utils/constants';
66
import { termReader, termWriter } from './terms';
7+
import {padNumStart} from './utils';
78

8-
export const quadWriter = {
9-
writtenValueLength: 0,
10-
write(prefix: string, value: Uint16Array|undefined, baseValueOffset: number, quad: Quad, termNames: TermName[], prefixes: Prefixes) {
11-
let ret = prefix;
12-
let valueOffset = baseValueOffset;
9+
type TwoStepsQuadWriter = Record<TermName, SerializedTerm> & {
10+
ingest(quad: Quad, prefixes: Prefixes): TwoStepsQuadWriter;
11+
write(prefix: string, termNames: TermName[]): string;
12+
};
13+
14+
export const twoStepsQuadWriter: TwoStepsQuadWriter = {
15+
subject: { type: '', value: '', lengths: '' },
16+
predicate: { type: '', value: '', lengths: '' },
17+
object: { type: '', value: '', lengths: '' },
18+
graph: { type: '', value: '', lengths: '' },
19+
ingest(quad: Quad, prefixes: Prefixes) {
20+
termWriter.write(quad.subject, this.subject, prefixes);
21+
termWriter.write(quad.predicate, this.predicate, prefixes);
22+
termWriter.write(quad.object, this.object, prefixes);
23+
termWriter.write(quad.graph, this.graph, prefixes);
24+
return this;
25+
},
26+
write(prefix: string, termNames: TermName[]) {
27+
let key = prefix;
28+
let lengths = '';
1329
for (let t = 0, term; t < termNames.length; t += 1) {
14-
term = quad[termNames[t]];
15-
ret += termWriter.write(value, valueOffset, term, prefixes) + separator;
16-
valueOffset += termWriter.writtenValueLength;
30+
term = this[termNames[t]];
31+
key += term.value + separator;
32+
lengths += term.type + term.lengths;
1733
}
18-
this.writtenValueLength = valueOffset - baseValueOffset;
19-
return ret;
34+
return key + lengths + padNumStart(lengths.length);
2035
},
2136
};
2237

23-
export const quadReader = {
38+
type QuadReader = Record<TermName, Term | null>
39+
& { keyOffset: number; lengthsOffset: number; }
40+
& { read(key: string, keyOffset: number, termNames: TermName[], factory: DataFactory, prefixes: Prefixes): Quad; }
41+
;
42+
43+
export const quadReader: QuadReader = {
2444
subject: null,
2545
predicate: null,
2646
object: null,
2747
graph: null,
28-
read(key: string, keyOffset: number, value: Uint16Array, valueOffset: number, termNames: TermName[], factory: DataFactory, prefixes: Prefixes): Quad {
48+
keyOffset: 0,
49+
lengthsOffset: 0,
50+
read(key: string, keyOffset: number, termNames: TermName[], factory: DataFactory, prefixes: Prefixes): Quad {
51+
this.lengthsOffset = key.length - parseInt(key.slice(-4)) - 4;
52+
this.keyOffset = keyOffset;
2953
for (let t = 0, termName; t < termNames.length; t += 1) {
3054
termName = termNames[t];
31-
// @ts-ignore
32-
this[termName] = termReader.read(key, keyOffset, value, valueOffset, factory, prefixes);
33-
keyOffset += termReader.readKeyChars + separator.length;
34-
valueOffset += termReader.readValueLength;
55+
this[termName] = termReader.read(key, this, factory, prefixes);
56+
this.keyOffset += separator.length;
3557
}
36-
// @ts-ignore
37-
return factory.quad(this.subject, this.predicate, this.object, this.graph);
58+
return factory.quad(
59+
this.subject! as Quad_Subject,
60+
this.predicate! as Quad_Predicate,
61+
this.object! as Quad_Object,
62+
this.graph! as Quad_Graph,
63+
);
3864
},
3965
};

‎src/serialization/terms.ts

+117-207
Large diffs are not rendered by default.

‎src/serialization/utils.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ export const sliceString = (source: string, offset: number, length: number): str
33
return source.slice(offset, offset + length);
44
};
55

6-
export const viewUint8ArrayAsUint16Array = (source: Uint8Array): Uint16Array => {
7-
return new Uint16Array(source.buffer, source.byteOffset, source.byteLength / 2);
8-
};
9-
10-
export const viewUint16ArrayAsUint8Array = (source: Uint16Array, offset: number, length: number): Uint8Array => {
11-
return new Uint8Array(source.buffer, source.byteOffset + offset * 2, length * 2);
6+
export const padNumStart = (val: number) => {
7+
if (val < 10) return '000' + val;
8+
if (val < 100) return '00' + val;
9+
if (val < 1000) return '0' + val;
10+
if (val < 10000) return '' + val;
11+
throw new Error('too long: ' + val);
1212
};

‎src/types/index.ts

+22-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import type { Readable } from 'stream';
33
import type { AbstractChainedBatch, AbstractLevel } from 'abstract-level'
44
import type { AsyncIterator } from 'asynciterator';
5-
import type { Literal, DataFactory, Quad_Subject, Quad_Predicate, Quad_Object, Quad_Graph, Quad } from 'rdf-js';
5+
import type { Literal, DataFactory, Quad_Subject, Quad_Predicate, Quad_Object, Quad_Graph, Quad, Term } from 'rdf-js';
66
import type { Scope } from '../scope';
77
import type { AbstractIteratorOptions } from 'abstract-level';
88

@@ -15,6 +15,7 @@ export interface BatchOpts {
1515
}
1616

1717
export interface DelOpts extends BatchOpts {
18+
scope?: Scope,
1819
}
1920

2021
export interface PutOpts extends BatchOpts {
@@ -129,3 +130,23 @@ export interface LevelQuery<LK, LV> {
129130
order: TermName[];
130131
index: InternalIndex;
131132
}
133+
134+
export interface SerializedTerm {
135+
value: string;
136+
type: string;
137+
lengths: string;
138+
}
139+
140+
export interface ReadingState {
141+
keyOffset: number;
142+
lengthsOffset: number;
143+
}
144+
145+
export interface TermReader<T extends Term> {
146+
read(key: string, state: ReadingState, factory: DataFactory, prefixes: Prefixes): T;
147+
}
148+
149+
export type TermWriter<T extends Term, E extends 'T' | 'F'> = E extends 'T'
150+
? { write(node: T, serialized: SerializedTerm, prefixes: Prefixes, rangeMode: boolean, encodedValue: string): void }
151+
: { write(node: T, serialized: SerializedTerm, prefixes: Prefixes): void }
152+
;

‎src/utils/constants.ts

+2
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,5 @@ export const levelPutOpts: AbstractChainedBatchPutOptions<any, any, any> = {
3131
export const levelDelOpts: AbstractChainedBatchDelOptions<any, any> = {
3232
keyEncoding: 'utf8',
3333
};
34+
35+
export const emptyValue = new Uint8Array(0);

‎test/quadstore/put.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export const runPutTests = () => {
2828
const newQuad = dataFactory.quad(
2929
dataFactory.namedNode('ex://s'),
3030
dataFactory.namedNode('ex://p'),
31-
dataFactory.literal(''.padStart(2000, 'aaabbb')),
31+
dataFactory.literal(''.padStart(129, 'aaabbb')),
3232
dataFactory.namedNode('ex://g'),
3333
);
3434
await store.put(newQuad);

‎test/quadstore/serialization.ts

+14-16
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@
22
import type {InternalIndex} from '../../dist/esm/types';
33

44
import * as xsd from '../../dist/esm/serialization/xsd';
5-
import { quadWriter, quadReader } from '../../dist/esm/serialization';
5+
import {quadReader, twoStepsQuadWriter} from '../../dist/esm/serialization';
66
import { toEqualQuad } from '../utils/expect';
77

88
export const runSerializationTests = () => {
99

1010
describe('Quadstore serialization', function () {
1111

12-
const value = new Uint16Array(32);
13-
1412
it('Should serialize and deserialize quads with named nodes', function () {
1513
const { store } = this;
1614
const { indexes, prefixes, dataFactory: factory } = store;
@@ -21,8 +19,8 @@ export const runSerializationTests = () => {
2119
factory.namedNode('http://ex.com/g'),
2220
);
2321
indexes.forEach((index: InternalIndex) => {
24-
const key = quadWriter.write(index.prefix, value, 0, quad, index.terms, prefixes);
25-
const read = quadReader.read(key, index.prefix.length, value, 0, index.terms, factory, prefixes);
22+
const key = twoStepsQuadWriter.ingest(quad, prefixes).write(index.prefix, index.terms);
23+
const read = quadReader.read(key, index.prefix.length, index.terms, factory, prefixes);
2624
toEqualQuad(read, quad);
2725
});
2826
});
@@ -37,8 +35,8 @@ export const runSerializationTests = () => {
3735
factory.defaultGraph(),
3836
);
3937
indexes.forEach((index: InternalIndex) => {
40-
const key = quadWriter.write(index.prefix, value, 0, quad, index.terms, prefixes);
41-
const read = quadReader.read(key, index.prefix.length, value, 0, index.terms, factory, prefixes);
38+
const key = twoStepsQuadWriter.ingest(quad, prefixes).write(index.prefix, index.terms);
39+
const read = quadReader.read(key, index.prefix.length, index.terms, factory, prefixes);
4240
toEqualQuad(read, quad);
4341
});
4442
});
@@ -53,8 +51,8 @@ export const runSerializationTests = () => {
5351
factory.namedNode('http://ex.com/g'),
5452
);
5553
indexes.forEach((index: InternalIndex) => {
56-
const key = quadWriter.write(index.prefix, value, 0, quad, index.terms, prefixes);
57-
const read = quadReader.read(key, index.prefix.length, value, 0, index.terms, factory, prefixes);
54+
const key = twoStepsQuadWriter.ingest(quad, prefixes).write(index.prefix, index.terms);
55+
const read = quadReader.read(key, index.prefix.length, index.terms, factory, prefixes);
5856
toEqualQuad(read, quad);
5957
});
6058
});
@@ -69,8 +67,8 @@ export const runSerializationTests = () => {
6967
factory.namedNode('http://ex.com/g'),
7068
);
7169
indexes.forEach((index: InternalIndex) => {
72-
const key = quadWriter.write(index.prefix, value, 0, quad, index.terms, prefixes);
73-
const read = quadReader.read(key, index.prefix.length, value, 0, index.terms, factory, prefixes);
70+
const key = twoStepsQuadWriter.ingest(quad, prefixes).write(index.prefix, index.terms);
71+
const read = quadReader.read(key, index.prefix.length, index.terms, factory, prefixes);
7472
toEqualQuad(read, quad);
7573
});
7674
});
@@ -85,8 +83,8 @@ export const runSerializationTests = () => {
8583
factory.namedNode('http://ex.com/g'),
8684
);
8785
indexes.forEach((index: InternalIndex) => {
88-
const key = quadWriter.write(index.prefix, value, 0, quad, index.terms, prefixes);
89-
const read = quadReader.read(key, index.prefix.length, value, 0, index.terms, factory, prefixes);
86+
const key = twoStepsQuadWriter.ingest(quad, prefixes).write(index.prefix, index.terms);
87+
const read = quadReader.read(key, index.prefix.length, index.terms, factory, prefixes);
9088
toEqualQuad(read, quad);
9189
});
9290
});
@@ -96,12 +94,12 @@ export const runSerializationTests = () => {
9694
const quad = factory.quad(
9795
factory.namedNode('http://ex.com/s'),
9896
factory.namedNode('http://ex.com/p'),
99-
factory.literal(''.padStart(2000, 'abab')),
97+
factory.literal(''.padStart(129, 'abab')),
10098
factory.namedNode('http://ex.com/g'),
10199
);
102100
indexes.forEach((index: InternalIndex) => {
103-
const key = quadWriter.write(index.prefix, value, 0, quad, index.terms, prefixes);
104-
const read = quadReader.read(key, index.prefix.length, value, 0, index.terms, factory, prefixes);
101+
const key = twoStepsQuadWriter.ingest(quad, prefixes).write(index.prefix, index.terms);
102+
const read = quadReader.read(key, index.prefix.length, index.terms, factory, prefixes);
105103
toEqualQuad(read, quad);
106104
});
107105
});

0 commit comments

Comments
 (0)
Please sign in to comment.