Class: ActiveReporter::Dimension::Bin::Set

Inherits:
Object
  • Object
show all
Defined in:
lib/active_reporter/dimension/bin/set.rb

Direct Known Subclasses

Number::Set, Time::Set

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(min, max) ⇒ Set

Returns a new instance of Set.



33
34
35
36
# File 'lib/active_reporter/dimension/bin/set.rb', line 33

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

Class Method Details

.from_hash(source) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/active_reporter/dimension/bin/set.rb', line 8

def from_hash(source)
  # Returns either a bin or nil, depending on whether the input is valid.
  case source
  when nil
    new(nil, nil)
  when Hash then
    min, max = source.symbolize_keys.values_at(:min, :max)
    new(min.presence, max.presence) unless min.blank? && max.blank?
  else
    nil
  end
end

.from_sql(value) ⇒ Object



21
22
23
24
25
26
27
28
29
30
# File 'lib/active_reporter/dimension/bin/set.rb', line 21

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

Instance Method Details

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



131
132
133
134
135
136
137
# File 'lib/active_reporter/dimension/bin/set.rb', line 131

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

#[](key) ⇒ Object



107
108
109
110
111
112
# File 'lib/active_reporter/dimension/bin/set.rb', line 107

def [](key)
  case key.to_s
  when "min" then min
  when "max" then max
  end
end

#as_jsonObject



96
97
98
99
100
101
102
103
104
105
# File 'lib/active_reporter/dimension/bin/set.rb', line 96

def as_json(*)
  @as_json ||= case bin_edges
  when :min_and_max
    { min: min, max: max }
  when :min
    { min: min }
  when :max
    { max: max }
  end
end

#bin_edgesObject



140
141
142
143
144
145
146
# File 'lib/active_reporter/dimension/bin/set.rb', line 140

def bin_edges
  case
  when min_and_max? then :min_and_max
  when min? then :min
  when max? then :max
  end
end

#bin_textObject



66
67
68
# File 'lib/active_reporter/dimension/bin/set.rb', line 66

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

#cast(value) ⇒ Object



62
63
64
# File 'lib/active_reporter/dimension/bin/set.rb', line 62

def cast(value)
  quote(value)
end

#cast_bin_textObject



70
71
72
73
74
75
76
77
# File 'lib/active_reporter/dimension/bin/set.rb', line 70

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

#contains_sql(expr) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/active_reporter/dimension/bin/set.rb', line 83

def contains_sql(expr)
  case bin_edges
  when :min_and_max
    "(#{expr} >= #{quote(min)} AND #{expr} < #{quote(max)})"
  when :min
    "#{expr} >= #{quote(min)}"
  when :max
    "#{expr} < #{quote(max)}"
  else
    "#{expr} IS NULL"
  end
end

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

Returns:



114
115
116
# File 'lib/active_reporter/dimension/bin/set.rb', line 114

def has_key?(key)
  %w[min max].include?(key.to_s)
end

#hashObject



127
128
129
# File 'lib/active_reporter/dimension/bin/set.rb', line 127

def hash
  as_json.hash
end

#inspectObject



123
124
125
# File 'lib/active_reporter/dimension/bin/set.rb', line 123

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

#maxObject



42
43
44
# File 'lib/active_reporter/dimension/bin/set.rb', line 42

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

#minObject



38
39
40
# File 'lib/active_reporter/dimension/bin/set.rb', line 38

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

#parse(value) ⇒ Object



54
55
56
# File 'lib/active_reporter/dimension/bin/set.rb', line 54

def parse(value)
  value
end

#parses?(value) ⇒ Boolean

Returns:



50
51
52
# File 'lib/active_reporter/dimension/bin/set.rb', line 50

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

#quote(value) ⇒ Object



58
59
60
# File 'lib/active_reporter/dimension/bin/set.rb', line 58

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

#row_sqlObject



79
80
81
# File 'lib/active_reporter/dimension/bin/set.rb', line 79

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

#valid?Boolean

Returns:



46
47
48
# File 'lib/active_reporter/dimension/bin/set.rb', line 46

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

#values_at(*keys) ⇒ Object



119
120
121
# File 'lib/active_reporter/dimension/bin/set.rb', line 119

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