Fix host filter parsing

This commit is contained in:
gconsidine
2017-09-14 15:31:29 -04:00
parent 28a26e6e81
commit 57c9224b5c
3 changed files with 27 additions and 5 deletions

View File

@@ -164,7 +164,7 @@ export default ['$stateParams', '$scope', '$state', 'GetBasePath', 'QuerySet', '
let splitTerms; let splitTerms;
if ($scope.singleSearchParam === 'host_filter') { if ($scope.singleSearchParam === 'host_filter') {
splitTerms = SmartSearchService.splitHostIntoTerms(terms); splitTerms = SmartSearchService.splitFilterIntoTerms(terms);
} else { } else {
splitTerms = SmartSearchService.splitSearchIntoTerms(terms); splitTerms = SmartSearchService.splitSearchIntoTerms(terms);
} }

View File

@@ -6,10 +6,14 @@ export default [function() {
* work is done to encode quotes in quoted values and the spaces within those quoted * work is done to encode quotes in quoted values and the spaces within those quoted
* values before calling to `splitSearchIntoTerms`. * values before calling to `splitSearchIntoTerms`.
*/ */
splitHostIntoTerms (searchString) { splitFilterIntoTerms (searchString) {
let groups = []; let groups = [];
let quoted; let quoted;
if (!searchString.includes(' ')) {
return this.splitSearchIntoTerms(this.encode(searchString));
}
searchString.split(' ').forEach(substring => { searchString.split(' ').forEach(substring => {
if (substring.includes(':"')) { if (substring.includes(':"')) {
quoted = substring; quoted = substring;
@@ -17,9 +21,7 @@ export default [function() {
quoted += ` ${substring}`; quoted += ` ${substring}`;
if (substring.includes('"')) { if (substring.includes('"')) {
quoted = quoted.replace(/"/g, encodeURIComponent('"')); groups.push(this.encode(quoted));
quoted = quoted.replace(/ /g, encodeURIComponent(' '));
groups.push(quoted);
quoted = undefined; quoted = undefined;
} }
} else { } else {
@@ -29,6 +31,11 @@ export default [function() {
return this.splitSearchIntoTerms(groups.join(' ')); return this.splitSearchIntoTerms(groups.join(' '));
}, },
encode (string) {
string = string.replace(/'/g, '%27');
return string.replace(/("| )/g, match => encodeURIComponent(match));
},
splitSearchIntoTerms(searchString) { splitSearchIntoTerms(searchString) {
return searchString.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g); return searchString.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g);
}, },

View File

@@ -42,4 +42,19 @@ describe('Service: SmartSearch', () => {
}); });
}); });
describe('fn splitFilterIntoTerms', () => {
it('should convert the filter term to a key and value with encode quotes and spaces', () => {
expect(SmartSearchService.splitFilterIntoTerms('foo')).toEqual(["foo"]);
expect(SmartSearchService.splitFilterIntoTerms('foo bar')).toEqual(["foo", "bar"]);
expect(SmartSearchService.splitFilterIntoTerms('name:foo bar')).toEqual(["name:foo", "bar"]);
expect(SmartSearchService.splitFilterIntoTerms('name:foo description:bar')).toEqual(["name:foo", "description:bar"]);
expect(SmartSearchService.splitFilterIntoTerms('name:"foo bar"')).toEqual(["name:%22foo%20bar%22"]);
expect(SmartSearchService.splitFilterIntoTerms('name:"foo bar" description:"bar foo"')).toEqual(["name:%22foo%20bar%22", "description:%22bar%20foo%22"]);
expect(SmartSearchService.splitFilterIntoTerms('name:"foo bar" a b c')).toEqual(["name:%22foo%20bar%22", 'a', 'b', 'c']);
expect(SmartSearchService.splitFilterIntoTerms('name:"1"')).toEqual(["name:%221%22"]);
expect(SmartSearchService.splitFilterIntoTerms('name:1')).toEqual(["name:1"]);
expect(SmartSearchService.splitFilterIntoTerms(`name:"foo ba'r" a b c`)).toEqual(["name:%22foo%20ba%27r%22", 'a', 'b', 'c']);
});
});
}); });