|
@@ -13,310 +13,187 @@
|
|
*/
|
|
*/
|
|
|
|
|
|
/**
|
|
/**
|
|
- * Purpose: Return a given stock node using the nid
|
|
|
|
- *
|
|
|
|
- * @param $nid
|
|
|
|
- * The node ID of the stock you want to load
|
|
|
|
|
|
+ * Retrieves a chado stock object
|
|
|
|
+ *
|
|
|
|
+ * @param $identifier
|
|
|
|
+ * An array with the key stating what the identifier is. Supported keys (only one of the
|
|
|
|
+ * following unique keys is required):
|
|
|
|
+ * - stock_id: the chado stock.stock_id primary key
|
|
|
|
+ * - nid: the drupal nid of the stock
|
|
|
|
+ * There are also some specially handled keys. They are:
|
|
|
|
+ * - property: An array/object describing the property to select records for. It
|
|
|
|
+ * should at least have either a type_name (if unique across cvs) or type_id. Other
|
|
|
|
+ * supported keys include: cv_id/cv_name (of the type), value and rank
|
|
|
|
+ * @param $options
|
|
|
|
+ * An array of options. Supported keys include:
|
|
|
|
+ * - Any keys supported by chado_generate_var(). See that function definition for
|
|
|
|
+ * additional details.
|
|
|
|
+ *
|
|
|
|
+ * NOTE: the $identifier parameter can really be any array similar to $values passed into
|
|
|
|
+ * chado_select_record(). It should fully specify the stock record to be returned.
|
|
*
|
|
*
|
|
* @return
|
|
* @return
|
|
- * stock node with the passed in node ID
|
|
|
|
|
|
+ * If unique values were passed in as an identifier then an object describing the stock
|
|
|
|
+ * will be returned (will be a chado variable from chado_generate_var()). Otherwise,
|
|
|
|
+ * FALSE will be returned.
|
|
*
|
|
*
|
|
* @ingroup tripal_stock_api
|
|
* @ingroup tripal_stock_api
|
|
*/
|
|
*/
|
|
-function tripal_stock_get_stock_by_nid($nid) {
|
|
|
|
-
|
|
|
|
- return node_load($nid);
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * Purpose: Return a given stock object using the stock id
|
|
|
|
- *
|
|
|
|
- * @return
|
|
|
|
- * Stock object created by node load
|
|
|
|
- *
|
|
|
|
- * @ingroup tripal_stock_api
|
|
|
|
- */
|
|
|
|
-function tripal_stock_get_stock_by_stock_id($stock_id) {
|
|
|
|
-
|
|
|
|
- $sql = "SELECT nid FROM {chado_stock} WHERE stock_id = :stock_id";
|
|
|
|
- $r = db_query($sql, array(':stock_id' => $stock_id))->fetchObject();
|
|
|
|
- if (!empty($r->nid)) {
|
|
|
|
- return node_load($r->nid);
|
|
|
|
|
|
+function chado_get_stock($identifiers, $options = array()) {
|
|
|
|
+
|
|
|
|
+ // Error Checking of parameters
|
|
|
|
+ if (!is_array($identifiers)) {
|
|
|
|
+ tripal_report_error(
|
|
|
|
+ 'tripal_stock_api',
|
|
|
|
+ TRIPAL_ERROR,
|
|
|
|
+ "chado_get_stock: The identifier passed in is expected to be an array with the key
|
|
|
|
+ matching a column name in the stock table (ie: stock_id or name). You passed in %identifier.",
|
|
|
|
+ array(
|
|
|
|
+ '%identifier'=> print_r($identifiers, TRUE)
|
|
|
|
+ )
|
|
|
|
+ );
|
|
}
|
|
}
|
|
- else {
|
|
|
|
- tripal_report_error('tripal_stock', TRIPAL_WARNING, 'tripal_stock_get_stock_by_stock_id(!stock_id): no stock with that stock_id is sync\'d with drupal', array('!stock_id' => $stock_id));
|
|
|
|
|
|
+ elseif (empty($identifiers)) {
|
|
|
|
+ tripal_report_error(
|
|
|
|
+ 'tripal_stock_api',
|
|
|
|
+ TRIPAL_ERROR,
|
|
|
|
+ "chado_get_stock: You did not pass in anything to identify the stock you want. The identifier
|
|
|
|
+ is expected to be an array with the key matching a column name in the stock table
|
|
|
|
+ (ie: stock_id or name). You passed in %identifier.",
|
|
|
|
+ array(
|
|
|
|
+ '%identifier'=> print_r($identifiers, TRUE)
|
|
|
|
+ )
|
|
|
|
+ );
|
|
}
|
|
}
|
|
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * Returns all stocks currently sync'd with drupal
|
|
|
|
- *
|
|
|
|
- * @return
|
|
|
|
- * An array of node objects keyed by stock_id
|
|
|
|
- *
|
|
|
|
- * @ingroup tripal_stock_api
|
|
|
|
- */
|
|
|
|
-function tripal_stock_get_all_stocks() {
|
|
|
|
- $sql = "SELECT stock_id, nid from {chado_stock}";
|
|
|
|
- $resource = db_query($sql);
|
|
|
|
- $stocks = array();
|
|
|
|
- while ($r = $resource->fetchObject()) {
|
|
|
|
- $node = node_load($r->nid);
|
|
|
|
- if ($node) {
|
|
|
|
- $stocks[$r->stock_id] = $node;
|
|
|
|
- }
|
|
|
|
|
|
+ // If one of the identifiers is property then use chado_get_record_with_property()
|
|
|
|
+ if (isset($identifiers['property'])) {
|
|
|
|
+ $property = $identifiers['property'];
|
|
|
|
+ unset($identifiers['property']);
|
|
|
|
+ $stock = chado_get_record_with_property('stock', $property, $identifiers, $options);
|
|
}
|
|
}
|
|
- return $stocks;
|
|
|
|
-}
|
|
|
|
|
|
|
|
-/**
|
|
|
|
- * Purpose: Return all stocks that match a given criteria
|
|
|
|
- *
|
|
|
|
- * @param $values
|
|
|
|
- * An associative array containing the values for filtering the results.
|
|
|
|
- *
|
|
|
|
- * @return
|
|
|
|
- * An array of matching stock objects (produced using node_load)
|
|
|
|
- * matching the given criteria
|
|
|
|
- *
|
|
|
|
- * Example usage:
|
|
|
|
- * @code
|
|
|
|
- * $values = array(
|
|
|
|
- * 'organism_id' => array(
|
|
|
|
- * 'genus' => 'Lens',
|
|
|
|
- * 'species' => 'culinaris',
|
|
|
|
- * ),
|
|
|
|
- * 'name' => 'CDC Redberry',
|
|
|
|
- * 'type_id' => array (
|
|
|
|
- * 'cv_id' => array (
|
|
|
|
- * 'name' => 'germplasm',
|
|
|
|
- * ),
|
|
|
|
- * 'name' => 'registered_cultivar',
|
|
|
|
- * 'is_obsolete' => 0
|
|
|
|
- * ),
|
|
|
|
- * );
|
|
|
|
- * $result = tripal_stock_get_stocks($values);
|
|
|
|
- * @endcode
|
|
|
|
- * The above code selects a record from the chado stock table using three fields with values which
|
|
|
|
- * identify a stock or multiple stocks. Then the node for each stock identified is returned, if it
|
|
|
|
- * exists. The $values array is nested such that the organism is identified by way of the
|
|
|
|
- * organism_id foreign key constraint by specifying the genus and species. The cvterm is also
|
|
|
|
- * specified using its foreign key and the cv_id for the cvterm is nested as well.
|
|
|
|
- *
|
|
|
|
- * @ingroup tripal_stock_api
|
|
|
|
- */
|
|
|
|
-function tripal_stock_get_stocks($values) {
|
|
|
|
-
|
|
|
|
- $stock_ids = chado_select_record('stock', array('stock_id'), $values);
|
|
|
|
-
|
|
|
|
- // Change from stock_ids to nodes-----------------------------------
|
|
|
|
- $stock_ids = array_filter($stock_ids);
|
|
|
|
- $stock_ids = array_unique($stock_ids);
|
|
|
|
|
|
+ // Else we have a simple case and we can just use chado_generate_var to get the stock
|
|
|
|
+ else {
|
|
|
|
|
|
- $stocks = array();
|
|
|
|
- foreach ($stock_ids as $stock_id) {
|
|
|
|
- $node = tripal_stock_get_stock_by_stock_id($stock_id->stock_id);
|
|
|
|
- if ($node) {
|
|
|
|
- $stocks[] = $node;
|
|
|
|
- }
|
|
|
|
|
|
+ // Try to get the stock
|
|
|
|
+ $stock = chado_generate_var(
|
|
|
|
+ 'stock',
|
|
|
|
+ $identifiers,
|
|
|
|
+ $options
|
|
|
|
+ );
|
|
}
|
|
}
|
|
|
|
|
|
- return $stocks;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * Retrieve stocks based on associated stock properties
|
|
|
|
- *
|
|
|
|
- * @param $stockprop_values
|
|
|
|
- * An array of column_name => value where column_name is any column in the stockprop table
|
|
|
|
- * and value is the value you want that column to be. This is used as a tripal_core_chado_select
|
|
|
|
- * values array so nesting is allowed.
|
|
|
|
- * @param $stock_values
|
|
|
|
- * An array of column_name => value where column_name is any column in the stock table
|
|
|
|
- * and value is the value you want that column to be. This is used as a tripal_core_chado_select
|
|
|
|
- * values array so nesting is allowed.
|
|
|
|
- *
|
|
|
|
- * @return
|
|
|
|
- * An array of stock node objects
|
|
|
|
- *
|
|
|
|
- * Example usage:
|
|
|
|
- * @code
|
|
|
|
- * $stockprop_values = array(
|
|
|
|
- * 'value' => 'CDC Redberry',
|
|
|
|
- * 'type_id' => array (
|
|
|
|
- * 'cv_id' => array (
|
|
|
|
- * 'name' => 'stock_properties',
|
|
|
|
- * ),
|
|
|
|
- * 'name' => 'synonym',
|
|
|
|
- * 'is_obsolete' => 0
|
|
|
|
- * ),
|
|
|
|
- * );
|
|
|
|
- * $stock_values = array(
|
|
|
|
- * 'organism_id' => array(
|
|
|
|
- * 'genus' => 'Lens',
|
|
|
|
- * 'species' => 'culinaris',
|
|
|
|
- * ),
|
|
|
|
- * );
|
|
|
|
- * $result = tripal_stock_get_stocks_by_stockprop($stockprop_values, $stock_values);
|
|
|
|
- * @endcode
|
|
|
|
- * The above code selects all Lens culinaris stocks with the synonym (stock property) CDC Redberry.
|
|
|
|
- * The nodes for each stock selected are loaded and returned in an array.
|
|
|
|
- *
|
|
|
|
- * @ingroup tripal_stock_api
|
|
|
|
- */
|
|
|
|
-function tripal_stock_get_stocks_by_stockprop($stockprop_values, $stock_values) {
|
|
|
|
-
|
|
|
|
- //add stock values to stockprop values
|
|
|
|
- if (!empty($stock_values)) {
|
|
|
|
- $stockprop_values['stock_id'] = $stock_values;
|
|
|
|
|
|
+ // Ensure the stock is singular. If it's an array then it is not singular
|
|
|
|
+ if (is_array($stock)) {
|
|
|
|
+ tripal_report_error(
|
|
|
|
+ 'tripal_stock_api',
|
|
|
|
+ TRIPAL_ERROR,
|
|
|
|
+ "chado_get_stock: The identifiers you passed in were not unique. You passed in %identifier.",
|
|
|
|
+ array(
|
|
|
|
+ '%identifier'=> print_r($identifiers, TRUE)
|
|
|
|
+ )
|
|
|
|
+ );
|
|
}
|
|
}
|
|
|
|
|
|
- //get stock_ids from stockprop table
|
|
|
|
- $stock_ids = chado_select_record('stockprop', array('stock_id'), $stockprop_values);
|
|
|
|
-
|
|
|
|
- // Change from stock_ids to nodes-----------------------------------
|
|
|
|
- $stock_ids = array_filter($stock_ids);
|
|
|
|
- $stock_ids = array_unique($stock_ids);
|
|
|
|
-
|
|
|
|
- $stocks = array();
|
|
|
|
- foreach ($stock_ids as $stock_id) {
|
|
|
|
- $node = tripal_stock_get_stock_by_stock_id($stock_id->stock_id);
|
|
|
|
- if ($node) {
|
|
|
|
- $stocks[] = $node;
|
|
|
|
- }
|
|
|
|
|
|
+ // Report an error if $stock is FALSE since then chado_generate_var has failed
|
|
|
|
+ elseif ($stock === FALSE) {
|
|
|
|
+ tripal_report_error(
|
|
|
|
+ 'tripal_stock_api',
|
|
|
|
+ TRIPAL_ERROR,
|
|
|
|
+ "chado_get_stock: chado_generate_var() failed to return a stock based on the identifiers
|
|
|
|
+ you passed in. You should check that your identifiers are correct, as well as, look
|
|
|
|
+ for a chado_generate_var error for additional clues. You passed in %identifier.",
|
|
|
|
+ array(
|
|
|
|
+ '%identifier'=> print_r($identifiers, TRUE)
|
|
|
|
+ )
|
|
|
|
+ );
|
|
}
|
|
}
|
|
|
|
|
|
- return $stocks;
|
|
|
|
|
|
+ // Else, as far we know, everything is fine so give them their stock :)
|
|
|
|
+ else {
|
|
|
|
+ return $stock;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * Return all stocks with a given name identifier
|
|
|
|
- * which might match stock.name, stock.uniquename, dbxref.accession,
|
|
|
|
- * stockprop.value where stockprop.type='synonym'
|
|
|
|
|
|
+ * Retrieves a chado stock object
|
|
*
|
|
*
|
|
- * @param $name
|
|
|
|
- * The name identfier to be used
|
|
|
|
- * @param $organism_id
|
|
|
|
- * The stock.organism_id of the stock to be selected
|
|
|
|
|
|
+ * @param $identifier
|
|
|
|
+ * An array with the key stating what the identifier is. Supported keys include any
|
|
|
|
+ * field in the stock table. See the chado_select_record() $values parameter for
|
|
|
|
+ * additional details including an example.
|
|
|
|
+ * @param $options
|
|
|
|
+ * An array of options. Supported keys include:
|
|
|
|
+ * - Any keys supported by chado_generate_var(). See that function definition for
|
|
|
|
+ * additional details.
|
|
*
|
|
*
|
|
* @return
|
|
* @return
|
|
- * An array of stock node objects
|
|
|
|
|
|
+ * An array of stock objects matching the criteria.
|
|
*
|
|
*
|
|
* @ingroup tripal_stock_api
|
|
* @ingroup tripal_stock_api
|
|
*/
|
|
*/
|
|
-function tripal_stock_get_stock_by_name_identifier($name, $organism_id) {
|
|
|
|
- $stock_ids = array();
|
|
|
|
-
|
|
|
|
- $options = array(
|
|
|
|
- 'case_insensitive_columns' => array('name', 'uniquename', 'accession', 'value')
|
|
|
|
- );
|
|
|
|
-
|
|
|
|
- // where name_identifier = stock.name-------------------------------
|
|
|
|
- $current_stocks = chado_select_record('stock', array('stock_id'),
|
|
|
|
- array(
|
|
|
|
- 'name' => $name,
|
|
|
|
- 'organism_id' => $organism_id,
|
|
|
|
- ),
|
|
|
|
- array(
|
|
|
|
- 'case_insensitive_columns' => array('name'),
|
|
|
|
- )
|
|
|
|
- );
|
|
|
|
- if (!empty($current_stocks)) {
|
|
|
|
- foreach ($current_stocks as $c) {
|
|
|
|
- $stock_ids[] = $c->stock_id; }
|
|
|
|
|
|
+function chado_get_multiple_stocks($identifiers, $options = array()) {
|
|
|
|
+
|
|
|
|
+ // Error Checking of parameters
|
|
|
|
+ if (!is_array($identifiers)) {
|
|
|
|
+ tripal_report_error(
|
|
|
|
+ 'tripal_stock_api',
|
|
|
|
+ TRIPAL_ERROR,
|
|
|
|
+ "chado_get_stock: The identifier passed in is expected to be an array with the key
|
|
|
|
+ matching a column name in the stock table (ie: stock_id or name). You passed in %identifier.",
|
|
|
|
+ array(
|
|
|
|
+ '%identifier'=> print_r($identifiers, TRUE)
|
|
|
|
+ )
|
|
|
|
+ );
|
|
}
|
|
}
|
|
-
|
|
|
|
- // where name_identifier = stock.uniquename-------------------------------
|
|
|
|
- $current_stocks = chado_select_record('stock', array('stock_id'),
|
|
|
|
- array(
|
|
|
|
- 'uniquename' => $name,
|
|
|
|
- 'organism_id' => $organism_id,
|
|
|
|
- ),
|
|
|
|
- array(
|
|
|
|
- 'case_insensitive_columns' => array('uniquename'),
|
|
|
|
- )
|
|
|
|
- );
|
|
|
|
- if (!empty($current_stocks)) {
|
|
|
|
- foreach ($current_stocks as $c) {
|
|
|
|
- $stock_ids[] = $c->stock_id; }
|
|
|
|
|
|
+ elseif (empty($identifiers)) {
|
|
|
|
+ tripal_report_error(
|
|
|
|
+ 'tripal_stock_api',
|
|
|
|
+ TRIPAL_ERROR,
|
|
|
|
+ "chado_get_stock: You did not pass in anything to identify the stock you want. The identifier
|
|
|
|
+ is expected to be an array with the key matching a column name in the stock table
|
|
|
|
+ (ie: stock_id or name). You passed in %identifier.",
|
|
|
|
+ array(
|
|
|
|
+ '%identifier'=> print_r($identifiers, TRUE)
|
|
|
|
+ )
|
|
|
|
+ );
|
|
}
|
|
}
|
|
|
|
|
|
- // where name_identifier = dbxref.accession-------------------------------
|
|
|
|
- // linked to stock through stock.dbxref
|
|
|
|
- $current_stocks = chado_select_record('stock', array('stock_id'),
|
|
|
|
- array(
|
|
|
|
- 'dbxref_id' => array(
|
|
|
|
- 'accession' => $name,
|
|
|
|
- ),
|
|
|
|
- 'organism_id' => $organism_id,
|
|
|
|
- ),
|
|
|
|
- array(
|
|
|
|
- 'case_insensitive_columns' => array('accession'),
|
|
|
|
- )
|
|
|
|
- );
|
|
|
|
- if (!empty($current_stocks)) {
|
|
|
|
- foreach ($current_stocks as $c) {
|
|
|
|
- $stock_ids[] = $c->stock_id; }
|
|
|
|
|
|
+ // If one of the identifiers is property then use chado_get_record_with_property()
|
|
|
|
+ if (isset($identifiers['property'])) {
|
|
|
|
+ $property = $identifiers['property'];
|
|
|
|
+ unset($identifiers['property']);
|
|
|
|
+ $stock = chado_get_record_with_property('stock', $property, $identifiers, $options);
|
|
}
|
|
}
|
|
|
|
|
|
- // linked to stock through stock_dbxref?
|
|
|
|
- $current_stocks = chado_select_record('stock_dbxref', array('stock_id'),
|
|
|
|
- array(
|
|
|
|
- 'dbxref_id' => array(
|
|
|
|
- 'accession' => $name,
|
|
|
|
- ),
|
|
|
|
- 'stock_id' => array(
|
|
|
|
- 'organism_id' => $organism_id,
|
|
|
|
- ),
|
|
|
|
- ),
|
|
|
|
- array(
|
|
|
|
- 'case_insensitive_columns' => array('accession'),
|
|
|
|
- )
|
|
|
|
- );
|
|
|
|
- if (!empty($current_stocks)) {
|
|
|
|
- foreach ($current_stocks as $c) {
|
|
|
|
- $stock_ids[] = $c->stock_id;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ // Else we have a simple case and we can just use chado_generate_var to get the stock
|
|
|
|
+ else {
|
|
|
|
|
|
- // where name_identifier = stockprop.value-------------------------------
|
|
|
|
- // where type='synonym'
|
|
|
|
- $current_stocks = chado_select_record('stockprop', array('stock_id'),
|
|
|
|
- array(
|
|
|
|
- 'stock_id' => array(
|
|
|
|
- 'organism_id' => $organism_id,
|
|
|
|
- ),
|
|
|
|
- 'type_id' => array(
|
|
|
|
- 'cv_id' => variable_get('chado_stock_prop_types_cv', 'null'),
|
|
|
|
- 'name' => 'synonym',
|
|
|
|
- ),
|
|
|
|
- 'value' => $name,
|
|
|
|
- ),
|
|
|
|
- array(
|
|
|
|
- 'case_insensitive_columns' => array('value'),
|
|
|
|
- )
|
|
|
|
- );
|
|
|
|
- if (!empty($current_stocks)) {
|
|
|
|
- foreach ($current_stocks as $c) {
|
|
|
|
- $stock_ids[] = $c->stock_id;
|
|
|
|
- }
|
|
|
|
|
|
+ // Try to get the stock
|
|
|
|
+ $stock = chado_generate_var(
|
|
|
|
+ 'stock',
|
|
|
|
+ $identifiers,
|
|
|
|
+ $options
|
|
|
|
+ );
|
|
}
|
|
}
|
|
|
|
|
|
- // Change from stock_ids to nodes-----------------------------------
|
|
|
|
- $stock_ids = array_filter($stock_ids);
|
|
|
|
- $stock_ids = array_unique($stock_ids);
|
|
|
|
-
|
|
|
|
- $stocks = array();
|
|
|
|
- foreach ($stock_ids as $stock_id) {
|
|
|
|
- $node = tripal_stock_get_stock_by_stock_id($stock_id);
|
|
|
|
- if ($node) {
|
|
|
|
- $stocks[] = $node;
|
|
|
|
- }
|
|
|
|
|
|
+ // Report an error if $stock is FALSE since then chado_generate_var has failed
|
|
|
|
+ if ($stock === FALSE) {
|
|
|
|
+ tripal_report_error(
|
|
|
|
+ 'tripal_stock_api',
|
|
|
|
+ TRIPAL_ERROR,
|
|
|
|
+ "chado_get_stock: chado_generate_var() failed to return a stock based on the identifiers
|
|
|
|
+ you passed in. You should check that your identifiers are correct, as well as, look
|
|
|
|
+ for a chado_generate_var error for additional clues. You passed in %identifier.",
|
|
|
|
+ array(
|
|
|
|
+ '%identifier'=> print_r($identifiers, TRUE)
|
|
|
|
+ )
|
|
|
|
+ );
|
|
}
|
|
}
|
|
|
|
|
|
- return $stocks;
|
|
|
|
|
|
+ // Else, as far we know, everything is fine so give them their stock :)
|
|
|
|
+ else {
|
|
|
|
+ return $stock;
|
|
|
|
+ }
|
|
}
|
|
}
|