@mountainpass/addressr 2.1.4 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -675,7 +675,11 @@ function mapAddressDetails(d, context, index, count) {
675
675
  };
676
676
  rval.mla = mapToMla(rval.structured);
677
677
  rval.sla = mapToSla(rval.mla);
678
- if (rval.structured.flat != undefined) {
678
+ if (rval.structured.flat == undefined) {
679
+ // Symmetric ssla so BM25 summation across sla+ssla does not favour
680
+ // sub-unit docs over exact street-level matches. See ADR 025 / P007.
681
+ rval.ssla = rval.sla;
682
+ } else {
679
683
  rval.smla = mapToShortMla(rval.structured);
680
684
  rval.ssla = mapToSla(rval.smla);
681
685
  }
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+
3
+ var _nodeTest = require("node:test");
4
+ var _strict = _interopRequireDefault(require("node:assert/strict"));
5
+ var _addressService = require("./address-service.js");
6
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
+ // Regression test for P007 / issue #375 — see ADR 025.
8
+ // Sub-unit documents populate both `sla` and `ssla`; street-level documents
9
+ // historically populated only `sla`, which caused BM25 per-field score
10
+ // summation to favour sub-unit docs over exact street-level matches.
11
+ // The fix: always populate `ssla` (= `sla` when no flat) so scoring is
12
+ // symmetric across all documents.
13
+
14
+ const baseAuthorityContext = {
15
+ Authority_Code_LOCALITY_CLASS_AUT_psv: [{
16
+ CODE: 'G',
17
+ NAME: 'GAZETTED LOCALITY'
18
+ }],
19
+ Authority_Code_STREET_CLASS_AUT_psv: [{
20
+ CODE: 'C',
21
+ NAME: 'CONFIRMED'
22
+ }],
23
+ Authority_Code_STREET_TYPE_AUT_psv: [{
24
+ CODE: 'ROAD',
25
+ NAME: 'RD',
26
+ DESCRIPTION: 'RD'
27
+ }],
28
+ Authority_Code_STREET_SUFFIX_AUT_psv: [],
29
+ Authority_Code_FLAT_TYPE_AUT_psv: [{
30
+ CODE: 'UNIT',
31
+ NAME: 'UNIT'
32
+ }],
33
+ Authority_Code_LEVEL_TYPE_AUT_psv: [],
34
+ Authority_Code_GEOCODED_LEVEL_TYPE_AUT_psv: [],
35
+ Authority_Code_GEOCODE_TYPE_AUT_psv: [],
36
+ Authority_Code_GEOCODE_RELIABILITY_AUT_psv: [],
37
+ state: 'QLD',
38
+ stateName: 'QUEENSLAND'
39
+ };
40
+ function buildContext(streetLocalityPid, streetLocality, localityPid, locality) {
41
+ const context = {
42
+ ...baseAuthorityContext,
43
+ streetLocalityIndexed: [],
44
+ localityIndexed: []
45
+ };
46
+ context.streetLocalityIndexed[streetLocalityPid] = streetLocality;
47
+ context.localityIndexed[localityPid] = locality;
48
+ return context;
49
+ }
50
+ const streetLocality = {
51
+ STREET_LOCALITY_PID: 'QLD180101',
52
+ DATE_CREATED: '2017-08-10',
53
+ DATE_RETIRED: '',
54
+ STREET_CLASS_CODE: 'C',
55
+ STREET_NAME: 'AERODROME',
56
+ STREET_TYPE_CODE: 'ROAD',
57
+ STREET_SUFFIX_CODE: '',
58
+ LOCALITY_PID: 'QLD69',
59
+ GNAF_STREET_PID: '3169537',
60
+ GNAF_STREET_CONFIDENCE: '2',
61
+ GNAF_RELIABILITY_CODE: '4'
62
+ };
63
+ const locality = {
64
+ LOCALITY_PID: 'QLD69',
65
+ DATE_CREATED: '2016-08-10',
66
+ DATE_RETIRED: '',
67
+ LOCALITY_NAME: 'APPLETHORPE',
68
+ PRIMARY_POSTCODE: '',
69
+ LOCALITY_CLASS_CODE: 'G',
70
+ STATE_PID: '3',
71
+ GNAF_LOCALITY_PID: '198011',
72
+ GNAF_RELIABILITY_CODE: '5'
73
+ };
74
+ function addressDetail(overrides = {}) {
75
+ return {
76
+ ADDRESS_DETAIL_PID: 'GAQLD163157353',
77
+ DATE_CREATED: '2010-04-21',
78
+ DATE_LAST_MODIFIED: '2018-08-03',
79
+ DATE_RETIRED: '',
80
+ BUILDING_NAME: '',
81
+ LOT_NUMBER_PREFIX: '',
82
+ LOT_NUMBER: '',
83
+ LOT_NUMBER_SUFFIX: '',
84
+ FLAT_TYPE_CODE: '',
85
+ FLAT_NUMBER_PREFIX: '',
86
+ FLAT_NUMBER: '',
87
+ FLAT_NUMBER_SUFFIX: '',
88
+ LEVEL_TYPE_CODE: '',
89
+ LEVEL_NUMBER_PREFIX: '',
90
+ LEVEL_NUMBER: '',
91
+ LEVEL_NUMBER_SUFFIX: '',
92
+ NUMBER_FIRST_PREFIX: '',
93
+ NUMBER_FIRST: '42',
94
+ NUMBER_FIRST_SUFFIX: '',
95
+ NUMBER_LAST_PREFIX: '',
96
+ NUMBER_LAST: '',
97
+ NUMBER_LAST_SUFFIX: '',
98
+ STREET_LOCALITY_PID: 'QLD180101',
99
+ LOCATION_DESCRIPTION: '',
100
+ LOCALITY_PID: 'QLD69',
101
+ ALIAS_PRINCIPAL: 'P',
102
+ POSTCODE: '4378',
103
+ PRIVATE_STREET: '',
104
+ LEGAL_PARCEL_ID: '',
105
+ CONFIDENCE: '0',
106
+ ADDRESS_SITE_PID: '',
107
+ LEVEL_GEOCODED_CODE: '',
108
+ PROPERTY_PID: '',
109
+ GNAF_PROPERTY_PID: '',
110
+ PRIMARY_SECONDARY: '',
111
+ ...overrides
112
+ };
113
+ }
114
+ (0, _nodeTest.describe)('P007 — ssla population (ADR 025)', () => {
115
+ (0, _nodeTest.it)('populates ssla equal to sla for a street-level address with no sub-unit', () => {
116
+ const context = buildContext('QLD180101', streetLocality, 'QLD69', locality);
117
+ const mapped = (0, _addressService.mapAddressDetails)(addressDetail(), context, 1, 1);
118
+ _strict.default.equal(typeof mapped.sla, 'string', 'sla must be present on every indexed address');
119
+ _strict.default.equal(mapped.ssla, mapped.sla, 'ssla must equal sla when the address has no sub-unit, so BM25 per-field ' + 'score summation across [sla, ssla] is symmetric across documents');
120
+ });
121
+ (0, _nodeTest.it)('populates ssla from the short-form address for a sub-unit', () => {
122
+ const context = buildContext('QLD180101', streetLocality, 'QLD69', locality);
123
+ const mapped = (0, _addressService.mapAddressDetails)(addressDetail({
124
+ FLAT_TYPE_CODE: 'UNIT',
125
+ FLAT_NUMBER: '1'
126
+ }), context, 1, 1);
127
+ _strict.default.ok(mapped.ssla && mapped.ssla !== mapped.sla, 'for a sub-unit, ssla should be the short-form address (distinct from sla)');
128
+ _strict.default.match(mapped.sla, /UNIT 1/, 'sub-unit sla includes the unit prefix');
129
+ _strict.default.doesNotMatch(mapped.ssla, /UNIT 1/, 'sub-unit ssla strips the unit prefix (preserving slash-form matching)');
130
+ });
131
+ });
package/lib/version.js CHANGED
@@ -5,4 +5,4 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.version = void 0;
7
7
  // Generated by genversion.
8
- const version = exports.version = '2.1.4';
8
+ const version = exports.version = '2.2.0';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mountainpass/addressr",
3
- "version": "2.1.4",
3
+ "version": "2.2.0",
4
4
  "description": "Australian Address Validation, Search and Autocomplete",
5
5
  "author": {
6
6
  "name": "Mountain Pass",
@@ -107,6 +107,7 @@
107
107
  "dotest:cli2:geo": "ADDRESSR_ENABLE_GEO=1 ES_INDEX_NAME=test COVERED_STATES=OT TEST_PROFILE=cli2 cucumber-js -p cli2 -- --harmony_async_iteration",
108
108
  "cover:cli:geo": "nyc --report-dir coverage/cli --temp-dir coverage/cli/.nyc_output npm run test:cli:nogeo",
109
109
  "test:mcp:smoke": "node --test test/mcp/smoke.test.mjs",
110
+ "test:precommit": "node --test test/precommit/*.test.mjs",
110
111
  "test:nodejs:QLD:nogeo": "PORT=$npm_package_config_localport ES_INDEX_NAME=test COVERED_STATES=QLD DEBUG=error,api,express:*,swagger-tools*,test,es TEST_PROFILE=default cucumber-js -p default -- --harmony_async_iteration",
111
112
  "test:nodejs:QLD:geo": "PORT=$npm_package_config_localport ADDRESSR_ENABLE_GEO=1 ES_INDEX_NAME=test-geo COVERED_STATES=QLD DEBUG=error,api,express:*,swagger-tools*,test,es TEST_PROFILE=default NODE_OPTIONS=--max_old_space_size=8196 cucumber-js -p default -- --harmony_async_iteration",
112
113
  "prebuildX": "npm run genversion && cat ./templates/LICENSE.md | envsubst '${PRODUCT},${VERSION},${COMPANY},${YEAR}' > ./LICENSE.md",
@@ -122,7 +123,8 @@
122
123
  "docker:push": "docker push \"mountainpass/addressr:${npm_package_version}\"",
123
124
  "postdocker:push": "docker push \"mountainpass/addressr:latest\"",
124
125
  "check-licenses": "license-checker --production --onlyAllow 'MIT;Apache-2.0;ISC;Custom: http://github.com/substack/node-bufferlist;Unlicense;BSD-2-Clause;BSD-3-Clause;WTFPL;0BSD;MIT*;Python-2.0;MPL-2.0;BlueOak-1.0.0' --summary",
125
- "pre-commit": "lint-staged && npm run check-licenses",
126
+ "pre-commit": "lint-staged && npm run check-licenses && npm run check:not-cli2-tags",
127
+ "check:not-cli2-tags": "node scripts/check-not-cli2-tags.mjs",
126
128
  "check-deps": "dry-aged-deps --check",
127
129
  "test:performance": "k6 run --out csv=target/stress.csv test/k6/script.js",
128
130
  "add-changeset": "changeset add --open",