Class: Nhgis::DataGroup

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

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.find_all_available_for(dataset_id, geog_level_ids, data_time_instance_ids) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'app/models/nhgis/data_group.rb', line 80

def self.find_all_available_for(dataset_id, geog_level_ids, data_time_instance_ids)
  #answer the data groups for the specified dataset, and geog levels
  #  typically, there will be just one data group per dataset/geog level.
  #  however, expect more than one data group whenever the dataset has multiple time instances

  gl_join_clause = ""
  gl_where_clause = ""
  ti_where_clause = ""

  unless geog_level_ids.empty?
    gl_join_clause = "JOIN geotimes gt ON gt.id = dg.geotime_id"
    gl_where_clause = "AND gt.geog_level_id in (#{geog_level_ids.join(", ")})"
  end
  unless data_time_instance_ids.empty?
    ti_where_clause = "AND dg.datatime_id in (#{data_time_instance_ids.join(", ")})"
  end
  sql =<<-EOS
    SELECT DISTINCT dg.* FROM data_groups dg #{gl_join_clause}
    WHERE dg.relative_pathname IS NOT NULL AND 
    dg.dataset_id = #{dataset_id} #{gl_where_clause} #{ti_where_clause}
    ORDER BY dg.istads_seq
  EOS
  find_by_sql(sql)
end

.find_all_for(dataset_id, geog_level_id, datatime_instance_id, geogtime_instance_id) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'app/models/nhgis/data_group.rb', line 53

def self.find_all_for(dataset_id, geog_level_id, datatime_instance_id, geogtime_instance_id)
  #answer the data groups for the specified dataset, and geog levels
  #  typically, there will be just one data group per dataset/geog level.
  #  however, expect more than one data group whenever the dataset has multiple time instances

  return [] if dataset_id.nil?        #the dataset id must be provided to get anything back!!

  gt_join_clause = ""
  gl_where_clause = ""
  geog_ti_where_clause = ""
  if !geog_level_id.nil? || !geogtime_instance_id.nil?
    gt_join_clause = "JOIN geotimes gt ON gt.id = dg.geotime_id"
    gl_where_clause = "AND gt.geog_level_id = #{geog_level_id}" if !geog_level_id.nil?
    geog_ti_where_clause = "AND gt.time_instance_id = #{geogtime_instance_id}" if !geogtime_instance_id.nil?
  end

  data_ti_where_clause = ""
  data_ti_where_clause = "AND dg.datatime_id = #{datatime_instance_id}" unless datatime_instance_id.nil?

  sql =<<-EOS
    SELECT DISTINCT dg.* FROM data_groups dg #{gt_join_clause}
    WHERE dg.dataset_id = #{dataset_id} #{gl_where_clause} #{geog_ti_where_clause} #{data_ti_where_clause}
    ORDER BY dg.istads_seq
  EOS
  find_by_sql(sql)
end

Instance Method Details

#available_data_files(breakdown_value_istads_ids) ⇒ Object



45
46
47
# File 'app/models/nhgis/data_group.rb', line 45

def available_data_files(breakdown_value_istads_ids)
  return DataFile.find_all_for(self.id, breakdown_value_istads_ids)
end

#available_integ_geog_namesObject



36
37
38
# File 'app/models/nhgis/data_group.rb', line 36

def available_integ_geog_names
  self.root.source_geog_instances.map{|sgi| sgi.geog_name.integ_geog_name}.uniq
end

#data_files_for_breakdown_values(breakdown_values) ⇒ Object



40
41
42
# File 'app/models/nhgis/data_group.rb', line 40

def data_files_for_breakdown_values(breakdown_values)
  available_data_files(breakdown_values.map{|bv| bv.istads_id})
end

#extract_output_name(prefix) ⇒ Object



105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'app/models/nhgis/data_group.rb', line 105

def extract_output_name(prefix)
  #
  #  specify data group's portion of the 'base filename' to which the extract engine should assign selected
  #  contents of this data file
  #
  #  NOTE: derived from: dataset istads_id + time_instance istads_id [ + geotime istads_id] +  geog_level istads_id
  #
  dataset_extract_output_name = "_#{self.dataset.istads_id}"
  datatime_extract_output_name = "_#{self.datatime.istads_id}"
  geogtime_extract_output_name = "_#{self.geotime.time_instance.istads_id}"
  geogtime_extract_output_name = "" if geogtime_extract_output_name == datatime_extract_output_name
  geog_level_extract_output_name = "_#{self.geotime.geog_level.abbr}"
  "#{prefix}#{dataset_extract_output_name}#{datatime_extract_output_name}#{geogtime_extract_output_name}#{geog_level_extract_output_name}"
end

#geog_levelObject



15
16
17
# File 'app/models/nhgis/data_group.rb', line 15

def geog_level
  geotime.geog_level
end

#geog_time_instance_idObject



23
24
25
# File 'app/models/nhgis/data_group.rb', line 23

def geog_time_instance_id
  geotime.time_instance_id
end

#geog_unitObject



19
20
21
# File 'app/models/nhgis/data_group.rb', line 19

def geog_unit
  geotime.geog_unit
end

#geog_varsObject



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

def geog_vars
  geotime.geog_level.geog_vars & dataset.geog_vars
end

#geog_vars_for_gis_joinObject



32
33
34
# File 'app/models/nhgis/data_group.rb', line 32

def geog_vars_for_gis_join
  parent_geog_vars(geotime.geog_level) & dataset.geog_vars
end

#parent_geog_vars(geog_level) ⇒ Object



27
28
29
30
# File 'app/models/nhgis/data_group.rb', line 27

def parent_geog_vars(geog_level)
  parent_level = geog_level.parent
  parent_level ? parent_geog_vars(parent_level) + geog_level.geog_vars : geog_level.geog_vars
end

#rootObject



120
121
122
# File 'app/models/nhgis/data_group.rb', line 120

def root
  DataGroup.find_by_dataset_id_and_geotime_id(dataset, self.geotime.root)
end

#source_geog_instances_for(integ_geog_names) ⇒ Object



49
50
51
# File 'app/models/nhgis/data_group.rb', line 49

def source_geog_instances_for(integ_geog_names)
  root.source_geog_instances.select{|sgi| integ_geog_names.include? sgi.geog_name.integ_geog_name}.uniq
end