Class: Nhgis::BreakdownCombo

Inherits:
NhgisActiveRecord::Base
  • Object
show all
Defined in:
app/models/nhgis/breakdown_combo.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.defaultsObject



15
16
17
18
19
20
21
22
23
24
# File 'app/models/nhgis/breakdown_combo.rb', line 15

def self.defaults
  sql ="      SELECT bc.*\n      FROM breakdown_combos bc\n      JOIN breakdown_values_x_breakdown_combos x ON x.breakdown_combo_id = bc.id\n      JOIN breakdown_values bv                   ON bv.id = x.breakdown_value_id\n      GROUP BY bc.id HAVING COUNT(bv.id) = SUM(is_default);\n  EOS\n  find_by_sql(sql)\nend\n"

.find_by_breakdown_values(breakdown_value_istads_ids) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'app/models/nhgis/breakdown_combo.rb', line 26

def self.find_by_breakdown_values(breakdown_value_istads_ids)
  # there is an assumption that breakdown_value_istads_ids will contain the istads ids belonging to...
  #    NO breakdown value set (when empty),
  #    one breakdown value set (when breakdown value istads ids begin with the SAME prefix e.g. "bs01"
  #    two breakdown value sets (when breakdown value istads ids begin with one prefix or another e.g. "bs01" or "bs02"
  # ASSUMPTION is that there is never a valid breakdown combo where

  #puts "*** In find_by_breakdown_values #{breakdown_value_istads_ids.inspect}"
  breakdown_value_sets = breakdown_value_istads_ids.map{|bv|
  bv.
  split(".").
  first}.flatten.uniq

  case breakdown_value_sets.size
    when 0
      return []
    when 1
      sql_values = BreakdownCombo.istads_ids_for_sql(breakdown_value_istads_ids) 
      sql = "SELECT DISTINCT * FROM breakdown_combos WHERE istads_id IN (#{sql_values})"
    when 2
      bs1 = breakdown_value_sets.first
      bs2 = breakdown_value_sets.last
      bvs1 = breakdown_value_istads_ids.select{|bv| bv.split(".").first == bs1}
      bvs2 = breakdown_value_istads_ids.select{|bv| bv.split(".").first == bs2}
      sql_values1 = BreakdownCombo.istads_ids_for_sql(bvs1)
      sql_values2 = BreakdownCombo.istads_ids_for_sql(bvs2)

      sql = "SELECT DISTINCT bc.* FROM breakdown_combos bc "
      sql << "JOIN breakdown_values_x_breakdown_combos x ON x.breakdown_combo_id = bc.id "
      sql << "JOIN breakdown_values bv ON bv.id = x.breakdown_value_id AND bv.istads_id LIKE '#{bs1}.%' "
      sql << "JOIN breakdown_values_x_breakdown_combos x2 ON x2.breakdown_combo_id = x.breakdown_combo_id "
      sql << "JOIN breakdown_values bv2 ON bv2.id = x2.breakdown_value_id AND bv2.istads_id LIKE '#{bs2}.%' "
      sql << "WHERE bv.istads_id IN (#{sql_values1}) AND bv2.istads_id IN (#{sql_values2})"
    else
      raise "too many breakdown value sets; only expected 1 or 2 (or none)"
  end
  find_by_sql(sql)
end

.istads_ids_for_sql(breakdown_value_istads_id_list) ⇒ Object



10
11
12
13
# File 'app/models/nhgis/breakdown_combo.rb', line 10

def self.istads_ids_for_sql(breakdown_value_istads_id_list)
  #this method will convert an array of breakdown value istads id into a string that can be used in a sql statement
  breakdown_value_istads_id_list.inspect.gsub("[", "").gsub("]", "").gsub("\"", "'")
end

Instance Method Details

#codebook_labelsObject



65
66
67
# File 'app/models/nhgis/breakdown_combo.rb', line 65

def codebook_labels
  sorted_breakdown_values.map{|bv| bv.composite_codebook_label}
end

#header_labelObject



69
70
71
72
73
# File 'app/models/nhgis/breakdown_combo.rb', line 69

def header_label
  #"[breakdown_var 1 value]: [breakdown_var 2 value]"
  # NOTE : currently sorting the breakdowns using the breakdown value set istads_id
  sorted_breakdown_values.map{|bv| bv.label}.join(": ")
end

#is_default?Boolean

Returns:

  • (Boolean)


75
76
77
78
# File 'app/models/nhgis/breakdown_combo.rb', line 75

def is_default?
  breakdown_values.each{|bv| return false unless bv.is_default}
  return true
end

#sorted_breakdown_valuesObject



80
81
82
# File 'app/models/nhgis/breakdown_combo.rb', line 80

def sorted_breakdown_values
  breakdown_values.sort{|a,b| a.breakdown_value_set.istads_seq <=> b.breakdown_value_set.istads_seq}
end