Advertisement
Guest User

Untitled

a guest
Jan 19th, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.85 KB | None | 0 0
  1. function getValidator(case)
  2.   local cases = {
  3.     ["$gt"] = function(key, row, value)           --6         -- > 6
  4.       return row[key] and row[key] > value;
  5.     end,
  6.     ["$gte"] = function(key, row, value)          --6         -- >= 6
  7.       return row[key] and row[key] >= value;
  8.     end,
  9.     ["$lt"] =  function(key, row, value)          --10        -- < 10
  10.       return row[key] and row[key] < value;
  11.     end,
  12.     ["$lte"] = function(key, row, value)          --10        -- <= 10
  13.       return row[key] and row[key] <= value;
  14.     end,
  15.     ["$ne"] =  function(key, row, value)          --20        -- != 20
  16.       return row[key] and row[key] ~= value;
  17.     end,
  18.     ["$eq"] =  function(key, row, value)          --3         -- = 3
  19.       return row[key] and row[key] == value;
  20.     end,
  21.     ["$not"] = function(key, row, value)          --true      -- IS NOT TRUE
  22.       return row[key] and not row[key];
  23.     end,
  24.     ["$between"] = function(key, row, values)      --[6, 10]   -- BETWEEN 6 AND 10
  25.       if(type(values) ~= "table" or table.getn(values) ~= 2) then
  26.         return false;
  27.       end
  28.       return row[key] and row[key] >= values[1] and row[key] <= values[2];
  29.     end,
  30.     ["$notBetween"] = function(key, row, values)   --[11, 15]  -- NOT BETWEEN 11 AND 15
  31.       if(type(values) ~= "table" or table.getn(values) ~= 2) then
  32.         return false;
  33.       end
  34.       return row[key] and row[key] <= values[1] and row[key] >= values[2];
  35.     end,
  36.     ["$in"] = function(key, row, values)           --[1, 2]    -- IN [1, 2]
  37.       if(type(values) ~= "table" or not row[key]) then
  38.         return false;
  39.       end
  40.       for index, value in pairs(value) do
  41.         if(row[key] == value) then
  42.           return true;
  43.         end
  44.       end
  45.       return false;
  46.     end,
  47.     ["$notIn"] = function(key, row, values)        --[1, 2]    -- NOT IN [1, 2]
  48.       if(type(values) ~= "table" or not row[key]) then
  49.         return false;
  50.       end
  51.       for index, value in pairs(value) do
  52.         if(row[key] == value) then
  53.           return false;
  54.         end
  55.       end
  56.       return true;
  57.     end,
  58.   };
  59.  
  60.   return cases[case] or false;
  61. end
  62.  
  63. function checkConditions(key, rules, row)
  64.   for index, rule in pairs(rules) do
  65.     local operator = rule[1];
  66.     local value = rule[2];
  67.     local validator = getValidator(operator);
  68.     if(type(validator) == "function" and not validator(key, row, value)) then
  69.       return false;
  70.     end
  71.   end
  72.   return true;
  73. end
  74.  
  75. function createRuleFunction(key, rule, row)
  76.   if (key == "$and") then
  77.     return rebuildQuery(rule, row)
  78.   elseif (key == "$or") then
  79.     return rebuildQuery(rule, row)
  80.   else
  81.     return function()
  82.       return checkConditions(key, rule, row);
  83.     end
  84.   end
  85. end
  86.  
  87. function rebuildQuery(where, row)
  88.   local newWhere = {};
  89.   for key, rule in pairs(where) do
  90.     local pos = table.getn(newWhere)+1;
  91.     table.insert(newWhere, pos, { rule[1], createRuleFunction(rule[1], rule[2], row) })
  92.     end
  93.   return newWhere;
  94. end
  95.  
  96. function concatOperation(oldFn, op, newFn)
  97.   return function()
  98.     if (op == "$or") then
  99.       return oldFn() or newFn();
  100.     elseif(op == "$and") then
  101.       return oldFn() and newFn();
  102.     else
  103.       return oldFn();
  104.     end
  105.   end
  106. end
  107.  
  108. function checkWhere(where)
  109.   local builtFunction = nil;
  110.   for index, rule in pairs(where) do
  111.     if(type(rule[2]) == "function") then
  112.       builtFunction = concatOperation(rule[2]);
  113.     elseif (type(rule[2]) == "table") then
  114.       builtFunction = concatOperation(builtFunction, rule[1], checkWhere(rule[2]));
  115.     end
  116.     end
  117.   return builtFunction;
  118. end
  119.  
  120. local tWhere = {
  121.   { "TS",
  122.     { { "$lt", 50 }, { "$gt", 10 } }
  123.   },
  124.   {
  125.     "$or",
  126.     {
  127.       {  "I",  { { "$eq",  5 } } },
  128.       {  "$and",  { {  "AC",  { { "$eq", 3 } }  } } },
  129.     }
  130.   },
  131.   {
  132.     "$and",
  133.     {
  134.       {  "GC",  { { "$eq",  50 } } },
  135.     }
  136.   }
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement