diff options
author | Ryuta Kamizono <kamipo@gmail.com> | 2019-01-18 22:58:54 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-18 22:58:54 +0900 |
commit | ff3d1a42d5800c999be7351b72317cefb5961ee8 (patch) | |
tree | aebed0f35655dd073c8d7e271c56726ef171d3fb /activerecord/lib/arel/predications.rb | |
parent | 92cc996a09b7ffd5908c3c6771484fdf82e8729a (diff) | |
parent | c196ca72a0dfbea5f1730f830ea20a9e02a3c737 (diff) | |
download | rails-ff3d1a42d5800c999be7351b72317cefb5961ee8.tar.gz rails-ff3d1a42d5800c999be7351b72317cefb5961ee8.tar.bz2 rails-ff3d1a42d5800c999be7351b72317cefb5961ee8.zip |
Merge pull request #30000 from kamipo/all_of_queries_should_return_correct_result
All of queries should return correct result even if including large number
Diffstat (limited to 'activerecord/lib/arel/predications.rb')
-rw-r--r-- | activerecord/lib/arel/predications.rb | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/activerecord/lib/arel/predications.rb b/activerecord/lib/arel/predications.rb index 2a62c53aa3..7dafde4952 100644 --- a/activerecord/lib/arel/predications.rb +++ b/activerecord/lib/arel/predications.rb @@ -35,15 +35,17 @@ module Arel # :nodoc: all end def between(other) - if infinity?(other.begin) - if other.end.nil? || infinity?(other.end) + if unboundable?(other.begin) == 1 || unboundable?(other.end) == -1 + self.in([]) + elsif open_ended?(other.begin) + if other.end.nil? || open_ended?(other.end) not_in([]) elsif other.exclude_end? lt(other.end) else lteq(other.end) end - elsif other.end.nil? || infinity?(other.end) + elsif other.end.nil? || open_ended?(other.end) gteq(other.begin) elsif other.exclude_end? gteq(other.begin).and(lt(other.end)) @@ -81,15 +83,17 @@ Passing a range to `#in` is deprecated. Call `#between`, instead. end def not_between(other) - if infinity?(other.begin) - if other.end.nil? || infinity?(other.end) + if unboundable?(other.begin) == 1 || unboundable?(other.end) == -1 + not_in([]) + elsif open_ended?(other.begin) + if other.end.nil? || open_ended?(other.end) self.in([]) elsif other.exclude_end? gteq(other.end) else gt(other.end) end - elsif other.end.nil? || infinity?(other.end) + elsif other.end.nil? || open_ended?(other.end) lt(other.begin) else left = lt(other.begin) @@ -241,5 +245,13 @@ Passing a range to `#not_in` is deprecated. Call `#not_between`, instead. def infinity?(value) value.respond_to?(:infinite?) && value.infinite? end + + def unboundable?(value) + value.respond_to?(:unboundable?) && value.unboundable? + end + + def open_ended?(value) + infinity?(value) || unboundable?(value) + end end end |