Class: Repor::Dimensions::BinDimension

Inherits:
BaseDimension show all
Defined in:
lib/repor/dimensions/bin_dimension.rb,
lib/repor/dimensions/bin_dimension/bin.rb,
lib/repor/dimensions/bin_dimension/bin_table.rb

Direct Known Subclasses

NumberDimension, TimeDimension

Defined Under Namespace

Classes: Bin, BinTable

Instance Attribute Summary

Attributes inherited from BaseDimension

#name, #opts, #report

Instance Method Summary collapse

Methods inherited from BaseDimension

#expression, #extract_sql_value, #filtering?, #grouping?, #initialize, #null_order, #nulls_last?, #order, #order_expression, #params, #relate, #sort_desc?, #sort_order

Constructor Details

This class inherits a constructor from Repor::Dimensions::BaseDimension

Instance Method Details

#bin_startObject



79
80
81
# File 'lib/repor/dimensions/bin_dimension.rb', line 79

def bin_start
  self.min
end

#bin_widthObject

Raises:

  • (NotImplementedError)


75
76
77
# File 'lib/repor/dimensions/bin_dimension.rb', line 75

def bin_width
  raise NotImplementedError
end

#domainObject



24
25
26
27
# File 'lib/repor/dimensions/bin_dimension.rb', line 24

def domain
  return 0 if min.nil? || max.nil?
  max - min
end

#filter(relation) ⇒ Object



37
38
39
# File 'lib/repor/dimensions/bin_dimension.rb', line 37

def filter(relation)
  filter_values.filter(relation, expression)
end

#filter_maxObject



20
21
22
# File 'lib/repor/dimensions/bin_dimension.rb', line 20

def filter_max
  filter_values_for(:max).max
end

#filter_minObject



16
17
18
# File 'lib/repor/dimensions/bin_dimension.rb', line 16

def filter_min
  filter_values_for(:min).min
end

#filter_valuesObject



33
34
35
# File 'lib/repor/dimensions/bin_dimension.rb', line 33

def filter_values
  @filter_values ||= to_bins(super)
end

#group(relation) ⇒ Object



41
42
43
# File 'lib/repor/dimensions/bin_dimension.rb', line 41

def group(relation)
  group_values.group(relation, expression, sql_value_name)
end

#group_valuesObject



29
30
31
# File 'lib/repor/dimensions/bin_dimension.rb', line 29

def group_values
  @group_values ||= to_bins(array_param(:bins).presence || autopopulate_bins)
end

#maxObject



12
13
14
# File 'lib/repor/dimensions/bin_dimension.rb', line 12

def max
  @max ||= filter_max || report.records.maximum(expression)
end

#max_binsObject



4
5
6
# File 'lib/repor/dimensions/bin_dimension.rb', line 4

def max_bins
  2000
end

#minObject



8
9
10
# File 'lib/repor/dimensions/bin_dimension.rb', line 8

def min
  @min ||= filter_min || report.records.minimum(expression)
end

#validate_params!Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/repor/dimensions/bin_dimension.rb', line 45

def validate_params!
  super

  if params.key?(:bin_count)
    unless Repor.numeric?(params[:bin_count])
      invalid_param!(:bin_count, "must be numeric")
    end

    unless params[:bin_count].to_i > 0
      invalid_param!(:bin_count, "must be greater than 0")
    end

    unless params[:bin_count].to_i <= max_bins
      invalid_param!(:bin_count, "must be less than #{max_bins}")
    end
  end

  if array_param(:bins).present?
    unless group_values.all?(&:valid?)
      invalid_param!(:bins, "must be hashes with min/max keys and valid values, or nil")
    end
  end

  if array_param(:only).present?
    unless filter_values.all?(&:valid?)
      invalid_param!(:only, "must be hashes with min/max keys and valid values, or nil")
    end
  end
end