Skip to content

Commit a1b2849

Browse files
Merge pull request #99 from utopia-php/fix-query-on-
Fix: query on $id
2 parents 15515a7 + 16970a6 commit a1b2849

7 files changed

Lines changed: 78 additions & 5 deletions

File tree

src/Database/Adapter/MariaDB.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,9 @@ public function find(string $collection, array $queries = [], int $limit = 25, i
580580
$permissions = (Authorization::$status) ? $this->getSQLPermissions($roles) : '1=1'; // Disable join when no authorization required
581581

582582
foreach($queries as $i => $query) {
583+
if($query->getAttribute() === '$id') {
584+
$query->setAttribute('_uid');
585+
}
583586
$conditions = [];
584587
foreach ($query->getValues() as $key => $value) {
585588
$conditions[] = $this->getSQLCondition('table_main.'.$query->getAttribute(), $query->getOperator(), ':attribute_'.$i.'_'.$key.'_'.$query->getAttribute(), $value);
@@ -658,6 +661,9 @@ public function count(string $collection, array $queries = [], int $max = 0): in
658661
$permissions = (Authorization::$status) ? $this->getSQLPermissions($roles) : '1=1'; // Disable join when no authorization required
659662

660663
foreach($queries as $i => $query) {
664+
if($query->getAttribute() === '$id') {
665+
$query->setAttribute('_uid');
666+
}
661667
$conditions = [];
662668
foreach ($query->getValues() as $key => $value) {
663669
$conditions[] = $this->getSQLCondition('table_main.'.$query->getAttribute(), $query->getOperator(), ':attribute_'.$i.'_'.$key.'_'.$query->getAttribute(), $value);
@@ -713,6 +719,9 @@ public function sum(string $collection, string $attribute, array $queries = [],
713719
$permissions = (Authorization::$status) ? $this->getSQLPermissions($roles) : '1=1'; // Disable join when no authorization required
714720

715721
foreach($queries as $i => $query) {
722+
if($query->getAttribute() === '$id') {
723+
$query->setAttribute('_uid');
724+
}
716725
$conditions = [];
717726
foreach ($query->getValues() as $key => $value) {
718727
$conditions[] = $this->getSQLCondition('table_main.'.$query->getAttribute(), $query->getOperator(), ':attribute_'.$i.'_'.$key.'_'.$query->getAttribute(), $value);

src/Database/Adapter/MongoDB.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -695,6 +695,9 @@ protected function buildFilters($queries): array
695695
$filters = [];
696696

697697
foreach($queries as $i => $query) {
698+
if($query->getAttribute() === '$id') {
699+
$query->setAttribute('_uid');
700+
}
698701
$attribute = $query->getAttribute();
699702
$operator = $this->getQueryOperator($query->getOperator());
700703
$value = (count($query->getValues()) > 1) ? $query->getValues() : $query->getValues()[0];

src/Database/Query.php

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@ class Query
1616
/**
1717
* @var string
1818
*/
19-
protected $attribute = '';
19+
protected string $attribute = '';
2020

2121
/**
2222
* @var string
2323
*/
24-
protected $operator = '';
24+
protected string $operator = '';
2525

2626
/**
2727
* @var (mixed)[]
2828
*/
29-
protected $values;
29+
protected array $values;
3030

3131
/**
3232
* Construct.
@@ -67,9 +67,9 @@ public function getOperator(): string
6767
/**
6868
* Get operand
6969
*
70-
* @return mixed
70+
* @return array
7171
*/
72-
public function getValues()
72+
public function getValues(): array
7373
{
7474
return $this->values;
7575
}
@@ -88,6 +88,42 @@ public function getQuery(): array
8888
];
8989
}
9090

91+
/**
92+
* Set attribute
93+
*
94+
* @return self
95+
*/
96+
public function setAttribute(string $attribute): self
97+
{
98+
$this->attribute = $attribute;
99+
100+
return $this;
101+
}
102+
103+
/**
104+
* Set operator
105+
*
106+
* @return self
107+
*/
108+
public function setOperator(string $operator): self
109+
{
110+
$this->operator = $operator;
111+
112+
return $this;
113+
}
114+
115+
/**
116+
* Set operand
117+
*
118+
* @return self
119+
*/
120+
public function setValues(array $values): self
121+
{
122+
$this->values = $values;
123+
124+
return $this;
125+
}
126+
91127
/**
92128
* Check if operator is supported
93129
*

src/Database/Validator/Queries.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ public function __construct($validator, $indexes, $strict = true)
4141
{
4242
$this->validator = $validator;
4343

44+
$this->indexes[] = [
45+
'type' => Database::INDEX_UNIQUE,
46+
'attributes' => ['$id']
47+
];
48+
4449
foreach ($indexes as $index) {
4550
$this->indexes[] = $index->getArrayCopy(['attributes', 'type']);
4651
}

src/Database/Validator/QueryValidator.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Utopia\Database\Validator;
44

5+
use Utopia\Database\Database;
56
use Utopia\Validator;
67
use Utopia\Database\Document;
78
use Utopia\Database\Query;
@@ -39,6 +40,13 @@ class QueryValidator extends Validator
3940
*/
4041
public function __construct(array $attributes)
4142
{
43+
$this->schema[] = [
44+
'key' => '$id',
45+
'array' => false,
46+
'type' => Database::VAR_STRING,
47+
'size' => 512
48+
];
49+
4250
foreach ($attributes as $attribute) {
4351
$this->schema[] = $attribute->getArrayCopy();
4452
}

tests/Database/Base.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,7 @@ public function testFind(Document $document)
609609
$this->assertEquals(true, static::getDatabase()->createAttribute('movies', 'generes', Database::VAR_STRING, 32, true, null, true, true));
610610

611611
static::getDatabase()->createDocument('movies', new Document([
612+
'$id' => 'frozen',
612613
'$read' => ['role:all', 'user1', 'user2'],
613614
'$write' => ['role:all', 'user1x', 'user2x'],
614615
'name' => 'Frozen',
@@ -798,6 +799,16 @@ public function testFind(Document $document)
798799
$this->assertEquals('Frozen II', $documents[0]['name']);
799800
$this->assertEquals('Captain Marvel', $documents[1]['name']);
800801

802+
/**
803+
* $id condition
804+
*/
805+
$documents = static::getDatabase()->find('movies', [
806+
new Query('$id', Query::TYPE_EQUAL, ['frozen']),
807+
]);
808+
809+
$this->assertEquals(1, count($documents));
810+
$this->assertEquals('Frozen', $documents[0]['name']);
811+
801812
/**
802813
* ORDER BY
803814
*/

tests/Database/Validator/QueryValidatorTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ public function testQuery()
9797
{
9898
$validator = new QueryValidator($this->schema);
9999

100+
$this->assertEquals(true, $validator->isValid(Query::parse('$id.equal("Iron Man", "Ant Man")')));
100101
$this->assertEquals(true, $validator->isValid(Query::parse('title.notEqual("Iron Man", "Ant Man")')));
101102
$this->assertEquals(true, $validator->isValid(Query::parse('description.equal("Best movie ever")')));
102103
$this->assertEquals(true, $validator->isValid(Query::parse('rating.greater(4)')));

0 commit comments

Comments
 (0)