dogmaql.driver.redis
Version:
Redis driver for DogmaQL (Dogma Query Language).
84 lines (82 loc) • 5.88 kB
JavaScript
"use strict";
var _dogmalang = require("dogmalang");
const LuaTrans = _dogmalang.dogma.use(require("./LuaTrans"));const time = _dogmalang.dogma.use(require("./time"));
const luaTrans = LuaTrans();
const $DeleteTrans = class DeleteTrans {
constructor() {
{}
}
};
const DeleteTrans = new Proxy($DeleteTrans, { apply(receiver, self, args) {
return new $DeleteTrans(...args);
} });module.exports = exports = DeleteTrans;
DeleteTrans.prototype.transDropTable = function (stmt) {
_dogmalang.dogma.paramExpected("stmt", stmt, null);{
return _dogmalang.dogma.like(stmt.table, "^fts\\.") ? transDropFtsTable(stmt) : transDropTable(stmt);
}
};
function transDropTable(stmt) {
_dogmalang.dogma.paramExpected("stmt", stmt, null);{
return [["eval", "local tab = KEYS[1]\nif redis.call(\"exists\", \"db.tables:\" .. tab) then\n for _, key in ipairs(redis.call(\"keys\", tab .. \":*\")) do\n redis.call(\"del\", key)\n end\n\n redis.call(\"del\", \"db.tables:\" .. tab)\nend", 1, stmt.table]];
}
}
function transDropFtsTable(stmt) {
_dogmalang.dogma.paramExpected("stmt", stmt, null);{
return [["ft.drop", stmt.table]];
}
}
DeleteTrans.prototype.transDeleteItem = function (stmt) {
_dogmalang.dogma.paramExpected("stmt", stmt, null);{
return _dogmalang.dogma.like(stmt.table, "^ts\\.") ? transDeleteTsItem(stmt) : _dogmalang.dogma.like(stmt.table, "^fts\\.") ? transDeleteFtsItem(stmt) : transDeleteKvItem(stmt);
}
};
function transDeleteFtsItem(stmt) {
_dogmalang.dogma.paramExpected("stmt", stmt, null);{
return stmt.returnOld ? transDeleteFtsItemReturningOld(stmt) : transDeleteFtsItemNotReturningOld(stmt);
}
}
function transDeleteFtsItemReturningOld(stmt) {
_dogmalang.dogma.paramExpected("stmt", stmt, null);{
return [["eval", "local tab = ARGV[1]\nlocal key = tab .. \":\" .. KEYS[1]\nlocal item\nlocal doc = redis.call(\"ft.get\", tab, key)\nif doc then\n redis.call(\"ft.del\", tab, key)\n redis.call(\"del\", key)\n\n item = {}\n for i=1, #doc, 2 do\n item[doc[i]] = doc[i+1]\n end\nend\nreturn cjson.encode(item)", 1, _dogmalang.dogma.getItem(stmt.where, 0).value, stmt.table]];
}
}
function transDeleteFtsItemNotReturningOld(stmt) {
_dogmalang.dogma.paramExpected("stmt", stmt, null);{
return [["eval", "local tab = ARGV[1]\nlocal key = tab .. \":\" .. KEYS[1]\nif redis.call(\"ft.del\", tab, key) then\n redis.call(\"del\", key)\nend", 1, _dogmalang.dogma.getItem(stmt.where, 0).value, stmt.table]];
}
}
function transDeleteTsItem(stmt) {
_dogmalang.dogma.paramExpected("stmt", stmt, null);{
return (0, _dogmalang.len)(stmt.where) == 2 ? transDeleteTsItemByCompositeKey(stmt) : _dogmalang.dogma.getItem(stmt.where, 0).field == "time" ? transDeleteTsItemByTime(stmt) : transDeleteTsItemByKey(stmt);
}
}
function transDeleteTsItemByTime(stmt) {
_dogmalang.dogma.paramExpected("stmt", stmt, null);{
return [["eval", stmt.returnOld ? "local tab, init, fin = ARGV[1], ARGV[2], ARGV[3]\nlocal rslt = {}\n\nfor _, key in ipairs(redis.call(\"keys\", tab .. \":*\")) do\n local item = redis.call(\"zrangebyscore\", key, init, fin)[1]\n\n if item then\n redis.call(\"zremrangebyscore\", key, init, fin)\n table.insert(rslt, item)\n end\nend\n\nreturn rslt" : "local tab, init, fin = ARGV[1], ARGV[2], ARGV[3]\nfor _, key in ipairs(redis.call(\"keys\", tab .. \":*\")) do\n redis.call(\"zremrangebyscore\", key, init, fin)\nend", 0, stmt.table, ...time.formatRange(_dogmalang.dogma.getItem(stmt.where, 0).value)]];
}
}
function transDeleteTsItemByKey(stmt) {
_dogmalang.dogma.paramExpected("stmt", stmt, null);{
return stmt.returnOld ? [["eval", "local tab = ARGV[1]\nlocal key = tab .. \":\" .. KEYS[1]\nlocal items = redis.call(\"zrangebyscore\", key, \"-inf\", \"+inf\")\nredis.call(\"del\", key)\nreturn items", 1, _dogmalang.dogma.getItem(stmt.where, 0).value, stmt.table]] : [["del", stmt.table + ":" + _dogmalang.dogma.getItem(stmt.where, 0).value]];
}
}
function transDeleteTsItemByCompositeKey(stmt) {
_dogmalang.dogma.paramExpected("stmt", stmt, null);{
return stmt.returnOld ? [["eval", "local tab, init, fin = ARGV[1], ARGV[2], ARGV[3]\nlocal key = tab .. \":\" .. KEYS[1]\nlocal items = {}\n\nfor _, item in ipairs(redis.call(\"zrangebyscore\", key, init, fin)) do\n table.insert(items, item)\nend\n\nredis.call(\"zremrangebyscore\", key, init, fin)\n\nreturn items", 1, _dogmalang.dogma.getItem(stmt.where, 0).value, stmt.table, ...time.formatRange(_dogmalang.dogma.getItem(stmt.where, 1).value)]] : [["zremrangebyscore", stmt.table + ":" + _dogmalang.dogma.getItem(stmt.where, 0).value, ...time.formatRange(_dogmalang.dogma.getItem(stmt.where, 1).value)]];
}
}
function transDeleteKvItem(stmt) {
_dogmalang.dogma.paramExpected("stmt", stmt, null);{
return stmt.ifc ? transConditionalDeleteKvItem(stmt) : transSimpleDeleteKvItem(stmt);
}
}
function transSimpleDeleteKvItem(stmt) {
_dogmalang.dogma.paramExpected("stmt", stmt, null);{
return [stmt.returnOld ? ["eval", "local key = ARGV[1] .. \":\" .. KEYS[1]\nlocal item = redis.call(\"json.get\", key)\nif item then redis.call(\"del\", key) end\nreturn item", 1, _dogmalang.dogma.getItem(stmt.where, 0).value, stmt.table] : ["del", (0, _dogmalang.fmt)("%s:%s", stmt.table, _dogmalang.dogma.getItem(stmt.where, 0).value)]];
}
}
function transConditionalDeleteKvItem(stmt) {
_dogmalang.dogma.paramExpected("stmt", stmt, null);{
return [["eval", (0, _dogmalang.fmt)("local key = ARGV[1] .. \":\" .. KEYS[1]\nlocal item = redis.call(\"json.get\", key)\nlocal function checkCond()\n local type = type\n setfenv(1, cjson.decode(item))\n return %s\nend\n\nif item and checkCond() then\n redis.call(\"del\", key)\nelse\n item = nil\nend\n\n%s", luaTrans.transform(stmt.ifc), stmt.returnOld ? "return item" : ""), 1, _dogmalang.dogma.getItem(stmt.where, 0).value, stmt.table]];
}
}