access-db
Version:
[统一数据库的连接]Unified access to all kinds of databases
413 lines (412 loc) • 13 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.fastdbSort = exports.RedisSortStr = exports.RedisSortNum = exports.stringTimeNumSort = exports.changeSqlParam = exports.changeFindGeoJson = exports.changeSetManyParams = exports.changeSetParams = exports.cloneDeep = exports.isNumber = exports.isArray = exports.isJson = exports.isMongodbObjectId = void 0;
const error_1 = require("../constants/error");
const isMongodbObjectId = (value) => {
if (!value)
throw new Error(error_1.ID_EMPTY_ERROR);
return value._bsontype === 'ObjectID';
};
exports.isMongodbObjectId = isMongodbObjectId;
const isJson = (value) => {
return typeof (value) === 'object';
};
exports.isJson = isJson;
//isArray属于isJson
const isArray = (value) => {
return Object.prototype.toString.call(value) === '[object Array]';
};
exports.isArray = isArray;
const isNumber = (value) => {
return typeof (value) === 'number' && !isNaN(value);
};
exports.isNumber = isNumber;
// 检查polygon是否对
const isPolygonArr = (arr) => {
if ((arr.length < 4) || (arr[0][0] !== arr[arr.length - 1][0]) || (arr[0][1] !== arr[arr.length - 1][1])) {
throw new Error(error_1.GEO_POLYGON_ERROR);
}
else {
return true;
}
};
// 目前仅支持对象或数字的拷贝
const cloneDeep = (source) => {
if (source === undefined || source === null)
return Object.create(null);
const target = (0, exports.isArray)(source) ? [] : Object.create(Object.getPrototypeOf(source));
for (const keys in source) {
if (source.hasOwnProperty(keys)) {
if (source[keys] && typeof source[keys] === 'object') {
target[keys] = (0, exports.isArray)(source[keys]) ? [] : {};
target[keys] = (0, exports.cloneDeep)(source[keys]);
}
else {
target[keys] = source[keys];
}
}
}
return target;
};
exports.cloneDeep = cloneDeep;
// 返回新增的对象,geopoint化
const changeSetParams = (params) => {
let changeData = params;
for (let p in params) {
if ((0, exports.isArray)(params[p])) {
if (params[p][0] === 'geo') {
if ((0, exports.isArray)(params[p][1])) {
let temp = params[p];
temp.shift();
if (temp.length > 1) {
isPolygonArr(temp);
changeData[p] = (0, exports.cloneDeep)({
type: 'Polygon',
coordinates: [temp]
});
}
else {
changeData[p] = (0, exports.cloneDeep)({
type: 'Point',
coordinates: temp[0]
});
}
}
}
}
}
return changeData;
};
exports.changeSetParams = changeSetParams;
const changeSetManyParams = (params) => {
let change = [];
for (let i = 0; i < params.length; i++) {
change.push((0, exports.changeSetParams)(params[i]));
}
return change;
};
exports.changeSetManyParams = changeSetManyParams;
// 返回geojson
const changeFindGeoJson = (lparams) => {
let temp = [];
if (lparams[1] === 'within') {
lparams.splice(0, 2);
isPolygonArr(lparams);
temp = (0, exports.cloneDeep)({
type: 'Polygon',
coordinates: [lparams]
});
}
else {
temp = (0, exports.cloneDeep)({
type: 'Point',
coordinates: lparams[2]
});
}
return temp;
};
exports.changeFindGeoJson = changeFindGeoJson;
// 返回mysql语句的参数类型
const changeSqlParam = (param) => {
let result = `'${param}'`;
if (param) {
// param 存在
if ((0, exports.isNumber)(param)) {
result = param;
}
if (typeof (param) === 'string') {
result = `'${param.replace("'", "\\\'")}'`;
}
if (typeof (param) === 'boolean') {
result = 'TRUE';
}
}
else {
// param 为否 可能为 null '' 0 false
if (typeof (param) === 'undefined') {
result = `''`;
}
if (typeof (param) === 'string') {
result = `''`;
}
if (typeof (param) === 'number' && !isNaN(param)) {
result = 0;
}
if (typeof (param) === 'boolean') {
result = 'FALSE';
}
if (typeof (param) === 'object') {
result = 'NULL';
}
}
return result;
};
exports.changeSqlParam = changeSqlParam;
// 快速排序,推荐,用于redis默认排序,默认的存入的时间先后
const stringTimeNumSort = (arr, list) => {
function main(arr, left, right, list) {
if (arr.length === 1) {
return;
}
let index = partition(arr, left, right, list);
if (left < index - 1) {
main(arr, left, index - 1, list);
}
if (index < right) {
main(arr, index, right, list);
}
}
function partition(arr, left, right, list) {
let pivot = arr[Math.floor((left + right) / 2)];
while (left <= right) {
while (arr[left] > pivot) {
left++;
}
while (arr[right] < pivot) {
right--;
}
if (left <= right) {
let temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
temp = list[right];
list[right] = list[left];
list[left] = temp;
left++;
right--;
}
}
return left;
}
let left = 0, right = arr.length - 1;
main(arr, left, right, list);
return list;
};
exports.stringTimeNumSort = stringTimeNumSort;
// 按数组对象的值,数字,降序排列,用于redis
const RedisSortNum = (arr, key, isUp = 1) => {
if (isUp === 1) {
function main(arr, left, right) {
if (arr.length === 1) {
return;
}
let index = partition(arr, left, right);
if (left < index - 1) {
main(arr, left, index - 1);
}
if (index < right) {
main(arr, index, right);
}
}
function partition(arr, left, right) {
let pivot = +(arr[Math.floor((left + right) / 2)][key] || 0);
while (left <= right) {
while (+(arr[left][key] || 0) < pivot) {
left++;
}
while (+(arr[right][key] || 0) > pivot) {
right--;
}
if (left <= right) {
let temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
left++;
right--;
}
}
return left;
}
let left = 0, right = arr.length - 1;
main(arr, left, right);
return arr;
}
else {
function main(arr, left, right) {
if (arr.length === 1) {
return;
}
let index = partition(arr, left, right);
if (left < index - 1) {
main(arr, left, index - 1);
}
if (index < right) {
main(arr, index, right);
}
}
function partition(arr, left, right) {
let pivot = +(arr[Math.floor((left + right) / 2)][key] || 0);
while (left <= right) {
while (+(arr[left][key] || 0) > pivot) {
left++;
}
while (+(arr[right][key] || 0) < pivot) {
right--;
}
if (left <= right) {
let temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
left++;
right--;
}
}
return left;
}
let left = 0, right = arr.length - 1;
main(arr, left, right);
return arr;
}
};
exports.RedisSortNum = RedisSortNum;
// 按数组对象的值,降序排列,用于redis
const RedisSortStr = (arr, key, isUp = 1) => {
if (isUp === 1) {
function main(arr, left, right) {
if (arr.length === 1) {
return;
}
let index = partition(arr, left, right);
if (left < index - 1) {
main(arr, left, index - 1);
}
if (index < right) {
main(arr, index, right);
}
}
function partition(arr, left, right) {
let pivot = arr[Math.floor((left + right) / 2)][key];
while (left <= right) {
while (arr[left][key] < pivot) {
left++;
}
while (arr[right][key] > pivot) {
right--;
}
if (left <= right) {
let temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
left++;
right--;
}
}
return left;
}
let left = 0, right = arr.length - 1;
main(arr, left, right);
return arr;
}
else {
function main(arr, left, right) {
if (arr.length === 1) {
return;
}
let index = partition(arr, left, right);
if (left < index - 1) {
main(arr, left, index - 1);
}
if (index < right) {
main(arr, index, right);
}
}
function partition(arr, left, right) {
let pivot = arr[Math.floor((left + right) / 2)][key];
while (left <= right) {
while (arr[left][key] > pivot) {
left++;
}
while (arr[right][key] < pivot) {
right--;
}
if (left <= right) {
let temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
left++;
right--;
}
}
return left;
}
let left = 0, right = arr.length - 1;
main(arr, left, right);
return arr;
}
};
exports.RedisSortStr = RedisSortStr;
// 排序 find,fastdb
const fastdbSort = (arr, key, isUp = 1) => {
if (isUp === 1) {
function main(arr, left, right) {
if (arr.length === 1) {
return;
}
let index = partition(arr, left, right);
if (left < index - 1) {
main(arr, left, index - 1);
}
if (index < right) {
main(arr, index, right);
}
}
function partition(arr, left, right) {
let pivot = arr[Math.floor((left + right) / 2)][key];
while (left <= right) {
while (arr[left][key] < pivot) {
left++;
}
while (arr[right][key] > pivot) {
right--;
}
if (left <= right) {
let temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
left++;
right--;
}
}
return left;
}
let left = 0, right = arr.length - 1;
main(arr, left, right);
}
else {
function main(arr, left, right) {
if (arr.length === 1) {
return;
}
let index = partition(arr, left, right);
if (left < index - 1) {
main(arr, left, index - 1);
}
if (index < right) {
main(arr, index, right);
}
}
function partition(arr, left, right) {
let pivot = arr[Math.floor((left + right) / 2)][key];
while (left <= right) {
while (arr[left][key] > pivot) {
left++;
}
while (arr[right][key] < pivot) {
right--;
}
if (left <= right) {
let temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
left++;
right--;
}
}
return left;
}
let left = 0, right = arr.length - 1;
main(arr, left, right);
}
return arr;
};
exports.fastdbSort = fastdbSort;