15672: Adds filtering by name on subprocess panel by using the search field.
[arvados-workbench2.git] / src / store / search-bar / search-query / parser.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { uniq } from 'lodash/fp';
6
7 export interface ParsedSearchQuery {
8     tokens: string[];
9     searchString: string;
10 }
11
12 export const findToken = (query: string, patterns: RegExp[]) => {
13     for (const pattern of patterns) {
14         const match = query.match(pattern);
15         if (match) {
16             return match[0];
17         }
18     }
19     return null;
20 };
21
22 export const findAllTokens = (query: string, patterns: RegExp[]): string[] => {
23     const token = findToken(query, patterns);
24     return token
25         ? [token].concat(findAllTokens(query.replace(token, ''), patterns))
26         : [];
27 };
28
29 export const findSearchString = (query: string, tokens: string[]) => {
30     const uniqueWords = uniq(tokens
31         .reduce((q, token) => q.replace(token, ''), query)
32         .split(' ')
33         .filter(word => word !== '')
34     );
35     return uniqueWords.join(' ');
36 };
37
38 export const parseSearchQuery = (patterns: RegExp[]) => (query: string): ParsedSearchQuery => {
39     const tokens = findAllTokens(query, patterns);
40     const searchString = findSearchString(query, tokens);
41     return { tokens, searchString };
42 };