diff --git a/modules/reitit-core/java-src/reitit/SegmentTrie.java b/modules/reitit-core/java-src/reitit/SegmentTrie.java index fd6c6b30..ffd42936 100644 --- a/modules/reitit-core/java-src/reitit/SegmentTrie.java +++ b/modules/reitit-core/java-src/reitit/SegmentTrie.java @@ -106,17 +106,21 @@ public class SegmentTrie { if (!catchAll.isEmpty()) { m = new CatchAllMatcher(catchAll.keySet().iterator().next(), data); } else if (!wilds.isEmpty()) { - List matchers = new ArrayList<>(); - if (data != null) { - matchers.add(new DataMatcher(data)); + if(wilds.size() == 1 && data == null && childs.isEmpty()) { + m = new WildMatcher(wilds.keySet().iterator().next(), wilds.values().iterator().next().matcher()); + } else { + List matchers = new ArrayList<>(); + if (data != null) { + matchers.add(new DataMatcher(data)); + } + if (!childs.isEmpty()) { + matchers.add(staticMatcher()); + } + for (Map.Entry e : wilds.entrySet()) { + matchers.add(new WildMatcher(e.getKey(), e.getValue().matcher())); + } + m = new LinearMatcher(matchers); } - if (!childs.isEmpty()) { - matchers.add(staticMatcher()); - } - for (Map.Entry e : wilds.entrySet()) { - matchers.add(new WildMatcher(e.getKey(), e.getValue().matcher())); - } - m = new LinearMatcher(matchers); } else if (!childs.isEmpty()) { m = staticMatcher(); if (data != null) { @@ -305,14 +309,11 @@ public class SegmentTrie { public static void main(String[] args) { SegmentTrie trie = new SegmentTrie(); - trie.add("/:abba", 1); - trie.add("/abba/1", 2); - trie.add("/:abba/:dabba/doo", 3); - trie.add("/abba/:dabba/boo", 4); + trie.add("/repos/:owner/:repo/stargazers", 1); Matcher m = trie.matcher(); System.err.println(m); System.err.println(m.getClass()); - System.out.println(lookup(m, "/abba")); + System.out.println(lookup(m, "/repos/metosin/reitit/stargazers")); /* SegmentTrie trie = new SegmentTrie(); trie.add("/user/:id/profile/:type", 1); diff --git a/perf-test/clj/reitit/go_perf_test.clj b/perf-test/clj/reitit/go_perf_test.clj index 1114f573..a2961bc1 100644 --- a/perf-test/clj/reitit/go_perf_test.clj +++ b/perf-test/clj/reitit/go_perf_test.clj @@ -327,6 +327,7 @@ ;; 830ns (faster decode params) ;; 560µs (java-segment-router) ;; 490ns (java-segment-router, no injects) + ;; 440ns (java-segment-router, no injects, single-wild-optimization) (let [req (map->Req {:request-method :get, :uri "/repos/julienschmidt/httprouter/stargazers"})] (title "param") (assert (= {:status 200, :body "/repos/:owner/:repo/stargazers"} (app req))) @@ -337,6 +338,7 @@ ;; 160µs (faster decode params) ;; 120µs (java-segment-router) ;; 100µs (java-segment-router, no injects) + ;; 90µs (java-segment-router, no injects, single-wild-optimization) (let [requests (mapv route->req routes)] (title "all") (cc/quick-bench