提交 12f2fc56 编写于 作者: A Aaron Patterson

Merge pull request #15806 from tgxworld/partition_routes_during_setup

Partition routes during setup.
* Partitioning of routes is now done when the routes are being drawn. This
helps to decrease the time spent filtering the routes during the first request.
*Guo Xiang Tan*
* Fix regression in functional tests. Responses should have default headers
assigned.
......
......@@ -88,7 +88,7 @@ def simulator
end
def custom_routes
partitioned_routes.last
routes.custom_routes
end
def filter_routes(path)
......
......@@ -5,13 +5,14 @@ module Journey # :nodoc:
class Routes # :nodoc:
include Enumerable
attr_reader :routes, :named_routes
attr_reader :routes, :named_routes, :custom_routes, :anchored_routes
def initialize
@routes = []
@named_routes = {}
@ast = nil
@partitioned_routes = nil
@anchored_routes = []
@custom_routes = []
@simulator = nil
end
......@@ -30,18 +31,22 @@ def each(&block)
def clear
routes.clear
anchored_routes.clear
custom_routes.clear
named_routes.clear
end
def partitioned_routes
@partitioned_routes ||= routes.partition do |r|
r.path.anchored && r.ast.grep(Nodes::Symbol).all?(&:default_regexp?)
def partition_route(route)
if route.path.anchored && route.ast.grep(Nodes::Symbol).all?(&:default_regexp?)
anchored_routes << route
else
custom_routes << route
end
end
def ast
@ast ||= begin
asts = partitioned_routes.first.map(&:ast)
asts = anchored_routes.map(&:ast)
Nodes::Or.new(asts) unless asts.empty?
end
end
......@@ -60,6 +65,7 @@ def add_route(app, path, conditions, defaults, name = nil)
route.precedence = routes.length
routes << route
named_routes[name] = route if name && !named_routes[name]
partition_route(route)
clear_cache!
route
end
......@@ -68,7 +74,6 @@ def add_route(app, path, conditions, defaults, name = nil)
def clear_cache!
@ast = nil
@partitioned_routes = nil
@simulator = nil
end
end
......
......@@ -3,6 +3,10 @@
module ActionDispatch
module Journey
class TestRoutes < ActiveSupport::TestCase
setup do
@routes = Routes.new
end
def test_clear
routes = Routes.new
exp = Router::Strexp.build '/foo(/:id)', {}, ['/.?']
......@@ -36,6 +40,23 @@ def test_simulator_changes
assert_not_equal sim, routes.simulator
end
def test_partition_route
path = Path::Pattern.from_string '/hello'
anchored_route = @routes.add_route nil, path, {}, {}, {}
assert_equal [anchored_route], @routes.anchored_routes
assert_equal [], @routes.custom_routes
strexp = Router::Strexp.build(
"/hello/:who", { who: /\d/ }, ['/', '.', '?']
)
path = Path::Pattern.new strexp
custom_route = @routes.add_route nil, path, {}, {}, {}
assert_equal [custom_route], @routes.custom_routes
assert_equal [anchored_route], @routes.anchored_routes
end
def test_first_name_wins
routes = Routes.new
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册