Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function getValidator(case)
- local cases = {
- ["$gt"] = function(key, row, value) --6 -- > 6
- return row[key] and row[key] > value;
- end,
- ["$gte"] = function(key, row, value) --6 -- >= 6
- return row[key] and row[key] >= value;
- end,
- ["$lt"] = function(key, row, value) --10 -- < 10
- return row[key] and row[key] < value;
- end,
- ["$lte"] = function(key, row, value) --10 -- <= 10
- return row[key] and row[key] <= value;
- end,
- ["$ne"] = function(key, row, value) --20 -- != 20
- return row[key] and row[key] ~= value;
- end,
- ["$eq"] = function(key, row, value) --3 -- = 3
- return row[key] and row[key] == value;
- end,
- ["$not"] = function(key, row, value) --true -- IS NOT TRUE
- return row[key] and not row[key];
- end,
- ["$between"] = function(key, row, values) --[6, 10] -- BETWEEN 6 AND 10
- if(type(values) ~= "table" or table.getn(values) ~= 2) then
- return false;
- end
- return row[key] and row[key] >= values[1] and row[key] <= values[2];
- end,
- ["$notBetween"] = function(key, row, values) --[11, 15] -- NOT BETWEEN 11 AND 15
- if(type(values) ~= "table" or table.getn(values) ~= 2) then
- return false;
- end
- return row[key] and row[key] <= values[1] and row[key] >= values[2];
- end,
- ["$in"] = function(key, row, values) --[1, 2] -- IN [1, 2]
- if(type(values) ~= "table" or not row[key]) then
- return false;
- end
- for index, value in pairs(value) do
- if(row[key] == value) then
- return true;
- end
- end
- return false;
- end,
- ["$notIn"] = function(key, row, values) --[1, 2] -- NOT IN [1, 2]
- if(type(values) ~= "table" or not row[key]) then
- return false;
- end
- for index, value in pairs(value) do
- if(row[key] == value) then
- return false;
- end
- end
- return true;
- end,
- };
- return cases[case] or false;
- end
- function checkConditions(key, rules, row)
- for index, rule in pairs(rules) do
- local operator = rule[1];
- local value = rule[2];
- local validator = getValidator(operator);
- if(type(validator) == "function" and not validator(key, row, value)) then
- return false;
- end
- end
- return true;
- end
- function createRuleFunction(key, rule, row)
- if (key == "$and") then
- return rebuildQuery(rule, row)
- elseif (key == "$or") then
- return rebuildQuery(rule, row)
- else
- return function()
- return checkConditions(key, rule, row);
- end
- end
- end
- function rebuildQuery(where, row)
- local newWhere = {};
- for key, rule in pairs(where) do
- local pos = table.getn(newWhere)+1;
- table.insert(newWhere, pos, { rule[1], createRuleFunction(rule[1], rule[2], row) })
- end
- return newWhere;
- end
- function concatOperation(oldFn, op, newFn)
- return function()
- if (op == "$or") then
- return oldFn() or newFn();
- elseif(op == "$and") then
- return oldFn() and newFn();
- else
- return oldFn();
- end
- end
- end
- function checkWhere(where)
- local builtFunction = nil;
- for index, rule in pairs(where) do
- if(type(rule[2]) == "function") then
- builtFunction = concatOperation(rule[2]);
- elseif (type(rule[2]) == "table") then
- builtFunction = concatOperation(builtFunction, rule[1], checkWhere(rule[2]));
- end
- end
- return builtFunction;
- end
- local tWhere = {
- { "TS",
- { { "$lt", 50 }, { "$gt", 10 } }
- },
- {
- "$or",
- {
- { "I", { { "$eq", 5 } } },
- { "$and", { { "AC", { { "$eq", 3 } } } } },
- }
- },
- {
- "$and",
- {
- { "GC", { { "$eq", 50 } } },
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement