diff --git a/import/source/whosonfirst/map/hierarchies.js b/import/source/whosonfirst/map/hierarchies.js index 1df7006..1de153c 100644 --- a/import/source/whosonfirst/map/hierarchies.js +++ b/import/source/whosonfirst/map/hierarchies.js @@ -18,12 +18,16 @@ function sortHierarchy (hierarchy) { function mapper (place, properties) { const hierarchies = _.get(properties, 'wof:hierarchy', []) - const pt = spec.names.get(place.ontology.type) const id = parseInt(place.identity.id, 10) hierarchies.forEach((hierarchy, o) => { // sort hierarchy and ensure self-reference exists - const sorted = sortHierarchy({ ...hierarchy, ...{ [`${pt.name}_id`]: id } }) + // note: place.ontology.type is used directly (rather than looking it up + // via spec.names) so that records with a placetype not present in the + // spec file (eg. a WOF placetype spatial doesn't support yet) still get + // a self-reference instead of crashing - sortHierarchy() already treats + // unrecognised placetypes as rank 0. + const sorted = sortHierarchy({ ...hierarchy, ...{ [`${place.ontology.type}_id`]: id } }) let depth = 0 for (const key in sorted) { diff --git a/import/source/whosonfirst/map/hierarchies.test.js b/import/source/whosonfirst/map/hierarchies.test.js index 8554f24..2086c55 100644 --- a/import/source/whosonfirst/map/hierarchies.test.js +++ b/import/source/whosonfirst/map/hierarchies.test.js @@ -138,6 +138,28 @@ tap.test('mapper: key ordering', (t) => { t.end() }) +tap.test('mapper: record\'s own placetype not in spec (eg. postalregion) should not throw, ' + + 'and should still get a self-reference', (t) => { + const p = new Place(new Identity('wof', '1864205377'), new Ontology('admin', 'postalregion')) + map(p, { + 'wof:hierarchy': [ + { + continent_id: 102191581, + country_id: 85633159, + empire_id: 136253055 + } + ] + }) + + t.same([ + new Hierarchy(p.identity, new Identity('wof', '85633159'), 'wof:0', 0), + new Hierarchy(p.identity, new Identity('wof', '136253055'), 'wof:0', 1), + new Hierarchy(p.identity, new Identity('wof', '102191581'), 'wof:0', 2), + new Hierarchy(p.identity, p.identity, 'wof:0', 3) + ], p.hierarchy) + + t.end() +}) tap.test('mapper: sort hierarchy - unknown placetype', (t) => { const p = new Place(new Identity('wof', '1729339019'), new Ontology('admin', 'locality')) map(p, {