Merge pull request #17006 from nextcloud/querybuilder-max-min

add MAX and MIN to functionbuilder
This commit is contained in:
Roeland Jago Douma 2019-09-07 11:09:11 +02:00 committed by GitHub
commit 1cfb851300
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 106 additions and 0 deletions

View File

@ -76,4 +76,12 @@ class FunctionBuilder implements IFunctionBuilder {
$alias = $alias ? (' AS ' . $this->helper->quoteColumnName($alias)) : '';
return new QueryFunction('COUNT(' . $this->helper->quoteColumnName($count) . ')' . $alias);
}
public function max($field) {
return new QueryFunction('MAX(' . $this->helper->quoteColumnName($field) . ')');
}
public function min($field) {
return new QueryFunction('MIN(' . $this->helper->quoteColumnName($field) . ')');
}
}

View File

@ -105,4 +105,24 @@ interface IFunctionBuilder {
* @since 14.0.0
*/
public function count($count, $alias = '');
/**
* Takes the maximum of all rows in a column
*
* @param mixed $field the column to maximum
*
* @return IQueryFunction
* @since 18.0.0
*/
public function max($field);
/**
* Takes the minimum of all rows in a column
*
* @param mixed $field the column to minimum
*
* @return IQueryFunction
* @since 18.0.0
*/
public function min($field);
}

View File

@ -120,4 +120,82 @@ class FunctionBuilderTest extends TestCase {
$this->assertGreaterThan(1, $query->execute()->fetchColumn());
}
private function setUpMinMax($value) {
$query = $this->connection->getQueryBuilder();
$query->insert('appconfig')
->values([
'appid' => $query->createNamedParameter('minmax'),
'configkey' => $query->createNamedParameter(uniqid()),
'configvalue' => $query->createNamedParameter((string)$value),
]);
$query->execute();
}
private function clearMinMax() {
$query = $this->connection->getQueryBuilder();
$query->delete('appconfig')
->where($query->expr()->eq('appid', $query->createNamedParameter('minmax')));
$query->execute();
}
public function testMaxEmpty() {
$this->clearMinMax();
$query = $this->connection->getQueryBuilder();
$query->select($query->func()->max($query->expr()->castColumn('configvalue', IQueryBuilder::PARAM_INT)));
$query->from('appconfig')
->where($query->expr()->eq('appid', $query->createNamedParameter('minmax')))
->setMaxResults(1);
$this->assertEquals(null, $query->execute()->fetchColumn());
}
public function testMinEmpty() {
$this->clearMinMax();
$query = $this->connection->getQueryBuilder();
$query->select($query->func()->min($query->expr()->castColumn('configvalue', IQueryBuilder::PARAM_INT)));
$query->from('appconfig')
->where($query->expr()->eq('appid', $query->createNamedParameter('minmax')))
->setMaxResults(1);
$this->assertEquals(null, $query->execute()->fetchColumn());
}
public function testMax() {
$this->clearMinMax();
$this->setUpMinMax(10);
$this->setUpMinMax(11);
$this->setUpMinMax(20);
$query = $this->connection->getQueryBuilder();
$query->select($query->func()->max($query->expr()->castColumn('configvalue', IQueryBuilder::PARAM_INT)));
$query->from('appconfig')
->where($query->expr()->eq('appid', $query->createNamedParameter('minmax')))
->setMaxResults(1);
$this->assertEquals(20, $query->execute()->fetchColumn());
}
public function testMin() {
$this->clearMinMax();
$this->setUpMinMax(10);
$this->setUpMinMax(11);
$this->setUpMinMax(20);
$query = $this->connection->getQueryBuilder();
$query->select($query->func()->min($query->expr()->castColumn('configvalue', IQueryBuilder::PARAM_INT)));
$query->from('appconfig')
->where($query->expr()->eq('appid', $query->createNamedParameter('minmax')))
->setMaxResults(1);
$this->assertEquals(10, $query->execute()->fetchColumn());
}
}