From d89b9b68a2e5ea9d9334866e896f36896b0f3d57 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Tue, 18 Feb 2025 13:25:39 +0100 Subject: [PATCH] feat(post): add zero_prefixed_house_numbers script --- Document.js | 1 + post/zero_prefixed_house_numbers.js | 28 +++++++++ test/document/post.js | 3 +- test/post/zero_prefixed_house_numbers.js | 78 ++++++++++++++++++++++++ test/run.js | 1 + 5 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 post/zero_prefixed_house_numbers.js create mode 100644 test/post/zero_prefixed_house_numbers.js diff --git a/Document.js b/Document.js index 8a35348..938b11a 100644 --- a/Document.js +++ b/Document.js @@ -42,6 +42,7 @@ function Document( source, layer, source_id ){ this.addPostProcessingScript( require('./post/intersections') ); this.addPostProcessingScript( require('./post/seperable_street_names').post ); this.addPostProcessingScript( require('./post/alphanumeric_postcodes') ); + this.addPostProcessingScript( require('./post/zero_prefixed_house_numbers') ); this.addPostProcessingScript( require('./post/deduplication') ); this.addPostProcessingScript( require('./post/language_field_trimming') ); this.addPostProcessingScript( require('./post/popularity') ); diff --git a/post/zero_prefixed_house_numbers.js b/post/zero_prefixed_house_numbers.js new file mode 100644 index 0000000..d326c00 --- /dev/null +++ b/post/zero_prefixed_house_numbers.js @@ -0,0 +1,28 @@ +/** + * Zero prefixed house number post-processing script strips leading zeros from + * house numbers. eg. house number `001` -> `1`. + * + * This functionality was previously handled in elasticsearch + * using a `removeAllZeroNumericPrefix` filter, see: + * - https://github.com/pelias/schema/issues/503 + */ + +const _ = require('lodash'); + +function housenumber(doc) { + + // ensure housenumber is set + let houseno = doc.getAddress('number'); + if( !_.isString(houseno) || _.isEmpty(houseno) ){ return; } + + // trim leading/trailing whitespace + houseno = houseno.trim(); + + // only applies to housenumbers prefixed with a zero + if ( !houseno.startsWith('0') ) { return; } + + // trim leading zeros + doc.setAddress('number', houseno.replace(/^0+/, '')); +} + +module.exports = housenumber; diff --git a/test/document/post.js b/test/document/post.js index 897536f..be5a53b 100644 --- a/test/document/post.js +++ b/test/document/post.js @@ -3,12 +3,13 @@ const Document = require('../../Document'); const intersections = require('../../post/intersections'); const seperable_street_names = require('../../post/seperable_street_names').post; const alphanumeric_postcodes = require('../../post/alphanumeric_postcodes'); +const zero_prefixed_house_numbers = require('../../post/zero_prefixed_house_numbers'); const deduplication = require('../../post/deduplication'); const language_field_trimming = require('../../post/language_field_trimming'); const popularity = require('../../post/popularity'); const DEFAULT_SCRIPTS = [ intersections, seperable_street_names, alphanumeric_postcodes, - deduplication, language_field_trimming, popularity + zero_prefixed_house_numbers, deduplication, language_field_trimming, popularity ]; module.exports.tests = {}; diff --git a/test/post/zero_prefixed_house_numbers.js b/test/post/zero_prefixed_house_numbers.js new file mode 100644 index 0000000..9faee86 --- /dev/null +++ b/test/post/zero_prefixed_house_numbers.js @@ -0,0 +1,78 @@ +const Document = require('../../Document'); +const housenumber = require('../../post/zero_prefixed_house_numbers'); + +module.exports.tests = {}; + +module.exports.tests.noop = function(test) { + test('noop: house number not set', function(t) { + const doc = new Document('mysource', 'mylayer', 'myid'); + + housenumber(doc); + + // no action taken + t.equal(doc.getAddress('number'), undefined, 'not set'); + + t.end(); + }); + + test('noop: house no leading zero', function(t) { + const doc = new Document('mysource', 'mylayer', 'myid'); + doc.setAddress('number', '10'); + + housenumber(doc); + + // no action taken + t.equal(doc.getAddress('number'), '10', 'no change'); + + t.end(); + }); +}; + +module.exports.tests.strip_prefix = function(test) { + test('strip: house number with zero prefix', function(t) { + const doc = new Document('mysource', 'mylayer', 'myid'); + doc.setAddress('number', '010'); + + housenumber(doc); + + // prefix removed + t.equal(doc.getAddress('number'), '10', 'prefix removed'); + + t.end(); + }); + + test('strip: house number with multiple zero prefix', function(t) { + const doc = new Document('mysource', 'mylayer', 'myid'); + doc.setAddress('number', '000000001000'); + + housenumber(doc); + + // prefix removed + t.equal(doc.getAddress('number'), '1000', 'prefix removed'); + + t.end(); + }); + + test('strip: house number with multiple zero prefix plus multiple whitespace', function(t) { + const doc = new Document('mysource', 'mylayer', 'myid'); + doc.setAddress('number', ' 000000009990'); + + housenumber(doc); + + // prefix removed + t.equal(doc.getAddress('number'), '9990', 'prefix removed'); + + t.end(); + }); +}; + +module.exports.all = function (tape, common) { + + function test(name, testFunction) { + return tape('post/zero_prefixed_house_numbers: ' + name, testFunction); + } + + for( var testCase in module.exports.tests ){ + module.exports.tests[testCase](test, common); + } +}; diff --git a/test/run.js b/test/run.js index 0d0bfd7..4d41d41 100644 --- a/test/run.js +++ b/test/run.js @@ -24,6 +24,7 @@ const tests = [ require('./document/post.js'), require('./post/intersections.js'), require('./post/alphanumeric_postcodes.js'), + require('./post/zero_prefixed_house_numbers.js'), require('./post/deduplication.js'), require('./post/seperable_street_names.js'), require('./post/language_field_trimming.js'),