UNPKG

dogmaql.driver.redis

Version:

Redis driver for DogmaQL (Dogma Query Language).

94 lines (91 loc) 5.41 kB
"use strict"; var _dogmalang = require("dogmalang"); var _dogmaql = require("dogmaql.syn"); const time = _dogmalang.dogma.use(require("./time")); const $InsertTrans = class InsertTrans { constructor() { {} } }; const InsertTrans = new Proxy($InsertTrans, { apply(receiver, self, args) { return new $InsertTrans(...args); } });module.exports = exports = InsertTrans; InsertTrans.prototype.transCreateTable = function (stmt) { let rslt = [];_dogmalang.dogma.paramExpected("stmt", stmt, null);{ for (let tab of stmt.tables) { if (_dogmalang.dogma.like(tab.table, "^ts\\.")) { _dogmalang.dogma.lshift(rslt, transCreateTsTable(tab)); } else if (_dogmalang.dogma.like(tab.table, "^fts\\.")) { _dogmalang.dogma.lshift(rslt, transCreateFtsTable(tab)); } else { _dogmalang.dogma.lshift(rslt, transCreateKvTable(tab)); } } }return rslt; }; function transCreateKvTable(tab) { _dogmalang.dogma.paramExpected("tab", tab, _dogmalang.map);{ return ["json.set", "db.tables:" + tab.table, ".", JSON.stringify({ ["table"]: tab.table, ["key"]: tab.key, ["ttl"]: (0, _dogmalang.bool)(tab.ttl) }), "NX"]; } } function transCreateTsTable(tab) { _dogmalang.dogma.paramExpected("tab", tab, _dogmalang.map);{ return ["json.set", "db.tables:" + tab.table, ".", JSON.stringify({ ["table"]: tab.table, ["key"]: tab.key }), "NX"]; } } function transCreateFtsTable(tab) { _dogmalang.dogma.paramExpected("tab", tab, _dogmalang.map);{ return ["ft.create", tab.table, "SCHEMA", ...(() => { let sch = [];{ for (let fld of tab.search) { _dogmalang.dogma.lshift(sch, fld);_dogmalang.dogma.lshift(sch, "text"); } }return sch; })()]; } } InsertTrans.prototype.transInsertItem = function (stmt) { _dogmalang.dogma.paramExpected("stmt", stmt, null);{ return (0, _dogmalang.len)(stmt.values) == 1 ? [transInsertItem(stmt, _dogmalang.dogma.getItem(stmt.values, 0).value)] : transInsertItems(stmt); } }; function transInsertItem(stmt, item) { _dogmalang.dogma.paramExpected("stmt", stmt, null);_dogmalang.dogma.paramExpected("item", item, null);{ return (stmt.type == _dogmaql.TableType.QUEUE ? transInsertQItem : _dogmalang.dogma.like(stmt.table, "^ts\\.") ? transInsertTsItem : _dogmalang.dogma.like(stmt.table, "^fts\\.") ? transInsertFtsItem : transInsertKvItem)(stmt, item); } } function transInsertQItem(stmt, item) { _dogmalang.dogma.paramExpected("stmt", stmt, null);_dogmalang.dogma.paramExpected("item", item, null);{ return ["publish", stmt.table, JSON.stringify(item)]; } } function transInsertKvItem(stmt, item) { _dogmalang.dogma.paramExpected("stmt", stmt, null);_dogmalang.dogma.paramExpected("item", item, null);{ return ["eval", "local tabName, item = ARGV[1], ARGV[2]\nlocal key = tabName .. \":\" .. KEYS[1]\nlocal tab\n\n--(1) get table metadata\ntab = redis.call(\"json.get\", \"db.tables:\" .. tabName)\nif not tab then error(\"table '\" .. tabName .. \"' doesn't exist.\") end\ntab = cjson.decode(tab)\n\n--(2) insert item\nif not redis.call(\"json.set\", key, \".\", item, \"NX\") then\n error(\"key already exists: \" .. key ..\".\")\nend\n\n--(3) set ttl if needed\nif tab.ttl and item.ttl ~= nil then\n redis.call(\"expireat\", key, item.ttl)\nend", 1, _dogmalang.dogma.getItem(item, _dogmalang.dogma.getItem((0, _dogmalang.keys)(item), 0)), stmt.table, JSON.stringify(item)]; } } function transInsertTsItem(stmt, item) { _dogmalang.dogma.paramExpected("stmt", stmt, null);_dogmalang.dogma.paramExpected("item", item, null);{ return ["eval", "local tab, time, item = ARGV[1], ARGV[2], ARGV[3]\nlocal key = tab .. \":\" .. KEYS[1]\n\n--(1) check whether table exists\nif not redis.call(\"exists\", \"db.tables:\" .. tab) then\n error(\"table '\" .. tab .. \"' doesn't exist.\")\nend\n\n--(2) insert item\nif redis.call(\"zadd\", key, \"nx\", time, item) == 0 then\n error(\"key already exists: \" .. key .. \".\")\nend", 1, _dogmalang.dogma.getItem(item, _dogmalang.dogma.getItem((0, _dogmalang.keys)(item), 0)), stmt.table, time.formatTime(_dogmalang.dogma.getItem(item, _dogmalang.dogma.getItem((0, _dogmalang.keys)(item), 1))), JSON.stringify(item)]; } } function transInsertFtsItem(stmt, item) { _dogmalang.dogma.paramExpected("stmt", stmt, null);_dogmalang.dogma.paramExpected("item", item, null);{ return ["ft.add", stmt.table, stmt.table + ":" + _dogmalang.dogma.getItem(item, _dogmalang.dogma.getItem((0, _dogmalang.keys)(item), 0)), 1, "language", _dogmalang.dogma.getItem({ ["ar"]: "arabic", ["da"]: "danish", ["de"]: "german", ["en"]: "english", ["es"]: "spanish", ["fi"]: "finnish", ["fr"]: "french", ["hu"]: "hungarian", ["it"]: "italian", ["nl"]: "dutch", ["no"]: "norwegian", ["pt"]: "portuguese", ["ro"]: "romanian", ["ru"]: "russian", ["sv"]: "swedish", ["tr"]: "turkish", ["zh"]: "chinese" }, item.lang) || "english", "fields", ...(() => { let fields = [];{ for (let [name, val] of Object.entries(item)) { { _dogmalang.dogma.lshift(fields, name);_dogmalang.dogma.lshift(fields, val); } } }return fields; })()]; } } function transInsertItems(stmt) { let cmds = [];_dogmalang.dogma.paramExpected("stmt", stmt, null);{ for (let item of stmt.values) { _dogmalang.dogma.lshift(cmds, transInsertItem(stmt, item.value)); } }return cmds; }