-export interface ParsedSearchQuery {
- hasKeywords: boolean;
- values: string[];
- properties: {
- [key: string]: string
- };
-}
-
-export const parseSearchQuery: (query: string) => { hasKeywords: boolean; values: string[]; properties: any } = (searchValue: string): ParsedSearchQuery => {
- const keywords = [
- 'type:',
- 'cluster:',
- 'project:',
- 'is:',
- 'from:',
- 'to:',
- 'has:'
- ];
-
- const hasKeywords = (search: string) => keywords.reduce((acc, keyword) => acc + search.indexOf(keyword) >= 0 ? 1 : 0, 0);
- let keywordsCnt = 0;
-
- const properties = {};
-
- keywords.forEach(k => {
- let p = searchValue.indexOf(k);
- const key = k.substr(0, k.length - 1);
-
- while (p >= 0) {
- const l = searchValue.length;
- keywordsCnt += 1;
-
- let v = '';
- let i = p + k.length;
- while (i < l && searchValue[i] === ' ') {
- ++i;
- }
- const vp = i;
- while (i < l && searchValue[i] !== ' ') {
- v += searchValue[i];
- ++i;
- }
-
- if (hasKeywords(v)) {
- searchValue = searchValue.substr(0, p) + searchValue.substr(vp);
- } else {
- if (v !== '') {
- if (!properties[key]) {
- properties[key] = [];
- }
- properties[key].push(v);
- }
- searchValue = searchValue.substr(0, p) + searchValue.substr(i);
- }
- p = searchValue.indexOf(k);
- }
- });
-
- const values = _.uniq(searchValue.split(' ').filter(v => v.length > 0));
-
- return { hasKeywords: keywordsCnt > 0, values, properties };
-};
-
-export const getAdvancedDataFromQuery = (query: string): SearchBarAdvanceFormData => {
- const r = parseSearchQuery(query);
-
- const getFirstProp = (name: string) => r.properties[name] && r.properties[name][0];
- const getPropValue = (name: string, value: string) => r.properties[name] && r.properties[name].find((v: string) => v === value);
- const getProperties = () => {
- if (r.properties.has) {
- return r.properties.has.map((value: string) => {
- const v = value.split(':');
- return {
- key: v[0],
- value: v[1]
- };
- });
- }
- return [];
- };
-
+export const getAdvancedDataFromQuery = (query: string, vocabulary?: Vocabulary): SearchBarAdvancedFormData => {
+ const { tokens, searchString } = parser.parseSearchQuery(query);
+ const getValue = parser.getValue(tokens);