| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922 |
- <?php
- /**
- * @file
- * Install and related hooks for apachesolr_search.
- */
- /**
- * Implements hook_requirements().
- */
- function apachesolr_requirements($phase) {
- $requirements = array();
- if ($phase != 'runtime') {
- return $requirements;
- }
- // Ensure translations don't break at install time
- $t = get_t();
- $has_settings = FALSE;
- $id = apachesolr_default_environment();
- $environment = apachesolr_environment_load($id);
- if (!$environment || empty($environment['url'])) {
- $requirements['apachesolr'] = array(
- 'title' => $t('Apache Solr'),
- '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 = apachesolr_get_solr($id);
- $ping = @$solr->ping(variable_get('apachesolr_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['apachesolr'] = 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 apachesolr_install() {
- module_load_include('inc', 'apachesolr', 'apachesolr_search.admin');
- module_load_include('inc', 'apachesolr', 'apachesolr.index');
- // Create one MLT block.
- apachesolr_search_mlt_save_block(array('name' => st('More like this')));
- db_insert('apachesolr_environment')->fields(array('env_id' => 'solr', '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 = apachesolr_default_environment();
- apachesolr_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/apachesolr'))));
- }
- /**
- * Implements hook_enable().
- */
- function apachesolr_enable() {
- // Completely build the index table.
- module_load_include('inc', 'apachesolr', 'apachesolr.index');
- $env_id = apachesolr_default_environment();
- apachesolr_index_mark_for_reindex($env_id);
- }
- /**
- * Implements hook_schema().
- */
- function apachesolr_schema() {
- $table = drupal_get_schema_unprocessed('system', 'cache');
- $table['description'] = 'Cache table for apachesolr to store Luke data and indexing information.';
- $schema['cache_apachesolr'] = $table;
- $schema['apachesolr_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' => 'apachesolr_ctools_environment_save',
- // Thin wrapper for the environment delete callback.
- 'delete callback' => 'apachesolr_ctools_environment_delete',
- // Includes the environment variables in 'conf' as well as the fields in this table.
- 'export callback' => 'apachesolr_ctools_environment_export',
- // Use the same hook as the API name below.
- 'default hook' => 'apachesolr_environments',
- // CTools API implementation.
- 'api' => array(
- 'owner' => 'apachesolr',
- 'api' => 'apachesolr_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['apachesolr_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' => 'apachesolr_index_entities',
- 'node' => 'apachesolr_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['apachesolr_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 apachesolr_uninstall() {
- // Remove variables.
- variable_del('apachesolr_default_environment');
- variable_del('apachesolr_rows');
- variable_del('apachesolr_site_hash');
- variable_del('apachesolr_index_last');
- variable_del('apachesolr_search_mlt_blocks');
- variable_del('apachesolr_cron_limit');
- variable_del('apachesolr_exclude_nodeapi_types');
- variable_del('apachesolr_failure');
- variable_del('apachesolr_index_updated');
- variable_del('apachesolr_read_only');
- variable_del('apachesolr_set_nodeapi_messages');
- variable_del('apachesolr_last_optimize');
- variable_del('apachesolr_update_from_6303');
- // Remove blocks.
- db_delete('block')->condition('module', 'apachesolr')->execute();
- }
- /**
- * Add a table to track Solr servers.
- */
- function apachesolr_update_7000() {
- if (variable_get('apachesolr_update_from_6303', FALSE)) {
- return NULL;
- }
- $schema['apachesolr_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('apachesolr_server', $schema['apachesolr_server']);
- // Insert into the table the current single server record.
- $host = variable_get('apachesolr_host', 'localhost');
- $port = variable_get('apachesolr_port', '8983');
- $path = variable_get('apachesolr_path', '/solr');
- db_insert('apachesolr_server')->fields(array('server_id' => 'solr', 'name' => 'Apache Solr server', 'host' => $host, 'port' => $port, 'path' => $path))->execute();
- variable_set('apachesolr_default_server', 'solr');
- variable_del('apachesolr_host');
- variable_del('apachesolr_port');
- variable_del('apachesolr_path');
- $value = variable_get('apachesolr_service_class', NULL);
- if (is_array($value)) {
- list($module, $filepath, $class) = $value;
- variable_set('apachesolr_service_class', $class);
- }
- variable_del('apachesolr_logging');
- }
- /**
- * Re-jigger the schema to use fewer, shorter keys.
- */
- function apachesolr_update_7001() {
- if (variable_get('apachesolr_update_from_6303', FALSE)) {
- return NULL;
- }
- if (db_field_exists('apachesolr_server', 'asid')) {
- // You installed the beta1 and need to be fixed up.
- db_drop_field('apachesolr_server', 'asid');
- db_drop_unique_key('apachesolr_server', 'server_id');
- db_add_primary_key('apachesolr_server', array('server_id'));
- db_drop_unique_key('apachesolr_server', 'host_post_path');
- db_change_field('apachesolr_server', 'port', 'port',
- array(
- 'description' => 'Port number for the registered server',
- 'type' => 'int',
- 'not null' => TRUE,
- )
- );
- }
- }
- /**
- * Create the per-server variable table.
- */
- function apachesolr_update_7002() {
- if (variable_get('apachesolr_update_from_6303', FALSE)) {
- return NULL;
- }
- $schema['apachesolr_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('apachesolr_server_variable', $schema['apachesolr_server_variable']);
- $server_id = variable_get('apachesolr_default_server', 'solr');
- // Variables to be migrated:
- $conf['apachesolr_enabled_facets'] = variable_get('apachesolr_enabled_facets', NULL);
- $conf['apachesolr_search_query_fields'] = variable_get('apachesolr_search_query_fields', NULL);
- $conf['apachesolr_search_type_boosts'] = variable_get('apachesolr_search_type_boosts', NULL);
- $conf['apachesolr_search_comment_boost'] = variable_get('apachesolr_search_comment_boost', NULL);
- $conf['apachesolr_search_changed_boost'] = variable_get('apachesolr_search_changed_boost', NULL);
- $conf['apachesolr_search_sticky_boost'] = variable_get('apachesolr_search_sticky_boost', NULL);
- $conf['apachesolr_search_promote_boost'] = variable_get('apachesolr_search_promote_boost', NULL);
- $conf['apachesolr_search_excluded_types'] = variable_get('apachesolr_search_excluded_types', NULL);
- foreach ($conf as $name => $value) {
- if ($value !== NULL) {
- db_merge('apachesolr_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 apachesolr_update_7003() {
- if (variable_get('apachesolr_update_from_6303', FALSE)) {
- return NULL;
- }
- // Same as apachesolr_update_6006()
- $exclude_comment_types = variable_get('apachesolr_exclude_comments_types', NULL);
- if (is_array($exclude_comment_types)) {
- $exclude = array();
- foreach ($exclude_comment_types as $type) {
- $exclude[$type]['comment'] = TRUE;
- }
- variable_set('apachesolr_exclude_nodeapi_types', $exclude);
- }
- variable_del('apachesolr_exclude_comments_types');
- }
- /**
- * Update apachesolr_failure variable.
- */
- function apachesolr_update_7004() {
- if (variable_get('apachesolr_update_from_6303', FALSE)) {
- return NULL;
- }
- $failure = variable_get('apachesolr_failure', NULL);
- switch ($failure) {
- case 'show_error':
- variable_set('apachesolr_failure', 'apachesolr:show_error');
- break;
- case 'show_drupal_results':
- variable_set('apachesolr_failure', 'node');
- break;
- case 'show_no_results':
- variable_set('apachesolr_failure', 'apachesolr:show_no_results');
- break;
- }
- }
- /**
- * Re-jigger the schema to use just a url column.
- */
- function apachesolr_update_7005() {
- if (variable_get('apachesolr_update_from_6303', FALSE)) {
- return NULL;
- }
- if (db_field_exists('apachesolr_server', 'port')) {
- // You installed the beta3 and need to be fixed up.
- $servers = db_query('SELECT * FROM {apachesolr_server}')->fetchAllAssoc('server_id', PDO::FETCH_ASSOC);
- db_drop_field('apachesolr_server', 'scheme');
- db_drop_field('apachesolr_server', 'port');
- db_drop_field('apachesolr_server', 'path');
- db_change_field('apachesolr_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('apachesolr_server')
- ->fields(array('url' => $url))
- ->condition('server_id', $id)
- ->execute();
- }
- }
- }
- /**
- * Remove facet-related variable deprecated by the Facet API integration.
- */
- function apachesolr_update_7006() {
- if (variable_get('apachesolr_update_from_6303', FALSE)) {
- return NULL;
- }
- variable_del('apachesolr_facetstyle');
- variable_del('apachesolr_facet_show_children');
- variable_del('apachesolr_facet_query_limits');
- variable_del('apachesolr_facet_query_limit_default');
- }
- /**
- * Rename tables to make them more generic.
- */
- function apachesolr_update_7007() {
- if (variable_get('apachesolr_update_from_6303', FALSE)) {
- return NULL;
- }
- db_drop_primary_key('apachesolr_server');
- db_drop_primary_key('apachesolr_server_variable');
- db_rename_table('apachesolr_server', 'apachesolr_environment');
- db_rename_table('apachesolr_server_variable', 'apachesolr_environment_variable');
- db_change_field('apachesolr_environment', 'server_id', 'env_id', array(
- 'description' => 'Unique identifier for the environment',
- 'type' => 'varchar',
- 'length' => 64,
- 'not null' => TRUE)
- );
- db_change_field('apachesolr_environment_variable', 'server_id', 'env_id', array(
- 'description' => 'Unique identifier for the environment',
- 'type' => 'varchar',
- 'length' => 64,
- 'not null' => TRUE)
- );
- db_add_primary_key('apachesolr_environment', array('env_id'));
- db_add_primary_key('apachesolr_environment_variable', array('env_id', 'name'));
- $id = variable_get('apachesolr_default_server', NULL);
- if (isset($id)) {
- variable_set('apachesolr_default_environment', $id);
- }
- variable_del('apachesolr_default_server');
- }
- /**
- * Remove more facet-related variable deprecated by the Facet API integration.
- */
- function apachesolr_update_7008() {
- if (variable_get('apachesolr_update_from_6303', FALSE)) {
- return NULL;
- }
- variable_del('apachesolr_facet_missing');
- variable_del('apachesolr_facet_query_initial_limits');
- variable_del('apachesolr_facet_query_sorts');
- variable_del('apachesolr_facet_sort_active');
- variable_del('apachesolr_operator');
- }
- /**
- * Update Facet API block deltas to account for removal of numeric ID from field names.
- */
- function apachesolr_update_7009() {
- if (variable_get('apachesolr_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 apachesolr_update_7010() {
- if (variable_get('apachesolr_update_from_6303', FALSE)) {
- return NULL;
- }
- db_drop_field('cache_apachesolr', 'headers');
- return 'Updated cache table schema for Drupal 7.';
- }
- /**
- * Change the namespace for the indexer from apachesolr_search to apachesolr
- */
- function apachesolr_update_7011() {
- if (variable_get('apachesolr_update_from_6303', FALSE)) {
- return NULL;
- }
- $stored = variable_get('apachesolr_index_last', array());
- if (isset($stored['apachesolr_search'])) {
- $stored['apachesolr'] = $stored['apachesolr_search'];
- unset($stored['apachesolr_search']);
- variable_set('apachesolr_index_last', $stored);
- }
- return 'Updated the namespace variable for the index process.';
- }
- /**
- * Rename some variables and update the database tables
- */
- function apachesolr_update_7012() {
- if (variable_get('apachesolr_update_from_6303', FALSE)) {
- return NULL;
- }
- // @see: drupal_load()
- if (!function_exists('apachesolr_default_environment')) {
- include_once dirname(__FILE__) . '/apachesolr.module';
- }
- $env_id = apachesolr_default_environment();
- // Variable changed from integer to array with environment integers
- $stored = variable_get('apachesolr_index_last', array());
- if (isset($stored['apachesolr'])) {
- $stored[$env_id]['node']['last_entity_id'] = $stored['apachesolr']['last_nid'];
- $stored[$env_id]['node']['last_changed'] = $stored['apachesolr']['last_change'];
- unset($stored['apachesolr']);
- variable_set('apachesolr_index_last', $stored);
- }
- $last = variable_get('apachesolr_index_updated', NULL);
- if (isset($last)) {
- variable_set('apachesolr_index_updated', array($env_id => (int) $last));
- }
- // Change namespace to environment id
- $excluded_types = apachesolr_environment_variable_get('apachesolr', 'apachesolr_search_excluded_types', array());
- if (!empty($excluded_types)) {
- apachesolr_environment_variable_set($env_id, 'apachesolr_search_excluded_types', $excluded_types);
- apachesolr_environment_variable_del('apachesolr', 'apachesolr_search_excluded_types');
- }
- // Install the new schema
- //Predefine an amount of types that get their own table
- $types = array(
- 'other' => 'apachesolr_index_entities',
- 'node' => 'apachesolr_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['apachesolr_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('apachesolr_index_bundles', $schema['apachesolr_index_bundles']);
- // Move the data from apachesolr_search_node to apachesolr_index_entities_node
- $select = db_select('apachesolr_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('apachesolr_index_entities_node')
- ->fields(array('entity_id', 'bundle', 'status', 'changed', 'entity_type'))
- ->from($select)
- ->execute();
- // Drop the table apachesolr_search_node
- db_drop_table('apachesolr_search_node');
- $environments = apachesolr_load_all_environments();
- foreach ($environments as $env_id => $environment) {
- $excluded_types = apachesolr_environment_variable_get($env_id, 'apachesolr_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 apachesolr_index_set_bundles()
- foreach ($options as $entity_type => $bundles) {
- db_delete('apachesolr_index_bundles')
- ->condition('env_id', $env_id)
- ->condition('entity_type', $entity_type)
- ->execute();
- if ($bundles) {
- $insert = db_insert('apachesolr_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
- apachesolr_environment_variable_del($env_id, 'apachesolr_search_excluded_types');
- }
- }
- /**
- * Make consistent (and reduce) field lengths which cause excess pkey length.
- */
- function apachesolr_update_7013() {
- if (variable_get('apachesolr_update_from_6303', FALSE)) {
- return NULL;
- }
- db_drop_primary_key('apachesolr_index_entities');
- db_change_field('apachesolr_index_entities', 'entity_type', 'entity_type', array(
- 'description' => 'The type of entity.',
- 'type' => 'varchar',
- 'length' => 32,
- 'not null' => TRUE)
- );
- db_add_primary_key('apachesolr_index_entities', array('entity_id', 'entity_type'));
- db_change_field('apachesolr_index_entities_node', 'entity_type', 'entity_type', array(
- 'description' => 'The type of entity.',
- 'type' => 'varchar',
- 'length' => 32,
- 'not null' => TRUE)
- );
- db_drop_primary_key('apachesolr_index_bundles');
- db_change_field('apachesolr_index_bundles', 'env_id', 'env_id', array(
- 'description' => 'Unique identifier for the environment',
- 'type' => 'varchar',
- 'length' => 64,
- 'not null' => TRUE)
- );
- db_change_field('apachesolr_index_bundles', 'entity_type', 'entity_type', array(
- 'description' => 'The type of entity.',
- 'type' => 'varchar',
- 'length' => 32,
- 'not null' => TRUE)
- );
- db_add_primary_key('apachesolr_index_bundles', array('env_id', 'entity_type', 'bundle'));
- }
- /**
- * Remove status from the key.
- */
- function apachesolr_update_7014() {
- if (variable_get('apachesolr_update_from_6303', FALSE)) {
- return NULL;
- }
- $types = array(
- 'other' => 'apachesolr_index_entities',
- 'node' => 'apachesolr_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 apachesolr_update_7015() {
- if (variable_get('apachesolr_update_from_6303', FALSE)) {
- return NULL;
- }
- // Brand new installations since update_7013 have the wrong primary key.
- db_drop_primary_key('apachesolr_index_entities');
- db_add_primary_key('apachesolr_index_entities', array('entity_id', 'entity_type'));
- }
- /**
- * Clean up apachesolr_update_from_6303.
- *
- * This variable had been used to bypass 7.x-1.x updates which are redundant
- * with 6.x-3.x.
- */
- function apachesolr_update_7016() {
- variable_del('apachesolr_update_from_6303');
- }
- /**
- * Turn global variables in environment specific ones.
- */
- function apachesolr_update_7017() {
- // @see: drupal_load()
- if (!function_exists('apachesolr_environment_variable_set')) {
- include_once dirname(__FILE__) . '/apachesolr.module';
- }
- $stored = variable_get('apachesolr_index_last', array());
- foreach ($stored as $env_id => $entity_info) {
- apachesolr_environment_variable_set($env_id, 'apachesolr_index_last', $entity_info);
- }
- variable_del('apachesolr_index_last');
- $updated = variable_get('apachesolr_index_updated', array());
- $optimized = variable_get('apachesolr_last_optimize', 0);
- foreach ($updated as $env_id => $timestamp) {
- apachesolr_environment_variable_set($env_id, 'apachesolr_index_updated', $timestamp);
- apachesolr_environment_variable_set($env_id, 'apachesolr_last_optimize', $optimized);
- }
- }
|