UNPKG

minapp-fetch

Version:
412 lines (411 loc) 19.1 kB
"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;