UNPKG

dtable-utils

Version:

dtable common utils

818 lines (784 loc) 36.2 kB
import _defineProperty from '@babel/runtime/helpers/defineProperty'; import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray'; import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; import { ValidateFilter } from '../../validate/filter.js'; import { otherDate, checkIsFilterGroup } from '../../filter/core.js'; import { getTableColumnByKey } from '../../table/column.js'; import { FILTER_ERR_MSG } from '../../constants/filter/index.js'; import { CellType } from '../../constants/cell-type.js'; import { DEPARTMENT_SELECT_RANGE_MAP } from '../../constants/column.js'; import { FORMULA_RESULT_TYPE } from '../../constants/formula.js'; import PatchUtils from '../../helper/patch-utils.js'; import { FILTER_PREDICATE_TYPE } from '../../constants/filter/filter-predicate.js'; import { FILTER_TERM_MODIFIER_TYPE } from '../../constants/filter/filter-modifier.js'; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } dayjs.extend(utc); // TEXT | GEOLOCATION | EMAIL | AUTO_NUMBER var textSqlCondition = function textSqlCondition(column, filterItem, userId) { var name = column.name; var filter_predicate = filterItem.filter_predicate, filter_term = filterItem.filter_term; // 'TEXT' type special treatment if (column.type === CellType.TEXT) { if (filter_predicate === FILTER_PREDICATE_TYPE.EMPTY) { return "(`".concat(name, "` = '' OR `").concat(name, "` is null)"); } if (filter_predicate === FILTER_PREDICATE_TYPE.NOT_EMPTY) { return "`".concat(name, "` <> '' AND `").concat(name, "` is not null"); } } if (filter_predicate === FILTER_PREDICATE_TYPE.EMPTY) { return "`".concat(name, "` is null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.NOT_EMPTY) { return "`".concat(name, "` is not null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_CURRENT_USER_ID) { if (!userId) { return "(`".concat(name, "` IS NULL AND `").concat(name, "` IS NOT NULL)"); } return "`".concat(name, "` = '").concat(userId, "'"); } if (!filter_term) return ''; if (filter_predicate === FILTER_PREDICATE_TYPE.CONTAINS) { return "`".concat(name, "` ilike '%").concat(filter_term, "%'"); } if (filter_predicate === FILTER_PREDICATE_TYPE.NOT_CONTAIN) { return "`".concat(name, "` not ilike '%").concat(filter_term, "%'"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS) { return "`".concat(name, "` = '").concat(filter_term, "'"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_NOT) { return "`".concat(name, "` <> '").concat(filter_term, "'"); } return ''; }; // NUMBER | DURATION | RATE var numberSqlCondition = function numberSqlCondition(column, filterItem) { var name = column.name; var filter_predicate = filterItem.filter_predicate, filter_term = filterItem.filter_term; // recalculate duration date var value = filter_term; if (filter_predicate === FILTER_PREDICATE_TYPE.EMPTY) { return "`".concat(name, "` is null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.NOT_EMPTY) { return "`".concat(name, "` is not null"); } // filter_term is invalid if (!value && value !== 0) { return ''; } value = parseFloat(value); if (filter_predicate === FILTER_PREDICATE_TYPE.EQUAL) { return "`".concat(name, "` = ").concat(value); } if (filter_predicate === FILTER_PREDICATE_TYPE.NOT_EQUAL) { return "`".concat(name, "` <> ").concat(value); } if (filter_predicate === FILTER_PREDICATE_TYPE.LESS) { return "`".concat(name, "` < ").concat(value); } if (filter_predicate === FILTER_PREDICATE_TYPE.GREATER) { return "`".concat(name, "` > ").concat(value); } if (filter_predicate === FILTER_PREDICATE_TYPE.LESS_OR_EQUAL) { return "`".concat(name, "` <= ").concat(value); } if (filter_predicate === FILTER_PREDICATE_TYPE.GREATER_OR_EQUAL) { return "`".concat(name, "` >= ").concat(value); } return ''; }; // CHECK_BOX var checkboxSqlCondition = function checkboxSqlCondition(column, filterItem) { var name = column.name; var filter_term = filterItem.filter_term; if (!filter_term) { return "(`".concat(name, "` = ").concat(filter_term, " OR `").concat(name, "` is null)"); } return "`".concat(name, "` = ").concat(filter_term); }; // DATE var dateSqlCondition = function dateSqlCondition(column, filterItem) { var name = column.name; var filter_predicate = filterItem.filter_predicate, filter_term = filterItem.filter_term, filter_term_modifier = filterItem.filter_term_modifier; var filterLabel = [FILTER_PREDICATE_TYPE.EMPTY, FILTER_PREDICATE_TYPE.NOT_EMPTY]; if ((!filter_term || filter_term.length === 0) && filterLabel.indexOf(filter_predicate) < 0 && filter_term_modifier === FILTER_TERM_MODIFIER_TYPE.EXACT_DATE) { return ''; } if (filter_predicate === FILTER_PREDICATE_TYPE.IS) { var date = otherDate(filter_term_modifier, filter_term); var nextDate = dayjs(date).add(1, 'days').format('YYYY-MM-DD'); var targetDate = dayjs(date).format('YYYY-MM-DD'); return "`".concat(name, "` >= '").concat(targetDate, "' AND `").concat(name, "` < '").concat(nextDate, "'"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_WITHIN) { var _otherDate = otherDate(filter_term_modifier, filter_term), startDate = _otherDate.startDate, endDate = _otherDate.endDate; endDate = dayjs(endDate).format('YYYY-MM-DD'); startDate = dayjs(startDate).format('YYYY-MM-DD'); return "`".concat(name, "` >= '").concat(startDate, "' AND `").concat(name, "` <= '").concat(endDate, "'"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_BEFORE) { var _targetDate = otherDate(filter_term_modifier, filter_term); _targetDate = dayjs(_targetDate).format('YYYY-MM-DD'); return "`".concat(name, "` < '").concat(_targetDate, "' AND `").concat(name, "` is not null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_AFTER) { var _targetDate2 = otherDate(filter_term_modifier, filter_term); var _nextDate = dayjs(_targetDate2).add(1, 'days').format('YYYY-MM-DD'); return "`".concat(name, "` >= '").concat(_nextDate, "' AND `").concat(name, "` is not null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_ON_OR_BEFORE) { var _targetDate3 = otherDate(filter_term_modifier, filter_term); var _nextDate2 = dayjs(_targetDate3).add(1, 'days').format('YYYY-MM-DD'); return "`".concat(name, "` < '").concat(_nextDate2, "' AND `").concat(name, "` is not null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_ON_OR_AFTER) { var _targetDate4 = otherDate(filter_term_modifier, filter_term); _targetDate4 = dayjs(_targetDate4).format('YYYY-MM-DD'); return "`".concat(name, "` >= '").concat(_targetDate4, "' AND `").concat(name, "` is not null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_NOT) { var _targetDate5 = otherDate(filter_term_modifier, filter_term); var _startDate = dayjs(_targetDate5).subtract(1, 'days').format('YYYY-MM-DD'); var _endDate = dayjs(_targetDate5).add(1, 'days').format('YYYY-MM-DD'); return "(`".concat(name, "` >= '").concat(_endDate, "' OR `").concat(name, "` <= '").concat(_startDate, "') AND `").concat(name, "` is not null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.EMPTY) { return "`".concat(name, "` is null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.NOT_EMPTY) { return "`".concat(name, "` is not null"); } return ''; }; // CTIME | MTIME var ctimeSqlCondition = function ctimeSqlCondition(column, filterItem) { var name = column.name; var filter_predicate = filterItem.filter_predicate, filter_term = filterItem.filter_term, filter_term_modifier = filterItem.filter_term_modifier; var filterLabel = [FILTER_PREDICATE_TYPE.EMPTY, FILTER_PREDICATE_TYPE.NOT_EMPTY]; if ((!filter_term || filter_term.length === 0) && filterLabel.indexOf(filter_predicate) < 0 && filter_term_modifier === FILTER_TERM_MODIFIER_TYPE.EXACT_DATE) { return ''; } // in the following cases, filter_term is a number and no special treatment is required var specialTermModifier = [FILTER_TERM_MODIFIER_TYPE.NUMBER_OF_DAYS_AGO, FILTER_TERM_MODIFIER_TYPE.NUMBER_OF_DAYS_FROM_NOW, FILTER_TERM_MODIFIER_TYPE.THE_PAST_NUMBERS_OF_DAYS, FILTER_TERM_MODIFIER_TYPE.THE_NEXT_NUMBERS_OF_DAYS]; if (!specialTermModifier.includes(filter_term_modifier)) { // treat date as the start of the day filter_term = filter_term ? "".concat(filter_term, " 00:00:00") : ''; } if (filter_predicate === FILTER_PREDICATE_TYPE.IS) { var date = otherDate(filter_term_modifier, filter_term); var targetDate = dayjs(date).utc().format(); var nextDate = dayjs(date).add(1, 'day').utc().format(); return "`".concat(name, "` >= '").concat(targetDate, "' AND `").concat(name, "` < '").concat(nextDate, "'"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_WITHIN) { var _otherDate2 = otherDate(filter_term_modifier, filter_term), startDate = _otherDate2.startDate, endDate = _otherDate2.endDate; startDate = dayjs(startDate).utc().format(); endDate = dayjs(endDate).utc().format(); if (filter_term_modifier !== FILTER_TERM_MODIFIER_TYPE.THE_PAST_NUMBERS_OF_DAYS) { // when the interval value is taken, the end time is 24:00 of the day endDate = dayjs(endDate).add(24, 'hour').utc().format(); } return "`".concat(name, "` >= '").concat(startDate, "' AND `").concat(name, "` <= '").concat(endDate, "'"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_BEFORE) { var _targetDate6 = otherDate(filter_term_modifier, filter_term); _targetDate6 = dayjs(_targetDate6).utc().format(); return "`".concat(name, "` < '").concat(_targetDate6, "' AND `").concat(name, "` is not null"); } // after a certain day, it should start at 24:00 a certain day if (filter_predicate === FILTER_PREDICATE_TYPE.IS_AFTER) { var _targetDate7 = otherDate(filter_term_modifier, filter_term); _targetDate7 = dayjs(_targetDate7).add(24, 'hour').utc().format(); return "`".concat(name, "` > '").concat(_targetDate7, "'"); } // on or before a certain day, it should end at 24:00 on a certain day if (filter_predicate === FILTER_PREDICATE_TYPE.IS_ON_OR_BEFORE) { var _targetDate8 = otherDate(filter_term_modifier, filter_term); _targetDate8 = dayjs(_targetDate8).add(24, 'hour').utc().format(); return "`".concat(name, "` <= '").concat(_targetDate8, "' AND `").concat(name, "` is not null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_ON_OR_AFTER) { var _targetDate9 = otherDate(filter_term_modifier, filter_term); _targetDate9 = dayjs(_targetDate9).utc().format(); return "`".concat(name, "` >= '").concat(_targetDate9, "' AND `").concat(name, "` is not null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_NOT) { var _targetDate10 = otherDate(filter_term_modifier, filter_term); var _startDate2 = dayjs(_targetDate10).utc().format(); var _endDate2 = dayjs(_targetDate10).add(1, 'day').utc().format(); return "(`".concat(name, "` is null OR `").concat(name, "` >= '").concat(_endDate2, "' OR `").concat(name, "` <= '").concat(_startDate2, "')"); } if (filter_predicate === FILTER_PREDICATE_TYPE.EMPTY) { return "`".concat(name, "` is null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.NOT_EMPTY) { return "`".concat(name, "` is not null"); } return ''; }; // SINGLE-SELECT var singleSelectSqlCondition = function singleSelectSqlCondition(column, filterItem) { var filter_predicate = filterItem.filter_predicate, filter_term = filterItem.filter_term; var name = column.name, data = column.data; if (filter_predicate === FILTER_PREDICATE_TYPE.NOT_EMPTY) { return "`".concat(name, "` is not null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.EMPTY) { return "`".concat(name, "` is null"); } if (!filter_term) return ''; var options = data && data.options; if (!Array.isArray(options) || options.length === 0) return ''; if (filter_predicate === FILTER_PREDICATE_TYPE.IS) { if (typeof filter_term !== 'string') return ''; var option = options.find(function (item) { return item.id === filter_term; }); if (!option) return ''; return "`".concat(name, "` = '").concat(option.name, "'"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_NOT) { if (typeof filter_term !== 'string') return ''; var _option = options.find(function (item) { return item.id === filter_term; }); if (!_option) return ''; return "`".concat(name, "` <> '").concat(_option.name, "'"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_ANY_OF) { if (!Array.isArray(filter_term) || filter_term.length === 0) return ''; var selectedOptionsNames = filter_term.map(function (id) { var option = options.find(function (item) { return item.id === id; }); if (!option) return null; return "'".concat(option.name, "'"); }).filter(Boolean); if (selectedOptionsNames.length !== filter_term.length) return ''; // contains deleted option(s) return "`".concat(name, "` in (").concat(selectedOptionsNames.join(', '), ")"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_NONE_OF) { if (!Array.isArray(filter_term) || filter_term.length === 0) return ''; var _selectedOptionsNames = filter_term.map(function (id) { var option = options.find(function (item) { return item.id === id; }); if (!option) return null; return "'".concat(option.name, "'"); }).filter(Boolean); if (_selectedOptionsNames.length !== filter_term.length) return ''; // contains deleted option(s) return "`".concat(name, "` not in (").concat(_selectedOptionsNames.join(', '), ")"); } return ''; }; var getSpecificDepartmentIds = function getSpecificDepartmentIds(filter_term, currentUserDepartmentIdsOrSubIds) { var numberIds = filter_term.filter(function (id) { return typeof id === 'number'; }); var specificDepartmentIds = [].concat(_toConsumableArray(numberIds), _toConsumableArray(currentUserDepartmentIdsOrSubIds)); return specificDepartmentIds; }; // DEPARTMENT-SINGLE-SELECT var departmentSingleSelectSqlCondition = function departmentSingleSelectSqlCondition(column, filterItem, userDepartmentIdsMap) { var patchedUserDepartmentIdsMap = PatchUtils.getUserDepartmentIdsMap(userDepartmentIdsMap); var filter_predicate = filterItem.filter_predicate, filter_term = filterItem.filter_term; var name = column.name; if (filter_predicate === FILTER_PREDICATE_TYPE.NOT_EMPTY) { return "`".concat(name, "` is not null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.EMPTY) { return "`".concat(name, "` is null"); } // filter_term is invalid if (!filter_term || filter_term === 0) { return ''; } var currentUserDepartmentIds = patchedUserDepartmentIdsMap && patchedUserDepartmentIdsMap.current_user_department_ids; var currentUserDepartmentAndSubIds = patchedUserDepartmentIdsMap && patchedUserDepartmentIdsMap.current_user_department_and_sub_ids; var isValidCurrentUserDepartmentIds = Array.isArray(currentUserDepartmentIds); var isValidCurrentUserDepartmentAndSubIds = Array.isArray(currentUserDepartmentAndSubIds); if (filter_predicate === FILTER_PREDICATE_TYPE.IS) { if (filter_term === DEPARTMENT_SELECT_RANGE_MAP.CURRENT_USER_DEPARTMENT) { if (!isValidCurrentUserDepartmentIds) return ''; return "`".concat(name, "` in (").concat(currentUserDepartmentIds.join(', '), ")"); } if (filter_term === DEPARTMENT_SELECT_RANGE_MAP.CURRENT_USER_DEPARTMENT_AND_SUB) { if (!isValidCurrentUserDepartmentAndSubIds) return ''; return "`".concat(name, "` in (").concat(currentUserDepartmentAndSubIds.join(', '), ")"); } return "`".concat(name, "` = ").concat(filter_term); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_NOT) { if (filter_term === DEPARTMENT_SELECT_RANGE_MAP.CURRENT_USER_DEPARTMENT) { if (!isValidCurrentUserDepartmentIds) return ''; return "`".concat(name, "` not in (").concat(currentUserDepartmentIds.join(', '), ")"); } if (filter_term === DEPARTMENT_SELECT_RANGE_MAP.CURRENT_USER_DEPARTMENT_AND_SUB) { if (!isValidCurrentUserDepartmentAndSubIds) return ''; return "`".concat(name, "` not in (").concat(currentUserDepartmentAndSubIds.join(', '), ")"); } return "`".concat(name, "` <> ").concat(filter_term); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_ANY_OF) { if (!Array.isArray(filter_term) || filter_term.length === 0) return ''; if (filter_term.includes(DEPARTMENT_SELECT_RANGE_MAP.CURRENT_USER_DEPARTMENT_AND_SUB) && isValidCurrentUserDepartmentAndSubIds) { var _specificDepartmentIds = getSpecificDepartmentIds(filter_term, currentUserDepartmentAndSubIds); return "`".concat(name, "` in (").concat(_specificDepartmentIds.join(', '), ")"); } if (filter_term.includes(DEPARTMENT_SELECT_RANGE_MAP.CURRENT_USER_DEPARTMENT) && isValidCurrentUserDepartmentIds) { var _specificDepartmentIds2 = getSpecificDepartmentIds(filter_term, currentUserDepartmentIds); return "`".concat(name, "` in (").concat(_specificDepartmentIds2.join(', '), ")"); } var specificDepartmentIds = getSpecificDepartmentIds(filter_term, []); return "`".concat(name, "` in (").concat(specificDepartmentIds.join(', '), ")"); } if (filter_predicate === FILTER_PREDICATE_TYPE.IS_NONE_OF) { if (!Array.isArray(filter_term) || filter_term.length === 0) return ''; if (filter_term.includes(DEPARTMENT_SELECT_RANGE_MAP.CURRENT_USER_DEPARTMENT_AND_SUB) && isValidCurrentUserDepartmentAndSubIds) { var _specificDepartmentIds3 = getSpecificDepartmentIds(filter_term, currentUserDepartmentAndSubIds); return "`".concat(name, "` not in (").concat(_specificDepartmentIds3.join(', '), ")"); } if (filter_term.includes(DEPARTMENT_SELECT_RANGE_MAP.CURRENT_USER_DEPARTMENT) && isValidCurrentUserDepartmentIds) { var _specificDepartmentIds4 = getSpecificDepartmentIds(filter_term, currentUserDepartmentIds); return "`".concat(name, "` not in (").concat(_specificDepartmentIds4.join(', '), ")"); } var _specificDepartmentIds5 = getSpecificDepartmentIds(filter_term, []); return "`".concat(name, "` not in (").concat(_specificDepartmentIds5.join(', '), ")"); } return ''; }; var departmentMultipleSelectSqlCondition = function departmentMultipleSelectSqlCondition(column, filterItem, userDepartmentIdsMap) { var _ref2; var patchedUserDepartmentIdsMap = PatchUtils.getUserDepartmentIdsMap(userDepartmentIdsMap); var filterPredicate = filterItem.filter_predicate, filterTerm = filterItem.filter_term; var name = column.name; if (filterPredicate === FILTER_PREDICATE_TYPE.NOT_EMPTY) { return "`".concat(name, "` is not null"); } if (filterPredicate === FILTER_PREDICATE_TYPE.EMPTY) { return "`".concat(name, "` is null"); } // filter_term is invalid if (!Array.isArray(filterTerm) || filterTerm.length === 0) { return ''; } var _ref = patchedUserDepartmentIdsMap || {}, current_user_department_ids = _ref.current_user_department_ids, current_user_department_and_sub_ids = _ref.current_user_department_and_sub_ids; var normalizedFilterTerm = filterTerm; normalizedFilterTerm = (_ref2 = []).concat.apply(_ref2, _toConsumableArray(filterTerm.map(function (value) { if (value === DEPARTMENT_SELECT_RANGE_MAP.CURRENT_USER_DEPARTMENT) { return Array.isArray(current_user_department_ids) ? current_user_department_ids : []; } if (value === DEPARTMENT_SELECT_RANGE_MAP.CURRENT_USER_DEPARTMENT_AND_SUB) { return Array.isArray(current_user_department_and_sub_ids) ? current_user_department_and_sub_ids : []; } return value; }))); if (filterPredicate === FILTER_PREDICATE_TYPE.HAS_ANY_OF) { return "`".concat(name, "` in (").concat(normalizedFilterTerm.join(', '), ")"); } if (filterPredicate === FILTER_PREDICATE_TYPE.HAS_ALL_OF) { return "`".concat(name, "` has all of (").concat(normalizedFilterTerm.join(', '), ")"); } if (filterPredicate === FILTER_PREDICATE_TYPE.HAS_NONE_OF) { return "`".concat(name, "` has none of (").concat(normalizedFilterTerm.join(', '), ")"); } if (filterPredicate === FILTER_PREDICATE_TYPE.IS_EXACTLY) { return "`".concat(name, "` is exactly (").concat(normalizedFilterTerm.join(', '), ")"); } return ''; }; // MULTIPLE_SELECT var multipleSelectSqlCondition = function multipleSelectSqlCondition(column, filterItem) { var name = column.name, data = column.data; var filterPredicate = filterItem.filter_predicate, filterTerm = filterItem.filter_term; if (filterPredicate === FILTER_PREDICATE_TYPE.NOT_EMPTY) { return "`".concat(name, "` is not null"); } if (filterPredicate === FILTER_PREDICATE_TYPE.EMPTY) { return "`".concat(name, "` is null"); } var options = data && data.options; if (!Array.isArray(options) || options.length === 0) return ''; var selectedOptionIds = Array.isArray(filterTerm) ? filterTerm : []; var optionNames = selectedOptionIds.map(function (itemId) { var option = options.find(function (item) { return item.id === itemId; }); return option ? "'".concat(option.name, "'") : null; }).filter(Boolean); // empty/contains deleted option(s) if (optionNames.length === 0 || optionNames.length !== selectedOptionIds.length) { return ''; } if (filterPredicate === FILTER_PREDICATE_TYPE.HAS_ANY_OF) { return "`".concat(name, "` in (").concat(optionNames.join(', '), ")"); } if (filterPredicate === FILTER_PREDICATE_TYPE.HAS_ALL_OF) { return "`".concat(name, "` has all of (").concat(optionNames.join(', '), ")"); } if (filterPredicate === FILTER_PREDICATE_TYPE.HAS_NONE_OF) { return "`".concat(name, "` has none of (").concat(optionNames.join(', '), ")"); } if (filterPredicate === FILTER_PREDICATE_TYPE.IS_EXACTLY) { return "`".concat(name, "` is exactly (").concat(optionNames.join(', '), ")"); } return ''; }; // CREATOR | MODIFIER var creatorSqlCondition = function creatorSqlCondition(column, filterItem, username) { var filterPredicate = filterItem.filter_predicate, filterTerm = filterItem.filter_term; var name = column.name; if (filterPredicate === FILTER_PREDICATE_TYPE.INCLUDE_ME) { if (!username) { return "(`".concat(name, "` IS NULL AND `").concat(name, "` IS NOT NULL)"); } return "`".concat(name, "` = '").concat(username, "'"); } if (filterTerm && filterTerm.length === 0) { return ''; } if (filterPredicate === FILTER_PREDICATE_TYPE.IS) { return "`".concat(name, "` = '").concat(filterTerm, "'"); } if (filterPredicate === FILTER_PREDICATE_TYPE.IS_NOT) { return "`".concat(name, "` != '").concat(filterTerm, "'"); } var selectedCollaborators = filterTerm.map(function (item) { return "'".concat(item, "'"); }); if (filterPredicate === FILTER_PREDICATE_TYPE.CONTAINS) { return "`".concat(name, "` in (").concat(selectedCollaborators.join(','), ")"); } if (filterPredicate === FILTER_PREDICATE_TYPE.NOT_CONTAIN) { var items = selectedCollaborators.map(function (item) { return "`".concat(name, "` != ").concat(item); }); return "".concat(items.join(' AND ')); } return ''; }; // COLLABORATOR var collaboratorSqlCondition = function collaboratorSqlCondition(column, filterItem, username) { var name = column.name; var filterPredicate = filterItem.filter_predicate, filterTerm = filterItem.filter_term; var selectedCollaborators = filterTerm.map(function (item) { return "'".concat(item, "'"); }); if (selectedCollaborators.length === 0) { if (filterPredicate === FILTER_PREDICATE_TYPE.INCLUDE_ME) { if (!username) { return "(`".concat(name, "` IS NULL AND `").concat(name, "` IS NOT NULL)"); } return "`".concat(name, "` in ('").concat(username, "')"); } if (filterPredicate === FILTER_PREDICATE_TYPE.NOT_EMPTY) { return "`".concat(name, "` is not null"); } if (filterPredicate === FILTER_PREDICATE_TYPE.EMPTY) { return "`".concat(name, "` is null"); } return ''; } if (filterPredicate === FILTER_PREDICATE_TYPE.HAS_ANY_OF) { return "`".concat(name, "` in (").concat(selectedCollaborators.join(', '), ")"); } if (filterPredicate === FILTER_PREDICATE_TYPE.HAS_ALL_OF) { return "`".concat(name, "` has all of (").concat(selectedCollaborators.join(', '), ")"); } if (filterPredicate === FILTER_PREDICATE_TYPE.HAS_NONE_OF) { return "`".concat(name, "` has none of (").concat(selectedCollaborators.join(', '), ")"); } if (filterPredicate === FILTER_PREDICATE_TYPE.IS_EXACTLY) { return "`".concat(name, "` is exactly (").concat(selectedCollaborators.join(', '), ")"); } return ''; }; var fileSqlCondition = function fileSqlCondition(column, filterItem) { var filter_predicate = filterItem.filter_predicate; var name = column.name; if (filter_predicate === FILTER_PREDICATE_TYPE.NOT_EMPTY) { return "`".concat(name, "` is not null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.EMPTY) { return "`".concat(name, "` is null"); } return ''; }; var longtextSqlCondition = function longtextSqlCondition(column, filterItem) { var filter_predicate = filterItem.filter_predicate; var name = column.name; if (filter_predicate === FILTER_PREDICATE_TYPE.NOT_EMPTY) { return "`".concat(name, "` is not null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.EMPTY) { return "`".concat(name, "` is null"); } return ''; }; var arrayColumnCondition = function arrayColumnCondition(column, filterItem, userDepartmentIdsMap) { var name = column.name; var filter_predicate = filterItem.filter_predicate; if (filter_predicate === FILTER_PREDICATE_TYPE.EMPTY) { return "`".concat(name, "` is null"); } if (filter_predicate === FILTER_PREDICATE_TYPE.NOT_EMPTY) { return "`".concat(name, "` is not null"); } var _ref3 = column.data || {}, array_type = _ref3.array_type, array_data = _ref3.array_data; if (!array_type) return ''; // encapsulate a new column according to the calculation result var linkedColumn = { name: column.name, type: array_type, data: array_data }; // link with formula(string) | lookup with formula(string) if (array_type === FORMULA_RESULT_TYPE.STRING) { var newColumn = { name: column.name, type: CellType.TEXT }; return textSqlCondition(newColumn, filterItem); } // link with formula(bool) | lookup with formula(bool) if (array_type === FORMULA_RESULT_TYPE.BOOL) { var _newColumn = { name: column.name, type: CellType.CHECKBOX }; return checkboxSqlCondition(_newColumn, filterItem); } // using multiple value sql generator if (array_type === CellType.SINGLE_SELECT) { return multipleSelectSqlCondition(linkedColumn, filterItem); } if (array_type === CellType.DEPARTMENT_SINGLE_SELECT) { return departmentMultipleSelectSqlCondition(linkedColumn, filterItem, userDepartmentIdsMap); } if ([CellType.CREATOR, CellType.LAST_MODIFIER].includes(array_type)) { return collaboratorSqlCondition(linkedColumn, filterItem); } // generate the corresponding sql statement according to the type of the calculation result return getSqlConditionByFilter(linkedColumn, filterItem); }; // LINK var linkSqlCondition = function linkSqlCondition(column, filterItem, userDepartmentIdsMap) { return arrayColumnCondition(column, filterItem, userDepartmentIdsMap); }; // FORMULA | LINK-FORMULA var formulaSqlCondition = function formulaSqlCondition(column, filterItem, userDepartmentIdsMap) { var _ref4 = column.data || {}, result_type = _ref4.result_type; if (result_type === FORMULA_RESULT_TYPE.STRING) { // need to change the type of column to text var newColumn = { name: column.name, type: CellType.TEXT }; return textSqlCondition(newColumn, filterItem); } if (result_type === FORMULA_RESULT_TYPE.BOOL) { return checkboxSqlCondition(column, filterItem); } if (result_type === FORMULA_RESULT_TYPE.DATE) { return dateSqlCondition(column, filterItem); } if (result_type === FORMULA_RESULT_TYPE.NUMBER) { return numberSqlCondition(column, filterItem); } if (result_type === FORMULA_RESULT_TYPE.ARRAY) { return arrayColumnCondition(column, filterItem, userDepartmentIdsMap); } return ''; }; var getSqlConditionByFilter = function getSqlConditionByFilter(column, filterItem, username, userId, userDepartmentIdsMap) { var patchedUsername = PatchUtils.getUsername(username); var patchedUserId = PatchUtils.getUserId(userId); var patchedUserDepartmentIdsMap = PatchUtils.getUserDepartmentIdsMap(userDepartmentIdsMap); var type = column.type; if (type === CellType.TEXT || type === CellType.AUTO_NUMBER || type === CellType.EMAIL || type === CellType.GEOLOCATION || type === CellType.URL) { return textSqlCondition(column, filterItem, patchedUserId); } if (type === CellType.DURATION || type === CellType.NUMBER || type === CellType.RATE) { return numberSqlCondition(column, filterItem); } if (type === CellType.CHECKBOX) { return checkboxSqlCondition(column, filterItem); } if (type === CellType.DATE) { return dateSqlCondition(column, filterItem); } if (type === CellType.CTIME || type === CellType.MTIME) { return ctimeSqlCondition(column, filterItem); } if (type === CellType.SINGLE_SELECT) { return singleSelectSqlCondition(column, filterItem); } if (type === CellType.DEPARTMENT_SINGLE_SELECT) { return departmentSingleSelectSqlCondition(column, filterItem, patchedUserDepartmentIdsMap); } if (type === CellType.MULTIPLE_SELECT) { return multipleSelectSqlCondition(column, filterItem); } if (type === CellType.LAST_MODIFIER || type === CellType.CREATOR) { return creatorSqlCondition(column, filterItem, patchedUsername); } if (type === CellType.COLLABORATOR) { return collaboratorSqlCondition(column, filterItem, patchedUsername); } if (type === CellType.IMAGE || type === CellType.FILE || type === CellType.DIGITAL_SIGN) { return fileSqlCondition(column, filterItem); } if (type === CellType.LONG_TEXT) { return longtextSqlCondition(column, filterItem); } if (type === CellType.LINK) { return linkSqlCondition(column, filterItem, userDepartmentIdsMap); } if (type === CellType.FORMULA || type === CellType.LINK_FORMULA) { return formulaSqlCondition(column, filterItem, userDepartmentIdsMap); } return ''; }; /** * FilterGroup: {"filter_conjunction": "And", filters: [Filter, ...]} * Filter: {"column_key": "xxx", filter_predicate: "xxx", ...} * @param {array} filters * @param {object} table * @param {string} username * @param {string} userId * @param {object} userDepartmentIdsMap * @returns string */ var getSqlConditionsByFilters = function getSqlConditionsByFilters(filters, table, username, userId, userDepartmentIdsMap) { var columns = table.columns; var patchedUsername = PatchUtils.getUsername(username); var patchedUserId = PatchUtils.getUserId(userId); var patchedUserDepartmentIdsMap = PatchUtils.getUserDepartmentIdsMap(userDepartmentIdsMap); var sqlConditions = []; filters.forEach(function (filter) { if (checkIsFilterGroup(filter)) { var subFilters = filter.filters, sub_filter_conjunction = filter.filter_conjunction; var subSqlConditions = subFilters.map(function (subFilter) { var filterColumn = getTableColumnByKey(table, subFilter.column_key); return getSqlConditionByFilter(filterColumn, subFilter, patchedUsername, patchedUserId, patchedUserDepartmentIdsMap); }); var subSqlConditionsLength = subSqlConditions.length; if (subSqlConditionsLength > 0) { var subSqlConditionsString = subSqlConditions.length === 1 ? subSqlConditions + '' : "(".concat(subSqlConditions.join(' ' + sub_filter_conjunction + ' '), ")"); sqlConditions.push(subSqlConditionsString); } } else { var column_key = filter.column_key; var filterColumn = columns.find(function (column) { return column.key === column_key; }); sqlConditions.push(getSqlConditionByFilter(filterColumn, filter, patchedUsername, patchedUserId, patchedUserDepartmentIdsMap)); } }); return sqlConditions; }; var checkFilter = function checkFilter(filter, columns) { var _ValidateFilter$valid = ValidateFilter.validate(filter, columns), error_message = _ValidateFilter$valid.error_message; if (error_message) { if (error_message === FILTER_ERR_MSG.INCOMPLETE_FILTER) { return false; } throw new Error(error_message); } return true; }; var validateFilters = function validateFilters(filters, columns) { var validFilters = []; filters.forEach(function (filter) { if (checkIsFilterGroup(filter)) { var subFilters = filter.filters; if (!Array.isArray(subFilters) || subFilters.length === 0) { return; } var validSubFilters = subFilters.filter(function (subFilter) { return checkFilter(subFilter, columns); }); if (validSubFilters.length === 0) { return; } validFilters.push(_objectSpread(_objectSpread({}, filter), {}, { filters: validSubFilters })); } else { if (!checkFilter(filter, columns)) { return; } validFilters.push(filter); } }); return validFilters; }; var filter2SqlCondition = function filter2SqlCondition(table, view, username, userId, userDepartmentIdsMap) { var columns = table.columns; var _ref5 = view || {}, filter_conjunction = _ref5.filter_conjunction, filters = _ref5.filters; if (typeof filter_conjunction !== 'string' || !Array.isArray(filters) || filters.length === 0) { return ''; } var validFilters = []; try { validFilters = validateFilters(filters, columns); } catch (err) { throw new Error(err.message); } if (validFilters.length === 0) { return ''; } // 1. add WHERE condition var filterHeader = 'WHERE '; var stringList = getSqlConditionsByFilters(validFilters, table, username, userId, userDepartmentIdsMap); // 2. filtered '' sql clause stringList = stringList.filter(function (item) { return item && item.length > 0; }); if (stringList.length === 0) return ''; // 3. combine all sql clause // const filterContent = stringList.join(' ' + filter_conjunction + ' '); var filterContent = stringList[0]; for (var i = 1; i < stringList.length; i++) { var currStr = stringList[i]; if (currStr.startsWith('(') && currStr.endsWith(')')) { filterContent += " ".concat(filter_conjunction, " ").concat(stringList[i]); } else { filterContent += " ".concat(filter_conjunction, " (").concat(stringList[i], ")"); } } return filterHeader + filterContent; }; export { arrayColumnCondition, checkboxSqlCondition, collaboratorSqlCondition, creatorSqlCondition, ctimeSqlCondition, dateSqlCondition, departmentMultipleSelectSqlCondition, departmentSingleSelectSqlCondition, fileSqlCondition, filter2SqlCondition, formulaSqlCondition, getSqlConditionByFilter, getSqlConditionsByFilters, linkSqlCondition, longtextSqlCondition, multipleSelectSqlCondition, numberSqlCondition, singleSelectSqlCondition, textSqlCondition };