Skip to content

Commit 5a1b729

Browse files
committed
test: replacing one triple with many
1 parent 4eb650f commit 5a1b729

File tree

4 files changed

+83
-38
lines changed

4 files changed

+83
-38
lines changed

packages/processor/index.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -308,27 +308,27 @@ export default abstract class ProcessorImpl<F extends DataFactory = DataFactory>
308308
let currentBgp: sparqljs.BgpPattern | undefined
309309

310310
return triples.reduce((patterns: sparqljs.Pattern[], triple) => {
311-
const processedTriple = this.processTriple(triple)
312-
if ('subject' in processedTriple) {
313-
if (!currentBgp) {
314-
currentBgp = { type: 'bgp', triples: [processedTriple] }
315-
return [...patterns, currentBgp]
316-
}
317-
318-
currentBgp.triples.push(processedTriple)
319-
return patterns
320-
}
311+
const result = this.processTriple(triple)
312+
const processedTriples = Array.isArray(result) ? result : [result]
313+
314+
return processedTriples.reduce((patterns: sparqljs.Pattern[], processedTriple) => {
315+
if ('subject' in processedTriple) {
316+
if (!currentBgp) {
317+
currentBgp = { type: 'bgp', triples: [processedTriple] }
318+
return [...patterns, currentBgp]
319+
}
321320

322-
currentBgp = undefined
323-
if (Array.isArray(processedTriple)) {
324-
return [...patterns, ...processedTriple]
325-
}
321+
currentBgp.triples.push(processedTriple)
322+
return patterns
323+
}
326324

327-
return [...patterns, processedTriple]
325+
currentBgp = undefined
326+
return [...patterns, processedTriple]
327+
}, patterns)
328328
}, [])
329329
}
330330

331-
processTriple(triple: sparqljs.Triple): sparqljs.Triple | sparqljs.Pattern | sparqljs.Pattern[] {
331+
processTriple(triple: sparqljs.Triple): sparqljs.Triple | sparqljs.Triple[] | sparqljs.Pattern | sparqljs.Pattern[] {
332332
return {
333333
subject: this.processTerm(triple.subject),
334334
predicate: match(triple.predicate)

packages/processor/test/index.test.ts

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ describe('@hydrofoil/sparql-processor', function () {
1616
const name = path.basename(file)
1717

1818
it(`does not modify the query (${name})`, function () {
19-
const processor = new (class extends QueryProcessor {})(rdf)
19+
const processor = new (class extends QueryProcessor {
20+
})(rdf)
2021

2122
const processed = processor.process(loadQuery(name))
2223

@@ -27,33 +28,60 @@ describe('@hydrofoil/sparql-processor', function () {
2728
})
2829

2930
context('replacing triples with other patterns', function () {
30-
class FullTextSearchProcessor extends QueryProcessor {
31-
override processTriple(triple: Triple) {
32-
if ('termType' in triple.predicate && triple.predicate.value === 'http://example.org/fullTextSearch') {
33-
return <FilterPattern>{
34-
type: 'filter',
35-
expression: {
36-
type: 'operation',
37-
operator: 'regex',
38-
args: [
39-
triple.subject,
40-
triple.object,
41-
],
42-
},
31+
context('magic property', function () {
32+
class FullTextSearchProcessor extends QueryProcessor {
33+
override processTriple(triple: Triple) {
34+
if ('termType' in triple.predicate && triple.predicate.value === 'http://example.org/fullTextSearch') {
35+
return <FilterPattern>{
36+
type: 'filter',
37+
expression: {
38+
type: 'operation',
39+
operator: 'regex',
40+
args: [
41+
triple.subject,
42+
triple.object,
43+
],
44+
},
45+
}
4346
}
47+
return super.processTriple(triple)
4448
}
45-
return super.processTriple(triple)
4649
}
47-
}
4850

49-
it('replaces triples with fullTextSearch predicate', function () {
50-
const processor = new FullTextSearchProcessor(rdf)
51+
it('replaces triples with fullTextSearch predicate', function () {
52+
const processor = new FullTextSearchProcessor(rdf)
5153

52-
const query = loadQuery('triple-patterns/magic-property.rq')
53-
const processed = processor.process(query)
54+
const query = loadQuery('triple-patterns/magic-property.rq')
55+
const processed = processor.process(query)
5456

55-
expect(stringifyQuery(processed))
56-
.to.deep.equal(stringifyQuery(loadQuery('triple-patterns/magic-property.expected.rq')))
57+
expect(stringifyQuery(processed))
58+
.to.deep.equal(stringifyQuery(loadQuery('triple-patterns/magic-property.expected.rq')))
59+
})
60+
})
61+
62+
context('multiple resulting patterns', function () {
63+
class FullTextSearchProcessor extends QueryProcessor {
64+
override processTriple(triple: Triple) {
65+
if ('type' in triple.predicate && triple.predicate.pathType === '/') {
66+
return triple.predicate.items.map((predicate, index, array): Triple => {
67+
const subject = index === 0 ? triple.subject : this.factory.variable(`v${index - 1}`)
68+
const object = index === array.length - 1 ? triple.object : this.factory.variable(`v${index}`)
69+
return { subject, predicate, object }
70+
})
71+
}
72+
return super.processTriple(triple)
73+
}
74+
}
75+
76+
it('replaces one triples with multiple', function () {
77+
const processor = new FullTextSearchProcessor(rdf)
78+
79+
const query = loadQuery('triple-patterns/sequence.rq')
80+
const processed = processor.process(query)
81+
82+
expect(stringifyQuery(processed))
83+
.to.deep.equal(stringifyQuery(loadQuery('triple-patterns/sequence.expected.rq')))
84+
})
5785
})
5886
})
5987
})
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
PREFIX ex: <http://example.org/>
2+
PREFIX schema: <http://schema.org/>
3+
4+
SELECT * {
5+
?s a schema:Person .
6+
?s schema:knows ?v0 .
7+
?v0 schema:knows ?friend .
8+
?s schema:name ?name .
9+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
PREFIX ex: <http://example.org/>
2+
PREFIX schema: <http://schema.org/>
3+
4+
SELECT * {
5+
?s a schema:Person .
6+
?s schema:knows/schema:knows ?friend .
7+
?s schema:name ?name .
8+
}

0 commit comments

Comments
 (0)