Class: FactMetrics::PercentageConfig
- Inherits:
-
Object
- Object
- FactMetrics::PercentageConfig
- Defined in:
- lib/fact_metrics/percentage_config.rb
Instance Attribute Summary collapse
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#options ⇒ Object
readonly
Returns the value of attribute options.
-
#uses ⇒ Object
readonly
Returns the value of attribute uses.
Instance Method Summary collapse
- #composed_of_attributes ⇒ Object
- #composed_of_name ⇒ Object
- #condition_sql ⇒ Object
- #denominator_sql ⇒ Object
- #field_name ⇒ Object
-
#initialize(name, uses: nil, **options) ⇒ PercentageConfig
constructor
A new instance of PercentageConfig.
- #metric_options ⇒ Object
- #scope_name ⇒ Object
- #sql ⇒ Object
- #sql_result_name ⇒ Object
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, **) @name = name @uses = uses @options = end |
Instance Attribute Details
#name ⇒ Object (readonly)
Returns the value of attribute name.
2 3 4 |
# File 'lib/fact_metrics/percentage_config.rb', line 2 def name @name end |
#options ⇒ Object (readonly)
Returns the value of attribute options.
2 3 4 |
# File 'lib/fact_metrics/percentage_config.rb', line 2 def @options end |
#uses ⇒ Object (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_attributes ⇒ Object
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, ) } ] end |
#composed_of_name ⇒ Object
12 |
# File 'lib/fact_metrics/percentage_config.rb', line 12 def composed_of_name = "#{name}_percentage_metric" |
#condition_sql ⇒ Object
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 [:equal] "#{field_name} = '#{[:equal]}'" elsif [:in] "#{field_name} IN (#{[:in].map { |i| "'#{i}'" }.join(",")})" elsif [:condition] && [:field] "#{field_name} #{[:condition]}" elsif [:condition] [:condition].to_s elsif [:all] "true" else raise "Conditional option ([:equal, :in, :condition, :all]) required to determine percentage." end end |
#denominator_sql ⇒ Object
52 53 54 55 56 57 58 59 60 |
# File 'lib/fact_metrics/percentage_config.rb', line 52 def denominator_sql if [:denominator] == :all "COUNT(*)" elsif [:denominator] "MAX(#{[:denominator]})" else "SUM(CASE WHEN #{field_name} IS NOT NULL THEN 1 END)" end end |
#field_name ⇒ Object
62 63 64 |
# File 'lib/fact_metrics/percentage_config.rb', line 62 def field_name [:field] || name end |
#metric_options ⇒ Object
66 67 68 |
# File 'lib/fact_metrics/percentage_config.rb', line 66 def {name: composed_of_name, unit: "%"}.merge() end |
#scope_name ⇒ Object
10 |
# File 'lib/fact_metrics/percentage_config.rb', line 10 def scope_name = "#{name}_percentages" |
#sql ⇒ Object
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_name ⇒ Object
11 |
# File 'lib/fact_metrics/percentage_config.rb', line 11 def sql_result_name = "#{name}_percentage" |