Skip to content

Commit 15ed357

Browse files
authored
Fix/multi query show meta (#539)
* Fix * Use buddy-core from the branch * Update composer locks * fix(fuzzy): extract additional SQL queries into method - Move parsing of additional queries from fromSqlRequest() to extractAdditionalQueries() - Improve query splitting logic for better clarity and reuse * reduce cognitive complexity * Fix phpstan issues * Update buddy-core version * composer .lock
1 parent 5553aa9 commit 15ed357

File tree

1 file changed

+38
-1
lines changed

1 file changed

+38
-1
lines changed

src/Plugin/Fuzzy/Payload.php

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ final class Payload extends BasePayload {
4949
/** @var string|array{index:string,query:array{match:array{'*'?:string}},options?:array<string,mixed>} */
5050
public array|string $payload;
5151

52+
/** @var array<string> */
53+
public array $queries = [];
54+
5255
public function __construct() {
5356
}
5457

@@ -99,6 +102,8 @@ protected static function fromJsonRequest(Request $request): static {
99102
*/
100103
protected static function fromSqlRequest(Request $request): static {
101104
$query = $request->payload;
105+
$additionalQueries = static::extractAdditionalQueries($query);
106+
102107
preg_match('/FROM\s+`?(\w+)`?\s+WHERE/ius', $query, $matches);
103108
$tableName = $matches[1] ?? '';
104109

@@ -145,9 +150,40 @@ protected static function fromSqlRequest(Request $request): static {
145150
$self->layouts = $layouts;
146151
$self->preserve = $preserve;
147152
$self->payload = $query;
153+
$self->queries = $additionalQueries;
148154
return $self;
149155
}
150156

157+
/**
158+
* @param string $query
159+
* @return array<string>
160+
*/
161+
protected static function extractAdditionalQueries(string $query): array {
162+
$additionalQueries = [];
163+
164+
// Find the position of the first semicolon
165+
$firstSemicolonPos = strpos($query, ';', stripos($query, ' option ') ?: 0) ?: 0;
166+
167+
// If a semicolon exists
168+
if ($firstSemicolonPos > 0) {
169+
// Get the text after the first semicolon
170+
$remainingText = trim(substr($query, $firstSemicolonPos + 1));
171+
172+
// Split remaining text into additional queries
173+
if (!empty($remainingText)) {
174+
$extraQueries = preg_split('/;/', $remainingText, -1, PREG_SPLIT_NO_EMPTY) ?: [];
175+
176+
// Add non-empty queries to the result
177+
$additionalQueries = array_merge(
178+
$additionalQueries,
179+
array_filter(array_map('trim', $extraQueries))
180+
);
181+
}
182+
}
183+
184+
return $additionalQueries;
185+
}
186+
151187
/**
152188
* @param callable $fn A callable function that returns an array of options to be used in the query
153189
* @return string returns payload to use in the query send to Manticore
@@ -207,7 +243,8 @@ public function getQueriesSQLRequest(callable $fn): string {
207243
$match = $searchValue;
208244
}
209245
Buddy::debug("Fuzzy: match: $match");
210-
return sprintf($template, $match);
246+
$queries = [sprintf($template, $match), ...$this->queries];
247+
return implode(';', $queries);
211248
}
212249

213250
/**

0 commit comments

Comments
 (0)