public function SearchApiMultiViewsQuery::get_result_wrappers in Search API Multi-Index Searches 7
Returns the according metadata wrappers for the given query results.
This is necessary to support generic entity handlers and plugins with this query backend.
Overrides SearchApiViewsQuery::get_result_wrappers
File
- views/
query.inc, line 116
Class
- SearchApiMultiViewsQuery
- Views query class using a Search API index as the data source.
Code
public function get_result_wrappers($results, $relationship = NULL, $field = NULL) {
$wrappers = array();
$load_items = array();
$entity_types = entity_get_info();
$indexes = $this
->getIndexes();
// Entity property info for the results.
$info = array();
foreach ($indexes as $index_id => $index) {
$entity_type = $index
->getEntityType();
$info['property info'][$index_id] = array(
'label' => t('@index results', array(
'@index' => $index->name,
)),
'type' => $entity_type ? $entity_type : $index->item_type,
'description' => t('Results from the @index index.', array(
'@index' => $index->name,
)),
);
if (!$entity_type) {
$info['property info'][$index_id] += $index
->entityWrapper()
->info();
}
}
// Pick out all results that need to be loaded.
foreach ($results as $row_index => $row) {
$index_id = $row->_entity_properties['search_api_multi_index'];
if (isset($row->entity) && !empty($indexes[$index_id])) {
$index = $indexes[$index_id];
// If this item isn't loaded, register it for pre-loading.
if (is_scalar($row->entity)) {
$load_items[$index->item_type][$row->entity] = $row->entity;
}
}
}
// Load the results in bulk, by item type, and create the wrappers.
if (!empty($load_items)) {
foreach ($load_items as $type => $ids) {
try {
$load_items[$type] = search_api_get_datasource_controller($type)
->loadItems($ids);
} catch (SearchApiException $e) {
watchdog_exception('search_api_multi', $e);
}
}
}
// Create wrappers for all results.
foreach ($results as $row_index => $row) {
$index_id = $row->_entity_properties['search_api_multi_index'];
if ($indexes[$index_id]) {
if (is_scalar($row->entity)) {
$index = $indexes[$index_id];
if (empty($load_items[$index->item_type][$row->entity])) {
continue;
}
$row->entity = $load_items[$index->item_type][$row->entity];
}
$item = $row->entity;
$data = new stdClass();
$data->{$index_id} = $item;
$wrappers[$row_index] = entity_metadata_wrapper('search_api_multi', $data, $info);
}
}
// Apply the relationship, if necessary.
$type = 'search_api_multi';
$selector_suffix = '';
if ($field && ($pos = strrpos($field, ':'))) {
$selector_suffix = substr($field, 0, $pos);
}
if ($selector_suffix || $relationship && !empty($this->view->relationship[$relationship])) {
// Use EntityFieldHandlerHelper to compute the correct data selector for
// the relationship.
$handler = (object) array(
'view' => $this->view,
'relationship' => $relationship,
'real_field' => '',
);
$selector = EntityFieldHandlerHelper::construct_property_selector($handler);
$selector .= ($selector ? ':' : '') . $selector_suffix;
list($type, $wrappers) = EntityFieldHandlerHelper::extract_property_multiple($wrappers, $selector);
}
return array(
$type,
$wrappers,
);
}