* @since 1.28
*/
abstract class SearchIndexFieldDefinition implements SearchIndexField {
+
/**
* Name of the field
*
* @var string
*/
protected $name;
+
/**
* Type of the field, one of the constants above
*
- * @var int
+ * @var string
*/
protected $type;
+
/**
* Bit flags for the field.
*
* @var int
*/
protected $flags = 0;
+
/**
* Subfields
* @var SearchIndexFieldDefinition[]
protected $subfields = [];
/**
- * SearchIndexFieldDefinition constructor.
+ * @var callable
+ */
+ private $mergeCallback;
+
+ /**
* @param string $name Field name
- * @param int $type Index type
+ * @param string $type Index type
*/
public function __construct( $name, $type ) {
$this->name = $name;
/**
* Set global flag for this field.
*
- * @param int $flag Bit flag to set/unset
+ * @param int $flag Bit flag to set/unset
* @param bool $unset True if flag should be unset, false by default
* @return $this
*/
/**
* Check if flag is set.
- * @param $flag
+ * @param int $flag
* @return int 0 if unset, !=0 if set
*/
public function checkFlag( $flag ) {
* @return SearchIndexField|false New definition or false if not mergeable.
*/
public function merge( SearchIndexField $that ) {
+ if ( !empty( $this->mergeCallback ) ) {
+ return call_user_func( $this->mergeCallback, $this, $that );
+ }
// TODO: which definitions may be compatible?
if ( ( $that instanceof self ) && $this->type === $that->type &&
$this->flags === $that->flags && $this->type !== self::INDEX_TYPE_NESTED
*/
abstract public function getMapping( SearchEngine $engine );
+ /**
+ * Set field-specific merge strategy.
+ * @param callable $callback
+ */
+ public function setMergeCallback( $callback ) {
+ $this->mergeCallback = $callback;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getEngineHints( SearchEngine $engine ) {
+ return [];
+ }
}