tripal_stock-api_functions.inc 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <?php
  2. /*************************************************************************
  3. * Purpose: Returns all stocks currently sync'd with drupal
  4. *
  5. * @return array(
  6. * <stock_id> => <stock object created by node load>
  7. * )
  8. */
  9. function get_all_chado_stocks() {
  10. $sql = "SELECT stock_id, nid from {chado_stock}";
  11. $resource = db_query($sql);
  12. $stocks = array();
  13. while ($r = db_fetch_object($resource)) {
  14. $stocks[$r->stock_id] = node_load($r->nid);
  15. }
  16. return $stocks;
  17. }
  18. /*************************************************************************
  19. * Purpose: Return all stocks that match a given criteria
  20. *
  21. * @params Criteria = array(
  22. * <column name> => array(
  23. * 'value'=> <value of column>,
  24. * 'regex' => <False if exact value, TRUE otherwise>,
  25. * 'type' => <INT or STRING>
  26. * )
  27. * )
  28. * column name can be any of those for the stock table
  29. * additional column names include: accession, synonym
  30. * if you don't know which column the value is from and want to match
  31. * the value against any of name, uniquename, dbxref accessions, and synonyms
  32. * use 'unknown' => array(
  33. * 'value' => <value to search for>,
  34. * 'columns' => array of columns to search
  35. * )
  36. * where columns can be any combination of 'name', 'uniquename', 'stock','accession', or 'synonym'
  37. * @params match_type: can be either ALL or ANY
  38. * where ALL= mathcing stocks must match all criteria supplied
  39. * ANY= matching stock need only match ONE of the supplied criteria
  40. * @return an array of matching stock objects (produced using node_load)
  41. * matching the given criteria
  42. */
  43. function get_chado_stocks($criteria, $match_type, $organism_id = NULL) {
  44. //Deal with unknown column----------------------------
  45. if (!empty($criteria['unknown'])) {
  46. $unknown_provided = TRUE;
  47. $new_criteria = array();
  48. foreach ($criteria['unknown']['columns'] as $column_name) {
  49. if (in_array($column_name, array('stock_id','dbxref_id','organism_id','type_id') )) {
  50. if (preg_match('/^\d+$/',$criteria['unknown']['value'])) {
  51. $new_criteria[$column_name] = array('type'=>'INT','value' => $criteria['unknown']['value']);
  52. }
  53. } else {
  54. $new_criteria[$column_name] = array('type'=>'STRING','value' => $criteria['unknown']['value'], 'regex'=>TRUE);
  55. }
  56. }
  57. $unknown_stocks = get_chado_stocks($new_criteria, 'ANY', $organism_id);
  58. }
  59. unset($criteria['unknown']); //so it's not mistaken as a column in the stock table
  60. // Determine all criteria------------------------------
  61. $where = array(); // parts of the where portion of the SQL query
  62. $joins = array(); //joins between the stock table and other tables
  63. foreach ($criteria as $column_name => $v) {
  64. if (preg_match("/accession/i",$column_name)) {
  65. if ($v['regex']) { $operator = '~'; }
  66. else { $operator = '='; }
  67. $where[] = 'dbxref.accession'.$operator."'".$v['value']."'";
  68. $joins[] = 'LEFT JOIN stock_dbxref stock_dbxref ON stock_dbxref.stock_id=stock.stock_id';
  69. $joins[] = 'LEFT JOIN dbxref dbxref ON dbxref.dbxref_id=stock_dbxref.dbxref_id';
  70. } elseif (preg_match("/synonym/i",$column_name)) {
  71. if ($v['regex']) { $operator = '~'; }
  72. else { $operator = '='; }
  73. $synonym_cvterm = get_chado_cvterm( array('name' => array('type'=>'STRING','exact'=>TRUE,'value'=>'synonym'),
  74. 'cv_id' => array('type'=>'INT', 'value'=> variable_get('chado_stock_prop_types_cv', 'null')) ));
  75. $where[] = '(stockprop.type_id='.$synonym_cvterm->cvterm_id.' AND stockprop.value'.$operator."'".$v['value']."')";
  76. $joins[] = 'LEFT JOIN stockprop stockprop ON stockprop.stock_id=stock.stock_id';
  77. } else {
  78. if ($v['regex']) { $operator = '~'; }
  79. else { $operator = '='; }
  80. if (preg_match('/INT/', $v['type'])) {
  81. $where[] = 'stock.'.$column_name.'='.$v['value'];
  82. } else {
  83. $where[] = 'stock.'.$column_name.$operator."'".$v['value']."'";
  84. }
  85. }
  86. }
  87. //Build query-----------------------------------------
  88. if (preg_match('/ANY/', $match_type)) {
  89. $where_string = implode(' OR ',$where);
  90. if ($organism_id) {
  91. $where_string = '('.$where_string.') AND organism_id='.$organism_id;
  92. }
  93. } else {
  94. $where_string = implode(' AND ',$where);
  95. if ($organism_id) {
  96. $where_string .= ' AND organism_id='.$organism_id; }
  97. }
  98. if (sizeof($where) >= 1) {
  99. $execute_query = TRUE;
  100. $sql_query = 'SELECT stock.stock_id FROM stock '.implode(' ',$joins).' WHERE '.$where_string;
  101. //drupal_set_message('Query='.$sql_query);
  102. } elseif (!$unknown_provided) {
  103. $execute_query = TRUE;
  104. $sql_query = 'SELECT stock.stock_id FROM stock';
  105. drupal_set_message('You did not enter any criteria during the stock selection process. All stocks will be returned.','warning');
  106. } else {
  107. $execute_query = FALSE;
  108. }
  109. if ($execute_query) {
  110. //Get stock_ids---------------------------------------
  111. $previous_db = tripal_db_set_active('chado');
  112. $resource = db_query($sql_query);
  113. tripal_db_set_active($previous_db);
  114. //drupal_set_message($sql_query);
  115. $stock_ids = array();
  116. while ($r = db_fetch_object($resource)) {
  117. $stock_ids[] = $r->stock_id;
  118. }
  119. $stock_ids = array_unique($stock_ids);
  120. //Get Stocks------------------------------------------
  121. if (!empty($stock_ids)) {
  122. $resource = db_query("SELECT nid FROM {chado_stock} WHERE stock_id IN (%s)",implode(',',$stock_ids));
  123. $main_stocks = array();
  124. while ($r = db_fetch_object($resource)) {
  125. $main_stocks[] = node_load($r->nid);
  126. }
  127. }
  128. }
  129. if (!empty($main_stocks)) {
  130. if(!empty($unknown_stocks)){
  131. return array_merge($unknown_stocks,$main_stocks);
  132. } else {
  133. return $main_stocks;
  134. }
  135. } else {
  136. if(!empty($unknown_stocks)){
  137. return $unknown_stocks;
  138. } else {
  139. //drupal_set_message('No Stocks matched the given criteria','warning');
  140. return array();
  141. }
  142. }
  143. }
  144. /*************************************************************************
  145. * Purpose: Return a given stock object using the nid or stock id
  146. *
  147. * @return stock object created by node load
  148. */
  149. function get_chado_stock($nid=0, $stock_id=0) {
  150. if (!empty($nid)) {
  151. return node_load($nid);
  152. } else {
  153. if (!empty($stock_id)) {
  154. $sql = "SELECT nid FROM {chado_stock} WHERE stock_id=%d";
  155. $r = db_fetch_object(db_query($sql, $stock_id));
  156. if (!empty($r->nid)) {
  157. return node_load($r->nid);
  158. } else {
  159. drupal_set_message("Function: get_chado_stock() -no stock with that stock id sync'd with drupal", 'error');
  160. }
  161. } else {
  162. drupal_set_message("Function: get_chado_stock() -need to supply at least one of node ID or Stock ID",'error');
  163. }
  164. }
  165. return 0;
  166. }