summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean McGivern <sean@gitlab.com>2017-10-04 14:13:22 +0100
committerSean McGivern <sean@gitlab.com>2017-10-04 14:13:22 +0100
commit19fc341306a1f691cb05894d9d10f92d5d6f0e15 (patch)
treea7b803bfe3f4c0acd70b0d31d707f9b7c4f9c3d1
parentd7717192782232c14c4f16962ab450b08348a4c9 (diff)
downloadgitlab-ce-declarative-policy-optimisations.tar.gz
Speed up cached_pass? for composite rulesdeclarative-policy-optimisations
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.
-rw-r--r--lib/declarative_policy/rule.rb20
1 files 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)