UNPKG

dogmaql.driver.redis

Version:

Redis driver for DogmaQL (Dogma Query Language).

84 lines (82 loc) 5.88 kB
"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]]; } }