Skip to content

Commit 81e9c5d

Browse files
matkoniecztyrasd
andauthored
preset search - match when preset text is in term (#12159)
currently only when search terms are within preset text or text is close then matches are found as result for example "private swimming pool" was not matching "swimming pool preset" fixes #9105 --------- Co-authored-by: Martin Raifer <martin@raifer.tech>
1 parent bec7f1e commit 81e9c5d

2 files changed

Lines changed: 27 additions & 1 deletion

File tree

modules/presets/collection.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ export function presetCollection(collection) {
6565
return index === 0;
6666
}
6767

68+
function presetInSearchTerm(presetText) {
69+
if (presetText.length === 0) {
70+
return false;
71+
}
72+
const index = value.indexOf(presetText.toLowerCase().trim());
73+
return index === 0 || value[index - 1] === ' ';
74+
}
75+
6876
function sortPresets(nameProp, aliasesProp) {
6977
return function sortNames(a, b) {
7078
let aCompare = a[nameProp]();
@@ -168,6 +176,13 @@ export function presetCollection(collection) {
168176
Object.keys(a.tags).some(key => leading(key + '=' + a.tags[key]))));
169177
}
170178

179+
// also match cases where preset string is inside searched term
180+
const presetsInValues = searchable
181+
.filter(a => ([a.searchName()].concat(a.searchAliases(), a.terms(), a.searchNameStripped(), a.searchAliasesStripped())).some(presetInSearchTerm));
182+
183+
const presetsInValuesViaSuggested = suggestions
184+
.filter(a => ([a.searchName()].concat(a.searchAliases(), a.terms(), a.searchNameStripped(), a.searchAliasesStripped())).some(presetInSearchTerm));
185+
171186
let results = leadingNames.concat(
172187
leadingSuggestions,
173188
leadingNamesStripped,
@@ -178,7 +193,9 @@ export function presetCollection(collection) {
178193
similarName,
179194
similarSuggestions,
180195
similarTerms,
181-
leadingTagKeyValues
196+
leadingTagKeyValues,
197+
presetsInValues,
198+
presetsInValuesViaSuggested
182199
).slice(0, MAXRESULTS - 1);
183200

184201
if (geometry) {

test/spec/presets/collection.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,5 +136,14 @@ describe('iD.presetCollection', function() {
136136
var result = c.search('landuse=grass', 'area').collection;
137137
expect(result.indexOf(p.grass1)).to.eql(0); // 1. 'Grass' (by tag key=value)
138138
});
139+
140+
it.each([
141+
'private grill',
142+
'very private and secret mysterious grill',
143+
'private grill in garden',
144+
])('returns matches also when search term includes the preset name as substring', function(search) {
145+
var result = c.search(search, 'point').matchGeometry('point').collection;
146+
expect(result.indexOf(p.grill), 'Grill').to.eql(0);
147+
});
139148
});
140149
});

0 commit comments

Comments
 (0)