From 4a72c22ddb45dce37ff0f9f18d4d73c289a08070 Mon Sep 17 00:00:00 2001 From: Pawel Kowalczyk Date: Mon, 28 Jan 2019 09:18:24 +0100 Subject: [PATCH] searching by description and uuid Feature #14772 Arvados-DCO-1.1-Signed-off-by: Pawel Kowalczyk --- src/store/search-bar/search-bar-actions.ts | 26 ++++++--- .../search-results-middleware-service.ts | 54 ++++++++++++------- 2 files changed, 56 insertions(+), 24 deletions(-) diff --git a/src/store/search-bar/search-bar-actions.ts b/src/store/search-bar/search-bar-actions.ts index 05b6f050b9..01a0311ec3 100644 --- a/src/store/search-bar/search-bar-actions.ts +++ b/src/store/search-bar/search-bar-actions.ts @@ -10,8 +10,7 @@ import { RootState } from '~/store/store'; import { initUserProject, treePickerActions } from '~/store/tree-picker/tree-picker-actions'; import { ServiceRepository } from '~/services/services'; import { FilterBuilder } from "~/services/api/filter-builder"; -import { ResourceKind } from '~/models/resource'; -import { GroupClass } from '~/models/group'; +import { ResourceKind, isResourceUuid, extractUuidKind } from '~/models/resource'; import { SearchView } from '~/store/search-bar/search-bar-reducer'; import { navigateTo, navigateToSearchResults } from '~/store/navigation/navigation-action'; import { snackbarActions, SnackbarKind } from '~/store/snackbar/snackbar-actions'; @@ -404,8 +403,8 @@ export const getSearchSessions = (clusterId: string | undefined, sessions: Sessi export const getFilters = (filterName: string, searchValue: string, sq: ParseSearchQuery): string => { const filter = new FilterBuilder(); - - const resourceKind = getSearchQueryFirstProp(sq, 'type') as ResourceKind; + const isSearchQueryUuid = isResourceUuid(sq.values[0]); + const resourceKind = getSearchQueryFirstProp(sq, 'type') as ResourceKind; let prefix = ''; switch (resourceKind) { @@ -422,7 +421,7 @@ export const getFilters = (filterName: string, searchValue: string, sq: ParseSea const isTrashed = getSearchQueryPropValue(sq, 'is', 'trashed'); - if (!sq.hasKeywords) { + if (!sq.hasKeywords && !isSearchQueryUuid) { filter .addILike(filterName, searchValue, GroupContentsResourcePrefix.COLLECTION) .addILike(filterName, searchValue, GroupContentsResourcePrefix.PROJECT) @@ -433,7 +432,15 @@ export const getFilters = (filterName: string, searchValue: string, sq: ParseSea if (isTrashed) { filter.addILike(filterName, searchValue, GroupContentsResourcePrefix.PROCESS); } - } else { + } else if (!sq.hasKeywords && isSearchQueryUuid) { + filter + .addILike('uuid', searchValue, GroupContentsResourcePrefix.COLLECTION) + .addILike('uuid', searchValue, GroupContentsResourcePrefix.PROJECT) + .addILike('uuid', searchValue, GroupContentsResourcePrefix.PROCESS) + .addEqual('is_trashed', false, GroupContentsResourcePrefix.COLLECTION) + .addEqual('is_trashed', false, GroupContentsResourcePrefix.PROJECT); + } + else { if (prefix) { sq.values.forEach(v => filter.addILike(filterName, v, prefix) @@ -452,6 +459,13 @@ export const getFilters = (filterName: string, searchValue: string, sq: ParseSea } }); } + if (prefix && !isTrashed) { + sq.values.forEach(v => + filter.addILike(filterName, v, prefix) + .addEqual('is_trashed', false, GroupContentsResourcePrefix.COLLECTION) + .addEqual('is_trashed', false, GroupContentsResourcePrefix.PROJECT) + ); + } if (isTrashed) { sq.values.forEach(v => { diff --git a/src/store/search-results-panel/search-results-middleware-service.ts b/src/store/search-results-panel/search-results-middleware-service.ts index 12578a2dd4..efe62f230b 100644 --- a/src/store/search-results-panel/search-results-middleware-service.ts +++ b/src/store/search-results-panel/search-results-middleware-service.ts @@ -26,6 +26,7 @@ import { joinFilters } from '~/services/api/filter-builder'; import { DataColumns } from '~/components/data-table/data-table'; import { serializeResourceTypeFilters } from '~/store//resource-type-filters/resource-type-filters'; import { ProjectPanelColumnNames } from '~/views/project-panel/project-panel'; +import * as _ from 'lodash'; export class SearchResultsMiddlewareService extends DataExplorerMiddlewareService { constructor(private services: ServiceRepository, id: string) { @@ -46,29 +47,46 @@ export class SearchResultsMiddlewareService extends DataExplorerMiddlewareServic } try { - const params = getParams(dataExplorer, searchValue, sq); - const lists: ListResults[] = await Promise.all(sessions.map(session => - this.services.groupsService.contents('', params, session) + const nameParams = getParams(dataExplorer, searchValue, sq, 'name'); + + const nameLists: ListResults[] = await Promise.all(sessions.map(session => + this.services.groupsService.contents('', nameParams, session) )); - const items = lists + const nameItems = nameLists .reduce((items, list) => items.concat(list.items), [] as GroupContentsResource[]); - const itemsAvailable = lists + const nameItemsAvailable = nameLists .reduce((itemsAvailable, list) => itemsAvailable + list.itemsAvailable, 0); - const list: ListResults = { - ...params, + const descriptionParams = getParams(dataExplorer, searchValue, sq, 'description'); + + const descriptionLists: ListResults[] = await Promise.all(sessions.map(session => + this.services.groupsService.contents('', descriptionParams, session) + )); + + const descriptionItems = descriptionLists + .reduce((items, list) => items.concat(list.items), [] as GroupContentsResource[]); + + const descriptionItemsAvailable = descriptionLists + .reduce((itemsAvailable, list) => itemsAvailable + list.itemsAvailable, 0); + + const items = nameItems.concat(descriptionItems); + + const uniqueItems = _.uniqBy(items, 'uuid'); + + const mainList: ListResults = { + ...nameParams, kind: '', - items, - itemsAvailable + items: uniqueItems, + itemsAvailable: nameItemsAvailable + descriptionItemsAvailable }; - api.dispatch(updateResources(list.items)); + api.dispatch(updateResources(mainList.items)); + api.dispatch(criteriaChanged - ? setItems(list) - : appendItems(list) - ); + ? setItems(mainList) + : appendItems(mainList)); } catch { api.dispatch(couldNotFetchSearchResults()); @@ -78,16 +96,16 @@ export class SearchResultsMiddlewareService extends DataExplorerMiddlewareServic const typeFilters = (columns: DataColumns) => serializeResourceTypeFilters(getDataExplorerColumnFilters(columns, ProjectPanelColumnNames.TYPE)); -export const getParams = (dataExplorer: DataExplorer, searchValue: string, sq: ParseSearchQuery) => ({ +export const getParams = (dataExplorer: DataExplorer, searchValue: string, sq: ParseSearchQuery, filter: string) => ({ ...dataExplorerToListParams(dataExplorer), filters: joinFilters( - getFilters('name', searchValue, sq), + getFilters(filter, searchValue, sq), typeFilters(dataExplorer.columns)), - order: getOrder(dataExplorer), + order: getOrder(dataExplorer, filter), includeTrash: true }); -const getOrder = (dataExplorer: DataExplorer) => { +const getOrder = (dataExplorer: DataExplorer, orderBy: any) => { const sortColumn = getSortColumn(dataExplorer); const order = new OrderBuilder(); if (sortColumn) { @@ -95,7 +113,7 @@ const getOrder = (dataExplorer: DataExplorer) => { ? OrderDirection.ASC : OrderDirection.DESC; - const columnName = sortColumn && sortColumn.name === SearchResultsPanelColumnNames.NAME ? "name" : "modifiedAt"; + const columnName = sortColumn && sortColumn.name === SearchResultsPanelColumnNames.NAME ? orderBy : "modifiedAt"; return order .addOrder(sortDirection, columnName, GroupContentsResourcePrefix.COLLECTION) .addOrder(sortDirection, columnName, GroupContentsResourcePrefix.PROCESS) -- 2.30.2