From 19fc341306a1f691cb05894d9d10f92d5d6f0e15 Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Wed, 4 Oct 2017 14:13:22 +0100 Subject: Speed up cached_pass? for composite rules Both `Or` and `And` would evaluate whether each rule passed, then calculate a value based on the results of all of those. We can actually return early in many cases, without running the rule at all. --- lib/declarative_policy/rule.rb | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/declarative_policy/rule.rb b/lib/declarative_policy/rule.rb index bfcec241489..39fbe47b005 100644 --- a/lib/declarative_policy/rule.rb +++ b/lib/declarative_policy/rule.rb @@ -206,11 +206,13 @@ module DeclarativePolicy end def cached_pass?(context) - passes = @rules.map { |r| r.cached_pass?(context) } - return false if passes.any? { |p| p == false } - return true if passes.all? { |p| p == true } + @rules.each do |rule| + pass = rule.cached_pass?(context) - nil + return pass unless pass + end + + true end def repr @@ -245,11 +247,13 @@ module DeclarativePolicy end def cached_pass?(context) - passes = @rules.map { |r| r.cached_pass?(context) } - return true if passes.any? { |p| p == true } - return false if passes.all? { |p| p == false } + @rules.each do |rule| + pass = rule.cached_pass?(context) - nil + return pass if pass || pass.nil? + end + + false end def score(context) -- cgit v1.2.1