dtable-utils
Version:
dtable common utils
818 lines (784 loc) • 36.2 kB
JavaScript
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 };