import { ApolloColumnType } from '../interfaces'; import { dateToQuery } from './dateToQuery'; import { findColumn } from './findColumn'; import { rangeInputToQuery } from './rangeInputToQuery'; export const generateQuery = ( queryValue: string, filterValues: Record, columns: ApolloColumnType[], ): string => { let query = ''; Object.keys(filterValues).forEach(key => { const column = findColumn(columns, key); const transform = column.search?.transform; if (column.filterType === 'dateRange' || column.filterType === 'dateTimeRange') { query = `${query ? `${query} and` : ''} ${ transform ? transform(filterValues[key]) : dateToQuery(key, filterValues[key]) }`.trim(); } else if (column.filterType === 'rangeInput') { query = `${query ? `${query} and` : ''} ${ transform ? transform(filterValues[key]) : rangeInputToQuery(key, filterValues[key]) }`.trim(); // 多选条件为 or } else if (column.filterType === 'checkbox') { const value = transform ? transform(filterValues[key]) : filterValues[key] .map((item: string | boolean) => { if (typeof item === 'boolean') { return `${key}:${item}`; } return `${key}:"${item}"`; }) .join(' or '); if (transform) { query = `${query ? `${query} and ${value}` : value}`.trim(); } else { query = `${query ? `${query} and (${value})` : `(${value})`}`.trim(); } } else { // 为 Input 类型有 phrase 的话,要加引号 // eslint-disable-next-line no-lonely-if if ( (column?.filterType === 'input' || column?.filterType === 'select') && column.search?.phrase ) { const result = transform ? transform(filterValues[key]) : `${key}:"${filterValues[key]}"`; query = `${query ? `${query} and` : ''} ${result}`.trim(); } else { const result = transform ? transform(filterValues[key]) : `${key}:${filterValues[key]}`; query = `${query ? `${query} and` : ''} ${result}`.trim(); } } }); if (queryValue) { query = `${queryValue} ${query ? `and ${query}` : ''}`.trim(); } return query; };