type-arango
Version:
ArangoDB Foxx decorators and utilities for TypeScript
101 lines • 4.06 kB
JavaScript
;
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