From 019d3eef43e9e4fcc091e034aef0586e1fbe384b Mon Sep 17 00:00:00 2001 From: lieenli Date: Thu, 6 Aug 2020 11:49:02 +0800 Subject: [PATCH 1/4] add op IN --- lib/resty/radixtree.lua | 10 ++++++++++ t/vars.t | 27 +++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/lib/resty/radixtree.lua b/lib/resty/radixtree.lua index 08402248..90c8cdda 100644 --- a/lib/resty/radixtree.lua +++ b/lib/resty/radixtree.lua @@ -492,6 +492,16 @@ local compare_funcs = { end return false end, + ["IN"] = function (l_v, r_v) + if type(r_v) == "array" then + for k,v in pairs(r_v) do + if v == l_v then + return true + end + end + end + return false + end, } diff --git a/t/vars.t b/t/vars.t index d33329a7..fdc869dd 100644 --- a/t/vars.t +++ b/t/vars.t @@ -498,3 +498,30 @@ GET /t?k=v [error] --- response_body metadata /aa + + + +=== TEST 9: IN: hit +--- config + location /t { + content_by_lua_block { + local radix = require("resty.radixtree") + local rx = radix.new({ + { + paths = "/aa", + metadata = "metadata /aa", + vars = { + {"arg_k", "IN", {'1','2'}}, + }, + } + }) + + ngx.say(rx:match("/aa", {vars = ngx.var})) + } + } +--- request +GET /t?k=1 +--- no_error_log +[error] +--- response_body +metadata /aa From 7097d04257e3ad49833349af82e24b8ba98b898b Mon Sep 17 00:00:00 2001 From: lieenli Date: Thu, 6 Aug 2020 14:07:58 +0800 Subject: [PATCH 2/4] add test case for IN operator --- README.md | 1 + lib/resty/radixtree.lua | 4 ++-- t/vars.t | 6 +++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 856046b6..9c787283 100644 --- a/README.md +++ b/README.md @@ -171,6 +171,7 @@ local rx = radix.new({ |> |greater than|{"arg_age", ">", 24}| |< |less than |{"arg_age", "<", 24}| |~~ |Regular match|{"arg_name", "~~", "[a-z]+"}| +|IN |find in array |{"arg_name", "IN", {"1","2"}}| [Back to TOC](#table-of-contents) diff --git a/lib/resty/radixtree.lua b/lib/resty/radixtree.lua index 90c8cdda..65017bae 100644 --- a/lib/resty/radixtree.lua +++ b/lib/resty/radixtree.lua @@ -493,8 +493,8 @@ local compare_funcs = { return false end, ["IN"] = function (l_v, r_v) - if type(r_v) == "array" then - for k,v in pairs(r_v) do + if type(r_v) == "table" then + for _,v in ipairs(r_v) do if v == l_v then return true end diff --git a/t/vars.t b/t/vars.t index fdc869dd..8e9d78af 100644 --- a/t/vars.t +++ b/t/vars.t @@ -501,7 +501,7 @@ metadata /aa -=== TEST 9: IN: hit +=== TEST 18: IN: hit --- config location /t { content_by_lua_block { @@ -517,6 +517,8 @@ metadata /aa }) ngx.say(rx:match("/aa", {vars = ngx.var})) + ngx.say(rx:match("/aa", {vars = {arg_k='2'}})) + ngx.say(rx:match("/aa", {vars = {arg_k='4'}})) } } --- request @@ -525,3 +527,5 @@ GET /t?k=1 [error] --- response_body metadata /aa +metadata /aa +nil From 9d9c7bfcbe9e5da814ea34e4df76c8887e730b4c Mon Sep 17 00:00:00 2001 From: lieenli Date: Thu, 6 Aug 2020 14:11:30 +0800 Subject: [PATCH 3/4] add nil in test cases --- t/vars.t | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/t/vars.t b/t/vars.t index 8e9d78af..f33499f5 100644 --- a/t/vars.t +++ b/t/vars.t @@ -519,6 +519,8 @@ metadata /aa ngx.say(rx:match("/aa", {vars = ngx.var})) ngx.say(rx:match("/aa", {vars = {arg_k='2'}})) ngx.say(rx:match("/aa", {vars = {arg_k='4'}})) + ngx.say(rx:match("/aa", {vars = {}})) + ngx.say(rx:match("/aa", {vars = {arg_k=nil}})) } } --- request @@ -529,3 +531,5 @@ GET /t?k=1 metadata /aa metadata /aa nil +nil +nil From 474b477239341a78e83d1e925e04cafa8337906f Mon Sep 17 00:00:00 2001 From: lieenli Date: Thu, 6 Aug 2020 18:59:55 +0800 Subject: [PATCH 4/4] supoort both IN and in --- README.md | 2 +- lib/resty/radixtree.lua | 23 +++++++++++++---------- t/vars.t | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 9c787283..714b4055 100644 --- a/README.md +++ b/README.md @@ -171,7 +171,7 @@ local rx = radix.new({ |> |greater than|{"arg_age", ">", 24}| |< |less than |{"arg_age", "<", 24}| |~~ |Regular match|{"arg_name", "~~", "[a-z]+"}| -|IN |find in array |{"arg_name", "IN", {"1","2"}}| +|in |find in array|{"arg_name", "in", {"1","2"}}| [Back to TOC](#table-of-contents) diff --git a/lib/resty/radixtree.lua b/lib/resty/radixtree.lua index 65017bae..de8adc63 100644 --- a/lib/resty/radixtree.lua +++ b/lib/resty/radixtree.lua @@ -456,6 +456,17 @@ local function compare_gin(l_v, r_v, opts) return true end +local function in_array(l_v, r_v) + if type(r_v) == "table" then + for _,v in ipairs(r_v) do + if v == l_v then + return true + end + end + end + return false +end + local compare_funcs = { ["=="] = function (l_v, r_v) if type(r_v) == "number" then @@ -492,16 +503,8 @@ local compare_funcs = { end return false end, - ["IN"] = function (l_v, r_v) - if type(r_v) == "table" then - for _,v in ipairs(r_v) do - if v == l_v then - return true - end - end - end - return false - end, + ["IN"] = in_array, + ["in"] = in_array, } diff --git a/t/vars.t b/t/vars.t index f33499f5..afa87662 100644 --- a/t/vars.t +++ b/t/vars.t @@ -511,7 +511,7 @@ metadata /aa paths = "/aa", metadata = "metadata /aa", vars = { - {"arg_k", "IN", {'1','2'}}, + {"arg_k", "in", {'1','2'}}, }, } })