Skip to content

Commit 06a2e38

Browse files
gkelloggdavidlehn
authored andcommitted
Create mergeNodeMapGraphs implementing the 1.1 algorithm used in framing. This leaves other versions used for merging documents, which aren't related to the spec.
1 parent ef4f5ae commit 06a2e38

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

lib/frame.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const util = require('./util');
1010
const JsonLdError = require('./JsonLdError');
1111
const {
1212
createNodeMap: _createNodeMap,
13-
mergeNodeMaps: _mergeNodeMaps
13+
mergeNodeMapGraphs: _mergeNodeMapGraphs
1414
} = require('./nodeMap');
1515

1616
const api = {};
@@ -40,7 +40,7 @@ api.frameMerged = (input, frame, options) => {
4040
// FIXME: currently uses subjects from @merged graph only
4141
const issuer = new util.IdentifierIssuer('_:b');
4242
_createNodeMap(input, state.graphMap, '@default', issuer);
43-
state.graphMap['@merged'] = _mergeNodeMaps(state.graphMap);
43+
state.graphMap['@merged'] = _mergeNodeMapGraphs(state.graphMap);
4444
state.subjects = state.graphMap['@merged'];
4545

4646
// frame the subjects

lib/nodeMap.js

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,7 @@ api.createNodeMap = (input, graphs, graph, issuer, name, list) => {
140140
if(!(name in graphs)) {
141141
graphs[name] = {};
142142
}
143-
const g = (graph === '@merged') ? graph : name;
144-
api.createNodeMap(input[property], graphs, g, issuer);
143+
api.createNodeMap(input[property], graphs, name, issuer);
145144
continue;
146145
}
147146

@@ -209,6 +208,42 @@ api.createNodeMap = (input, graphs, graph, issuer, name, list) => {
209208
}
210209
};
211210

211+
/**
212+
* Merge separate named graphs into a single merged graph including
213+
* all nodes from the default graph and named graphs.
214+
*
215+
* @param graphs a map of graph name to subject map.
216+
*
217+
* @return the merged graph map.
218+
*/
219+
api.mergeNodeMapGraphs = graphs => {
220+
const merged = {};
221+
for(const name of Object.keys(graphs).sort()) {
222+
for(const id of Object.keys(graphs[name]).sort()) {
223+
const node = graphs[name][id];
224+
if(!(id in merged)) {
225+
merged[id] = {'@id': id};
226+
}
227+
const mergedNode = merged[id];
228+
229+
for(const property of Object.keys(node).sort()) {
230+
if(isKeyword(property)) {
231+
// copy keywords
232+
mergedNode[property] = util.clone(node[property]);
233+
} else {
234+
// merge objects
235+
for(const value of node[property]) {
236+
util.addValue(
237+
mergedNode, property, util.clone(value), {propertyIsArray: true, allowDuplicate: false});
238+
}
239+
}
240+
}
241+
}
242+
}
243+
244+
return merged;
245+
};
246+
212247
api.mergeNodeMaps = graphs => {
213248
// add all non-default graphs to default graph
214249
const defaultGraph = graphs['@default'];

tests/test-common.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ const TEST_TYPES = {
6060
},
6161
'jld:FrameTest': {
6262
skip: {
63-
regex: [/tp/, /t0031/, /t004[6-9]/, /t005[01]/]
63+
regex: [/tp/, /t0031/, /t0051/]
6464
},
6565
fn: 'frame',
6666
params: [

0 commit comments

Comments
 (0)