aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/relation/predicate_builder/range_handler.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/lib/active_record/relation/predicate_builder/range_handler.rb')
-rw-r--r--activerecord/lib/active_record/relation/predicate_builder/range_handler.rb32
1 files changed, 28 insertions, 4 deletions
diff --git a/activerecord/lib/active_record/relation/predicate_builder/range_handler.rb b/activerecord/lib/active_record/relation/predicate_builder/range_handler.rb
index 1b3849e3ad..44bb2c7ab6 100644
--- a/activerecord/lib/active_record/relation/predicate_builder/range_handler.rb
+++ b/activerecord/lib/active_record/relation/predicate_builder/range_handler.rb
@@ -1,17 +1,41 @@
+# frozen_string_literal: true
+
module ActiveRecord
class PredicateBuilder
class RangeHandler # :nodoc:
+ class RangeWithBinds < Struct.new(:begin, :end)
+ def exclude_end?
+ false
+ end
+ end
+
def initialize(predicate_builder)
@predicate_builder = predicate_builder
end
def call(attribute, value)
- attribute.between(value)
- end
+ begin_bind = predicate_builder.build_bind_attribute(attribute.name, value.begin)
+ end_bind = predicate_builder.build_bind_attribute(attribute.name, value.end)
- protected
+ if begin_bind.value.infinity?
+ if end_bind.value.infinity?
+ attribute.not_in([])
+ elsif value.exclude_end?
+ attribute.lt(end_bind)
+ else
+ attribute.lteq(end_bind)
+ end
+ elsif end_bind.value.infinity?
+ attribute.gteq(begin_bind)
+ elsif value.exclude_end?
+ attribute.gteq(begin_bind).and(attribute.lt(end_bind))
+ else
+ attribute.between(RangeWithBinds.new(begin_bind, end_bind))
+ end
+ end
- attr_reader :predicate_builder
+ private
+ attr_reader :predicate_builder
end
end
end