-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSearchFactoryBuilder.php
More file actions
160 lines (131 loc) · 4.05 KB
/
SearchFactoryBuilder.php
File metadata and controls
160 lines (131 loc) · 4.05 KB
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
<?php
declare(strict_types=1);
/*
* This file is part of the RollerworksSearch package.
*
* (c) Sebastiaan Stok <s.stok@rollerscapes.net>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Rollerworks\Component\Search;
use Rollerworks\Component\Search\Field\FieldType;
use Rollerworks\Component\Search\Field\FieldTypeExtension;
use Rollerworks\Component\Search\Field\GenericResolvedFieldTypeFactory;
use Rollerworks\Component\Search\Field\GenericTypeRegistry;
use Rollerworks\Component\Search\Field\ResolvedFieldTypeFactory;
/**
* @author Sebastiaan Stok <s.stok@rollerscapes.net>
*/
final class SearchFactoryBuilder
{
private ?ResolvedFieldTypeFactory $resolvedTypeFactory = null;
/** @var SearchExtension[] */
private array $extensions = [];
/** @var FieldType[] */
private array $types = [];
/** @var array<string, FieldTypeExtension[]> */
private array $typeExtensions = [];
private ?FieldSetRegistry $fieldSetRegistry = null;
/**
* Sets the factory for creating {@see ResolvedFieldType} instances.
*
* @return $this The builder
*/
public function setResolvedTypeFactory(ResolvedFieldTypeFactory $resolvedTypeFactory)
{
$this->resolvedTypeFactory = $resolvedTypeFactory;
return $this;
}
/**
* Set the FieldSetRegistry to use for loading FieldSetConfigurators.
*/
public function setFieldSetRegistry(FieldSetRegistry $fieldSetRegistry): self
{
$this->fieldSetRegistry = $fieldSetRegistry;
return $this;
}
/**
* Adds an extension to be loaded by the factory.
*
* @return $this The builder
*/
public function addExtension(SearchExtension $extension): self
{
$this->extensions[] = $extension;
return $this;
}
/**
* Adds a list of extensions to be loaded by the factory.
*
* @param SearchExtension[] $extensions
*
* @return $this The builder
*/
public function addExtensions(array $extensions): self
{
$this->extensions = array_merge($this->extensions, $extensions);
return $this;
}
/**
* Adds a field type to the factory.
*
* @return $this The builder
*/
public function addType(FieldType $type): self
{
$this->types[$type::class] = $type;
return $this;
}
/**
* Adds a list of field types to the factory.
*
* @param FieldType[] $types
*
* @return $this The builder
*/
public function addTypes(array $types): self
{
foreach ($types as $type) {
$this->types[$type::class] = $type;
}
return $this;
}
/**
* Adds a field type extension to the factory.
*
* @return $this The builder
*/
public function addTypeExtension(FieldTypeExtension $typeExtension): self
{
$this->typeExtensions[$typeExtension->getExtendedType()][] = $typeExtension;
return $this;
}
/**
* Adds a list of field type extension to the factory.
*
* @param FieldTypeExtension[] $typeExtensions
*
* @return $this The builder
*/
public function addTypeExtensions(array $typeExtensions): self
{
foreach ($typeExtensions as $typeExtension) {
$this->typeExtensions[$typeExtension->getExtendedType()][] = $typeExtension;
}
return $this;
}
/**
* Builds and returns the factory.
*/
public function getSearchFactory(): SearchFactory
{
$extensions = $this->extensions;
if (\count($this->types) > 0 || \count($this->typeExtensions) > 0) {
$extensions[] = new PreloadedExtension($this->types, $this->typeExtensions);
}
$resolvedTypeFactory = $this->resolvedTypeFactory ?? new GenericResolvedFieldTypeFactory();
$registry = new GenericTypeRegistry($extensions, $resolvedTypeFactory);
return new GenericSearchFactory($registry, $this->fieldSetRegistry ?? LazyFieldSetRegistry::create());
}
}