From e2ac0ff76bd1a2a50cfe586e0fb1aaef16dac842 Mon Sep 17 00:00:00 2001 From: elf Pavlik Date: Fri, 28 Feb 2014 11:00:44 +0100 Subject: [PATCH] fixed support of multiple objects for same predicate --- index.js | 19 +++++++++++-------- test/get_spec.js | 26 ++++++++++++++++++++++++++ test/languagetags_spec.js | 29 ++++++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 9 deletions(-) diff --git a/index.js b/index.js index ab3d9f6..b318e95 100644 --- a/index.js +++ b/index.js @@ -66,7 +66,7 @@ function levelgraphJSONLD(db, jsonldOpts) { }); stream.end(); }); - }; + } graphdb.jsonld.put = function(obj, options, callback) { if (typeof obj === 'string') { @@ -141,8 +141,11 @@ function levelgraphJSONLD(db, jsonldOpts) { switch (type) { case TYPES.STRING: case TYPES.PLAIN: + coerced['@value'] = value; + break; case RDFLANGSTRING: coerced['@value'] = value; + coerced['@language'] = N3Util.getLiteralLanguage(object); break; case TYPES.INTEGER: coerced['@value'] = parseInt(value, 10); @@ -163,7 +166,7 @@ function levelgraphJSONLD(db, jsonldOpts) { coerced = { '@value': value, '@type': type }; } return coerced; - }; + } function fetchExpandedTriples(iri, memo, callback) { if (typeof memo === 'function') { @@ -195,12 +198,12 @@ function levelgraphJSONLD(db, jsonldOpts) { object['@id'] = triple.object; } else if (N3Util.isLiteral(triple.object)) { object = getCoercedObject(triple.object); - var language = N3Util.getLiteralLanguage(triple.object); - if (language) { - object['@language'] = language; - } } - acc[triple.subject][triple.predicate] = object; + if(acc[triple.subject][triple.predicate]){ + acc[triple.subject][triple.predicate].push(object); + } else { + acc[triple.subject][triple.predicate] = [object]; + } cb(null, acc); } else { fetchExpandedTriples(triple.object, function(err, expanded) { @@ -217,7 +220,7 @@ function levelgraphJSONLD(db, jsonldOpts) { } }, callback); }); - }; + } graphdb.jsonld.get = function(iri, context, options, callback) { diff --git a/test/get_spec.js b/test/get_spec.js index 291e667..50d8529 100644 --- a/test/get_spec.js +++ b/test/get_spec.js @@ -64,6 +64,32 @@ describe('jsonld.get', function() { }); }); + it('with an object with multiple objects for same predicate' ,function(done){ + var bbb = helper.getFixture('bigbuckbunny.json'); + + var act1 = { + subject: bbb['@id'], + predicate: 'http://schema.org/actor', + object: 'http://example.net/act1' + }; + + var act2 = { + subject: bbb['@id'], + predicate: 'http://schema.org/actor', + object: 'http://example.net/act2' + }; + + db.jsonld.put(bbb, function() { + db.put([act1, act2], function() { + db.jsonld.get(bbb['@id'], bbb['@context'], function(err, doc) { + expect(doc['actor']).to.be.an('array'); + expect(doc['actor']).to.have.length(2); + done(); + }); + }); + }); + }); + describe('with an object with an array for its ["@type"]', function() { var ratatat; diff --git a/test/languagetags_spec.js b/test/languagetags_spec.js index 84c4dc1..b3403d5 100644 --- a/test/languagetags_spec.js +++ b/test/languagetags_spec.js @@ -70,7 +70,8 @@ describe('jsonld.get language tags', function() { }); it('recognizes', function(done) { - triple = { + delete bbb.name; + var triple = { subject: bbb['@id'], predicate: 'http://schema.org/name', object: '"Big Buck Bunny"@en' @@ -86,4 +87,30 @@ describe('jsonld.get language tags', function() { }); }); }); + + it('supports multiple language objects', function(done) { + var en = { + subject: bbb['@id'], + predicate: 'http://schema.org/description', + object: '"Big Buck Bunny"@en' + }; + + var it = { + subject: bbb['@id'], + predicate: 'http://schema.org/description', + object: '"Grande Coniglio Coniglietto"@it' + }; + bbb['@context'].description = { '@container': '@language' }; + + db.jsonld.put(bbb, function() { + db.put([en, it], function() { + db.jsonld.get(bbb['@id'], bbb['@context'], function(err, doc) { + expect(doc.description.en).to.equal('Big Buck Bunny'); + expect(doc.description.it).to.equal('Grande Coniglio Coniglietto'); + done(); + }); + }); + }); + }); + });