dogmaql.driver.redis
Version:
Redis driver for DogmaQL (Dogma Query Language).
94 lines (91 loc) • 5.41 kB
JavaScript
"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;
}