diff --git a/composer.lock b/composer.lock index 6676361..5adec27 100644 --- a/composer.lock +++ b/composer.lock @@ -155,12 +155,12 @@ "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "f8a87966f77267f041949ca9785df6992ec4a128" + "reference": "f2424fc778a0d213105a2de3406a476a87b4079b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/f8a87966f77267f041949ca9785df6992ec4a128", - "reference": "f8a87966f77267f041949ca9785df6992ec4a128", + "url": "https://api.github.com/repos/composer/composer/zipball/f2424fc778a0d213105a2de3406a476a87b4079b", + "reference": "f2424fc778a0d213105a2de3406a476a87b4079b", "shasum": "" }, "require": { @@ -214,7 +214,7 @@ ] }, "branch-alias": { - "dev-main": "2.9-dev" + "dev-main": "2.10-dev" } }, "autoload": { @@ -261,7 +261,7 @@ "type": "github" } ], - "time": "2026-03-06T11:33:52+00:00" + "time": "2026-03-17T12:21:51+00:00" }, { "name": "composer/metadata-minifier", @@ -2314,12 +2314,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "7d571c714fc3950ad85685b9a6be6998769206d3" + "reference": "3fd49afe0b7d0faf5ad6cb69c18ff154c15c3222" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/7d571c714fc3950ad85685b9a6be6998769206d3", - "reference": "7d571c714fc3950ad85685b9a6be6998769206d3", + "url": "https://api.github.com/repos/symfony/process/zipball/3fd49afe0b7d0faf5ad6cb69c18ff154c15c3222", + "reference": "3fd49afe0b7d0faf5ad6cb69c18ff154c15c3222", "shasum": "" }, "require": { @@ -2372,7 +2372,7 @@ "type": "tidelift" } ], - "time": "2026-01-29T09:42:44+00:00" + "time": "2026-03-09T18:17:37+00:00" }, { "name": "symfony/service-contracts", @@ -2380,12 +2380,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "639fa48ea277babeb67e1432ce60a029d795bd63" + "reference": "d714f7788dd07a4a93cd0d6cc63fbf487ba67014" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/639fa48ea277babeb67e1432ce60a029d795bd63", - "reference": "639fa48ea277babeb67e1432ce60a029d795bd63", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d714f7788dd07a4a93cd0d6cc63fbf487ba67014", + "reference": "d714f7788dd07a4a93cd0d6cc63fbf487ba67014", "shasum": "" }, "require": { @@ -2460,7 +2460,7 @@ "type": "tidelift" } ], - "time": "2026-02-13T20:42:21+00:00" + "time": "2026-03-15T18:28:19+00:00" }, { "name": "symfony/string", @@ -2559,12 +2559,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "03a60f169c79a28513a78c967316fbc8bf17816f" + "reference": "ba6906696838e50c6dcdb5424ba43f06caeb7745" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/03a60f169c79a28513a78c967316fbc8bf17816f", - "reference": "03a60f169c79a28513a78c967316fbc8bf17816f", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/ba6906696838e50c6dcdb5424ba43f06caeb7745", + "reference": "ba6906696838e50c6dcdb5424ba43f06caeb7745", "shasum": "" }, "require": { @@ -2632,7 +2632,7 @@ "type": "tidelift" } ], - "time": "2025-09-11T10:15:23+00:00" + "time": "2026-03-10T15:16:03+00:00" } ], "packages-dev": [ @@ -4776,10 +4776,10 @@ ], "aliases": [], "minimum-stability": "dev", - "stability-flags": {}, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, - "platform": {}, - "platform-dev": {}, - "plugin-api-version": "2.9.0" + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" } diff --git a/src/ManticoreSearch/Client.php b/src/ManticoreSearch/Client.php index 957e6c2..6bd5ce1 100644 --- a/src/ManticoreSearch/Client.php +++ b/src/ManticoreSearch/Client.php @@ -16,7 +16,9 @@ use Ds\Vector; use Exception; use Generator; +use Manticoresearch\Buddy\Core\Error\GenericError; use Manticoresearch\Buddy\Core\Error\ManticoreSearchClientError; +use Manticoresearch\Buddy\Core\Error\ManticoreSearchResponseError; use Manticoresearch\Buddy\Core\Network\Struct; use Manticoresearch\Buddy\Core\Tool\Arrays; use Manticoresearch\Buddy\Core\Tool\Buddy; @@ -632,7 +634,11 @@ protected function fetchSettings(): Settings { * @param bool $forceBigrams When set to true, passes "1 as force_bigrams" to all CALL SUGGEST requests * @param int $distance Maximum edit distance for suggestions * @param int $limit Maximum number of suggestions per word + * * @return array{0: array, 1: Map} Words and score map + * @throws ManticoreSearchResponseError + * @throws ManticoreSearchClientError + * @throws GenericError */ public function fetchFuzzyVariations( string $query, @@ -645,8 +651,12 @@ public function fetchFuzzyVariations( $query = addcslashes($query, '*%?\''); // 1. Tokenize the query first with the keywords function $q = "CALL KEYWORDS('{$query}', '{$table}')"; + $request = $this->sendRequest($q); + if ($request->hasError()) { + ManticoreSearchResponseError::throw((string)$request->getError()); + } /** @var array}> $keywordsResult */ - $keywordsResult = $this->sendRequest($q)->getResult(); + $keywordsResult = $request->getResult(); $normalized = array_column($keywordsResult[0]['data'] ?? [], 'normalized'); /** @var array $words */ @@ -714,7 +724,10 @@ public function fetchFuzzyVariations( * @param Map $docMap Reference to document map to be populated * @param array $processedTokens Reference to processed tokens tracking * @param bool $forceBigrams When set to true, passes "1 as force_bigrams" to all CALL SUGGEST requests + * * @return int Number of tokens consumed (1 for individual, 2+ for merged) + * @throws ManticoreSearchClientError + * @throws GenericError */ private function processSuggestion( string $word, @@ -739,16 +752,24 @@ private function processSuggestion( {$forceBigramsOption} )"; + + $request = $this->sendRequest($query); + if ($request->hasError()) { + ManticoreSearchResponseError::throw((string)$request->getError()); + } + /** - * @var array - * }> $suggestResult - */ - $suggestResult = $this->sendRequest($query)->getResult(); + * @var array + * }> $suggestResult + */ + + $suggestResult = $request->getResult(); + /** @var array $suggestions */ $suggestions = $suggestResult[0]['data'] ?? []; @@ -859,7 +880,10 @@ private function shouldAttemptMerge(string $word, string $nextWord): bool { * @param int $distance * @param array $choices * @param Map $distanceMap + * * @return array{original:string,choices:array,distanceMap:Map,docMap:array}|null + * @throws ManticoreSearchClientError + * @throws GenericError */ private function tryMergeWithNext( string $word, @@ -890,8 +914,13 @@ private function tryMergeWithNext( {$forceBigramsOption} )"; + $request = $this->sendRequest($query); + if ($request->hasError()) { + ManticoreSearchResponseError::throw((string)$request->getError()); + } + /** @var array}> $combinedSuggestResult */ - $combinedSuggestResult = $this->sendRequest($query)->getResult(); + $combinedSuggestResult = $request->getResult(); $combinedSuggestions = $combinedSuggestResult[0]['data'] ?? []; @@ -923,8 +952,13 @@ private function tryMergeWithNext( {$forceBigramsOption} )"; + $request = $this->sendRequest($nextWordQuery); + if ($request->hasError()) { + ManticoreSearchResponseError::throw((string)$request->getError()); + } + /** @var array}> $nextWordResult */ - $nextWordResult = $this->sendRequest($nextWordQuery)->getResult(); + $nextWordResult = $request->getResult(); $nextWordSuggestions = $nextWordResult[0]['data'] ?? []; $nextWordChoices = array_column($nextWordSuggestions, 'suggest');