search filter now remembers original user query (#3384)

This commit is contained in:
Denys Vuika 2018-05-23 19:06:49 +01:00 committed by Eugenio Romano
parent ecd7c85de5
commit 44a39b76a5
3 changed files with 73 additions and 16 deletions

View File

@ -19,7 +19,7 @@ import { Component, OnInit, Optional, ViewChild } from '@angular/core';
import { Router, ActivatedRoute, Params } from '@angular/router'; import { Router, ActivatedRoute, Params } from '@angular/router';
import { NodePaging, Pagination } from 'alfresco-js-api'; import { NodePaging, Pagination } from 'alfresco-js-api';
import { SearchComponent, SearchQueryBuilderService } from '@alfresco/adf-content-services'; import { SearchComponent, SearchQueryBuilderService } from '@alfresco/adf-content-services';
import { UserPreferencesService, SearchService } from '@alfresco/adf-core'; import { UserPreferencesService, SearchService, SearchConfigurationService } from '@alfresco/adf-core';
@Component({ @Component({
selector: 'app-search-result-component', selector: 'app-search-result-component',
@ -44,6 +44,7 @@ export class SearchResultComponent implements OnInit {
constructor(public router: Router, constructor(public router: Router,
private preferences: UserPreferencesService, private preferences: UserPreferencesService,
private queryBuilder: SearchQueryBuilderService, private queryBuilder: SearchQueryBuilderService,
private searchConfiguration: SearchConfigurationService,
@Optional() private route: ActivatedRoute) { @Optional() private route: ActivatedRoute) {
this.maxItems = this.preferences.paginationSize; this.maxItems = this.preferences.paginationSize;
queryBuilder.paging = { queryBuilder.paging = {
@ -63,8 +64,12 @@ export class SearchResultComponent implements OnInit {
if (this.route) { if (this.route) {
this.route.params.forEach((params: Params) => { this.route.params.forEach((params: Params) => {
this.searchedWord = params.hasOwnProperty(this.queryParamName) ? params[this.queryParamName] : null; this.searchedWord = params.hasOwnProperty(this.queryParamName) ? params[this.queryParamName] : null;
this.queryBuilder.queryFragments['queryName'] = `cm:name:'${this.searchedWord}'`; if (this.searchedWord) {
this.queryBuilder.update(); const queryBody = this.searchConfiguration.generateQueryBody(this.searchedWord, 0, 100);
this.queryBuilder.userQuery = queryBody.query.query;
this.queryBuilder.update();
}
}); });
} }
} }

View File

@ -27,6 +27,23 @@ describe('SearchQueryBuilder', () => {
return config; 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', () => { it('should use only enabled categories', () => {
const config: SearchConfiguration = { const config: SearchConfiguration = {
categories: [ categories: [
@ -363,4 +380,19 @@ describe('SearchQueryBuilder', () => {
}); });
}); });
it('should build final request with user and custom queries', () => {
const config: SearchConfiguration = {
categories: [
<any> { 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)');
});
}); });

View File

@ -30,6 +30,8 @@ import { FacetField } from './facet-field.interface';
@Injectable() @Injectable()
export class SearchQueryBuilderService { export class SearchQueryBuilderService {
private _userQuery = '';
updated: Subject<QueryBody> = new Subject(); updated: Subject<QueryBody> = new Subject();
executed: Subject<any> = new Subject(); executed: Subject<any> = new Subject();
@ -39,12 +41,21 @@ export class SearchQueryBuilderService {
paging: { maxItems?: number; skipCount?: number } = null; paging: { maxItems?: number; skipCount?: number } = null;
sorting: Array<SearchSortingDefinition> = []; sorting: Array<SearchSortingDefinition> = [];
get userQuery(): string {
return this._userQuery;
}
set userQuery(value: string) {
value = (value || '').trim();
this._userQuery = value ? `(${value})` : '';
}
config: SearchConfiguration; config: SearchConfiguration;
// TODO: to be supported in future iterations // TODO: to be supported in future iterations
ranges: { [id: string]: SearchRange } = {}; ranges: { [id: string]: SearchRange } = {};
constructor(appConfig: AppConfigService, private alfrescoApiService: AlfrescoApiService) { constructor(appConfig: AppConfigService, private alfrescoApiService: AlfrescoApiService) {
this.config = appConfig.get<SearchConfiguration>('search'); this.config = appConfig.get<SearchConfiguration>('search');
if (this.config) { if (this.config) {
@ -100,17 +111,7 @@ export class SearchQueryBuilderService {
} }
buildQuery(): QueryBody { buildQuery(): QueryBody {
let query = ''; let query = this.getFinalQuery();
this.categories.forEach(facet => {
const customQuery = this.queryFragments[facet.id];
if (customQuery) {
if (query.length > 0) {
query += ' AND ';
}
query += `(${customQuery})`;
}
});
const include = this.config.include || []; const include = this.config.include || [];
if (include.length === 0) { if (include.length === 0) {
@ -118,7 +119,6 @@ export class SearchQueryBuilderService {
} }
if (query) { if (query) {
const result: QueryBody = { const result: QueryBody = {
query: { query: {
query: query, query: query,
@ -179,6 +179,26 @@ export class SearchQueryBuilderService {
return null; 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 { private get facetFields(): RequestFacetFields {
const facetFields = this.config.facetFields; const facetFields = this.config.facetFields;