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.



31
32
33
34
# File 'lib/active_reporter/dimension/bin/set.rb', line 31

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

Class Method Details

.from_hash(source) ⇒ Object



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

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



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

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?



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

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

#[](key) ⇒ Object



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

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

#as_jsonObject



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

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



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

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

#bin_textObject



64
65
66
# File 'lib/active_reporter/dimension/bin/set.rb', line 64

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

#cast(value) ⇒ Object



60
61
62
# File 'lib/active_reporter/dimension/bin/set.rb', line 60

def cast(value)
  quote(value)
end

#cast_bin_textObject



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

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



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

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:

  • (Boolean)


112
113
114
# File 'lib/active_reporter/dimension/bin/set.rb', line 112

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

#hashObject



125
126
127
# File 'lib/active_reporter/dimension/bin/set.rb', line 125

def hash
  as_json.hash
end

#inspectObject



121
122
123
# File 'lib/active_reporter/dimension/bin/set.rb', line 121

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

#maxObject



40
41
42
# File 'lib/active_reporter/dimension/bin/set.rb', line 40

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

#minObject



36
37
38
# File 'lib/active_reporter/dimension/bin/set.rb', line 36

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

#parse(value) ⇒ Object



52
53
54
# File 'lib/active_reporter/dimension/bin/set.rb', line 52

def parse(value)
  value
end

#parses?(value) ⇒ Boolean

Returns:

  • (Boolean)


48
49
50
# File 'lib/active_reporter/dimension/bin/set.rb', line 48

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

#quote(value) ⇒ Object



56
57
58
# File 'lib/active_reporter/dimension/bin/set.rb', line 56

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

#row_sqlObject



77
78
79
# File 'lib/active_reporter/dimension/bin/set.rb', line 77

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

#valid?Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/active_reporter/dimension/bin/set.rb', line 44

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

#values_at(*keys) ⇒ Object



117
118
119
# File 'lib/active_reporter/dimension/bin/set.rb', line 117

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