Indexer   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 64
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 5
eloc 21
c 2
b 0
f 0
dl 0
loc 64
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A setIndexName() 0 3 1
A getIndexablePayload() 0 41 4
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