UNPKG

type-arango

Version:

ArangoDB Foxx decorators and utilities for TypeScript

101 lines 4.06 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.queryBuilder = exports.operators = exports.db = exports.arango = void 0; var utils_1 = require("../utils"); var index_1 = require("../index"); var is = utils_1.isFoxx(); var orders = ['ASC', 'DESC']; exports.arango = is ? require('@arangodb') : null; exports.db = is ? exports.arango.db : null; exports.operators = ['==', '!=', '<', '<=', '>', '>=', 'IN', 'NOT IN', 'LIKE', 'NOT LIKE', '=~', '!~', 'HAS']; function escape(val) { if (val === 'true') return true; if (val === 'false') return false; if (val === 'null') return null; if (Array.isArray(val)) return '["' + clean(val).join('","') + '"]'; switch (typeof val) { case 'string': return '"' + val + '"'; case 'number': case 'boolean': return val; default: throw { message: 'INVALID_ESCAPING', val: val }; } } function clean(val) { if (Array.isArray(val)) return val.map(function (v) { return clean(v); }); switch (typeof val) { default: case 'number': return val; case 'string': var indexOf = val.indexOf(' '); return (indexOf > -1 ? val.substr(0, indexOf) : val).replace(/[^a-zA-Z0-9-_.\[*\]]/g, ''); } } function queryBuilder(collection, _a) { var filter = _a.filter, sort = _a.sort, limit = _a.limit, aggregate = _a.aggregate, keep = _a.keep, unset = _a.unset; var q = ['FOR i IN ' + collection]; if (filter) { for (var _i = 0, _b = utils_1.toArray(filter); _i < _b.length; _i++) { var f = _b[_i]; var entries = Object.entries(f).filter(function (_a) { var key = _a[0]; return key !== '$'; }); if (!entries.length) continue; q.push("FILTER (" + entries.map(function (_a) { var key = _a[0], value = _a[1]; return ( // ['HAS', value] => FILTER value IN TO_ARRAY(i.key) Array.isArray(value) && value[0] === 'HAS' ? escape(value[1]) + " IN TO_ARRAY(i." + clean(key) + ")" // ['!=', value] => FILTER i.key != value : Array.isArray(value) && exports.operators.includes(value[0]) ? "i." + clean(key) + " " + value[0] + " " + escape(value[1]) // ['value1','value2'] => FILTER i.key IN [...values] : Array.isArray(value) ? "i." + clean(key) + " IN " + escape(value) // value => FILTER i.key == value : "i." + clean(key) + " == " + escape(value)); }).join(" " + (f.$ || '&&') + " ") + ")"); } } if (sort) { q.push('SORT i.' + (Array.isArray(sort) ? sort.map(function (s) { if (s.includes(' ')) { var _a = s.split(' '), a = _a[0], o = _a[1]; if (!orders.includes(o.toUpperCase())) o = orders[0]; return clean(a) + ' ' + o; } return clean(s) + ' ' + orders[0]; }).join(', i.') : clean(sort))); } if (limit) { limit = clean(limit); q.push('LIMIT ' + (Array.isArray(limit) ? limit.join(',') : limit)); } var ret = 'i'; if (keep) { keep = clean(keep); ret = "KEEP(i, \"" + keep.join('","') + "\")"; } else if (unset) { unset = clean(unset); ret = "UNSET(i, \"" + unset.join('","') + "\")"; } if (aggregate) { q.push("COLLECT AGGREGATE sum = SUM(" + (typeof aggregate === 'string' ? aggregate : 1) + ")"); q.push("RETURN sum"); } else q.push('RETURN ' + ret); index_1.logger.info('Query %o', q.join(' ')); return q.join('\n'); } exports.queryBuilder = queryBuilder; //# sourceMappingURL=arango.js.map