1
|
|
|
<?php declare(strict_types = 1); |
2
|
|
|
|
3
|
|
|
/** |
4
|
|
|
* Created by PhpStorm. |
5
|
|
|
* User: gordon |
6
|
|
|
* Date: 24/3/2561 |
7
|
|
|
* Time: 20:36 น. |
8
|
|
|
*/ |
9
|
|
|
|
10
|
|
|
namespace Suilven\FreeTextSearch\Base; |
11
|
|
|
|
12
|
|
|
use SilverStripe\ORM\DataObject; |
13
|
|
|
use Suilven\FreeTextSearch\Helper\IndexingHelper; |
14
|
|
|
use Suilven\FreeTextSearch\Indexes; |
15
|
|
|
|
16
|
|
|
abstract class Indexer implements \Suilven\FreeTextSearch\Interfaces\Indexer |
17
|
|
|
{ |
18
|
|
|
/** @var string */ |
19
|
|
|
protected $indexName; |
20
|
|
|
|
21
|
|
|
/** |
22
|
|
|
* Index a single data object |
23
|
|
|
*/ |
24
|
|
|
abstract public function index(DataObject $dataObject): void; |
25
|
|
|
|
26
|
|
|
|
27
|
|
|
/** @param string $newIndexName the new index name */ |
28
|
|
|
public function setIndexName(string $newIndexName): void |
29
|
|
|
{ |
30
|
|
|
$this->indexName = $newIndexName; |
31
|
|
|
} |
32
|
|
|
|
33
|
|
|
|
34
|
|
|
/** |
35
|
|
|
* index name -> field name -> list of values |
36
|
|
|
* |
37
|
|
|
* @return array<string, array<string, array|bool|float|int|string>> |
38
|
|
|
*/ |
39
|
|
|
public function getIndexablePayload(\SilverStripe\ORM\DataObject $dataObject): array |
40
|
|
|
{ |
41
|
|
|
$helper = new IndexingHelper(); |
42
|
|
|
|
43
|
|
|
$payload = $helper->getFieldsToIndex($dataObject); |
44
|
|
|
|
45
|
|
|
$indexes = new Indexes(); |
46
|
|
|
$index = $indexes->getIndex($this->indexName); |
47
|
|
|
|
48
|
|
|
// populate MVA columns |
49
|
|
|
$mvaColumns = $index->getHasManyFields(); |
50
|
|
|
|
51
|
|
|
/** @var string $mvaColumnName */ |
52
|
|
|
foreach (\array_keys($mvaColumns) as $mvaColumnName) { |
53
|
|
|
$relationship = $mvaColumns[$mvaColumnName]['relationship']; |
54
|
|
|
|
55
|
|
|
// @phpstan-ignore-next-line |
56
|
|
|
$relationshipDOs = $dataObject->$relationship(); |
57
|
|
|
|
58
|
|
|
/** @var array $values */ |
59
|
|
|
$values = []; |
60
|
|
|
foreach ($relationshipDOs as $mvaDO) { |
61
|
|
|
$values[] = $mvaDO->ID; |
62
|
|
|
} |
63
|
|
|
|
64
|
|
|
$payload[$this->indexName][$mvaColumnName] = $values; |
65
|
|
|
} |
66
|
|
|
|
67
|
|
|
// populate has one columns |
68
|
|
|
$hasOneColumns = $index->getHasOneFields(); |
69
|
|
|
|
70
|
|
|
/** @var string $hasOneColumn */ |
71
|
|
|
foreach (\array_keys($hasOneColumns) as $hasOneColumn) { |
72
|
|
|
$relationship = $hasOneColumns[$hasOneColumn]['relationship']; |
73
|
|
|
|
74
|
|
|
// @phpstan-ignore-next-line |
75
|
|
|
$hasOneObj = $dataObject->$relationship(); |
76
|
|
|
$payload[$this->indexName][$hasOneColumn] = $hasOneObj->ID; |
77
|
|
|
} |
78
|
|
|
|
79
|
|
|
return $payload; |
80
|
|
|
} |
81
|
|
|
} |
82
|
|
|
|