Class: MeterBox::Query

Inherits:
Object
  • Object
show all
Defined in:
lib/meter_box/query.rb

Constant Summary collapse

ALLOWED_OPTS =
%i[since until where].freeze

Class Method Summary collapse

Class Method Details

.breakdown(owner:, meter:, by:, **opts) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/meter_box/query.rb', line 13

def self.breakdown(owner:, meter:, by:, **opts)
  validate_opts!(opts)
  meter_obj = MeterBox.config.fetch(meter)
  keys = Array(by).map(&:to_sym)
  keys.each do |k|
    unless meter_obj.declared_keys.include?(k)
      raise UnknownDimension,
        "dimension '#{k}' not declared on meter '#{meter}'"
    end
  end

  scope = build_scope(owner, meter, opts)
  group_sql = keys.map { |k| "dimensions->>'#{k}'" }.join(", ")
  raw = Aggregation.apply_grouped(scope, group_sql, meter_obj.aggregation)

  raw.each_with_object({}) do |(row, val), out|
    values = Array(row)
    out[keys.zip(values).to_h] = val
  end
end

.events_for(owner:, meter:, **opts) ⇒ Object



38
39
40
41
# File 'lib/meter_box/query.rb', line 38

def self.events_for(owner:, meter:, **opts)
  validate_opts!(opts)
  build_scope(owner, meter, opts)
end

.over_cap?(owner:, meter:, cap:, **opts) ⇒ Boolean

Returns:

  • (Boolean)


34
35
36
# File 'lib/meter_box/query.rb', line 34

def self.over_cap?(owner:, meter:, cap:, **opts)
  (total(owner: owner, meter: meter, **opts) || 0) >= cap
end

.total(owner:, meter:, **opts) ⇒ Object



7
8
9
10
11
# File 'lib/meter_box/query.rb', line 7

def self.total(owner:, meter:, **opts)
  validate_opts!(opts)
  meter_obj = MeterBox.config.fetch(meter)
  Aggregation.apply(build_scope(owner, meter, opts), meter_obj.aggregation)
end