From bf718d905f8db51c8f99862f502d7e8dc1feaf1b Mon Sep 17 00:00:00 2001 From: Suzana Dirla Date: Mon, 4 Feb 2019 23:38:21 +0200 Subject: [PATCH] [ADF-3496] Grouped facet queries (#4209) * [ADF-3496] search query format v2 response parser - replacer for the parseFacetFields * [ADF-3496] format v2 search facetQueries parser * [ADF-3496] cleanup * [ADF-3496] Grouped facet queries - selection working - needs code cleanup * [ADF-3496] code cleanup * [ADF-3496] code refactoring - renaming * [ADF-3496] update tests * [ADF-3496] update tests part2 * [ADF-3496] preserve order * [ADF-3496] fix facet queries expand * [ADF-3496] code cleanup & fixes * [ADF-3496] reorder methods * [ADF-3496] update test * fix unrelated failing test * [ADF-3496] fix config snippet * [ADF-3496] facet queries mincount * [ADF-3496] documentation updated * [ADF-3496] small fix * [ADF-3496] e2e testing * [ADF-3496] added TestRail ids * [ADF-3496] import from right api --- demo-shell/resources/i18n/en.json | 2 +- demo-shell/src/app.config.json | 16 +- .../search-filter.component.md | 38 ++- .../search-query-builder.service.md | 7 +- .../images/search-facet-queries-groups.png | Bin 0 -> 48189 bytes .../docassets/images/search-facet-queries.png | Bin 43172 -> 38695 bytes e2e/pages/adf/searchFiltersPage.ts | 27 ++ e2e/search/search-filters.e2e.ts | 39 ++- e2e/search/search.config.ts | 2 +- .../search-chip-list.component.html | 9 - .../search-chip-list.component.spec.ts | 12 +- .../search-filter.component.html | 63 +---- .../search-filter.component.spec.ts | 231 ++++++++-------- .../search-filter/search-filter.component.ts | 248 ++++++++---------- .../search/facet-field.interface.ts | 1 + .../search/facet-query.interface.ts | 1 + .../search/search-configuration.interface.ts | 1 + .../search-query-builder.service.spec.ts | 2 +- .../search/search-query-builder.service.ts | 43 +-- lib/core/app-config/schema.json | 14 +- 20 files changed, 377 insertions(+), 379 deletions(-) create mode 100644 docs/docassets/images/search-facet-queries-groups.png diff --git a/demo-shell/resources/i18n/en.json b/demo-shell/resources/i18n/en.json index 1a5960260f..0aace31066 100644 --- a/demo-shell/resources/i18n/en.json +++ b/demo-shell/resources/i18n/en.json @@ -228,7 +228,7 @@ "FACET_QUERIES": { "MY_FACET_QUERIES": "My facet queries", "CREATED_THIS_YEAR": "1.Created This Year", - "MIMETYPE": "2.Type", + "MIMETYPE": "2.Type: HTML", "XTRASMALL": "3.Size: xtra small", "SMALL": "4.Size: small", "MEDIUM": "5.Size: medium", diff --git a/demo-shell/src/app.config.json b/demo-shell/src/app.config.json index 07d9ada057..666c6448c8 100644 --- a/demo-shell/src/app.config.json +++ b/demo-shell/src/app.config.json @@ -119,15 +119,17 @@ "facetQueries": { "label": "SEARCH.FACET_QUERIES.MY_FACET_QUERIES", "pageSize": 5, + "expanded": true, + "mincount": 1, "queries": [ { "query": "created:2018", "label": "SEARCH.FACET_QUERIES.CREATED_THIS_YEAR" }, - { "query": "content.mimetype", "label": "SEARCH.FACET_QUERIES.MIMETYPE" }, - { "query": "content.size:[0 TO 10240]", "label": "SEARCH.FACET_QUERIES.XTRASMALL"}, - { "query": "content.size:[10240 TO 102400]", "label": "SEARCH.FACET_QUERIES.SMALL"}, - { "query": "content.size:[102400 TO 1048576]", "label": "SEARCH.FACET_QUERIES.MEDIUM" }, - { "query": "content.size:[1048576 TO 16777216]", "label": "SEARCH.FACET_QUERIES.LARGE" }, - { "query": "content.size:[16777216 TO 134217728]", "label": "SEARCH.FACET_QUERIES.XTRALARGE" }, - { "query": "content.size:[134217728 TO MAX]", "label": "SEARCH.FACET_QUERIES.XXTRALARGE" } + { "query": "content.mimetype:text/html", "label": "SEARCH.FACET_QUERIES.MIMETYPE", "group":"Type facet queries" }, + { "query": "content.size:[0 TO 10240]", "label": "SEARCH.FACET_QUERIES.XTRASMALL", "group":"Size facet queries"}, + { "query": "content.size:[10240 TO 102400]", "label": "SEARCH.FACET_QUERIES.SMALL", "group":"Size facet queries"}, + { "query": "content.size:[102400 TO 1048576]", "label": "SEARCH.FACET_QUERIES.MEDIUM", "group":"Size facet queries" }, + { "query": "content.size:[1048576 TO 16777216]", "label": "SEARCH.FACET_QUERIES.LARGE", "group":"Size facet queries" }, + { "query": "content.size:[16777216 TO 134217728]", "label": "SEARCH.FACET_QUERIES.XTRALARGE", "group":"Size facet queries" }, + { "query": "content.size:[134217728 TO MAX]", "label": "SEARCH.FACET_QUERIES.XXTRALARGE", "group":"Size facet queries" } ] }, "categories": [ diff --git a/docs/content-services/search-filter.component.md b/docs/content-services/search-filter.component.md index 4f0d3457f8..2fe05f716e 100644 --- a/docs/content-services/search-filter.component.md +++ b/docs/content-services/search-filter.component.md @@ -76,7 +76,7 @@ A typical configuration is shown below: "pageSize": 4, "queries": [ { "query": "created:2018", "label": "Created This Year" }, - { "query": "content.mimetype", "label": "Type" }, + { "query": "content.mimetype:text/html", "label": "Type: HTML" }, { "query": "content.size:[0 TO 10240]", "label": "Size: xtra small"}, { "query": "content.size:[10240 TO 102400]", "label": "Size: small"}, { "query": "content.size:[102400 TO 1048576]", "label": "Size: medium" }, @@ -298,7 +298,7 @@ These provide custom categories based on admin-defined facet queries. "expanded": true, "queries": [ { "query": "created:2018", "label": "Created This Year" }, - { "query": "content.mimetype", "label": "Type" }, + { "query": "content.mimetype:text/html", "label": "Type: HTML" }, { "query": "content.size:[0 TO 10240]", "label": "Size: xtra small"}, { "query": "content.size:[10240 TO 102400]", "label": "Size: small"}, { "query": "content.size:[102400 TO 1048576]", "label": "Size: medium" }, @@ -311,12 +311,40 @@ These provide custom categories based on admin-defined facet queries. } ``` -The queries declared in the `facetQueries` are collected into a single collapsible category. -Only the queries that have 1 or more response entries are displayed at runtime. +By default, the queries declared in the `facetQueries` are collected into a single collapsible category. +The `mincount` property allows setting the minimum count required for a facet field to be displayed. By default, only the queries that have 1 or more response entries are displayed at runtime. The component provides a `Show more` button to display more items if the number of items exceeds the `pageSize` value. -You can also provide a custom `label` (or i18n resource key) for the resulting collapsible category. +You can also provide a custom `label` (or i18n resource key) for the default resulting collapsible category. +If you need to display more resulting collapsible categories, you can group different facet queries under custom labels by using the `group` property on those facet queries: +```json +{ + "search": { + "facetQueries": { + "label": "Facet queries", + "pageSize": 5, + "expanded": true, + "mincount": 0, + "queries": [ + { "query": "created:2018", "label": "Created This Year" }, + { "query": "modifier:admin", "label": "Admin modifier" }, + { "query": "content.mimetype:text/html", "label": "Type: HTML", "group":"Type facet queries" }, + { "query": "content.mimetype:image/png", "label": "Type: PNG", "group":"Type facet queries" }, + { "query": "content.size:[0 TO 10240]", "label": "Size: xtra small", "group":"Size facet queries"}, + { "query": "content.size:[10240 TO 102400]", "label": "Size: small", "group":"Size facet queries"}, + { "query": "content.size:[102400 TO 1048576]", "label": "Size: medium", "group":"Size facet queries" }, + { "query": "content.size:[1048576 TO 16777216]", "label": "Size: large", "group":"Size facet queries" }, + { "query": "content.size:[16777216 TO 134217728]", "label": "Size: xtra large", "group":"Size facet queries" }, + { "query": "content.size:[134217728 TO MAX]", "label": "Size: XX large", "group":"Size facet queries" } + ] + } + } +} +``` +This will result in the following display of the grouped facet queries: + +![Grouped Facet Queries](../docassets/images/search-facet-queries-groups.png) The `pageSize` property allows you to define the number of results to display. Users will see `Show more` or `Show less` buttons as appropriate for the result set. diff --git a/docs/content-services/search-query-builder.service.md b/docs/content-services/search-query-builder.service.md index d8a949033c..720663eb7a 100644 --- a/docs/content-services/search-query-builder.service.md +++ b/docs/content-services/search-query-builder.service.md @@ -20,9 +20,6 @@ Stores information from all the custom search and faceted search widgets, compil Adds a facet bucket to a field. - _field:_ [`FacetField`](../../content-services/search/facet-field.interface.ts) - The target field - _bucket:_ [`FacetFieldBucket`](../../content-services/search/facet-field-bucket.interface.ts) - Bucket to add -- **addUserFacetQuery**(query: [`FacetQuery`](../../content-services/search/facet-query.interface.ts))
- Adds a facet query. - - _query:_ [`FacetQuery`](../../content-services/search/facet-query.interface.ts) - Query to add - **buildQuery**(): `QueryBody`
Builds the current query. - **Returns** `QueryBody` - The finished query @@ -53,9 +50,6 @@ Stores information from all the custom search and faceted search widgets, compil Removes an existing bucket from a field. - _field:_ [`FacetField`](../../content-services/search/facet-field.interface.ts) - The target field - _bucket:_ [`FacetFieldBucket`](../../content-services/search/facet-field-bucket.interface.ts) - Bucket to remove -- **removeUserFacetQuery**(query: [`FacetQuery`](../../content-services/search/facet-query.interface.ts))
- Removes an existing facet query. - - _query:_ [`FacetQuery`](../../content-services/search/facet-query.interface.ts) - Query to remove - **resetToDefaults**()
Resets the query to the defaults specified in the app config. - **update**()
@@ -92,6 +86,7 @@ constructor(queryBuilder: SearchQueryBuilderService) { } ``` +> **Note:** Since ADF 3.0.0, the query contains the `"facetFormat": "V2"` parameter so that all the responses have the same structure even if coming from search queries containing facetFields, facetQueries, grouped facetQueries or facetIntervals. ## See also diff --git a/docs/docassets/images/search-facet-queries-groups.png b/docs/docassets/images/search-facet-queries-groups.png new file mode 100644 index 0000000000000000000000000000000000000000..385bf1488f1aed107df36a557643b10a9861f44f GIT binary patch literal 48189 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 Ao&W#< diff --git a/e2e/pages/adf/searchFiltersPage.ts b/e2e/pages/adf/searchFiltersPage.ts index 947bee0b8e..44d9fb3242 100644 --- a/e2e/pages/adf/searchFiltersPage.ts +++ b/e2e/pages/adf/searchFiltersPage.ts @@ -33,6 +33,10 @@ export class SearchFiltersPage { typeFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Type"]')); sizeRangeFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Content Size (range)"]')); sizeSliderFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Content Size"]')); + facetQueriesDefaultGroup = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-SEARCH.FACET_QUERIES.MY_FACET_QUERIES"],' + + '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"]')); checkSearchFiltersIsDisplayed() { Util.waitUntilElementIsVisible(this.searchFilters); @@ -91,6 +95,29 @@ export class SearchFiltersPage { return this; } + checkDefaultFacetQueryGroupIsDisplayed() { + this.searchCategoriesPage.checkFilterIsDisplayed(this.facetQueriesDefaultGroup); + return this; + } + + checkTypeFacetQueryGroupIsDisplayed() { + this.searchCategoriesPage.checkFilterIsDisplayed(this.facetQueriesTypeGroup); + return this; + } + + checkSizeFacetQueryGroupIsDisplayed() { + this.searchCategoriesPage.checkFilterIsDisplayed(this.facetQueriesSizeGroup); + return this; + } + + isTypeFacetQueryGroupPresent() { + return this.facetQueriesTypeGroup.isPresent(); + } + + isSizeFacetQueryGroupPresent() { + return this.facetQueriesSizeGroup.isPresent(); + } + clickCheckListFilter() { this.searchCategoriesPage.clickFilter(this.checkListFilter); return this; diff --git a/e2e/search/search-filters.e2e.ts b/e2e/search/search-filters.e2e.ts index 83fbf9ac6c..1d9b5f00b6 100644 --- a/e2e/search/search-filters.e2e.ts +++ b/e2e/search/search-filters.e2e.ts @@ -65,6 +65,8 @@ describe('Search Filters', () => { let filter = { type: 'TYPE-PNG Image' }; + let jsonFile; + beforeAll(async (done) => { this.alfrescoJsApi = new AlfrescoApi({ @@ -88,9 +90,9 @@ describe('Search Filters', () => { searchDialog.checkSearchIconIsVisible(); searchDialog.clickOnSearchIcon(); - searchDialog.enterTextAndPressEnter(fileUploaded.entry.name); - searchFiltersPage.checkSearchFiltersIsDisplayed(); + let searchConfiguration = new SearchConfiguration(); + jsonFile = searchConfiguration.getConfiguration(); done(); }); @@ -105,6 +107,10 @@ describe('Search Filters', () => { }); it('[C286298] Should be able to cancel a filter using "x" button from the toolbar', () => { + searchDialog.enterTextAndPressEnter(fileUploaded.entry.name); + + searchFiltersPage.checkSearchFiltersIsDisplayed(); + let userOption = `${acsUser.firstName} ${acsUser.lastName}`; searchFiltersPage.creatorCheckListFiltersPage().filterBy(userOption) .checkChipIsDisplayed(userOption) @@ -157,8 +163,6 @@ describe('Search Filters', () => { }); it('[C291802] Should be able to filter facet fields with "Contains"', () => { - let searchConfiguration = new SearchConfiguration(); - let jsonFile = searchConfiguration.getConfiguration(); navigationBar.clickConfigEditorButton(); configEditor.clickSearchConfiguration(); configEditor.clickClearButton(); @@ -176,4 +180,31 @@ describe('Search Filters', () => { .checkCheckListOptionIsDisplayed('Administrator'); }); + it('[C291980] Should group search facets under specified labels', () => { + browser.get(TestConfig.adf.url + '/search;q=*'); + + searchFiltersPage.checkDefaultFacetQueryGroupIsDisplayed() + .checkTypeFacetQueryGroupIsDisplayed() + .checkSizeFacetQueryGroupIsDisplayed(); + }); + + it('[C291981] Should group search facets under the default label, by default', () => { + browser.refresh(); + + navigationBar.clickConfigEditorButton(); + configEditor.clickSearchConfiguration(); + configEditor.clickClearButton(); + jsonFile['filterWithContains'] = true; + configEditor.enterBigConfigurationText(JSON.stringify(jsonFile)); + configEditor.clickSaveButton(); + + searchDialog.clickOnSearchIcon() + .enterTextAndPressEnter('*'); + + searchResults.tableIsLoaded(); + + searchFiltersPage.checkDefaultFacetQueryGroupIsDisplayed(); + expect(searchFiltersPage.isTypeFacetQueryGroupPresent()).toBe(false); + expect(searchFiltersPage.isSizeFacetQueryGroupPresent()).toBe(false); + }); }); diff --git a/e2e/search/search.config.ts b/e2e/search/search.config.ts index aeb87fce04..ca06cf90dd 100644 --- a/e2e/search/search.config.ts +++ b/e2e/search/search.config.ts @@ -72,7 +72,7 @@ export class SearchConfiguration { 'pageSize': 5, 'queries': [ {'query': 'created:2018', 'label': '1.Created This Year'}, - {'query': 'content.mimetype', 'label': '2.Type'}, + {'query': 'content.mimetype:text/html', 'label': '2.Type: HTML'}, {'query': 'content.size:[0 TO 10240]', 'label': '3.Size: xtra small'}, {'query': 'content.size:[10240 TO 102400]', 'label': '4.Size: small'}, {'query': 'content.size:[102400 TO 1048576]', 'label': '5.Size: medium'}, diff --git a/lib/content-services/search/components/search-chip-list/search-chip-list.component.html b/lib/content-services/search/components/search-chip-list/search-chip-list.component.html index 9245fc3db0..dd5fa52184 100644 --- a/lib/content-services/search/components/search-chip-list/search-chip-list.component.html +++ b/lib/content-services/search/components/search-chip-list/search-chip-list.component.html @@ -1,13 +1,4 @@ - - - {{ query.label | translate }} - cancel - - { ] }); - xit('should remove items from the search filter', () => { + it('should remove items from the search filter', () => { const fixture = TestBed.createComponent(TestComponent); const component: TestComponent = fixture.componentInstance; - spyOn(component.searchFilter, 'unselectFacetQuery').and.stub(); + spyOn(component.searchFilter, 'unselectFacetBucket').and.stub(); - component.searchFilter.selectedFacetQueries = [{ id: 1 }, { id: 2 }]; + const selectedBucket1 = {field: { id: 1 }, bucket: {label: 'bucket1'}}; + const selectedBucket2 = {field: { id: 2 }, bucket: {label: 'bucket2'}}; + component.searchFilter.selectedBuckets = [selectedBucket1, selectedBucket2]; fixture.detectChanges(); @@ -64,7 +64,7 @@ describe('SearchChipListComponent', () => { closeButtons[0].click(); fixture.detectChanges(); - expect(component.searchFilter.unselectFacetQuery).toHaveBeenCalledWith({ id: 1 }); + expect(component.searchFilter.unselectFacetBucket).toHaveBeenCalledWith(selectedBucket1.field, selectedBucket1.bucket); }); }); diff --git a/lib/content-services/search/components/search-filter/search-filter.component.html b/lib/content-services/search/components/search-filter/search-filter.component.html index 4e43b40342..cb20027fa0 100644 --- a/lib/content-services/search/components/search-filter/search-filter.component.html +++ b/lib/content-services/search/components/search-filter/search-filter.component.html @@ -16,66 +16,9 @@ - - - - {{ facetQueriesLabel | translate }} - -
- - - - -
-
- - -
- {{ query.label | translate }} ({{ query.count }}) -
-
-
-
-
- - - -
-
-
- - - + + {{ field.label | translate }} diff --git a/lib/content-services/search/components/search-filter/search-filter.component.spec.ts b/lib/content-services/search/components/search-filter/search-filter.component.spec.ts index 464083aa32..b64c5b387a 100644 --- a/lib/content-services/search/components/search-filter/search-filter.component.spec.ts +++ b/lib/content-services/search/components/search-filter/search-filter.component.spec.ts @@ -20,10 +20,8 @@ import { SearchQueryBuilderService } from '../../search-query-builder.service'; import { AppConfigService, TranslationMock } from '@alfresco/adf-core'; import { Subject } from 'rxjs'; import { FacetFieldBucket } from '../../facet-field-bucket.interface'; -import { FacetQuery } from '../../facet-query.interface'; import { FacetField } from '../../facet-field.interface'; import { SearchFilterList } from './models/search-filter-list.model'; -import { ResponseFacetQueryList } from './models/response-facet-query-list.model'; describe('SearchFilterComponent', () => { @@ -84,24 +82,26 @@ describe('SearchFilterComponent', () => { it('should unselect facet query and update builder', () => { spyOn(queryBuilder, 'update').and.stub(); - spyOn(queryBuilder, 'removeUserFacetQuery').and.callThrough(); + spyOn(queryBuilder, 'removeUserFacetBucket').and.callThrough(); const event: any = { checked: false }; - const query: FacetQuery = { checked: true, label: 'q1', query: 'query1' }; + const query = { checked: true, label: 'q1', filterQuery: 'query1' }; + const field = { type: 'query', label: 'label1', buckets: [ query ] }; - component.onToggleFacetQuery(event, query); + component.onToggleBucket(event, field, query); expect(query.checked).toBeFalsy(); - expect(queryBuilder.removeUserFacetQuery).toHaveBeenCalledWith(query); + expect(queryBuilder.removeUserFacetBucket).toHaveBeenCalledWith(field, query); expect(queryBuilder.update).toHaveBeenCalled(); }); it('should fetch facet queries from response payload', () => { - component.responseFacetQueries = null; + component.responseFacets = null; queryBuilder.config = { categories: [], facetQueries: { + label: 'label1', queries: [ { label: 'q1', query: 'query1' }, { label: 'q2', query: 'query2' } @@ -110,29 +110,34 @@ describe('SearchFilterComponent', () => { }; const queries = [ - { label: 'q1', query: 'query1', count: 1 }, - { label: 'q2', query: 'query2', count: 1 } + { label: 'q1', filterQuery: 'query1', metrics: [{value: {count: 1}}] }, + { label: 'q2', filterQuery: 'query2', metrics: [{value: {count: 1}}] } ]; const data = { list: { context: { - facetQueries: queries + facets: [{ + type: 'query', + label: 'label1', + buckets: queries + }] } } }; component.onDataLoaded(data); - expect(component.responseFacetQueries.length).toBe(2); - expect(component.responseFacetQueries.items).toEqual(queries); + expect(component.responseFacets.length).toBe(1); + expect(component.responseFacets[0].buckets.length).toEqual(2); }); it('should preserve order after response processing', () => { - component.responseFacetQueries = null; + component.responseFacets = null; queryBuilder.config = { categories: [], facetQueries: { + label: 'label1', queries: [ { label: 'q1', query: 'query1' }, { label: 'q2', query: 'query2' }, @@ -142,29 +147,34 @@ describe('SearchFilterComponent', () => { }; const queries = [ - { label: 'q2', query: 'query2', count: 1 }, - { label: 'q1', query: 'query1', count: 1 }, - { label: 'q3', query: 'query3', count: 1 } + { label: 'q2', filterQuery: 'query2', metrics: [{value: {count: 1}}] }, + { label: 'q1', filterQuery: 'query1', metrics: [{value: {count: 1}}] }, + { label: 'q3', filterQuery: 'query3', metrics: [{value: {count: 1}}] } ]; const data = { list: { context: { - facetQueries: queries + facets: [{ + type: 'query', + label: 'label1', + buckets: queries + }] } } }; component.onDataLoaded(data); - expect(component.responseFacetQueries.length).toBe(3); - expect(component.responseFacetQueries.items[0].label).toBe('q1'); - expect(component.responseFacetQueries.items[1].label).toBe('q2'); - expect(component.responseFacetQueries.items[2].label).toBe('q3'); + expect(component.responseFacets.length).toBe(1); + expect(component.responseFacets[0].buckets.length).toBe(3); + expect(component.responseFacets[0].buckets.items[0].label).toBe('q1'); + expect(component.responseFacets[0].buckets.items[1].label).toBe('q2'); + expect(component.responseFacets[0].buckets.items[2].label).toBe('q3'); }); it('should not fetch facet queries from response payload', () => { - component.responseFacetQueries = null; + component.responseFacets = null; queryBuilder.config = { categories: [], @@ -176,18 +186,18 @@ describe('SearchFilterComponent', () => { const data = { list: { context: { - facetQueries: null + facets: null } } }; component.onDataLoaded(data); - expect(component.responseFacetQueries).toBeNull(); + expect(component.responseFacets.length).toBe(0); }); it('should fetch facet fields from response payload', () => { - component.responseFacetFields = null; + component.responseFacets = null; queryBuilder.config = { categories: [], @@ -201,20 +211,22 @@ describe('SearchFilterComponent', () => { }; const fields: any = [ - { label: 'f1', buckets: [] }, - { label: 'f2', buckets: [] } + { type: 'field', label: 'f1', buckets: [{ label: 'a1' }, { label: 'a2' }] }, + { type: 'field', label: 'f2', buckets: [{ label: 'b1' }, { label: 'b2' }] } ]; const data = { list: { context: { - facetsFields: fields + facets: fields } } }; component.onDataLoaded(data); - expect(component.responseFacetFields.length).toEqual(2); + expect(component.responseFacets.length).toEqual(2); + expect(component.responseFacets[0].buckets.length).toEqual(2); + expect(component.responseFacets[1].buckets.length).toEqual(2); }); it('should filter response facet fields based on search filter config method', () => { @@ -230,10 +242,10 @@ describe('SearchFilterComponent', () => { }; const initialFields: any = [ - { label: 'f1', buckets: [ - { label: 'firstLabel', display: 'firstLabel', count: 5 }, - { label: 'secondLabel', display: 'secondLabel', count: 5 }, - { label: 'thirdLabel', display: 'thirdLabel', count: 5 } + { type: 'field', label: 'f1', buckets: [ + { label: 'firstLabel', display: 'firstLabel', metrics: [{value: {count: 5}}] }, + { label: 'secondLabel', display: 'secondLabel', metrics: [{value: {count: 5}}] }, + { label: 'thirdLabel', display: 'thirdLabel', metrics: [{value: {count: 5}}] } ] } ]; @@ -241,31 +253,32 @@ describe('SearchFilterComponent', () => { const data = { list: { context: { - facetsFields: initialFields + facets: initialFields } } }; component.onDataLoaded(data); - expect(component.responseFacetFields[0].buckets.visibleItems.length).toBe(3); + expect(component.responseFacets.length).toBe(1); + expect(component.responseFacets[0].buckets.visibleItems.length).toBe(3); - component.responseFacetFields[0].buckets.filterText = 'f'; - expect(component.responseFacetFields[0].buckets.visibleItems.length).toBe(1); - expect(component.responseFacetFields[0].buckets.visibleItems[0].label).toEqual('firstLabel'); + component.responseFacets[0].buckets.filterText = 'f'; + expect(component.responseFacets[0].buckets.visibleItems.length).toBe(1); + expect(component.responseFacets[0].buckets.visibleItems[0].label).toEqual('firstLabel'); - component.responseFacetFields[0].buckets.filterText = 'label'; - expect(component.responseFacetFields[0].buckets.visibleItems.length).toBe(0); + component.responseFacets[0].buckets.filterText = 'label'; + expect(component.responseFacets[0].buckets.visibleItems.length).toBe(0); // Set filter method to use contains and test again queryBuilder.config.filterWithContains = true; - component.responseFacetFields[0].buckets.filterText = 'f'; - expect(component.responseFacetFields[0].buckets.visibleItems.length).toBe(1); - component.responseFacetFields[0].buckets.filterText = 'label'; - expect(component.responseFacetFields[0].buckets.visibleItems.length).toBe(3); + component.responseFacets[0].buckets.filterText = 'f'; + expect(component.responseFacets[0].buckets.visibleItems.length).toBe(1); + component.responseFacets[0].buckets.filterText = 'label'; + expect(component.responseFacets[0].buckets.visibleItems.length).toBe(3); }); it('should fetch facet fields from response payload and show the bucket values', () => { - component.responseFacetFields = null; + component.responseFacets = null; queryBuilder.config = { categories: [], @@ -280,26 +293,27 @@ describe('SearchFilterComponent', () => { const serverResponseFields: any = [ { + type: 'field', label: 'f1', buckets: [ - { label: 'b1', count: 10 }, - { label: 'b2', count: 1 } + { label: 'b1', metrics: [{value: {count: 10}}] }, + { label: 'b2', metrics: [{value: {count: 1}}] } ] }, - { label: 'f2', buckets: [] } + { type: 'field', label: 'f2', buckets: [] } ]; const data = { list: { context: { - facetsFields: serverResponseFields + facets: serverResponseFields } } }; component.onDataLoaded(data); - - expect(component.responseFacetFields[0].buckets.items[0].count).toEqual(10); - expect(component.responseFacetFields[0].buckets.items[1].count).toEqual(1); + expect(component.responseFacets.length).toEqual(2); + expect(component.responseFacets[0].buckets.items[0].count).toEqual(10); + expect(component.responseFacets[0].buckets.items[1].count).toEqual(1); }); it('should fetch facet fields from response payload and update the existing bucket values', () => { @@ -315,34 +329,34 @@ describe('SearchFilterComponent', () => { }; const initialFields: any = [ - { label: 'f1', buckets: { items: [{ label: 'b1', count: 10, filterQuery: 'filter' }, { label: 'b2', count: 1 }]} }, - { label: 'f2', buckets: [] } + { type: 'field', label: 'f1', buckets: { items: [{ label: 'b1', count: 10, filterQuery: 'filter' }, { label: 'b2', count: 1 }]} }, + { type: 'field', label: 'f2', buckets: [] } ]; - component.responseFacetFields = initialFields; - - expect(component.responseFacetFields[0].buckets.items[0].count).toEqual(10); - expect(component.responseFacetFields[0].buckets.items[1].count).toEqual(1); + component.responseFacets = initialFields; + expect(component.responseFacets[0].buckets.items[0].count).toEqual(10); + expect(component.responseFacets[0].buckets.items[1].count).toEqual(1); const serverResponseFields: any = [ - { label: 'f1', buckets: [{ label: 'b1', count: 6, filterQuery: 'filter' }, { label: 'b2', count: 0 }] }, - { label: 'f2', buckets: [] } + { type: 'field', label: 'f1', buckets: + [{ label: 'b1', metrics: [{value: {count: 6}}], filterQuery: 'filter' }, + { label: 'b2', metrics: [{value: {count: 0}}] }] }, + { type: 'field', label: 'f2', buckets: [] } ]; const data = { list: { context: { - facetsFields: serverResponseFields + facets: serverResponseFields } } }; component.onDataLoaded(data); - - expect(component.responseFacetFields[0].buckets.items[0].count).toEqual(6); - expect(component.responseFacetFields[0].buckets.items[1].count).toEqual(0); + expect(component.responseFacets[0].buckets.items[0].count).toEqual(6); + expect(component.responseFacets[0].buckets.items[1].count).toEqual(0); }); it('should update correctly the existing facetFields bucket values', () => { - component.responseFacetFields = null; + component.responseFacets = null; queryBuilder.config = { categories: [], @@ -351,20 +365,22 @@ describe('SearchFilterComponent', () => { }; const firstCallFields: any = [{ + type: 'field', label: 'f1', - buckets: [{ label: 'b1', count: 10 }] + buckets: [{ label: 'b1', metrics: [{value: {count: 10}}] }] }]; - const firstCallData = { list: { context: { facetsFields: firstCallFields }}}; + const firstCallData = { list: { context: { facets: firstCallFields }}}; component.onDataLoaded(firstCallData); - expect(component.responseFacetFields[0].buckets.items[0].count).toEqual(10); + expect(component.responseFacets[0].buckets.items[0].count).toEqual(10); const secondCallFields: any = [{ + type: 'field', label: 'f1', - buckets: [{ label: 'b1', count: 6 }] + buckets: [{ label: 'b1', metrics: [{value: {count: 6}}] }] }]; - const secondCallData = { list: { context: { facetsFields: secondCallFields}}}; + const secondCallData = { list: { context: { facets: secondCallFields}}}; component.onDataLoaded(secondCallData); - expect(component.responseFacetFields[0].buckets.items[0].count).toEqual(6); + expect(component.responseFacets[0].buckets.items[0].count).toEqual(6); }); it('should fetch facet fields from response payload and show the already checked items', () => { @@ -380,31 +396,31 @@ describe('SearchFilterComponent', () => { } }; - component.responseFacetFields = [ + component.responseFacets = [ { label: 'f1', field: 'f1', buckets: {items: [ { label: 'b1', count: 10, filterQuery: 'filter', checked: true }, { label: 'b2', count: 1, filterQuery: 'filter2' }] }}, { label: 'f2', field: 'f2', buckets: {items: [] }} ]; - component.queryBuilder.addUserFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacetFields[0].buckets.items[0]); + component.queryBuilder.addUserFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacets[0].buckets.items[0]); const serverResponseFields: any = [ - { label: 'f1', field: 'f1', buckets: [ - { label: 'b1', count: 6, filterQuery: 'filter' }, - { label: 'b2', count: 1, filterQuery: 'filter2' }] }, - { label: 'f2', field: 'f2', buckets: [] } + { type: 'field', label: 'f1', field: 'f1', buckets: [ + { label: 'b1', metrics: [{value: {count: 6}}], filterQuery: 'filter' }, + { label: 'b2', metrics: [{value: {count: 1}}], filterQuery: 'filter2' }] }, + { type: 'field', label: 'f2', field: 'f2', buckets: [] } ]; const data = { list: { context: { - facetsFields: serverResponseFields + facets: serverResponseFields } } }; - component.selectFacetBucket({ field: 'f1', label: 'f1' }, component.responseFacetFields[0].buckets.items[1]); + component.selectFacetBucket({ field: 'f1', label: 'f1' }, component.responseFacets[0].buckets.items[1]); component.onDataLoaded(data); - expect(component.responseFacetFields.length).toEqual(2); - expect(component.responseFacetFields[0].buckets.items[0].checked).toEqual(true, 'should show the already checked item'); + expect(component.responseFacets.length).toEqual(2); + expect(component.responseFacets[0].buckets.items[0].checked).toEqual(true, 'should show the already checked item'); }); it('should fetch facet fields from response payload and show the newly checked items', () => { @@ -420,31 +436,31 @@ describe('SearchFilterComponent', () => { } }; - component.responseFacetFields = [ + component.responseFacets = [ { label: 'f1', field: 'f1', buckets: {items: [ { label: 'b1', count: 10, filterQuery: 'filter', checked: true }, { label: 'b2', count: 1, filterQuery: 'filter2' }] }}, { label: 'f2', field: 'f2', buckets: {items: [] }} ]; - component.queryBuilder.addUserFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacetFields[0].buckets.items[0]); + component.queryBuilder.addUserFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacets[0].buckets.items[0]); const serverResponseFields: any = [ - { label: 'f1', field: 'f1', buckets: [ - { label: 'b1', count: 6, filterQuery: 'filter' }, - { label: 'b2', count: 1, filterQuery: 'filter2' }] }, - { label: 'f2', field: 'f2', buckets: [] } + { type: 'field', label: 'f1', field: 'f1', buckets: [ + { label: 'b1', metrics: [{value: {count: 6}}], filterQuery: 'filter' }, + { label: 'b2', metrics: [{value: {count: 1}}], filterQuery: 'filter2' }] }, + { type: 'field', label: 'f2', field: 'f2', buckets: [] } ]; const data = { list: { context: { - facetsFields: serverResponseFields + facets: serverResponseFields } } }; - component.selectFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacetFields[0].buckets.items[1]); + component.selectFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacets[0].buckets.items[1]); component.onDataLoaded(data); - expect(component.responseFacetFields.length).toEqual(2); - expect(component.responseFacetFields[0].buckets.items[1].checked).toEqual(true, 'should show the newly checked item'); + expect(component.responseFacets.length).toEqual(2); + expect(component.responseFacets[0].buckets.items[1].checked).toEqual(true, 'should show the newly checked item'); }); it('should show buckets with 0 values when there are no facet fields on the response payload', () => { @@ -460,23 +476,23 @@ describe('SearchFilterComponent', () => { } }; - component.responseFacetFields = [ + component.responseFacets = [ { label: 'f1', field: 'f1', buckets: {items: [ { label: 'b1', count: 10, filterQuery: 'filter', checked: true }, { label: 'b2', count: 1, filterQuery: 'filter2' }] }}, { label: 'f2', field: 'f2', buckets: {items: [] }} ]; - component.queryBuilder.addUserFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacetFields[0].buckets.items[0]); + component.queryBuilder.addUserFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacets[0].buckets.items[0]); const data = { list: { context: {} } }; - component.selectFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacetFields[0].buckets.items[1]); + component.selectFacetBucket({ label: 'f1', field: 'f1' }, component.responseFacets[0].buckets.items[1]); component.onDataLoaded(data); - expect(component.responseFacetFields[0].buckets.items[0].count).toEqual(0); - expect(component.responseFacetFields[0].buckets.items[1].count).toEqual(0); + expect(component.responseFacets[0].buckets.items[0].count).toEqual(0); + expect(component.responseFacets[0].buckets.items[1].count).toEqual(0); }); it('should update query builder only when has bucket to unselect', () => { @@ -557,20 +573,23 @@ describe('SearchFilterComponent', () => { it('should update query builder upon resetting selected queries', () => { spyOn(queryBuilder, 'update').and.stub(); - spyOn(queryBuilder, 'removeUserFacetQuery').and.callThrough(); + spyOn(queryBuilder, 'removeUserFacetBucket').and.callThrough(); - component.canResetSelectedQueries = true; - component.responseFacetQueries = new ResponseFacetQueryList([ - { label: 'q1', query: 'q1', checked: true, count: 1 }, - { label: 'q2', query: 'q2', checked: false, count: 1 }, - { label: 'q3', query: 'q3', checked: true, count: 1 } - ], translationMock); - component.resetSelectedQueries(); + const queryResponse = { + label: 'query response', + buckets: { + items: [ + { label: 'q1', query: 'q1', checked: true, metrics: [{value: {count: 1}}] }, + { label: 'q2', query: 'q2', checked: false, metrics: [{value: {count: 1}}] }, + { label: 'q3', query: 'q3', checked: true, metrics: [{value: {count: 1}}] }] + }}; + component.responseFacets = [queryResponse]; + component.resetSelectedBuckets(queryResponse); - expect(queryBuilder.removeUserFacetQuery).toHaveBeenCalledTimes(3); + expect(queryBuilder.removeUserFacetBucket).toHaveBeenCalledTimes(3); expect(queryBuilder.update).toHaveBeenCalled(); - for (let entry of component.responseFacetQueries.items) { + for (let entry of component.responseFacets[0].buckets.items) { expect(entry.checked).toBeFalsy(); } }); 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 47cafd8309..3c86044a9b 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 @@ -20,12 +20,10 @@ import { MatCheckboxChange } from '@angular/material'; import { SearchService, TranslationService } from '@alfresco/adf-core'; import { SearchQueryBuilderService } from '../../search-query-builder.service'; import { FacetFieldBucket } from '../../facet-field-bucket.interface'; -import { ResponseFacetQueryList } from './models/response-facet-query-list.model'; -import { FacetQuery } from '../../facet-query.interface'; import { FacetField } from '../../facet-field.interface'; import { SearchFilterList } from './models/search-filter-list.model'; import { takeWhile } from 'rxjs/operators'; -import { ResultSetPaging } from '@alfresco/js-api'; +import { ResultSetPaging, GenericBucket, GenericFacetResponse, ResultSetContext } from '@alfresco/js-api'; @Component({ selector: 'adf-search-filter', @@ -39,16 +37,13 @@ export class SearchFilterComponent implements OnInit, OnDestroy { private DEFAULT_PAGE_SIZE = 5; isAlive = true; - responseFacetQueries: ResponseFacetQueryList = null; - responseFacetFields: FacetField[] = null; + responseFacets: FacetField[] = null; private facetQueriesPageSize = this.DEFAULT_PAGE_SIZE; facetQueriesLabel: string = 'Facet Queries'; facetQueriesExpanded = false; facetFieldsExpanded = false; - canResetSelectedQueries = false; - selectedFacetQueries: Array = []; selectedBuckets: Array<{ field: FacetField, bucket: FacetFieldBucket }> = []; constructor(public queryBuilder: SearchQueryBuilderService, @@ -85,38 +80,10 @@ export class SearchFilterComponent implements OnInit, OnDestroy { this.isAlive = false; } - onToggleFacetQuery(event: MatCheckboxChange, facetQuery: FacetQuery) { - if (event && facetQuery) { - if (event.checked) { - this.selectFacetQuery(facetQuery); - } else { - this.unselectFacetQuery(facetQuery); - } - } - } - - selectFacetQuery(query: FacetQuery) { - if (query) { - query.checked = true; - this.queryBuilder.addUserFacetQuery(query); - this.updateSelectedFields(); - this.queryBuilder.update(); - } - } - - unselectFacetQuery(query: FacetQuery) { - if (query) { - query.checked = false; - this.queryBuilder.removeUserFacetQuery(query); - this.updateSelectedFields(); - this.queryBuilder.update(); - } - } - private updateSelectedBuckets() { - if (this.responseFacetFields) { + if (this.responseFacets) { this.selectedBuckets = []; - for (let field of this.responseFacetFields) { + for (let field of this.responseFacets) { if (field.buckets) { this.selectedBuckets.push( ...this.queryBuilder.getUserFacetBuckets(field.field) @@ -132,16 +99,6 @@ export class SearchFilterComponent implements OnInit, OnDestroy { } } - private updateSelectedFields() { - if (this.responseFacetQueries) { - this.selectedFacetQueries = this.responseFacetQueries.items.filter((item) => item.checked); - this.canResetSelectedQueries = this.selectedFacetQueries.length > 0; - } else { - this.selectedFacetQueries = []; - this.canResetSelectedQueries = false; - } - } - onToggleBucket(event: MatCheckboxChange, field: FacetField, bucket: FacetFieldBucket) { if (event && bucket) { if (event.checked) { @@ -170,18 +127,6 @@ export class SearchFilterComponent implements OnInit, OnDestroy { } } - resetSelectedQueries() { - if (this.canResetSelectedQueries) { - for (let query of this.responseFacetQueries.items) { - query.checked = false; - this.queryBuilder.removeUserFacetQuery(query); - } - this.selectedFacetQueries = []; - this.canResetSelectedQueries = false; - this.queryBuilder.update(); - } - } - canResetSelectedBuckets(field: FacetField): boolean { if (field && field.buckets) { return field.buckets.items.some((bucket) => bucket.checked); @@ -200,65 +145,37 @@ export class SearchFilterComponent implements OnInit, OnDestroy { } } + shouldExpand(field: FacetField): boolean { + return field.type === 'query' ? this.facetQueriesExpanded : this.facetFieldsExpanded; + } + onDataLoaded(data: any) { const context = data.list.context; if (context) { - this.parseFacetFields(context); - this.parseFacetQueries(context); + this.parseFacets(context); } else { - this.responseFacetQueries = null; - this.responseFacetFields = null; + this.responseFacets = null; } } - private parseFacetFields(context: any) { - if (!this.responseFacetFields) { - const configFacetFields = this.queryBuilder.config.facetFields && this.queryBuilder.config.facetFields.fields || []; - - this.responseFacetFields = configFacetFields.map((field) => { - const responseField = (context.facetsFields || []).find((response) => response.label === field.label); - const buckets: FacetFieldBucket[] = ((responseField && responseField.buckets) || []).map((bucket) => { - const selectedBucket = this.selectedBuckets.find((facetBucket) => - facetBucket.bucket.label === bucket.label && facetBucket.field.field === field.field); - - return { - ...bucket, - checked: !!selectedBucket, - display: bucket.display, - label: bucket.label - }; - }); - const bucketList = new SearchFilterList(buckets, field.pageSize); - bucketList.filter = (bucket: FacetFieldBucket): boolean => { - if (bucket && bucketList.filterText) { - const pattern = (bucketList.filterText || '').toLowerCase(); - const label = (this.translationService.instant(bucket.display) || this.translationService.instant(bucket.label)).toLowerCase(); - return this.queryBuilder.config.filterWithContains ? label.indexOf(pattern) !== -1 : label.startsWith(pattern); - } - return true; - }; - return { - ...field, - label: field.label, - pageSize: field.pageSize | this.DEFAULT_PAGE_SIZE, - currentPageSize: field.pageSize | this.DEFAULT_PAGE_SIZE, - buckets: bucketList - }; - }); + private parseFacets(context: ResultSetContext) { + if (!this.responseFacets) { + const responseFacetFields = this.parseFacetFields(context); + const responseGroupedFacetQueries = this.parseFacetQueries(context); + this.responseFacets = responseFacetFields.concat(...responseGroupedFacetQueries); } else { - - this.responseFacetFields = this.responseFacetFields + this.responseFacets = this.responseFacets .map((field) => { - let responseField = (context.facetsFields || []).find((response) => response.label === field.label); + let responseField = (context.facets || []).find((response) => response.label === field.label && response.type === field.type); (field && field.buckets && field.buckets.items || []) .map((bucket) => { const responseBucket = ((responseField && responseField.buckets) || []).find((respBucket) => respBucket.label === bucket.label); - bucket.count = responseBucket ? responseBucket.count : 0; + bucket.count = responseBucket ? this.getCountValue(responseBucket) : 0; return bucket; }); @@ -267,48 +184,111 @@ export class SearchFilterComponent implements OnInit, OnDestroy { } } - private parseFacetQueries(context: any) { - const responseQueries = this.getFacetQueryMap(context); - if (this.queryBuilder.config.facetQueries) { - const bkpResponseFacetQueries = Object.assign({}, this.responseFacetQueries); - const facetQueries = (this.queryBuilder.config.facetQueries.queries || []) - .map((query) => { + private parseFacetFields(context: ResultSetContext): FacetField[] { + const configFacetFields = this.queryBuilder.config.facetFields && this.queryBuilder.config.facetFields.fields || []; - const queryResult = responseQueries[query.label]; - const bkpQuery = (bkpResponseFacetQueries.items || []).find((item) => item.label === query.label); + return configFacetFields.map((field) => { + const responseField = (context.facets || []).find((response) => response.type === 'field' && response.label === field.label) || {}; + const responseBuckets = this.getResponseBuckets(responseField); - if (bkpQuery) { - bkpQuery.count = queryResult.count; - return bkpQuery; - } - return { - ...query, - label: query.label, - count: queryResult.count - }; - }); - - if (facetQueries.length > 0) { - if (this.responseFacetQueries) { - this.responseFacetQueries.items = facetQueries; - - } else { - this.responseFacetQueries = new ResponseFacetQueryList(facetQueries, this.translationService, this.facetQueriesPageSize); + const bucketList = new SearchFilterList(responseBuckets, field.pageSize); + bucketList.filter = (bucket: FacetFieldBucket): boolean => { + if (bucket && bucketList.filterText) { + const pattern = (bucketList.filterText || '').toLowerCase(); + const label = (this.translationService.instant(bucket.display) || this.translationService.instant(bucket.label)).toLowerCase(); + return this.queryBuilder.config.filterWithContains ? label.indexOf(pattern) !== -1 : label.startsWith(pattern); } + return true; + }; - } else { - this.responseFacetQueries = null; - } - } + return { + ...field, + type: responseField.type, + label: field.label, + pageSize: field.pageSize | this.DEFAULT_PAGE_SIZE, + currentPageSize: field.pageSize | this.DEFAULT_PAGE_SIZE, + buckets: bucketList + }; + }); } - private getFacetQueryMap(context: any): { [key: string]: any } { - const result = {}; + private parseFacetQueries(context: ResultSetContext): FacetField[] { + const configFacetQueries = this.queryBuilder.config.facetQueries && this.queryBuilder.config.facetQueries.queries || []; + const configGroups = configFacetQueries.reduce((acc, query) => { + const group = this.queryBuilder.getQueryGroup(query); + if (acc[group]) { + acc[group].push(query); + } else { + acc[group] = [query]; + } + return acc; + }, []); - (context.facetQueries || []).forEach((query) => { - result[query.label] = query; + const result = []; + + Object.keys(configGroups).forEach((group) => { + const responseField = (context.facets || []).find((response) => response.type === 'query' && response.label === group) || {}; + const responseBuckets = this.getResponseQueryBuckets(responseField, configGroups[group]); + + const bucketList = new SearchFilterList(responseBuckets, this.facetQueriesPageSize); + bucketList.filter = (bucket: FacetFieldBucket): boolean => { + if (bucket && bucketList.filterText) { + const pattern = (bucketList.filterText || '').toLowerCase(); + const label = (this.translationService.instant(bucket.display) || this.translationService.instant(bucket.label)).toLowerCase(); + return this.queryBuilder.config.filterWithContains ? label.indexOf(pattern) !== -1 : label.startsWith(pattern); + } + return true; + }; + + result.push( { + field: group, + type: responseField.type, + label: group, + pageSize: this.DEFAULT_PAGE_SIZE, + currentPageSize: this.DEFAULT_PAGE_SIZE, + buckets: bucketList + }); }); return result; } + + private getResponseBuckets(responseField: GenericFacetResponse): FacetFieldBucket[] { + return ((responseField && responseField.buckets) || []).map((respBucket) => { + + respBucket['count'] = this.getCountValue(respBucket); + return { + ...respBucket, + checked: false, + display: respBucket.display, + label: respBucket.label + }; + }); + } + + private getResponseQueryBuckets(responseField: GenericFacetResponse, configGroup: any): FacetFieldBucket[] { + return (configGroup || []).map((query) => { + const respBucket = ((responseField && responseField.buckets) || []) + .find((bucket) => bucket.label === query.label); + + respBucket['count'] = this.getCountValue(respBucket); + return { + ...respBucket, + checked: false, + display: respBucket.display, + label: respBucket.label + }; + }).filter((bucket) => { + let mincount = this.queryBuilder.config.facetQueries.mincount; + if (mincount === undefined) { + mincount = 1; + } + return bucket.count >= mincount; + }); + } + + private getCountValue(bucket: GenericBucket): number { + return (!!bucket && !!bucket.metrics && bucket.metrics[0] && bucket.metrics[0].value && bucket.metrics[0].value.count) + || 0; + } } diff --git a/lib/content-services/search/facet-field.interface.ts b/lib/content-services/search/facet-field.interface.ts index cc50641bc6..c0b3e7a765 100644 --- a/lib/content-services/search/facet-field.interface.ts +++ b/lib/content-services/search/facet-field.interface.ts @@ -30,4 +30,5 @@ export interface FacetField { pageSize?: number; currentPageSize?: number; checked?: boolean; + type?: string; } diff --git a/lib/content-services/search/facet-query.interface.ts b/lib/content-services/search/facet-query.interface.ts index 9b7a15210f..ca80add84e 100644 --- a/lib/content-services/search/facet-query.interface.ts +++ b/lib/content-services/search/facet-query.interface.ts @@ -21,4 +21,5 @@ export interface FacetQuery { checked?: boolean; count?: number; + group?: string; } diff --git a/lib/content-services/search/search-configuration.interface.ts b/lib/content-services/search/search-configuration.interface.ts index 43bf4c5ae3..c7d733d1b2 100644 --- a/lib/content-services/search/search-configuration.interface.ts +++ b/lib/content-services/search/search-configuration.interface.ts @@ -31,6 +31,7 @@ export interface SearchConfiguration { label?: string; pageSize?: number; expanded?: boolean; + mincount?: number; queries: Array; }; facetFields?: { 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 c4db35d4de..1abbedb37e 100644 --- a/lib/content-services/search/search-query-builder.service.spec.ts +++ b/lib/content-services/search/search-query-builder.service.spec.ts @@ -343,7 +343,7 @@ describe('SearchQueryBuilder', () => { ], facetQueries: { queries: [ - { query: 'q1', label: 'q2' } + { query: 'q1', label: 'q2', group: 'group-name' } ] } }; diff --git a/lib/content-services/search/search-query-builder.service.ts b/lib/content-services/search/search-query-builder.service.ts index a07ea4db4e..1d06c3452c 100644 --- a/lib/content-services/search/search-query-builder.service.ts +++ b/lib/content-services/search/search-query-builder.service.ts @@ -50,7 +50,6 @@ export class SearchQueryBuilderService { paging: { maxItems?: number; skipCount?: number } = null; sorting: Array = []; - protected userFacetQueries: FacetQuery[] = []; protected userFacetBuckets: { [key: string]: Array } = {}; get userQuery(): string { @@ -81,39 +80,12 @@ export class SearchQueryBuilderService { this.categories = (this.config.categories || []).filter((category) => category.enabled); this.filterQueries = this.config.filterQueries || []; this.userFacetBuckets = {}; - this.userFacetQueries = []; if (this.config.sorting) { this.sorting = this.config.sorting.defaults || []; } } } - /** - * Adds a facet query. - * @param query Query to add - */ - addUserFacetQuery(query: FacetQuery) { - if (query) { - const existing = this.userFacetQueries.find((facetQuery) => facetQuery.label === query.label); - if (existing) { - existing.query = query.query; - } else { - this.userFacetQueries.push({ ...query }); - } - } - } - - /** - * Removes an existing facet query. - * @param query Query to remove - */ - removeUserFacetQuery(query: FacetQuery) { - if (query) { - this.userFacetQueries = this.userFacetQueries - .filter((facetQuery) => facetQuery.label !== query.label); - } - } - /** * Adds a facet bucket to a field. * @param field The target field @@ -240,7 +212,7 @@ export class SearchQueryBuilderService { } if (query) { - const result: QueryBody = { + const result: QueryBody = { query: { query: query, language: 'afts' @@ -254,6 +226,7 @@ export class SearchQueryBuilderService { sort: this.sort }; + result['facetFormat'] = 'V2'; return result; } @@ -282,6 +255,10 @@ export class SearchQueryBuilderService { return []; } + getQueryGroup(query) { + return query.group || this.config.facetQueries.label || 'Facet Queries'; + } + /** * Checks if FacetQueries has been defined * @returns True if defined, false otherwise @@ -309,6 +286,7 @@ export class SearchQueryBuilderService { protected get facetQueries(): FacetQuery[] { if (this.hasFacetQueries) { return this.config.facetQueries.queries.map((query) => { + query.group = this.getQueryGroup(query); return { ...query }; }); } @@ -333,13 +311,6 @@ export class SearchQueryBuilderService { .filter((entry) => entry) .join(' AND '); - if (this.userFacetQueries && this.userFacetQueries.length > 0) { - const combined = this.userFacetQueries - .map((userQuery) => userQuery.query) - .join(' OR '); - result += ` AND (${combined})`; - } - if (this.userFacetBuckets) { Object.keys(this.userFacetBuckets).forEach((key) => { const subQuery = (this.userFacetBuckets[key] || []) diff --git a/lib/core/app-config/schema.json b/lib/core/app-config/schema.json index 36bac5d721..3f101f4931 100644 --- a/lib/core/app-config/schema.json +++ b/lib/core/app-config/schema.json @@ -988,17 +988,21 @@ ], "properties": { "label": { - "description": "Category label text", + "description": "Label text for the default facet queries group", "type": "string" }, "pageSize": { - "description": "Default page size of the category", + "description": "Default page size for the facet queries groups", "type": "number" }, "expanded": { - "description": "Toggles expanded state of the category", + "description": "Toggles expanded state of the facet queries groups", "type": "boolean" }, + "mincount": { + "description": "This specifies the minimum count required for a facet query to be displayed. The default value is 1.", + "type": "number" + }, "queries": { "description": "List of custom facet queries", "type": "array", @@ -1014,6 +1018,10 @@ }, "label": { "type": "string" + }, + "group": { + "description": "The group that the facet query belongs to. If no group is defined, the facet query will appear under the default facet queries group label", + "type": "string" } } }