Skip to content

Commit a459b74

Browse files
authored
Fix illegal mutation of quads, Closes #137
* Fix error caused by updating immutable object * Fixed assignment to immutable quad object. Updated default dataFactory lib to recent version and updated tests * Small code cleanup * Removed unnecessary variable declarations
1 parent 2efd254 commit a459b74

File tree

12 files changed

+53
-43
lines changed

12 files changed

+53
-43
lines changed

Diff for: packages/core/lib/datasources/Datasource.js

+9-9
Original file line numberDiff line numberDiff line change
@@ -135,20 +135,20 @@ class Datasource extends EventEmitter {
135135
query.graph = stringToTerm(this._queryGraphReplacements[query.graph.value], this.dataFactory);
136136

137137
// Transform the received quads
138-
let destination = new BufferedIterator(), outputQuads, graph = this._graph;
138+
let destination = new BufferedIterator(), outputQuads, defaultGraph = this._graph;
139139
outputQuads = destination.map((quad) => {
140+
let { subject, predicate, object, graph } = quad;
140141
// Translate blank nodes in the result to blank node IRIs.
141142
if (quad.subject && quad.subject.termType === 'BlankNode' && !this._skolemizeBlacklist[quad.subject.value])
142-
quad.subject = this.dataFactory.namedNode(blankNodePrefix + quad.subject.value);
143+
subject = this.dataFactory.namedNode(blankNodePrefix + quad.subject.value);
143144
if (quad.object && quad.object.termType === 'BlankNode' && !this._skolemizeBlacklist[quad.object.value])
144-
quad.object = this.dataFactory.namedNode(blankNodePrefix + quad.object.value);
145-
if (quad.graph && quad.graph.termType !== 'DefaultGraph') {
146-
if (quad.graph.termType === 'BlankNode' && !this._skolemizeBlacklist[quad.graph.value])
147-
quad.graph = this.dataFactory.namedNode(blankNodePrefix + quad.graph.value);
148-
}
145+
object = this.dataFactory.namedNode(blankNodePrefix + quad.object.value);
146+
if (quad.graph && quad.graph.termType === 'BlankNode' && !this._skolemizeBlacklist[quad.graph.value])
147+
graph = this.dataFactory.namedNode(blankNodePrefix + quad.graph.value);
149148
// If a custom default graph was set, move default graph triples there.
150-
quad.graph = quad.graph && quad.graph.termType !== 'DefaultGraph' ? quad.graph : (graph || quad.graph);
151-
return quad;
149+
else if (defaultGraph && (!quad.graph || quad.graph.termType === 'DefaultGraph'))
150+
graph = defaultGraph;
151+
return this.dataFactory.quad(subject, predicate, object, graph);
152152
});
153153
outputQuads.copyProperties(destination, ['metadata']);
154154
onError && outputQuads.on('error', onError);

Diff for: packages/core/lib/views/RdfView.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ class RdfView extends View {
8686
metadataGraph = settings.metadataGraph;
8787
writer.addQuad(dataFactory.namedNode(metadataGraph), dataFactory.namedNode(primaryTopic), dataFactory.namedNode(settings.fragmentUrl), dataFactory.namedNode(metadataGraph));
8888
}
89-
quad.graph = quad.graph.termType === 'DefaultGraph' ? (metadataGraph ? dataFactory.namedNode(metadataGraph) : dataFactory.defaultGraph()) : quad.graph;
90-
writer.addQuad(quad);
89+
const graph = quad.graph.termType === 'DefaultGraph' ? (metadataGraph ? dataFactory.namedNode(metadataGraph) : dataFactory.defaultGraph()) : quad.graph;
90+
writer.addQuad(dataFactory.quad(quad.subject, quad.predicate, quad.object, graph));
9191
},
9292
// Ends the output and flushes the stream
9393
end: function () {
@@ -117,8 +117,8 @@ class RdfView extends View {
117117
},
118118
// Adds the metadata triple to the output
119119
meta: function (quad) {
120-
quad.graph = quad.graph.termType === 'DefaultGraph' ? (settings.metadataGraph ? dataFactory.namedNode(settings.metadataGraph) : dataFactory.defaultGraph()) : quad.graph;
121-
mySerializer.write(quad);
120+
const graph = quad.graph.termType === 'DefaultGraph' ? (settings.metadataGraph ? dataFactory.namedNode(settings.metadataGraph) : dataFactory.defaultGraph()) : quad.graph;
121+
mySerializer.write(dataFactory.quad(quad.subject, quad.predicate, quad.object, graph));
122122
},
123123
// Ends the output and flushes the stream
124124
end: function () {

Diff for: packages/core/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
"jsonld-streaming-serializer": "^1.1.0",
3535
"lodash": "^4.0.0",
3636
"mime": "^2.4.4",
37-
"n3": "^1.3.5",
37+
"n3": "^1.10.0",
3838
"negotiate": "^1.0.1",
3939
"q": "^1.4.1",
4040
"qejs": "^3.0.5",

Diff for: packages/core/test/datasources/Datasource-test.js

+9-7
Original file line numberDiff line numberDiff line change
@@ -300,9 +300,9 @@ describe('Datasource', () => {
300300
});
301301
datasource.initialize();
302302
datasource._executeQuery = sinon.spy((query, destination) => {
303-
destination._push({ subject: dataFactory.namedNode('s'), predicate: dataFactory.namedNode('p'), object: dataFactory.namedNode('o1') });
304-
destination._push({ subject: dataFactory.namedNode('s'), predicate: dataFactory.namedNode('p'), object: dataFactory.namedNode('o2'), graph: dataFactory.defaultGraph() });
305-
destination._push({ subject: dataFactory.namedNode('s'), predicate: dataFactory.namedNode('p'), object: dataFactory.namedNode('o3'), graph: dataFactory.namedNode('g') });
303+
destination._push(dataFactory.quad(dataFactory.namedNode('s'), dataFactory.namedNode('p'), dataFactory.namedNode('o1')));
304+
destination._push(dataFactory.quad(dataFactory.namedNode('s'), dataFactory.namedNode('p'), dataFactory.namedNode('o2'), dataFactory.defaultGraph()));
305+
destination._push(dataFactory.quad(dataFactory.namedNode('s'), dataFactory.namedNode('p'), dataFactory.namedNode('o3'), dataFactory.namedNode('g')));
306306
destination.close();
307307
});
308308

@@ -314,12 +314,14 @@ describe('Datasource', () => {
314314
let result = datasource.select({ features: { custom: true } }, done), quads = [];
315315
result.on('data', (q) => { quads.push(q); });
316316
result.on('end', () => {
317-
let matchingquads = [{ subject: dataFactory.namedNode('s'), predicate: dataFactory.namedNode('p'), object: dataFactory.namedNode('o1'), graph: dataFactory.namedNode('http://example.org/#mygraph') },
318-
{ subject: dataFactory.namedNode('s'), predicate: dataFactory.namedNode('p'), object: dataFactory.namedNode('o2'), graph: dataFactory.namedNode('http://example.org/#mygraph') },
319-
{ subject: dataFactory.namedNode('s'), predicate: dataFactory.namedNode('p'), object: dataFactory.namedNode('o3'), graph: dataFactory.namedNode('g') }];
317+
let matchingquads = [
318+
dataFactory.quad(dataFactory.namedNode('s'), dataFactory.namedNode('p'), dataFactory.namedNode('o1'), dataFactory.namedNode('http://example.org/#mygraph')),
319+
dataFactory.quad(dataFactory.namedNode('s'), dataFactory.namedNode('p'), dataFactory.namedNode('o2'), dataFactory.namedNode('http://example.org/#mygraph')),
320+
dataFactory.quad(dataFactory.namedNode('s'), dataFactory.namedNode('p'), dataFactory.namedNode('o3'), dataFactory.namedNode('g')),
321+
];
320322
matchingquads.length.should.be.equal(quads.length);
321323
for (let i = 0; i < quads.length; i++)
322-
matchingquads[i].should.deep.equal(quads[i]);
324+
quads[i].should.deep.equal(matchingquads[i]);
323325
done();
324326
});
325327
});

Diff for: packages/datasource-composite/test/datasources/CompositeDatasource-test.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,19 @@ describe('CompositeDatasource', () => {
3737
});
3838

3939
it('should be an CompositeDatasource constructor', (done) => {
40-
let instance = new CompositeDatasource({ references: references });
40+
let instance = new CompositeDatasource({ references: references, dataFactory });
4141
instance.should.be.an.instanceof(CompositeDatasource);
4242
instance.close(done);
4343
});
4444

4545
it('should create CompositeDatasource objects', (done) => {
46-
let instance = new CompositeDatasource({ references: references });
46+
let instance = new CompositeDatasource({ references: references, dataFactory });
4747
instance.should.be.an.instanceof(CompositeDatasource);
4848
instance.close(done);
4949
});
5050

5151
it('should create Datasource objects', (done) => {
52-
let instance = new CompositeDatasource({ references: references });
52+
let instance = new CompositeDatasource({ references: references, dataFactory });
5353
instance.should.be.an.instanceof(Datasource);
5454
instance.close(done);
5555
});
@@ -59,7 +59,7 @@ describe('CompositeDatasource', () => {
5959
let datasource;
6060
function getDatasource() { return datasource; }
6161
before((done) => {
62-
datasource = new CompositeDatasource({ references: references });
62+
datasource = new CompositeDatasource({ references: references, dataFactory });
6363
datasource.initialize();
6464
datasource.on('initialized', done);
6565
});

Diff for: test/assets/basic-fragment-metadata-last.trig

+3-3
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ _:graph hydra:variable "graph";
3232
dcterms:title "Linked Data Fragment of My data"@en;
3333
dcterms:description "Triple/Quad Pattern Fragment of the 'My data' dataset containing triples matching the pattern { a ?b ?c ?d }."@en;
3434
dcterms:source <http://ex.org/data#dataset>;
35-
hydra:totalItems "1234"^^xsd:integer;
36-
void:triples "1234"^^xsd:integer;
37-
hydra:itemsPerPage "100"^^xsd:integer;
35+
hydra:totalItems 1234;
36+
void:triples 1234;
37+
hydra:itemsPerPage 100;
3838
hydra:first <http://ex.org/data?fragment&page=1>;
3939
hydra:previous <http://ex.org/data?fragment&page=2>;
4040
hydra:next <http://ex.org/data?fragment&page=4>

Diff for: test/assets/basic-fragment-metadata-last.ttl

+3-3
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ _:graph hydra:variable "graph";
2828
dcterms:title "Linked Data Fragment of My data"@en;
2929
dcterms:description "Triple/Quad Pattern Fragment of the 'My data' dataset containing triples matching the pattern { a ?b ?c ?d }."@en;
3030
dcterms:source <http://ex.org/data#dataset>;
31-
hydra:totalItems "1234"^^xsd:integer;
32-
void:triples "1234"^^xsd:integer;
33-
hydra:itemsPerPage "100"^^xsd:integer;
31+
hydra:totalItems 1234;
32+
void:triples 1234;
33+
hydra:itemsPerPage 100;
3434
hydra:first <http://ex.org/data?fragment&page=1>;
3535
hydra:previous <http://ex.org/data?fragment&page=2>;
3636
hydra:next <http://ex.org/data?fragment&page=4>.

Diff for: test/assets/basic-fragment.trig

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ _:graph hydra:variable "graph";
2727
dcterms:title "Linked Data Fragment of My data"@en;
2828
dcterms:description "Triple/Quad Pattern Fragment of the 'My data' dataset containing triples matching the pattern { a ?b ?c ?d }."@en;
2929
dcterms:source <http://ex.org/data#dataset>;
30-
hydra:totalItems "1234"^^xsd:integer;
31-
void:triples "1234"^^xsd:integer;
32-
hydra:itemsPerPage "100"^^xsd:integer;
30+
hydra:totalItems 1234;
31+
void:triples 1234;
32+
hydra:itemsPerPage 100;
3333
hydra:first <http://ex.org/data?fragment&page=1>;
3434
hydra:previous <http://ex.org/data?fragment&page=2>;
3535
hydra:next <http://ex.org/data?fragment&page=4>

Diff for: test/assets/basic-fragment.ttl

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ _:graph hydra:variable "graph";
2525
dcterms:title "Linked Data Fragment of My data"@en;
2626
dcterms:description "Triple/Quad Pattern Fragment of the 'My data' dataset containing triples matching the pattern { a ?b ?c ?d }."@en;
2727
dcterms:source <http://ex.org/data#dataset>;
28-
hydra:totalItems "1234"^^xsd:integer;
29-
void:triples "1234"^^xsd:integer;
30-
hydra:itemsPerPage "100"^^xsd:integer;
28+
hydra:totalItems 1234;
29+
void:triples 1234;
30+
hydra:itemsPerPage 100;
3131
hydra:first <http://ex.org/data?fragment&page=1>;
3232
hydra:previous <http://ex.org/data?fragment&page=2>;
3333
hydra:next <http://ex.org/data?fragment&page=4>.

Diff for: test/assets/empty-fragment.trig

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ _:graph hydra:variable "graph";
2727
dcterms:title "Linked Data Fragment of My data"@en;
2828
dcterms:description "Triple/Quad Pattern Fragment of the 'My data' dataset containing triples matching the pattern { a ?b ?c ?d }."@en;
2929
dcterms:source <http://ex.org/data#dataset>;
30-
hydra:totalItems "1234"^^xsd:integer;
31-
void:triples "1234"^^xsd:integer;
32-
hydra:itemsPerPage "100"^^xsd:integer;
30+
hydra:totalItems 1234;
31+
void:triples 1234;
32+
hydra:itemsPerPage 100;
3333
hydra:first <http://ex.org/data?fragment&page=1>;
3434
hydra:previous <http://ex.org/data?fragment&page=2>;
3535
hydra:next <http://ex.org/data?fragment&page=4>

Diff for: test/assets/empty-fragment.ttl

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ _:graph hydra:variable "graph";
2525
dcterms:title "Linked Data Fragment of My data"@en;
2626
dcterms:description "Triple/Quad Pattern Fragment of the 'My data' dataset containing triples matching the pattern { a ?b ?c ?d }."@en;
2727
dcterms:source <http://ex.org/data#dataset>;
28-
hydra:totalItems "1234"^^xsd:integer;
29-
void:triples "1234"^^xsd:integer;
30-
hydra:itemsPerPage "100"^^xsd:integer;
28+
hydra:totalItems 1234;
29+
void:triples 1234;
30+
hydra:itemsPerPage 100;
3131
hydra:first <http://ex.org/data?fragment&page=1>;
3232
hydra:previous <http://ex.org/data?fragment&page=2>;
3333
hydra:next <http://ex.org/data?fragment&page=4>.

Diff for: yarn.lock

+8
Original file line numberDiff line numberDiff line change
@@ -4608,6 +4608,14 @@ [email protected], mute-stream@~0.0.4:
46084608
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
46094609
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
46104610

4611+
n3@^1.10.0:
4612+
version "1.10.0"
4613+
resolved "https://registry.yarnpkg.com/n3/-/n3-1.10.0.tgz#4ebc725ad4c7a1ee4fac184b7b42114d620ba8c7"
4614+
integrity sha512-y+qpS0GktEBttOaDR+BF1t1G2fw4Xn4nCZWNn+7MvEmD2I4YpMH6OJF/xHKSwInCxOC9vu9eI6pluB9/RDUyZQ==
4615+
dependencies:
4616+
queue-microtask "^1.1.2"
4617+
readable-stream "^3.6.0"
4618+
46114619
n3@^1.3.5:
46124620
version "1.3.5"
46134621
resolved "https://registry.yarnpkg.com/n3/-/n3-1.3.5.tgz#ea00062b64fef71dc3a92befc00413a733ef1029"

0 commit comments

Comments
 (0)