12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241 |
- <?php
- /**
- * Implements hook_form()
- *
- * Provide a form to select Tripal v2 content types for migration
- *
- * @param $form
- * @param $form_state
- */
- function tripal_chado_migrate_form($form, &$form_state) {
- $form['overview_vert_tabs'] = array(
- '#type' => 'vertical_tabs'
- );
- $form['overview_vert_tabs']['#default_tab'] = key_exists('tripal_migrate_current_tab', $_SESSION) ? $_SESSION['tripal_migrate_current_tab'] : 'edit-step1';
- $form['instructions'] = array(
- '#type' => 'item',
- '#markup' => t('Here you may migrate Tripal v2 content types to Tripal v3
- content types. The migration process is divided into four steps that
- allow you to migrate your site as your own pace. Please click each
- step below for details as to the purpose of the step. When all steps
- are completed your site will be fully Tripal v3 compatible.'),
- '#weight' => -100
- );
- // Step 1
- $form['step1'] = array(
- '#type' => 'fieldset',
- '#title' => 'Step1',
- '#description' => '<b>Enable Legacy Support</b>',
- '#collapsible' => TRUE,
- '#collapsed' => TRUE,
- '#group' => 'overview_vert_tabs'
- );
- global $base_url;
- $mod_url = '/admin/modules';
- $form['step1']['step1_content'] = array(
- '#markup' => 'Tripal legacy modules are needed to support the display of Tripal v2
- content types. Review and ' . l('enable modules', $mod_url) . ' in the \'Tripal v2 Legacy\' category
- for legacy content support. Only content types for enabled legacy
- moodules can be migrated'
- );
- // Step 2
- $form['step2'] = array(
- '#type' => 'fieldset',
- '#title' => 'Step2',
- '#description' => '<b>Migrate Content</b>',
- '#collapsible' => TRUE,
- '#collapsed' => TRUE,
- '#group' => 'overview_vert_tabs'
- );
- $form['step2']['step2_container'] = array(
- '#type' => 'container',
- '#collapsible' => FALSE,
- '#prefix' => '<div id="tripal-chado-migrate-form-step2">',
- '#suffix' => '</div>'
- );
- $form['step2']['step2_container']['instructions'] = array(
- '#type' => 'item',
- '#markup' => t('Here you can migrate Tripal v2 content types to Tripal v3
- content types. This will not destroy or remove existing Tripal v2 pages
- but will creatte new Tripal v3 pages. This allows you to keep existing
- pages while reviewing and customizing the Tripal v3 content types. Site
- visitors can continue to visit the Tripal v2 pages. Tripal
- v3 content types may remain private while customization is underway.
- Once customization is completed a subsequent step will allow you to
- swap out Tripal v2 pages for the newer Tripal v3 pages. If you would like to
- use Trial v3 web services you must migrate content types.'),
- );
- $tv2_content_type = 'all';
- if (array_key_exists('values', $form_state)) {
- $tv2_content_type = $form_state['values']['tv2_content_type'];
- }
- $tv2_options = tripal_chado_get_tripal_v2_content_type_options(TRUE);
- $form['step2']['step2_container']['tv2_content_type'] = array(
- '#type' => 'select',
- '#title' => 'Tripal v2 Content Type',
- '#description' => t('Select the Tripal v2 content type to migrate.'),
- '#options' => $tv2_options,
- '#default_value' => $tv2_content_type,
- '#ajax' => array(
- 'callback' => "tripal_chado_migrate_form_step2_ajax_callback",
- 'wrapper' => "tripal-chado-migrate-form-step2",
- 'effect' => 'fade',
- 'method' => 'replace'
- ),
- );
- // Add a review button that allows reviewing migratable content types
- if ($tv2_content_type != 'all') {
- $table = str_replace('chado_', '', $tv2_content_type);
- $schema = chado_get_schema($table);
- $pkey = $schema['primary key'][0];
- $fkeys = $schema['foreign keys'];
- $form['step2']['step2_container']['tv3_content_type'] = array(
- '#type' => 'fieldset',
- '#title' => 'Tripal v3 Content Type',
- '#description' => "Click the 'Get Tripal v3 Types' button to retrieve a list of Tripal v3
- content types to which this Tripal v2 type can be converted. This may take a while
- depending on the size of your database. The number of items to be converted is
- shown beside the type."
- );
- $form['step2']['step2_container']['tv3_content_type']['get_v3_type_btn'] = array(
- '#type' => 'button',
- '#name' => 'get_v3_type_btn',
- '#value' => "Get Tripal v3 Types",
- '#ajax' => array(
- 'callback' => "tripal_chado_migrate_form_step2_ajax_callback",
- 'wrapper' => "tripal-chado-migrate-form-step2",
- 'effect' => 'fade',
- 'method' => 'replace'
- ),
- );
- $no_data = TRUE;
- if ($form_state['clicked_button']['#name'] == 'get_v3_type_btn') {
- // Migrate all
- $form['step2']['step2_container']['tv3_content_type']['tv3_migrate_all'] = array(
- '#type' => 'checkbox',
- '#title' => 'Migrate All'
- );
- // Migrate selection only
- if ($table == 'organism') {
- $sql =
- "SELECT count(*)
- FROM {organism} O
- INNER JOIN [chado_organism] CO ON O.organism_id = CO.organism_id
- ";
- $org_count = chado_query($sql)->fetchField();
- if ($org_count > 0) {
- $key = urldecode('tv3_content_type--OBI--0100026--organism');
- $form['step2']['step2_container']['tv3_content_type'][$key] = array(
- '#type' => 'checkbox',
- '#title' => 'Organism (' . $org_count . ')',
- );
- $no_data = FALSE;
- }
- }
- else if ($table == 'analysis') {
- $sql =
- "SELECT count(*)
- FROM {analysis} A
- INNER JOIN [chado_analysis] CA ON A.analysis_id = CA.analysis_id
- ";
- $ana_count = chado_query($sql)->fetchField();
- if ($ana_count > 0) {
- $key = urlencode('tv3_content_type--operation--2945--analysis');
- $form['step2']['step2_container']['tv3_content_type'][$key] = array(
- '#type' => 'checkbox',
- '#title' => 'Analysis (' . $ana_count . ')',
- );
- $no_data = FALSE;
- }
- }
- else if ($table == 'project') {
- $sql =
- "SELECT count(*)
- FROM {project} P
- INNER JOIN [chado_project] CP ON P.project_id = CP.project_id
- ";
- $proj_count = chado_query($sql)->fetchField();
- if ($proj_count > 0) {
- $key = urlencode('tv3_content_type--local--project--project');
- $form['step2']['step2_container']['tv3_content_type'][$key] = array(
- '#type' => 'checkbox',
- '#title' => 'Project (' . $proj_count . ')',
- );
- $no_data = FALSE;
- }
- }
- else if ($table == 'featuremap') {
- $sql =
- "SELECT count(*)
- FROM {featuremap} M
- INNER JOIN [chado_featuremap] CM ON M.featuremap_id = CM.featuremap_id
- ";
- $map_count = chado_query($sql)->fetchField();
- if ($map_count > 0) {
- $key = urlencode('tv3_content_type--data--1274--map');
- $form['step2']['step2_container']['tv3_content_type'][$key] = array(
- '#type' => 'checkbox',
- '#title' => 'Map (' . $map_count . ')',
- );
- $no_data = FALSE;
- }
- }
- else if ($table == 'pub') {
- $sql =
- "SELECT count(*)
- FROM {pub} P
- INNER JOIN [chado_pub] CP ON P.pub_id = CP.pub_id
- ";
- $proj_count = chado_query($sql)->fetchField();
- if ($proj_count > 0) {
- $key = urlencode('tv3_content_type--TPUB--0000002--Publication');
- $form['step2']['step2_container']['tv3_content_type'][$key] = array(
- '#type' => 'checkbox',
- '#title' => 'Publication (' . $proj_count . ')',
- );
- $no_data = FALSE;
- }
- }
- else if ($table == 'biomaterial') {
- $sql =
- "SELECT count(*)
- FROM {biomaterial} B
- INNER JOIN [chado_biomaterial] CB ON B.biomaterial_id = CB.biomaterial_id
- ";
- $bm_count = chado_query($sql)->fetchField();
- if ($bm_count > 0) {
- $key = urlencode('tv3_content_type--sep--1095--biological sample');
- $form['step2']['step2_container']['tv3_content_type'][$key] = array(
- '#type' => 'checkbox',
- '#title' => 'Biomaterial (' . $bm_count . ')',
- );
- $no_data = FALSE;
- }
- }
- else if (key_exists('cvterm', $fkeys) && key_exists('type_id', $fkeys['cvterm']['columns'])) {
- // Get all Tripal v2 node types from the chad_* linking table
- $sql =
- "SELECT V.name AS type, X.accession, db.name AS vocabulary , count(*) AS num
- FROM {" . $table . "} T
- INNER JOIN [" . $tv2_content_type . "] CT ON T.$pkey = CT.$pkey
- INNER JOIN {cvterm} V ON V.cvterm_id = T.type_id
- INNER JOIN {dbxref} X ON X.dbxref_id = V.dbxref_id
- INNER JOIN {db} ON db.db_id = X.db_id
- GROUP BY V.name, X.accession, db.name";
- $tv3_content_types = chado_query($sql);
- while($tv3_content_type = $tv3_content_types->fetchObject()) {
- // We need to store vocabulary/accession/type for each checkbox in the key becuase
- // the value only allows 1 or 0
- $key = urlencode(
- 'tv3_content_type--' .
- $tv3_content_type->vocabulary . '--' .
- $tv3_content_type->accession . '--' .
- $tv3_content_type->type);
- $form['step2']['step2_container']['tv3_content_type'][$key] = array(
- '#type' => 'checkbox',
- '#title' => $tv3_content_type->type . ' (' . $tv3_content_type->num . ')',
- );
- $no_data = FALSE;
- }
- }
- if ($no_data) {
- unset($form['step2']['step2_container']['tv3_content_type']['tv3_migrate_all']);
- drupal_set_message('No data for migration or all have been migrated.', 'warning');
- }
- }
- }
- // Migrate button
- if ($tv2_content_type == 'all' || key_exists('tv3_migrate_all', $form['step2']['step2_container']['tv3_content_type'])) {
- $form['step2']['step2_container']['migrate_btn'] = array(
- '#type' => 'submit',
- '#name' => 'migrate_btn',
- '#value' => "Migrate $tv2_options[$tv2_content_type]",
- );
- // Disable the migration if all have been done
- if (count($tv2_options) == 1 && key_exists('all', $tv2_options)) {
- $form['step2']['step2_container']['migrate_btn']['#disabled'] = 1;
- }
- }
- // Step 3
- $form['step3'] = array(
- '#type' => 'fieldset',
- '#title' => 'Step3',
- '#description' => '<b>Use Legacy Templates (optional)</b>',
- '#collapsible' => TRUE,
- '#collapsed' => TRUE,
- '#group' => 'overview_vert_tabs'
- );
- $form['step3']['instructions'] = array(
- '#type' => 'item',
- '#markup' => t('Once content types have been migrated you have the option
- to use the Tripal v2 display templates. Tripal v3 allows you to
- customize the page layout using a web interface whereas Tripal v2
- required programatic changes to template files. If your site has
- considerable Tripal v2 customizations that you do not
- want to lose you can use the legacy templates by checking the box
- for the desired content types below.'),
- );
- // Get a list of enabled legacy modules with tv2 templates
- $enabled_templates = variable_get('tripal_chado_enabled_legacy_templates', array());
- $info = module_invoke_all('node_info');
- $options = tripal_chado_get_tripal_v2_content_type_options(FALSE, TRUE);
- foreach ($options AS $type_name => $type_label) {
- $title = $type_label;
- if ($type_name != 'all' and !key_exists($type_name, $info)) {
- $title .= " <strong>(please enable the $type_name legacy module).</strong>";
- }
- $form ['step3']['legacy_template--' . $type_name] = array (
- '#type' => 'checkbox',
- '#title' => $title,
- '#default_value' => key_exists('legacy_template--' . $type_name, $enabled_templates) ? $enabled_templates['legacy_template--' . $type_name] : 0,
- );
- }
- $form['step3']['save_btn'] = array(
- '#type' => 'submit',
- '#name' => 'save_enabled_template_btn',
- '#value' => "Save",
- );
- // Step 4
- $form['step4'] = array(
- '#type' => 'fieldset',
- '#title' => 'Step4',
- '#description' => '<b>Complete Migration</b>',
- '#collapsible' => TRUE,
- '#collapsed' => TRUE,
- '#group' => 'overview_vert_tabs'
- );
- $form['step4']['instructions'] = array(
- '#type' => 'item',
- '#markup' => t('This step allows you to fully switch to Tripal v3 pages.
- You can move URLs and titles from Tripal v2 pages to their
- corresponding Tripal v3 pages. This ensures user bookmarks and external
- links to your site are not broken. Here you can also unpublish Tripal
- v2 content types or completely remove them if desired. You can
- perform these action in stages such as first moving titles and URLs,
- then unpublishing Tripal v2 pages and once the migration has been
- verified you can finally delete the Tripal v2 pages to free space.
- Deleting the Tripal v2 content will not delete the data in Chado.
- The page is simply removed from the site.'),
- );
- $form['step4']['warning'] = array(
- '#type' => 'item',
- '#markup' => tripal_set_message('Any of the following options cannot be
- undone. Also, please be sure you have migrated all
- desired content types in Step 2 prior to deleting the Tripal v2
- contents.', TRIPAL_WARNING, array('return_html' => TRUE)),
- );
- $opt_complete_migration = array (
- 'cp_title' => 'Copy Title over to Tripal v3 Content',
- 'mv_url' => 'Migrate URL Alias to Tripal v3 Content',
- 'unpublish' => 'Unpublish Tripal v2 Content',
- 'delete' => 'Delete Tripal v2 Content',
- );
- if (count($tv2_options) == 1 && key_exists('all', $tv2_options)) {
- $form['step4']['complete'] = array(
- '#markup' => 'Migration completed. All content have been migrated.'
- );
- }
- else {
- foreach ($tv2_options AS $opt_key => $opt) {
- $form['step4'][$opt_key . '_title'] = array(
- '#markup' => "<b>$opt</b>"
- );
- $form['step4']['complete_migration--' . $opt_key] = array(
- '#type' => 'checkboxes',
- '#options' => $opt_complete_migration,
- );
- }
- $form['step4']['submit_btn'] = array(
- '#type' => 'submit',
- '#name' => 'complete_migration_btn',
- '#value' => "Submit",
- );
- }
- return $form;
- }
- /**
- * Implements hook_validate()
- *
- * @param $form
- * @param $form_state
- */
- function tripal_chado_migrate_form_validate($form, &$form_state) {
- }
- /**
- * Implements hook_submit()
- *
- * By submiting the form, a Tripal job to migrate Tripal v2 content is submitted
- *
- * @param $form
- * @param $form_state
- */
- function tripal_chado_migrate_form_submit($form, &$form_state) {
- // Store the legacy template setting in a Drupal variable
- if ($form_state['clicked_button']['#name'] == 'save_enabled_template_btn') {
- $values = $form_state['values'];
- $enabled_templates = array();
- foreach ($values AS $key => $value) {
- if (preg_match('/^legacy_template--/', $key)) {
- $enabled_templates[$key] = $value;
- }
- }
- variable_set('tripal_chado_enabled_legacy_templates', $enabled_templates);
- drupal_theme_rebuild();
- $_SESSION['tripal_migrate_current_tab'] = 'edit-step3';
- }
- // Complete migration
- else if ($form_state['clicked_button']['#name'] == 'complete_migration_btn') {
- $values = $form_state['values'];
- $config = array (
- 'delete' => array(),
- 'unpublish' => array(),
- 'cp_title' => array(),
- 'mv_url' => array()
- );
- $all = array();
- $all_types = array();
- // Gather checked checkboxes and store in the $config array
- foreach ($values AS $key => $value) {
- if (preg_match('/^complete_migration--/', $key)) {
- $type = str_replace('complete_migration--', '', $key);
- if ($type != 'all') {
- array_push($all_types, $type);
- }
- foreach ($value AS $key_op => $op) {
- if ($type == 'all') {
- if ($op) {
- array_push($all, $key_op);
- }
- }
- else {
- if ($op) {
- array_push($config[$key_op], $type);
- }
- }
- }
- }
- }
- foreach($all AS $a) {
- $config[$a] = $all_types;
- }
- // Submit jobs to complete the migration
- global $user;
- $includes = array(
- module_load_include('inc', 'tripal_chado', 'includes/tripal_chado.migrate'),
- );
- if (count($config['cp_title']) > 0) {
- $args = array($config['cp_title']);
- tripal_add_job("Copy Title over to Tripal v3 Content", 'tripal_chado',
- 'tripal_chado_copy_title_for_selected_types', $args, $user->uid, 10, $includes);
- }
- if (count($config['mv_url']) > 0) {
- $args = array($config['mv_url']);
- tripal_add_job(" Migrate URL Alias to Tripal v3 Content ", 'tripal_chado',
- 'tripal_chado_migrate_url_alias_for_selected_types', $args, $user->uid, 10, $includes);
- }
- if (count($config['unpublish']) > 0) {
- $args = array($config['unpublish']);
- tripal_add_job(" Unpublish Tripal v2 Content ", 'tripal_chado',
- 'tripal_chado_unpublish_selected_types', $args, $user->uid, 10, $includes);
- }
- if (count($config['delete']) > 0) {
- $args = array($config['delete']);
- tripal_add_job("Delete Tripal v2 Content ", 'tripal_chado',
- 'tripal_chado_delete_selected_types', $args, $user->uid, 10, $includes);
- }
- $_SESSION['tripal_migrate_current_tab'] = 'edit-step4';
- return;
- }
- // Migrate tv2 content to tv3 content
- else if ($form_state['clicked_button']['#name'] == 'migrate_btn') {
- global $user;
- $values = $form_state['values'];
- $tv2_content_type = $form_state['values']['tv2_content_type'];
- $tv3_content_type = array();
- foreach ($values AS $key => $value) {
- if ($tv2_content_type != 'all') {
- $key = urldecode($key);
- if (preg_match('/^tv3_content_type--(.+)--(.+)--(.+)/', $key, $matches) &&
- ($value == 1 || $values['tv3_migrate_all'] == 1)) {
- $vocabulary = $matches[1];
- $accession = $matches[2];
- $type = $matches[3];
- $table = str_replace('chado_', '', $tv2_content_type);
- $tv3_content_type [] = array(
- 'vocabulary' => $vocabulary,
- 'accession' => $accession,
- 'term_name' => $type,
- 'storage_args' => array (
- 'data_table' => $table,
- 'type_column' => db_field_exists('chado.' . $table, 'type_id') ? 'type_id' : ''
- )
- );
- }
- }
- }
- // Submit a job to migrate content
- global $user;
- $args = array(
- array(
- 'tv2_content_type' => $tv2_content_type,
- 'tv3_content_type' => $tv3_content_type
- )
- );
- $includes = array(
- module_load_include('inc', 'tripal_chado', 'includes/tripal_chado.migrate'),
- );
- if ($tv2_content_type == 'all' || count($tv3_content_type) != 0) {
- return tripal_add_job("Migrate $tv2_content_type Tripal v2 content.",
- 'tripal_chado', 'tripal_chado_migrate_records', $args, $user->uid, 10, $includes);
- }
- else {
- return drupal_set_message('Nothing to do. All data have been migrated or no data for migration.');
- }
- $_SESSION['tripal_migrate_current_tab'] = 'edit-step2';
- }
- }
- /**
- * Ajax call back that returns the entire form
- *
- * The callback is triggered by ajax elements on the form which leads to the update of
- * entire form according to the values set on the form
- *
- * @param $form
- * @param $form_state
- * @return $form
- */
- function tripal_chado_migrate_form_step2_ajax_callback(&$form, &$form_state) {
- return $form['step2']['step2_container'];
- }
- /**
- * Get available Tripal v2 content types
- *
- * @param boolean $all_option
- * Include an 'all' option in the returned array
- * @param boolean $has_template
- * Return TV2 content types only if it has a base template. This will exclude TV2 content
- * types such as Blast/Kegg/Interpro/Unigene which are all converted into the TV3
- * 'Analysis' entity type
- * @return string[]
- * Return a string array keyed by the node type
- */
- function tripal_chado_get_tripal_v2_content_type_options($all_option = FALSE, $has_template = FALSE) {
- // Get all available Tripal v2 chado tables
- $sql = "
- SELECT table_name
- FROM information_schema.tables
- WHERE table_schema = 'public' AND table_name LIKE 'chado_%'
- ";
- $result = db_query($sql);
- // Store 'chado_*' tables that has at least one node
- $tables = array();
- while ($field = $result->fetchField()) {
- $count = db_query("SELECT count(*) FROM $field LIMIT 1")->fetchField();
- if ($count != 0) {
- array_push($tables, $field);
- }
- }
- // List all available Tripal v2 content types
- $result = db_select('node_type', 'nt')
- ->fields('nt', array('type', 'name', 'description'))
- ->condition('type', 'chado_%', 'LIKE')
- ->execute();
- $options = array();
- if ($all_option) {
- $options['all'] = 'All';
- }
- while ($obj = $result->fetchObject()) {
- // Ignore analysis sub modules
- if ($has_template && !preg_match('/^chado_analysis_.+$/', $obj->type)) {
- $mod = str_replace('chado_', 'tripal_', $obj->type);
- $mod_dir = drupal_get_path('module', $mod);
- if (file_exists($mod_dir . '/theme/templates/' . $mod . '_base.tpl.php')) {
- $options[$obj->type] = $obj->name;
- }
- }
- else {
- if (in_array($obj->type, $tables)) {
- $options[$obj->type] = $obj->name;
- }
- }
- }
- return $options;
- }
- /**
- * Tripal job callback to migrate Tripal v2 content into Tripal v3 content
- *
- * @param $migration
- * @param $job_id
- */
- function tripal_chado_migrate_records($migration, $job_id = NULL) {
- $tv2_content_type = $migration['tv2_content_type'];
- $tv3_content_type = $migration['tv3_content_type'];
- // If tv2_content_type is 'all', migrate all existing Tripal v2 content
- if ($tv2_content_type == 'all') {
- print "Migrating all Tripal v2 content...\n";
- tripal_chado_migrate_all_types();
- }
- // Otherwise, migrate only selected Tripal v2 content
- else {
- print "Migrating selected Tripal v2 content...\n";
- tripal_chado_migrate_selected_types($tv3_content_type);
- }
- }
- /**
- * Migrate all Tripal v2 content types
- *
- * Gather all available Tripal v2 content types and store the result in an
- * associated array with values of vocabulary, accession, term_name. The array
- * is then pass to the function tripal_chado_migrate_selected_types() that
- * handles the migration.
- */
- function tripal_chado_migrate_all_types() {
- // Get all available Tripal v2 content types
- $tv2_content_types = tripal_chado_get_tripal_v2_content_type_options();
- $types = tripal_chado_migrate_map_types($tv2_content_types);
- tripal_chado_migrate_selected_types($types);
- }
- /**
- * Map all tv2_content_type to tv3_content_type
- *
- * @param unknown $tv2_content_type
- * return $tv3_content_type
- */
- function tripal_chado_migrate_map_types($tv2_content_types) {
- $types = array();
- foreach($tv2_content_types AS $tv2_content_type => $value) {
- $table = str_replace('chado_', '', $tv2_content_type);
- $schema = chado_get_schema($table);
- $pkey = $schema['primary key'][0];
- $fkeys = $schema['foreign keys'];
- if ($table == 'organism') {
- array_push($types, array(
- 'vocabulary' => 'OBI',
- 'accession' => '0100026',
- 'term_name' => 'organism',
- 'storage_args' => array (
- 'data_table' => $table
- )
- ));
- }
- else if ($table == 'analysis') {
- array_push($types, array(
- 'vocabulary' => 'operation',
- 'accession' => '2945',
- 'term_name' => 'Analysis',
- 'storage_args' => array (
- 'data_table' => $table
- )
- ));
- }
- else if ($table == 'project') {
- array_push($types, array(
- 'vocabulary' => 'local',
- 'accession' => 'project',
- 'term_name' => 'project',
- 'storage_args' => array (
- 'data_table' => $table
- )
- ));
- }
- else if ($table == 'featuremap') {
- array_push($types, array(
- 'vocabulary' => 'data',
- 'accession' => '1274',
- 'term_name' => 'map',
- 'storage_args' => array (
- 'data_table' => $table
- )
- ));
- }
- else if ($table == 'pub') {
- array_push($types, array(
- 'vocabulary' => 'TPUB',
- 'accession' => '0000002',
- 'term_name' => 'Publication',
- 'storage_args' => array (
- 'data_table' => $table
- )
- ));
- }
- else if ($table == 'biomaterial') {
- array_push($types, array(
- 'vocabulary' => 'sep',
- 'accession' => '1095',
- 'term_name' => 'biological sample',
- 'storage_args' => array (
- 'data_table' => $table
- )
- ));
- }
- else if (key_exists('cvterm', $fkeys) && key_exists('type_id', $fkeys['cvterm']['columns'])) {
- // Get all Tripal v2 node types from the chad_* linking table
- $sql = "
- SELECT V.name AS type, X.accession, db.name AS vocabulary
- FROM {" . $table . "} T
- INNER JOIN [" . $tv2_content_type . "] CT ON T.$pkey = CT.$pkey
- INNER JOIN {cvterm} V ON V.cvterm_id = T.type_id
- INNER JOIN {dbxref} X ON X.dbxref_id = V.dbxref_id
- INNER JOIN {db} ON db.db_id = X.db_id
- GROUP BY V.name, X.accession, db.name
- ";
- $tv3_content_types = chado_query($sql);
- while($tv3_content_type = $tv3_content_types->fetchObject()) {
- array_push($types, array(
- 'vocabulary' => $tv3_content_type->vocabulary,
- 'accession' => $tv3_content_type->accession,
- 'term_name' => $tv3_content_type->type,
- 'storage_args' => array (
- 'data_table' => $table,
- 'type_column' => db_field_exists('chado.' . $table, 'type_id') ? 'type_id' : ''
- )
- ));
- }
- }
- }
- return $types;
- }
- /**
- * Migrate only selected Tripal v2 content types
- *
- * @param unknown $tv3_content_type
- */
- function tripal_chado_migrate_selected_types($tv3_content_types) {
- // Initialize the population of the chado_cvterm_mapping table before migration.
- tripal_chado_map_cvterms();
- foreach ($tv3_content_types AS $tv3_content_type) {
- // Check if the term already exists
- $term = tripal_load_term_entity($tv3_content_type);
- // If term doesn't exist, create a new bundle for this term
- if (!$term) {
- print("Creating bundle for term '" . $tv3_content_type['term_name'] . "'...\n");
- $success = tripal_create_bundle($tv3_content_type);
- $term = tripal_load_term_entity($tv3_content_type);
- }
- // Create bundle name
- $bundle_name = 'bio_data_' . $term->id;
- // Publish records for the bundle
- $value = array(
- 'sync_node' => 1,
- 'bundle_name' => $bundle_name
- );
- chado_publish_records($value);
- // Migrate Resource Titles/Blocks or Resource Links if available
- tripal_chado_migrate_resource_blocks($bundle_name);
- tripal_chado_migrate_resource_links($bundle_name);
- // Migrate organism images
- if ($term->name == 'organism') {
- tripal_chado_migrate_organism_images($bundle_name);
- }
- }
- }
- /**
- * Delete selected Tripal v2 content
- *
- * Delete all records from chado_* table then call the cleanup orphan nodes function
- *
- * @param unknown $tv2_content_types
- */
- function tripal_chado_delete_selected_types($tv2_content_types = array(), $job_id) {
- foreach ($tv2_content_types AS $type) {
- $sql = "DELETE FROM $type";
- db_query($sql);
- chado_cleanup_orphaned_nodes(str_replace('chado_', '', $type), 25000, NULL, NULL, $job_id);
- }
- }
- /**
- * Unpublish selected Tripal v2 content
- *
- * Set status = 0 (unpublished) for all nodes of selected Tripal v2 content types
- *
- * @param unknown $tv2_content_types
- */
- function tripal_chado_unpublish_selected_types($tv2_content_types = array(), $job_id) {
- foreach ($tv2_content_types AS $type) {
- $sql = "UPDATE node SET status = 0 WHERE nid IN (SELECT nid FROM $type)";
- db_query($sql);
- $sql = "UPDATE node_revision SET status = 0 WHERE nid IN (SELECT nid FROM $type)";
- db_query($sql);
- }
- }
- /**
- * Copy titles for selected Tripal v2 content
- *
- * Copy tiltles for all nodes of selected Tripal v2 content types
- *
- * @param unknown $tv2_content_types
- */
- function tripal_chado_copy_title_for_selected_types($tv2_content_types = array(), $job_id) {
- foreach ($tv2_content_types AS $type) {
- $chado_table = str_replace('chado_', '', $type);
- $bio_data_tables = tripal_chado_migrate_get_biodata_tables($chado_table);
- foreach($bio_data_tables AS $bio_data_table) {
- $sql = "SELECT nid, entity_id FROM $bio_data_table WHERE nid IN (SELECT nid FROM $type)";
- $result = db_query($sql);
- while ($entity = $result->fetchObject()) {
- $usql = "
- UPDATE tripal_entity
- SET title = (SELECT title FROM node WHERE nid = :nid)
- WHERE id = :entity_id";
- db_query($usql, array(
- ':nid' => $entity->nid,
- ':entity_id' => $entity->entity_id)
- );
- }
- }
- }
- }
- /**
- * Migrate URL alias for selected Tripal v2 content
- *
- * Migrate URL alias for all nodes of selected Tripal v2 content types
- *
- * @param unknown $tv2_content_types
- */
- function tripal_chado_migrate_url_alias_for_selected_types($tv2_content_types = array(), $job_id) {
- foreach ($tv2_content_types AS $type) {
- $chado_table = str_replace('chado_', '', $type);
- $bio_data_tables = tripal_chado_migrate_get_biodata_tables($chado_table);
- foreach($bio_data_tables AS $bio_data_table) {
- $sql = "SELECT nid, entity_id FROM $bio_data_table WHERE nid IN (SELECT nid FROM $type)";
- $result = db_query($sql);
- while ($entity = $result->fetchObject()) {
- $usql = "
- UPDATE url_alias
- SET source = 'bio_data/" . $entity->entity_id .
- "' WHERE source = 'node/" . $entity->nid . "'";
- db_query($usql);
- }
- }
- }
- }
- /**
- * Migrate images for Tripal v2 organism content
- *
- * Migrate images for all chado_organism
- *
- */
- function tripal_chado_migrate_organism_images ($bundle_name) {
- // Get all organism entities
- $bio_data_table = array_pop(tripal_chado_migrate_get_biodata_tables('organism'));
- $results =
- db_select($bio_data_table, 'ce')
- ->fields('ce', array('entity_id', 'record_id', 'nid'))
- ->execute();
- // Iterate through each organism entity
- while ($organism = $results->fetchObject()) {
- $nid = $organism->nid;
- $entity_id = $organism->entity_id;
- // check if there is a file record for the organism node
- $fid = db_select('file_usage', 'fu')
- ->fields('fu', array('fid'))
- ->condition('module', 'tripal_organism')
- ->condition('type', 'organism_image')
- ->condition('id', $nid)
- ->execute()
- ->fetchField();
- // check if the image was added using the old interface.
- if (!$fid) {
- $sql =
- "SELECT genus,species,nid
- FROM {organism} O
- INNER JOIN chado_organism CO ON O.organism_id = CO.organism_id
- WHERE O.organism_id = :organism_id";
- $chado_org = chado_query($sql, array(':organism_id' => $organism->record_id))->fetchObject();
- if ($chado_org) {
- $base_path = realpath('.');
- $image_dir = tripal_get_files_dir('tripal_organism') . "/images";
- $image_name = $chado_org->genus . "_" . $chado_org->species . ".jpg";
- $image_path = "$base_path/$image_dir/$image_name";
- // image files are stored as 'genus_species.jpg'
- $file =NULL;
- if (file_exists($image_path)) {
- $handle = fopen($image_path, 'r');
- $file = file_save_data($handle, "public://$image_name");
- fclose($handle);
- }
- // last possible case: image files are stored as 'organism_id.jpg'
- else {
- $image_name = $chado_org->nid . ".jpg";
- $image_path = "$base_path/$image_dir/$image_name";
- if (file_exists($image_path)) {
- $handle = fopen($image_path, 'r');
- $file = file_save_data($handle, "public://$image_name");
- fclose($handle);
- }
- }
- if($file){
- tripal_chado_migrate_organism_image_add_file($file->fid, $entity_id, $bundle_name);
- }
- }
- }
- else {
- // If there is an image, add it to the organism entity
- tripal_chado_migrate_organism_image_add_file ($fid, $entity_id, $bundle_name);
- }
- }
- }
- /**
- *
- * Add image file for the organism entity
- *
- * @param unknown $fid
- */
- function tripal_chado_migrate_organism_image_add_file ($fid, $entity_id, $bundle_name) {
- if ($fid && $entity_id) {
- $file = file_load($fid);
- // Add a record to the file_usage table
- file_usage_add($file, 'file', 'TripalEntity', $entity_id);
- $image_file = (array) $file;
- // Attached it to the entity
- /*
- $entities = entity_load('TripalEntity', array($entity_id));
- $entity = $entities[$entity_id];
- $image = array(
- 'und' => array(
- 0 =>$image_file
- )
- );
- $entity->data__image = $image;
- field_attach_update('TripalEntity', $entity);
- entity_get_controller('TripalEntity')->resetCache(array($entity_id));
- */
- // Add a record to the field_data_data__image table
- $values = array(
- 'entity_type' => 'TripalEntity',
- 'bundle' => $bundle_name,
- 'entity_id' => $entity_id,
- 'revision_id' => $entity_id,
- 'language' => 'und',
- 'delta' => 0,
- 'data__image_fid' => $fid,
- );
- drupal_write_record('field_data_data__image', $values);
- }
- }
- /**
- * Retrieve chado_biodata_* table name
- *
- * @param string $chado_table
- * the chado_table where the record is stored
- *
- * @return
- * Return all chado_biodata_* table names mapping to a chado_table
- */
- function tripal_chado_migrate_get_biodata_tables ($chado_table) {
- // To find the bundle_table, check if type_column is used for the chado_table
- $query = db_select('chado_bundle', 'cb');
- $query->join('tripal_bundle', 'tb', 'tb.id = cb.bundle_id');
- $query->fields('cb', array('data_table'));
- $query->fields('tb', array('name'));
- $query->condition('cb.data_table', $chado_table);
- $bundles = $query->execute();
- $tables = array();
- while ($bundle = $bundles->fetchObject()) {
- array_push($tables, 'chado_' . $bundle->name);
- }
- return $tables;
- }
- function tripal_chado_migrate_resource_blocks($bundle_name) {
- // Do not try to migrate resouce blocks and titles if they weren't set up
- if (!db_table_exists('field_revision_field_resource_titles') || !db_table_exists('field_revision_field_resource_blocks')) {
- return;
- }
- $entites =
- db_select('chado_' . $bundle_name, 'B')
- ->fields('B', array('nid'))
- ->execute();
- while ($nid = $entites->fetchField()) {
- // Only the latest revision is migrated
- $sql = "
- SELECT
- entity_id,
- max(revision_id) AS vid,
- delta,
- (SELECT field_resource_titles_value
- FROM field_revision_field_resource_titles
- WHERE entity_id = RT.entity_id
- AND revision_id = max(RT.revision_id)
- AND delta = RT.delta
- ),
- (SELECT field_resource_blocks_value
- FROM field_revision_field_resource_blocks
- WHERE entity_id = RT.entity_id
- AND revision_id = max(RT.revision_id)
- AND delta = RT.delta
- )
- FROM field_revision_field_resource_titles RT
- WHERE RT.entity_id = :nid
- GROUP BY entity_id, delta
- ORDER BY RT.delta
- ";
- $results = db_query($sql, array(':nid' => $nid));
- while ($resource = $results->fetchObject()) {
- $title = $resource->field_resource_titles_value;
- $content = $resource->field_resource_blocks_value;
- $delta = $resource->delta;
- $nid = $resource->entity_id;
- $entity_id =
- db_select('chado_' . $bundle_name, 'B')
- ->fields('B', array('entity_id'))
- ->condition('nid', $nid)
- ->execute()
- ->fetchField()
- ;
- // field name: (can not be longer than 32 chars)
- // bio_data_<i>_resource_<title to lower case/space replaced with _/first 10 chars>
- $field_name = $bundle_name . '_rsc_' . substr(preg_replace('/\s+/', '_', strtolower($title)), 0, 15);
- // Create a field if it does not exist
- if (!field_info_field($field_name)) {
- field_create_field(array(
- 'field_name' => $field_name,
- 'type' => 'text',
- 'cardinality' => 1,
- 'locked' => FALSE,
- 'storage' => array(
- 'type' => 'field_sql_storage',
- ),
- 'settings' => array(
- 'max_length' => 10485760,
- 'text_processing' => 1
- )
- ));
- }
- // Create field instance for the bundle if it does not exist
- if (!field_info_instance('TripalEntity', $field_name, $bundle_name)) {
- field_create_instance(array(
- 'field_name' => $field_name,
- 'entity_type' => 'TripalEntity',
- 'bundle' => $bundle_name,
- 'label' => $title,
- 'widget' => array(
- 'type' => 'text_textarea',
- ),
- 'display' => array(
- 'default' => array(
- 'label' => 'hidden',
- ),
- ),
- 'settings' => array(
- 'text_processing' => 1,
- 'format' => 'full_html',
- 'term_vocabulary' => 'schema',
- 'term_name' => 'comment',
- 'term_accession' => 'comment',
- ),
- ));
- }
- // Migrate the field content
- $ftable = 'field_data_' . $field_name;
- $frtable = 'field_revision_' . $field_name;
- $fvalue = $field_name . '_value';
- $fformat = $field_name . '_format';
- try {
- $sql = "
- INSERT INTO $ftable (entity_type, bundle, entity_id, revision_id, language, delta, $fvalue, $fformat)
- VALUES (:entity_type, :bundle, :entity_id, :revision_id, :language, :delta, :value, :format)
- ";
- db_query($sql,
- array (
- ':entity_type' => 'TripalEntity',
- ':bundle' => $bundle_name,
- ':entity_id' => $entity_id,
- 'revision_id' => $entity_id,
- ':language' => 'und',
- ':delta' => 0,
- ':value' => $content,
- ':format' => 'full_html'
- )
- );
- $rsql = "
- INSERT INTO $frtable (entity_type, bundle, entity_id, revision_id, language, delta, $fvalue, $fformat)
- VALUES (:entity_type, :bundle, :entity_id, :revision_id, :language, :delta, :value, :format)
- ";
- db_query($rsql,
- array (
- ':entity_type' => 'TripalEntity',
- ':bundle' => $bundle_name,
- ':entity_id' => $entity_id,
- 'revision_id' => $entity_id,
- ':language' => 'und',
- ':delta' => 0,
- ':value' => $content,
- ':format' => 'full_html'
- )
- );
- } catch (\PDOException $e) {
- $error = $e->getMessage();
- watchdog_exception('tripal_chado', $e);
- }
- }
- }
- }
- function tripal_chado_migrate_resource_links($bundle_name) {
- // Do not try to migrate resouce blocks and titles if they weren't set up
- if (!db_table_exists('field_revision_field_resource_links')) {
- return;
- }
- $entites =
- db_select('chado_' . $bundle_name, 'B')
- ->fields('B', array('nid'))
- ->execute();
- while ($nid = $entites->fetchField()) {
- // Only the latest revision is migrated
- $sql = "
- SELECT
- entity_id,
- max(revision_id) AS vid,
- delta,
- (SELECT field_resource_links_value
- FROM field_revision_field_resource_links
- WHERE entity_id = RT.entity_id
- AND revision_id = max(RT.revision_id)
- AND delta = RT.delta
- )
- FROM field_revision_field_resource_links RT
- WHERE RT.entity_id = :nid
- GROUP BY entity_id, delta
- ORDER BY RT.delta
- ";
- $results = db_query($sql, array(':nid' => $nid));
- while ($resource = $results->fetchObject()) {
- $values = explode('|', $resource->field_resource_links_value);
- $title = $values[0];
- $link = $values[1];
- $delta = $resource->delta;
- $nid = $resource->entity_id;
- $entity_id =
- db_select('chado_' . $bundle_name, 'B')
- ->fields('B', array('entity_id'))
- ->condition('nid', $nid)
- ->execute()
- ->fetchField();
- // field name: (can not be longer than 32 chars)
- // bio_data_<i>_resource_<title to lower case/space replaced with _/first 10 chars>
- $field_name = $bundle_name . '_resource_links';
- // Create a field if it does not exist
- if (!field_info_field($field_name)) {
- field_create_field(array(
- 'field_name' => $field_name,
- 'type' => 'link_field',
- 'cardinality' => FIELD_CARDINALITY_UNLIMITED,
- 'locked' => FALSE,
- 'storage' => array(
- 'type' => 'field_sql_storage',
- ),
- 'settings' => array(
- )
- ));
- }
- // Create field instance for the bundle if it does not exist.
- if (!field_info_instance('TripalEntity', $field_name, $bundle_name)) {
- field_create_instance(array(
- 'field_name' => $field_name,
- 'entity_type' => 'TripalEntity',
- 'bundle' => $bundle_name,
- 'label' => 'Links',
- 'widget' => array(
- 'type' => 'link_field',
- ),
- 'display' => array(
- 'default' => array(
- 'label' => 'hidden',
- ),
- ),
- 'settings' => array(
- 'term_vocabulary' => 'schema',
- 'term_name' => 'url',
- 'term_accession' => 'url',
- 'absolute_url' => 0,
- 'validate_url' => 0
- ),
- ));
- }
- // Migrate the field content
- $ftable = 'field_data_' . $field_name;
- $frtable = 'field_revision_' . $field_name;
- $furl = $field_name . '_url';
- $ftitle = $field_name . '_title';
- try {
- $sql = "
- INSERT INTO $ftable (entity_type, bundle, entity_id, revision_id, language, delta, $furl, $ftitle)
- VALUES (:entity_type, :bundle, :entity_id, :revision_id, :language, :delta, :url, :title)
- ";
- db_query($sql,
- array (
- ':entity_type' => 'TripalEntity',
- ':bundle' => $bundle_name,
- ':entity_id' => $entity_id,
- 'revision_id' => $entity_id,
- ':language' => 'und',
- ':delta' => $delta,
- ':url' => $link,
- ':title' => $title
- )
- );
- $rsql = "
- INSERT INTO $frtable (entity_type, bundle, entity_id, revision_id, language, delta, $furl, $ftitle)
- VALUES (:entity_type, :bundle, :entity_id, :revision_id, :language, :delta, :url, :title)
- ";
- db_query($rsql,
- array (
- ':entity_type' => 'TripalEntity',
- ':bundle' => $bundle_name,
- ':entity_id' => $entity_id,
- 'revision_id' => $entity_id,
- ':language' => 'und',
- ':delta' => $delta,
- ':url' => $link,
- ':title' => $title
- )
- );
- } catch (\PDOException $e) {
- $error = $e->getMessage();
- watchdog_exception('tripal_chado', $e);
- }
- }
- }
- }
|