From ec74c652180dabe6c2fc952e0009e3ef3a474469 Mon Sep 17 00:00:00 2001 From: Spamer Date: Fri, 31 Mar 2023 15:08:06 +0200 Subject: [PATCH 1/5] Settings can change index --- src/Mapping/Settings.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Mapping/Settings.php b/src/Mapping/Settings.php index 3666c80..a161903 100644 --- a/src/Mapping/Settings.php +++ b/src/Mapping/Settings.php @@ -56,16 +56,24 @@ public function indexName(): string } + public function changeIndexName(string $index): void + { + $this->indexName = $index; + } + + public function analysis(): \Spameri\ElasticQuery\Mapping\Settings\Analysis { return $this->analysis; } + public function mapping(): \Spameri\ElasticQuery\Mapping\Settings\Mapping { return $this->mapping; } + public function addMappingField(\Spameri\ElasticQuery\Mapping\Settings\Mapping\Field $field): void { $this->mapping->addField($field); @@ -185,7 +193,6 @@ public function removeFilter(\Spameri\ElasticQuery\Mapping\FilterInterface $filt $this->analysis->filter()->remove($filter->key()); } - public function toArray(): array { $array = [ From 7c72d1b7594563383dc19ed23d654213abc2508a Mon Sep 17 00:00:00 2001 From: Spamer Date: Tue, 22 Aug 2023 23:33:45 +0200 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=A7=99=E2=80=8D=E2=99=82=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Mapping/Analyzer/Custom/CommonGrams.php | 4 ++- src/Mapping/Analyzer/Custom/EdgeNgram.php | 4 ++- src/Mapping/Analyzer/Custom/WordDelimiter.php | 4 ++- src/Mapping/Settings/Mapping.php | 11 ++++++- .../Settings/Mapping/FieldSeparator.php | 10 ++++++ src/Response/Result/Hit.php | 32 ++++++++++++------- 6 files changed, 50 insertions(+), 15 deletions(-) create mode 100644 src/Mapping/Settings/Mapping/FieldSeparator.php diff --git a/src/Mapping/Analyzer/Custom/CommonGrams.php b/src/Mapping/Analyzer/Custom/CommonGrams.php index 29a256b..9350674 100644 --- a/src/Mapping/Analyzer/Custom/CommonGrams.php +++ b/src/Mapping/Analyzer/Custom/CommonGrams.php @@ -5,6 +5,8 @@ class CommonGrams implements \Spameri\ElasticQuery\Mapping\CustomAnalyzerInterface, \Spameri\ElasticQuery\Collection\Item { + public const NAME = 'customCommonGrams'; + /** * @var \Spameri\ElasticQuery\Mapping\Settings\Analysis\FilterCollection */ @@ -42,7 +44,7 @@ public function key(): string public function name(): string { - return 'customCommonGrams'; + return self::NAME; } diff --git a/src/Mapping/Analyzer/Custom/EdgeNgram.php b/src/Mapping/Analyzer/Custom/EdgeNgram.php index 1df2b84..0053c60 100644 --- a/src/Mapping/Analyzer/Custom/EdgeNgram.php +++ b/src/Mapping/Analyzer/Custom/EdgeNgram.php @@ -5,6 +5,8 @@ class EdgeNgram implements \Spameri\ElasticQuery\Mapping\CustomAnalyzerInterface, \Spameri\ElasticQuery\Collection\Item { + public const NAME = 'customEdgeNgram'; + /** * @var \Spameri\ElasticQuery\Mapping\Settings\Analysis\FilterCollection */ @@ -49,7 +51,7 @@ public function key(): string public function name(): string { - return 'customEdgeNgram'; + return self::NAME; } diff --git a/src/Mapping/Analyzer/Custom/WordDelimiter.php b/src/Mapping/Analyzer/Custom/WordDelimiter.php index fd54e6a..127a01c 100644 --- a/src/Mapping/Analyzer/Custom/WordDelimiter.php +++ b/src/Mapping/Analyzer/Custom/WordDelimiter.php @@ -5,6 +5,8 @@ class WordDelimiter implements \Spameri\ElasticQuery\Mapping\CustomAnalyzerInterface, \Spameri\ElasticQuery\Collection\Item { + public const NAME = 'customWordDelimiter'; + /** * @var \Spameri\ElasticQuery\Mapping\Settings\Analysis\FilterCollection */ @@ -35,7 +37,7 @@ public function key(): string public function name(): string { - return 'customWordDelimiter'; + return self::NAME; } diff --git a/src/Mapping/Settings/Mapping.php b/src/Mapping/Settings/Mapping.php index d91fece..4df04ca 100644 --- a/src/Mapping/Settings/Mapping.php +++ b/src/Mapping/Settings/Mapping.php @@ -15,10 +15,13 @@ class Mapping implements \Spameri\ElasticQuery\Entity\ArrayInterface */ private $fields; + private bool $dynamic; + public function __construct( string $indexName, - ?\Spameri\ElasticQuery\Mapping\Settings\Mapping\FieldCollection $fields = NULL + ?\Spameri\ElasticQuery\Mapping\Settings\Mapping\FieldCollection $fields = NULL, + bool $dynamic = true ) { $this->indexName = $indexName; @@ -28,8 +31,13 @@ public function __construct( } $this->fields = $fields; + $this->dynamic = $dynamic; } + public function enableStrictMapping(): void + { + $this->dynamic = false; + } public function getIndexName(): string { @@ -103,6 +111,7 @@ public function toArray(): array return [ 'mappings' => [ 'properties' => $fields, + 'dynamic' => $this->dynamic, ], ]; } diff --git a/src/Mapping/Settings/Mapping/FieldSeparator.php b/src/Mapping/Settings/Mapping/FieldSeparator.php new file mode 100644 index 0000000..d2ad9b2 --- /dev/null +++ b/src/Mapping/Settings/Mapping/FieldSeparator.php @@ -0,0 +1,10 @@ +source[$key] ?? NULL; - if ($value === NULL) { - return NULL; - } + $value = $this->getSubValue($key); - if (\strpos($key, '.') === FALSE) { + if ($value !== NULL) { return $value; } - $levels = \explode('.', $key); + return $this->source[$key] ?? NULL; + } + + /** + * @phpstan-return mixed + */ + public function getSubValue($key) + { + if (\str_contains($key, \Spameri\ElasticQuery\Mapping\Settings\Mapping\FieldSeparator::FIELD_SEPARATOR) === TRUE) { + $levels = \explode(\Spameri\ElasticQuery\Mapping\Settings\Mapping\FieldSeparator::FIELD_SEPARATOR, $key); + + $value = $this->source[$levels[0]]; + unset($levels[0]); - foreach ($levels as $subKey) { - $value = $value[$subKey] ?? NULL; + foreach ($levels as $subKey) { + $value = $value[$subKey] ?? NULL; - if ($value === NULL) { - return NULL; + if ($value !== NULL) { + return $value; + } } } - return $value; + return NULL; } From 698d1e7c45cdaad695cadd4773e47b90048ac0aa Mon Sep 17 00:00:00 2001 From: Spamer Date: Tue, 29 Aug 2023 22:17:31 +0200 Subject: [PATCH 3/5] fixed sublevel objects data initialization --- src/Mapping/Settings/Mapping/FieldObject.php | 4 ++++ src/Response/Result/Hit.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Mapping/Settings/Mapping/FieldObject.php b/src/Mapping/Settings/Mapping/FieldObject.php index e40a8b6..721311c 100644 --- a/src/Mapping/Settings/Mapping/FieldObject.php +++ b/src/Mapping/Settings/Mapping/FieldObject.php @@ -46,6 +46,10 @@ public function toArray(): array $fields[$field->key()] = $field->toArray(); continue; } + if ($field instanceof \Spameri\ElasticQuery\Mapping\Settings\Mapping\SubFields) { + $fields[$field->key()] = $field->toArray(); + continue; + } if ($field instanceof \Spameri\ElasticQuery\Mapping\Settings\Mapping\NestedObject) { $fields[$field->key()] = $field->toArray(); continue; diff --git a/src/Response/Result/Hit.php b/src/Response/Result/Hit.php index 532db25..2dde481 100644 --- a/src/Response/Result/Hit.php +++ b/src/Response/Result/Hit.php @@ -86,7 +86,7 @@ public function getSubValue($key) if (\str_contains($key, \Spameri\ElasticQuery\Mapping\Settings\Mapping\FieldSeparator::FIELD_SEPARATOR) === TRUE) { $levels = \explode(\Spameri\ElasticQuery\Mapping\Settings\Mapping\FieldSeparator::FIELD_SEPARATOR, $key); - $value = $this->source[$levels[0]]; + $value = $this->source[$levels[0]] ?? NULL; unset($levels[0]); foreach ($levels as $subKey) { From 034c32f7880719c563c42fcde923716e5dc793cc Mon Sep 17 00:00:00 2001 From: Spamer Date: Wed, 30 Aug 2023 17:26:41 +0200 Subject: [PATCH 4/5] Added strictly typed getvalue methods --- src/Response/Result/Hit.php | 97 +++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/src/Response/Result/Hit.php b/src/Response/Result/Hit.php index 2dde481..2220186 100644 --- a/src/Response/Result/Hit.php +++ b/src/Response/Result/Hit.php @@ -78,6 +78,103 @@ public function getValue( return $this->source[$key] ?? NULL; } + + public function getStringValue(string $key): string + { + if ( + isset($this->source[$key]) + && \is_string($this->source[$key]) === TRUE + ) { + return $this->source[$key]; + } + + throw new \Spameri\ElasticQuery\Exception\InvalidArgumentException('Value is not string.'); + } + + + public function getStringOrNullValue(string $key): string|null + { + try { + return $this->getStringValue($key); + + } catch (\Spameri\ElasticQuery\Exception\InvalidArgumentException $exception) { + return NULL; + } + } + + + public function getArrayValue(string $key): array + { + if ( + isset($this->source[$key]) + && \is_array($this->source[$key]) === TRUE + ) { + return $this->source[$key]; + } + + throw new \Spameri\ElasticQuery\Exception\InvalidArgumentException('Value is not array.'); + } + + + public function getArrayOrNullValue(string $key): array|null + { + try { + return $this->getArrayValue($key); + + } catch (\Spameri\ElasticQuery\Exception\InvalidArgumentException $exception) { + return NULL; + } + } + + + public function getBoolValue(string $key): bool + { + if ( + isset($this->source[$key]) + && \is_bool($this->source[$key]) === TRUE + ) { + return $this->source[$key]; + } + + throw new \Spameri\ElasticQuery\Exception\InvalidArgumentException('Value is not bool.'); + } + + + public function getBoolOrNullValue(string $key): bool|null + { + try { + return $this->getBoolValue($key); + + } catch (\Spameri\ElasticQuery\Exception\InvalidArgumentException $exception) { + return NULL; + } + } + + + public function getIntegerValue(string $key): int + { + if ( + isset($this->source[$key]) + && \is_int($this->source[$key]) === TRUE + ) { + return $this->source[$key]; + } + + throw new \Spameri\ElasticQuery\Exception\InvalidArgumentException('Value is not integer.'); + } + + + public function getIntegerOrNullValue(string $key): int|null + { + try { + return $this->getIntegerValue($key); + + } catch (\Spameri\ElasticQuery\Exception\InvalidArgumentException $exception) { + return NULL; + } + } + + /** * @phpstan-return mixed */ From e03dbaaabbb4d6cdf14600e4d98c665a288f83f8 Mon Sep 17 00:00:00 2001 From: Spamer Date: Wed, 20 Sep 2023 16:56:04 +0200 Subject: [PATCH 5/5] Stats returns number without from and size parameters, so we must count hits that really exits in collection --- src/Response/Result/HitCollection.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Response/Result/HitCollection.php b/src/Response/Result/HitCollection.php index 917d304..374f1fa 100644 --- a/src/Response/Result/HitCollection.php +++ b/src/Response/Result/HitCollection.php @@ -3,7 +3,7 @@ namespace Spameri\ElasticQuery\Response\Result; -class HitCollection implements \IteratorAggregate +class HitCollection implements \IteratorAggregate, \Countable { /** @@ -25,4 +25,10 @@ public function getIterator(): \ArrayIterator return new \ArrayIterator($this->hits); } + + public function count(): int + { + return \count($this->hits); + } + }