From 44a39b76a51c4ecef5ccdc8775efbf7c5fc38d12 Mon Sep 17 00:00:00 2001 From: Denys Vuika Date: Wed, 23 May 2018 19:06:49 +0100 Subject: [PATCH] search filter now remembers original user query (#3384) --- .../search/search-result.component.ts | 11 +++-- .../search-query-builder.service.spec.ts | 32 +++++++++++++ .../search/search-query-builder.service.ts | 46 +++++++++++++------ 3 files changed, 73 insertions(+), 16 deletions(-) diff --git a/demo-shell/src/app/components/search/search-result.component.ts b/demo-shell/src/app/components/search/search-result.component.ts index 51c58fd5c8..5b13f5696a 100644 --- a/demo-shell/src/app/components/search/search-result.component.ts +++ b/demo-shell/src/app/components/search/search-result.component.ts @@ -19,7 +19,7 @@ import { Component, OnInit, Optional, ViewChild } from '@angular/core'; import { Router, ActivatedRoute, Params } from '@angular/router'; import { NodePaging, Pagination } from 'alfresco-js-api'; import { SearchComponent, SearchQueryBuilderService } from '@alfresco/adf-content-services'; -import { UserPreferencesService, SearchService } from '@alfresco/adf-core'; +import { UserPreferencesService, SearchService, SearchConfigurationService } from '@alfresco/adf-core'; @Component({ selector: 'app-search-result-component', @@ -44,6 +44,7 @@ export class SearchResultComponent implements OnInit { constructor(public router: Router, private preferences: UserPreferencesService, private queryBuilder: SearchQueryBuilderService, + private searchConfiguration: SearchConfigurationService, @Optional() private route: ActivatedRoute) { this.maxItems = this.preferences.paginationSize; queryBuilder.paging = { @@ -63,8 +64,12 @@ export class SearchResultComponent implements OnInit { if (this.route) { this.route.params.forEach((params: Params) => { this.searchedWord = params.hasOwnProperty(this.queryParamName) ? params[this.queryParamName] : null; - this.queryBuilder.queryFragments['queryName'] = `cm:name:'${this.searchedWord}'`; - this.queryBuilder.update(); + if (this.searchedWord) { + const queryBody = this.searchConfiguration.generateQueryBody(this.searchedWord, 0, 100); + + this.queryBuilder.userQuery = queryBody.query.query; + this.queryBuilder.update(); + } }); } } diff --git a/lib/content-services/search/search-query-builder.service.spec.ts b/lib/content-services/search/search-query-builder.service.spec.ts index 155a332542..5ad22cd08b 100644 --- a/lib/content-services/search/search-query-builder.service.spec.ts +++ b/lib/content-services/search/search-query-builder.service.spec.ts @@ -27,6 +27,23 @@ describe('SearchQueryBuilder', () => { return config; }; + it('should have empty user query by default', () => { + const builder = new SearchQueryBuilderService(buildConfig({}), null); + expect(builder.userQuery).toBe(''); + }); + + it('should wrap user query with brackets', () => { + const builder = new SearchQueryBuilderService(buildConfig({}), null); + builder.userQuery = 'my query'; + expect(builder.userQuery).toEqual('(my query)'); + }); + + it('should trim user query value', () => { + const builder = new SearchQueryBuilderService(buildConfig({}), null); + builder.userQuery = ' something '; + expect(builder.userQuery).toEqual('(something)'); + }); + it('should use only enabled categories', () => { const config: SearchConfiguration = { categories: [ @@ -363,4 +380,19 @@ describe('SearchQueryBuilder', () => { }); }); + it('should build final request with user and custom queries', () => { + const config: SearchConfiguration = { + categories: [ + { id: 'cat1', enabled: true } + ] + }; + const builder = new SearchQueryBuilderService(buildConfig(config), null); + builder.userQuery = 'my query'; + + builder.queryFragments['cat1'] = 'cm:name:test'; + + const compiled = builder.buildQuery(); + expect(compiled.query.query).toBe('(my query) AND (cm:name:test)'); + }); + }); diff --git a/lib/content-services/search/search-query-builder.service.ts b/lib/content-services/search/search-query-builder.service.ts index 49a9f9bfd0..9fb59cc2ce 100644 --- a/lib/content-services/search/search-query-builder.service.ts +++ b/lib/content-services/search/search-query-builder.service.ts @@ -30,6 +30,8 @@ import { FacetField } from './facet-field.interface'; @Injectable() export class SearchQueryBuilderService { + private _userQuery = ''; + updated: Subject = new Subject(); executed: Subject = new Subject(); @@ -39,12 +41,21 @@ export class SearchQueryBuilderService { paging: { maxItems?: number; skipCount?: number } = null; sorting: Array = []; + get userQuery(): string { + return this._userQuery; + } + + set userQuery(value: string) { + value = (value || '').trim(); + this._userQuery = value ? `(${value})` : ''; + } + config: SearchConfiguration; // TODO: to be supported in future iterations ranges: { [id: string]: SearchRange } = {}; - constructor(appConfig: AppConfigService, private alfrescoApiService: AlfrescoApiService) { + constructor(appConfig: AppConfigService, private alfrescoApiService: AlfrescoApiService) { this.config = appConfig.get('search'); if (this.config) { @@ -100,17 +111,7 @@ export class SearchQueryBuilderService { } buildQuery(): QueryBody { - let query = ''; - - this.categories.forEach(facet => { - const customQuery = this.queryFragments[facet.id]; - if (customQuery) { - if (query.length > 0) { - query += ' AND '; - } - query += `(${customQuery})`; - } - }); + let query = this.getFinalQuery(); const include = this.config.include || []; if (include.length === 0) { @@ -118,7 +119,6 @@ export class SearchQueryBuilderService { } if (query) { - const result: QueryBody = { query: { query: query, @@ -179,6 +179,26 @@ export class SearchQueryBuilderService { return null; } + private getFinalQuery(): string { + let query = ''; + + this.categories.forEach(facet => { + const customQuery = this.queryFragments[facet.id]; + if (customQuery) { + if (query.length > 0) { + query += ' AND '; + } + query += `(${customQuery})`; + } + }); + + const result = [this.userQuery, query] + .filter(entry => entry) + .join(' AND '); + + return result; + } + private get facetFields(): RequestFacetFields { const facetFields = this.config.facetFields;