Skip to content

Commit f7dd2ce

Browse files
author
codeliner
committed
Do not encode metadata column val
1 parent 7287726 commit f7dd2ce

File tree

2 files changed

+71
-7
lines changed

2 files changed

+71
-7
lines changed

src/PostgresDocumentStore.php

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -566,27 +566,27 @@ private function filterToWhereClause(Filter $filter, $argsCount = 0): array
566566
return $this->makeInClause('id', $filter->valList(), $argsCount);
567567
case DocumentStore\Filter\AnyOfFilter::class:
568568
/** @var DocumentStore\Filter\AnyOfFilter $filter */
569-
return $this->makeInClause($this->propToJsonPath($filter->prop()), $filter->valList(), $argsCount, true);
569+
return $this->makeInClause($this->propToJsonPath($filter->prop()), $filter->valList(), $argsCount, $this->shouldJsonEncodeVal($filter->prop()));
570570
case DocumentStore\Filter\EqFilter::class:
571571
/** @var DocumentStore\Filter\EqFilter $filter */
572572
$prop = $this->propToJsonPath($filter->prop());
573-
return ["$prop = :a$argsCount", ["a$argsCount" => json_encode($filter->val())], ++$argsCount];
573+
return ["$prop = :a$argsCount", ["a$argsCount" => $this->prepareVal($filter->val(), $filter->prop())], ++$argsCount];
574574
case DocumentStore\Filter\GtFilter::class:
575575
/** @var DocumentStore\Filter\GtFilter $filter */
576576
$prop = $this->propToJsonPath($filter->prop());
577-
return ["$prop > :a$argsCount", ["a$argsCount" => json_encode($filter->val())], ++$argsCount];
577+
return ["$prop > :a$argsCount", ["a$argsCount" => $this->prepareVal($filter->val(), $filter->prop())], ++$argsCount];
578578
case DocumentStore\Filter\GteFilter::class:
579579
/** @var DocumentStore\Filter\GteFilter $filter */
580580
$prop = $this->propToJsonPath($filter->prop());
581-
return ["$prop >= :a$argsCount", ["a$argsCount" => json_encode($filter->val())], ++$argsCount];
581+
return ["$prop >= :a$argsCount", ["a$argsCount" => $this->prepareVal($filter->val(), $filter->prop())], ++$argsCount];
582582
case DocumentStore\Filter\LtFilter::class:
583583
/** @var DocumentStore\Filter\LtFilter $filter */
584584
$prop = $this->propToJsonPath($filter->prop());
585-
return ["$prop < :a$argsCount", ["a$argsCount" => json_encode($filter->val())], ++$argsCount];
585+
return ["$prop < :a$argsCount", ["a$argsCount" => $this->prepareVal($filter->val(), $filter->prop())], ++$argsCount];
586586
case DocumentStore\Filter\LteFilter::class:
587587
/** @var DocumentStore\Filter\LteFilter $filter */
588588
$prop = $this->propToJsonPath($filter->prop());
589-
return ["$prop <= :a$argsCount", ["a$argsCount" => json_encode($filter->val())], ++$argsCount];
589+
return ["$prop <= :a$argsCount", ["a$argsCount" => $this->prepareVal($filter->val(), $filter->prop())], ++$argsCount];
590590
case DocumentStore\Filter\LikeFilter::class:
591591
/** @var DocumentStore\Filter\LikeFilter $filter */
592592
$prop = $this->propToJsonPath($filter->prop());
@@ -614,7 +614,7 @@ private function filterToWhereClause(Filter $filter, $argsCount = 0): array
614614
case DocumentStore\Filter\InArrayFilter::class:
615615
/** @var DocumentStore\Filter\InArrayFilter $filter */
616616
$prop = $this->propToJsonPath($filter->prop());
617-
return ["$prop @> :a$argsCount", ["a$argsCount" => json_encode($filter->val())], ++$argsCount];
617+
return ["$prop @> :a$argsCount", ["a$argsCount" => $this->prepareVal($filter->val(), $filter->prop())], ++$argsCount];
618618
case DocumentStore\Filter\ExistsFilter::class:
619619
/** @var DocumentStore\Filter\ExistsFilter $filter */
620620
$prop = $this->propToJsonPath($filter->prop());
@@ -708,6 +708,24 @@ private function indexToSqlCmd(Index $index, string $collectionName): string
708708
return $cmd;
709709
}
710710

711+
private function prepareVal($value, string $prop)
712+
{
713+
if(!$this->shouldJsonEncodeVal($prop)) {
714+
return $value;
715+
}
716+
717+
return \json_encode($value);
718+
}
719+
720+
private function shouldJsonEncodeVal(string $prop): bool
721+
{
722+
if($this->useMetadataColumns && strpos($prop, 'metadata.') === 0) {
723+
return false;
724+
}
725+
726+
return true;
727+
}
728+
711729
private function getIndexName(Index $index): ?string
712730
{
713731
if(method_exists($index, 'name')) {

tests/MetadataPostgresDocumentStoreTest.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,52 @@ public function it_fills_and_queries_metadata_column()
315315
$this->assertEquals('v4', $docs[0]['state']['name']);
316316
}
317317

318+
/**
319+
* @test
320+
*/
321+
public function it_fills_and_queries_metadata_varchar_column()
322+
{
323+
$collectionName = 'test_col_query_name_meta';
324+
325+
$index1 = new MetadataColumnIndex(
326+
FieldIndex::namedIndexForField('meta_field_idx_name', 'metadata.name'),
327+
new Column('name VARCHAR(10)')
328+
);
329+
330+
$this->documentStore->addCollection($collectionName, $index1);
331+
332+
$docId1 = Uuid::uuid4()->toString();
333+
$docId2 = Uuid::uuid4()->toString();
334+
$docId3 = Uuid::uuid4()->toString();
335+
336+
$this->documentStore->addDoc($collectionName, $docId1, ['state' => ['name' => 'v1'], 'metadata' => ['name' => 'v1']]);
337+
$this->documentStore->addDoc($collectionName, $docId2, ['state' => ['name' => 'v2'], 'metadata' => ['name' => 'v2']]);
338+
$this->documentStore->addDoc($collectionName, $docId3, ['state' => ['name' => 'v3'], 'metadata' => ['name' => 'v3']]);
339+
340+
$prefix = self::TABLE_PREFIX;
341+
$stmt = "SELECT * FROM $prefix{$collectionName} WHERE name = 'v2';";
342+
$stmt = $this->connection->prepare($stmt);
343+
$stmt->execute();
344+
$docs = $stmt->fetchAll();
345+
346+
$this->assertCount(1, $docs);
347+
$this->assertEquals($docId2, $docs[0]['id']);
348+
$this->assertEquals(['state' => ['name' => 'v2']], json_decode($docs[0]['doc'], true));
349+
$this->assertEquals('v2', $docs[0]['name']);
350+
351+
$docs = iterator_to_array($this->documentStore->filterDocs(
352+
$collectionName,
353+
new GteFilter('metadata.name', 'v2'),
354+
null,
355+
null,
356+
Desc::byProp('metadata.name')
357+
));
358+
359+
$this->assertCount(2, $docs);
360+
$this->assertEquals('v3', $docs[0]['state']['name']);
361+
$this->assertEquals('v2', $docs[1]['state']['name']);
362+
}
363+
318364
private function getIndexes(string $collectionName): array
319365
{
320366
return TestUtil::getIndexes($this->connection, self::TABLE_PREFIX.$collectionName);

0 commit comments

Comments
 (0)