Class: DataFilter::RangeOverlapFilter

Inherits:
Object
  • Object
show all
Defined in:
lib/data_filter/range_overlap_filter.rb

Overview

Used to filter a data item by a set of ranges by seeing if the data field value intersects that range

Examples:

with a floor and ceiling

event = MyModel.new(start_time: Date.parse('2001-01-13'), end_time: Date.parse('2002-01-13'))
filter = DataFilter::RangeOverlapFilter
  .new(:start_time, :end_time, floor: Date.parse('2000-01-13'), ceiling: Date.parse('2003-01-13'))
filter.call(object)
# => #<MyModel start_time: #<Date '2001-01-13'>, end_time: #<Date '2002-01-13'>

Instance Method Summary collapse

Constructor Details

#initialize(start_sym, end_sym, floor: nil, ceiling: nil, nil_default: nil) ⇒ RangeOverlapFilter

Returns a new instance of RangeOverlapFilter.

Parameters:

  • start_sym (Symbol)

    the range start to filter on

  • end_sym (Symbol)

    the range end to filter on

  • floor (Comparable) (defaults to: nil)

    the range beginning we want to filter the data item by

  • ceiling (Comparable) (defaults to: nil)

    the range end we want to filter the data item by

  • nil_default (Comparable) (defaults to: nil)

    the value to use if the data item has no field value



20
21
22
23
24
25
26
# File 'lib/data_filter/range_overlap_filter.rb', line 20

def initialize(start_sym, end_sym, floor: nil, ceiling: nil, nil_default: nil)
  @start_sym   = start_sym
  @end_sym     = end_sym
  @floor       = floor
  @ceiling     = ceiling
  @nil_default = nil_default
end

Instance Method Details

#call(item) ⇒ Object

Filters the item

Parameters:

  • item (Comparable)

    the item we want to filter

Returns:

  • (Object)

    the original data item



32
33
34
35
36
37
38
39
40
41
42
# File 'lib/data_filter/range_overlap_filter.rb', line 32

def call(item)
  if item.respond_to?(@start_sym) && item.respond_to?(@end_sym)
    actual_start = item.public_send(@start_sym)
    actual_start = @nil_default if actual_start.nil?

    actual_end = item.public_send(@end_sym)
    actual_end = @nil_default if actual_end.nil?

    item if in_range?(actual_start, actual_end)
  end
end