‪TYPO3CMS  ‪main
ExpressionBuilderTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Doctrine\DBAL\Platforms\SQLitePlatform as DoctrineSQLitePlatform;
21 use PHPUnit\Framework\Attributes\DataProvider;
22 use PHPUnit\Framework\Attributes\Test;
25 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
26 
27 final class ‪ExpressionBuilderTest extends FunctionalTestCase
28 {
29  protected array ‪$testExtensionsToLoad = [
30  'typo3/sysext/core/Tests/Functional/Database/Fixtures/Extensions/test_expressionbuilder',
31  ];
32 
33  #[Test]
35  {
36  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
37  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
38  $result = $queryBuilder
39  ->select('uid', 'aCsvField')
40  ->from('tx_expressionbuildertest')
41  ->where(
42  $queryBuilder->expr()->inSet('aCsvField', $queryBuilder->quoteIdentifier('aField'), true)
43  )
44  ->orderBy('uid')
45  ->executeQuery()
46  ->fetchAllAssociative();
47  $expected = [
48  0 => [
49  'uid' => 1,
50  'aCsvField' => 'match',
51  ],
52  1 => [
53  'uid' => 2,
54  'aCsvField' => 'match,nomatch',
55  ],
56  2 => [
57  'uid' => 3,
58  'aCsvField' => 'nomatch,match',
59  ],
60  3 => [
61  'uid' => 4,
62  'aCsvField' => 'nomatch1,match,nomatch2',
63  ],
64  // uid 5 missing here!
65  4 => [
66  'uid' => 6,
67  'aCsvField' => '2',
68  ],
69  5 => [
70  'uid' => 7,
71  'aCsvField' => '2,3',
72  ],
73  6 => [
74  'uid' => 8,
75  'aCsvField' => '1,2',
76  ],
77  7 => [
78  'uid' => 9,
79  'aCsvField' => '1,2,3',
80  ],
81  // uid 10 missing here!
82  8 => [
83  'uid' => 11,
84  'aCsvField' => 'wild%card',
85  ],
86  9 => [
87  'uid' => 12,
88  'aCsvField' => 'wild%card,nowild%card',
89  ],
90  10 => [
91  'uid' => 13,
92  'aCsvField' => 'nowild%card,wild%card',
93  ],
94  11 => [
95  'uid' => 14,
96  'aCsvField' => 'nowild%card1,wild%card,nowild%card2',
97  ],
98  ];
99  self::assertEquals($expected, $result);
100  }
101 
102  #[Test]
103  public function ‪inSetReturnsExpectedDataSets(): void
104  {
105  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
106  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
107  $result = $queryBuilder
108  ->select('uid', 'aCsvField')
109  ->from('tx_expressionbuildertest')
110  ->where(
111  $queryBuilder->expr()->inSet('aCsvField', $queryBuilder->expr()->literal('match'))
112  )
113  ->orderBy('uid')
114  ->executeQuery()
115  ->fetchAllAssociative();
116  $expected = [
117  0 => [
118  'uid' => 1,
119  'aCsvField' => 'match',
120  ],
121  1 => [
122  'uid' => 2,
123  'aCsvField' => 'match,nomatch',
124  ],
125  2 => [
126  'uid' => 3,
127  'aCsvField' => 'nomatch,match',
128  ],
129  3 => [
130  'uid' => 4,
131  'aCsvField' => 'nomatch1,match,nomatch2',
132  ],
133  ];
134  self::assertEquals($expected, $result);
135  }
136 
137  #[Test]
139  {
140  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
141  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
142  $result = $queryBuilder
143  ->select('uid', 'aCsvField')
144  ->from('tx_expressionbuildertest')
145  ->where(
146  $queryBuilder->expr()->inSet('aCsvField', (string)2)
147  )
148  ->orderBy('uid')
149  ->executeQuery()
150  ->fetchAllAssociative();
151  $expected = [
152  0 => [
153  'uid' => 6,
154  'aCsvField' => '2',
155  ],
156  1 => [
157  'uid' => 7,
158  'aCsvField' => '2,3',
159  ],
160  2 => [
161  'uid' => 8,
162  'aCsvField' => '1,2',
163  ],
164  3 => [
165  'uid' => 9,
166  'aCsvField' => '1,2,3',
167  ],
168  ];
169  self::assertEquals($expected, $result);
170  }
171 
172  #[Test]
174  {
175  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
176  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
177  $result = $queryBuilder
178  ->select('uid', 'aCsvField')
179  ->from('tx_expressionbuildertest')
180  ->where(
181  $queryBuilder->expr()->inSet('aCsvField', $queryBuilder->expr()->literal('wild%card'))
182  )
183  ->orderBy('uid')
184  ->executeQuery()
185  ->fetchAllAssociative();
186  $expected = [
187  0 => [
188  'uid' => 11,
189  'aCsvField' => 'wild%card',
190  ],
191  1 => [
192  'uid' => 12,
193  'aCsvField' => 'wild%card,nowild%card',
194  ],
195  2 => [
196  'uid' => 13,
197  'aCsvField' => 'nowild%card,wild%card',
198  ],
199  3 => [
200  'uid' => 14,
201  'aCsvField' => 'nowild%card1,wild%card,nowild%card2',
202  ],
203  ];
204  self::assertEquals($expected, $result);
205  }
206 
207  #[Test]
209  {
210  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
211  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
212  $result = $queryBuilder
213  ->select('uid', 'aCsvField')
214  ->from('tx_expressionbuildertest')
215  ->where(
216  $queryBuilder->expr()->inSet('aCsvField', $queryBuilder->expr()->literal('wild[card'))
217  )
218  ->orderBy('uid')
219  ->executeQuery()
220  ->fetchAllAssociative();
221  $expected = [
222  0 => [
223  'uid' => 16,
224  'aCsvField' => 'wild[card',
225  ],
226  1 => [
227  'uid' => 17,
228  'aCsvField' => 'wild[card,nowild[card',
229  ],
230  2 => [
231  'uid' => 18,
232  'aCsvField' => 'nowild[card,wild[card',
233  ],
234  3 => [
235  'uid' => 19,
236  'aCsvField' => 'nowild[card1,wild[card,nowild[card2',
237  ],
238  ];
239  self::assertEquals($expected, $result);
240  }
241 
242  #[Test]
244  {
245  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
246  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
247  $result = $queryBuilder
248  ->select('uid', 'aCsvField')
249  ->from('tx_expressionbuildertest')
250  ->where(
251  $queryBuilder->expr()->inSet('aCsvField', $queryBuilder->expr()->literal('wild]card'))
252  )
253  ->orderBy('uid')
254  ->executeQuery()
255  ->fetchAllAssociative();
256  $expected = [
257  0 => [
258  'uid' => 21,
259  'aCsvField' => 'wild]card',
260  ],
261  1 => [
262  'uid' => 22,
263  'aCsvField' => 'wild]card,nowild]card',
264  ],
265  2 => [
266  'uid' => 23,
267  'aCsvField' => 'nowild]card,wild]card',
268  ],
269  3 => [
270  'uid' => 24,
271  'aCsvField' => 'nowild]card1,wild]card,nowild]card2',
272  ],
273  ];
274  self::assertEquals($expected, $result);
275  }
276 
277  #[Test]
279  {
280  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
281  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
282  $result = $queryBuilder
283  ->select('uid', 'aCsvField')
284  ->from('tx_expressionbuildertest')
285  ->where(
286  $queryBuilder->expr()->inSet('aCsvField', $queryBuilder->expr()->literal('wild[]card'))
287  )
288  ->orderBy('uid')
289  ->executeQuery()
290  ->fetchAllAssociative();
291  $expected = [
292  0 => [
293  'uid' => 26,
294  'aCsvField' => 'wild[]card',
295  ],
296  1 => [
297  'uid' => 27,
298  'aCsvField' => 'wild[]card,nowild[]card',
299  ],
300  2 => [
301  'uid' => 28,
302  'aCsvField' => 'nowild[]card,wild[]card',
303  ],
304  3 => [
305  'uid' => 29,
306  'aCsvField' => 'nowild[]card1,wild[]card,nowild[]card2',
307  ],
308  ];
309  self::assertEquals($expected, $result);
310  }
311 
312  #[Test]
314  {
315  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
316  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
317  $result = $queryBuilder
318  ->select('uid', 'aCsvField')
319  ->from('tx_expressionbuildertest')
320  ->where(
321  $queryBuilder->expr()->inSet('aCsvField', $queryBuilder->expr()->literal('wild[foo]card'))
322  )
323  ->orderBy('uid')
324  ->executeQuery()
325  ->fetchAllAssociative();
326  $expected = [
327  0 => [
328  'uid' => 31,
329  'aCsvField' => 'wild[foo]card',
330  ],
331  1 => [
332  'uid' => 32,
333  'aCsvField' => 'wild[foo]card,nowild[foo]card',
334  ],
335  2 => [
336  'uid' => 33,
337  'aCsvField' => 'nowild[foo]card,wild[foo]card',
338  ],
339  3 => [
340  'uid' => 34,
341  'aCsvField' => 'nowild[foo]card1,wild[foo]card,nowild[foo]card2',
342  ],
343  ];
344  self::assertEquals($expected, $result);
345  }
346 
347  #[Test]
349  {
350  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
351  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
352  $result = $queryBuilder
353  ->select('uid', 'aCsvField')
354  ->from('tx_expressionbuildertest')
355  ->where(
356  $queryBuilder->expr()->inSet('aCsvField', $queryBuilder->expr()->literal('wild[%]card'))
357  )
358  ->orderBy('uid')
359  ->executeQuery()
360  ->fetchAllAssociative();
361  $expected = [
362  0 => [
363  'uid' => 36,
364  'aCsvField' => 'wild[%]card',
365  ],
366  1 => [
367  'uid' => 37,
368  'aCsvField' => 'wild[%]card,nowild[%]card',
369  ],
370  2 => [
371  'uid' => 38,
372  'aCsvField' => 'nowild[%]card,wild[%]card',
373  ],
374  3 => [
375  'uid' => 39,
376  'aCsvField' => 'nowild[%]card1,wild[%]card,nowild[%]card2',
377  ],
378  ];
379  self::assertEquals($expected, $result);
380  }
381 
382  #[Test]
384  {
385  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
386  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
387  $result = $queryBuilder
388  ->select('uid', 'aCsvField')
389  ->from('tx_expressionbuildertest')
390  ->where(
391  $queryBuilder->expr()->notInSet('aCsvField', $queryBuilder->quoteIdentifier('aField'), true)
392  )
393  ->orderBy('uid')
394  ->executeQuery()
395  ->fetchAllAssociative();
396  $expected = [
397  0 => [
398  'uid' => 5,
399  'aCsvField' => 'nomatch',
400  ],
401  1 => [
402  'uid' => 10,
403  'aCsvField' => '4',
404  ],
405  2 => [
406  'uid' => 15,
407  'aCsvField' => 'nowild%card',
408  ],
409  3 => [
410  'uid' => 16,
411  'aCsvField' => 'wild[card',
412  ],
413  4 => [
414  'uid' => 17,
415  'aCsvField' => 'wild[card,nowild[card',
416  ],
417  5 => [
418  'uid' => 18,
419  'aCsvField' => 'nowild[card,wild[card',
420  ],
421  6 => [
422  'uid' => 19,
423  'aCsvField' => 'nowild[card1,wild[card,nowild[card2',
424  ],
425  7 => [
426  'uid' => 20,
427  'aCsvField' => 'nowild[card',
428  ],
429  8 => [
430  'uid' => 21,
431  'aCsvField' => 'wild]card',
432  ],
433  9 => [
434  'uid' => 22,
435  'aCsvField' => 'wild]card,nowild]card',
436  ],
437  10 => [
438  'uid' => 23,
439  'aCsvField' => 'nowild]card,wild]card',
440  ],
441  11 => [
442  'uid' => 24,
443  'aCsvField' => 'nowild]card1,wild]card,nowild]card2',
444  ],
445  12 => [
446  'uid' => 25,
447  'aCsvField' => 'nowild]card',
448  ],
449  13 => [
450  'uid' => 26,
451  'aCsvField' => 'wild[]card',
452  ],
453  14 => [
454  'uid' => 27,
455  'aCsvField' => 'wild[]card,nowild[]card',
456  ],
457  15 => [
458  'uid' => 28,
459  'aCsvField' => 'nowild[]card,wild[]card',
460  ],
461  16 => [
462  'uid' => 29,
463  'aCsvField' => 'nowild[]card1,wild[]card,nowild[]card2',
464  ],
465  17 => [
466  'uid' => 30,
467  'aCsvField' => 'nowild[]card',
468  ],
469  18 => [
470  'uid' => 31,
471  'aCsvField' => 'wild[foo]card',
472  ],
473  19 => [
474  'uid' => 32,
475  'aCsvField' => 'wild[foo]card,nowild[foo]card',
476  ],
477  20 => [
478  'uid' => 33,
479  'aCsvField' => 'nowild[foo]card,wild[foo]card',
480  ],
481  21 => [
482  'uid' => 34,
483  'aCsvField' => 'nowild[foo]card1,wild[foo]card,nowild[foo]card2',
484  ],
485  22 => [
486  'uid' => 35,
487  'aCsvField' => 'nowild[foo]card',
488  ],
489  23 => [
490  'uid' => 36,
491  'aCsvField' => 'wild[%]card',
492  ],
493  24 => [
494  'uid' => 37,
495  'aCsvField' => 'wild[%]card,nowild[%]card',
496  ],
497  25 => [
498  'uid' => 38,
499  'aCsvField' => 'nowild[%]card,wild[%]card',
500  ],
501  26 => [
502  'uid' => 39,
503  'aCsvField' => 'nowild[%]card1,wild[%]card,nowild[%]card2',
504  ],
505  27 => [
506  'uid' => 40,
507  'aCsvField' => 'nowild[%]card',
508  ],
509  ];
510  self::assertEquals($expected, $result);
511  }
512 
513  #[Test]
514  public function ‪notInSetReturnsExpectedDataSets(): void
515  {
516  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
517  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
518  $queryBuilder
519  ->count('uid')
520  ->from('tx_expressionbuildertest');
521  // Count all rows
522  self::assertEquals(40, $queryBuilder->executeQuery()->fetchOne());
523 
524  // Count the ones not in set
525  $queryBuilder->where(
526  $queryBuilder->expr()->notInSet('aCsvField', $queryBuilder->expr()->literal('match')),
527  );
528  self::assertEquals(36, $queryBuilder->executeQuery()->fetchOne());
529 
530  // Count the ones in set
531  $queryBuilder->where(
532  $queryBuilder->expr()->inSet('aCsvField', $queryBuilder->expr()->literal('match')),
533  );
534  self::assertEquals(4, $queryBuilder->executeQuery()->fetchOne());
535  }
536 
537  #[Test]
539  {
540  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
541  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
542  $queryBuilder
543  ->count('uid')
544  ->from('tx_expressionbuildertest')
545  ->where(
546  $queryBuilder->expr()->notInSet('aCsvField', (string)2)
547  );
548  self::assertEquals(36, $queryBuilder->executeQuery()->fetchOne());
549  }
550 
551  #[Test]
553  {
554  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
555  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
556  $queryBuilder
557  ->count('uid')
558  ->from('tx_expressionbuildertest')
559  ->where(
560  $queryBuilder->expr()->notInSet('aCsvField', $queryBuilder->expr()->literal('wild%card'))
561  );
562  self::assertEquals(36, $queryBuilder->executeQuery()->fetchOne());
563  }
564 
565  #[Test]
567  {
568  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
569  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
570  $queryBuilder
571  ->count('uid')
572  ->from('tx_expressionbuildertest')
573  ->where(
574  $queryBuilder->expr()->notInSet('aCsvField', $queryBuilder->expr()->literal('wild[card'))
575  );
576  self::assertEquals(36, $queryBuilder->executeQuery()->fetchOne());
577  }
578 
579  #[Test]
581  {
582  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
583  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
584  $queryBuilder
585  ->count('uid')
586  ->from('tx_expressionbuildertest')
587  ->where(
588  $queryBuilder->expr()->notInSet('aCsvField', $queryBuilder->expr()->literal('wild]card'))
589  );
590  self::assertEquals(36, $queryBuilder->executeQuery()->fetchOne());
591  }
592 
593  #[Test]
595  {
596  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
597  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
598  $queryBuilder
599  ->count('uid')
600  ->from('tx_expressionbuildertest')
601  ->where(
602  $queryBuilder->expr()->notInSet('aCsvField', $queryBuilder->expr()->literal('wild[]card'))
603  );
604  self::assertEquals(36, $queryBuilder->executeQuery()->fetchOne());
605  }
606 
607  #[Test]
609  {
610  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
611  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
612  $queryBuilder
613  ->count('uid')
614  ->from('tx_expressionbuildertest')
615  ->where(
616  $queryBuilder->expr()->notInSet('aCsvField', $queryBuilder->expr()->literal('wild[foo]card'))
617  );
618  self::assertEquals(36, $queryBuilder->executeQuery()->fetchOne());
619  }
620 
621  #[Test]
623  {
624  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderInSet.csv');
625  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
626  $queryBuilder
627  ->count('uid')
628  ->from('tx_expressionbuildertest')
629  ->where(
630  $queryBuilder->expr()->notInSet('aCsvField', $queryBuilder->expr()->literal('wild[%]card'))
631  );
632  self::assertEquals(36, $queryBuilder->executeQuery()->fetchOne());
633  }
634 
635  public static function ‪likeReturnsExpectedDataSetsDataProvider(): \Generator
636  {
637  yield 'lowercase search word matches german umlauts in upper and lower casing #1' => [
638  'searchWord' => '%über%',
639  'expectedRows' => [
640  0 => [
641  'uid' => 1,
642  'aCsvField' => 'Fächer, Ãœberraschungen sind Äußerungen',
643  ],
644  1 => [
645  'uid' => 2,
646  'aCsvField' => 'Kleingeschriebenes überlebt halt ältere',
647  ],
648  ],
649  'excludePlatforms' => [
650  // Exclude sqlite due to german umlauts.
651  DoctrineSQLitePlatform::class,
652  ],
653  ];
654 
655  yield 'lowercase search word matches german umlauts in upper and lower casing #2' => [
656  'searchWord' => '%ältere%',
657  'expectedRows' => [
658  0 => [
659  'uid' => 2,
660  'aCsvField' => 'Kleingeschriebenes überlebt halt ältere',
661  ],
662  ],
663  'excludePlatforms' => [
664  // Exclude sqlite due to german umlauts.
665  DoctrineSQLitePlatform::class,
666  ],
667  ];
668 
669  yield 'uppercase search word matches german umlauts in upper and lower casing #1' => [
670  'searchWord' => '%Ältere%',
671  'expectedRows' => [
672  0 => [
673  'uid' => 2,
674  'aCsvField' => 'Kleingeschriebenes überlebt halt ältere',
675  ],
676  ],
677  'excludePlatforms' => [
678  // Exclude sqlite due to german umlauts.
679  DoctrineSQLitePlatform::class,
680  ],
681  ];
682 
683  yield 'lowercase ascii search word matches properly case-insensitive' => [
684  'searchWord' => '%klein%',
685  'expectedRows' => [
686  0 => [
687  'uid' => 2,
688  'aCsvField' => 'Kleingeschriebenes überlebt halt ältere',
689  ],
690  ],
691  'excludePlatforms' => [],
692  ];
693 
694  yield 'uppercase ascii search word matches properly case-insensitive' => [
695  'searchWord' => '%KLEIN%',
696  'expectedRows' => [
697  0 => [
698  'uid' => 2,
699  'aCsvField' => 'Kleingeschriebenes überlebt halt ältere',
700  ],
701  ],
702  'excludePlatforms' => [],
703  ];
704  }
705 
706  #[DataProvider('likeReturnsExpectedDataSetsDataProvider')]
707  #[Test]
708 
713  public function ‪likeReturnsExpectedDataSets(string $searchWord, array $expectedRows, array $excludePlatforms): void
714  {
715  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderLikeAndNotLike.csv');
716  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
717  if ($excludePlatforms !== []) {
718  $platform = $queryBuilder->getConnection()->getDatabasePlatform();
719  foreach ($excludePlatforms as $excludePlatform) {
720  if ($platform instanceof $excludePlatform) {
721  self::markTestSkipped('Excluded platform ' . $excludePlatform);
722  }
723  }
724  }
725  $rows = $queryBuilder
726  ->select('uid', 'aCsvField')
727  ->from('tx_expressionbuildertest')
728  ->where(
729  // narrow down result set
730  $queryBuilder->expr()->eq('aField', $queryBuilder->createNamedParameter('likecasing')),
731  // this is what we are testing
732  $queryBuilder->expr()->like('aCsvField', $queryBuilder->createNamedParameter($searchWord))
733  )
734  ->executeQuery()
735  ->fetchAllAssociative();
736  self::assertSame($expectedRows, $rows);
737  }
738 
739  public static function ‪notLikeReturnsExpectedDataSetsDataProvider(): \Generator
740  {
741  yield 'lowercase search word filters german umlauts in upper and lower casing #1' => [
742  'searchWord' => '%Ãœberraschungen%',
743  'expectedRows' => [
744  0 => [
745  'uid' => 2,
746  'aCsvField' => 'Kleingeschriebenes überlebt halt ältere',
747  ],
748  ],
749  'excludePlatforms' => [
750  // Exclude sqlite due to german umlauts.
751  DoctrineSQLitePlatform::class,
752  ],
753  ];
754 
755  yield 'lowercase search word filters german umlauts in upper and lower casing #2' => [
756  'searchWord' => '%überraschungen%',
757  'expectedRows' => [
758  0 => [
759  'uid' => 2,
760  'aCsvField' => 'Kleingeschriebenes überlebt halt ältere',
761  ],
762  ],
763  'excludePlatforms' => [
764  // Exclude sqlite due to german umlauts.
765  DoctrineSQLitePlatform::class,
766  ],
767  ];
768 
769  yield 'lowercase ascii search word filters properly case-insensitive' => [
770  'searchWord' => '%klein%',
771  'expectedRows' => [
772  0 => [
773  'uid' => 1,
774  'aCsvField' => 'Fächer, Ãœberraschungen sind Äußerungen',
775  ],
776  ],
777  'excludePlatforms' => [],
778  ];
779  }
780 
781  public static function ‪likeWithWildcardValueCanBeMatchedDataProvider(): \Generator
782  {
783  yield 'escaped value with underscore matches properly' => [
784  // addcslashes() is used in escapeLikeWildcards()
785  'searchWord' => '%' . addcslashes('underscore_escape_can_be_matched', '%_') . '%',
786  'expectedRows' => [
787  0 => [
788  'uid' => 3,
789  'aCsvField' => 'underscore_escape_can_be_matched,second_value',
790  ],
791  ],
792  'excludePlatforms' => [],
793  ];
794 
795  yield 'escaped value with % matches properly' => [
796  // addcslashes() is used in escapeLikeWildcards()
797  'searchWord' => '%' . addcslashes('a % in', '%_') . '%',
798  'expectedRows' => [
799  0 => [
800  'uid' => 5,
801  'aCsvField' => 'Some value with a % in it',
802  ],
803  ],
804  'excludePlatforms' => [],
805  ];
806  }
807 
808  #[DataProvider('likeWithWildcardValueCanBeMatchedDataProvider')]
809  #[Test]
810  public function ‪likeWithWildcardValueCanBeMatched(string $searchWord, array $expectedRows, array $excludePlatforms): void
811  {
812  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderLikeAndNotLike.csv');
813  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
814  if ($excludePlatforms !== []) {
815  $platform = $queryBuilder->getConnection()->getDatabasePlatform();
816  foreach ($excludePlatforms as $excludePlatform) {
817  if ($platform instanceof $excludePlatform) {
818  self::markTestSkipped('Excluded platform ' . $excludePlatform);
819  }
820  }
821  }
822  $rows = $queryBuilder
823  ->select('uid', 'aCsvField')
824  ->from('tx_expressionbuildertest')
825  ->where(
826  // narrow down result set
827  $queryBuilder->expr()->eq('aField', $queryBuilder->createNamedParameter('likeescape')),
828  // this is what we are testing
829  $queryBuilder->expr()->like('aCsvField', $queryBuilder->createNamedParameter($searchWord))
830  )
831  ->executeQuery()
832  ->fetchAllAssociative();
833  self::assertSame($expectedRows, $rows);
834  }
835 
836  public static function ‪notLikeWithWildcardValueCanBeMatchedDataProvider(): \Generator
837  {
838  yield 'escaped value with underscore matches properly' => [
839  // addcslashes() is used in escapeLikeWildcards()
840  'searchWord' => '%' . addcslashes('underscore_escape_can_be_matched', '%_') . '%',
841  'expectedRows' => [
842  0 => [
843  'uid' => 4,
844  'aCsvField' => 'not_underscore_value',
845  ],
846  1 => [
847  'uid' => 5,
848  'aCsvField' => 'Some value with a % in it',
849  ],
850  ],
851  'excludePlatforms' => [],
852  ];
853 
854  yield 'escaped value with wildcard search word matches properly' => [
855  // addcslashes() is used in escapeLikeWildcards()
856  'searchWord' => '%' . addcslashes('a % in', '%_') . '%',
857  'expectedRows' => [
858  0 => [
859  'uid' => 3,
860  'aCsvField' => 'underscore_escape_can_be_matched,second_value',
861  ],
862  1 => [
863  'uid' => 4,
864  'aCsvField' => 'not_underscore_value',
865  ],
866  ],
867  'excludePlatforms' => [],
868  ];
869  }
870 
871  #[DataProvider('notLikeWithWildcardValueCanBeMatchedDataProvider')]
872  #[Test]
873  public function ‪notLikeWithWildcardValueCanBeMatched(string $searchWord, array $expectedRows, array $excludePlatforms): void
874  {
875  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderLikeAndNotLike.csv');
876  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
877  if ($excludePlatforms !== []) {
878  $platform = $queryBuilder->getConnection()->getDatabasePlatform();
879  foreach ($excludePlatforms as $excludePlatform) {
880  if ($platform instanceof $excludePlatform) {
881  self::markTestSkipped('Excluded platform ' . $excludePlatform);
882  }
883  }
884  }
885  $rows = $queryBuilder
886  ->select('uid', 'aCsvField')
887  ->from('tx_expressionbuildertest')
888  ->where(
889  // narrow down result set
890  $queryBuilder->expr()->eq('aField', $queryBuilder->createNamedParameter('likeescape')),
891  // this is what we are testing
892  $queryBuilder->expr()->notLike('aCsvField', $queryBuilder->createNamedParameter($searchWord))
893  )
894  ->executeQuery()
895  ->fetchAllAssociative();
896  self::assertSame($expectedRows, $rows);
897  }
898 
899  #[DataProvider('notLikeReturnsExpectedDataSetsDataProvider')]
900  #[Test]
901 
906  public function ‪notLikeReturnsExpectedDataSets(string $searchWord, array $expectedRows, array $excludePlatforms): void
907  {
908  self::assertTrue(true);
909  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderLikeAndNotLike.csv');
910  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_expressionbuildertest');
911  if ($excludePlatforms !== []) {
912  $platform = $queryBuilder->getConnection()->getDatabasePlatform();
913  foreach ($excludePlatforms as $excludePlatform) {
914  if ($platform instanceof $excludePlatform) {
915  self::markTestSkipped('Excluded platform ' . $excludePlatform);
916  }
917  }
918  }
919  $rows = $queryBuilder
920  ->select('uid', 'aCsvField')
921  ->from('tx_expressionbuildertest')
922  ->where(
923  // narrow down result set
924  $queryBuilder->expr()->eq('aField', $queryBuilder->createNamedParameter('likecasing')),
925  // this is what we are testing
926  $queryBuilder->expr()->notLike('aCsvField', $queryBuilder->createNamedParameter($searchWord))
927  )
928  ->executeQuery()
929  ->fetchAllAssociative();
930  self::assertSame($expectedRows, $rows);
931  }
932 
933  #[Test]
935  {
936  $connection = $this->getConnectionPool()->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME);
937 
938  $quoteChar = substr($connection->quote('__FAKE__'), 0, 1);
939  self::assertSame("'", $quoteChar, $connection->getDatabasePlatform()::class);
940  }
941 
942  public static function ‪concatReturnsExpectedResultDataProvider(): \Generator
943  {
944  yield 'only title' => [
945  'pageId' => 1,
946  'expectedRow' => [
947  'uid' => 1,
948  'pid' => 0,
949  'title' => 'only-title',
950  'subtitle' => '',
951  'combined_title' => 'only-title ',
952  ],
953  ];
954 
955  yield 'only subtitle' => [
956  'pageId' => 2,
957  'expectedRow' => [
958  'uid' => 2,
959  'pid' => 0,
960  'title' => '',
961  'subtitle' => 'only-subtitle',
962  'combined_title' => ' only-subtitle',
963  ],
964  ];
965 
966  yield 'title and subtitle' => [
967  'pageId' => 3,
968  'expectedRow' => [
969  'uid' => 3,
970  'pid' => 0,
971  'title' => 'title',
972  'subtitle' => 'subtitle',
973  'combined_title' => 'title subtitle',
974  ],
975  ];
976 
977  yield '123 and single space' => [
978  'pageId' => 4,
979  'expectedRow' => [
980  'uid' => 4,
981  'pid' => 0,
982  'title' => '123',
983  'subtitle' => ' ',
984  // Note: Two space is intended, one space from record subtitle and the space as concetenation separator
985  'combined_title' => '123 ',
986  ],
987  ];
988  }
989 
990  #[DataProvider('concatReturnsExpectedResultDataProvider')]
991  #[Test]
992  public function ‪concatReturnsExpectedResult(int $pageId, array $expectedRow): void
993  {
994  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderConcat.csv');
995  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('pages');
996  $row = $queryBuilder
997  ->select('uid', 'pid', 'title', 'subtitle')
998  ->addSelectLiteral(
999  $queryBuilder->expr()->concat(
1000  $queryBuilder->quoteIdentifier('title'),
1001  $queryBuilder->quote(' '),
1002  $queryBuilder->quoteIdentifier('subtitle'),
1003  ) . ' AS ' . $queryBuilder->quoteIdentifier('combined_title')
1004  )
1005  ->from('pages')
1006  ->where(
1007  $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT))
1008  )
1009  ->setMaxResults(1)
1010  ->executeQuery()
1011  ->fetchAssociative();
1012 
1013  self::assertIsArray($row);
1014  self::assertSame($expectedRow, $row);
1015  }
1016 
1017  public static function ‪castVarcharReturnsExpectedResultDataProvider(): \Generator
1018  {
1019  yield 'uid as string #1' => [
1020  'pageId' => 1,
1021  'field' => 'uid',
1022  'fields' => ['uid', 'pid', 'title', 'subtitle'],
1023  'length' => 11,
1024  'asIdentifier' => 'uidAsString',
1025  'expectedLength' => 1,
1026  'expectedRow' => [
1027  'uid' => 1,
1028  'pid' => 0,
1029  'title' => 'only-title',
1030  'subtitle' => '',
1031  'uidAsString' => '1',
1032  ],
1033  ];
1034 
1035  yield 'uid as string #2' => [
1036  'pageId' => 123456789,
1037  'field' => 'uid',
1038  'fields' => ['uid', 'pid', 'title', 'subtitle'],
1039  'length' => 11,
1040  'asIdentifier' => 'uidAsString',
1041  'expectedLength' => 9,
1042  'expectedRow' => [
1043  'uid' => 123456789,
1044  'pid' => 0,
1045  'title' => '123',
1046  'subtitle' => ' ',
1047  'uidAsString' => '123456789',
1048  ],
1049  ];
1050  }
1051 
1052  #[DataProvider('castVarcharReturnsExpectedResultDataProvider')]
1053  #[Test]
1054  public function ‪castVarcharReturnsExpectedResult(int $pageId, string $field, array ‪$fields, int $length, string $asIdentifier, int $expectedLength, array $expectedRow): void
1055  {
1056  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderCastVarchar.csv');
1057  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('pages');
1058  $row = $queryBuilder
1059  ->select('uid', 'pid', 'title', 'subtitle')
1060  ->addSelectLiteral(
1061  $queryBuilder->expr()->castVarchar($queryBuilder->quoteIdentifier($field), $length, $asIdentifier)
1062  )
1063  ->from('pages')
1064  ->where(
1065  $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($pageId, ‪Connection::PARAM_INT))
1066  )
1067  ->setMaxResults(1)
1068  ->executeQuery()
1069  ->fetchAssociative();
1070 
1071  self::assertIsArray($row);
1072  self::assertArrayHasKey($asIdentifier, $row);
1073  self::assertIsString($row[$asIdentifier]);
1074  self::assertSame($expectedLength, strlen($row[$asIdentifier]));
1075  self::assertSame($expectedRow, $row);
1076  }
1077 
1078  #[Test]
1079  public function ‪castIntReturnsExpectedResult(): void
1080  {
1081  $expectedRow = [
1082  'uid' => 1,
1083  'pid' => 0,
1084  'title' => '123',
1085  'subtitle' => '',
1086  'titleAsInteger' => 123,
1087  ];
1088  $this->importCSVDataSet(__DIR__ . '/../../Fixtures/DataSet/TestExpressionBuilderCastInt.csv');
1089  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('pages');
1090  $row = $queryBuilder
1091  ->select('uid', 'pid', 'title', 'subtitle')
1092  ->addSelectLiteral(
1093  $queryBuilder->expr()->castInt($queryBuilder->quoteIdentifier('title'), 'titleAsInteger')
1094  )
1095  ->from('pages')
1096  ->where(
1097  $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT))
1098  )
1099  ->setMaxResults(1)
1100  ->executeQuery()
1101  ->fetchAssociative();
1102 
1103  self::assertIsArray($row);
1104  self::assertArrayHasKey('titleAsInteger', $row);
1105  self::assertIsInt($row['titleAsInteger']);
1106  self::assertSame(123, $row['titleAsInteger']);
1107  self::assertSame($expectedRow, $row);
1108  }
1109 
1110  public static function ‪repeatReturnsExpectedResultDataProvider(): \Generator
1111  {
1112  // colon as repeat value
1113  yield 'Repeat ":" for 1 time with integer repeats number' => [
1114  'numberOfRepeats' => 1,
1115  'repeatValue' => ':',
1116  'expectedRepeatAsString' => ':',
1117  ];
1118  yield 'Repeat ":" for 5 times with integer repeats number' => [
1119  'numberOfRepeats' => 5,
1120  'repeatValue' => ':',
1121  'expectedRepeatAsString' => ':::::',
1122  ];
1123  yield 'Repeat ":" for 10 times with integer repeats number' => [
1124  'numberOfRepeats' => 10,
1125  'repeatValue' => ':',
1126  'expectedRepeatAsString' => '::::::::::',
1127  ];
1128  yield 'Repeat ":" for 20 times with integer repeats number' => [
1129  'numberOfRepeats' => 20,
1130  'repeatValue' => ':',
1131  'expectedRepeatAsString' => '::::::::::::::::::::',
1132  ];
1133  yield 'Repeat ":" for 1 times with string repeats number' => [
1134  'numberOfRepeats' => '1',
1135  'repeatValue' => ':',
1136  'expectedRepeatAsString' => ':',
1137  ];
1138  yield 'Repeat ":" for 5 times with string repeats number' => [
1139  'numberOfRepeats' => '5',
1140  'repeatValue' => ':',
1141  'expectedRepeatAsString' => ':::::',
1142  ];
1143  yield 'Repeat ":" for 10 times with string repeats number' => [
1144  'numberOfRepeats' => '10',
1145  'repeatValue' => ':',
1146  'expectedRepeatAsString' => '::::::::::',
1147  ];
1148  yield 'Repeat ":" for 20 times with string repeats number' => [
1149  'numberOfRepeats' => '20',
1150  'repeatValue' => ':',
1151  'expectedRepeatAsString' => '::::::::::::::::::::',
1152  ];
1153  yield 'Repeat ":" for 1 times with expression repeats number' => [
1154  'numberOfRepeats' => '0 + 1',
1155  'repeatValue' => ':',
1156  'expectedRepeatAsString' => ':',
1157  ];
1158  yield 'Repeat ":" for 5 times with expression repeats number' => [
1159  'numberOfRepeats' => '0 + 5',
1160  'repeatValue' => ':',
1161  'expectedRepeatAsString' => ':::::',
1162  ];
1163  yield 'Repeat ":" for 10 times with expression repeats number' => [
1164  'numberOfRepeats' => '0 + 10',
1165  'repeatValue' => ':',
1166  'expectedRepeatAsString' => '::::::::::',
1167  ];
1168  yield 'Repeat ":" for 20 times with expression repeats number' => [
1169  'numberOfRepeats' => '0 + 20',
1170  'repeatValue' => ':',
1171  'expectedRepeatAsString' => '::::::::::::::::::::',
1172  ];
1173  // space as repeat value
1174  yield 'Repeat " " for 1 times with integer repeats number' => [
1175  'numberOfRepeats' => 1,
1176  'repeatValue' => ' ',
1177  'expectedRepeatAsString' => ' ',
1178  ];
1179  yield 'Repeat " " for 5 times with integer repeats number' => [
1180  'numberOfRepeats' => 5,
1181  'repeatValue' => ' ',
1182  'expectedRepeatAsString' => ' ',
1183  ];
1184  yield 'Repeat " " for 10 times with integer repeats number' => [
1185  'numberOfRepeats' => 10,
1186  'repeatValue' => ' ',
1187  'expectedRepeatAsString' => ' ',
1188  ];
1189  yield 'Repeat " " for 20 times with integer repeats number' => [
1190  'numberOfRepeats' => 20,
1191  'repeatValue' => ' ',
1192  'expectedRepeatAsString' => ' ',
1193  ];
1194  yield 'Repeat " " for 1 times with string repeats number' => [
1195  'numberOfRepeats' => '1',
1196  'repeatValue' => ' ',
1197  'expectedRepeatAsString' => ' ',
1198  ];
1199  yield 'Repeat " " for 5 times with string repeats number' => [
1200  'numberOfRepeats' => '5',
1201  'repeatValue' => ' ',
1202  'expectedRepeatAsString' => ' ',
1203  ];
1204  yield 'Repeat " " for 10 times with string repeats number' => [
1205  'numberOfRepeats' => '10',
1206  'repeatValue' => ' ',
1207  'expectedRepeatAsString' => ' ',
1208  ];
1209  yield 'Repeat " " for 20 times with string repeats number' => [
1210  'numberOfRepeats' => '20',
1211  'repeatValue' => ' ',
1212  'expectedRepeatAsString' => ' ',
1213  ];
1214  yield 'Repeat " " for 1 times with expression repeats number' => [
1215  'numberOfRepeats' => '0 + 1',
1216  'repeatValue' => ' ',
1217  'expectedRepeatAsString' => ' ',
1218  ];
1219  yield 'Repeat " " for 5 times with expression repeats number' => [
1220  'numberOfRepeats' => '0 + 5',
1221  'repeatValue' => ' ',
1222  'expectedRepeatAsString' => ' ',
1223  ];
1224  yield 'Repeat " " for 10 times with expression repeats number' => [
1225  'numberOfRepeats' => '0 + 10',
1226  'repeatValue' => ' ',
1227  'expectedRepeatAsString' => ' ',
1228  ];
1229  yield 'Repeat " " for 20 times with expression repeats number' => [
1230  'numberOfRepeats' => '0 + 20',
1231  'repeatValue' => ' ',
1232  'expectedRepeatAsString' => ' ',
1233  ];
1234  }
1235 
1236  #[DataProvider('repeatReturnsExpectedResultDataProvider')]
1237  #[Test]
1238  public function ‪repeatReturnsExpectedResult(int|string $numberOfRepeats, string $repeatValue, string $expectedRepeatAsString): void
1239  {
1240  $queryBuilder = (new ‪ConnectionPool())->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME)->createQueryBuilder();
1241  $repeatValue = $queryBuilder->quote($repeatValue);
1242  $row = $queryBuilder
1243  ->selectLiteral(
1244  $queryBuilder->expr()->repeat($numberOfRepeats, $repeatValue, $queryBuilder->quoteIdentifier('repeatAsString'))
1245  )
1246  ->executeQuery()
1247  ->fetchAssociative();
1248 
1249  self::assertIsArray($row);
1250  self::assertSame($expectedRepeatAsString, $row['repeatAsString'] ?? null);
1251  }
1252 
1253  #[DataProvider('repeatReturnsExpectedResultDataProvider')]
1254  #[Test]
1255  public function ‪repeatWithValueExpressionReturnsExpectedResult(int|string $numberOfRepeats, string $repeatValue, string $expectedRepeatAsString): void
1256  {
1257  $queryBuilder = (new ‪ConnectionPool())->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME)->createQueryBuilder();
1258  $repeatValue = $queryBuilder->expr()->concat(
1259  $queryBuilder->quote(''),
1260  $queryBuilder->quote($repeatValue),
1261  $queryBuilder->quote(''),
1262  );
1263  $row = $queryBuilder
1264  ->selectLiteral(
1265  $queryBuilder->expr()->repeat($numberOfRepeats, $repeatValue, $queryBuilder->quoteIdentifier('repeatAsString'))
1266  )
1267  ->executeQuery()
1268  ->fetchAssociative();
1269 
1270  self::assertIsArray($row);
1271  self::assertSame($expectedRepeatAsString, $row['repeatAsString'] ?? null);
1272  }
1273 
1274  public static function ‪spaceReturnsCorrectNumberOfSpacesDataProvider(): \Generator
1275  {
1276  // integer repeat value
1277  yield 'one space with integer repeat' => ['numberOfSpaces' => 1, 'expectedSpacesString' => ' '];
1278  yield 'five spaces with integer repeat' => ['numberOfSpaces' => 5, 'expectedSpacesString' => ' '];
1279  yield 'ten spaces with integer repeat' => ['numberOfSpaces' => 10, 'expectedSpacesString' => ' '];
1280  yield 'twenty spaces with integer repeat' => ['numberOfSpaces' => 20, 'expectedSpacesString' => ' '];
1281  // string repeat value
1282  yield 'one space with string repeat' => ['numberOfSpaces' => '1', 'expectedSpacesString' => ' '];
1283  yield 'five spaces with string repeat' => ['numberOfSpaces' => '5', 'expectedSpacesString' => ' '];
1284  yield 'ten spaces with string repeat' => ['numberOfSpaces' => '10', 'expectedSpacesString' => ' '];
1285  yield 'twenty spaces with string repeat' => ['numberOfSpaces' => '20', 'expectedSpacesString' => ' '];
1286  // expression repeat value
1287  yield 'one space with expression repeat' => ['numberOfSpaces' => '0 + 1', 'expectedSpacesString' => ' '];
1288  yield 'five spaces with expression repeat' => ['numberOfSpaces' => '0 + 5', 'expectedSpacesString' => ' '];
1289  yield 'ten spaces with expression repeat' => ['numberOfSpaces' => '0 + 10', 'expectedSpacesString' => ' '];
1290  yield 'twenty spaces with expression repeat' => ['numberOfSpaces' => '0 + 20', 'expectedSpacesString' => ' '];
1291  }
1292 
1293  #[DataProvider('spaceReturnsCorrectNumberOfSpacesDataProvider')]
1294  #[Test]
1295  public function ‪spaceReturnsCorrectNumberOfSpaces(int|string $numberOfSpaces, string $expectedSpacesString): void
1296  {
1297  $queryBuilder = (new ‪ConnectionPool())->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME)->createQueryBuilder();
1298  $row = $queryBuilder
1299  ->selectLiteral(
1300  $queryBuilder->expr()->space($numberOfSpaces, 'spacesString')
1301  )
1302  ->executeQuery()
1303  ->fetchAssociative();
1304 
1305  self::assertIsArray($row);
1306  self::assertSame($expectedSpacesString, $row['spacesString'] ?? null);
1307  }
1308 
1309  public static function ‪leftReturnsExpectedResultDataProvider(): \Generator
1310  {
1311  yield 'string value with string length covered by full length' => [
1312  'length' => '4',
1313  'value' => 'some-string',
1314  'expectedValue' => 'some',
1315  ];
1316  yield 'int value with string length covered by full length' => [
1317  'length' => 4,
1318  'value' => 'some-string',
1319  'expectedValue' => 'some',
1320  ];
1321  yield 'string length exceeding full-value string value length returns full value' => [
1322  'length' => '100',
1323  'value' => 'some-string',
1324  'expectedValue' => 'some-string',
1325  ];
1326  yield 'int length exceeding full-value string value length returns full value' => [
1327  'length' => 100,
1328  'value' => 'some-string',
1329  'expectedValue' => 'some-string',
1330  ];
1331  yield 'Length sub-expression returns expected substring' => [
1332  'length' => '(1 + 3)',
1333  'value' => 'some-string',
1334  'expectedValue' => 'some',
1335  ];
1336  yield 'Length sub-expression exceeding full-value length returns full-value' => [
1337  'length' => '(2 * 2)',
1338  'value' => 'some-string',
1339  'expectedValue' => 'some',
1340  ];
1341  }
1342 
1343  #[DataProvider('leftReturnsExpectedResultDataProvider')]
1344  #[Test]
1345  public function ‪leftReturnsExpectedResult(int|string $length, string $value, string $expectedValue): void
1346  {
1347  $queryBuilder = (new ‪ConnectionPool())->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME)->createQueryBuilder();
1348  $row = $queryBuilder
1349  ->selectLiteral(
1350  $queryBuilder->expr()->left($length, $queryBuilder->quote($value)) . ' AS ' . $queryBuilder->quoteIdentifier('expectedValue'),
1351  )
1352  ->setMaxResults(1)
1353  ->executeQuery()
1354  ->fetchAssociative();
1355 
1356  self::assertIsArray($row);
1357  self::assertArrayHasKey('expectedValue', $row);
1358  self::assertIsString($row['expectedValue']);
1359  self::assertSame($expectedValue, $row['expectedValue']);
1360  }
1361 
1362  public static function ‪rightReturnsExpectedResultDataProvider(): \Generator
1363  {
1364  yield 'string value with string length covered by full length' => [
1365  'length' => '6',
1366  'value' => 'some-string',
1367  'expectedValue' => 'string',
1368  ];
1369  yield 'int value with string length covered by full length' => [
1370  'length' => 6,
1371  'value' => 'some-string',
1372  'expectedValue' => 'string',
1373  ];
1374  yield 'string length exceeding full-value string value length returns full value' => [
1375  'length' => '100',
1376  'value' => 'some-string',
1377  'expectedValue' => 'some-string',
1378  ];
1379  yield 'int length exceeding full-value string value length returns full value' => [
1380  'length' => 100,
1381  'value' => 'some-string',
1382  'expectedValue' => 'some-string',
1383  ];
1384  yield 'Length sub-expression returns expected substring' => [
1385  'length' => '(1 + 5)',
1386  'value' => 'some-string',
1387  'expectedValue' => 'string',
1388  ];
1389  yield 'Length sub-expression exceeding full-value length returns full-value' => [
1390  'length' => '(5 * 10)',
1391  'value' => 'some-string',
1392  'expectedValue' => 'some-string',
1393  ];
1394  }
1395 
1396  #[DataProvider('rightReturnsExpectedResultDataProvider')]
1397  #[Test]
1398  public function ‪rightReturnsExpectedResult(int|string $length, string $value, string $expectedValue): void
1399  {
1400  $queryBuilder = (new ‪ConnectionPool())->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME)->createQueryBuilder();
1401  $row = $queryBuilder
1402  ->selectLiteral(
1403  $queryBuilder->expr()->right($length, $queryBuilder->quote($value)) . ' AS ' . $queryBuilder->quoteIdentifier('expectedValue'),
1404  )
1405  ->setMaxResults(1)
1406  ->executeQuery()
1407  ->fetchAssociative();
1408 
1409  self::assertIsArray($row);
1410  self::assertArrayHasKey('expectedValue', $row);
1411  self::assertIsString($row['expectedValue']);
1412  self::assertSame($expectedValue, $row['expectedValue']);
1413  }
1414 
1415  public static function ‪leftPadReturnsExpectedResultDataProvider(): \Generator
1416  {
1417  yield 'value and int length returns expected left padded value if value is too short #1' => [
1418  'value' => '123',
1419  'length' => 5,
1420  'paddingValue' => '0',
1421  'expectedValue' => '00123',
1422  ];
1423  yield 'value and int length returns expected left padded value if value is too short #2' => [
1424  'value' => '123',
1425  'length' => 10,
1426  'paddingValue' => '.',
1427  'expectedValue' => '.......123',
1428  ];
1429  yield 'returns value cut to length if value length exceeds padding length' => [
1430  'value' => '1234567890',
1431  'length' => 5,
1432  'paddingValue' => '.',
1433  'expectedValue' => '12345',
1434  ];
1435  }
1436 
1437  #[DataProvider('leftPadReturnsExpectedResultDataProvider')]
1438  #[Test]
1439  public function ‪leftPadReturnsExpectedResult(string $value, int|string $length, string $paddingValue, string $expectedValue): void
1440  {
1441  $queryBuilder = (new ‪ConnectionPool())->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME)->createQueryBuilder();
1442  $row = $queryBuilder
1443  ->selectLiteral(
1444  $queryBuilder->expr()->leftPad($queryBuilder->quote($value), $length, $paddingValue, 'expectedValue'),
1445  )
1446  ->setMaxResults(1)
1447  ->executeQuery()
1448  ->fetchAssociative();
1449 
1450  self::assertIsArray($row);
1451  self::assertArrayHasKey('expectedValue', $row);
1452  self::assertIsString($row['expectedValue']);
1453  self::assertSame($expectedValue, $row['expectedValue']);
1454  }
1455 
1457  {
1458  yield 'value and int length returns expected left padded value if value is too short #1' => [
1459  'value' => ['1', '2', '3'],
1460  'length' => 5,
1461  'paddingValue' => '0',
1462  'expectedValue' => '00123',
1463  ];
1464  yield 'value and int length returns expected left padded value if value is too short #2' => [
1465  'value' => ['1', '2', '3'],
1466  'length' => 10,
1467  'paddingValue' => '.',
1468  'expectedValue' => '.......123',
1469  ];
1470  yield 'returns cutted value to length if value length exceeds padding length' => [
1471  'value' => ['1', '2', '3', '4', '5', '7', '8', '9', '0'],
1472  'length' => 5,
1473  'paddingValue' => '.',
1474  'expectedValue' => '12345',
1475  ];
1476  }
1477 
1478  #[DataProvider('leftPadWithValueSubexpressionReturnsExpectedResultDataProvider')]
1479  #[Test]
1480  public function ‪leftPadWithValueSubexpressionReturnsExpectedResult(array $value, int|string $length, string $paddingValue, string $expectedValue): void
1481  {
1482  $queryBuilder = (new ‪ConnectionPool())->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME)->createQueryBuilder();
1483  $value = array_map(fn($value) => $queryBuilder->quote($value), array_values($value));
1484  $row = $queryBuilder
1485  ->selectLiteral(
1486  $queryBuilder->expr()->leftPad($queryBuilder->expr()->concat(...$value), $length, $paddingValue, 'expectedValue'),
1487  )
1488  ->setMaxResults(1)
1489  ->executeQuery()
1490  ->fetchAssociative();
1491 
1492  self::assertIsArray($row);
1493  self::assertArrayHasKey('expectedValue', $row);
1494  self::assertIsString($row['expectedValue']);
1495  self::assertSame($expectedValue, $row['expectedValue']);
1496  }
1497 
1498  public static function ‪rightPadReturnsExpectedResultDataProvider(): \Generator
1499  {
1500  yield 'value and int length returns expected left padded value if value is too short #1' => [
1501  'value' => '123',
1502  'length' => 5,
1503  'paddingValue' => '0',
1504  'expectedValue' => '12300',
1505  ];
1506  yield 'value and int length returns expected left padded value if value is too short #2' => [
1507  'value' => '123',
1508  'length' => 10,
1509  'paddingValue' => '.',
1510  'expectedValue' => '123.......',
1511  ];
1512  yield 'returns cutted value to length if value length exceeds padding length' => [
1513  'value' => '1234567890',
1514  'length' => 5,
1515  'paddingValue' => '.',
1516  // Note: `RPAD` cuts the value from the left like LPAD, which is basically brain melting. Therefore,
1517  // this is adopted here to be concise with this behaviour.
1518  'expectedValue' => '12345',
1519  ];
1520  }
1521 
1522  #[DataProvider('rightPadReturnsExpectedResultDataProvider')]
1523  #[Test]
1524  public function ‪rightPadReturnsExpectedResult(string $value, int|string $length, string $paddingValue, string $expectedValue): void
1525  {
1526  $queryBuilder = (new ‪ConnectionPool())->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME)->createQueryBuilder();
1527  $row = $queryBuilder
1528  ->selectLiteral(
1529  $queryBuilder->expr()->rightPad($queryBuilder->quote($value), $length, $paddingValue, 'expectedValue')
1530  )
1531  ->setMaxResults(1)
1532  ->executeQuery()
1533  ->fetchAssociative();
1534 
1535  self::assertIsArray($row);
1536  self::assertArrayHasKey('expectedValue', $row);
1537  self::assertIsString($row['expectedValue']);
1538  self::assertSame($expectedValue, $row['expectedValue']);
1539  }
1540 
1541  #[DataProvider('rightPadReturnsExpectedResultDataProvider')]
1542  #[Test]
1543  public function ‪rightPadReturnsWithQuotedAliasExpectedResult(string $value, int|string $length, string $paddingValue, string $expectedValue): void
1544  {
1545  $queryBuilder = (new ‪ConnectionPool())->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME)->createQueryBuilder();
1546  $row = $queryBuilder
1547  ->selectLiteral(
1548  $queryBuilder->expr()->rightPad($queryBuilder->quote($value), $length, $paddingValue, $queryBuilder->quoteIdentifier('expectedValue'))
1549  )
1550  ->setMaxResults(1)
1551  ->executeQuery()
1552  ->fetchAssociative();
1553 
1554  self::assertIsArray($row);
1555  self::assertArrayHasKey('expectedValue', $row);
1556  self::assertIsString($row['expectedValue']);
1557  self::assertSame($expectedValue, $row['expectedValue']);
1558  }
1559 
1561  {
1562  yield 'value and int length returns expected left padded value if value is too short #1' => [
1563  'value' => ['1', '2', '3'],
1564  'length' => 5,
1565  'paddingValue' => '0',
1566  'expectedValue' => '12300',
1567  ];
1568  yield 'value and int length returns expected left padded value if value is too short #2' => [
1569  'value' => ['1', '2', '3'],
1570  'length' => 10,
1571  'paddingValue' => '.',
1572  'expectedValue' => '123.......',
1573  ];
1574  yield 'returns cutted value to length if value length exceeds padding length' => [
1575  'value' => ['1', '2', '3', '4', '5', '7', '8', '9', '0'],
1576  'length' => 5,
1577  'paddingValue' => '.',
1578  'expectedValue' => '12345',
1579  ];
1580  }
1581 
1582  #[DataProvider('rightPadWithValueSubexpressionReturnsExpectedResultDataProvider')]
1583  #[Test]
1584  public function ‪rightPadWithValueSubexpressionReturnsExpectedResult(array $value, int|string $length, string $paddingValue, string $expectedValue): void
1585  {
1586  $queryBuilder = (new ‪ConnectionPool())->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME)->createQueryBuilder();
1587  $value = array_map(fn($value) => $queryBuilder->quote($value), array_values($value));
1588  $row = $queryBuilder
1589  ->selectLiteral(
1590  $queryBuilder->expr()->rightPad($queryBuilder->expr()->concat(...$value), $length, $paddingValue, 'expectedValue'),
1591  )
1592  ->setMaxResults(1)
1593  ->executeQuery()
1594  ->fetchAssociative();
1595 
1596  self::assertIsArray($row);
1597  self::assertArrayHasKey('expectedValue', $row);
1598  self::assertIsString($row['expectedValue']);
1599  self::assertSame($expectedValue, $row['expectedValue']);
1600  }
1601 
1602  #[DataProvider('rightPadWithValueSubexpressionReturnsExpectedResultDataProvider')]
1603  #[Test]
1604  public function ‪rightPadWithValueSubexpressionWithQuotedAliasReturnsExpectedResult(array $value, int|string $length, string $paddingValue, string $expectedValue): void
1605  {
1606  $queryBuilder = (new ‪ConnectionPool())->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME)->createQueryBuilder();
1607  $value = array_map(fn($value) => $queryBuilder->quote($value), array_values($value));
1608  $row = $queryBuilder
1609  ->selectLiteral(
1610  $queryBuilder->expr()->rightPad($queryBuilder->expr()->concat(...$value), $length, $paddingValue, $queryBuilder->quoteIdentifier('expectedValue')),
1611  )
1612  ->setMaxResults(1)
1613  ->executeQuery()
1614  ->fetchAssociative();
1615 
1616  self::assertIsArray($row);
1617  self::assertArrayHasKey('expectedValue', $row);
1618  self::assertIsString($row['expectedValue']);
1619  self::assertSame($expectedValue, $row['expectedValue']);
1620  }
1621 
1622  #[Test]
1624  {
1625  self::expectExceptionCode(1709658914);
1626  self::expectException(\InvalidArgumentException::class);
1627 
1628  $queryBuilder = (new ‪ConnectionPool())->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME)->createQueryBuilder();
1629  $queryBuilder->expr()->leftPad('uid', 10, '');
1630  }
1631 
1632  #[Test]
1634  {
1635  self::expectExceptionCode(1709659006);
1636  self::expectException(\InvalidArgumentException::class);
1637 
1638  $queryBuilder = (new ‪ConnectionPool())->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME)->createQueryBuilder();
1639  $queryBuilder->expr()->leftPad('uid', 10, '..');
1640  }
1641 
1642  #[Test]
1644  {
1645  self::expectExceptionCode(1709664589);
1646  self::expectException(\InvalidArgumentException::class);
1647 
1648  $queryBuilder = (new ‪ConnectionPool())->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME)->createQueryBuilder();
1649  $queryBuilder->expr()->rightPad('uid', 10, '');
1650  }
1651 
1652  #[Test]
1654  {
1655  self::expectExceptionCode(1709664598);
1656  self::expectException(\InvalidArgumentException::class);
1657 
1658  $queryBuilder = (new ‪ConnectionPool())->getConnectionByName(‪ConnectionPool::DEFAULT_CONNECTION_NAME)->createQueryBuilder();
1659  $queryBuilder->expr()->rightPad('uid', 10, '..');
1660  }
1661 }
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\rightReturnsExpectedResult
‪rightReturnsExpectedResult(int|string $length, string $value, string $expectedValue)
Definition: ExpressionBuilderTest.php:1398
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\rightPadReturnsExpectedResult
‪rightPadReturnsExpectedResult(string $value, int|string $length, string $paddingValue, string $expectedValue)
Definition: ExpressionBuilderTest.php:1524
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\leftPadWithMultiCharacterPaddingValueThrowsInvalidArgumentException
‪leftPadWithMultiCharacterPaddingValueThrowsInvalidArgumentException()
Definition: ExpressionBuilderTest.php:1633
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\leftReturnsExpectedResultDataProvider
‪static leftReturnsExpectedResultDataProvider()
Definition: ExpressionBuilderTest.php:1309
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\inSetReturnsExpectedDataSetsIfValueContainsBracket
‪inSetReturnsExpectedDataSetsIfValueContainsBracket()
Definition: ExpressionBuilderTest.php:208
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:52
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\repeatReturnsExpectedResult
‪repeatReturnsExpectedResult(int|string $numberOfRepeats, string $repeatValue, string $expectedRepeatAsString)
Definition: ExpressionBuilderTest.php:1238
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\ensureThatExpectedQuoteCharUsedInUnquoteIsValid
‪ensureThatExpectedQuoteCharUsedInUnquoteIsValid()
Definition: ExpressionBuilderTest.php:934
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\leftReturnsExpectedResult
‪leftReturnsExpectedResult(int|string $length, string $value, string $expectedValue)
Definition: ExpressionBuilderTest.php:1345
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\likeWithWildcardValueCanBeMatchedDataProvider
‪static likeWithWildcardValueCanBeMatchedDataProvider()
Definition: ExpressionBuilderTest.php:781
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\rightPadWithValueSubexpressionReturnsExpectedResultDataProvider
‪static rightPadWithValueSubexpressionReturnsExpectedResultDataProvider()
Definition: ExpressionBuilderTest.php:1560
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\inSetReturnsExpectedDataSetsWithColumn
‪inSetReturnsExpectedDataSetsWithColumn()
Definition: ExpressionBuilderTest.php:34
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\notLikeReturnsExpectedDataSetsDataProvider
‪static notLikeReturnsExpectedDataSetsDataProvider()
Definition: ExpressionBuilderTest.php:739
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\likeReturnsExpectedDataSetsDataProvider
‪static likeReturnsExpectedDataSetsDataProvider()
Definition: ExpressionBuilderTest.php:635
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\notInSetReturnsExpectedDataSets
‪notInSetReturnsExpectedDataSets()
Definition: ExpressionBuilderTest.php:514
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\$testExtensionsToLoad
‪array $testExtensionsToLoad
Definition: ExpressionBuilderTest.php:29
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\notInSetReturnsExpectedDataSetsIfValueContainsLikeWildcard
‪notInSetReturnsExpectedDataSetsIfValueContainsLikeWildcard()
Definition: ExpressionBuilderTest.php:552
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\notLikeReturnsExpectedDataSets
‪notLikeReturnsExpectedDataSets(string $searchWord, array $expectedRows, array $excludePlatforms)
Definition: ExpressionBuilderTest.php:906
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\spaceReturnsCorrectNumberOfSpacesDataProvider
‪static spaceReturnsCorrectNumberOfSpacesDataProvider()
Definition: ExpressionBuilderTest.php:1274
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\inSetReturnsExpectedDataSetsIfValueContainsLikeWildcard
‪inSetReturnsExpectedDataSetsIfValueContainsLikeWildcard()
Definition: ExpressionBuilderTest.php:173
‪$fields
‪$fields
Definition: pages.php:5
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\notInSetReturnsExpectedDataSetsIfValueContainsClosingBracket
‪notInSetReturnsExpectedDataSetsIfValueContainsClosingBracket()
Definition: ExpressionBuilderTest.php:580
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\inSetReturnsExpectedDataSetsIfValueContainsBracketsAroundWord
‪inSetReturnsExpectedDataSetsIfValueContainsBracketsAroundWord()
Definition: ExpressionBuilderTest.php:313
‪TYPO3\CMS\Core\Database\ConnectionPool\DEFAULT_CONNECTION_NAME
‪const DEFAULT_CONNECTION_NAME
Definition: ConnectionPool.php:50
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\notInSetReturnsExpectedDataSetsIfValueContainsBracketsAroundWord
‪notInSetReturnsExpectedDataSetsIfValueContainsBracketsAroundWord()
Definition: ExpressionBuilderTest.php:608
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\inSetReturnsExpectedDataSetsWithInts
‪inSetReturnsExpectedDataSetsWithInts()
Definition: ExpressionBuilderTest.php:138
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\rightPadWithValueSubexpressionWithQuotedAliasReturnsExpectedResult
‪rightPadWithValueSubexpressionWithQuotedAliasReturnsExpectedResult(array $value, int|string $length, string $paddingValue, string $expectedValue)
Definition: ExpressionBuilderTest.php:1604
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\leftPadWithValueSubexpressionReturnsExpectedResult
‪leftPadWithValueSubexpressionReturnsExpectedResult(array $value, int|string $length, string $paddingValue, string $expectedValue)
Definition: ExpressionBuilderTest.php:1480
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\inSetReturnsExpectedDataSetsIfValueContainsOpeningAndClosingBracket
‪inSetReturnsExpectedDataSetsIfValueContainsOpeningAndClosingBracket()
Definition: ExpressionBuilderTest.php:278
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest
Definition: ExpressionBuilderTest.php:28
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\rightPadWithEmptyStringPaddingValueThrowsInvalidArgumentException
‪rightPadWithEmptyStringPaddingValueThrowsInvalidArgumentException()
Definition: ExpressionBuilderTest.php:1643
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\notInSetReturnsExpectedDataSetsIfValueContainsBracket
‪notInSetReturnsExpectedDataSetsIfValueContainsBracket()
Definition: ExpressionBuilderTest.php:566
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\castVarcharReturnsExpectedResultDataProvider
‪static castVarcharReturnsExpectedResultDataProvider()
Definition: ExpressionBuilderTest.php:1017
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\rightPadReturnsExpectedResultDataProvider
‪static rightPadReturnsExpectedResultDataProvider()
Definition: ExpressionBuilderTest.php:1498
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\rightPadWithMultiCharacterPaddingValueThrowsInvalidArgumentException
‪rightPadWithMultiCharacterPaddingValueThrowsInvalidArgumentException()
Definition: ExpressionBuilderTest.php:1653
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\inSetReturnsExpectedDataSets
‪inSetReturnsExpectedDataSets()
Definition: ExpressionBuilderTest.php:103
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\spaceReturnsCorrectNumberOfSpaces
‪spaceReturnsCorrectNumberOfSpaces(int|string $numberOfSpaces, string $expectedSpacesString)
Definition: ExpressionBuilderTest.php:1295
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\notLikeWithWildcardValueCanBeMatchedDataProvider
‪static notLikeWithWildcardValueCanBeMatchedDataProvider()
Definition: ExpressionBuilderTest.php:836
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\concatReturnsExpectedResult
‪concatReturnsExpectedResult(int $pageId, array $expectedRow)
Definition: ExpressionBuilderTest.php:992
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\likeWithWildcardValueCanBeMatched
‪likeWithWildcardValueCanBeMatched(string $searchWord, array $expectedRows, array $excludePlatforms)
Definition: ExpressionBuilderTest.php:810
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\notInSetReturnsExpectedDataSetsIfValueContainsOpeningAndClosingBracket
‪notInSetReturnsExpectedDataSetsIfValueContainsOpeningAndClosingBracket()
Definition: ExpressionBuilderTest.php:594
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\notInSetReturnsExpectedDataSetsWithInts
‪notInSetReturnsExpectedDataSetsWithInts()
Definition: ExpressionBuilderTest.php:538
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\leftPadReturnsExpectedResult
‪leftPadReturnsExpectedResult(string $value, int|string $length, string $paddingValue, string $expectedValue)
Definition: ExpressionBuilderTest.php:1439
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\leftPadWithEmptyStringPaddingValueThrowsInvalidArgumentException
‪leftPadWithEmptyStringPaddingValueThrowsInvalidArgumentException()
Definition: ExpressionBuilderTest.php:1623
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:41
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\rightPadReturnsWithQuotedAliasExpectedResult
‪rightPadReturnsWithQuotedAliasExpectedResult(string $value, int|string $length, string $paddingValue, string $expectedValue)
Definition: ExpressionBuilderTest.php:1543
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\notInSetReturnsExpectedDataSetsIfValueContainsBracketsAroundLikeWildcard
‪notInSetReturnsExpectedDataSetsIfValueContainsBracketsAroundLikeWildcard()
Definition: ExpressionBuilderTest.php:622
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\leftPadReturnsExpectedResultDataProvider
‪static leftPadReturnsExpectedResultDataProvider()
Definition: ExpressionBuilderTest.php:1415
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\inSetReturnsExpectedDataSetsIfValueContainsClosingBracket
‪inSetReturnsExpectedDataSetsIfValueContainsClosingBracket()
Definition: ExpressionBuilderTest.php:243
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\concatReturnsExpectedResultDataProvider
‪static concatReturnsExpectedResultDataProvider()
Definition: ExpressionBuilderTest.php:942
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression
Definition: ExpressionBuilderTest.php:18
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\rightPadWithValueSubexpressionReturnsExpectedResult
‪rightPadWithValueSubexpressionReturnsExpectedResult(array $value, int|string $length, string $paddingValue, string $expectedValue)
Definition: ExpressionBuilderTest.php:1584
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\castIntReturnsExpectedResult
‪castIntReturnsExpectedResult()
Definition: ExpressionBuilderTest.php:1079
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\notInSetReturnsExpectedDataSetsWithColumn
‪notInSetReturnsExpectedDataSetsWithColumn()
Definition: ExpressionBuilderTest.php:383
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\castVarcharReturnsExpectedResult
‪castVarcharReturnsExpectedResult(int $pageId, string $field, array $fields, int $length, string $asIdentifier, int $expectedLength, array $expectedRow)
Definition: ExpressionBuilderTest.php:1054
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\inSetReturnsExpectedDataSetsIfValueContainsBracketsAroundLikeWildcard
‪inSetReturnsExpectedDataSetsIfValueContainsBracketsAroundLikeWildcard()
Definition: ExpressionBuilderTest.php:348
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\repeatReturnsExpectedResultDataProvider
‪static repeatReturnsExpectedResultDataProvider()
Definition: ExpressionBuilderTest.php:1110
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\repeatWithValueExpressionReturnsExpectedResult
‪repeatWithValueExpressionReturnsExpectedResult(int|string $numberOfRepeats, string $repeatValue, string $expectedRepeatAsString)
Definition: ExpressionBuilderTest.php:1255
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\rightReturnsExpectedResultDataProvider
‪static rightReturnsExpectedResultDataProvider()
Definition: ExpressionBuilderTest.php:1362
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\notLikeWithWildcardValueCanBeMatched
‪notLikeWithWildcardValueCanBeMatched(string $searchWord, array $expectedRows, array $excludePlatforms)
Definition: ExpressionBuilderTest.php:873
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\likeReturnsExpectedDataSets
‪likeReturnsExpectedDataSets(string $searchWord, array $expectedRows, array $excludePlatforms)
Definition: ExpressionBuilderTest.php:713
‪TYPO3\CMS\Core\Tests\Functional\Database\Query\Expression\ExpressionBuilderTest\leftPadWithValueSubexpressionReturnsExpectedResultDataProvider
‪static leftPadWithValueSubexpressionReturnsExpectedResultDataProvider()
Definition: ExpressionBuilderTest.php:1456