minapp-fetch
Version:
412 lines (411 loc) • 19.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const constants_1 = require("../constants/constants");
const error_1 = require("../constants/error");
const utils_1 = require("./utils");
const error_2 = require("../constants/error");
function findTrans(params, r_num, BaaS_F, minapp) {
let rstring = `r${r_num === 1 ? '' : r_num}`;
if (!params[rstring]) {
return false;
}
let r = params[rstring].replace(/\s+/g, ''); //去掉空格
let query = {};
let checkR = r.replace(/[^\(\)]/g, '');
while (/\(\)/g.test(checkR)) {
checkR = checkR.replace(/\(\)/g, "");
}
//是否有多的括号,(
if (checkR) {
throw new Error('"' + checkR + '": ' + error_1.FIND_CHECKR_ERROR);
}
let stack = []; //栈
let topBrackets = ''; //最近的一个括号里的内容
let stackTop = ''; //栈顶的内容
let list = r.replace(/(\()|(\))/g, '#$1$2#').split(/#/g);
//1.将所有p转换成query类型
let ps = r.replace(/\(|\)/g, '').split(/&&|\|\|/g);
//BaaS平台
if (constants_1.PLATFORM_NAME_BAAS.indexOf(minapp) > -1) {
for (let i = 0; i < ps.length; i++) {
query[ps[i]] = new BaaS_F.Query();
if (!params[ps[i]])
throw new Error(error_2.FIND_NO_PJ_ERROR + ps[i]);
switch (params[ps[i]][1]) {
case 'in':
query[ps[i]].in(params[ps[i]][0], params[ps[i]][2]);
break;
case 'notIn':
query[ps[i]].notIn(params[ps[i]][0], params[ps[i]][2]);
break;
case 'contains':
query[ps[i]].contains(params[ps[i]][0], params[ps[i]][2]);
break;
case 'arrayContains':
query[ps[i]].arrayContains(params[ps[i]][0], params[ps[i]][2]);
break;
case 'matches':
query[ps[i]].matches(params[ps[i]][0], params[ps[i]][2]);
break;
case 'stringLength':
let reg;
if (params[ps[i]].length > 3) {
reg = new RegExp(`^.{${params[ps[i]][2]},${params[ps[i]][3]}}$`);
}
else {
reg = new RegExp(`^.{${params[ps[i]][2]}}$`);
}
query[ps[i]].matches(params[ps[i]][0], reg);
break;
case 'hasKey':
query[ps[i]].hasKey(params[ps[i]][0], params[ps[i]][2]);
break;
case 'include':
query[ps[i]].include(params[ps[i]][0], new BaaS_F.GeoPoint(params[ps[i]][2][0], params[ps[i]][2][1]));
break;
case 'withinCircle':
query[ps[i]].withinCircle(params[ps[i]][0], new BaaS_F.GeoPoint(params[ps[i]][2][0], params[ps[i]][2][1]), params[ps[i]][3]);
break;
case 'withinRegion':
query[ps[i]].withinRegion(params[ps[i]][0], new BaaS_F.GeoPoint(params[ps[i]][2][0], params[ps[i]][2][1]), params[ps[i]][3], params[ps[i]][4] || 0);
break;
case 'within':
let tempGeo = params[ps[i]];
tempGeo.splice(0, 2);
query[ps[i]].within(params[ps[i]][0], new BaaS_F.GeoPolygon(tempGeo));
break;
case 'isNull':
params[ps[i]][2] ? query[ps[i]].isNull(params[ps[i]][0]) : query[ps[i]].isNotNull(params[ps[i]][0]);
break;
case 'isExists':
params[ps[i]][2] ? query[ps[i]].exists(params[ps[i]][0]) : query[ps[i]].notExists(params[ps[i]][0]);
break;
case '=':
query[ps[i]].compare(params[ps[i]][0], '=', params[ps[i]][2]);
break;
case '!=':
query[ps[i]].compare(params[ps[i]][0], '!=', params[ps[i]][2]);
break;
case '<':
query[ps[i]].compare(params[ps[i]][0], '<', params[ps[i]][2]);
break;
case '<=':
query[ps[i]].compare(params[ps[i]][0], '<=', params[ps[i]][2]);
break;
case '>':
query[ps[i]].compare(params[ps[i]][0], '>', params[ps[i]][2]);
break;
case '>=':
query[ps[i]].compare(params[ps[i]][0], '>=', params[ps[i]][2]);
break;
default:
throw new Error(error_1.FIND_P_ERROR);
}
}
}
//Mongo 类平台
if (constants_1.PLATFORM_NAME_MONGO_SERVER.indexOf(minapp) > -1) {
if (minapp === constants_1.PLATFORM_NAME.WX_CLOUD
|| minapp === constants_1.PLATFORM_NAME.WX_WEAPP
|| minapp === constants_1.PLATFORM_NAME.UNI_CLOUD) {
let db = BaaS_F.database();
let dbCommand = db.command;
for (let i = 0; i < ps.length; i++) {
query[ps[i]] = {};
if (!params[ps[i]])
throw new Error(error_2.FIND_NO_PJ_ERROR + ps[i]);
switch (params[ps[i]][1]) {
case 'in':
let tm1 = {}, tm2 = {};
tm1[params[ps[i]][0]] = dbCommand.elemMatch(dbCommand.in(params[ps[i]][2]));
tm2[params[ps[i]][0]] = dbCommand.in(params[ps[i]][2]);
query[ps[i]] = dbCommand.or([tm1, tm2]);
break;
case 'notIn':
query[ps[i]][params[ps[i]][0]] = dbCommand.nin(params[ps[i]][2]);
break;
case 'contains':
throw new Error(`contains查寻:${error_2.METHOD_NOT_SUPPORT}`);
case 'arrayContains':
query[ps[i]][params[ps[i]][0]] = dbCommand.all(params[ps[i]][2]);
break;
case 'matches':
query[ps[i]][params[ps[i]][0]] = params[ps[i]][2];
break;
case 'stringLength':
let reg;
if (params[ps[i]].length > 3) {
reg = new RegExp(`^.{${params[ps[i]][2]},${params[ps[i]][3]}}$`);
}
else {
reg = new RegExp(`^.{${params[ps[i]][2]}}$`);
}
query[ps[i]][params[ps[i]][0]] = reg;
break;
case 'hasKey':
// query[ps[i]][params[ps[i]][0]] = {"$has_key": params[ps[i]][2]}
// break
throw new Error(`hasKey查寻:${error_2.METHOD_NOT_SUPPORT},你可以直接使用对象查寻,如:'user.name'查寻name`);
case 'include':
query[ps[i]][params[ps[i]][0]] = dbCommand.geoIntersects({
geometry: new db.Geo.Point(params[ps[i]][2][0], params[ps[i]][2][1])
});
break;
case 'withinCircle':
query[ps[i]][params[ps[i]][0]] = dbCommand.geoWithin({
centerSphere: [[params[ps[i]][2][0], params[ps[i]][2][1]], (params[ps[i]][3] || 1) / 6378.1]
});
break;
case 'withinRegion':
query[ps[i]][params[ps[i]][0]] = dbCommand.geoNear({
geometry: new db.Geo.Point(params[ps[i]][2][0], params[ps[i]][2][1]),
minDistance: params[ps[i]][4] || 0,
maxDistance: params[ps[i]][3]
});
break;
case 'within':
let { Point, LineString, Polygon } = db.Geo;
let tempArr = [...params[ps[i]]], tempPs = [];
tempArr.splice(0, 2);
for (let i = 0; i < tempArr.length; i++) {
tempPs.push(new Point(tempArr[i][0], tempArr[i][1]));
}
query[ps[i]][params[ps[i]][0]] = dbCommand.geoWithin({
geometry: new Polygon([new LineString(tempPs)])
});
break;
case 'isNull':
// query[ps[i]][params[ps[i]][0]] = {"$isnull": params[ps[i]][2]}
// break
throw new Error(`isNull查寻:${error_2.METHOD_NOT_SUPPORT}`);
case 'isExists':
query[ps[i]][params[ps[i]][0]] = dbCommand.exists(params[ps[i]][2]);
break;
case '=':
query[ps[i]][params[ps[i]][0]] = dbCommand.eq(params[ps[i]][2]);
break;
case '!=':
query[ps[i]][params[ps[i]][0]] = dbCommand.neq(params[ps[i]][2]);
break;
case '<':
query[ps[i]][params[ps[i]][0]] = dbCommand.lt(params[ps[i]][2]);
break;
case '<=':
query[ps[i]][params[ps[i]][0]] = dbCommand.lte(params[ps[i]][2]);
break;
case '>':
query[ps[i]][params[ps[i]][0]] = dbCommand.gt(params[ps[i]][2]);
break;
case '>=':
query[ps[i]][params[ps[i]][0]] = dbCommand.gte(params[ps[i]][2]);
break;
default:
throw new Error(error_1.FIND_P_ERROR);
}
}
}
}
//webapi op
if (minapp === constants_1.PLATFORM_NAME.ZX_WEBAPI || minapp === constants_1.PLATFORM_NAME.ZX_OP) {
for (let i = 0; i < ps.length; i++) {
query[ps[i]] = {};
if (!params[ps[i]])
throw new Error(error_2.FIND_NO_PJ_ERROR + ps[i]);
switch (params[ps[i]][1]) {
case 'in':
query[ps[i]][params[ps[i]][0]] = { "$in": params[ps[i]][2] };
break;
case 'notIn':
query[ps[i]][params[ps[i]][0]] = { "$nin": params[ps[i]][2] };
break;
case 'contains':
query[ps[i]][params[ps[i]][0]] = { "$contains": params[ps[i]][2] };
break;
case 'arrayContains':
query[ps[i]][params[ps[i]][0]] = { "$all": params[ps[i]][2] };
break;
case 'matches':
query[ps[i]][params[ps[i]][0]] = { "$regex": params[ps[i]][2] };
break;
case 'stringLength':
let reg;
if (params[ps[i]].length > 3) {
reg = new RegExp(`^.{${params[ps[i]][2]},${params[ps[i]][3]}}$`);
}
else {
reg = new RegExp(`^.{${params[ps[i]][2]}}$`);
}
query[ps[i]][params[ps[i]][0]] = { "$regex": reg };
break;
case 'hasKey':
query[ps[i]][params[ps[i]][0]] = { "$has_key": params[ps[i]][2] };
break;
case 'include':
query[ps[i]][params[ps[i]][0]] = { "$intersects": utils_1.changeFindGeoJson(params[ps[i]]) };
break;
case 'withinCircle':
query[ps[i]][params[ps[i]][0]] = { "$center": {
radius: params[ps[i]][3] || 1,
coordinates: [params[ps[i]][2][0], params[ps[i]][2][1]]
} };
break;
case 'withinRegion':
query[ps[i]][params[ps[i]][0]] = { "$nearsphere": {
geometry: utils_1.changeFindGeoJson(params[ps[i]]),
max_distance: params[ps[i]][3],
min_distance: params[ps[i]][4] || 0
} };
break;
case 'within':
query[ps[i]][params[ps[i]][0]] = { "$within": utils_1.changeFindGeoJson(params[ps[i]]) };
break;
case 'isNull':
query[ps[i]][params[ps[i]][0]] = { "$isnull": params[ps[i]][2] };
break;
case 'isExists':
query[ps[i]][params[ps[i]][0]] = { "$exists": params[ps[i]][2] };
break;
case '=':
query[ps[i]][params[ps[i]][0]] = { "$eq": params[ps[i]][2] };
break;
case '!=':
query[ps[i]][params[ps[i]][0]] = { "$ne": params[ps[i]][2] };
break;
case '<':
query[ps[i]][params[ps[i]][0]] = { "$lt": params[ps[i]][2] };
break;
case '<=':
query[ps[i]][params[ps[i]][0]] = { "$lte": params[ps[i]][2] };
break;
case '>':
query[ps[i]][params[ps[i]][0]] = { "$gt": params[ps[i]][2] };
break;
case '>=':
query[ps[i]][params[ps[i]][0]] = { "$gte": params[ps[i]][2] };
break;
default:
throw new Error(error_1.FIND_P_ERROR);
}
}
}
for (let i = 0; i < list.length; i++) {
if (list[i] === ')') {
//出栈
stackTop = stack.pop();
while (stackTop !== '(') {
topBrackets = stackTop + topBrackets;
stackTop = stack.pop();
}
//进行and,or
let tempArr = topBrackets.replace(/(&&)|(\|\|)/g, '#$1$2#').split(/#/g);
// [p9, &&, p8, ||, p32]
let tempQQ = query[tempArr[0]], n = 0;
//BaaS平台
if (constants_1.PLATFORM_NAME_BAAS.indexOf(minapp) > -1) {
while (n < tempArr.length - 1) {
if (tempArr[n + 1] === '&&') {
tempQQ = BaaS_F.Query.and(tempQQ, query[tempArr[n + 2]]);
}
if (tempArr[n + 1] === '||') {
tempQQ = BaaS_F.Query.or(tempQQ, query[tempArr[n + 2]]);
}
n += 2;
}
}
//Mongo 类平台
if (constants_1.PLATFORM_NAME_MONGO_SERVER.indexOf(minapp) > -1) {
if (minapp === constants_1.PLATFORM_NAME.WX_CLOUD
|| minapp === constants_1.PLATFORM_NAME.WX_WEAPP
|| minapp === constants_1.PLATFORM_NAME.UNI_CLOUD) {
let db = BaaS_F.database();
let dbCommand = db.command;
while (n < tempArr.length - 1) {
if (tempArr[n + 1] === '&&') {
tempQQ = dbCommand.and([tempQQ, query[tempArr[n + 2]]]);
}
if (tempArr[n + 1] === '||') {
tempQQ = dbCommand.or([tempQQ, query[tempArr[n + 2]]]);
}
n += 2;
}
}
}
//webapi op
if (minapp === constants_1.PLATFORM_NAME.ZX_WEBAPI || minapp === constants_1.PLATFORM_NAME.ZX_OP) {
while (n < tempArr.length - 1) {
if (tempArr[n + 1] === '&&') {
tempQQ = {
"$and": [tempQQ, query[tempArr[n + 2]]]
};
}
if (tempArr[n + 1] === '||') {
tempQQ = {
"$or": [tempQQ, query[tempArr[n + 2]]]
};
}
n += 2;
}
}
query[`pp${i}`] = tempQQ;
topBrackets = `pp${i}`;
stack.push(topBrackets);
topBrackets = '';
continue;
}
else {
//入栈
stack.push(list[i]);
}
}
let tempArr2 = stack.toString().replace(/,/g, '').replace(/(&&)|(\|\|)/g, '#$1$2#').split(/#/g);
// [p9, &&, pp8, ||, p32]
let QQ = query[tempArr2[0]], n = 0;
//BaaS平台
if (constants_1.PLATFORM_NAME_BAAS.indexOf(minapp) > -1) {
while (n < tempArr2.length - 1) {
if (tempArr2[n + 1] === '&&') {
QQ = BaaS_F.Query.and(QQ, query[tempArr2[n + 2]]);
}
if (tempArr2[n + 1] === '||') {
QQ = BaaS_F.Query.or(QQ, query[tempArr2[n + 2]]);
}
n += 2;
}
}
//Mongo 类平台
if (constants_1.PLATFORM_NAME_MONGO_SERVER.indexOf(minapp) > -1) {
if (minapp === constants_1.PLATFORM_NAME.WX_CLOUD
|| minapp === constants_1.PLATFORM_NAME.WX_WEAPP
|| minapp === constants_1.PLATFORM_NAME.UNI_CLOUD) {
let db = BaaS_F.database();
let dbCommand = db.command;
while (n < tempArr2.length - 1) {
if (tempArr2[n + 1] === '&&') {
QQ = dbCommand.and([QQ, query[tempArr2[n + 2]]]);
}
if (tempArr2[n + 1] === '||') {
QQ = dbCommand.or([QQ, query[tempArr2[n + 2]]]);
}
n += 2;
}
}
}
//webapi op
if (minapp === constants_1.PLATFORM_NAME.ZX_WEBAPI || minapp === constants_1.PLATFORM_NAME.ZX_OP) {
while (n < tempArr2.length - 1) {
if (tempArr2[n + 1] === '&&') {
QQ = {
"$and": [QQ, query[tempArr2[n + 2]]]
};
}
if (tempArr2[n + 1] === '||') {
QQ = {
"$or": [QQ, query[tempArr2[n + 2]]]
};
}
n += 2;
}
}
return QQ;
}
exports.default = findTrans;