428 lines
13 KiB
JavaScript
428 lines
13 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.getAttrRefInExpression = exports.execOp = exports.opMultipleParams = exports.isExpression = exports.isAggrExpression = exports.isStringExpression = exports.isMathExpression = exports.isCompareExpression = exports.isBoolExpression = exports.isLogicExpression = exports.isDateExpression = exports.isGeoExpression = void 0;
|
|
var tslib_1 = require("tslib");
|
|
var assert_1 = tslib_1.__importDefault(require("assert"));
|
|
var dayjs_1 = tslib_1.__importDefault(require("dayjs"));
|
|
var weekOfYear_1 = tslib_1.__importDefault(require("dayjs/plugin/weekOfYear"));
|
|
var dayOfYear_1 = tslib_1.__importDefault(require("dayjs/plugin/dayOfYear"));
|
|
var geo_1 = require("../utils/geo");
|
|
dayjs_1.default.extend(weekOfYear_1.default);
|
|
dayjs_1.default.extend(dayOfYear_1.default);
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
;
|
|
function isGeoExpression(expression) {
|
|
if (Object.keys(expression).length == 1) {
|
|
var op = Object.keys(expression)[0];
|
|
if (['$contains', '$distance'].includes(op)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
exports.isGeoExpression = isGeoExpression;
|
|
function isDateExpression(expression) {
|
|
if (Object.keys(expression).length == 1) {
|
|
var op = Object.keys(expression)[0];
|
|
if (['$year', '$month', '$weekday', '$weekOfYear', '$day', '$dayOfMonth',
|
|
'$dayOfWeek', '$dayOfYear', '$dateDiff', '$dateCeil', '$dateFloor'].includes(op)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
exports.isDateExpression = isDateExpression;
|
|
function isLogicExpression(expression) {
|
|
if (Object.keys(expression).length == 1) {
|
|
var op = Object.keys(expression)[0];
|
|
if (['$and', '$or', '$not'].includes(op)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
exports.isLogicExpression = isLogicExpression;
|
|
function isBoolExpression(expression) {
|
|
if (Object.keys(expression).length == 1) {
|
|
var op = Object.keys(expression)[0];
|
|
if (['$true', '$false'].includes(op)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
exports.isBoolExpression = isBoolExpression;
|
|
function isCompareExpression(expression) {
|
|
if (Object.keys(expression).length == 1) {
|
|
var op = Object.keys(expression)[0];
|
|
if (['$gt', '$lt', '$gte', '$lte', '$eq', '$ne',
|
|
'$startsWith', '$endsWith', '$includes'].includes(op)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
exports.isCompareExpression = isCompareExpression;
|
|
function isMathExpression(expression) {
|
|
if (Object.keys(expression).length == 1) {
|
|
var op = Object.keys(expression)[0];
|
|
if (['$add', '$subtract', '$multiply', '$divide', '$abs', '$pow',
|
|
'$round', '$floor', '$ceil'].includes(op)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
exports.isMathExpression = isMathExpression;
|
|
function isStringExpression(expression) {
|
|
if (Object.keys(expression).length == 1) {
|
|
var op = Object.keys(expression)[0];
|
|
if (['$concat'].includes(op)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
exports.isStringExpression = isStringExpression;
|
|
function isAggrExpression(expression) {
|
|
if (Object.keys(expression).length == 1) {
|
|
var op = Object.keys(expression)[0];
|
|
if (['$$max', '$$min', '$$sum', '$$avg', '$$count'].includes(op)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
exports.isAggrExpression = isAggrExpression;
|
|
function isExpression(expression) {
|
|
return typeof expression === 'object' && Object.keys(expression).length === 1 && Object.keys(expression)[0].startsWith('$');
|
|
}
|
|
exports.isExpression = isExpression;
|
|
function opMultipleParams(op) {
|
|
return !['$year', '$month', '$weekday', '$weekOfYear', '$day', '$dayOfMonth',
|
|
'$dayOfWeek', '$dayOfYear', '$not', '$true', '$false', '$abs',
|
|
'$round', '$floor', '$ceil', '$$max', '$$min', '$$sum', '$$avg', '$$count'].includes(op);
|
|
}
|
|
exports.opMultipleParams = opMultipleParams;
|
|
function execOp(op, params, obscure) {
|
|
var e_1, _a, e_2, _b;
|
|
if (obscure && (params === undefined || params.includes(undefined))) {
|
|
return true;
|
|
}
|
|
switch (op) {
|
|
case '$gt': {
|
|
return params[0] > params[1];
|
|
}
|
|
case '$lt': {
|
|
return params[0] < params[1];
|
|
}
|
|
case '$gte': {
|
|
return params[0] >= params[1];
|
|
}
|
|
case '$lte': {
|
|
return params[0] <= params[1];
|
|
}
|
|
case '$eq': {
|
|
return params[0] === params[1];
|
|
}
|
|
case '$ne': {
|
|
return params[0] !== params[1];
|
|
}
|
|
case '$startsWith': {
|
|
return params[0].startsWith(params[1]);
|
|
}
|
|
case '$endsWith': {
|
|
return params[0].endsWith(params[1]);
|
|
}
|
|
case '$includes': {
|
|
return params[0].includes(params[1]);
|
|
}
|
|
case '$add': {
|
|
if (typeof params[0] === 'number') {
|
|
var result_1 = 0;
|
|
params.forEach(function (ele) { return result_1 += ele; });
|
|
return result_1;
|
|
}
|
|
else {
|
|
var result_2 = '';
|
|
params.forEach(function (ele) { return result_2 += ele; });
|
|
return result_2;
|
|
}
|
|
}
|
|
case '$subtract': {
|
|
return params[0] - params[1];
|
|
}
|
|
case '$multiply': {
|
|
var result_3 = 1;
|
|
params.forEach(function (ele) { return result_3 = result_3 * ele; });
|
|
return result_3;
|
|
}
|
|
case '$divide': {
|
|
return params[0] / params[1];
|
|
}
|
|
case '$abs': {
|
|
return Math.abs(params);
|
|
}
|
|
case '$round': {
|
|
return Math.round(params);
|
|
}
|
|
case '$ceil': {
|
|
return Math.ceil(params);
|
|
}
|
|
case '$floor': {
|
|
return Math.floor(params);
|
|
}
|
|
case '$round': {
|
|
return Math.round(params);
|
|
}
|
|
case '$pow': {
|
|
return Math.pow(params[0], params[1]);
|
|
}
|
|
case '$true': {
|
|
return !!params;
|
|
}
|
|
case '$false':
|
|
case '$not': {
|
|
return !params;
|
|
}
|
|
case '$and': {
|
|
try {
|
|
for (var params_1 = tslib_1.__values(params), params_1_1 = params_1.next(); !params_1_1.done; params_1_1 = params_1.next()) {
|
|
var p = params_1_1.value;
|
|
if (!p) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
finally {
|
|
try {
|
|
if (params_1_1 && !params_1_1.done && (_a = params_1.return)) _a.call(params_1);
|
|
}
|
|
finally { if (e_1) throw e_1.error; }
|
|
}
|
|
return true;
|
|
}
|
|
case '$or': {
|
|
try {
|
|
for (var params_2 = tslib_1.__values(params), params_2_1 = params_2.next(); !params_2_1.done; params_2_1 = params_2.next()) {
|
|
var p = params_2_1.value;
|
|
if (!!p) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
finally {
|
|
try {
|
|
if (params_2_1 && !params_2_1.done && (_b = params_2.return)) _b.call(params_2);
|
|
}
|
|
finally { if (e_2) throw e_2.error; }
|
|
}
|
|
return false;
|
|
}
|
|
case '$year': {
|
|
var value = (0, dayjs_1.default)(params);
|
|
return value.year();
|
|
}
|
|
case '$month': {
|
|
var value = (0, dayjs_1.default)(params);
|
|
return value.month();
|
|
}
|
|
case '$weekday': {
|
|
var value = (0, dayjs_1.default)(params);
|
|
return value.day(); // 0~6
|
|
}
|
|
case '$weekOfYear': {
|
|
var value = (0, dayjs_1.default)(params);
|
|
return value.week();
|
|
}
|
|
case '$day':
|
|
case '$dayOfMonth': {
|
|
var value = (0, dayjs_1.default)(params);
|
|
return value.date();
|
|
}
|
|
case '$dayOfWeek': {
|
|
var value = (0, dayjs_1.default)(params);
|
|
return value.day(); // 0~6
|
|
}
|
|
case '$dayOfYear': {
|
|
var value = (0, dayjs_1.default)(params);
|
|
return value.dayOfYear(); // 0~6
|
|
}
|
|
case '$dateDiff': {
|
|
var value1 = (0, dayjs_1.default)(params[0]);
|
|
var value2 = (0, dayjs_1.default)(params[1]);
|
|
switch (params[2]) {
|
|
case 'y':
|
|
case 'M':
|
|
case 'd':
|
|
case 'h':
|
|
case 'm':
|
|
case 's': {
|
|
return value1.diff(value2, params[2]);
|
|
}
|
|
default: {
|
|
(0, assert_1.default)(false);
|
|
}
|
|
}
|
|
}
|
|
case '$dateCeil': {
|
|
var value = (0, dayjs_1.default)(params[0]);
|
|
switch (params[1]) {
|
|
case 'y': {
|
|
return value.startOf('year').millisecond();
|
|
}
|
|
case 'M': {
|
|
return value.startOf('month').millisecond();
|
|
}
|
|
case 'd': {
|
|
return value.startOf('day').millisecond();
|
|
}
|
|
case 'h': {
|
|
return value.startOf('hour').millisecond();
|
|
}
|
|
case 'm': {
|
|
return value.startOf('minute').millisecond();
|
|
}
|
|
case 's': {
|
|
return value.startOf('second').millisecond();
|
|
}
|
|
default: {
|
|
(0, assert_1.default)(false);
|
|
}
|
|
}
|
|
}
|
|
case '$dateFloor': {
|
|
var value = (0, dayjs_1.default)(params[0]);
|
|
switch (params[1]) {
|
|
case 'y': {
|
|
return value.endOf('year').millisecond();
|
|
}
|
|
case 'M': {
|
|
return value.endOf('month').millisecond();
|
|
}
|
|
case 'd': {
|
|
return value.endOf('day').millisecond();
|
|
}
|
|
case 'h': {
|
|
return value.endOf('hour').millisecond();
|
|
}
|
|
case 'm': {
|
|
return value.endOf('minute').millisecond();
|
|
}
|
|
case 's': {
|
|
return value.endOf('second').millisecond();
|
|
}
|
|
default: {
|
|
(0, assert_1.default)(false);
|
|
}
|
|
}
|
|
}
|
|
case '$distance': {
|
|
var _c = tslib_1.__read(params, 2), geo1 = _c[0], geo2 = _c[1];
|
|
var type1 = geo1.type, coordinate1 = geo1.coordinate;
|
|
var type2 = geo2.type, coordinate2 = geo2.coordinate;
|
|
if (type1 !== 'point' || type2 !== 'point') {
|
|
throw new Error('目前只支持point类型的距离运算');
|
|
}
|
|
return (0, geo_1.getDistanceBetweenPoints)(coordinate1[1], coordinate1[0], coordinate2[1], coordinate2[0]);
|
|
}
|
|
case '$contains': {
|
|
throw new Error('$contains类型未实现');
|
|
}
|
|
case '$concat': {
|
|
return params.join('');
|
|
}
|
|
default: {
|
|
(0, assert_1.default)(false, "\u4E0D\u80FD\u8BC6\u522B\u7684expression\u8FD0\u7B97\u7B26\uFF1A".concat(op));
|
|
}
|
|
}
|
|
}
|
|
exports.execOp = execOp;
|
|
/**
|
|
* 检查一个表达式,并分析其涉及到的属性
|
|
* @param expression
|
|
* @returns {
|
|
* '#current': [当前结点涉及的属性]
|
|
* 'node-1': [node-1结点上涉及的属性]
|
|
* }
|
|
*/
|
|
function getAttrRefInExpression(expression) {
|
|
var _a;
|
|
var result = (_a = {},
|
|
_a['#current'] = [],
|
|
_a);
|
|
var check = function (node) {
|
|
var _a, e_3, _b;
|
|
if (node['#attr']) {
|
|
result['#current'].push(node['#attr']);
|
|
}
|
|
else if (node['#refAttr']) {
|
|
if (result[node['#refId']]) {
|
|
result[node['#refId']].push(node['#refAttr']);
|
|
}
|
|
else {
|
|
Object.assign(result, (_a = {},
|
|
_a[node['#refId']] = [node['#refAttr']],
|
|
_a));
|
|
}
|
|
}
|
|
else if (node instanceof Array) {
|
|
try {
|
|
for (var node_1 = tslib_1.__values(node), node_1_1 = node_1.next(); !node_1_1.done; node_1_1 = node_1.next()) {
|
|
var subNode = node_1_1.value;
|
|
check(subNode);
|
|
}
|
|
}
|
|
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
finally {
|
|
try {
|
|
if (node_1_1 && !node_1_1.done && (_b = node_1.return)) _b.call(node_1);
|
|
}
|
|
finally { if (e_3) throw e_3.error; }
|
|
}
|
|
}
|
|
else if (typeof node === 'object') {
|
|
for (var attr in node) {
|
|
check(node[attr]);
|
|
}
|
|
}
|
|
};
|
|
check(expression);
|
|
return result;
|
|
}
|
|
exports.getAttrRefInExpression = getAttrRefInExpression;
|