Merge pull request #24230 from nextcloud/backport/24007/stable20

[stable20] allow selecting multiple columns with SELECT DISTINCT
This commit is contained in:
Morris Jobke 2020-11-20 14:27:27 +01:00 committed by GitHub
commit e0e3334fc2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 45 additions and 1 deletions

View File

@ -435,8 +435,14 @@ class QueryBuilder implements IQueryBuilder {
* @return $this This QueryBuilder instance.
*/
public function selectDistinct($select) {
if (!is_array($select)) {
$select = [$select];
}
$quotedSelect = $this->helper->quoteColumnNames($select);
$this->queryBuilder->addSelect(
'DISTINCT ' . $this->helper->quoteColumnName($select)
'DISTINCT ' . implode(', ', $quotedSelect)
);
return $this;

View File

@ -314,6 +314,44 @@ class QueryBuilderTest extends \Test\TestCase {
$this->deleteTestingRows('testFirstResult2');
}
public function testSelectDistinctMultiple() {
$this->deleteTestingRows('testFirstResult1');
$this->deleteTestingRows('testFirstResult2');
$this->createTestingRows('testFirstResult1');
$this->createTestingRows('testFirstResult2');
$this->queryBuilder->selectDistinct(['appid', 'configkey']);
$this->queryBuilder->from('*PREFIX*appconfig')
->where($this->queryBuilder->expr()->eq(
'appid',
$this->queryBuilder->expr()->literal('testFirstResult1')
))
->orderBy('appid', 'DESC');
$query = $this->queryBuilder->execute();
$rows = $query->fetchAll();
$query->closeCursor();
$this->assertEquals(
[
['appid' => 'testFirstResult1', 'configkey' => 'testing1'],
['appid' => 'testFirstResult1', 'configkey' => 'testing2'],
['appid' => 'testFirstResult1', 'configkey' => 'testing3'],
['appid' => 'testFirstResult1', 'configkey' => 'testing4'],
['appid' => 'testFirstResult1', 'configkey' => 'testing5'],
['appid' => 'testFirstResult1', 'configkey' => 'testing6'],
['appid' => 'testFirstResult1', 'configkey' => 'testing7'],
['appid' => 'testFirstResult1', 'configkey' => 'testing8'],
['appid' => 'testFirstResult1', 'configkey' => 'testing9'],
],
$rows
);
$this->deleteTestingRows('testFirstResult1');
$this->deleteTestingRows('testFirstResult2');
}
public function dataAddSelect() {
$config = $this->createMock(SystemConfig::class);
$logger = $this->createMock(ILogger::class);