123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- <?php
- /**
- * @file
- * Administration Interface for deleting multiple features
- */
- /**
- * A form for indicating the features to delete
- *
- * @ingroup tripal_legacy_feature
- */
- function tripal_feature_delete_form() {
- $form['desc'] = array(
- '#markup' => t("Use one or more of the following fields to identify sets of features to be deleted."),
- );
- $form['feature_names']= array(
- '#type' => 'textarea',
- '#title' => t('Feature Names'),
- '#description' => t('Please provide a list of feature names or unique names,
- separated by spaces or by new lines to be delete. If you specify feature names then
- all other options below will be ignored (except the unique checkbox).'),
- );
- $form['is_unique'] = array(
- '#title' => t('Names are Unique Names'),
- '#type' => 'checkbox',
- '#description' => t('Select this checbox if the names listed in the feature
- names box above are the unique name of the feature rather than the human readable names.'),
- );
- $cv = tripal_get_cv(array('name' => 'sequence'));
- $form['seq_type']= array(
- '#title' => t('Feature Type'),
- '#type' => 'textfield',
- '#description' => t("Choose the feature type."),
- '#autocomplete_path' => "admin/tripal/storage/chado/auto_name/cvterm/$cv->cv_id",
- );
- $organisms = tripal_get_organism_select_options(FALSE);
- $form['organism_id'] = array(
- '#title' => t('Organism'),
- '#type' => 'select',
- '#description' => t("Choose the organism for which features will be deleted."),
- '#options' => $organisms,
- );
- $analyses = tripal_get_analysis_select_options(FALSE);
- $form['analysis_id'] = array (
- '#title' => t('Analysis'),
- '#type' => t('select'),
- '#description' => t("Choose the analysis for which associated features will be deleted."),
- '#options' => $analyses,
- );
- $form['button'] = array(
- '#type' => 'submit',
- '#value' => t('Delete Features'),
- );
- return $form;
- }
- /**
- * Validation for the delete features form
- *
- * @ingroup tripal_legacy_feature
- */
- function tripal_feature_delete_form_validate($form, &$form_state) {
- $organism_id = $form_state['values']['organism_id'];
- $seq_type = trim($form_state['values']['seq_type']);
- $analysis_id = $form_state['values']['analysis_id'];
- $is_unique = $form_state['values']['is_unique'];
- $feature_names = $form_state['values']['feature_names'];
- if (!$analysis_id and !$organism_id and !$seq_type and !$feature_names) {
- form_set_error('feature_names', t("Please select at least one option"));
- }
- }
- /**
- * Submit for the delete features form
- *
- * @ingroup tripal_legacy_feature
- */
- function tripal_feature_delete_form_submit($form, &$form_state) {
- global $user;
- $organism_id = $form_state['values']['organism_id'];
- $seq_type = trim($form_state['values']['seq_type']);
- $analysis_id = $form_state['values']['analysis_id'];
- $is_unique = $form_state['values']['is_unique'];
- $feature_names = $form_state['values']['feature_names'];
- $args = array($organism_id, $analysis_id, $seq_type, $is_unique, $feature_names);
- tripal_add_job("Delete features", 'tripal_feature',
- 'tripal_feature_delete_features', $args, $user->uid);
- }
- /**
- * Function to actually delete the features indicated
- *
- * @param $organism_id
- * (Optional) The organism_id of the features to delete
- * @param $analysis_id
- * (Optional) The analysis_id of the features to delete
- * @param $seq_type
- * (Optional) The cvterm.name of the feature types to delete
- * @param $is_unique
- * (Optional) A Boolean stating whether the names are unique (ie: feature.uniquename)
- * or not (ie: feature.name)
- * @param $feature_names
- * (Optional) A space separated list of the names of features to delete
- * @param $job
- * The tripal_job id
- *
- * @ingroup tripal_legacy_feature
- */
- function tripal_feature_delete_features($organism_id, $analysis_id, $seq_type,
- $is_unique, $feature_names, $job = NULL) {
- global $user;
- $match = array();
- // Begin the transaction.
- $transaction = db_transaction();
- print "\nNOTE: Deleting features is performed using a database transaction. \n" .
- "If the load fails or is terminated prematurely then the entire set of \n" .
- "deletions is rolled back and will not be found in the database\n\n";
- try {
- // If feature names have been provided then handle those
- if ($feature_names) {
- $names = preg_split('/\s+/', $feature_names);
- if (sizeof($names) == 1) {
- $names = $names[0];
- }
- if ($is_unique) {
- $match['uniquename'] = $names;
- }
- else {
- $match['name'] = $names;
- }
- $num_deletes = chado_select_record('feature', array('count(*) as cnt'), $match);
- print "Deleting " . $num_deletes[0]->cnt . " features\n";
- chado_delete_record('feature', $match);
- return;
- }
- // Now handle the combintation of all other inputs.
- $args = array();
- $sql = "";
- $join = '';
- $where = '';
- if ($analysis_id) {
- $join .= 'INNER JOIN {analysisfeature} AF on F.feature_id = AF.feature_id ';
- $join .= 'INNER JOIN {analysis} A on A.analysis_id = AF.analysis_id ';
- $where .= 'AND A.analysis_id = :analysis_id ';
- $args[':analysis_id'] = $analysis_id;
- }
- if ($organism_id) {
- $where .= 'AND F.organism_id = :organism_id ';
- $args[':organism_id'] = $organism_id;
- }
- if ($seq_type) {
- $join .= 'INNER JOIN {cvterm} CVT ON CVT.cvterm_id = F.type_id';
- $where .= 'AND CVT.name = :type_name';
- $args[':type_name'] = $seq_type;
- }
- // Do not perform a delete if we have no additions to the where clause
- // otherwise all features will be deleted and this is probably not what
- // is wanted.
- if (!$where) {
- throw new Exception('Cannot delete features as no filters are available');
- }
- // First, count the number of records to be deleted
- $sql = "
- SELECT count(F.feature_id)
- FROM {feature} F
- $join
- WHERE 1=1 $where
- ";
- $num_deleted = chado_query($sql, $args)->fetchField();
- // Second, delete the records.
- $sql = "
- DELETE FROM {feature} WHERE feature_id IN (
- SELECT F.feature_id
- FROM {feature} F
- $join
- WHERE 1=1 $where
- )
- ";
- chado_query($sql, $args);
- print "Deletiong completed successfully. Deleted $num_deleted feature(s).\n";
- print "Now removing orphaned feature pages\n";
- chado_cleanup_orphaned_nodes('feature');
- }
- catch (Exception $e) {
- print "\n"; // make sure we start errors on new line
- $transaction->rollback();
- print "FAILED: Rolling back database changes...\n";
- watchdog_exception('tripal_feature', $e);
- return 0;
- }
- print "\nDone\n";
- }
|