diff --git a/doc/advanced/different_routers.md b/doc/advanced/different_routers.md index 24f205b4..aa7b78ae 100644 --- a/doc/advanced/different_routers.md +++ b/doc/advanced/different_routers.md @@ -5,10 +5,10 @@ Reitit ships with several different implementations for the `Router` protocol, o | router | description | | ------------------------------|-------------| | `:linear-router` | Matches the routes one-by-one starting from the top until a match is found. Slow, but works with all route trees. -| `:segment-router` | Router that creates a optimized [search trie](https://en.wikipedia.org/wiki/Trie) out of an route table. Much faster than `:linear-router` for wildcard routes. Valid only if there are no [Route conflicts](../basics/route_conflicts.md). +| `:trie-router` | Router that creates a optimized [search trie](https://en.wikipedia.org/wiki/Trie) out of an route table. Much faster than `:linear-router` for wildcard routes. Valid only if there are no [Route conflicts](../basics/route_conflicts.md). | `:lookup-router` | Fast router, uses hash-lookup to resolve the route. Valid if no paths have path or catch-all parameters and there are no [Route conflicts](../basics/route_conflicts.md). | `:single-static-path-router` | Super fast router: string-matches a route. Valid only if there is one static route. -| `:mixed-router` | Contains two routers: `:segment-router` for wildcard routes and a `:lookup-router` or `:single-static-path-router` for static routes. Valid only if there are no [Route conflicts](../basics/route_conflicts.md). +| `:mixed-router` | Contains two routers: `:trie-router` for wildcard routes and a `:lookup-router` or `:single-static-path-router` for static routes. Valid only if there are no [Route conflicts](../basics/route_conflicts.md). | `:quarantine-router` | Contains two routers: `:mixed-router` for non-conflicting routes and a `:linear-router` for conflicting routes. The router name can be asked from the router: diff --git a/modules/reitit-core/src/reitit/core.cljc b/modules/reitit-core/src/reitit/core.cljc index 207382a1..307ba91e 100644 --- a/modules/reitit-core/src/reitit/core.cljc +++ b/modules/reitit-core/src/reitit/core.cljc @@ -252,11 +252,11 @@ (if-let [match (impl/fast-get lookup name)] (match (impl/path-params path-params)))))))) -(defn segment-router - "Creates a special prefix-tree style segment router from resolved routes and optional +(defn trie-router + "Creates a special prefix-tree router from resolved routes and optional expanded options. See [[router]] for available options." ([compiled-routes] - (segment-router compiled-routes {})) + (trie-router compiled-routes {})) ([compiled-routes opts] (let [names (find-names compiled-routes opts) [pl nl] (reduce @@ -276,7 +276,7 @@ (reify Router (router-name [_] - :segment-router) + :trie-router) (routes [_] routes) (compiled-routes [_] @@ -345,7 +345,7 @@ ([compiled-routes opts] (let [{wild true, lookup false} (group-by impl/wild-route? compiled-routes) ->static-router (if (= 1 (count lookup)) single-static-path-router lookup-router) - wildcard-router (segment-router wild opts) + wildcard-router (trie-router wild opts) static-router (->static-router lookup opts) names (find-names compiled-routes opts) routes (uncompile-routes compiled-routes)] @@ -446,7 +446,7 @@ (and (= 1 (count compiled-routes)) (not wilds?)) single-static-path-router path-conflicting quarantine-router (not wilds?) lookup-router - all-wilds? segment-router + all-wilds? trie-router :else mixed-router)] (when-let [validate (:validate opts)] diff --git a/modules/reitit-core/src/reitit/trie.cljc b/modules/reitit-core/src/reitit/trie.cljc index 7ef8e481..aa4fb2fc 100644 --- a/modules/reitit-core/src/reitit/trie.cljc +++ b/modules/reitit-core/src/reitit/trie.cljc @@ -35,7 +35,9 @@ (concat ss (-static from to)) (condp = (get s to) \{ (let [to' (or (str/index-of s "}" to) (throw (ex-info (str "Unbalanced brackets: " (pr-str s)) {})))] - (recur (concat ss (-static from to) (-wild to to')) (inc to') (inc to'))) + (if (= \* (get s (inc to))) + (recur (concat ss (-static from to) (-catch-all (inc to) to')) (inc to') (inc to')) + (recur (concat ss (-static from to) (-wild to to')) (inc to') (inc to')))) \: (let [to' (or (str/index-of s "/" to) (count s))] (recur (concat ss (-static from to) (-wild to to')) to' to')) \* (let [to' (count s)] diff --git a/test/cljc/reitit/core_test.cljc b/test/cljc/reitit/core_test.cljc index 12ceee64..d81e6c19 100644 --- a/test/cljc/reitit/core_test.cljc +++ b/test/cljc/reitit/core_test.cljc @@ -103,7 +103,7 @@ (is (= nil (matches "")))))) r/linear-router :linear-router - r/segment-router :segment-router + r/trie-router :trie-router r/mixed-router :mixed-router r/quarantine-router :quarantine-router)) @@ -142,7 +142,7 @@ r/lookup-router :lookup-router r/single-static-path-router :single-static-path-router r/linear-router :linear-router - r/segment-router :segment-router + r/trie-router :trie-router r/mixed-router :mixed-router r/quarantine-router :quarantine-router))