add LEAST and GREATER to db function builder

Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
Robin Appelman 2019-11-06 11:38:47 +01:00 committed by Roeland Jago Douma
parent dfe85ae0c2
commit 9e450d727a
No known key found for this signature in database
GPG Key ID: F941078878347C0C
4 changed files with 67 additions and 0 deletions

View File

@ -85,4 +85,12 @@ class FunctionBuilder implements IFunctionBuilder {
public function min($field) { public function min($field) {
return new QueryFunction('MIN(' . $this->helper->quoteColumnName($field) . ')'); return new QueryFunction('MIN(' . $this->helper->quoteColumnName($field) . ')');
} }
public function greatest($x, $y) {
return new QueryFunction('GREATEST(' . $this->helper->quoteColumnName($x) . ', ' . $this->helper->quoteColumnName($y) . ')');
}
public function least($x, $y) {
return new QueryFunction('LEAST(' . $this->helper->quoteColumnName($x) . ', ' . $this->helper->quoteColumnName($y) . ')');
}
} }

View File

@ -30,4 +30,13 @@ class SqliteFunctionBuilder extends FunctionBuilder {
public function concat($x, $y) { public function concat($x, $y) {
return new QueryFunction('(' . $this->helper->quoteColumnName($x) . ' || ' . $this->helper->quoteColumnName($y) . ')'); return new QueryFunction('(' . $this->helper->quoteColumnName($x) . ' || ' . $this->helper->quoteColumnName($y) . ')');
} }
public function greatest($x, $y) {
return new QueryFunction('MAX(' . $this->helper->quoteColumnName($x) . ', ' . $this->helper->quoteColumnName($y) . ')');
}
public function least($x, $y) {
return new QueryFunction('MIN(' . $this->helper->quoteColumnName($x) . ', ' . $this->helper->quoteColumnName($y) . ')');
}
} }

View File

@ -109,6 +109,8 @@ interface IFunctionBuilder {
/** /**
* Takes the maximum of all rows in a column * Takes the maximum of all rows in a column
* *
* If you want to get the maximum value of multiple columns in the same row, use `greatest` instead
*
* @param mixed $field the column to maximum * @param mixed $field the column to maximum
* *
* @return IQueryFunction * @return IQueryFunction
@ -119,10 +121,38 @@ interface IFunctionBuilder {
/** /**
* Takes the minimum of all rows in a column * Takes the minimum of all rows in a column
* *
* If you want to get the minimum value of multiple columns in the same row, use `least` instead
*
* @param mixed $field the column to minimum * @param mixed $field the column to minimum
* *
* @return IQueryFunction * @return IQueryFunction
* @since 18.0.0 * @since 18.0.0
*/ */
public function min($field); public function min($field);
/**
* Takes the maximum of multiple values
*
* If you want to get the maximum value of all rows in a column, use `max` instead
*
* @param mixed $x the first input field or number
* @param mixed $y the first input field or number
*
* @return IQueryFunction
* @since 18.0.0
*/
public function greatest($x, $y);
/**
* Takes the minimum of multiple values
*
* If you want to get the minimum value of all rows in a column, use `min` instead
*
* @param mixed $x the first input field or number
* @param mixed $y the first input field or number
*
* @return IQueryFunction
* @since 18.0.0
*/
public function least($x, $y);
} }

View File

@ -198,4 +198,24 @@ class FunctionBuilderTest extends TestCase {
$this->assertEquals(10, $query->execute()->fetchColumn()); $this->assertEquals(10, $query->execute()->fetchColumn());
} }
public function testGreatest() {
$query = $this->connection->getQueryBuilder();
$query->select($query->func()->greatest($query->createNamedParameter(2, IQueryBuilder::PARAM_INT), new Literal(1)));
$query->from('appconfig')
->setMaxResults(1);
$this->assertEquals(2, $query->execute()->fetchColumn());
}
public function testLeast() {
$query = $this->connection->getQueryBuilder();
$query->select($query->func()->least($query->createNamedParameter(2, IQueryBuilder::PARAM_INT), new Literal(1)));
$query->from('appconfig')
->setMaxResults(1);
$this->assertEquals(1, $query->execute()->fetchColumn());
}
} }