Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

declare(strict_types=1);

namespace MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;

/**
* Implementation of PostgreSQL WEBSEARCH_TO_TSQUERY().
*
* @see https://www.postgresql.org/docs/current/textsearch-controls.html
* @since 3.5
*
* @author Jan Klan <jan@klan.com.au>
*/
class WebsearchToTsquery extends BaseVariadicFunction
{
protected function getNodeMappingPattern(): array
{
return ['StringPrimary'];
}

protected function getFunctionName(): string
{
return 'websearch_to_tsquery';
}

protected function getMinArgumentCount(): int
{
return 1;
}

protected function getMaxArgumentCount(): int
{
return 2;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

declare(strict_types=1);

namespace Tests\Integration\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;

use Doctrine\DBAL\Exception\DriverException;
use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\WebsearchToTsquery;
use PHPUnit\Framework\Attributes\Test;

class WebsearchToTsqueryTest extends TextTestCase
{
protected function getStringFunctions(): array
{
return [
'websearch_to_tsquery' => WebsearchToTsquery::class,
];
}

#[Test]
public function websearch_to_tsquery_with_explicit_config(): void
{
$dql = "SELECT websearch_to_tsquery('english', '\"sad cat\" or \"fat rat\"') as result FROM Fixtures\\MartinGeorgiev\\Doctrine\\Entity\\ContainsTexts t WHERE t.id = 1";
$result = $this->executeDqlQuery($dql);
$this->assertSame("'sad' <-> 'cat' | 'fat' <-> 'rat'", $result[0]['result']);
}

#[Test]
public function websearch_to_tsquery_with_default_config(): void
{
$dql = "SELECT websearch_to_tsquery('\"sad cat\" or \"fat rat\"') as result FROM Fixtures\\MartinGeorgiev\\Doctrine\\Entity\\ContainsTexts t WHERE t.id = 1";
$result = $this->executeDqlQuery($dql);
$this->assertSame("'sad' <-> 'cat' | 'fat' <-> 'rat'", $result[0]['result']);
}

#[Test]
public function totsquery_throws_with_invalid_input(): void
{
$this->expectException(DriverException::class);
$this->expectExceptionMessageMatches('/text search configuration .*invalid_regconfig.* does not exist/i');
$dql = "SELECT websearch_to_tsquery('invalid_regconfig', 'foo') as result FROM Fixtures\\MartinGeorgiev\\Doctrine\\Entity\\ContainsTexts t WHERE t.id = 1";
$this->executeDqlQuery($dql);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<?php

declare(strict_types=1);

namespace Tests\Unit\MartinGeorgiev\Doctrine\ORM\Query\AST\Functions;

use Fixtures\MartinGeorgiev\Doctrine\Entity\ContainsTexts;
use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\BaseVariadicFunction;
use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\Exception\InvalidArgumentForVariadicFunctionException;
use MartinGeorgiev\Doctrine\ORM\Query\AST\Functions\WebsearchToTsquery;
use PHPUnit\Framework\Attributes\Test;

class WebsearchToTsqueryTest extends BaseVariadicFunctionTestCase
{
protected function createFixture(): BaseVariadicFunction
{
return new WebsearchToTsquery('WEBSEARCH_TO_TSQUERY');
}

protected function getStringFunctions(): array
{
return [
'WEBSEARCH_TO_TSQUERY' => WebsearchToTsquery::class,
];
}

protected function getExpectedSqlStatements(): array
{
return [
'converts text to tsquery with default config' => 'SELECT websearch_to_tsquery(c0_.text1) AS sclr_0 FROM ContainsTexts c0_',
'converts function result to tsquery' => 'SELECT websearch_to_tsquery(UPPER(c0_.text1)) AS sclr_0 FROM ContainsTexts c0_',
'converts text to tsquery with specified config' => "SELECT websearch_to_tsquery('english', c0_.text1) AS sclr_0 FROM ContainsTexts c0_",
];
}

protected function getDqlStatements(): array
{
return [
'converts text to tsquery with default config' => \sprintf('SELECT WEBSEARCH_TO_TSQUERY(e.text1) FROM %s e', ContainsTexts::class),
'converts function result to tsquery' => \sprintf('SELECT WEBSEARCH_TO_TSQUERY(UPPER(e.text1)) FROM %s e', ContainsTexts::class),
'converts text to tsquery with specified config' => \sprintf("SELECT WEBSEARCH_TO_TSQUERY('english', e.text1) FROM %s e", ContainsTexts::class),
];
}

#[Test]
public function throws_exception_for_too_many_arguments(): void
{
$this->expectException(InvalidArgumentForVariadicFunctionException::class);

$dql = \sprintf("SELECT WEBSEARCH_TO_TSQUERY('english', e.text1, 'extra') FROM %s e", ContainsTexts::class);
$this->assertSqlFromDql('', $dql);
}
}
Loading