diff sites/all/modules/custom/solrsearch/solrsearch.install @ 0:015d06b10d37 default tip

initial
author dwinter
date Wed, 31 Jul 2013 13:49:13 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sites/all/modules/custom/solrsearch/solrsearch.install	Wed Jul 31 13:49:13 2013 +0200
@@ -0,0 +1,899 @@
+<?php
+
+/**
+ * @file
+ *   Install and related hooks for solrsearch_search.
+ */
+
+/**
+ * Implements hook_requirements().
+ */
+function solrsearch_requirements($phase) {
+  $requirements = array();
+  if ($phase != 'runtime') {
+    return $requirements;
+  }
+  // Ensure translations don't break at install time
+  $t = get_t();
+  $has_settings = FALSE;
+  $id = solrsearch_default_environment();
+  $environment = solrsearch_environment_load($id);
+  if (!$environment || empty($environment['url'])) {
+    $requirements['solrsearch'] = array(
+      'title' => $t('Solr search'),
+      'value' => $t('Missing environment configuration'),
+      'description' => $t('Missing or invalid Solr environment record for the default environment ID %id.', array('%id' => $id)),
+      'severity' => REQUIREMENT_ERROR,
+    );
+  }
+  else {
+    $has_settings = TRUE;
+  }
+
+  if ($has_settings) {
+    $ping = FALSE;
+    try {
+      $solr = solrsearch_get_solr($id);
+      $ping = @$solr->ping(variable_get('solrsearch_ping_timeout', 4));
+      // If there is no $solr object, there is no instance available, so don't continue.
+      if (!$ping) {
+        throw new Exception(t('No Solr instance available when checking requirements.'));
+      }
+    }
+    catch (Exception $e) {
+      watchdog('Apache Solr', nl2br(check_plain($e->getMessage())), NULL, WATCHDOG_ERROR);
+    }
+    $value = $ping ? $t('Your site has contacted the Apache Solr server.') : $t('Your site was unable to contact the Apache Solr server.');
+    $severity = $ping ? REQUIREMENT_OK : REQUIREMENT_ERROR;
+    $requirements['solrsearch'] = array(
+      'title' => $t('Apache Solr'),
+      'value' => $value,
+      'description' => $t('Default environment url: <br/> %url',  array('%url' => $environment['url'])),
+      'severity' => $severity,
+    );
+  }
+
+  return $requirements;
+}
+
+/**
+ * Implements hook_install().
+ */
+function solrsearch_install() {
+  module_load_include('inc', 'solrsearch', 'solrsearch_search.admin');
+  /*module_load_include('inc', 'solrsearch', 'solrsearch.index');*/
+  // Create one MLT block.
+  solrsearch_search_mlt_save_block(array('name' => st('More like this')));
+  db_insert('solrsearch_environment')->fields(array('env_id' => 'echosearch', 'name' => 'localhost server', 'url' => 'http://localhost:8983/solr'))->execute();
+
+  // Initialize the entities to index. We enable all node types by default
+  $info = entity_get_info('node');
+  $bundles = array_keys($info['bundles']);
+  $env_id = solrsearch_default_environment();
+  /*solrsearch_index_set_bundles($env_id, 'node', $bundles);*/
+
+  drupal_set_message(st('Apache Solr is enabled. Visit the <a href="@settings_link">settings page</a>.', array('@settings_link' => url('admin/config/search/solrsearch'))));
+}
+
+/**
+ * Implements hook_enable().
+ */
+function solrsearch_enable() {
+  // Completely build the index table.
+  module_load_include('inc', 'solrsearch', 'solrsearch.index');
+  $env_id = solrsearch_default_environment();
+  /*solrsearch_index_mark_for_reindex($env_id);*/
+}
+
+/**
+ * Implements hook_schema().
+ */
+function solrsearch_schema() {
+
+  $table = drupal_get_schema_unprocessed('system', 'cache');
+  $table['description'] = 'Cache table for solrsearch to store Luke data and indexing information.';
+  $schema['cache_solrsearch'] = $table;
+
+  $schema['solrsearch_environment'] = array(
+    'description' => 'The Solr search environment table.',
+    // Enable CTools exportables based on this table.
+    'export' => array(
+      // Environment machine name.
+      'key' => 'env_id',
+      // Description of key.
+      'key name' => 'Environment machine name',
+      // Apache Solr doesn't allow disabling environments.
+      'can disable' => FALSE,
+      // Variable name to use in exported code.
+      'identifier' => 'environment',
+      // Thin wrapper for the environment save callback.
+      'save callback' => 'solrsearch_ctools_environment_save',
+      // Thin wrapper for the environment delete callback.
+      'delete callback' => 'solrsearch_ctools_environment_delete',
+      // Includes the environment variables in 'conf' as well as the fields in this table.
+      'export callback' => 'solrsearch_ctools_environment_export',
+      // Use the same hook as the API name below.
+      'default hook' => 'solrsearch_environments',
+      // CTools API implementation.
+      'api' => array(
+        'owner' => 'solrsearch',
+        'api' => 'solrsearch_environments',
+        'minimum_version' => 1,
+        'current_version' => 1,
+      ),
+    ),
+    'fields' => array(
+      'env_id' => array(
+        'description' => 'Unique identifier for the environment',
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+      ),
+      'name' => array(
+        'description' => 'Human-readable name for the server',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => ''
+      ),
+      'url' => array(
+        'description' => 'Full url for the server',
+        'type' => 'varchar',
+        'length' => 1000,
+        'not null' => TRUE,
+      ),
+      'service_class' => array(
+        'description' => 'Optional class name to use for connection',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => ''
+      ),
+    ),
+    'primary key' => array('env_id'),
+  );
+  $schema['solrsearch_environment_variable'] = array(
+    'description' => 'Variable values for each Solr search environment.',
+    'fields' => array(
+      'env_id' => array(
+        'description' => 'Unique identifier for the environment',
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+      ),
+      'name' => array(
+        'description' => 'The name of the variable.',
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'value' => array(
+        'description' => 'The value of the variable.',
+        'type' => 'blob',
+        'not null' => TRUE,
+        'size' => 'big',
+      ),
+    ),
+    'primary key' => array('env_id', 'name'),
+  );
+
+  // Technically the entity system does not require an integer ID.
+  // However, documentation mentions :
+  // id: The name of the property that contains the primary id of the
+  // entity. Every entity object passed to the Field API must have this
+  // property and its value must be numeric.
+
+  //Predefine an amount of types that get their own table
+  $types = array(
+      'other' => 'solrsearch_index_entities',
+      'node' => 'solrsearch_index_entities_node',
+  );
+  foreach ($types as $type => $table) {
+    $schema[$table] = array(
+      'description' => 'Stores a record of when an entity changed to determine if it needs indexing by Solr.',
+      'fields' => array(
+        'entity_type' => array(
+          'description' => 'The type of entity.',
+          'type' => 'varchar',
+          'length' => 32,
+          'not null' => TRUE,
+        ),
+        'entity_id' => array(
+          'description' => 'The primary identifier for an entity.',
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+        ),
+        'bundle' => array(
+          'description' => 'The bundle to which this entity belongs.',
+          'type' => 'varchar',
+          'length' => 128,
+          'not null' => TRUE,
+        ),
+        'status' => array(
+          'description' => 'Boolean indicating whether the entity should be in the index.',
+          'type' => 'int',
+          'not null' => TRUE,
+          'default' => 1,
+        ),
+        'changed' => array(
+          'description' => 'The Unix timestamp when an entity was changed.',
+          'type' => 'int',
+          'not null' => TRUE,
+          'default' => 0,
+        ),
+      ),
+      'indexes' => array(
+        'bundle_changed' => array('bundle', 'changed'),
+      ),
+      'primary key' => array('entity_id'),
+    );
+    if ($type == 'other') {
+      // Need the entity type also in the pkey for multiple entities in one table.
+      $schema[$table]['primary key'][] = 'entity_type';
+    }
+  }
+
+  $schema['solrsearch_index_bundles'] = array(
+    'description' => 'Records what bundles we should be indexing for a given environment.',
+    'fields' => array(
+      'env_id' => array(
+        'description' => 'The name of the environment.',
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+      ),
+      'entity_type' => array(
+        'description' => 'The type of entity.',
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+      ),
+      'bundle' => array(
+        'description' => 'The bundle to index.',
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+      ),
+    ),
+    'primary key' => array('env_id', 'entity_type', 'bundle'),
+  );
+  return $schema;
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function solrsearch_uninstall() {
+  // Remove variables.
+  variable_del('solrsearch_default_environment');
+  variable_del('solrsearch_rows');
+  variable_del('solrsearch_site_hash');
+  variable_del('solrsearch_index_last');
+  variable_del('solrsearch_search_mlt_blocks');
+  variable_del('solrsearch_cron_limit');
+  variable_del('solrsearch_exclude_nodeapi_types');
+  variable_del('solrsearch_failure');
+  variable_del('solrsearch_index_updated');
+  variable_del('solrsearch_read_only');
+  variable_del('solrsearch_set_nodeapi_messages');
+  variable_del('solrsearch_last_optimize');
+  variable_del('solrsearch_update_from_6303');
+  // Remove blocks.
+  db_delete('block')->condition('module', 'solrsearch')->execute();
+}
+
+/**
+ * Add a table to track Solr servers.
+ */
+function solrsearch_update_7000() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  $schema['solrsearch_server'] = array(
+    'description' => 'The Solr server table.',
+    'fields' => array(
+     'server_id' => array(
+        'description' => 'Unique identifier for the server',
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+      ),
+      'name' => array(
+        'description' => 'Human-readable name for the server',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => ''
+      ),
+      'scheme' => array(
+        'description' => 'Preferred scheme for the registered server',
+        'type' => 'varchar',
+        'length' => 10,
+        'not null' => TRUE,
+        'default' => 'http'
+      ),
+      'host' => array(
+        'description' => 'Host name for the registered server',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => ''
+      ),
+      'port' => array(
+        'description' => 'Port number for the registered server',
+        'type' => 'int',
+        'not null' => TRUE,
+      ),
+      'path' => array(
+        'description' => 'Path to the registered server',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => ''
+      ),
+      'service_class' => array(
+        'description' => 'Optional class name to use for connection',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => ''
+      ),
+    ),
+    'primary key' => array('server_id'),
+  );
+  db_create_table('solrsearch_server', $schema['solrsearch_server']);
+  // Insert into the table the current single server record.
+  $host = variable_get('solrsearch_host', 'localhost');
+  $port = variable_get('solrsearch_port', '8983');
+  $path = variable_get('solrsearch_path', '/solr');
+  db_insert('solrsearch_server')->fields(array('server_id' => 'solr', 'name' => 'Apache Solr server', 'host' => $host, 'port' => $port, 'path' => $path))->execute();
+  variable_set('solrsearch_default_server', 'solr');
+  variable_del('solrsearch_host');
+  variable_del('solrsearch_port');
+  variable_del('solrsearch_path');
+  $value = variable_get('solrsearch_service_class', NULL);
+  if (is_array($value)) {
+    list($module, $filepath, $class) = $value;
+    variable_set('solrsearch_service_class', $class);
+  }
+  variable_del('solrsearch_logging');
+}
+
+
+/**
+ * Re-jigger the schema to use fewer, shorter keys.
+ */
+function solrsearch_update_7001() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  if (db_field_exists('solrsearch_server', 'asid')) {
+    // You installed the beta1 and need to be fixed up.
+    db_drop_field('solrsearch_server', 'asid');
+    db_drop_unique_key('solrsearch_server', 'server_id');
+    db_add_primary_key('solrsearch_server', array('server_id'));
+    db_drop_unique_key('solrsearch_server', 'host_post_path');
+    db_change_field('solrsearch_server', 'port', 'port',
+      array(
+        'description' => 'Port number for the registered server',
+        'type' => 'int',
+        'not null' => TRUE,
+      )
+    );
+  }
+}
+
+/**
+ * Create the per-server variable table.
+ */
+function solrsearch_update_7002() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  $schema['solrsearch_server_variable'] = array(
+    'description' => 'Variable values for each Solr server.',
+    'fields' => array(
+     'server_id' => array(
+        'description' => 'Unique identifier for the server',
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+      ),
+      'name' => array(
+        'description' => 'The name of the variable.',
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'value' => array(
+        'description' => 'The value of the variable.',
+        'type' => 'blob',
+        'not null' => TRUE,
+        'size' => 'big',
+      ),
+    ),
+    'primary key' => array('server_id', 'name'),
+  );
+  db_create_table('solrsearch_server_variable', $schema['solrsearch_server_variable']);
+  $server_id = variable_get('solrsearch_default_server', 'solr');
+  // Variables to be migrated:
+  $conf['solrsearch_enabled_facets'] = variable_get('solrsearch_enabled_facets', NULL);
+  $conf['solrsearch_search_query_fields'] = variable_get('solrsearch_search_query_fields', NULL);
+  $conf['solrsearch_search_type_boosts'] = variable_get('solrsearch_search_type_boosts', NULL);
+  $conf['solrsearch_search_comment_boost'] = variable_get('solrsearch_search_comment_boost', NULL);
+  $conf['solrsearch_search_changed_boost'] = variable_get('solrsearch_search_changed_boost', NULL);
+  $conf['solrsearch_search_sticky_boost'] = variable_get('solrsearch_search_sticky_boost', NULL);
+  $conf['solrsearch_search_promote_boost'] = variable_get('solrsearch_search_promote_boost', NULL);
+  $conf['solrsearch_search_excluded_types'] = variable_get('solrsearch_search_excluded_types', NULL);
+  foreach ($conf as $name => $value) {
+    if ($value !== NULL) {
+      db_merge('solrsearch_server_variable')
+        ->key(array('server_id' => $server_id, 'name' => $name))
+        ->fields(array('value' => serialize($value)))
+        ->execute();
+    }
+    variable_del($name);
+  }
+}
+
+/**
+ * Move excluded comment types into a new variable.
+ */
+function solrsearch_update_7003() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  // Same as solrsearch_update_6006()
+  $exclude_comment_types = variable_get('solrsearch_exclude_comments_types', NULL);
+  if (is_array($exclude_comment_types)) {
+    $exclude = array();
+    foreach ($exclude_comment_types as $type) {
+      $exclude[$type]['comment'] = TRUE;
+    }
+    variable_set('solrsearch_exclude_nodeapi_types', $exclude);
+  }
+  variable_del('solrsearch_exclude_comments_types');
+}
+
+/**
+ * Update solrsearch_failure variable.
+ */
+function solrsearch_update_7004() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  $failure = variable_get('solrsearch_failure', NULL);
+  switch ($failure) {
+    case 'show_error':
+      variable_set('solrsearch_failure', 'solrsearch:show_error');
+      break;
+    case 'show_drupal_results':
+      variable_set('solrsearch_failure', 'node');
+      break;
+    case 'show_no_results':
+      variable_set('solrsearch_failure', 'solrsearch:show_no_results');
+      break;
+  }
+}
+
+/**
+ * Re-jigger the schema to use just a url column.
+ */
+function solrsearch_update_7005() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  if (db_field_exists('solrsearch_server', 'port')) {
+    // You installed the beta3 and need to be fixed up.
+    $servers = db_query('SELECT * FROM {solrsearch_server}')->fetchAllAssoc('server_id', PDO::FETCH_ASSOC);
+    db_drop_field('solrsearch_server', 'scheme');
+    db_drop_field('solrsearch_server', 'port');
+    db_drop_field('solrsearch_server', 'path');
+    db_change_field('solrsearch_server', 'host', 'url',
+      array(
+        'description' => 'Full url for the server',
+        'type' => 'varchar',
+        'length' => 1000,
+        'not null' => TRUE,
+      )
+    );
+    foreach ($servers as $id => $server) {
+      $port = $server['port'] ? ':' . $server['port'] : '';
+      $url = $server['scheme'] . '://' . $server['host'] . $port . $server['path'];
+    db_update('solrsearch_server')
+      ->fields(array('url' => $url))
+      ->condition('server_id', $id)
+      ->execute();
+    }
+  }
+}
+
+/**
+ * Remove facet-related variable deprecated by the Facet API integration.
+ */
+function solrsearch_update_7006() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  variable_del('solrsearch_facetstyle');
+  variable_del('solrsearch_facet_show_children');
+  variable_del('solrsearch_facet_query_limits');
+  variable_del('solrsearch_facet_query_limit_default');
+}
+
+/**
+ * Rename tables to make them more generic.
+ */
+function solrsearch_update_7007() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  db_drop_primary_key('solrsearch_server');
+  db_drop_primary_key('solrsearch_server_variable');
+  db_rename_table('solrsearch_server', 'solrsearch_environment');
+  db_rename_table('solrsearch_server_variable', 'solrsearch_environment_variable');
+  db_change_field('solrsearch_environment', 'server_id', 'env_id', array(
+    'description' => 'Unique identifier for the environment',
+    'type' => 'varchar',
+    'length' => 64,
+    'not null' => TRUE)
+  );
+  db_change_field('solrsearch_environment_variable', 'server_id', 'env_id', array(
+    'description' => 'Unique identifier for the environment',
+    'type' => 'varchar',
+    'length' => 64,
+    'not null' => TRUE)
+  );
+  db_add_primary_key('solrsearch_environment', array('env_id'));
+  db_add_primary_key('solrsearch_environment_variable', array('env_id', 'name'));
+  $id = variable_get('solrsearch_default_server', NULL);
+  if (isset($id)) {
+    variable_set('solrsearch_default_environment', $id);
+  }
+  variable_del('solrsearch_default_server');
+}
+
+/**
+ * Remove more facet-related variable deprecated by the Facet API integration.
+ */
+function solrsearch_update_7008() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  variable_del('solrsearch_facet_missing');
+  variable_del('solrsearch_facet_query_initial_limits');
+  variable_del('solrsearch_facet_query_sorts');
+  variable_del('solrsearch_facet_sort_active');
+  variable_del('solrsearch_operator');
+}
+
+/**
+ * Update Facet API block deltas to account for removal of numeric ID from field names.
+ */
+function solrsearch_update_7009() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  // Only run when facetapi is available and/or installed
+  if (module_exists('facetapi')) {
+    module_load_include('inc', 'facetapi', 'facetapi.block');
+    // Get all searchers
+    $searchers = facetapi_get_searcher_info();
+    $realms = facetapi_get_realm_info();
+    foreach ($searchers as $searcher_id => $searcher) {
+      foreach ($realms as $realm_id => $realm) {
+        foreach (field_info_fields() as $field_name => $field) {
+          // Generate the old delta
+          $facet_name_old = $field['id'] . '_' . $field['field_name'];
+          $delta_old = facetapi_build_delta($searcher['name'], $realm['name'], $facet_name_old);
+          $delta_old = substr(drupal_hash_base64($delta_old), 0, 32);
+          // Generate the new delta
+          $facet_name = $field['field_name'];
+          $delta = facetapi_build_delta($searcher['name'], $realm['name'], $facet_name);
+          $delta = substr(drupal_hash_base64($delta), 0, 32);
+          db_update('block')
+            ->fields(array('delta' => $delta))
+            ->condition('module', 'facetapi')
+            ->condition('delta', $delta_old)
+            ->execute();
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Update cache table schema for Drupal 7.
+ */
+function solrsearch_update_7010() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  db_drop_field('cache_solrsearch', 'headers');
+  return 'Updated cache table schema for Drupal 7.';
+}
+
+/**
+ * Change the namespace for the indexer from solrsearch_search to solrsearch
+ */
+function solrsearch_update_7011() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  $stored = variable_get('solrsearch_index_last', array());
+  if (isset($stored['solrsearch_search'])) {
+    $stored['solrsearch'] = $stored['solrsearch_search'];
+    unset($stored['solrsearch_search']);
+    variable_set('solrsearch_index_last', $stored);
+  }
+  return 'Updated the namespace variable for the index process.';
+}
+
+/**
+ * Rename some variables and update the database tables
+ */
+function solrsearch_update_7012() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  // @see: drupal_load()
+  if (!function_exists('solrsearch_default_environment')) {
+    include_once dirname(__FILE__) . '/solrsearch.module';
+  }
+
+  $env_id = solrsearch_default_environment();
+
+  // Variable changed from integer to array with environment integers
+  $stored = variable_get('solrsearch_index_last', array());
+  if (isset($stored['solrsearch'])) {
+    $stored[$env_id]['node']['last_entity_id'] = $stored['solrsearch']['last_nid'];
+    $stored[$env_id]['node']['last_changed'] = $stored['solrsearch']['last_change'];
+    unset($stored['solrsearch']);
+    variable_set('solrsearch_index_last', $stored);
+  }
+  $last = variable_get('solrsearch_index_updated', NULL);
+  if (isset($last)) {
+    variable_set('solrsearch_index_updated', array($env_id => (int) $last));
+  }
+
+  // Change namespace to environment id
+  $excluded_types = solrsearch_environment_variable_get('solrsearch', 'solrsearch_search_excluded_types', array());
+  if (!empty($excluded_types)) {
+    solrsearch_environment_variable_set($env_id, 'solrsearch_search_excluded_types', $excluded_types);
+    solrsearch_environment_variable_del('solrsearch', 'solrsearch_search_excluded_types');
+  }
+
+  // Install the new schema
+  //Predefine an amount of types that get their own table
+  $types = array(
+      'other' => 'solrsearch_index_entities',
+      'node' => 'solrsearch_index_entities_node',
+  );
+  foreach ($types as $type => $table) {
+    $schema[$table] = array(
+      'description' => 'Stores a record of when an entity changed to determine if it needs indexing by Solr.',
+      'fields' => array(
+        'entity_type' => array(
+          'description' => 'The type of entity.',
+          'type' => 'varchar',
+          'length' => 32,
+          'not null' => TRUE,
+        ),
+        'entity_id' => array(
+          'description' => 'The primary identifier for an entity.',
+          'type' => 'int',
+          'unsigned' => TRUE,
+          'not null' => TRUE,
+        ),
+        'bundle' => array(
+          'description' => 'The bundle to which this entity belongs.',
+          'type' => 'varchar',
+          'length' => 128,
+          'not null' => TRUE,
+        ),
+        'status' => array(
+          'description' => 'Boolean indicating whether the entity is visible to non-administrators (eg, published for nodes).',
+          'type' => 'int',
+          'not null' => TRUE,
+          'default' => 1,
+        ),
+        'changed' => array(
+          'description' => 'The Unix timestamp when an entity was changed.',
+          'type' => 'int',
+          'not null' => TRUE,
+          'default' => 0,
+        ),
+      ),
+      'indexes' => array(
+        'changed' => array('bundle', 'status', 'changed'),
+      ),
+      'primary key' => array('entity_id'),
+    );
+    if ($type == 'other') {
+      // Need the entity type also in the pkey for multiple entities in one table.
+      $schema[$table]['primary key'][] = 'entity_type';
+    }
+    // Create the table
+    db_create_table($table, $schema[$table]);
+  }
+
+  $schema['solrsearch_index_bundles'] = array(
+    'description' => 'Records what bundles we should be indexing for a given environment.',
+    'fields' => array(
+      'env_id' => array(
+        'description' => 'The name of the environment.',
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+      ),
+      'entity_type' => array(
+        'description' => 'The type of entity.',
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+      ),
+      'bundle' => array(
+        'description' => 'The bundle to index.',
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+      ),
+    ),
+    'primary key' => array('env_id', 'entity_type', 'bundle'),
+  );
+  db_create_table('solrsearch_index_bundles', $schema['solrsearch_index_bundles']);
+
+
+  // Move the data from solrsearch_search_node to solrsearch_index_entities_node
+  $select = db_select('solrsearch_search_node', 'asn');
+  $select->join('node', 'n', 'asn.nid = n.nid');
+  $select->addField('n', 'nid', 'entity_id');
+  $select->addField('n', 'type', 'bundle');
+  $select->addField('asn', 'status', 'status');
+  $select->addField('asn', 'changed', 'changed');
+  $select->addExpression("'node'", 'entity_type');
+  $return_value = db_insert('solrsearch_index_entities_node')
+    ->fields(array('entity_id', 'bundle', 'status', 'changed', 'entity_type'))
+    ->from($select)
+    ->execute();
+  // Drop the table solrsearch_search_node
+  db_drop_table('solrsearch_search_node');
+
+  $environments = solrsearch_load_all_environments();
+  foreach ($environments as $env_id => $environment) {
+    $excluded_types = solrsearch_environment_variable_get($env_id, 'solrsearch_search_excluded_types', array());
+    // Get indexable entity types
+    $options = array();
+    foreach (entity_get_info() as $entity_type => $entity_info) {
+      if ($entity_type == 'node') {
+        foreach ($entity_info['bundles'] as $key => $info) {
+          // See if it was excluded & only of entity node. We will not enable
+          // other entity types by default
+          if (empty($excluded_types[$key])) {
+            $options[$entity_type][$key] = $key;
+          }
+        }
+      }
+    }
+    // Set all except the excluded types
+    // @see solrsearch_index_set_bundles()
+    foreach ($options as $entity_type => $bundles) {
+      db_delete('solrsearch_index_bundles')
+        ->condition('env_id', $env_id)
+        ->condition('entity_type', $entity_type)
+        ->execute();
+
+      if ($bundles) {
+        $insert = db_insert('solrsearch_index_bundles')
+          ->fields(array('env_id', 'entity_type', 'bundle'));
+
+        foreach ($bundles as $bundle) {
+          $insert->values(array(
+            'env_id' => $env_id,
+            'entity_type' => $entity_type,
+            'bundle' => $bundle,
+          ));
+        }
+        $insert->execute();
+      }
+    }
+    // Remove the excluded types
+    solrsearch_environment_variable_del($env_id, 'solrsearch_search_excluded_types');
+  }
+}
+
+/**
+ * Make consistent (and reduce) field lengths which cause excess pkey length.
+ */
+function solrsearch_update_7013() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  db_drop_primary_key('solrsearch_index_entities');
+  db_change_field('solrsearch_index_entities', 'entity_type', 'entity_type', array(
+    'description' => 'The type of entity.',
+    'type' => 'varchar',
+    'length' => 32,
+    'not null' => TRUE)
+  );
+  db_add_primary_key('solrsearch_index_entities', array('entity_id', 'entity_type'));
+  db_change_field('solrsearch_index_entities_node', 'entity_type', 'entity_type', array(
+    'description' => 'The type of entity.',
+    'type' => 'varchar',
+    'length' => 32,
+    'not null' => TRUE)
+  );
+  db_drop_primary_key('solrsearch_index_bundles');
+  db_change_field('solrsearch_index_bundles', 'env_id', 'env_id', array(
+    'description' => 'Unique identifier for the environment',
+    'type' => 'varchar',
+    'length' => 64,
+    'not null' => TRUE)
+  );
+  db_change_field('solrsearch_index_bundles', 'entity_type', 'entity_type', array(
+    'description' => 'The type of entity.',
+    'type' => 'varchar',
+    'length' => 32,
+    'not null' => TRUE)
+  );
+  db_add_primary_key('solrsearch_index_bundles', array('env_id', 'entity_type', 'bundle'));
+}
+
+/**
+ * Remove status from the key.
+ */
+function solrsearch_update_7014() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  $types = array(
+    'other' => 'solrsearch_index_entities',
+    'node' => 'solrsearch_index_entities_node',
+  );
+  foreach ($types as $type => $table) {
+    db_drop_index($table, 'changed');
+    db_add_index($table, 'bundle_changed', array('bundle', 'changed'));
+  }
+}
+
+
+/**
+ * Fix primary key schema mismatch for those who cleanly installed with beta16.
+ */
+function solrsearch_update_7015() {
+  if (variable_get('solrsearch_update_from_6303', FALSE)) {
+    return NULL;
+  }
+
+  // Brand new installations since update_7013 have the wrong primary key.
+  db_drop_primary_key('solrsearch_index_entities');
+  db_add_primary_key('solrsearch_index_entities', array('entity_id', 'entity_type'));
+}
+
+/**
+ * Clean up solrsearch_update_from_6303.
+ *
+ * This variable had been used to bypass 7.x-1.x updates which are redundant
+ * with 6.x-3.x.
+ */
+function solrsearch_update_7016() {
+  variable_del('solrsearch_update_from_6303');
+}