tripal_views_integration.inc 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. <?php
  2. /**
  3. * @file
  4. * Contains functions used to manage tripal views integrations
  5. */
  6. /**
  7. * Purpose: Deletes ALL Tripal Views Integrations.
  8. *
  9. * @ingroup tripal_views
  10. */
  11. function tripal_views_delete_all_integrations() {
  12. db_query("DELETE FROM {tripal_views}");
  13. db_query("DELETE FROM {tripal_views_field}");
  14. db_query("DELETE FROM {tripal_views_handlers}");
  15. db_query("DELETE FROM {tripal_views_join}");
  16. drupal_set_message("Successfully deleted all views integration.");
  17. }
  18. /**
  19. * Integrate all chado tables in the schema api. This integration only occurs
  20. * once and sets all Chado tables to a priority of 10
  21. *
  22. * @ingroup tripal_views
  23. */
  24. function tripal_views_integrate_all_chado_tables() {
  25. $tables = chado_get_table_names(TRUE);
  26. $base_tables = array(
  27. 'acquisition', 'analysis', 'assay', 'biomaterial', 'contact', 'cv', 'cvterm',
  28. 'db', 'dbxref', 'environment', 'expression', 'feature', 'featuremap', 'genotype',
  29. 'library', 'nd_experiment', 'nd_geolocation', 'nd_protocol', 'nd_reagent',
  30. 'organism', 'phendesc', 'phenotype', 'phenstatement', 'phylonode', 'phylotree',
  31. 'project', 'protocol', 'pub', 'stock', 'study', 'synonym'
  32. );
  33. foreach ($tables as $tablename) {
  34. $priority = 10;
  35. if (!tripal_is_table_integrated($tablename, $priority)) {
  36. if (in_array($tablename, $base_tables)) {
  37. $table_integration_array = tripal_views_get_integration_array_for_chado_table($tablename, TRUE, $priority);
  38. }
  39. else {
  40. $table_integration_array = tripal_views_get_integration_array_for_chado_table($tablename, FALSE, $priority);
  41. }
  42. if ($table_integration_array) {
  43. tripal_add_views_integration($table_integration_array);
  44. }
  45. }
  46. }
  47. }
  48. /**
  49. * Returns the array needed to integrate a given chado table with views
  50. *
  51. * @param $tablename
  52. * The table to generate the tripal views integration array for
  53. * @return
  54. * The tripal views integration array which is the parameter for
  55. * tripal_add_views_integration($defn_array)
  56. *
  57. * @ingroup tripal_views
  58. */
  59. function tripal_views_get_integration_array_for_chado_table($table_name, $base_table = TRUE, $priority = 9) {
  60. // Get the schema for this table (via the chado schema api)
  61. $schema = chado_get_schema($table_name);
  62. // Base definition array
  63. $defn_array = array(
  64. 'table' => $table_name,
  65. 'type' => 'chado',
  66. 'name' => 'Chado ' . ucwords(str_replace('_', ' ', $table_name)),
  67. 'description' => (!empty($schema['description'])) ? $schema['description'] : ' ',
  68. 'priority' => $priority,
  69. 'base_table' => $base_table,
  70. 'fields' => array(),
  71. );
  72. // Add fields
  73. if (!isset($schema['fields'])) {
  74. tripal_report_error('tripal_views', TRIPAL_NOTICE,
  75. 'There are no fields defined for %table in the Chado Schema API.', array('%table' => $table_name));
  76. return FALSE;
  77. }
  78. foreach ($schema['fields'] as $field_name => $field_schema) {
  79. // Base field definition
  80. if (!empty($field_name) && !empty($field_schema['type'])) {
  81. $defn_array['fields'][$field_name] = array(
  82. 'name' => $field_name,
  83. 'title' => ucwords(str_replace('_', ' ', $field_name)),
  84. 'type' => $field_schema['type'],
  85. 'description' => (isset($field_schema['description'])) ? $field_schema['description'] : ucwords(str_replace('_', ' ', $field_name)),
  86. 'handlers' => array(),
  87. 'joins' => array()
  88. );
  89. // Add handlers based on type
  90. if (preg_match('/^int/', $field_schema['type'])) {
  91. $defn_array['fields'][$field_name]['handlers'] = array(
  92. /** D6
  93. 'field' => array('name' => 'chado_views_handler_field_numeric'),
  94. 'filter' => array('name' => 'chado_views_handler_filter_numeric'),
  95. 'sort' => array('name' => 'chado_views_handler_sort'),
  96. */
  97. 'field' => array('name' => 'views_handler_field_numeric'),
  98. 'filter' => array('name' => 'views_handler_filter_numeric'),
  99. 'sort' => array('name' => 'views_handler_sort'),
  100. );
  101. }
  102. elseif (preg_match('/^serial/', $field_schema['type'])) {
  103. $defn_array['fields'][$field_name]['handlers'] = array(
  104. /** D6
  105. 'field' => array('name' => 'chado_views_handler_field_numeric'),
  106. 'filter' => array('name' => 'chado_views_handler_filter_numeric'),
  107. 'sort' => array('name' => 'chado_views_handler_sort'),
  108. */
  109. 'field' => array('name' => 'views_handler_field_numeric'),
  110. 'filter' => array('name' => 'views_handler_filter_numeric'),
  111. 'sort' => array('name' => 'views_handler_sort'),
  112. );
  113. $defn_array['fields'][$field_name]['type'] = 'int';
  114. }
  115. elseif (preg_match('/^varchar/', $field_schema['type'])) {
  116. $defn_array['fields'][$field_name]['handlers'] = array(
  117. /** D6
  118. 'field' => array('name' => 'chado_views_handler_field'),
  119. 'filter' => array('name' => 'chado_views_handler_filter_string'),
  120. 'sort' => array('name' => 'chado_views_handler_sort'),
  121. */
  122. 'field' => array('name' => 'views_handler_field'),
  123. 'filter' => array('name' => 'views_handler_filter_string'),
  124. 'sort' => array('name' => 'views_handler_sort'),
  125. );
  126. }
  127. elseif (preg_match('/^text/', $field_schema['type'])) {
  128. $defn_array['fields'][$field_name]['handlers'] = array(
  129. /** D6
  130. 'field' => array('name' => 'chado_views_handler_field'),
  131. 'filter' => array('name' => 'chado_views_handler_filter_string'),
  132. 'sort' => array('name' => 'chado_views_handler_sort'),
  133. */
  134. 'field' => array('name' => 'views_handler_field'),
  135. 'filter' => array('name' => 'views_handler_filter_string'),
  136. 'sort' => array('name' => 'views_handler_sort'),
  137. );
  138. }
  139. elseif (preg_match('/^boolean/', $field_schema['type'])) {
  140. $defn_array['fields'][$field_name]['handlers'] = array(
  141. /**
  142. 'field' => array('name' => 'chado_views_handler_field_boolean'),
  143. 'filter' => array('name' => 'chado_views_handler_filter_boolean_operator'),
  144. 'sort' => array('name' => 'chado_views_handler_sort'),
  145. */
  146. 'field' => array('name' => 'views_handler_field_boolean'),
  147. 'filter' => array('name' => 'views_handler_filter_boolean_operator'),
  148. 'sort' => array('name' => 'views_handler_sort'),
  149. );
  150. }
  151. elseif (preg_match('/^datetime/', $field_schema['type'])) {
  152. $defn_array['fields'][$field_name]['handlers'] = array(
  153. /** D6
  154. 'field' => array('name' => 'chado_views_handler_field_date'),
  155. 'filter' => array('name' => 'chado_views_handler_filter_date'),
  156. 'sort' => array('name' => 'views_handler_sort_date'),
  157. */
  158. 'field' => array('name' => 'views_handler_field_date'),
  159. 'filter' => array('name' => 'views_handler_filter_date'),
  160. 'sort' => array('name' => 'views_handler_sort_date'),
  161. );
  162. }
  163. else {
  164. $defn_array['fields'][$field_name]['handlers'] = array(
  165. /** D6
  166. 'field' => array('name' => 'chado_views_handler_field'),
  167. 'filter' => array('name' => 'chado_views_handler_filter_string'),
  168. 'sort' => array('name' => 'chado_views_handler_sort'),
  169. */
  170. 'field' => array('name' => 'views_handler_field'),
  171. 'filter' => array('name' => 'views_handler_filter_string'),
  172. 'sort' => array('name' => 'views_handler_sort'),
  173. );
  174. }
  175. // Specify specialty handlers
  176. if ($field_name == 'type_id' OR $field_name == 'cvterm_id') {
  177. $defn_array['fields'][$field_name]['handlers']['filter']['name'] = 'tripal_views_handler_filter_select_cvterm';
  178. }
  179. if (preg_match('/name/',$field_name)) {
  180. $defn_array['fields'][$field_name]['handlers']['filter']['name'] = 'tripal_views_handler_filter_select_string';
  181. }
  182. }
  183. }
  184. // Add Joins & Relationships for foreign keys to fields
  185. if (!isset($schema['foreign keys'])) {
  186. $schema['foreign keys'] = array();
  187. }
  188. foreach ($schema['foreign keys'] as $foreign_key_schema) {
  189. foreach ($foreign_key_schema['columns'] as $left_field => $right_field) {
  190. // Join
  191. $defn_array['fields'][$left_field]['joins'][ $foreign_key_schema['table'] ] = array(
  192. 'table' => $foreign_key_schema['table'],
  193. 'field' => $right_field,
  194. /**D6 'handler' => 'views_handler_join_chado_aggregator'*/
  195. 'handler' => 'views_handler_join',
  196. 'relationship_handler' => 'views_handler_relationship',
  197. );
  198. }
  199. }
  200. // Add in reverse relationships
  201. if (isset($schema['referring_tables'])) {
  202. foreach ($schema['referring_tables'] as $referring_table) {
  203. // D7 @todo: fix referring_tables in schema to list the keys like foreign keys does
  204. $referring_schema = chado_get_schema($referring_table);
  205. $referring_schema_fk_columns = $referring_schema['foreign keys'][$table_name]['columns'];
  206. foreach ($referring_schema_fk_columns as $left_field => $right_field) {
  207. $defn_array['fields'][$right_field]['joins'][ $referring_table ] = array(
  208. 'table' => $referring_table,
  209. 'field' => $left_field,
  210. 'relationship_handler' => 'views_handler_relationship',
  211. 'relationship_only' => 1
  212. );
  213. }
  214. }
  215. }
  216. return $defn_array;
  217. }