Class: Repor::Dimensions::BinDimension::Bin

Inherits:
Object
  • Object
show all
Defined in:
lib/repor/dimensions/bin_dimension/bin.rb

Direct Known Subclasses

NumberDimension::Bin, TimeDimension::Bin

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(min, max) ⇒ Bin

Returns a new instance of Bin.



5
6
7
8
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 5

def initialize(min, max)
  @min = min
  @max = max
end

Class Method Details

.from_hash(h) ⇒ Object



79
80
81
82
83
84
85
86
87
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 79

def self.from_hash(h)
  # Returns either a bin or nil, depending on whether
  # the input is valid.
  return new(nil, nil) if h.nil?
  return unless h.is_a?(Hash)
  min, max = h.symbolize_keys.values_at(:min, :max)
  return if min.blank? && max.blank?
  new(min.presence, max.presence)
end

.from_sql(value) ⇒ Object



68
69
70
71
72
73
74
75
76
77
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 68

def self.from_sql(value)
  case value
  when /^([^,]+),(.+)$/ then new($1, $2)
  when /^([^,]+),$/     then new($1, nil)
  when /^,(.+)$/        then new(nil, $1)
  when ','              then new(nil, nil)
  else
    raise "Unexpected SQL bin format #{value}"
  end
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?



125
126
127
128
129
130
131
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 125

def ==(other)
  if other.nil?
    min.nil? && max.nil?
  else
    min == other[:min] && max == other[:max]
  end
end

#[](key) ⇒ Object



102
103
104
105
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 102

def [](key)
  return min if key.to_s == 'min'
  return max if key.to_s == 'max'
end

#as_jsonObject



89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 89

def as_json(*)
  return @as_json if instance_variable_defined?(:@as_json)
  @as_json = if min && max
    { min: min, max: max }
  elsif min
    { min: min }
  elsif max
    { max: max }
  else
    nil
  end
end

#bin_textObject



39
40
41
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 39

def bin_text
  "#{min},#{max}"
end

#cast(value) ⇒ Object



35
36
37
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 35

def cast(value)
  quote(value)
end

#cast_bin_textObject



43
44
45
46
47
48
49
50
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 43

def cast_bin_text
  case Repor.database_type
  when :postgres, :sqlite
    "CAST(#{quote(bin_text)} AS text)"
  else
    quote(bin_text)
  end
end

#contains_sql(expr) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 56

def contains_sql(expr)
  if min && max
    "(#{expr} >= #{quote(min)} AND #{expr} < #{quote(max)})"
  elsif max
    "#{expr} < #{quote(max)}"
  elsif min
    "#{expr} >= #{quote(min)}"
  else
    "#{expr} IS NULL"
  end
end

#has_key?(key) ⇒ Boolean Also known as: key?

Returns:

  • (Boolean)


107
108
109
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 107

def has_key?(key)
  key.to_s == 'min' || key.to_s == 'max'
end

#hashObject



121
122
123
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 121

def hash
  as_json.hash
end

#inspectObject



117
118
119
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 117

def inspect
  "<Bin @min=#{min.inspect} @max=#{max.inspect}>"
end

#maxObject



14
15
16
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 14

def max
  @max && parse(@max)
end

#minObject



10
11
12
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 10

def min
  @min && parse(@min)
end

#parse(value) ⇒ Object



27
28
29
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 27

def parse(value)
  value
end

#parses?(value) ⇒ Boolean

Returns:

  • (Boolean)


23
24
25
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 23

def parses?(value)
  parse(value).present? rescue false
end

#quote(value) ⇒ Object



31
32
33
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 31

def quote(value)
  ActiveRecord::Base.connection.quote(value)
end

#row_sqlObject



52
53
54
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 52

def row_sql
  "SELECT #{cast(min)} AS min, #{cast(max)} AS max, #{cast_bin_text} AS bin_text"
end

#valid?Boolean

Returns:

  • (Boolean)


18
19
20
21
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 18

def valid?
  (@min.nil? || parses?(@min)) &&
    (@max.nil? || parses?(@max))
end

#values_at(*keys) ⇒ Object



113
114
115
# File 'lib/repor/dimensions/bin_dimension/bin.rb', line 113

def values_at(*keys)
  keys.map { |k| self[key] }
end