From f524c94bad1a710d152c8539dc1471aa767017bd Mon Sep 17 00:00:00 2001 From: mabashian Date: Tue, 7 May 2019 14:43:53 -0400 Subject: [PATCH 1/3] Fixes basic host filter searches --- .../client/src/shared/smart-search/queryset.service.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/awx/ui/client/src/shared/smart-search/queryset.service.js b/awx/ui/client/src/shared/smart-search/queryset.service.js index 2db940b94c..df143f0580 100644 --- a/awx/ui/client/src/shared/smart-search/queryset.service.js +++ b/awx/ui/client/src/shared/smart-search/queryset.service.js @@ -1,7 +1,5 @@ function searchWithoutKey (term, singleSearchParam = null) { - if (singleSearchParam === 'host_filter') { - return { [singleSearchParam]: `${encodeURIComponent(term)}` }; - } else if (singleSearchParam) { + if (singleSearchParam) { return { [singleSearchParam]: `search=${encodeURIComponent(term)}` }; } return { search: encodeURIComponent(term) }; @@ -418,7 +416,11 @@ function QuerysetService ($q, Rest, ProcessErrors, $rootScope, Wait, DjangoSearc let termParams; if (termParts.length === 1) { - termParams = searchWithoutKey(term, singleSearchParam); + if (singleSearchParam && termParts[0].toLowerCase() === "or") { + termParams = { [singleSearchParam]: "or" } + } else { + termParams = searchWithoutKey(term, singleSearchParam); + } } else if ((isAnsibleFactField && isAnsibleFactField(termParts)) || (isFilterableBaseField && isFilterableBaseField(termParts))) { termParams = this.encodeParam({ term, singleSearchParam, searchTerm: true }); } else if (isRelatedField && isRelatedField(termParts)) { From 11244f85a4eedfaaaec98fd19e68c6fcdcb5ab43 Mon Sep 17 00:00:00 2001 From: mabashian Date: Wed, 8 May 2019 10:05:02 -0400 Subject: [PATCH 2/3] Adds missing semicolon --- awx/ui/client/src/shared/smart-search/queryset.service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/awx/ui/client/src/shared/smart-search/queryset.service.js b/awx/ui/client/src/shared/smart-search/queryset.service.js index df143f0580..216045eee3 100644 --- a/awx/ui/client/src/shared/smart-search/queryset.service.js +++ b/awx/ui/client/src/shared/smart-search/queryset.service.js @@ -417,7 +417,7 @@ function QuerysetService ($q, Rest, ProcessErrors, $rootScope, Wait, DjangoSearc if (termParts.length === 1) { if (singleSearchParam && termParts[0].toLowerCase() === "or") { - termParams = { [singleSearchParam]: "or" } + termParams = { [singleSearchParam]: "or" }; } else { termParams = searchWithoutKey(term, singleSearchParam); } From e1de0a528df5ef723d5f20a17ad3bdb1a8cb3bd9 Mon Sep 17 00:00:00 2001 From: mabashian Date: Wed, 8 May 2019 14:59:04 -0400 Subject: [PATCH 3/3] Adds some test coverage for host_filter queries --- .../test/spec/smart-search/queryset.service-test.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/awx/ui/test/spec/smart-search/queryset.service-test.js b/awx/ui/test/spec/smart-search/queryset.service-test.js index eb8563c37d..a2771f9344 100644 --- a/awx/ui/test/spec/smart-search/queryset.service-test.js +++ b/awx/ui/test/spec/smart-search/queryset.service-test.js @@ -63,11 +63,22 @@ describe('Service: QuerySet', () => { spyOn(QuerySet, 'encodeParam').and.callThrough(); const term = 'name:foo'; - const isFilterableBaseField = () => true; + const isFilterableBaseField = (termParts) => termParts[0] === 'name'; const isRelatedField = () => false; expect(QuerySet.getSearchInputQueryset(term, isFilterableBaseField, isRelatedField)).toEqual({ name__icontains_DEFAULT: 'foo' }); expect(QuerySet.encodeParam).toHaveBeenCalledWith({ term: "name:foo", searchTerm: true, singleSearchParam: null }); + expect(QuerySet.getSearchInputQueryset('foo', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'search=foo' }); + expect(QuerySet.getSearchInputQueryset('foo bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'search=foo%20and%20search=bar' }); + expect(QuerySet.getSearchInputQueryset('foo or bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'search=foo%20or%20search=bar' }); + expect(QuerySet.getSearchInputQueryset('name:foo or bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'name__icontains=foo%20or%20search=bar' }); + expect(QuerySet.getSearchInputQueryset('name:foo bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'name__icontains=foo%20and%20search=bar' }); + expect(QuerySet.getSearchInputQueryset('foo or name:bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'search=foo%20or%20name__icontains=bar' }); + expect(QuerySet.getSearchInputQueryset('foo name:bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'search=foo%20and%20name__icontains=bar' }); + expect(QuerySet.getSearchInputQueryset('name:foo or name:bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'name__icontains=foo%20or%20name__icontains=bar' }); + expect(QuerySet.getSearchInputQueryset('name:foo name:bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'name__icontains=foo%20and%20name__icontains=bar' }); + expect(QuerySet.getSearchInputQueryset('name:foo name:bar or baz', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'name__icontains=foo%20and%20name__icontains=bar%20or%20search=baz' }); + expect(QuerySet.getSearchInputQueryset('baz or name:foo name:bar', isFilterableBaseField, null, null, 'host_filter')).toEqual({ host_filter: 'search=baz%20or%20name__icontains=foo%20and%20name__icontains=bar' }); }); });