-
Notifications
You must be signed in to change notification settings - Fork 0
/
PuceneIndex.php
83 lines (69 loc) · 2.14 KB
/
PuceneIndex.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php
/*
* This file is part of Pucene.
*
* (c) asapo.at
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Pucene\Index;
use Pucene\Analysis\AnalyzerInterface;
use Pucene\Index\Driver\DriverInterface;
use Pucene\Index\Model\Document;
use Pucene\Index\Model\Field;
use Schranz\Search\SEAL\Schema\Field\AbstractField;
use Schranz\Search\SEAL\Schema\FieldType;
use Schranz\Search\SEAL\Schema\Index;
class PuceneIndex
{
public function __construct(
private AnalyzerInterface $analyzer,
private Index $index,
private DriverInterface $driver,
) {
}
/**
* @param mixed[] $documentData
*
* @return mixed[]
*/
public function save(array $documentData): array
{
$fields = [];
foreach ($documentData as $fieldName => $fieldContent) {
/** @var AbstractField|null $indexField */
$indexField = $this->index->fields[$fieldName] ?? null;
if (null === $indexField) {
continue;
}
if (!is_array($fieldContent)) {
$fieldContent = [$fieldContent];
}
$terms = [];
if ($indexField->type === FieldType::TEXT) {
foreach ($fieldContent as $content) {
if (is_string($content)) {
$terms[] = $this->analyzer->analyze($content);
}
}
}
$fields[] = new Field(
$fieldName,
array_merge(...$terms),
$fieldContent,
$indexField->type,
);
}
$identifierField = $this->index->getIdentifierField();
/** @var string $identifier */
$identifier = $documentData[$identifierField->name];
$document = new Document($this->index, $identifier, $documentData, $fields);
$this->driver->createRepository()->persist($document);
return $documentData;
}
public function delete(string $identifier): void
{
$this->driver->createRepository()->remove($identifier);
}
}