convertSelectQueries

This commit is contained in:
fogelito
2026-01-21 12:37:44 +02:00
parent db068f31ba
commit a3c6e45e92
7 changed files with 110 additions and 67 deletions
+4
View File
@@ -25,6 +25,7 @@ use Appwrite\Utopia\Request\Filters\V18 as RequestV18;
use Appwrite\Utopia\Request\Filters\V19 as RequestV19;
use Appwrite\Utopia\Request\Filters\V20 as RequestV20;
use Appwrite\Utopia\Request\Filters\V21 as RequestV21;
use Appwrite\Utopia\Request\Filters\V22 as RequestV22;
use Appwrite\Utopia\Response;
use Appwrite\Utopia\Response\Filters\V16 as ResponseV16;
use Appwrite\Utopia\Response\Filters\V17 as ResponseV17;
@@ -924,6 +925,9 @@ App::init()
if (version_compare($requestFormat, '1.9.0', '<')) {
$request->addFilter(new RequestV21());
}
if (version_compare($requestFormat, '1.10.0', '<')) {
$request->addFilter(new RequestV22());
}
}
$localeParam = (string) $request->getParam('locale', $request->getHeader('x-appwrite-locale', ''));
Generated
+16 -16
View File
@@ -1589,16 +1589,16 @@
},
{
"name": "open-telemetry/sem-conv",
"version": "1.37.0",
"version": "1.38.0",
"source": {
"type": "git",
"url": "https://github.com/opentelemetry-php/sem-conv.git",
"reference": "8da7ec497c881e39afa6657d72586e27efbd29a1"
"reference": "e613bc640a407def4991b8a936a9b27edd9a3240"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/opentelemetry-php/sem-conv/zipball/8da7ec497c881e39afa6657d72586e27efbd29a1",
"reference": "8da7ec497c881e39afa6657d72586e27efbd29a1",
"url": "https://api.github.com/repos/opentelemetry-php/sem-conv/zipball/e613bc640a407def4991b8a936a9b27edd9a3240",
"reference": "e613bc640a407def4991b8a936a9b27edd9a3240",
"shasum": ""
},
"require": {
@@ -1638,11 +1638,11 @@
],
"support": {
"chat": "https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V",
"docs": "https://opentelemetry.io/docs/php",
"docs": "https://opentelemetry.io/docs/languages/php",
"issues": "https://github.com/open-telemetry/opentelemetry-php/issues",
"source": "https://github.com/open-telemetry/opentelemetry-php"
},
"time": "2025-09-03T12:08:10+00:00"
"time": "2026-01-21T04:14:03+00:00"
},
{
"name": "paragonie/constant_time_encoding",
@@ -3903,12 +3903,12 @@
"source": {
"type": "git",
"url": "https://github.com/utopia-php/database.git",
"reference": "240a123e57fe9677224b4314fff81ce0d22baebd"
"reference": "b1c88dd6f624026f9a39634870b3b933e0d5cf3d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/database/zipball/240a123e57fe9677224b4314fff81ce0d22baebd",
"reference": "240a123e57fe9677224b4314fff81ce0d22baebd",
"url": "https://api.github.com/repos/utopia-php/database/zipball/b1c88dd6f624026f9a39634870b3b933e0d5cf3d",
"reference": "b1c88dd6f624026f9a39634870b3b933e0d5cf3d",
"shasum": ""
},
"require": {
@@ -3953,7 +3953,7 @@
"issues": "https://github.com/utopia-php/database/issues",
"source": "https://github.com/utopia-php/database/tree/joins8"
},
"time": "2026-01-19T11:25:09+00:00"
"time": "2026-01-21T09:24:33+00:00"
},
{
"name": "utopia-php/detector",
@@ -5482,16 +5482,16 @@
"packages-dev": [
{
"name": "appwrite/sdk-generator",
"version": "1.8.17",
"version": "1.8.18",
"source": {
"type": "git",
"url": "https://github.com/appwrite/sdk-generator.git",
"reference": "1bc5a39bf87d3c2064f2f8d45fa712340338bc41"
"reference": "2775d5956a8bb65a94022255b2a68eb55f000abb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/1bc5a39bf87d3c2064f2f8d45fa712340338bc41",
"reference": "1bc5a39bf87d3c2064f2f8d45fa712340338bc41",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/2775d5956a8bb65a94022255b2a68eb55f000abb",
"reference": "2775d5956a8bb65a94022255b2a68eb55f000abb",
"shasum": ""
},
"require": {
@@ -5527,9 +5527,9 @@
"description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms",
"support": {
"issues": "https://github.com/appwrite/sdk-generator/issues",
"source": "https://github.com/appwrite/sdk-generator/tree/1.8.17"
"source": "https://github.com/appwrite/sdk-generator/tree/1.8.18"
},
"time": "2026-01-19T12:13:41+00:00"
"time": "2026-01-20T16:16:38+00:00"
},
{
"name": "doctrine/annotations",
@@ -18,6 +18,7 @@ use Utopia\Database\Query;
use Utopia\Database\Validator\Query\Cursor;
use Utopia\Platform\Action;
use Utopia\Swoole\Response as SwooleResponse;
use Utopia\Validator;
use Utopia\Validator\Boolean;
use Utopia\Validator\Text;
@@ -54,7 +54,7 @@ class Base extends Types
Query::TYPE_NOT_TOUCHES,
Query::TYPE_VECTOR_DOT,
Query::TYPE_VECTOR_COSINE,
Query::TYPE_VECTOR_EUCLIDEAN
Query::TYPE_VECTOR_EUCLIDEAN,
];
/**
+26 -50
View File
@@ -4,57 +4,27 @@ namespace Appwrite\Utopia\Request\Filters;
use Appwrite\Extend\Exception;
use Appwrite\Utopia\Request\Filter;
use Utopia\Database\Exception\Query as QueryException;
use Utopia\Database\Query;
class V22 extends Filter
{
protected const CHAR_SINGLE_QUOTE = '\'';
protected const CHAR_DOUBLE_QUOTE = '"';
protected const CHAR_COMMA = ',';
protected const CHAR_SPACE = ' ';
protected const CHAR_BRACKET_START = '[';
protected const CHAR_BRACKET_END = ']';
protected const CHAR_PARENTHESES_START = '(';
protected const CHAR_PARENTHESES_END = ')';
protected const CHAR_BACKSLASH = '\\';
// Convert 1.4 params to 1.5
public function parse(array $content, string $model): array
{
switch ($model) {
case 'account.listIdentities':
case 'account.listLogs':
case 'databases.list':
case 'databases.listLogs':
case 'databases.listCollections':
case 'databases.listCollectionLogs':
case 'databases.listAttributes':
case 'databases.listIndexes':
case 'databases.listDocuments':
case 'databases.getDocument':
case 'databases.listDocumentLogs':
case 'functions.list':
case 'functions.listDeployments':
case 'functions.listExecutions':
case 'migrations.list':
case 'projects.list':
case 'proxy.listRules':
case 'storage.listBuckets':
case 'storage.listFiles':
case 'teams.list':
case 'teams.listMemberships':
case 'teams.listLogs':
case 'users.list':
case 'users.listLogs':
case 'users.listIdentities':
case 'vcs.listInstallations':
$content = $this->convertQueries($content);
break;
var_dump('=========================');
var_dump($model);
if (isset($content['queries'])){
var_dump('=== queries ===');
var_dump($content['queries']);
$content = $this->convertSelectQueries($content);
}
var_dump('=========================');
return $content;
}
private function convertQueries(array $content): array
private function convertSelectQueries(array $content): array
{
var_dump('convertQueries');
@@ -62,18 +32,18 @@ class V22 extends Filter
return $content;
}
try {
$parsed = Query::parseQueries($content['queries']);
} catch (QueryException $e) {
throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage());
}
$queries = [];
/** @var Query $query */
foreach ($content['queries'] as $query) {
foreach ($parsed as $query) {
try {
var_dump($query);
if ($query->getMethod() === 'select') {
$selects = $query->getValue();
foreach ($selects as $select) {
foreach ($query->getValues() as $select) {
$queries[] = Query::select($select);
}
} else {
@@ -85,7 +55,13 @@ class V22 extends Filter
}
}
$content['queries'] = $queries;
$resolvedQueries = [];
foreach ($queries as $query) {
$resolvedQueries[] = $query->toString();
}
$content['queries'] = $resolvedQueries;
return $content;
}
@@ -94,6 +94,34 @@ class DatabasesConsoleClientTest extends Scope
$this->assertEquals(201, $tvShows['headers']['status-code']);
$this->assertEquals($tvShows['body']['name'], 'TvShows');
/**
* Check select queries are disabled in Base class
*/
$list = $this->client->call(Client::METHOD_GET, '/databases', array_merge([
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
], $this->getHeaders()), [
'queries' => [
Query::select('name')->toString(),
]
]);
$this->assertEquals(400, $list['headers']['status-code']);
$this->assertEquals('Invalid `queries` param: Query method select not allowed', $list['body']['message']);
/**
* Check allowed attribute filters
*/
$list = $this->client->call(Client::METHOD_GET, '/databases', array_merge([
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
], $this->getHeaders()), [
'queries' => [
Query::equal('enabled', [true])->toString(),
]
]);
$this->assertEquals(400, $list['headers']['status-code']);
$this->assertEquals('Invalid `queries` param: Invalid query: Attribute not found in schema: enabled', $list['body']['message']);
return ['moviesId' => $movies['body']['$id'], 'databaseId' => $databaseId, 'tvShowsId' => $tvShows['body']['$id']];
}
@@ -433,6 +433,40 @@ class ProjectsConsoleClientTest extends Scope
$this->assertEquals(400, $response['headers']['status-code']);
/**
* Test select queries
*/
/**
* Check old version selects converted to list of selects
*/
$list = $this->client->call(Client::METHOD_GET, '/databases', array_merge([
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
], $this->getHeaders()), [
'queries' => [
'{"method":"select","values":["name", "$createdAt","enabled"]}',
]
]);
$this->assertEquals(400, $list['headers']['status-code']);
$this->assertEquals('Invalid `queries` param: Invalid query: Select queries attribute is empty', $list['body']['message']);
$list = $this->client->call(Client::METHOD_GET, '/databases', array_merge([
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
'x-appwrite-response-format' => '1.8.0',
], $this->getHeaders()), [
'queries' => [
'{"method":"select","values":["name", "$createdAt","enabled"]}',
]
]);
var_dump('{"method":"select","values":["name", "$createdAt"]}');
var_dump($list['databases'][0]['$createdAt']);
var_dump($list['databases'][0]['$updatedAt']);
$this->assertEquals(200, $list['headers']['status-code']);
$this->assertEquals(999, $list['headers']['status-code']);
return $data;
}