123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- <?php
- /**
- * @file
- * Functions to insert/update delete records in any prop table
- */
- /**
- * Retrieve a property for a given base table record
- *
- * @param $basetable
- * The base table for which the property should be retrieved. Thus to retrieve a property
- * for a feature the basetable=feature and property is retrieved from featureprop
- * @param $record_id
- * The foriegn key field of the base table. This should be in integer.
- * @param $property
- * The cvterm name describing the type of properties to be retrieved
- * @param $cv_name
- * The name of the cv that the above cvterm is part of
- *
- * @return
- * An array in the same format as that generated by the function
- * tripal_api_chado_generate_chado_var(). If only one record is returned it
- * is a single object. If more than one record is returned then it is an array
- * of objects
- *
- * @ingroup tripal_properties_api
- */
- function tripal_api_chado_get_property($basetable, $record_id, $property, $cv_name) {
- // get the foreign key for this property table
- $table_desc = tripal_api_chado_get_chado_table_schema($basetable . 'prop');
- $fkcol = key($table_desc['foreign keys'][$basetable]['columns']);
- // construct the array of values to be selected
- $values = array(
- $fkcol => $record_id,
- 'type_id' => array(
- 'cv_id' => array(
- 'name' => $cv_name,
- ),
- 'name' => $property,
- 'is_obsolete' => 0
- ),
- );
- $results = tripal_api_chado_generate_chado_var($basetable . 'prop', $values);
- if ($results) {
- $results = tripal_api_chado_expand_chado_vars($results, 'field', $basetable . 'prop.value');
- }
- return $results;
- }
- /**
- * Insert a property for a given base table. By default if the property already
- * exists a new property is added with the next available rank. If
- * $update_if_present argument is specified then the record will be updated if it
- * exists rather than adding a new property.
- *
- * @param $basetable
- * The base table for which the property should be inserted. Thus to insert a property
- * for a feature the basetable=feature and property is inserted into featureprop
- * @param $record_id
- * The foriegn key value of the base table. This should be in integer.
- * @param $property
- * The cvterm name describing the type of properties to be inserted
- * @param $cv_name
- * The name of the cv that the above cvterm is part of
- * @param $value
- * The value of the property to be inserted (can be empty)
- * @param $update_if_present
- * A boolean indicating whether an existing record should be updated. If the
- * property already exists and this value is not specified or is zero then
- * a new property will be added with the next largest rank.
- *
- * @return
- * Return True on Insert/Update and False otherwise
- *
- * @ingroup tripal_properties_api
- */
- function tripal_api_chado_insert_property($basetable, $record_id, $property,
- $cv_name, $value, $update_if_present = 0) {
- // first see if the property already exists, if the user want's to update
- // then we can do that, but otherwise we want to increment the rank and
- // insert
- $props = tripal_api_chado_get_property($basetable, $record_id, $property, $cv_name);
- if (!is_array($props) and $props) {
- $props = array($props);
- }
- $rank = 0;
- if (count($props) > 0) {
- if ($update_if_present) {
- return tripal_api_chado_update_property($basetable, $record_id, $property, $cv_name, $value);
- }
- else {
- // iterate through the properties returned and check to see if the
- // property with this value already exists if not, get the largest rank
- // and insert the same property but with this new value
- foreach ($props as $p) {
- if ($p->rank > $rank) {
- $rank = $p->rank;
- }
- if (strcmp($p->value, $value) == 0) {
- return TRUE;
- }
- }
- // now add 1 to the rank
- $rank++;
- }
- }
- // make sure the cvterm exists. Otherwise we'll get an error with
- // prepared statements not matching
- $values = array(
- 'cv_id' => array(
- 'name' => $cv_name,
- ),
- 'name' => $property,
- );
- $options = array();
- $term = tripal_api_chado_chado_select('cvterm', array('cvterm_id'), $values, $options);
- if (!$term or count($term) == 0) {
- watchdog('tripal_api_chado', "Cannot find property '%prop_name' in vocabulary '%cvname'.",
- array('%prop_name' => $property, '%cvname' => $cv_name), WATCHDOG_ERROR);
- return FALSE;
- }
- // get the foreign key for this property table
- $table_desc = tripal_api_chado_get_chado_table_schema($basetable . 'prop');
- $fkcol = key($table_desc['foreign keys'][$basetable]['columns']);
- // construct the array of values to be inserted
- $values = array(
- $fkcol => $record_id,
- 'type_id' => array(
- 'cv_id' => array(
- 'name' => $cv_name,
- ),
- 'name' => $property,
- ),
- 'value' => $value,
- 'rank' => $rank,
- );
- $options = array();
- $result = tripal_api_chado_chado_insert($basetable . 'prop', $values, $options);
- return $result;
- }
- /**
- * Update a property for a given base table record and property name. This
- * function should be used only if one record of the property will be present.
- * If the property name can have multiple entries (with increasing rank) then
- * use the function named tripal_api_chado_update_property_by_id
- *
- * @param $basetable
- * The base table for which the property should be updated. The property table
- * is constructed using a combination of the base table name and the suffix
- * 'prop' (e.g. basetable = feature then property tabie is featureprop).
- * @param $record_id
- * The foreign key of the basetable to update a property for. This should be in integer.
- * For example, if the basetable is 'feature' then the $record_id should be the feature_id
- * @param $property
- * The cvterm name of property to be updated
- * @param $cv_name
- * The name of the cv that the above cvterm is part of
- * @param $value
- * The value of the property to be inserted (can be empty)
- * @param $insert_if_missing
- * A boolean indicating whether a record should be inserted if one doesn't exist to update
- *
- * Note: The property to be updated is select via the unique combination of $record_id and
- * $property and then it is updated with the supplied value
- *
- * @return
- * Return True on Update/Insert and False otherwise
- *
- * @ingroup tripal_properties_api
- */
- function tripal_api_chado_update_property($basetable, $record_id, $property,
- $cv_name, $value, $insert_if_missing = 0) {
- // first see if the property is missing (we can't update a missing property
- $prop = tripal_api_chado_get_property($basetable, $record_id, $property, $cv_name);
- if (count($prop)==0) {
- if ($insert_if_missing) {
- return tripal_api_chado_insert_property($basetable, $record_id, $property, $cv_name, $value);
- }
- else {
- return FALSE;
- }
- }
- // get the foreign key for this property table
- $table_desc = tripal_api_chado_get_chado_table_schema($basetable . 'prop');
- $fkcol = key($table_desc['foreign keys'][$basetable]['columns']);
- // construct the array that will match the exact record to update
- $match = array(
- $fkcol => $record_id,
- 'type_id' => array(
- 'cv_id' => array(
- 'name' => $cv_name,
- ),
- 'name' => $property,
- ),
- );
- // construct the array of values to be updated
- $values = array(
- 'value' => $value,
- );
- return tripal_api_chado_chado_update($basetable . 'prop', $match, $values);
- }
- /**
- * Update a property for a given base table record. This function should be
- * used if multiple records of the same property will be present. Also, use this
- * function to change the property name of an existing property.
- *
- * @param $basetable
- * The base table for which the property should be updated. The property table
- * is constructed using a combination of the base table name and the suffix
- * 'prop' (e.g. basetable = feature then property tabie is featureprop).
- * @param $record_id
- * The primary key of the base table. This should be in integer.
- * For example, if the basetable is 'feature' then the $record_id should be the featureprop_id
- * @param $property
- * The cvterm name of property to be updated
- * @param $cv_name
- * The name of the cv that the above cvterm is part of
- * @param $value
- * The value of the property to be inserted (can be empty)
- *
- * @return
- * Return True on Update/Insert and False otherwise
- *
- * @ingroup tripal_properties_api
- */
- function tripal_api_chado_update_property_by_id($basetable, $record_id, $property,
- $cv_name, $value) {
- // get the primary key for this property table
- $table_desc = tripal_api_chado_get_chado_table_schema($basetable . 'prop');
- $pkcol = $table_desc['primary key'][0];
- // construct the array that will match the exact record to update
- $match = array(
- $pkcol => $record_id,
- );
- // construct the array of values to be updated
- $values = array(
- 'type_id' => array(
- 'cv_id' => array(
- 'name' => $cv_name,
- ),
- 'name' => $property,
- ),
- 'value' => $value,
- );
- return tripal_api_chado_chado_update($basetable . 'prop', $match, $values);
- }
- /**
- * Deletes a property for a given base table record using the property name
- *
- * @param $basetable
- * The base table for which the property should be deleted. Thus to deleted a property
- * for a feature the basetable=feature and property is deleted from featureprop
- * @param $record_id
- * The primary key of the basetable to delete a property for. This should be in integer.
- * @param $property
- * The cvterm name describing the type of property to be deleted
- * @param $cv_name
- * The name of the cv that the above cvterm is part of
- *
- * Note: The property to be deleted is select via the unique combination of $record_id and $property
- *
- * @return
- * Return True on Delete and False otherwise
- *
- * @ingroup tripal_properties_api
- */
- function tripal_api_chado_delete_property($basetable, $record_id, $property, $cv_name) {
- // get the foreign key for this property table
- $table_desc = tripal_api_chado_get_chado_table_schema($basetable . 'prop');
- $fkcol = key($table_desc['foreign keys'][$basetable]['columns']);
- // construct the array that will match the exact record to update
- $match = array(
- $fkcol => $record_id,
- 'type_id' => array(
- 'cv_id' => array(
- 'name' => $cv_name,
- ),
- 'name' => $property,
- ),
- );
- return tripal_api_chado_chado_delete($basetable . 'prop', $match);
- }
- /**
- * Deletes a property using the property ID
- *
- * @param $basetable
- * The base table for which the property should be deleted. Thus to deleted a property
- * for a feature the basetable=feature and property is deleted from featureprop
- * @param $record_id
- * The primary key of the basetable to delete a property for. This should be in integer.
- *
- * @return
- * Return True on Delete and False otherwise
- *
- * @ingroup tripal_properties_api
- */
- function tripal_api_chado_delete_property_by_id($basetable, $record_id) {
- // get the foreign key for this property table
- $table_desc = tripal_api_chado_get_chado_table_schema($basetable . 'prop');
- $pkcol = $table_desc['primary key'][0];
- // construct the array that will match the exact record to update
- $match = array(
- $pkcol => $record_id,
- );
- return tripal_api_chado_chado_delete($basetable . 'prop', $match);
- }
|