123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- diff --git a/search_api_solr.api.php b/search_api_solr.api.php
- index f407407..ec4b190 100644
- --- a/search_api_solr.api.php
- +++ b/search_api_solr.api.php
- @@ -85,5 +85,45 @@ function hook_search_api_solr_multi_query_alter(array &$call_args, SearchApiMult
- }
-
- /**
- + * Define how Search API Solr should index different data types.
- + *
- + * It is important to make sure that any types you define are also declared to
- + * Search API using hook_search_api_data_type_info().
- + *
- + * @return array
- + * An array containing data type definitions, keyed by their type identifier
- + * and containing the following keys:
- + * - prefix: The prefix used by the dynamic field type.
- + * - always multiValued: (optional) Whether the single/multiple prefix should
- + * be skipped for this data type. Defaults to FALSE.
- + *
- + * @see hook_search_api_solr_dynamic_field_info_alter()
- + * @see search_api_solr_get_dynamic_field_info()
- + * @see hook_search_api_data_type_info().
- + */
- +function hook_search_api_solr_dynamic_field_info() {
- + return array(
- + 'example_type' => array(
- + 'prefix' => 'ex',
- + // Could be omitted, as FALSE is the default.
- + 'always multiValued' => FALSE,
- + ),
- + );
- +}
- +
- +/**
- + * Alter the data type indexing info.
- + *
- + * @param array $infos
- + * The item type info array, keyed by type identifier.
- + *
- + * @see hook_search_api_solr_dynamic_field_info()
- + */
- +function hook_search_api_solr_dynamic_field_info_alter(array &$infos) {
- + // Change the prefix used for example_type.
- + $info['example_type']['prefix'] = 'ex2';
- +}
- +
- +/**
- * @} End of "addtogroup hooks".
- */
- diff --git a/search_api_solr.module b/search_api_solr.module
- index 9e30397..b75319b 100644
- --- a/search_api_solr.module
- +++ b/search_api_solr.module
- @@ -143,3 +143,81 @@ function search_api_solr_cron() {
- }
- }
- }
- +
- +/**
- + * Returns either all dynamic field types, or a specific one.
- + *
- + * @param $type
- + * If specified, the type whose definition should be returned.
- + *
- + * @return array
- + * If $type was not given, an array containing all custom dynamic fields, in
- + * the format specified by hook_search_api_solr_dynamic_field_info().
- + * Otherwise, the definition for the given type, or NULL if it is unknown.
- + *
- + * @see hook_search_api_solr_dynamic_field_info().
- + */
- +function search_api_solr_get_dynamic_field_info($type = NULL) {
- + $types = &drupal_static(__FUNCTION__);
- + if (!isset($types)) {
- + $types = module_invoke_all('search_api_solr_dynamic_field_info');
- + $types = $types ? $types : array();
- + drupal_alter('search_api_solr_dynamic_field_info', $types);
- + }
- + if (isset($type)) {
- + return isset($types[$type]) ? $types[$type] : NULL;
- + }
- + return $types;
- +}
- +
- +/**
- + * Implements hook_search_api_solr_dynamic_field_info().
- + */
- +function search_api_solr_search_api_solr_dynamic_field_info() {
- + return array(
- + 'text' => array(
- + 'prefix' => 'tm',
- + 'always multiValued' => TRUE,
- + ),
- + 'tokens' => array(
- + 'prefix' => 'tm',
- + 'always multiValued' => TRUE,
- + ),
- + 'string' => array(
- + 'prefix' => 's',
- + 'always multiValued' => FALSE,
- + ),
- + 'integer' => array(
- + 'prefix' => 'i',
- + 'always multiValued' => FALSE,
- + ),
- + 'decimal' => array(
- + 'prefix' => 'f',
- + 'always multiValued' => FALSE,
- + ),
- + 'date' => array(
- + 'prefix' => 'd',
- + 'always multiValued' => FALSE,
- + ),
- + 'duration' => array(
- + 'i',
- + 'always multiValued' => FALSE,
- + ),
- + 'boolean' => array(
- + 'b',
- + 'always multiValued' => FALSE,
- + ),
- + 'uri' => array(
- + 's',
- + 'always multiValued' => FALSE,
- + ),
- + 'location' => array(
- + 'loc',
- + 'always multiValued' => FALSE,
- + ),
- + 'geohash' => array(
- + 'geohash',
- + 'always multiValued' => FALSE,
- + ),
- + );
- +}
- diff --git a/service.inc b/service.inc
- index 0e8dbee..5054c51 100644
- --- a/service.inc
- +++ b/service.inc
- @@ -18,26 +18,6 @@ class SearchApiSolrService extends SearchApiAbstractService {
- protected $solr;
-
- /**
- - * An array of all recognized types mapped to a prefix used for identifying
- - * them in the Solr schema.
- - *
- - * @var array
- - */
- - protected static $type_prefixes = array(
- - 'text' => 'tm',
- - 'tokens' => 'tm',
- - 'string' => 's',
- - 'integer' => 'i',
- - 'decimal' => 'f',
- - 'date' => 'd',
- - 'duration' => 'i',
- - 'boolean' => 'b',
- - 'uri' => 's',
- - 'location' => 'loc',
- - 'geohash' => 'geohash',
- - );
- -
- - /**
- * @var array
- */
- protected $fieldNames = array();
- @@ -222,7 +202,8 @@ class SearchApiSolrService extends SearchApiAbstractService {
- }
-
- public function supportsFeature($feature) {
- - $supported = drupal_map_assoc(array(
- + // Search API features.
- + $supported = array(
- 'search_api_autocomplete',
- 'search_api_facets',
- 'search_api_facets_operator_or',
- @@ -231,7 +212,14 @@ class SearchApiSolrService extends SearchApiAbstractService {
- 'search_api_spellcheck',
- 'search_api_data_type_location',
- 'search_api_data_type_geohash',
- - ));
- + );
- +
- + // Custom data types.
- + foreach (search_api_solr_get_dynamic_field_info() as $type => $info) {
- + $supported[] = 'search_api_data_type_' . $type;
- + }
- +
- + $supported = drupal_map_assoc($supported);
- return isset($supported[$feature]);
- }
-
- @@ -395,8 +383,9 @@ class SearchApiSolrService extends SearchApiAbstractService {
- }
-
- $inner_type = search_api_extract_inner_type($type);
- - $pref = isset(self::$type_prefixes[$inner_type]) ? self::$type_prefixes[$inner_type] : '';
- - if ($pref != 'tm') {
- + $type_info = search_api_solr_get_dynamic_field_info($inner_type);
- + $pref = isset($type_info['prefix']) ? $type_info['prefix']: '';
- + if (empty($type_info['always multiValued'])) {
- $pref .= $type == $inner_type ? 's' : 'm';
- }
- $name = $pref . '_' . $key;
|