You are here

function scald_index_build_node_index in scald_index 7

Builds index for a given node.

Gather all atoms from the node fields and insert index data for each of them.

Parameters

object $node: The node object.

3 calls to scald_index_build_node_index()
scald_index_node_insert in ./scald_index.module
Implements hook_node_insert().
scald_index_node_update in ./scald_index.module
Implements hook_node_update().
scald_index_rebuild_run in ./scald_index.module
Rebuilds the index for a batch of nodes.

File

./scald_index.module, line 130

Code

function scald_index_build_node_index($node) {

  // If a node property is not set in the node object when node_save() is
  // called, the old value from $node->original is used.
  $status = NULL;
  $type = NULL;
  if (!empty($node->original)) {
    $status = (int) (!empty($node->status) || !isset($node->status) && !empty($node->original->status));
    $type = $node->original->type;
  }
  else {
    $status = (int) (!empty($node->status));
    $type = $node->type;
  }

  // Collect a unique list of all the atom ids from all node fields.
  $sid_all = array();
  $instances = field_info_instances('node', $node->type);
  foreach ($instances as $field_name => $instance) {
    $field = field_info_field($field_name);
    $analyse_field = FALSE;

    // Detect atom in reference fields.
    if ($field['module'] == 'atom_reference' && $field['storage']['type'] == 'field_sql_storage') {
      $analyse_field = TRUE;
    }

    // Detect atoms embedded in text fields.
    if (isset($instance['settings']['mee_enabled']) && $instance['settings']['mee_enabled'] or isset($instance['settings']['dnd_enabled']) && $instance['settings']['dnd_enabled']) {
      $analyse_field = TRUE;
    }

    // Extract atoms used in this field.
    if ($analyse_field) {
      foreach (field_available_languages('node', $field) as $langcode) {
        $values = field_get_items('node', $node, $field_name, $langcode);
        if (!empty($values)) {
          foreach ($values as $value) {

            // Atom references.
            if (isset($value['sid'])) {
              $sid_all[] = array(
                'sid' => $value['sid'],
                'field_name' => $field_name,
              );
            }

            // Text scanning.
            if (isset($value['value'])) {
              $extracted_sids = scald_index_included($value['value']);
              foreach ($extracted_sids as $sid) {
                $sid_all[] = array(
                  'sid' => $sid,
                  'field_name' => $field_name,
                );
              }
            }
          }
        }
      }
    }
  }

  // Allow other modules to alter the list of atoms of the node.
  drupal_alter('scald_index_node_atoms', $node, $sid_all);

  // Create index entries for all the node's atoms.
  if (!empty($sid_all)) {
    $query = db_insert('scald_index')
      ->fields(array(
      'nid',
      'sid',
      'status',
      'type',
      'field_name',
    ));
    foreach ($sid_all as $sid_infos) {
      $query
        ->values(array(
        'nid' => $node->nid,
        'sid' => $sid_infos['sid'],
        'status' => $status,
        'type' => $type,
        'field_name' => $sid_infos['field_name'],
      ));
    }
    $query
      ->execute();

    // Allow other modules to do treatments after index build.
    module_invoke_all('scald_index_after_build_node_index', $node, $sid_all);
  }
}