Skip to content

Commit

Permalink
polishing
Browse files Browse the repository at this point in the history
  • Loading branch information
tpetry committed Aug 31, 2023
1 parent f47d823 commit 7b1c46e
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 59 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -256,10 +256,12 @@ BlogArticle::select([
#### String
```php
use Tpetry\QueryExpressions\Function\String\{
Concat, Uuid4
Concat, Lower, Upper, Uuid4
};

new Concat(array $expressions);
new Lower(string|Expression $expression);
new Upper(string|Expression $expression);
new Uuid4();

Schema::table('users', function (Blueprint $table): void {
Expand Down
13 changes: 5 additions & 8 deletions src/Function/String/Lower.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,16 @@ class Lower implements Expression

public function __construct(
private readonly string|Expression $expression,
private readonly ?string $collation = null,
) {
}

public function getValue(Grammar $grammar): string
{
$expression = $this->collation ? match ($this->identify($grammar)) {
'mysql' => "convert({$this->stringize($grammar, $this->expression)} using {$this->collation})",
'pgsql' => "{$this->stringize($grammar, $this->expression)} collate {$this->collation}",
'sqlsrv' => "{$this->stringize($grammar, $this->expression)} collate {$this->collation}",
'sqlite' => "{$this->stringize($grammar, $this->expression)} collate {$this->collation}",
} : $this->stringize($grammar, $this->expression);
$expression = $this->stringize($grammar, $this->expression);

return "lower({$expression})";
return match ($this->identify($grammar)) {
'mysql', 'sqlite' => "(lower({$expression}))",
'pgsql', 'sqlsrv' => "lower({$expression})",
};
}
}
13 changes: 5 additions & 8 deletions src/Function/String/Upper.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,16 @@ class Upper implements Expression

public function __construct(
private readonly string|Expression $expression,
private readonly ?string $collation = null,
) {
}

public function getValue(Grammar $grammar): string
{
$expression = $this->collation ? match ($this->identify($grammar)) {
'mysql' => "convert({$this->stringize($grammar, $this->expression)} using {$this->collation})",
'pgsql' => "{$this->stringize($grammar, $this->expression)} collate {$this->collation}",
'sqlsrv' => "{$this->stringize($grammar, $this->expression)} collate {$this->collation}",
'sqlite' => "{$this->stringize($grammar, $this->expression)} collate {$this->collation}",
} : $this->stringize($grammar, $this->expression);
$expression = $this->stringize($grammar, $this->expression);

return "upper({$expression})";
return match ($this->identify($grammar)) {
'mysql', 'sqlite' => "(upper({$expression}))",
'pgsql', 'sqlsrv' => "upper({$expression})",
};
}
}
26 changes: 5 additions & 21 deletions tests/Function/String/LowerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,25 +14,9 @@
->toBeSqlsrv('lower([val])');

it('can lowercase an expression')
->expect(new Lower(new Expression('\'foo\'')))
->expect(new Lower(new Expression("'foo'")))
->toBeExecutable()
->toBeMysql('lower(\'foo\')')
->toBePgsql('lower(\'foo\')')
->toBeSqlite('lower(\'foo\')')
->toBeSqlsrv('lower(\'foo\')');

it('can change collation of column before changing it to lowercase')
->expect(new Lower('val', 'utf8'))
->toBeExecutable(['val varchar(255)'])
->toBeMysql('lower(convert(`val` using utf8))')
->toBePgsql('lower("val" collate utf8)')
->toBeSqlite('lower("val" collate utf8)')
->toBeSqlsrv('lower([val] collate utf8)');

it('can change collation of expression before changing it to lowercase')
->expect(new Lower(new Expression('\'foo\''), 'utf8'))
->toBeExecutable()
->toBeMysql('lower(convert(\'foo\' using utf8))')
->toBePgsql('lower(\'foo\' collate utf8)')
->toBeSqlite('lower(\'foo\' collate utf8)')
->toBeSqlsrv('lower(\'foo\' collate utf8)');
->toBeMysql("lower('foo')")
->toBePgsql("lower('foo')")
->toBeSqlite("lower('foo')")
->toBeSqlsrv("lower('foo')");
26 changes: 5 additions & 21 deletions tests/Function/String/UpperTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,25 +14,9 @@
->toBeSqlsrv('upper([val])');

it('can uppercase an expression')
->expect(new Upper(new Expression('\'foo\'')))
->expect(new Upper(new Expression("'foo'")))
->toBeExecutable()
->toBeMysql('upper(\'foo\')')
->toBePgsql('upper(\'foo\')')
->toBeSqlite('upper(\'foo\')')
->toBeSqlsrv('upper(\'foo\')');

it('can change collation of column before changing it to uppercase')
->expect(new Upper('val', 'utf8'))
->toBeExecutable(['val varchar(255)'])
->toBeMysql('upper(convert(`val` using utf8))')
->toBePgsql('upper("val" collate utf8)')
->toBeSqlite('upper("val" collate utf8)')
->toBeSqlsrv('upper([val] collate utf8)');

it('can change collation of expression before changing it to uppercase')
->expect(new Upper(new Expression('\'foo\''), 'utf8'))
->toBeExecutable()
->toBeMysql('upper(convert(\'foo\' using utf8))')
->toBePgsql('upper(\'foo\' collate utf8)')
->toBeSqlite('upper(\'foo\' collate utf8)')
->toBeSqlsrv('upper(\'foo\' collate utf8)');
->toBeMysql("upper('foo')")
->toBePgsql("upper('foo')")
->toBeSqlite("upper('foo')")
->toBeSqlsrv("upper('foo')");

0 comments on commit 7b1c46e

Please sign in to comment.