Mercurial > hg > MPIWG-drupal-modules
diff sites/all/modules/custom/solrconnect/apachesolr.api.php @ 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/solrconnect/apachesolr.api.php Wed Jul 31 13:49:13 2013 +0200 @@ -0,0 +1,426 @@ +<?php +/** + * @file + * Exposed Hooks in 7.x: + */ + +/** + * Lets modules know when the default environment is changed. + * + * @param string $env_id + * The machine name of the environment. + * @param string $old_env_id + * The old machine name of the environment. + */ +function hook_apachesolr_default_environment($env_id, $old_env_id) { + $page = apachesolr_search_page_load('core_search'); + if ($page && $page['env_id'] != $env_id) { + $page['env_id'] = $env_id; + apachesolr_search_page_save($page); + } +} + +/** + * Add index mappings for Field API types. The default mappings array + * handles just list fields and taxonomy term reference fields, such as: + * + * $mappings['list_text'] = array( + * 'indexing_callback' => 'apachesolr_fields_list_indexing_callback', + * 'index_type' => 'string', + * 'map callback' => 'apachesolr_fields_list_display_callback', + * 'facets' => TRUE, + * ), + * + * In your implementation you can add additional field types such as: + * $mappings['number_integer']['number'] = array(...); + * + * You can also add mapping for a specific field. This will take precedence + * over any mapping for a general field type. A field-specific mapping would + * looks like: + * $mappings['per-field']['field_model_name'] = array(...); + * + * Much more information can be found below in the example implementation or in + * facetapi.api.php. If you feel restricted with the options as set below + * there is nothing that stops you from implementing facetapi directly. However + * it is recommended to not directly talk to solr fields since this could break + * in the future. + * + * @return array $mappings + * An associative array of mappings as defined by modules that implement + * hook_apachesolr_field_mappings(). + */ +function hook_apachesolr_field_mappings() { + $mappings = array( + // Example for a field API type. See extensive documentation below + 'number_float' => array( + 'indexing_callback' => 'apachesolr_fields_default_indexing_callback', + 'index_type' => 'tfloat', + 'facets' => TRUE, + 'query types' => array('term', 'numeric_range'), + 'query type' => 'term', + 'facet mincount allowed' => TRUE, + ), + // Example for a field API field + 'per-field' => array( + // machine name of the field in Field API + 'field_price' => array( + // REQUIRED FIELDS // + // Function callback to return the value that will be put in to + // the solr index + 'indexing_callback' => 'apachesolr_fields_default_indexing_callback', + + // NON REQUIRED FIELDS // + // See apachesolr_index_key() for the correct type. Defaults string + 'index_type' => 'string', + // How to display the values when they return as a facet + 'map callback' => 'apachesolr_fields_list_facet_map_callback', + // Does your facet have a dynamic name? Add function call here and will + // have the name of the return value + 'name callback' => FALSE, + // If a custom field needs to be searchable but does not need to be faceted you + // can change the 'facets' parameter to FALSE. + 'facets' => FALSE, + // Do you want to allow items without value + 'facet missing allowed' => FALSE, + // (optional) Whether or not the facet supports the + // "minimum facet count" setting. Defaults to TRUE. + 'facet mincount allowed' => FALSE, + // Field API allows any field to be multi-valued. + // If we set this to false we are able to sort + 'dependency plugins' => array('bundle', 'role'), + // Does your solr index has a hierarchy? + // See facetapi_get_taxonomy_hierarchy for details or + // view the mapping of taxonomy_term_reference + 'hierarchy callback' => FALSE, + // There are different query types to return information from Solr + // term : Regular strings + // date : Everything regarding dates + // numeric_range : Useful when you have widgets that depend + // on statistics coming from Solr + 'query types' => array('term', 'numeric_range'), + // Backwards compatible with previous facetapi versions. + // Pick the main query type + 'query type' => 'term', + // What dependencies do you have (see facetapi) + 'multiple' => TRUE, + ), + ), + ); + return $mappings; +} + +/** + * Alter hook for apachesolr_field_mappings(). + * + * Add or alter index mappings for Field API types. The default mappings array + * handles just list fields and taxonomy term reference fields, in the same way + * as documented in hook_apachesolr_field_mappings. + * + * @param array $mappings + * An associative array of mappings as defined by modules that implement + * hook_apachesolr_field_mappings(). + * @param string $entity_type + * The entity type for which you want to alter the field mappings + */ +function hook_apachesolr_field_mappings_alter(array &$mappings, $entity_type) { + // Enable indexing for text fields + $mappings['text'] = array( + 'indexing_callback' => 'apachesolr_fields_default_indexing_callback', + 'map callback' => '', + 'index_type' => 'string', + 'facets' => TRUE, + 'facet missing allowed' => TRUE, + 'dependency plugins' => array('bundle', 'role'), + 'hierarchy callback' => FALSE, + 'name callback' => '', + 'facet mincount allowed' => FALSE, + 'multiple' => FALSE, + ); + + // Add our per field mapping here so we can sort on the + // price by making it single. Solr cannot sort on multivalued fields + // field_price is our identifier of a custom field, and it was decided to + // index in the same way as a number_float field. + $mappings['per-field']['field_price'] = $mappings['number_float']; + $mappings['per-field']['field_price']['multiple'] = FALSE; +} + +/** + * Prepare the query by adding parameters, sorts, etc. + * + * This hook is invoked before the query is cached. The cached query is used + * after the search such as for building facet and sort blocks, so parameters + * added during this hook may be visible to end users. + * + * This is otherwise the same as HOOK_apachesolr_query_alter(), but runs before + * it. + * + * @param DrupalSolrQueryInterface $query + * An object implementing DrupalSolrQueryInterface. No need for &. + */ +function hook_apachesolr_query_prepare(DrupalSolrQueryInterface $query) { + // Add a sort on the node ID. + $query->setAvailableSort('entity_id', array( + 'title' => t('Node ID'), + 'default' => 'asc', + )); +} + +/** + * Assigns a readable name to your custom solr field + * + * @param array $map + */ +function hook_apachesolr_field_name_map_alter(array &$map) { + $map['xs_node'] = t('The full node object'); +} + +/** + * Alter the query after it's prepared and cached. + * + * Any module performing a search should call + * drupal_alter('apachesolr_query', $query). That function then invokes this + * hook. It allows modules to modify the query object and its parameters. + * + * A module implementing HOOK_apachesolr_query_alter() may set + * $query->abort_search to TRUE to flag the query to be aborted. + * + * @param DrupalSolrQueryInterface $query + * An object implementing DrupalSolrQueryInterface. No need for &. + */ +function hook_apachesolr_query_alter(DrupalSolrQueryInterface $query) { + // I only want to see articles by the admin. + // + // NOTE: this "is_uid" filter does NOT refer to the English word "is" + // It is a combination of flags representing Integer-Single, which is + // abbreviated with the letters i and s. + // + // @see the <dynamicField> definitions in schema.xml or schema-solr3.xml + $query->addFilter("is_uid", 1); + + // Only search titles. + $query->replaceParam('qf', 'label'); +} + +/** + * Allows a module to modify the delete query. + * + * @param string $query + * Defaults to *:* + * This is not an instance of DrupalSolrQueryInterface, it is the raw query that is being sent to Solr + */ +function hook_apachesolr_delete_by_query_alter($query) { + // use the site hash so that you only delete this site's content + if ($query == '*:*') { + $query = 'hash:' . apachesolr_site_hash(); + } + else { + $query .= ' AND hash:' . apachesolr_site_hash(); + } +} + +/** + * This is the place to look for the replacement to hook_apachesolr_node_exclude + * You should define a replacement for the status callback and return + * FALSE for entities which you do not want to appear in the index and TRUE for + * those that you want to include + */ + +/** + * This is invoked for each entity that is being inspected to be added to the + * index. if any module returns TRUE, the entity is skipped for indexing. + * + * @param string $entity_id + * @param string $entity_type + * @param object $row + * A complete set of data from the indexing table. + * @param string $env_id + * The machine name of the environment. + * @return boolean + */ +function hook_apachesolr_exclude($entity_id, $entity_type, $row, $env_id) { + // Never index media entities to core_1 + if ($entity_type == 'media' && $env_id == 'core_1') { + return TRUE; + } + return FALSE; +} + +/** + * This is invoked for each entity from the type of ENTITY_TYPE that is being + * inspected to be added to the index. if any module returns TRUE, + * the entity is skipped for indexing. + * + * @param string $entity_id + * @param object $row + * A complete set of data from the indexing table. + * @param string $env_id + * The machine name of the environment. + * @return boolean + */ +function hook_apachesolr_ENTITY_TYPE_exclude($entity_id, $row, $env_id) { + // Never index ENTITY_TYPE to core_1 + if ($env_id == 'core_1') { + return TRUE; + } + return FALSE; +} + +/** + * Add information to index other entities. + * There are some modules in http://drupal.org that can give a good example of + * custom entity indexing such as apachesolr_user, apachesolr_term + * + * @param array $entity_info + */ +function hook_apachesolr_entity_info_alter(array &$entity_info) { + // REQUIRED VALUES + // myentity should be replaced with user/node/custom entity + $entity_info['node'] = array(); + // Set this entity as indexable + $entity_info['node']['indexable'] = TRUE; + // Validate each entity if it can be indexed or not. Multiple callbacks are + // allowed. If one of them returns false it won't be indexed + $entity_info['node']['status callback'][] = 'apachesolr_index_node_status_callback'; + // Build up a custom document. + $entity_info['node']['document callback'][] = 'apachesolr_index_node_solr_document'; + // What to do when a reindex is issued. Most probably this will reset all the + // items in the index_table + $entity_info['node']['reindex callback'] = 'apachesolr_index_node_solr_reindex'; + + // OPTIONAL VALUES + // Index in a separate table? Useful for huge datasets. + $entity_info['node']['index_table'] = 'apachesolr_index_entities_node'; + // Execute custom callback on each cron run. + // See apachesolr_index_node_check_table + $entity_info['node']['cron_check'] = 'apachesolr_index_node_check_table'; + // Specific output processing for the results + $entity_info['node']['apachesolr']['result callback'] = 'apachesolr_search_node_result'; + + // BUNDLE SPECIFIC OVERRIDES + // The following can be overridden on a per-bundle basis. + // The bundle-specific settings will take precedence over the entity settings. + $entity_info['node']['bundles']['page']['apachesolr']['result callback'] = 'apachesolr_search_node_result'; + $entity_info['node']['bundles']['page']['apachesolr']['status callback'][] = 'apachesolr_index_node_status_callback'; + $entity_info['node']['bundles']['page']['apachesolr']['document callback'][] = 'apachesolr_index_node_solr_document'; +} + + +/** + * The is invoked by apachesolr_search.module for each document returned in a + * search. This has been introduced in 6.x-beta7 as a replacement for the call + * to HOOK_nodeapi(). + * + * @param ApacheSolrDocument $document + * The ApacheSolrDocument instance. + * @param array $extra + * @param DrupalSolrQueryInterface $query + */ +function hook_apachesolr_search_result_alter(ApacheSolrDocument $document, array &$extra, DrupalSolrQueryInterface $query) { +} + +/** + * This is invoked by apachesolr_search.module for the whole resultset returned + * in a search. + * + * @param array $results + * The returned search results. + * @param DrupalSolrQueryInterface $query + * The query for which we want to process the results from + */ +function hook_apachesolr_process_results(array &$results, DrupalSolrQueryInterface $query) { + foreach ($results as $id => $result) { + $results[$id]['title'] = t('[Result] !title', array('!title' => $result['title'])); + } +} + +/** + * Respond to search environment deletion. + * + * This hook is invoked from apachesolr_environment_delete() after the + * environment is removed from the database. + * + * @param array $environment + * The environment object that is being deleted. + */ +function hook_apachesolr_environment_delete(array $environment) { +} + +/** + * + * Modify the build array for any search output build by Apache Solr + * This includes core and custom pages and makes it very easy to modify both + * of them at once + * + * @param array $build + * @param array $search_page + */ +function hook_apachesolr_search_page_alter(array &$build, array $search_page) { + // Adds a text to the top of the page + $info = array('#markup' => t('Add information to every search page')); + array_unshift($build, $info); +} + +/** + * Modify the search types as found in the search pages administration + * + * @param array $search_types + */ +function hook_apachesolr_search_types_alter(&$search_types) { + $search_types['ss_language'] = array( + 'name' => apachesolr_field_name_map('ss_language'), + 'default menu' => 'search/language/%', + 'title callback' => 'custom_title_callback', + ); +} + +/** + * Build the documents before sending them to Solr. + * The function is the follow-up for apachesolr_update_index + * + * @param ApacheSolrDocument $document + * @param object $entity + * @param string $entity_type + * @param string $env_id + * The machine name of the environment. + */ +function hook_apachesolr_index_document_build(ApacheSolrDocument $document, $entity, $entity_type, $env_id) { + +} + +/** + * Build the documents before sending them to Solr. + * + * Supports all types of + * hook_apachesolr_index_document_build_' . $entity_type($documents[$id], $entity, $env_id); + * + * The function is the follow-up for apachesolr_update_index but then for + * specific entity types + * + * @param ApacheSolrDocument $document + * @param object $entity + * @param string $env_id + * The machine name of the environment. + */ +function hook_apachesolr_index_document_build_ENTITY_TYPE(ApacheSolrDocument $document, $entity, $env_id) { + // Index field_main_image as a separate field + if ($entity->type == 'profile') { + $user = user_load(array('uid' => $entity->uid)); + // Hard coded field, not recommended for inexperienced users. + $document->setMultiValue('sm_field_main_image', $user->picture); + } +} + +/** + * Alter the prepared documents from one entity before sending them to Solr. + * + * @param $documents + * Array of ApacheSolrDocument objects. + * @param object $entity + * @param string $entity_type + * @param string $env_id + * The machine name of the environment. + */ +function hook_apachesolr_index_documents_alter(array &$documents, $entity, $entity_type, $env_id) { + // Do whatever altering you need here +}