mirror of
https://gitea.invidious.io/iv-org/shard-radix.git
synced 2024-08-15 00:43:21 +00:00
Correct lookup with shared key and glob
Properly skip nodes and continue lookup when the key to be looked up shares partial elements with others. With the following scenario: tree = Radix::Tree(Symbol).new tree.add "/*glob", :catch_all tree.add "/resources", :resources tree.add "/robots.txt", :robots When attempt to lookup for `/reviews`, it will now correctly return `:catch_all` as found. Fixes #23
This commit is contained in:
parent
edcdddcd73
commit
93247cd33a
3 changed files with 26 additions and 6 deletions
|
@ -6,6 +6,9 @@ so please check *Changed* and *Removed* notes before upgrading.
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Correct lookup issue caused by partial shared key with glob [#23](https://github.com/luislavena/radix/issues/23)
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
- Remove `Radix::Result#key` since exposes internal details about structure (breaking change)
|
- Remove `Radix::Result#key` since exposes internal details about structure (breaking change)
|
||||||
|
|
||||||
|
|
|
@ -451,6 +451,19 @@ module Radix
|
||||||
result.params.has_key?("anything").should be_true
|
result.params.has_key?("anything").should be_true
|
||||||
result.params["anything"].should eq("cancelled")
|
result.params["anything"].should eq("cancelled")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "does prefer root catch all over specific partially shared key" do
|
||||||
|
tree = Tree(Symbol).new
|
||||||
|
tree.add "/*anything", :root_catch_all
|
||||||
|
tree.add "/robots.txt", :robots
|
||||||
|
tree.add "/resources", :resources
|
||||||
|
|
||||||
|
result = tree.find("/reviews")
|
||||||
|
result.found?.should be_true
|
||||||
|
result.payload.should eq(:root_catch_all)
|
||||||
|
result.params.has_key?("anything").should be_true
|
||||||
|
result.params["anything"].should eq("reviews")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "dealing with named parameters" do
|
context "dealing with named parameters" do
|
||||||
|
|
|
@ -315,13 +315,17 @@ module Radix
|
||||||
node.children.each do |child|
|
node.children.each do |child|
|
||||||
# check if child key is a named parameter, catch all or shares parts
|
# check if child key is a named parameter, catch all or shares parts
|
||||||
# with new path
|
# with new path
|
||||||
if (child.key[0]? == '*' || child.key[0]? == ':') ||
|
if (child.glob? || child.named?) || _shared_key?(new_path, child.key)
|
||||||
_shared_key?(new_path, child.key)
|
# traverse branch to determine if valid
|
||||||
# consider this node for key but don't use payload
|
|
||||||
result.use node, payload: false
|
|
||||||
|
|
||||||
find new_path, result, child
|
find new_path, result, child
|
||||||
|
|
||||||
|
if result.found?
|
||||||
|
# stop iterating over nodes
|
||||||
return
|
return
|
||||||
|
else
|
||||||
|
# move to next child
|
||||||
|
next
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue