/** * {@inheritdoc} */ public function getFields($extract = TRUE) { if ($extract && !$this->fieldsExtracted) { $data_type_fallback_mapping = Utility::getDataTypeFallbackMapping($this->index); foreach (array(NULL, $this->getDatasourceId()) as $datasource_id) { $fields_by_property_path = array(); foreach ($this->index->getFieldsByDatasource($datasource_id) as $field_id => $field) { // Don't overwrite fields that were previously set. if (empty($this->fields[$field_id])) { $this->fields[$field_id] = clone $field; $field_data_type = $this->fields[$field_id]->getType(); // If the field data type is in the fallback mapping list, then use // the fallback type as field type. if (isset($data_type_fallback_mapping[$field_data_type])) { $this->fields[$field_id]->setType($data_type_fallback_mapping[$field_data_type]); } $fields_by_property_path[$field->getPropertyPath()] = $this->fields[$field_id]; } } if ($datasource_id && $fields_by_property_path) { try { Utility::extractFields($this->getOriginalObject(), $fields_by_property_path); } catch (SearchApiException $e) { // If we couldn't load the object, just log an error and fail // silently to set the values. watchdog_exception('search_api', $e); } } } $this->fieldsExtracted = TRUE; } return $this->fields; }
/** * Generates some test items. * * @param array[] $items * Array of items to be transformed into proper search item objects. Each * item in this array is an associative array with the following keys: * - datasource: The datasource plugin ID. * - item: The item object to be indexed. * - item_id: The datasource-specific raw item ID. * - *: Any other keys will be treated as property paths, and their values * as a single value for a field with that property path. * * @return \Drupal\search_api\Item\ItemInterface[] * The generated test items. */ public function generateItems(array $items) { /** @var \Drupal\search_api\Item\ItemInterface[] $extracted_items */ $extracted_items = array(); foreach ($items as $item) { $id = Utility::createCombinedId($item['datasource'], $item['item_id']); $extracted_items[$id] = Utility::createItemFromObject($this->index, $item['item'], $id); foreach (array(NULL, $item['datasource']) as $datasource_id) { foreach ($this->index->getFieldsByDatasource($datasource_id) as $key => $field) { /** @var \Drupal\search_api\Item\FieldInterface $field */ $field = clone $field; if (isset($item[$field->getPropertyPath()])) { $field->addValue($item[$field->getPropertyPath()]); } $extracted_items[$id]->setField($key, $field); } } } return $extracted_items; }
/** * {@inheritdoc} */ public function getFieldsByDatasource($datasource_id) { return $this->entity->getFieldsByDatasource($datasource_id); }