Class: FactMetrics::PercentageConfig

Inherits:
Object
  • Object
show all
Defined in:
lib/fact_metrics/percentage_config.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, uses: nil, **options) ⇒ PercentageConfig

Returns a new instance of PercentageConfig.



4
5
6
7
8
# File 'lib/fact_metrics/percentage_config.rb', line 4

def initialize(name, uses: nil, **options)
  @name = name
  @uses = uses
  @options = options
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



2
3
4
# File 'lib/fact_metrics/percentage_config.rb', line 2

def name
  @name
end

#optionsObject (readonly)

Returns the value of attribute options.



2
3
4
# File 'lib/fact_metrics/percentage_config.rb', line 2

def options
  @options
end

#usesObject (readonly)

Returns the value of attribute uses.



2
3
4
# File 'lib/fact_metrics/percentage_config.rb', line 2

def uses
  @uses
end

Instance Method Details

#composed_of_attributesObject



14
15
16
17
18
19
20
21
# File 'lib/fact_metrics/percentage_config.rb', line 14

def composed_of_attributes
  [
    composed_of_name.to_sym,
    class_name: "Metric",
    mapping: {sql_result_name => :value},
    constructor: proc { |value| FactMetrics::Metric.new(value, metric_options) }
  ]
end

#composed_of_nameObject



12
# File 'lib/fact_metrics/percentage_config.rb', line 12

def composed_of_name = "#{name}_percentage_metric"

#condition_sqlObject



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/fact_metrics/percentage_config.rb', line 36

def condition_sql
  if options[:equal]
    "#{field_name} = '#{options[:equal]}'"
  elsif options[:in]
    "#{field_name} IN (#{options[:in].map { |i| "'#{i}'" }.join(",")})"
  elsif options[:condition] && options[:field]
    "#{field_name} #{options[:condition]}"
  elsif options[:condition]
    options[:condition].to_s
  elsif options[:all]
    "true"
  else
    raise "Conditional option ([:equal, :in, :condition, :all]) required to determine percentage."
  end
end

#denominator_sqlObject



52
53
54
55
56
57
58
59
60
# File 'lib/fact_metrics/percentage_config.rb', line 52

def denominator_sql
  if options[:denominator] == :all
    "COUNT(*)"
  elsif options[:denominator]
    "MAX(#{options[:denominator]})"
  else
    "SUM(CASE WHEN #{field_name} IS NOT NULL THEN 1 END)"
  end
end

#field_nameObject



62
63
64
# File 'lib/fact_metrics/percentage_config.rb', line 62

def field_name
  options[:field] || name
end

#metric_optionsObject



66
67
68
# File 'lib/fact_metrics/percentage_config.rb', line 66

def metric_options
  {name: composed_of_name, unit: "%"}.merge(options)
end

#scope_nameObject



10
# File 'lib/fact_metrics/percentage_config.rb', line 10

def scope_name = "#{name}_percentages"

#sqlObject



23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/fact_metrics/percentage_config.rb', line 23

def sql
  <<~SQL
    ROUND(
      (
        CAST(COUNT(*) FILTER (WHERE #{condition_sql}) AS FLOAT)
        /
        NULLIF(#{denominator_sql}, 0)
      ) * 100,
      2
    ) AS #{sql_result_name}
  SQL
end

#sql_result_nameObject



11
# File 'lib/fact_metrics/percentage_config.rb', line 11

def sql_result_name = "#{name}_percentage"