terrapop_models 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/javascripts/terrapop_models/application.js +13 -0
  6. data/app/assets/stylesheets/terrapop_models/application.css +15 -0
  7. data/app/controllers/terrapop_models/application_controller.rb +4 -0
  8. data/app/helpers/terrapop_models/application_helper.rb +4 -0
  9. data/app/models/api_log.rb +2 -0
  10. data/app/models/area_data_raster.rb +126 -0
  11. data/app/models/area_data_raster_variable_mnemonic_lookup.rb +4 -0
  12. data/app/models/area_data_statistic.rb +6 -0
  13. data/app/models/area_data_table.rb +25 -0
  14. data/app/models/area_data_table_group.rb +8 -0
  15. data/app/models/area_data_table_group_membership.rb +7 -0
  16. data/app/models/area_data_value.rb +37 -0
  17. data/app/models/area_data_variable.rb +140 -0
  18. data/app/models/area_data_variable_construction.rb +6 -0
  19. data/app/models/attached_variable_pointer.rb +5 -0
  20. data/app/models/bare_user.rb +7 -0
  21. data/app/models/boundary.rb +6 -0
  22. data/app/models/build_status.rb +2 -0
  23. data/app/models/category.rb +17 -0
  24. data/app/models/codebook.rb +242 -0
  25. data/app/models/common_variable.rb +2 -0
  26. data/app/models/country.rb +45 -0
  27. data/app/models/country_comparability.rb +6 -0
  28. data/app/models/country_level.rb +8 -0
  29. data/app/models/ddi2_codebook.rb +541 -0
  30. data/app/models/error_event.rb +2 -0
  31. data/app/models/extract_data_artifact.rb +4 -0
  32. data/app/models/extract_request.rb +817 -0
  33. data/app/models/extract_request_area_data_raster_variable_mnemonic_lookup.rb +4 -0
  34. data/app/models/extract_request_error_event.rb +4 -0
  35. data/app/models/extract_request_submission.rb +19 -0
  36. data/app/models/extract_status.rb +55 -0
  37. data/app/models/extract_type.rb +2 -0
  38. data/app/models/extract_variable_stub.rb +17 -0
  39. data/app/models/frequency.rb +7 -0
  40. data/app/models/geog_instance.rb +18 -0
  41. data/app/models/geog_unit.rb +5 -0
  42. data/app/models/global_region.rb +6 -0
  43. data/app/models/global_region_type.rb +5 -0
  44. data/app/models/heartbeat.rb +8 -0
  45. data/app/models/heartbeat_pulse.rb +3 -0
  46. data/app/models/insert_html_fragment.rb +3 -0
  47. data/app/models/ipums_academic_status.rb +9 -0
  48. data/app/models/ipums_anticipated_result.rb +9 -0
  49. data/app/models/ipums_department.rb +9 -0
  50. data/app/models/ipums_registration.rb +72 -0
  51. data/app/models/ipums_user.rb +15 -0
  52. data/app/models/label.rb +7 -0
  53. data/app/models/link.rb +21 -0
  54. data/app/models/map.rb +255 -0
  55. data/app/models/map_unit.rb +4 -0
  56. data/app/models/map_unit_raster_dataset.rb +4 -0
  57. data/app/models/markup_transform.rb +240 -0
  58. data/app/models/measurement_type.rb +5 -0
  59. data/app/models/nhgis/agg_data_var.rb +120 -0
  60. data/app/models/nhgis/breakdown_combo.rb +84 -0
  61. data/app/models/nhgis/breakdown_var.rb +8 -0
  62. data/app/models/nhgis/data_file.rb +43 -0
  63. data/app/models/nhgis/data_file_type.rb +17 -0
  64. data/app/models/nhgis/data_group.rb +125 -0
  65. data/app/models/nhgis/data_record_range.rb +22 -0
  66. data/app/models/nhgis/data_table.rb +8 -0
  67. data/app/models/nhgis/dataset.rb +76 -0
  68. data/app/models/nhgis/dataset_group.rb +6 -0
  69. data/app/models/nhgis/geog_level.rb +14 -0
  70. data/app/models/nhgis/geog_level_collection.rb +15 -0
  71. data/app/models/nhgis/geog_level_geog_level_group.rb +10 -0
  72. data/app/models/nhgis/geog_level_group.rb +87 -0
  73. data/app/models/nhgis/geog_name.rb +12 -0
  74. data/app/models/nhgis/geog_unit.rb +11 -0
  75. data/app/models/nhgis/geog_var 2.rb +10 -0
  76. data/app/models/nhgis/geog_var.rb +6 -0
  77. data/app/models/nhgis/geog_var_geog_level.rb +8 -0
  78. data/app/models/nhgis/geotime.rb +21 -0
  79. data/app/models/nhgis/integ_geog_instance.rb +6 -0
  80. data/app/models/nhgis/integ_geog_instance_source_geog_instance.rb +9 -0
  81. data/app/models/nhgis/integ_geog_level.rb +9 -0
  82. data/app/models/nhgis/integ_geog_name.rb +12 -0
  83. data/app/models/nhgis/shape_file.rb +203 -0
  84. data/app/models/nhgis/shape_file_x_dataset.rb +8 -0
  85. data/app/models/nhgis/tabulation_type.rb +8 -0
  86. data/app/models/nhgis/time_instance.rb +6 -0
  87. data/app/models/nhgis/time_instance_integ_geog_level.rb +9 -0
  88. data/app/models/nhgis/time_series.rb +12 -0
  89. data/app/models/nhgis/time_series_component.rb +9 -0
  90. data/app/models/nhgis/time_series_release.rb +6 -0
  91. data/app/models/nhgis/time_series_table.rb +13 -0
  92. data/app/models/nhgis/time_series_table_dataset.rb +9 -0
  93. data/app/models/nhgis/time_series_table_geog_level.rb +9 -0
  94. data/app/models/nhgis/time_series_table_time_instance.rb +9 -0
  95. data/app/models/nhgis/time_series_table_time_series_release.rb +7 -0
  96. data/app/models/nhgis/time_series_table_topic.rb +9 -0
  97. data/app/models/nhgis/time_series_table_x_time_series.rb +9 -0
  98. data/app/models/nhgis_metadata_store.rb +2 -0
  99. data/app/models/raster.rb +5 -0
  100. data/app/models/raster_category.rb +6 -0
  101. data/app/models/raster_category_statistic.rb +7 -0
  102. data/app/models/raster_data_type.rb +6 -0
  103. data/app/models/raster_dataset.rb +130 -0
  104. data/app/models/raster_dataset_group.rb +3 -0
  105. data/app/models/raster_dataset_raster_data_type.rb +4 -0
  106. data/app/models/raster_dataset_raster_dataset_unit.rb +4 -0
  107. data/app/models/raster_dataset_raster_variable.rb +4 -0
  108. data/app/models/raster_dataset_unit.rb +4 -0
  109. data/app/models/raster_group.rb +87 -0
  110. data/app/models/raster_metadata.rb +6 -0
  111. data/app/models/raster_operation.rb +10 -0
  112. data/app/models/raster_raster_variable.rb +2 -0
  113. data/app/models/raster_statistic.rb +6 -0
  114. data/app/models/raster_value.rb +83 -0
  115. data/app/models/raster_variable.rb +440 -0
  116. data/app/models/raster_variable_classification.rb +4 -0
  117. data/app/models/raster_variable_group_membership.rb +4 -0
  118. data/app/models/request_area_data_variable.rb +57 -0
  119. data/app/models/request_geog_unit.rb +6 -0
  120. data/app/models/request_raster_dataset.rb +4 -0
  121. data/app/models/request_raster_variable.rb +147 -0
  122. data/app/models/request_sample.rb +34 -0
  123. data/app/models/request_sample_geog_level.rb +4 -0
  124. data/app/models/request_terrapop_sample.rb +6 -0
  125. data/app/models/request_variable.rb +104 -0
  126. data/app/models/resolution.rb +5 -0
  127. data/app/models/sample.rb +81 -0
  128. data/app/models/sample_design.rb +300 -0
  129. data/app/models/sample_detail_field.rb +7 -0
  130. data/app/models/sample_detail_group.rb +3 -0
  131. data/app/models/sample_detail_value.rb +11 -0
  132. data/app/models/sample_details.rb +90 -0
  133. data/app/models/sample_geog_level.rb +150 -0
  134. data/app/models/sample_level_area_data_variable.rb +13 -0
  135. data/app/models/sample_variable.rb +11 -0
  136. data/app/models/status_definition.rb +2 -0
  137. data/app/models/system_statistic.rb +5 -0
  138. data/app/models/tag.rb +7 -0
  139. data/app/models/terrapop_configuration.rb +75 -0
  140. data/app/models/terrapop_extract_information.rb +64 -0
  141. data/app/models/terrapop_raster_summary_cache.rb +6 -0
  142. data/app/models/terrapop_sample.rb +313 -0
  143. data/app/models/terrapop_setting.rb +11 -0
  144. data/app/models/topic.rb +7 -0
  145. data/app/models/ui_text_snippet.rb +2 -0
  146. data/app/models/universe.rb +5 -0
  147. data/app/models/user.rb +262 -0
  148. data/app/models/user_role.rb +5 -0
  149. data/app/models/variable.rb +127 -0
  150. data/app/models/variable_availability_cach.rb +3 -0
  151. data/app/models/variable_group.rb +14 -0
  152. data/app/models/variable_source.rb +8 -0
  153. data/app/views/layouts/terrapop_models/application.html.erb +14 -0
  154. data/config/routes.rb +2 -0
  155. data/db/migrate/00000000000100_create_countries.rb +15 -0
  156. data/db/migrate/00000000000200_create_universes.rb +11 -0
  157. data/db/migrate/00000000000300_create_geog_units.rb +9 -0
  158. data/db/migrate/00000000000400_create_measurement_types.rb +9 -0
  159. data/db/migrate/00000000000500_create_area_data_table_groups.rb +13 -0
  160. data/db/migrate/00000000000600_create_area_data_tables.rb +14 -0
  161. data/db/migrate/00000000000700_create_area_data_table_group_memberships.rb +12 -0
  162. data/db/migrate/00000000000800_create_tags.rb +9 -0
  163. data/db/migrate/00000000000900_create_topics.rb +9 -0
  164. data/db/migrate/00000000001000_create_variable_groups.rb +18 -0
  165. data/db/migrate/00000000001100_create_samples.rb +32 -0
  166. data/db/migrate/00000000001200_create_terrapop_samples.rb +12 -0
  167. data/db/migrate/00000000001300_create_variables.rb +52 -0
  168. data/db/migrate/00000000001400_create_country_levels.rb +17 -0
  169. data/db/migrate/00000000001450_variable_topics.rb +19 -0
  170. data/db/migrate/00000000001500_create_sample_geog_levels.rb +20 -0
  171. data/db/migrate/00000000002000_create_area_data_variables.rb +19 -0
  172. data/db/migrate/00000000002050_area_data_variable_topics.rb +22 -0
  173. data/db/migrate/00000000002100_create_sample_level_area_data_variables.rb +16 -0
  174. data/db/migrate/00000000002200_create_sample_level_area_variable_constructions.rb +12 -0
  175. data/db/migrate/00000000003000_create_maps.rb +22 -0
  176. data/db/migrate/00000000003100_create_boundaries.rb +14 -0
  177. data/db/migrate/00000000004000_create_geog_instances.rb +20 -0
  178. data/db/migrate/00000000004100_create_area_data_values.rb +18 -0
  179. data/db/migrate/00000000005000_create_sample_variables.rb +21 -0
  180. data/db/migrate/00000000005100_create_categories.rb +20 -0
  181. data/db/migrate/00000000005200_create_frequencies.rb +16 -0
  182. data/db/migrate/00000000005300_create_variable_sources.rb +16 -0
  183. data/db/migrate/00000000006000_create_user_roles.rb +8 -0
  184. data/db/migrate/00000000006100_create_users.rb +43 -0
  185. data/db/migrate/00000000006300_create_samples_tags.rb +15 -0
  186. data/db/migrate/00000000006400_create_terrapop_samples_tags.rb +15 -0
  187. data/db/migrate/00000000007000_create_raster_data_types.rb +9 -0
  188. data/db/migrate/00000000007050_create_resolutions.rb +8 -0
  189. data/db/migrate/00000000007100_create_raster_datasets.rb +26 -0
  190. data/db/migrate/00000000007200_create_raster_groups.rb +20 -0
  191. data/db/migrate/00000000007250_create_raster_groups_tags.rb +19 -0
  192. data/db/migrate/00000000007300_create_raster_variables.rb +28 -0
  193. data/db/migrate/00000000007325_create_raster_variable_group_memberships.rb +12 -0
  194. data/db/migrate/00000000007350_raster_variable_topics.rb +22 -0
  195. data/db/migrate/00000000007400_create_rasters.rb +22 -0
  196. data/db/migrate/00000000007500_create_raster_operations.rb +11 -0
  197. data/db/migrate/00000000010000_create_status_definitions.rb +8 -0
  198. data/db/migrate/00000000010050_create_extract_types.rb +10 -0
  199. data/db/migrate/00000000010100_create_build_statuses.rb +10 -0
  200. data/db/migrate/00000000010200_create_extract_requests.rb +14 -0
  201. data/db/migrate/00000000010300_create_extract_requests_labels_join_table.rb +20 -0
  202. data/db/migrate/00000000010400_create_extract_statuses.rb +13 -0
  203. data/db/migrate/00000000010500_create_request_geog_units.rb +13 -0
  204. data/db/migrate/00000000010600_create_request_terrapop_samples.rb +15 -0
  205. data/db/migrate/00000000011000_create_request_variable.rb +16 -0
  206. data/db/migrate/00000000011100_create_request_area_data_variables.rb +18 -0
  207. data/db/migrate/00000000011200_create_request_raster_variables.rb +20 -0
  208. data/db/migrate/00000000012000_create_raster_summary_functions.rb +130 -0
  209. data/db/migrate/00000000013000_create_terrapop_settings.rb +24 -0
  210. data/db/migrate/20121218190647_create_attached_variable_pointer.rb +18 -0
  211. data/db/migrate/20121218191609_add_attached_variable_pointer_id.rb +9 -0
  212. data/db/migrate/20121218205322_add_wants_attached.rb +9 -0
  213. data/db/migrate/20121219145142_add_attributes_to_terrapop_sample.rb +68 -0
  214. data/db/migrate/20130125155216_add_default_order_index_to_variables.rb +5 -0
  215. data/db/migrate/20130129204515_create_request_samples.rb +14 -0
  216. data/db/migrate/20130129204718_create_request_raster_datasets.rb +13 -0
  217. data/db/migrate/20130205195304_create_error_events.rb +10 -0
  218. data/db/migrate/20130206202006_add_country_index_for_continent.rb +8 -0
  219. data/db/migrate/20130207202628_create_raster_metadata.rb +13 -0
  220. data/db/migrate/20130208192415_add_extents_to_raster_dataset.rb +6 -0
  221. data/db/migrate/20130209182800_create_global_regions.rb +11 -0
  222. data/db/migrate/20130209182858_add_global_region_id_country.rb +13 -0
  223. data/db/migrate/20130211183221_add_type_to_global_regions.rb +5 -0
  224. data/db/migrate/20130212190940_create_global_region_types.rb +8 -0
  225. data/db/migrate/20130212192357_remove_classification_add_global_region_type_id_to_global_region.rb +13 -0
  226. data/db/migrate/20130304181054_add_code_to_boundaries.rb +5 -0
  227. data/db/migrate/20130305223407_add_ipumsi_user_flagto_users.rb +15 -0
  228. data/db/migrate/20130305224906_add_ipumsi_user_date_flagto_users.rb +11 -0
  229. data/db/migrate/20130308214537_create_request_sample_geog_levels.rb +14 -0
  230. data/db/migrate/20130312191726_create_raster_statistics.rb +23 -0
  231. data/db/migrate/20130312192100_create_raster_categories.rb +14 -0
  232. data/db/migrate/20130312192158_create_raster_category_statistics.rb +22 -0
  233. data/db/migrate/20130312203045_create_area_data_statistics.rb +15 -0
  234. data/db/migrate/20130401161222_add_summary_to_raster_variable.rb +11 -0
  235. data/db/migrate/20130402203508_add_global_region_sort_order_column.rb +8 -0
  236. data/db/migrate/20130402211553_add_weighted_to_terrapop_samples.rb +5 -0
  237. data/db/migrate/20130408022218_add_period_to_raster_datasets.rb +5 -0
  238. data/db/migrate/20130409161950_create_area_data_variable_constructions.rb +17 -0
  239. data/db/migrate/20130409162731_add_opcode_to_raster_operations.rb +5 -0
  240. data/db/migrate/20130412141109_update_raster_summary_functions.rb +39 -0
  241. data/db/migrate/20130415174823_create_insert_html_fragments.rb +13 -0
  242. data/db/migrate/20130415185523_create_common_variables.rb +13 -0
  243. data/db/migrate/20130416144840_add_columns_to_request_samples.rb +6 -0
  244. data/db/migrate/20130416150151_add_revision_of_column_to_extract_request.rb +8 -0
  245. data/db/migrate/20130416151200_add_file_type_to_extract_request.rb +5 -0
  246. data/db/migrate/20130416161440_add_column_general_detailed_selection_to_request_variables.rb +5 -0
  247. data/db/migrate/20130416170551_add_wants_case_selection_to_request_variable.rb +5 -0
  248. data/db/migrate/20130613185642_add_indexes_to_tables.rb +7 -0
  249. data/db/migrate/20130614193857_add_more_column_indexes.rb +11 -0
  250. data/db/migrate/20130618141508_create_raster_dataset_raster_data_types.rb +17 -0
  251. data/db/migrate/20130618185528_add_circa_to_raster_dataset.rb +5 -0
  252. data/db/migrate/20130619160555_create_raster_dataset_units.rb +9 -0
  253. data/db/migrate/20130619161934_create_raster_dataset_raster_dataset_units.rb +17 -0
  254. data/db/migrate/20130621184015_add_raster_dataset_process_summary.rb +8 -0
  255. data/db/migrate/20130621203809_add_source_information_column_to_raster_dataset.rb +5 -0
  256. data/db/migrate/20130624144333_add_temporal_extent_description_to_raster_dataset.rb +5 -0
  257. data/db/migrate/20130624154952_add_provider_to_raster_dataset.rb +5 -0
  258. data/db/migrate/20130624175342_add_use_constraints_column_to_raster_dataset.rb +5 -0
  259. data/db/migrate/20130624175632_drop_use_constraints_column_from_raster_dataset.rb +8 -0
  260. data/db/migrate/20130624192654_add_north_south_east_west_columns_to_raster_dataset.rb +8 -0
  261. data/db/migrate/20130625193303_add_sort_operation_identifier_to_raster_group.rb +5 -0
  262. data/db/migrate/20130702190659_add_raster_group_id_to_raster_variable.rb +9 -0
  263. data/db/migrate/20130708184410_create_country_comparabilities.rb +14 -0
  264. data/db/migrate/20130711191704_add_ipumsi_user_id_to_user.rb +8 -0
  265. data/db/migrate/20130712150252_add_data_settings_column_to_user.rb +8 -0
  266. data/db/migrate/20130719183620_add_visible_and_map_to_columns_to_raster_operations.rb +13 -0
  267. data/db/migrate/20130812194537_create_extract_request_submissions.rb +12 -0
  268. data/db/migrate/20130813165221_remove_ipums_user_id_from_user.rb +8 -0
  269. data/db/migrate/20130814161802_add_uuid_field_to_extract_request.rb +6 -0
  270. data/db/migrate/20130816204002_add_country_id_to_terrapop_sample.rb +8 -0
  271. data/db/migrate/20130816204214_add_year_to_terrapop_sample.rb +8 -0
  272. data/db/migrate/20130816205324_add_indexes_to_country.rb +9 -0
  273. data/db/migrate/20130819145802_add_foreign_key_to_terrapop_sample.rb +5 -0
  274. data/db/migrate/20130819155712_add_indexes_to_sample_level_area_data_variable.rb +5 -0
  275. data/db/migrate/20130819163013_add_short_country_name_to_terrapop_sample.rb +8 -0
  276. data/db/migrate/20130820195420_add_is_erf_to_country.rb +7 -0
  277. data/db/migrate/20130821221743_fix_raster_summary_function_num_classes.rb +39 -0
  278. data/db/migrate/20130830192340_add_more_user_registration_columns.rb +51 -0
  279. data/db/migrate/20130904205306_add_raster_variable_sort_order_weight.rb +8 -0
  280. data/db/migrate/20130912145522_add_localized_label_to_country_levels.rb +5 -0
  281. data/db/migrate/20130913194351_create_terrapop_raster_summary_caches.rb +27 -0
  282. data/db/migrate/20130916212710_add_year_range_to_map.rb +11 -0
  283. data/db/migrate/20130917154553_create_sample_designs.rb +14 -0
  284. data/db/migrate/20130924210303_add_raster_only_to_extract_request.rb +5 -0
  285. data/db/migrate/20131001220437_add_mnemonic_and_codebook_description_to_area_data_value.rb +11 -0
  286. data/db/migrate/20131002213443_add_ipums_email_sent_at_column.rb +8 -0
  287. data/db/migrate/20131020154130_remove_index_if_exists.rb +9 -0
  288. data/db/migrate/20131020170642_remove_ui_snippet_table_if_exists.rb +8 -0
  289. data/db/migrate/20131021204227_create_ui_text_snippet.rb +11 -0
  290. data/db/migrate/20131022190227_rename_table_fix_ui_text_snippets.rb +9 -0
  291. data/db/migrate/20131119154817_add_unique_index_on_uuid_on.rb +9 -0
  292. data/db/migrate/20131202161911_add_send_toi_rods_flag_to_extract_request.rb +13 -0
  293. data/db/migrate/20140122150020_add_geographic_levelto_geog_instance.rb +11 -0
  294. data/db/migrate/20140124184809_add_zip_file_location.rb +8 -0
  295. data/db/migrate/20140205205539_add_api_related_fields_to_user.rb +5 -0
  296. data/db/migrate/20140206213258_create_extract_request_error_events.rb +14 -0
  297. data/db/migrate/20140206222630_add_requesting_url_to_extract_request.rb +5 -0
  298. data/db/migrate/20140207153005_create_api_logs.rb +14 -0
  299. data/db/migrate/20140228182300_change_user_institutional_affiliation_to_bool.rb +50 -0
  300. data/db/migrate/20140312143201_add_start_and_end_time_and_total_time_to_extract_request.rb +7 -0
  301. data/db/migrate/20140318212913_remove_add_index_to_area_data_value.rb +12 -0
  302. data/db/migrate/20140319155819_add_long_mnemonic_to_area_data_value.rb +7 -0
  303. data/db/migrate/20140319200718_drop_mnemonic_column_area_data_value.rb +10 -0
  304. data/db/migrate/20140320184210_add_show_in_ui_column_in_raster_variable.rb +8 -0
  305. data/db/migrate/20140328150435_rename_revision_of_column_to_rabl_usable_column_name.rb +8 -0
  306. data/db/migrate/20140331142153_add_revision_of_column.rb +8 -0
  307. data/db/migrate/20140402181324_add_new_raster_summary_functions.rb +191 -0
  308. data/db/migrate/20140403185242_add_raster_variable_area_reference_id.rb +12 -0
  309. data/db/migrate/20140410145305_add_raster_area_column_to_terrapop_raster_summary_cache.rb +6 -0
  310. data/db/migrate/20140414170802_add_new_raster_summarization.rb +85 -0
  311. data/db/migrate/20140421150330_add_second_reference_column_to_raster_variable.rb +9 -0
  312. data/db/migrate/20140506165634_add_deactivated_at_and_deleted_at_to_user.rb +6 -0
  313. data/db/migrate/20140507142843_add_column_to_frequencies.rb +5 -0
  314. data/db/migrate/20140513143055_add_sample_geog_level_id_to_request_models.rb +11 -0
  315. data/db/migrate/20140521160554_create_links.rb +9 -0
  316. data/db/migrate/20140522214508_add_ipumsi_salt_and_ipumsi_crypted_password_to_user.rb +13 -0
  317. data/db/migrate/20140604192953_add_name_to_terrapop_setting.rb +47 -0
  318. data/db/migrate/20140609163907_create_variable_availability_caches.rb +9 -0
  319. data/db/migrate/20140609210447_add_foreign_index_to_variable_availability_cache.rb +8 -0
  320. data/db/migrate/20140609213300_create_area_data_variable_availability_caches.rb +13 -0
  321. data/db/migrate/20140610135849_create_nhgis_metadata_stores.rb +30 -0
  322. data/db/migrate/20140610211138_add_dataset_id_to_nhgis_metadata.rb +5 -0
  323. data/db/migrate/20140611181543_add_replicate_weight_variable_id_to_variables.rb +5 -0
  324. data/db/migrate/20140618200741_add_key_column_toraster_variable_group_memberships.rb +7 -0
  325. data/db/migrate/20140618202053_add_key_column_toraster_variable_group_memberships2.rb +8 -0
  326. data/db/migrate/20140701134952_create_system_statistics.rb +12 -0
  327. data/db/migrate/20140804161242_add_fields_to_terrapop_sample.rb +7 -0
  328. data/db/migrate/20140806173750_add_geometry_column_to_boundaries.rb +5 -0
  329. data/db/migrate/20140821205836_add_git_hash_field_to_extract_request.rb +5 -0
  330. data/db/migrate/20140822140106_create_map_units.rb +9 -0
  331. data/db/migrate/20140822140358_create_map_unit_raster_datasets.rb +17 -0
  332. data/db/migrate/20140822143517_redefine_short_unit_on_map_unit_to_longer_string.rb +5 -0
  333. data/db/migrate/20140825135403_add_finger_print_hash_to_maps.rb +5 -0
  334. data/db/migrate/20140826163359_add_source_field_to_terrapop_sample.rb +8 -0
  335. data/db/migrate/20140827153014_add_microdata_file_size_to_sample.rb +5 -0
  336. data/db/migrate/20140828161647_add_raster_band_index_to_raster_categories.rb +5 -0
  337. data/db/migrate/20140828162650_add_post_gis_raster_output_indicator_to_raster_variable.rb +5 -0
  338. data/db/migrate/20140829150251_create_raster_dataset_raster_variables.rb +17 -0
  339. data/db/migrate/20140902194529_add_raster_band_to_raster_dataset_model.rb +7 -0
  340. data/db/migrate/20140903202609_create_heartbeats.rb +9 -0
  341. data/db/migrate/20140903204113_create_heartbeat_pulse.rb +10 -0
  342. data/db/migrate/20140904164247_create_raster_raster_variables.rb +16 -0
  343. data/db/migrate/20140908193007_add_area_level_rasterization_functions.rb +103 -0
  344. data/db/migrate/20140908194021_create_area_data_rasters.rb +39 -0
  345. data/db/migrate/20140909143933_rename_valid_column_on_area_data_raster.rb +5 -0
  346. data/db/migrate/20140911201639_add_columns_to_area_data_raster.rb +11 -0
  347. data/db/migrate/20140911211923_alter_area_data_raster_indexes.rb +12 -0
  348. data/db/migrate/20140919144305_create_raster_variable_classifications.rb +29 -0
  349. data/db/migrate/20140925140810_add_other_raster_variables_to_raster_variable_classification.rb +9 -0
  350. data/db/migrate/20140925172245_add_grouping_indicator_to_raster_classifications.rb +5 -0
  351. data/db/migrate/20140925175157_add_classification_indicator_to_raster_variable.rb +5 -0
  352. data/db/migrate/20140930142006_remove_boundary_id_from_geog_instance.rb +6 -0
  353. data/db/migrate/20141003164150_add_terrapop_sample_id_to_map_and_geog_instance.rb +11 -0
  354. data/db/migrate/20141029202813_add_nhgis_dat_file_to_sample_geog_level.rb +5 -0
  355. data/db/migrate/20141029204521_add_columns_to_sample_level_area_data_variable.rb +6 -0
  356. data/db/migrate/20141104212652_create_categorical_raster_summarization.rb +39 -0
  357. data/db/migrate/20141105202744_add_margin_file_to_sample_geog_level.rb +5 -0
  358. data/db/migrate/20141105205347_add_margin_field_to_area_data_value.rb +5 -0
  359. data/db/migrate/20141105205607_add_join_fields_to_sample_geog_level.rb +8 -0
  360. data/db/migrate/20141202180411_add_new_categorical_summarization_function.rb +62 -0
  361. data/db/migrate/20141212172044_add_continuous_raster_summarization0.rb +51 -0
  362. data/db/migrate/20141212195611_add_indexes_to_boundaries.rb +10 -0
  363. data/db/migrate/20141212202521_add_indexes_to_frequencies.rb +7 -0
  364. data/db/migrate/20141229150743_add_special_value_to_area_data_value.rb +5 -0
  365. data/db/migrate/20141230153550_add_field_to_global_regions.rb +8 -0
  366. data/db/migrate/20150107142518_add_restriction_indicated_to_sample.rb +5 -0
  367. data/db/migrate/20150114161817_add_raster_to_tiff_function.rb +35 -0
  368. data/db/migrate/20150115204303_add_hide_nhgis_datasets_to_users.rb +11 -0
  369. data/db/migrate/20150126192918_add_new_gli_post_gis_functions.rb +99 -0
  370. data/db/migrate/20150126223419_add_short_label_to_terrapop_samples.rb +11 -0
  371. data/db/migrate/20150127172953_add_another_raster_summarization_function.rb +44 -0
  372. data/db/migrate/20150130163215_new_glc_summarization_function.rb +40 -0
  373. data/db/migrate/20150211221354_create_cache_items.rb +23 -0
  374. data/db/migrate/20150212223011_add_microdata_access_expired_date_to_users.rb +11 -0
  375. data/db/migrate/20150217221940_add_new_band_aware_categorical_to_binary_summarization.rb +177 -0
  376. data/db/migrate/20150302145459_removeuse_postgis_procedure_for_geotiff.rb +5 -0
  377. data/db/migrate/20150313194752_add_color_map_to_tiff_output.rb +34 -0
  378. data/db/migrate/20150313202158_add_color_map_to_jpeg_output.rb +34 -0
  379. data/db/migrate/20150318183314_add_non_color_map_cookie_cutter_functions.rb +65 -0
  380. data/db/migrate/20150324160629_add_categorical_multi_band_summarization.rb +62 -0
  381. data/db/migrate/20150324161827_add_index_to_rasters_raster_variable_id.rb +5 -0
  382. data/db/migrate/20150327203257_add_band_to_terrapop_raster_summary_cache.rb +5 -0
  383. data/db/migrate/20150331142232_add_xml_field_to_map.rb +5 -0
  384. data/db/migrate/20150331153703_add_new_continous_summarization.rb +38 -0
  385. data/db/migrate/20150409153145_categorical_to_binary_as_raster.rb +49 -0
  386. data/db/migrate/20150413204130_generic_categorical_to_binary_raster_output_function.rb +92 -0
  387. data/db/migrate/20150416133743_ratio_area_level_data_to_raster_function.rb +55 -0
  388. data/db/migrate/20150416143838_projection_function_for_single_band_rasters.rb +27 -0
  389. data/db/migrate/20150419203614_add_raster_dataset_to_terrapop_raster_summary_cache.rb +12 -0
  390. data/db/migrate/20150419232521_add_raster_dataset_to_request_raster_variable.rb +9 -0
  391. data/db/migrate/20150427163939_create_single_binary_from_categorical_to_tiff_function.rb +51 -0
  392. data/db/migrate/20150518200435_add_new_binary_cookie_cutter_functions.rb +95 -0
  393. data/db/migrate/20150520195145_revised_glc_binary_summarization_function.rb +64 -0
  394. data/db/migrate/20150526205918_new_categorical_to_binary_summarization.rb +72 -0
  395. data/db/migrate/20150527144243_even_newer_glc_binary_function.rb +79 -0
  396. data/db/migrate/20150527191853_add_even_newer_glc_category_to_binary_function.rb +74 -0
  397. data/db/migrate/20150528141915_yancat_to_bin_summarization_function.rb +66 -0
  398. data/db/migrate/20150529182542_add_indexes_to_geog_instances.rb +9 -0
  399. data/db/migrate/20150601160855_drop_area_data_variable_availability_caches.rb +5 -0
  400. data/db/migrate/20150625150152_add_geog_instance_f_key_on_boundaries.rb +5 -0
  401. data/db/migrate/20150626144305_geog_instance_geog_code_wider.rb +6 -0
  402. data/db/migrate/20150709161201_glc_summarization_version5.rb +79 -0
  403. data/db/migrate/20150713165442_glc_summarization_version6.rb +82 -0
  404. data/db/migrate/20150713185652_tp_jpeg_raster_clip_color_map_v2.rb +34 -0
  405. data/db/migrate/20150716182438_new_rasters_table.rb +18 -0
  406. data/db/migrate/20150716184828_new_stored_procedures_for_new_rasters.rb +70 -0
  407. data/db/migrate/20150721161943_remove_ownership_statement_from_function.rb +69 -0
  408. data/db/migrate/20150727134942_rename_rasters_new_to_new_rasters.rb +19 -0
  409. data/db/migrate/20150727135614_update_table_name_in_make_jpeg2.rb +70 -0
  410. data/db/migrate/20150727143159_jpeg_clip_experiment.rb +36 -0
  411. data/db/migrate/20150727145556_create_new_tiff_raster_clip_with_buffer.rb +34 -0
  412. data/db/migrate/20150727161508_update_table_name_in_make_jpeg2_part_deux.rb +77 -0
  413. data/db/migrate/20150727193403_drop_rasters_new.rb +5 -0
  414. data/db/migrate/20150728184718_make_jpeg2_part_deux.rb +70 -0
  415. data/db/migrate/20150728214344_correct_new_rasters_table_in_new_make_jpeg2_function.rb +79 -0
  416. data/db/migrate/20150729144526_even_more_correct_new_rasters_table_in_new_make_jpeg2_function.rb +78 -0
  417. data/db/migrate/20150729160936_fixingterrapop_reclassify_categorical_raster_to_binary_summariz_v3.rb +68 -0
  418. data/db/migrate/20150730141036_adjust_jpeg_clip_for_categorical.rb +67 -0
  419. data/db/migrate/20150730153216_ststandardize_terrapop_reclassify_categorical_raster_to_binary_summariz_v3.rb +69 -0
  420. data/db/migrate/20150730163446_add_origin_to_extract_requests.rb +5 -0
  421. data/db/migrate/20150731151304_consistent_return_fieldsterrapop_gli_yield_areal_summarization.rb +99 -0
  422. data/db/migrate/20150731192327_add_boundary_only_field_to_terrapop_sample.rb +5 -0
  423. data/db/migrate/20150803213048_add_function_to_detect_boundaries_that_wrap_globe.rb +50 -0
  424. data/db/migrate/20150814154127_add_processing_flag_to_extract_request.rb +5 -0
  425. data/db/migrate/20150814165605_add_colormapped_categorical_to_binary_jpeg_cookie_cutteringizing_function.rb +49 -0
  426. data/db/migrate/20150814183708_around_the_world_wrap_a_raster_function.rb +157 -0
  427. data/db/migrate/20150910194333_add_extract_grouping_field_to_extract_request.rb +5 -0
  428. data/db/migrate/20150915194808_drop_sessions_table.rb +5 -0
  429. data/db/migrate/20150915215426_add_sessions_table.rb +12 -0
  430. data/db/migrate/20151009203606_create_sample_detail_groups.rb +8 -0
  431. data/db/migrate/20151009203855_create_sample_detail_fields.rb +13 -0
  432. data/db/migrate/20151009204052_create_sample_detail_values.rb +12 -0
  433. data/db/migrate/20151016152953_add_indexes_to_area_data_values.rb +7 -0
  434. data/db/migrate/20151023160555_add_data_to_extract_requests.rb +8 -0
  435. data/db/migrate/20151026155953_rename_description_add_title_to_extract_requests.rb +8 -0
  436. data/db/migrate/20151029144017_create_raster_dataset_groups.rb +9 -0
  437. data/db/migrate/20151029144147_add_raster_dataset_group_to_raster_dataset.rb +9 -0
  438. data/db/migrate/20151029182802_add_mnemonic_to_raster_dataset_group.rb +5 -0
  439. data/db/migrate/20151029184642_change_field_type_on_raster_dataset_group.rb +5 -0
  440. data/db/migrate/20151029210539_remove_unnecessary_fields_from_terrapop_sample.rb +60 -0
  441. data/db/migrate/20151102205254_create_data_artifacts.rb +17 -0
  442. data/db/migrate/20151102211601_add_json_field_to_extract_data_artifacts.rb +8 -0
  443. data/db/migrate/20151103152754_add_file_name_field_to_extract_request.rb +5 -0
  444. data/db/migrate/20151106155249_add_submitted_at_to_extract_request.rb +5 -0
  445. data/db/migrate/20151110204826_add_terra_pop_build_number_to_extract_request.rb +12 -0
  446. data/db/migrate/20151119213428_create_area_data_raster_variable_mnemonic_lookups.rb +18 -0
  447. data/db/migrate/20151120140757_create_extract_request_area_data_raster_variable_mnemonic_lookups.rb +16 -0
  448. data/db/migrate/20151130212011_add_new_raster_summarization_v7.rb +90 -0
  449. data/lib/tasks/terrapop_models_tasks.rake +4 -0
  450. data/lib/terrapop_models.rb +4 -0
  451. data/lib/terrapop_models/engine.rb +13 -0
  452. data/lib/terrapop_models/version.rb +3 -0
  453. data/test/dummy/README.rdoc +28 -0
  454. data/test/dummy/Rakefile +6 -0
  455. data/test/dummy/app/assets/javascripts/application.js +13 -0
  456. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  457. data/test/dummy/app/controllers/application_controller.rb +5 -0
  458. data/test/dummy/app/helpers/application_helper.rb +2 -0
  459. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  460. data/test/dummy/bin/bundle +3 -0
  461. data/test/dummy/bin/rails +4 -0
  462. data/test/dummy/bin/rake +4 -0
  463. data/test/dummy/config.ru +4 -0
  464. data/test/dummy/config/application.rb +23 -0
  465. data/test/dummy/config/boot.rb +5 -0
  466. data/test/dummy/config/database.yml +68 -0
  467. data/test/dummy/config/environment.rb +5 -0
  468. data/test/dummy/config/environments/development.rb +37 -0
  469. data/test/dummy/config/environments/production.rb +78 -0
  470. data/test/dummy/config/environments/test.rb +39 -0
  471. data/test/dummy/config/initializers/assets.rb +8 -0
  472. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  473. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  474. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  475. data/test/dummy/config/initializers/inflections.rb +16 -0
  476. data/test/dummy/config/initializers/mime_types.rb +4 -0
  477. data/test/dummy/config/initializers/session_store.rb +3 -0
  478. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  479. data/test/dummy/config/locales/en.yml +23 -0
  480. data/test/dummy/config/routes.rb +4 -0
  481. data/test/dummy/config/secrets.yml +22 -0
  482. data/test/dummy/log/development.log +62 -0
  483. data/test/dummy/public/404.html +67 -0
  484. data/test/dummy/public/422.html +67 -0
  485. data/test/dummy/public/500.html +66 -0
  486. data/test/dummy/public/favicon.ico +0 -0
  487. data/test/integration/navigation_test.rb +10 -0
  488. data/test/terrapop_models_test.rb +7 -0
  489. data/test/test_helper.rb +19 -0
  490. metadata +597 -0
@@ -0,0 +1,2 @@
1
+ class ErrorEvent < ActiveRecord::Base
2
+ end
@@ -0,0 +1,4 @@
1
+ class ExtractDataArtifact < ActiveRecord::Base
2
+ belongs_to :extract_request
3
+ store_accessor :variables_description
4
+ end
@@ -0,0 +1,817 @@
1
+ require 'extract_type'
2
+ require 'chronic_duration'
3
+
4
+ class ExtractRequest < ActiveRecord::Base
5
+ include ExtractEngine::FileManagement
6
+ include ActiveModel::Validations
7
+
8
+ class ExtractTypeConst
9
+ # see data/static_data.yml for the available status_definitions
10
+ # [:RASTER, :AREA, :UNKNOWN, :MICRODATA]
11
+
12
+ #def self.const_missing(name)
13
+ #abort("Unable to find [#{name.to_s}]")
14
+ #end
15
+
16
+ def self.define_consts
17
+ @@extract_types = ExtractType.all
18
+ # magic constant injections!
19
+ @@extract_types.each do |extract_type|
20
+ label = extract_type.label
21
+ raise "Your database maybe in an unknown state; ExtractType's label is nil" if label.nil?
22
+ label = label.downcase.gsub(/ /, '_')
23
+ self.const_set(label.upcase, label)
24
+ parent.scope(label, -> { parent.where(status: label) })
25
+ end
26
+ end
27
+
28
+
29
+ def self.const_missing(name)
30
+ name.downcase.to_s
31
+ end
32
+
33
+ end
34
+
35
+
36
+ class NewuiExtractValidator < ActiveModel::Validator
37
+
38
+ def validate(record)
39
+ record.errors[:base] << 'Undefined User' if record.user.blank?
40
+ record.errors[:base] << 'Undefined Extract' if record.data.blank?
41
+ record.errors[:base] << 'Unknown Extract Type' if record.data["type"].blank?
42
+ record.errors[:base] << 'Wrong Extract Type' unless ["arealevel", "microdata", "raster"].include?(record.data["type"])
43
+ record.errors[:base] << 'Unknown Extract Title' if record.data["title"].blank?
44
+ record.errors[:base] << "Wrong value in 'Include boundary files'" unless !!record.data["boundary"] == record.data["boundary"]
45
+ record.errors[:base] << "Wrong value in 'Send Extract to data grid'" unless !!record.data["datagrid"] == record.data["datagrid"]
46
+ case record.data["type"]
47
+ when "microdata"
48
+ when "arealevel"
49
+ if record.data["arealevel_variables"].empty? && record.data["arealevel_datasets"].empty?
50
+ if record.data["raster_variables"].empty? && record.data["raster_datasets"].empty?
51
+ record.errors[:base] << "Both 'Area-Level Data' and 'Raster Data' are empty"
52
+ else
53
+ record.errors[:base] << "Missing 'Georgraphic Level' for 'Raster Data'" if record.data["raster_geographic_levels"].empty?
54
+ record.errors[:base] << "Missing 'Operations' for 'Raster Data'" if record.data["raster_operations"].empty?
55
+ end
56
+ else
57
+ record.errors[:base] << "Missing 'Georgraphic Level' for 'Area-Level Data'" if record.data["arealevel_geographic_levels"].empty?
58
+ record.errors[:base] << "Missing 'Operations' for 'Raster Data'" if !(record.data["raster_variables"].empty? || record.data["raster_datasets"].empty?) && record.data["raster_operations"].empty?
59
+ end
60
+ when "raster"
61
+ end
62
+ end
63
+
64
+ end
65
+
66
+
67
+ store_accessor :data
68
+
69
+ has_many :extract_statuses, dependent: :destroy
70
+ has_many :extract_request_submissions, dependent: :destroy
71
+ # For creating the request incrementally and for reporting, you need these directly
72
+ has_many :request_area_data_variables, dependent: :destroy
73
+ # You may pass these to the extract engine, if no extra attributes of the requested variables are required on a per request basis.
74
+ has_many :area_data_variables, -> { uniq }, through: :request_area_data_variables, dependent: :destroy
75
+ has_many :request_variables, dependent: :destroy
76
+ has_many :variables, -> { uniq }, through: :request_variables, dependent: :destroy
77
+ has_many :request_raster_variables, dependent: :destroy
78
+ has_many :raster_variables, -> { uniq }, through: :request_raster_variables, dependent: :destroy
79
+ has_many :request_geog_units, dependent: :destroy
80
+ has_many :geog_units, -> { uniq }, through: :request_geog_units, dependent: :destroy
81
+ has_many :request_terrapop_samples, dependent: :destroy
82
+ has_many :terrapop_samples, -> { uniq }, through: :request_terrapop_samples, dependent: :destroy
83
+ has_many :request_samples, dependent: :destroy
84
+ has_many :samples, -> { uniq }, through: :request_samples, dependent: :destroy
85
+ has_many :request_raster_datasets, dependent: :destroy
86
+ has_many :raster_datasets, -> { uniq }, through: :request_raster_datasets, dependent: :destroy
87
+ has_many :request_sample_geog_levels, dependent: :destroy
88
+ has_many :sample_geog_levels, -> { order(id: :desc).uniq }, through: :request_sample_geog_levels, dependent: :destroy
89
+ has_many :extract_request_error_events, dependent: :destroy
90
+ has_many :error_events, through: :extract_request_error_events, dependent: :destroy
91
+ has_many :derivatives, class_name: "ExtractRequest", foreign_key: "revision_of_id", dependent: :nullify
92
+ has_many :extract_request_area_data_raster_variable_mnemonic_lookups, dependent: :destroy
93
+ has_many :area_data_raster_variable_mnemonic_lookups, through: :extract_request_area_data_raster_variable_mnemonic_lookups, dependent: :destroy
94
+
95
+ has_and_belongs_to_many :labels, join_table: "extract_requests_labels"
96
+
97
+ has_many :extract_data_artifacts
98
+
99
+ belongs_to :user
100
+ belongs_to :derivative, class_name: "ExtractRequest", foreign_key: "revision_of_id"
101
+
102
+ scope :submissions, -> { where(submitted: true) }
103
+ scope :unsubmitted, -> { where(submitted: false) }
104
+ scope :recent, -> { where("created_at > ?", Time.now - 7.day) }
105
+ scope :queued, -> { where(finish_extract_time: nil).joins(:extract_statuses).where(extract_statuses: {status: 'enqueued'}) }
106
+ scope :get_user_extracts, ->(user_id) { where(user_id: user_id) }
107
+ scope :get_submitted_user_extracts, ->(user_id) { distinct.where(user_id: user_id).joins(:extract_statuses).where.not(extract_statuses: {status: 'building_request'}) }
108
+
109
+ validates_with NewuiExtractValidator, on: :create, if: :from_newui?
110
+
111
+ after_create :normalize_attributes
112
+
113
+
114
+ def self.dump_all
115
+ {
116
+ self.to_s.underscore.pluralize => self.where.not(user: nil).find_each.map { |extract|
117
+ micro_variable_mnemonics = extract.variables.select(:mnemonic).map(&:mnemonic)
118
+ area_variable_mnemonics = extract.area_data_variables.select(:mnemonic).map(&:mnemonic)
119
+ raster_dataset_mnemonics = extract.raster_datasets.select(:mnemonic).map(&:mnemonic)
120
+ terrapop_sample_mnemonics = extract.terrapop_samples.select(:label).map(&:label)
121
+ sample_names = extract.samples.select(:name).map(&:name)
122
+ {
123
+ 'variable_ids' => micro_variable_mnemonics,
124
+ 'area_data_variable_ids' => area_variable_mnemonics,
125
+ 'raster_dataset_ids' => raster_dataset_mnemonics,
126
+ 'terrapop_sample_ids' => terrapop_sample_mnemonics,
127
+ 'sample_ids' => sample_names,
128
+ 'boundary_files' => extract.boundary_files,
129
+ 'title' => extract.title,
130
+ 'notes' => extract.notes,
131
+ 'user_id' => extract.user.email,
132
+ 'uuid' => extract.uuid,
133
+ 'submitted' => extract.submitted,
134
+ 'created_at' => extract.created_at,
135
+ 'updated_at' => extract.updated_at,
136
+ #'derivative' => extract.uuid,
137
+ 'file_type' => extract.file_type,
138
+ 'raster_only' => extract.raster_only,
139
+ 'send_to_irods' => extract.send_to_irods,
140
+ 'extract_url' => extract.extract_url,
141
+ 'request_url' => extract.request_url,
142
+ 'begin_extract_time' => extract.begin_extract_time,
143
+ 'finish_extract_time' => extract.finish_extract_time,
144
+ 'total_time' => extract.total_time
145
+ }
146
+ },
147
+ 'request_raster_variables' => RequestRasterVariable.find_each.map { |request_variable|
148
+ unless request_variable.raster_operation.nil?
149
+ unless request_variable.extract_request.user.nil?
150
+ {
151
+ 'extract_request_id' => request_variable.extract_request.uuid,
152
+ 'raster_variable_id' => request_variable.raster_variable.mnemonic,
153
+ 'raster_operation_id' => request_variable.raster_operation.name
154
+ }
155
+ end
156
+ end
157
+ }.compact
158
+ }
159
+ end
160
+
161
+
162
+ def from_newui?
163
+ self.origin == 'newui'
164
+ end
165
+
166
+
167
+ def most_recent_submitted_at
168
+ mrsa = self.extract_request_submissions.most_recent.first
169
+ mrsa.submitted_at unless mrsa.nil?
170
+ end
171
+
172
+
173
+ def hierarchical?
174
+ self.file_type == "hierarchical"
175
+ end
176
+
177
+
178
+ def name
179
+ "terrapop_extract_#{id.to_s}"
180
+ end
181
+
182
+
183
+ # Public path in URL, can't get from terrapop.yml
184
+ def extract_file_path(ext = nil)
185
+ path = File.join(location, name)
186
+ path += ".#{ext}" unless ext.nil?
187
+ path
188
+ end
189
+
190
+
191
+ # Public path in URL, can't get from Terrapop.yml
192
+ def download_path
193
+ #"/extracts/#{user_directory()}/#{extract_directory()}"
194
+ File.join('/extracts', user_directory, extract_directory)
195
+ end
196
+
197
+
198
+ def boundary_file_stub
199
+ "boundaryfiles_#{id.to_s}"
200
+ end
201
+
202
+
203
+ def boundary_file_name(sample_geog_level)
204
+ "#{boundary_file_stub}_#{sample_geog_level.internal_code.to_s}"
205
+ end
206
+
207
+
208
+ def boundary_file_names
209
+ sample_geog_levels.map{ |sgl| boundary_file_name(sgl) }
210
+ end
211
+
212
+
213
+ def boundary_file_bundle
214
+ "#{boundary_file_stub}.zip"
215
+ end
216
+
217
+
218
+ def boundary_file_bundle_path
219
+ File.join(location, boundary_file_bundle)
220
+ end
221
+
222
+ def data_file_summaries
223
+ str = []
224
+ unless extract_data_artifacts.count == 0
225
+
226
+ extract_data_artifacts.each do |eda|
227
+ str << "Data File: " + eda.variables_description[:filename]
228
+ if boundary_files
229
+ str << "Boundary Shapefile: " + eda.variables_description[:boundary_filename]
230
+ end
231
+ str << "Country: " + eda.variables_description[:country]
232
+ str << "Data Year(s): " + eda.variables_description[:years]
233
+ str << "Geographic Level: " + eda.variables_description[:geog_unit] + ": " + eda.variables_description[:country_level]
234
+ str << ""
235
+ end
236
+
237
+ end
238
+ str.join("\n")
239
+
240
+ end
241
+
242
+ def data_dictionaries
243
+ str = []
244
+ unless extract_data_artifacts.count == 0
245
+ extract_data_artifacts.each do |eda|
246
+ str << "Data File: " + eda.variables_description[:filename]
247
+ eda.variables_description[:columns].each do |column|
248
+ adrvml = AreaDataRasterVariableMnemonicLookup.where(composite_mnemonic: column).first
249
+ str << column.to_s + ": " + (adrvml.nil? ? "N/A" : adrvml.description)
250
+ end
251
+ str << ""
252
+ end
253
+ end
254
+ str.join("\n")
255
+ end
256
+
257
+ # Need an area data variable for every sample_geog_level+ area data variable combination.
258
+ def expanded_request_area_data_variables
259
+ request_area_data_variables.map { |variable|
260
+ sample_geog_levels.map do |sg|
261
+ request_variable = RequestAreaDataVariable.new
262
+ request_variable.area_data_variable = variable.area_data_variable
263
+ request_variable.extract_request = variable.extract_request
264
+ request_variable.sample_geog_level = sg
265
+ request_variable
266
+ end
267
+ }.flatten
268
+ end
269
+
270
+
271
+ def expanded_request_raster_variables
272
+ # .reject{|v| v.raster_operation_id.nil? or v.raster_dataset_id.nil? }
273
+ request_raster_variables.map { |variable|
274
+ sample_geog_levels.map do |sg|
275
+ request_variable = RequestRasterVariable.new
276
+ #request_variable.raster_variable_id = variable.raster_variable.id
277
+ #request_variable.raster_operation_id = variable.raster_operation.id
278
+ #request_variable.extract_request_id = variable.extract_request.id
279
+ #request_variable.raster_dataset_id = variable.raster_dataset.id
280
+ #request_variable.sample_geog_level_id = sg.id
281
+ request_variable.raster_variable = variable.raster_variable
282
+ request_variable.raster_operation = variable.raster_operation
283
+ request_variable.extract_request = variable.extract_request
284
+ request_variable.raster_dataset = variable.raster_dataset
285
+ request_variable.sample_geog_level = sg
286
+ request_variable
287
+ end
288
+ }.flatten
289
+ #puts "\n\nexpanded_request_raster_variables: \n"
290
+ #puts "#{rrvs.map{|rrv| rrv.inspect}.join("\n")}"
291
+ #rrvs
292
+ end
293
+
294
+ def has_area_data_variables?
295
+ area_data_variables.count > 0
296
+ end
297
+
298
+
299
+ def has_microdata_variables?
300
+ variables.count > 0
301
+ end
302
+
303
+
304
+ def has_raster_variables?
305
+ raster_variables.count > 0
306
+ end
307
+
308
+
309
+ def has_variables?
310
+ has_area_data_variables? || has_microdata_variables? || has_raster_variables?
311
+ end
312
+
313
+
314
+ def is_empty?
315
+ !has_variables?
316
+ end
317
+
318
+
319
+ def variables_count
320
+ area_data_variables.count + variables.count + raster_variables.count
321
+ end
322
+
323
+
324
+ def datasets_count
325
+ terrapop_samples.count + samples.count + raster_datasets.count
326
+ end
327
+
328
+
329
+ def has_area_data_variable?
330
+ area_data_variables.exists?(mnemonic: mnemonic)
331
+ end
332
+
333
+
334
+ def has_microdata_variable?(mnemonic)
335
+ variables.exists?(mnemonic: mnemonic)
336
+ end
337
+
338
+
339
+ def has_raster_variable?(mnemonic)
340
+ raster_variables.exists?(mnemonic: mnemonic)
341
+ end
342
+
343
+
344
+ def has_variable?(mnemonic, type)
345
+ case type
346
+ when ExtractTypeConst::AGGREGATE
347
+ has_area_data_variable?(mnemonic)
348
+ when ExtractTypeConst::MICRODATA
349
+ has_microdata_variable?(mnemonic)
350
+ when ExtractTypeConst::RASTER
351
+ has_raster_variable?(mnemonic)
352
+ else
353
+ false
354
+ end
355
+ end
356
+
357
+
358
+ def extract_type
359
+ if (has_raster_variables? || has_area_data_variables?) && has_microdata_variables?
360
+ ExtractTypeConst::AGGREGATE_ATTACHED_TO_MICRODATA
361
+ elsif has_microdata_variables?
362
+ ExtractTypeConst::MICRODATA
363
+ elsif has_area_data_variables? && !raster_only
364
+ ExtractTypeConst::AGGREGATE
365
+ elsif has_area_data_variables? && raster_only
366
+ ExtractTypeConst::RASTER
367
+ elsif has_raster_variables? && !raster_only
368
+ ExtractTypeConst::AGGREGATE
369
+ elsif has_raster_variables? && raster_only
370
+ ExtractTypeConst::RASTER
371
+ else
372
+ ExtractTypeConst::NO_DATA
373
+ end
374
+ end
375
+
376
+
377
+ def submit
378
+ # Changing the submitted setting first captures the idea that the extract is intended to be created and the user wants the data
379
+ # requested. This will be set even if the documentation / syntax file step or the
380
+ # enqueueing step fails.
381
+ #update_attribute(:processing, false)
382
+ update_attribute(:submitted_at, DateTime.now())
383
+ update_attribute(:submitted, true)
384
+
385
+ begin
386
+ tp_web_build = Rails.configuration.build_number
387
+
388
+ unless tp_web_build.to_s.is_i?
389
+ tp_web_build = -1
390
+ end
391
+
392
+ rescue
393
+ tp_web_build = -1
394
+ end
395
+
396
+ update_attribute(:tp_web_build_number, tp_web_build)
397
+
398
+ enqueue
399
+ end
400
+
401
+
402
+ def completed
403
+ add_status(ExtractStatus::COMPLETED)
404
+ end
405
+
406
+
407
+ def failed
408
+ add_status(ExtractStatus::FAILED)
409
+ end
410
+
411
+
412
+ def enqueue
413
+ ers = ExtractRequestSubmission.new
414
+ ers.submitted_at = Time.new
415
+ ers.save
416
+ self.extract_request_submissions << ers
417
+ #update_attribute(:processing, false)
418
+
419
+ add_status(ExtractStatus::ENQUEUED, {processing: false})
420
+ end
421
+
422
+
423
+ def begin_processing
424
+ ### This method usually only gets called by the extract engine.
425
+
426
+ add_status(ExtractStatus::PROCESSING)
427
+
428
+ begin
429
+ tp_xtr_build = Rails.configuration.build_number
430
+
431
+ unless tp_xtr_build.to_s.is_i?
432
+ tp_xtr_build = -1
433
+ end
434
+
435
+ rescue
436
+ tp_xtr_build = -1
437
+ end
438
+
439
+ update_attribute(:tp_xtr_build_number, tp_xtr_build)
440
+
441
+ end
442
+
443
+
444
+ def waiting
445
+ add_status(ExtractStatus::WAITING)
446
+ end
447
+
448
+
449
+ def stopped
450
+ add_status(ExtractStatus::STOPPED)
451
+ end
452
+
453
+
454
+ def email_sent
455
+ add_status(ExtractStatus::EMAIL_SENT)
456
+ end
457
+
458
+
459
+ def building_request
460
+ add_status(ExtractStatus::BUILDING_REQUEST)
461
+ end
462
+
463
+
464
+ def should_stop
465
+ add_status(ExtractStatus::SHOULD_STOP)
466
+ end
467
+
468
+
469
+ def current_status
470
+ extract_statuses.order(:updated_at).last
471
+ end
472
+
473
+
474
+ def is_completed?
475
+ current_status.status == ExtractStatus::COMPLETED
476
+ end
477
+
478
+
479
+ def is_failed?
480
+ current_status.status == ExtractStatus::FAILED
481
+ end
482
+
483
+
484
+ def is_enqueued?
485
+ current_status.status == ExtractStatus::ENQUEUED
486
+ end
487
+
488
+
489
+ def is_processing?
490
+ current_status.status == ExtractStatus::PROCESSING
491
+ end
492
+
493
+
494
+ def is_waiting?
495
+ current_status.status == ExtractStatus::WAITING
496
+ end
497
+
498
+
499
+ def is_stopped?
500
+ current_status.status == ExtractStatus::STOPPED
501
+ end
502
+
503
+
504
+ def is_email_sent?
505
+ current_status.status == ExtractStatus::EMAIL_SENT
506
+ end
507
+
508
+
509
+ def is_building_request?
510
+ current_status.status == ExtractStatus::BUILDING_REQUEST
511
+ end
512
+
513
+
514
+ def should_stop?
515
+ current_status.status == ExtractStatus::SHOULD_STOP
516
+ end
517
+
518
+
519
+ def can_be_resubmitted?
520
+ (is_completed? || is_failed? || is_stopped? || is_email_sent?) || false
521
+ end
522
+
523
+ # This is efficient for getting the current statuses where that status
524
+ # is "enqueued". Otherwise we'd have to use includes(:extract_status) on
525
+ # lots of extract_requests and filter. If this is slow check for indexing on extract_statuses.
526
+ def self.enqueued
527
+ ExtractStatus.current.enqueued.extracts.map { |status| status.extract_request }
528
+ end
529
+
530
+ def self.extract_group_count(group_str)
531
+ ExtractStatus.current.enqueued.extracts.joins("INNER JOIN extract_requests er ON er.id = extract_statuses.extract_request_id").where("extract_requests.extract_grouping" => group_str).count
532
+ end
533
+
534
+ def self.get_next_in_queue
535
+ ActiveRecord::Base.transaction {
536
+ extract_ids = ExtractStatus.current.enqueued.extracts.map { |status| status.extract_request_id }
537
+ found = false
538
+ e = nil
539
+ while extract_ids.count > 0 and found == false
540
+ extract_id = extract_ids.shift
541
+
542
+ sql = "SELECT id FROM extract_requests WHERE id = #{extract_id} AND processing = false FOR UPDATE"
543
+ results = ActiveRecord::Base.connection.execute(sql).first
544
+ unless results.nil?
545
+ extract_id = results['id']
546
+ sql = "UPDATE extract_requests SET processing = true WHERE id = #{extract_id}"
547
+ ActiveRecord::Base.connection.execute(sql)
548
+ found = true
549
+ e = ExtractRequest.find(extract_id)
550
+ end
551
+
552
+ end
553
+
554
+ e
555
+ }
556
+ end
557
+
558
+ def self.num_extracts_in_queue
559
+ ExtractStatus.current.enqueued.extracts.count
560
+ end
561
+
562
+ def mnemonic(request_variable)
563
+ use_long_svar_mnemonic?(request_variable.variable) ? request_variable.long_mnemonic : request_variable.mnemonic
564
+ end
565
+
566
+ def use_long_svar_mnemonic?(variable)
567
+ variable.is_svar? && !variable.long_mnemonic.blank? # && use_long_svar_names?
568
+ end
569
+
570
+ def category_code(request_variable, category)
571
+ request_variable.general? ? category.code[0..request_variable.width - 1] : category.code
572
+ end
573
+
574
+ def self.duplicate(id_or_extract)
575
+ if extract = ExtractRequest.find(id_or_extract)
576
+ new_extract = ExtractRequest.create
577
+ new_extract.area_data_variables = extract.area_data_variables
578
+ new_extract.terrapop_samples = extract.terrapop_samples
579
+ new_extract.variables = extract.variables.where(preselect_status: 0)
580
+ new_extract.samples = extract.samples
581
+ extract.request_raster_variables.each do |variable|
582
+ new_extract.request_raster_variables.create({raster_variable: variable.raster_variable, raster_operation: variable.raster_operation, raster_dataset: variable.raster_dataset})
583
+ end
584
+ new_extract.raster_datasets = extract.raster_datasets
585
+ new_extract.geog_units = extract.geog_units
586
+ new_extract.sample_geog_levels = extract.sample_geog_levels #quickfix that may have complications!
587
+ new_extract.boundary_files = extract.boundary_files
588
+ new_extract.send_to_irods = extract.send_to_irods
589
+ new_extract.file_type = extract.file_type
590
+ new_extract.raster_only = extract.raster_only
591
+ new_extract.title = "Revision of Extract #{extract.id}" + ((!extract.title.blank? && " - #{extract.title}") || '')
592
+ new_extract.revision_of_id = extract.id
593
+ new_extract.user_id = extract.user_id
594
+ new_extract.save
595
+ new_extract.reload
596
+ end
597
+ end
598
+
599
+
600
+ def microdata_size_in_bytes
601
+ total = 0
602
+ samples.each do |sample|
603
+ h_records = sample.h_records
604
+ p_records = sample.p_records
605
+ t_h = 0
606
+ t_p = 0
607
+ variables.each do |variable|
608
+ size = variable.column_width
609
+ if variable.record_type == 'H'
610
+ t_h += (size * h_records)
611
+ elsif variable.record_type == 'P'
612
+ t_p += (size * p_records)
613
+ end
614
+ end
615
+ total += t_h + t_p
616
+ end
617
+ total
618
+ end
619
+
620
+
621
+ def extract_zip_file
622
+ file = nil
623
+ if !self.extract_url.nil? && is_completed?
624
+ begin
625
+ file = File.join(Rails.root.to_s, "public", URI(self.extract_url).request_uri)
626
+ rescue Exception => e
627
+ Rails.logger.debug e
628
+ end
629
+ end
630
+ file
631
+ end
632
+
633
+
634
+ def extract_zip_exists?
635
+ file = self.extract_zip_file
636
+ file.nil? ? false : File.exist?(file)
637
+ end
638
+
639
+
640
+ def extract_zip_size
641
+ self.extract_zip_exists? ? File.size(self.extract_zip_file) : nil
642
+ end
643
+
644
+
645
+ def extract_zip_readable_size
646
+ self.extract_zip_exists? ? "#{('%.2f' % ((self.extract_zip_size).to_f / 2**20)).to_f} MB" : ''
647
+ end
648
+
649
+
650
+ # Puts all variables together in a list in the order they should appear in the extract
651
+ def variables_in_extract
652
+ layout_variables = variables + expanded_request_area_data_variables + expanded_request_raster_variables
653
+ if extract_type == ExtractRequest::ExtractTypeConst::AGGREGATE
654
+ #$stderr.puts "======> sample_geog_levels: " + sample_geog_levels.inspect
655
+ raise "There were no sample_geog_levels, extract FAILED!!" if sample_geog_levels.first.nil?
656
+ layout_variables = sample_geog_levels.first.variables_for_area_data_extracts + layout_variables
657
+ end
658
+ layout_variables.sort{ |a,b| a.mnemonic<=>b.mnemonic }
659
+ end
660
+
661
+
662
+ # helper method to get all the years covered by the extract request
663
+ def years
664
+ yrs = terrapop_samples.pluck(:year)
665
+ yrs += samples.pluck(:year)
666
+ yrs.uniq!
667
+ years = Hash[ yrs.map { |year| [year, true] } ]
668
+ years[:count] = yrs.length
669
+ years
670
+ end
671
+
672
+
673
+ # helper method to get all the countries covered by the extract request
674
+ def countries
675
+ cntries = terrapop_samples.pluck(:short_country_name)
676
+ cntries += samples.find_each.map { |sample| sample.short_country_name }
677
+ cntries.uniq!
678
+ countries = Hash[ cntries.map { |country| [country, true] } ]
679
+ countries[:count] = cntries.length
680
+ countries
681
+ end
682
+
683
+
684
+ def add_preselected_variables
685
+ if !self.raster_only && self.variables.count > 0
686
+ preselected_variables = Variable.where(preselect_status: 1).map{ |v| {v => false} }.reduce({}, :merge)
687
+ self.samples.each do |s|
688
+ preselected_variables.each do |var, v|
689
+ if v == false and var.included_in?(s)
690
+ preselected_variables[var] = true
691
+ end
692
+ end
693
+ end
694
+ self.variables.concat preselected_variables.reject{ |k, v| v == false }.keys
695
+ end
696
+ end
697
+
698
+
699
+ def self.new_extract_grouping
700
+ str = SecureRandom::hex(8)
701
+ while ExtractRequest.where(extract_grouping: str).count > 0
702
+ str = SecureRandom::hex(8)
703
+ end
704
+ str
705
+ end
706
+
707
+
708
+ def import
709
+ # this method is very cusomized for arealevel extract worflow, more to come
710
+ self.title = self.data["title"]
711
+ self.notes = self.data["notes"]
712
+ self.boundary_files = self.data["boundary"]
713
+ self.send_to_irods = self.data["datagrid"]
714
+ self.raster_only = self.data["type"] == "raster"
715
+ self.file_type = 'csv' #maybe a case on the self.data["type"]
716
+ #self.variables = coming soon
717
+ #self.samples = coming soon
718
+ self.area_data_variables = AreaDataVariable.where(mnemonic: self.data["arealevel_variables"])
719
+ self.terrapop_samples = TerrapopSample.where(id: self.data["arealevel_datasets"])
720
+ geographic_level_ids = self.data["arealevel_geographic_levels"].empty? ? (self.data["raster_geographic_levels"].empty? ? [] : self.data["raster_geographic_levels"]) : self.data["arealevel_geographic_levels"]
721
+ unless geographic_level_ids.empty?
722
+ self.sample_geog_levels = SampleGeogLevel.where(id: geographic_level_ids)
723
+ self.geog_units = self.sample_geog_levels.map{ |sgl| sgl.geog_unit }.uniq
724
+ end
725
+ self.raster_datasets = RasterDataset.where(mnemonic: self.data["raster_datasets"])
726
+ self.data["raster_operations"].each do |variable_mnemonic, operation_opcodes|
727
+ raster_variable = RasterVariable.find_by(mnemonic: variable_mnemonic)
728
+ unless raster_variable.nil?
729
+ raster_variable.raster_datasets.where(mnemonic: data["raster_datasets"]).each do |raster_dataset|
730
+ RasterOperation.where(opcode: operation_opcodes).each do |operation|
731
+ raster_operations = []
732
+ raster_operations.push(operation.children.size > 0 ? (operation.children & raster_variable.raster_data_type.raster_operations).first : operation).flatten.uniq!
733
+ raster_operations.each do |raster_operation|
734
+ self.request_raster_variables.create({raster_variable: raster_variable, raster_operation: raster_operation, raster_dataset: raster_dataset})
735
+ end
736
+ end
737
+ end
738
+ end
739
+ end
740
+ end
741
+
742
+
743
+ def export
744
+ {}
745
+ end
746
+
747
+
748
+ def submitted_date_time
749
+ unless submitted_at.nil?
750
+ submitted_at.strftime('%D - %r')
751
+ else
752
+ "N/A"
753
+ end
754
+ end
755
+
756
+
757
+ def total_time_human_readable
758
+
759
+ if total_time.nil?
760
+ "- minutes"
761
+ else
762
+ ChronicDuration.output((total_time / 1000.0), :format => :long)
763
+ end
764
+
765
+ end
766
+
767
+ def extract_type_human_readable
768
+ if extract_type == 'aggregate'
769
+ 'AREA-LEVEL'
770
+ else
771
+ extract_type.upcase
772
+ end
773
+ end
774
+
775
+ def can_be_revised?
776
+ origin != 'newui'
777
+ end
778
+
779
+
780
+ def include_boundary_files_human_readable
781
+ boundary_files ? "Yes" : "No"
782
+ end
783
+
784
+
785
+ private
786
+
787
+
788
+ def add_status(status_string, extra_fields = {})
789
+ extract_status = ExtractStatus.new
790
+ extract_status.status = status_string
791
+ extract_status.extract_request = self
792
+
793
+ sd = StatusDefinition.where(status: status_string.downcase).first
794
+
795
+ unless sd.nil?
796
+ extract_status.status_definition_id = sd.id
797
+ end
798
+
799
+ extract_status.save
800
+ self.extract_statuses << extract_status
801
+
802
+ extra_fields.each do |k,v|
803
+ self.send("#{k}=", v)
804
+ end
805
+
806
+ self.save
807
+ end
808
+
809
+
810
+ def normalize_attributes
811
+ self.uuid ||= SecureRandom.uuid
812
+ building_request if self.extract_statuses.empty?
813
+ end
814
+
815
+ end
816
+
817
+ ExtractRequest::ExtractTypeConst.define_consts