diff --git a/lib/rebase.js b/lib/rebase.js index 0011d7e..f4b1ce1 100644 --- a/lib/rebase.js +++ b/lib/rebase.js @@ -1,3 +1,5 @@ +const isIriRegExp = /^[a-z][a-z0-9+.-]*:/ + function rebaseDataset (oldTerm, newTerm, { factory }) { const rebase = rebaseQuad(oldTerm, newTerm, { factory }) @@ -39,6 +41,10 @@ function rebaseTerm (oldTerm, newTerm, { factory }) { return term } + if (isIriRegExp.test(term.value) !== isIriRegExp.test(oldTerm.value)) { + return term + } + return factory.namedNode(newTerm.value + term.value.slice(oldTerm.value.length)) } } diff --git a/test/Grapoi.test.js b/test/Grapoi.test.js index 83330c2..85c2de9 100644 --- a/test/Grapoi.test.js +++ b/test/Grapoi.test.js @@ -590,6 +590,24 @@ describe('Grapoi', () => { grapoiEqual(result, expectedGrapoi) datasetEqual(result.dataset, expectedGrapoi.dataset) }) + + it('should rebase datasets with empty named nodes', () => { + const { expectedGrapoi, expectedTerm, grapoi } = datasets.rebaseEmpty() + + const result = grapoi.rebase(expectedTerm) + + grapoiEqual(result, expectedGrapoi) + datasetEqual(result.dataset, expectedGrapoi.dataset) + }) + + it('should rebase datasets with relative named nodes', () => { + const { expectedGrapoi, expectedTerm, grapoi } = datasets.rebaseRelative() + + const result = grapoi.rebase(expectedTerm) + + grapoiEqual(result, expectedGrapoi) + datasetEqual(result.dataset, expectedGrapoi.dataset) + }) }) describe('.replace', () => { diff --git a/test/support/datasets.multi.js b/test/support/datasets.multi.js index 104e608..3e9bd9f 100644 --- a/test/support/datasets.multi.js +++ b/test/support/datasets.multi.js @@ -158,6 +158,26 @@ triples.rebased = [ [links[1], ns.other.propertyB, ns.other.end] ] +triples.rebaseEmpty = [ + [factory.namedNode(''), ns.ex.propertyA, links[0]], + [links[0], ns.ex.propertyB, factory.namedNode('end')] +] + +triples.rebasedEmpty = [ + [ns.exCom(''), ns.ex.propertyA, links[0]], + [links[0], ns.ex.propertyB, ns.exCom.end] +] + +triples.rebaseRelative = [ + [factory.namedNode('http'), ns.ex.propertyA, links[0]], + [links[0], ns.ex.propertyB, factory.namedNode('httpend')] +] + +triples.rebasedRelative = [ + [ns.exCom(''), ns.ex.propertyA, links[0]], + [links[0], ns.ex.propertyB, ns.exCom.end] +] + triples.replace = [ [ns.ex(''), ns.ex.propertyA, links[0]], [links[0], ns.ex.propertyB, ns.ex.end], @@ -692,6 +712,32 @@ multi.rebase = () => { return { expectedGrapoi, expectedTerm, ...others } } +multi.rebaseEmpty = () => { + const { ...others } = createPathListDataset(triples.rebaseEmpty, { terms: [factory.namedNode('')] }) + + const expectedTerm = ns.exCom('') + + const expectedGrapoi = new Grapoi({ + dataset: factory.dataset(triples.rebasedEmpty.map(parts => factory.quad(...parts))), + term: expectedTerm + }) + + return { expectedGrapoi, expectedTerm, ...others } +} + +multi.rebaseRelative = () => { + const { ...others } = createPathListDataset(triples.rebaseRelative, { terms: [factory.namedNode('http')] }) + + const expectedTerm = ns.exCom('') + + const expectedGrapoi = new Grapoi({ + dataset: factory.dataset(triples.rebasedRelative.map(parts => factory.quad(...parts))), + term: expectedTerm + }) + + return { expectedGrapoi, expectedTerm, ...others } +} + multi.replace = () => { const { ...others } = createPathListDataset(triples.replace, { terms: [ns.ex('')] })