Skip to content

Commit

Permalink
Handle @none in containers
Browse files Browse the repository at this point in the history
  • Loading branch information
rubensworks committed Mar 16, 2020
1 parent 5e01165 commit c9837c4
Show file tree
Hide file tree
Showing 6 changed files with 180 additions and 9 deletions.
2 changes: 1 addition & 1 deletion lib/JsonLdParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ export class JsonLdParser extends Transform {
new EntryHandlerKeywordGraph(),
new EntryHandlerKeywordType(),
new EntryHandlerKeywordValue(),
new EntryHandlerKeywordUnknownFallback(),
new EntryHandlerContainer(),
new EntryHandlerKeywordUnknownFallback(),
new EntryHandlerPredicate(),
new EntryHandlerInvalidFallback(),
];
Expand Down
12 changes: 12 additions & 0 deletions lib/Util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -766,4 +766,16 @@ export class Util {
return lastValidDepth;
}

/**
* Get the key for the current container entry.
* @param keys The key chain.
* @param depth The current depth to get the key from.
* @return Promise resolving to the key.
* Null will be returned for @none entries, with aliasing taken into account.
*/
public async getContainerKey(keys: string[], depth: number): Promise<any> {
const key = await this.unaliasKeyword(keys[depth], keys, depth);
return key === '@none' ? null : key;
}

}
5 changes: 4 additions & 1 deletion lib/containerhandler/ContainerHandlerIdentifier.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@ export class ContainerHandlerIdentifier implements IContainerHandler {
public async handle(parsingContext: ParsingContext, util: Util, keys: string[], value: any, depth: number)
: Promise<void> {
// Create the identifier
const id = await util.resourceToTerm(await parsingContext.getContext(keys), keys[depth]);
const keyUnaliased = await util.getContainerKey(keys, depth);
const id = keyUnaliased !== null
? await util.resourceToTerm(await parsingContext.getContext(keys), keys[depth])
: util.dataFactory.blankNode();

// Do nothing if the id is invalid
if (!id) {
Expand Down
6 changes: 4 additions & 2 deletions lib/containerhandler/ContainerHandlerLanguage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@ export class ContainerHandlerLanguage implements IContainerHandler {

public async handle(parsingContext: ParsingContext, util: Util, keys: string[], value: any, depth: number)
: Promise<void> {
const language = await util.getContainerKey(keys, depth);

if (Array.isArray(value)) {
value = value.map((subValue) => ({ '@value': subValue, '@language': keys[depth] }));
value = value.map((subValue) => ({ '@value': subValue, '@language': language }));
} else {
value = { '@value': value, '@language': keys[depth] };
value = { '@value': value, '@language': language };
}
await parsingContext.newOnValueJob(keys, value, depth - 1, true);

Expand Down
7 changes: 4 additions & 3 deletions lib/containerhandler/ContainerHandlerType.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@ export class ContainerHandlerType implements IContainerHandler {
await parsingContext.newOnValueJob(keys, value, depth - 1, true);

// Identify the type to emit.
const keyOriginal = keys[depth];
const context = await parsingContext.getContext(keys);
const type = util.createVocabOrBaseTerm(context, keyOriginal);
const keyOriginal = await util.getContainerKey(keys, depth);
const type = keyOriginal !== null
? util.createVocabOrBaseTerm(await parsingContext.getContext(keys), keyOriginal)
: null;
if (type) {
// Push the type to the stack using the rdf:type predicate
await EntryHandlerPredicate.handlePredicateObject(parsingContext, util, keys, depth + 1,
Expand Down
157 changes: 155 additions & 2 deletions test/JsonLdParser-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5686,6 +5686,61 @@ describe('JsonLdParser', () => {
]);
});

it('with @id and language map with @none', async () => {
const stream = streamifyString(`
{
"@context": {
"ex": "http://ex.org/",
"p": { "@id": "http://ex.org/pred1", "@container": "@language" }
},
"@id": "http://ex.org/myid",
"p": {
"ja": "忍者",
"en": "Ninja",
"cs": "Nindža",
"@none": "Default"
}
}`);
return expect(await arrayifyStream(stream.pipe(parser))).toBeRdfIsomorphic([
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
literal('忍者', 'ja')),
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
literal('Ninja', 'en')),
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
literal('Nindža', 'cs')),
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
literal('Default')),
]);
});

it('with @id and language map with aliased @none', async () => {
const stream = streamifyString(`
{
"@context": {
"ex": "http://ex.org/",
"p": { "@id": "http://ex.org/pred1", "@container": "@language" },
"none": "@none"
},
"@id": "http://ex.org/myid",
"p": {
"ja": "忍者",
"en": "Ninja",
"cs": "Nindža",
"none": "Default"
}
}`);
return expect(await arrayifyStream(stream.pipe(parser))).toBeRdfIsomorphic([
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
literal('忍者', 'ja')),
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
literal('Ninja', 'en')),
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
literal('Nindža', 'cs')),
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
literal('Default')),
]);
});

});

describe('for indexes', () => {
Expand Down Expand Up @@ -5755,7 +5810,7 @@ describe('JsonLdParser', () => {
return expect(await arrayifyStream(stream.pipe(parser))).toBeRdfIsomorphic([]);
});

it('with @id and index map', async () => {
it('with @id and index map with @none', async () => {
const stream = streamifyString(`
{
"@context": {
Expand All @@ -5766,7 +5821,8 @@ describe('JsonLdParser', () => {
"p": {
"ja": "忍者",
"en": "Ninja",
"cs": "Nindža"
"cs": "Nindža",
"@none": "Default"
}
}`);
return expect(await arrayifyStream(stream.pipe(parser))).toBeRdfIsomorphic([
Expand All @@ -5776,6 +5832,8 @@ describe('JsonLdParser', () => {
literal('Ninja')),
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
literal('Nindža')),
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
literal('Default')),
]);
});

Expand Down Expand Up @@ -5939,6 +5997,54 @@ describe('JsonLdParser', () => {
return expect(await arrayifyStream(stream.pipe(parser))).toBeRdfIsomorphic([]);
});

it('with @id and identifier map with @none', async () => {
const stream = streamifyString(`
{
"@context": {
"@base": "http://example.com/posts/",
"ex": "http://ex.org/",
"p": { "@id": "http://ex.org/pred1", "@container": "@id" },
"body": "ex:body",
"words": "ex:words"
},
"@id": "http://ex.org/myid",
"p": {
"1/en": {
"body": "body 1",
"words": "1539"
},
"1/de": {
"body": "body 2",
"words": "1204"
},
"@none": {
"body": "body 3",
"words": "111"
}
}
}`);
return expect(await arrayifyStream(stream.pipe(parser))).toBeRdfIsomorphic([
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
namedNode('http://example.com/posts/1/en')),
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
namedNode('http://example.com/posts/1/de')),
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
blankNode('b1')),
triple(namedNode('http://example.com/posts/1/en'), namedNode('http://ex.org/body'),
literal('body 1')),
triple(namedNode('http://example.com/posts/1/en'), namedNode('http://ex.org/words'),
literal('1539')),
triple(namedNode('http://example.com/posts/1/de'), namedNode('http://ex.org/body'),
literal('body 2')),
triple(namedNode('http://example.com/posts/1/de'), namedNode('http://ex.org/words'),
literal('1204')),
triple(blankNode('b1'), namedNode('http://ex.org/body'),
literal('body 3')),
triple(blankNode('b1'), namedNode('http://ex.org/words'),
literal('111')),
]);
});

});

describe('for types', () => {
Expand Down Expand Up @@ -6135,6 +6241,53 @@ describe('JsonLdParser', () => {
]);
});

it('with @id and type map with @none', async () => {
const stream = streamifyString(`
{
"@context": {
"@base": "http://example.com/entries/",
"ex": "http://ex.org/",
"p": { "@id": "http://ex.org/pred1", "@container": "@type" },
"value": "ex:value"
},
"@id": "http://ex.org/myid",
"p": {
"ex:Type1": {
"@id": "value1",
"value": "1539"
},
"ex:Type2": {
"@id": "value2",
"value": "1204"
},
"@none": {
"@id": "value3",
"value": "111"
}
}
}`);
return expect(await arrayifyStream(stream.pipe(parser))).toBeRdfIsomorphic([
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
namedNode('http://example.com/entries/value1')),
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
namedNode('http://example.com/entries/value2')),
triple(namedNode('http://ex.org/myid'), namedNode('http://ex.org/pred1'),
namedNode('http://example.com/entries/value3')),
triple(namedNode('http://example.com/entries/value1'), namedNode('http://ex.org/value'),
literal('1539')),
triple(namedNode('http://example.com/entries/value1'),
namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'),
namedNode('http://ex.org/Type1')),
triple(namedNode('http://example.com/entries/value2'), namedNode('http://ex.org/value'),
literal('1204')),
triple(namedNode('http://example.com/entries/value2'),
namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'),
namedNode('http://ex.org/Type2')),
triple(namedNode('http://example.com/entries/value3'), namedNode('http://ex.org/value'),
literal('111')),
]);
});

});

describe('for graphs', () => {
Expand Down

0 comments on commit c9837c4

Please sign in to comment.