From 71dca957492db42fddd0b22802d2bb9357db7c1f Mon Sep 17 00:00:00 2001 From: Suzana Dirla Date: Mon, 25 Feb 2019 21:49:36 +0200 Subject: [PATCH] [ADF-4083] search facetIntervals - empty spaced labels support (#4327) * [ADF-4083] fix space-label issue for intervals * [ADF-4083] remove mention to [SEARCH-1487] issue - for future reference, also check https://issues.alfresco.com/jira/browse/ADF-4144 * [ADF-4083] add missing types * [ADF-4083] refactor method * [ADF-4083] fix test * [ADF-4083] small refactoring * [ADF-4083] better param naming * [ADF-4083] changes after rebase - keep better param naming * [ADF-4083] fix space-label issue for the sets of intervals * [ADF-4083] update test --- demo-shell/src/app.config.json | 2 +- e2e/pages/adf/searchFiltersPage.ts | 2 +- .../search-filter/search-filter.component.ts | 30 ++++++++-- .../search/facet-field.interface.ts | 1 + .../search/search-configuration.interface.ts | 18 +++--- .../search-query-builder.service.spec.ts | 58 ++++++++++++++++++- .../search/search-query-builder.service.ts | 10 +++- 7 files changed, 101 insertions(+), 20 deletions(-) diff --git a/demo-shell/src/app.config.json b/demo-shell/src/app.config.json index 600f4e6ebc..e2d2501839 100644 --- a/demo-shell/src/app.config.json +++ b/demo-shell/src/app.config.json @@ -136,7 +136,7 @@ "expanded": true, "intervals":[ { - "label":"TheCreated", + "label":"The Created", "field":"cm:created", "sets":[ { "label":"lastYear", "start":"2018", "end":"2019", "endInclusive":false }, diff --git a/e2e/pages/adf/searchFiltersPage.ts b/e2e/pages/adf/searchFiltersPage.ts index bb4ac547d7..ea816d45fe 100644 --- a/e2e/pages/adf/searchFiltersPage.ts +++ b/e2e/pages/adf/searchFiltersPage.ts @@ -37,7 +37,7 @@ export class SearchFiltersPage { 'mat-expansion-panel[data-automation-id="expansion-panel-My facet queries"]')); facetQueriesTypeGroup = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Type facet queries"]')); facetQueriesSizeGroup = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Size facet queries"]')); - facetIntervalsByCreated = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-TheCreated"]')); + facetIntervalsByCreated = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-The Created"]')); facetIntervalsByModified = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-TheModified"]')); checkSearchFiltersIsDisplayed() { diff --git a/lib/content-services/search/components/search-filter/search-filter.component.ts b/lib/content-services/search/components/search-filter/search-filter.component.ts index 57010bb9a2..58ea6042db 100644 --- a/lib/content-services/search/components/search-filter/search-filter.component.ts +++ b/lib/content-services/search/components/search-filter/search-filter.component.ts @@ -189,7 +189,7 @@ export class SearchFilterComponent implements OnInit, OnDestroy { } } - private parseFacetItems(context: ResultSetContext, configFacetFields, itemType): FacetField[] { + private parseFacetItems(context: ResultSetContext, configFacetFields: FacetField[], itemType: string): FacetField[] { return configFacetFields.map((field) => { const responseField = (context.facets || []).find((response) => response.type === itemType && response.label === field.label) || {}; const responseBuckets = this.getResponseBuckets(responseField, field) @@ -315,9 +315,31 @@ export class SearchFilterComponent implements OnInit, OnDestroy { } private getCorrespondingFilterQuery (configFacetItem: FacetField, bucketLabel: string): string { - if (!configFacetItem.field || !bucketLabel) { - return null; + let filterQuery = null; + + if (configFacetItem.field && bucketLabel) { + + if (configFacetItem.sets) { + const configSet = configFacetItem.sets.find((set) => bucketLabel === set.label); + + if (configSet) { + filterQuery = this.buildIntervalQuery(configFacetItem.field, configSet); + } + + } else { + filterQuery = `${configFacetItem.field}:"${bucketLabel}"`; + } } - return `${configFacetItem.field}:"${bucketLabel}"`; + + return filterQuery; + } + + private buildIntervalQuery(fieldName: string, interval: any): string { + const start = interval.start; + const end = interval.end; + const startLimit = (interval.startInclusive === undefined || interval.startInclusive === true) ? '[' : '<'; + const endLimit = (interval.endInclusive === undefined || interval.endInclusive === true) ? ']' : '>'; + + return `${fieldName}:${startLimit}"${start}" TO "${end}"${endLimit}`; } } diff --git a/lib/content-services/search/facet-field.interface.ts b/lib/content-services/search/facet-field.interface.ts index 05a3096ead..22d6f78742 100644 --- a/lib/content-services/search/facet-field.interface.ts +++ b/lib/content-services/search/facet-field.interface.ts @@ -31,4 +31,5 @@ export interface FacetField { currentPageSize?: number; checked?: boolean; type?: string; + [propName: string]: any; } diff --git a/lib/content-services/search/search-configuration.interface.ts b/lib/content-services/search/search-configuration.interface.ts index 598883db78..bd2e249276 100644 --- a/lib/content-services/search/search-configuration.interface.ts +++ b/lib/content-services/search/search-configuration.interface.ts @@ -22,28 +22,28 @@ import { SearchCategory } from './search-category.interface'; import { SearchSortingDefinition } from './search-sorting-definition.interface'; export interface SearchConfiguration { - include?: Array; - fields?: Array; - categories: Array; - filterQueries?: Array; + include?: string[]; + fields?: string[]; + categories: SearchCategory[]; + filterQueries?: FilterQuery[]; filterWithContains?: boolean; facetQueries?: { label?: string; pageSize?: number; expanded?: boolean; mincount?: number; - queries: Array; + queries: FacetQuery[]; }; facetFields?: { expanded?: boolean; - fields: Array; + fields: FacetField[]; }; facetIntervals?: { expanded?: boolean; - intervals: Array; + intervals: FacetField[]; }; sorting?: { - options: Array; - defaults: Array; + options: SearchSortingDefinition[]; + defaults: SearchSortingDefinition[]; }; } 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 96c97f916a..a223da55ca 100644 --- a/lib/content-services/search/search-query-builder.service.spec.ts +++ b/lib/content-services/search/search-query-builder.service.spec.ts @@ -425,13 +425,59 @@ describe('SearchQueryBuilder', () => { label: 'test_intervals1', field: 'f1', sets: [ - { label: 'interval1', start: 's1', end: 'e1' }, - { label: 'interval2', start: 's2', end: 'e2' } + { label: 'interval1', start: 's1', end: 'e1', startInclusive: true, endInclusive: true }, + { label: 'interval2', start: 's2', end: 'e2', startInclusive: false, endInclusive: true } ] }, { label: 'test_intervals2', field: 'f2', + sets: [ + { label: 'interval3', start: 's3', end: 'e3', startInclusive: true, endInclusive: false }, + { label: 'interval4', start: 's4', end: 'e4', startInclusive: false, endInclusive: false } + ] + } + ] + } + }; + const builder = new SearchQueryBuilderService(buildConfig(config), null); + builder.queryFragments['cat1'] = 'cm:name:test'; + + const compiled = builder.buildQuery(); + expect(compiled.facetIntervals).toEqual(jasmine.objectContaining(config.facetIntervals)); + }); + + it('should build query with custom facet intervals automatically getting their request compatible labels', () => { + const spacesLabel = { + configValue: 'label with spaces', + requestCompatibleValue: '"label with spaces"' + }; + const noSpacesLabel = { + configValue: 'label', + requestCompatibleValue: 'label' + }; + const spacesLabelForSet = { + configValue: 'label for set', + requestCompatibleValue: '"label for set"' + }; + + const config: SearchConfiguration = { + categories: [ + { id: 'cat1', enabled: true } + ], + facetIntervals: { + intervals: [ + { + label: spacesLabel.configValue, + field: 'f1', + sets: [ + { label: spacesLabelForSet.configValue, start: 's1', end: 'e1' }, + { label: 'interval2', start: 's2', end: 'e2' } + ] + }, + { + label: noSpacesLabel.configValue, + field: 'f2', sets: [ { label: 'interval3', start: 's3', end: 'e3' }, { label: 'interval4', start: 's4', end: 'e4' } @@ -444,7 +490,13 @@ describe('SearchQueryBuilder', () => { builder.queryFragments['cat1'] = 'cm:name:test'; const compiled = builder.buildQuery(); - expect(compiled.facetIntervals).toEqual(jasmine.objectContaining(config.facetIntervals)); + expect(compiled.facetIntervals.intervals[0].label).toEqual(spacesLabel.requestCompatibleValue); + expect(compiled.facetIntervals.intervals[0].label).not.toEqual(spacesLabel.configValue); + expect(compiled.facetIntervals.intervals[1].label).toEqual(noSpacesLabel.requestCompatibleValue); + expect(compiled.facetIntervals.intervals[1].label).toEqual(noSpacesLabel.configValue); + + expect(compiled.facetIntervals.intervals[0].sets[0].label).toEqual(spacesLabelForSet.requestCompatibleValue); + }); it('should build query with sorting', () => { diff --git a/lib/content-services/search/search-query-builder.service.ts b/lib/content-services/search/search-query-builder.service.ts index 3385632d4a..65850d4cba 100644 --- a/lib/content-services/search/search-query-builder.service.ts +++ b/lib/content-services/search/search-query-builder.service.ts @@ -323,9 +323,15 @@ export class SearchQueryBuilderService { return { intervals: configIntervals.intervals.map((interval) => { - label: interval.label, + label: this.getSupportedLabel(interval.label), field: interval.field, - sets: interval.sets + sets: interval.sets.map((set) => { + label: this.getSupportedLabel(set.label), + start: set.start, + end: set.end, + startInclusive: set.startInclusive, + endInclusive: set.endInclusive + }) }) }; }