-export interface ParseSearchQuery {
- hasKeywords: boolean;
- values: string[];
- properties: {
- [key: string]: string[]
- };
-}
-
-export const parseSearchQuery: (query: string) => ParseSearchQuery = (searchValue: string) => {
- const keywords = [
- 'type:',
- 'cluster:',
- 'project:',
- 'is:',
- 'from:',
- 'to:',
- 'has:'
- ];
-
- const hasKeywords = (search: string) => keywords.reduce((acc, keyword) => acc + (search.includes(keyword) ? 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 };
-};
-
-const getFirstProp = (sq: ParseSearchQuery, name: string) => sq.properties[name] && sq.properties[name][0];
-const getPropValue = (sq: ParseSearchQuery, name: string, value: string) => sq.properties[name] && sq.properties[name].find((v: string) => v === value);
-const getProperties = (sq: ParseSearchQuery): PropertyValue[] => {
- if (sq.properties.has) {
- return sq.properties.has.map((value: string) => {
- const v = value.split(':');
- return {
- key: v[0],
- value: v[1]
- };
- });
- }
- return [];
-};
-