You are here

apachesolr_term.module in Apachesolr Term 7

Indexer for the userhook_apachesolr_entity_info_alter entities for the Apachesolr module.

File

apachesolr_term.module
View source
<?php

// $Id$

/**
 * @file
 *   Indexer for the userhook_apachesolr_entity_info_alter entities for the Apachesolr module.
 */
function apachesolr_term_apachesolr_entity_info_alter(&$entity_info) {
  $entity_info['taxonomy_term']['indexable'] = TRUE;
  $entity_info['taxonomy_term']['status callback'] = 'apachesolr_term_status_callback';
  $entity_info['taxonomy_term']['document callback'][] = 'apachesolr_term_solr_document';
  $entity_info['taxonomy_term']['reindex callback'] = 'apachesolr_term_solr_reindex';
  $entity_info['taxonomy_term']['index_table'] = 'apachesolr_index_entities_term';
}

/**
 * Builds the user-specific information for a Solr document.
 *
 * @param ApacheSolrDocument $document
 *   The Solr document we are building up.
 * @param stdClass $entity
 *   The entity we are indexing.
 * @param string $entity_type
 *   The type of entity we're dealing with.
 */
function apachesolr_term_solr_document(ApacheSolrDocument $document, $term, $entity_type) {
  $document->tid = $term->tid;

  // Title is a required field.
  $document->label = apachesolr_clean_text(format_username($term));
  $term_tree = apachesolr_term_solr_taxonomy_ancestors($term);
  foreach ($term_tree as $tt => $td) {
    $document
      ->addField($td['key'], apachesolr_clean_text($td['value']));
  }

  // Note the conspicuous lack of password hash. :-)
  $build = taxonomy_term_view($term, 'search_index');

  // Why do we need this?
  unset($build['#theme']);
  $text = drupal_render($build);
  $document->content = apachesolr_clean_text($text);

  //  Generic usecase for future reference. Callbacks can
  //  allow you to send back multiple documents
  $documents = array();
  $documents[] = $document;
  return $documents;
}

/**
 * Reindexing callback for ApacheSolr, for taxonomy terms.
 */
function apachesolr_term_solr_reindex() {
  $indexer_table = apachesolr_get_indexer_table('taxonomy_term');
  $transaction = db_transaction();
  $env_id = apachesolr_default_environment();
  try {
    db_delete($indexer_table)
      ->condition('entity_type', 'taxonomy_term')
      ->execute();
    $select = db_select('taxonomy_term_data', 't');
    $select
      ->innerJoin('taxonomy_vocabulary', 'v', 't.vid = v.vid');
    $select
      ->addField('t', 'tid', 'entity_id');
    $select
      ->addField('v', 'machine_name', 'bundle');
    $select
      ->addExpression(1, 'status');
    $select
      ->addExpression("'taxonomy_term'", 'entity_type');
    $select
      ->addExpression(REQUEST_TIME, 'changed');
    $select
      ->condition('v.machine_name', apachesolr_get_index_bundles($env_id, 'taxonomy_term'), 'IN');
    $insert = db_insert($indexer_table)
      ->fields(array(
      'entity_id',
      'bundle',
      'status',
      'entity_type',
      'changed',
    ))
      ->from($select)
      ->execute();
  } catch (Exception $e) {
    $transaction
      ->rollback();

    //drupal_set_message($e->getMessage(), 'error');
    watchdog_exception('Apache Solr', $e);
    return FALSE;
  }
  return TRUE;
}
function apachesolr_term_solr_taxonomy_ancestors($term) {
  static $ancestors = array();
  $vocab_names = array();
  if (!isset($ancestors[$term->tid])) {
    $ancestors[$term->tid] = taxonomy_get_parents_all($term->tid);
  }
  foreach ($ancestors[$term->tid] as $ancestor) {

    // Index parent term against the field. Note that this happens
    // regardless of whether the facet is set to show as a hierarchy or not.
    // We would need a separate field if we were to index terms without any
    // hierarchy at all.
    $fields[] = array(
      'key' => 'tid',
      'value' => $ancestor->tid,
    );
    $fields[] = array(
      'key' => 'im_vid_' . $ancestor->vid,
      'value' => $ancestor->tid,
    );
    $name = apachesolr_clean_text($ancestor->name);
    $vocab_names[$ancestor->vid][] = $name;

    // We index each name as a string for cross-site faceting
    // using the vocab name rather than vid in field construction .
    $fields[] = array(
      'key' => 'sm_vid_' . apachesolr_vocab_name($ancestor->vid),
      'value' => $name,
    );
  }
  foreach ($vocab_names as $vid => $names) {
    $fields[] = array(
      'key' => 'tm_vid_' . $vid . '_names',
      'value' => implode(' ', $names),
    );
  }
  return $fields;
}

/**
 * Status callback for ApacheSolr, for terms.
 */
function apachesolr_term_status_callback($term, $type) {
  return TRUE;
}

Functions

Namesort descending Description
apachesolr_term_apachesolr_entity_info_alter @file Indexer for the userhook_apachesolr_entity_info_alter entities for the Apachesolr module.
apachesolr_term_solr_document Builds the user-specific information for a Solr document.
apachesolr_term_solr_reindex Reindexing callback for ApacheSolr, for taxonomy terms.
apachesolr_term_solr_taxonomy_ancestors
apachesolr_term_status_callback Status callback for ApacheSolr, for terms.