View source
<?php
namespace Drupal\search_api_solr\Entity;
use Drupal\Component\Serialization\Json;
use Drupal\Core\Config\Entity\ConfigEntityBase;
use Drupal\search_api_solr\Utility\Utility as SearchApiSolrUtility;
use Drupal\search_api_solr\SolrFieldTypeInterface;
use Drupal\search_api_solr\Utility\Utility;
class SolrFieldType extends ConfigEntityBase implements SolrFieldTypeInterface {
protected $id;
protected $label;
protected $managed_schema;
protected $minimum_solr_version;
protected $field_type;
protected $custom_code;
protected $field_type_language_code;
protected $domains;
protected $solr_configs;
protected $text_files;
public function getFieldType() {
return $this->field_type;
}
public function getCustomCode() {
return $this->custom_code;
}
public function getFieldTypeLanguageCode() {
return $this->field_type_language_code;
}
public function getDomains() {
return empty($this->domains) ? [
'generic',
] : $this->domains;
}
public static function getAvailableDomains() {
$domains = [
'generic',
];
$config_factory = \Drupal::configFactory();
foreach ($config_factory
->listAll('search_api_solr.solr_field_type.') as $field_type_name) {
$config = $config_factory
->get($field_type_name);
$domains = array_merge($domains, $config
->get('domains'));
}
sort($domains);
return array_unique($domains);
}
public static function getAvailableCustomCodes() {
$custom_codes = [];
$config_factory = \Drupal::configFactory();
foreach ($config_factory
->listAll('search_api_solr.solr_field_type.') as $field_type_name) {
$config = $config_factory
->get($field_type_name);
if ($custom_code = $config
->get('custom_code')) {
$custom_codes[] = $custom_code;
}
}
return array_unique($custom_codes);
}
public function getFieldTypeAsJson(bool $pretty = FALSE) {
$field_type = $this->field_type;
unset($field_type['analyzers']);
foreach ($this->field_type['analyzers'] as $analyzer) {
$type = 'analyzer';
if (!empty($analyzer['type'])) {
if ('multiterm' == $analyzer['type']) {
$type = 'multiTermAnalyzer';
}
else {
$type = $analyzer['type'] . 'Analyzer';
}
unset($analyzer['type']);
}
$field_type[$type] = $analyzer;
}
return $pretty ? json_encode($field_type, JSON_PRETTY_PRINT | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT) : Json::encode($field_type);
}
public function setFieldTypeAsJson($field_type) {
$field_type = $this->field_type = Json::decode($field_type);
foreach ([
'index' => 'indexAnalyzer',
'query' => 'queryAnalyzer',
'multiterm' => 'multiTermAnalyzer',
'analyzer' => 'analyzer',
] as $type => $analyzer) {
if (!empty($field_type[$analyzer])) {
unset($this->field_type[$analyzer]);
if ($type != $analyzer) {
$field_type[$analyzer]['type'] = $type;
}
$this->field_type['analyzers'][] = $field_type[$analyzer];
}
}
return $this;
}
public function getFieldTypeAsXml($add_commment = TRUE) {
$formatted_xml_string = $this
->buildXmlFromArray('fieldType', $this->field_type);
$comment = '';
if ($add_commment) {
$comment = "<!--\n " . $this
->label() . "\n " . ($this
->isManagedSchema() ? " for managed schema\n " : '') . $this
->getMinimumSolrVersion() . "\n-->\n";
}
return $comment . $formatted_xml_string;
}
protected function buildXmlFromArray($root_element_name, array $attributes) {
$root = new \SimpleXMLElement('<' . $root_element_name . '/>');
$f = function (\SimpleXMLElement $element, array $attributes) use (&$f) {
foreach ($attributes as $key => $value) {
if (is_scalar($value)) {
if (is_bool($value) === TRUE) {
$value = $value ? 'true' : 'false';
}
switch ($key) {
case 'VALUE':
$element[0] = $value;
break;
case 'CDATA':
$element[0] = '<![CDATA[' . $value . ']]>';
break;
default:
$element
->addAttribute($key, $value);
}
}
elseif (is_array($value)) {
if (array_key_exists(0, $value)) {
$key = rtrim($key, 's');
foreach ($value as $inner_attributes) {
$child = $element
->addChild($key);
$f($child, $inner_attributes);
}
}
else {
$child = $element
->addChild($key);
$f($child, $value);
}
}
}
};
$f($root, $attributes);
$dom = dom_import_simplexml($root)->ownerDocument;
$dom->formatOutput = TRUE;
$formatted_xml_string = $dom
->saveXML();
return preg_replace('/<\\?.*?\\?>\\s*\\n?/', '', $formatted_xml_string);
}
public function getSolrConfigs() {
return $this->solr_configs;
}
public function getSolrConfigsAsXml($add_commment = TRUE) {
$formatted_xml_string = $this
->buildXmlFromArray('solrconfigs', $this->solr_configs);
$comment = '';
if ($add_commment) {
$comment = "<!--\n Special configs for " . $this
->label() . "\n " . ($this
->isManagedSchema() ? " for managed schema\n " : '') . $this
->getMinimumSolrVersion() . "\n-->\n";
}
return $comment . preg_replace('@</?solrconfigs/?>@', '', $formatted_xml_string);
}
public function getDynamicFields($multilingual = FALSE) {
$dynamic_fields = [];
$prefixes = $this->custom_code ? [
'tc' . $this->custom_code,
'toc' . $this->custom_code,
] : [
't',
'to',
];
foreach ($prefixes as $prefix_without_cardinality) {
foreach ([
's',
'm',
] as $cardinality) {
if ($multilingual || $this->custom_code) {
$prefix = $prefix_without_cardinality . $cardinality;
$name = $multilingual ? Utility::getLanguageSpecificSolrDynamicFieldPrefix($prefix, $this->field_type_language_code) : $prefix . '_';
$dynamic_fields[] = $dynamic_field = [
'name' => SearchApiSolrUtility::encodeSolrName($name) . '*',
'type' => $this->field_type['name'],
'stored' => TRUE,
'indexed' => TRUE,
'multiValued' => 'm' === $cardinality,
'termVectors' => TRUE,
'omitNorms' => strpos($prefix, 'to') === 0,
];
if ($multilingual && $this->custom_code && 'und' == $this->field_type_language_code) {
$dynamic_field['name'] = SearchApiSolrUtility::encodeSolrName($prefix) . '_*';
$dynamic_fields[] = $dynamic_field;
}
}
}
}
return $dynamic_fields;
}
public function getCopyFields() {
$copy_fields = [];
return $copy_fields;
}
public function getFieldTypeName() {
return isset($this->field_type['name']) ? $this->field_type['name'] : '';
}
public function getTextFiles() {
return $this->text_files;
}
public function addTextFile($name, $content) {
$this->text_files[$name] = preg_replace('/\\R/u', "\n", $content);
}
public function setTextFiles($text_files) {
$this->text_files = [];
foreach ($text_files as $name => $content) {
$this
->addTextFile($name, $content);
}
}
public function isManagedSchema() {
return $this->managed_schema;
}
public function setManagedSchema($managed_schema) {
$this->managed_schema = $managed_schema;
}
public function getMinimumSolrVersion() {
return $this->minimum_solr_version;
}
public function setMinimumSolrVersion($minimum_solr_version) {
$this->minimum_solr_version = $minimum_solr_version;
}
protected function urlRouteParameters($rel) {
$uri_route_parameters = parent::urlRouteParameters($rel);
if ('collection' == $rel) {
$uri_route_parameters['search_api_server'] = \Drupal::routeMatch()
->getRawParameter('search_api_server') ?: 'core_issue_2919648_workaround';
}
return $uri_route_parameters;
}
}