Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/Driver/Test/TestTableEntryGroup.php
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,10 @@ public function aggregateAndAlias(?array $fields, bool $collapse = true): static
} elseif ($field->function === SelectField::AVERAGE) {
$averageFields[$key]++;
$aggregatedEntry[$key] += $entry[$field->key] ?? 0;
} elseif ($field->function === SelectField::MIN) {
$aggregatedEntry[$key] = min($aggregatedEntry[$key] ?? PHP_INT_MAX, $entry[$field->key] ?? PHP_INT_MAX);
} elseif ($field->function === SelectField::MAX) {
$aggregatedEntry[$key] = max($aggregatedEntry[$key] ?? PHP_INT_MIN, $entry[$field->key] ?? PHP_INT_MIN);
}
}
}
Expand All @@ -135,4 +139,4 @@ public function aggregateAndAlias(?array $fields, bool $collapse = true): static

return $this;
}
}
}
8 changes: 7 additions & 1 deletion src/Query/Generator/SQL.php
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,12 @@ private function generateFields(Query $query): string
case SelectField::AVERAGE:
$fieldString .= "AVG(";
break;
case SelectField::MIN:
$fieldString .= "MIN(";
break;
case SelectField::MAX:
$fieldString .= "MAX(";
break;
}
}

Expand Down Expand Up @@ -290,4 +296,4 @@ private function generateValue(float|int|string|null|array $value): string

return $this->stringEnclosure . $value . $this->stringEnclosure;
}
}
}
29 changes: 29 additions & 0 deletions src/Query/MaxField.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace Aternos\Model\Query;

class MaxField extends SelectField
{
public ?int $function = self::MAX;

/**
* MaxField constructor.
*
* @param string|null $key
*/
public function __construct(?string $key = null)
{
parent::__construct($key);
$this->setAlias($key);
}

/**
* @param string|null $key
* @return static
*/
public function setKey(?string $key): static
{
$this->setAlias($key);
return parent::setKey($key);
}
}
29 changes: 29 additions & 0 deletions src/Query/MinField.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace Aternos\Model\Query;

class MinField extends SelectField
{
public ?int $function = self::MIN;

/**
* MinField constructor.
*
* @param string|null $key
*/
public function __construct(?string $key = null)
{
parent::__construct($key);
$this->setAlias($key);
}

/**
* @param string|null $key
* @return static
*/
public function setKey(?string $key): static
{
$this->setAlias($key);
return parent::setKey($key);
}
}
8 changes: 5 additions & 3 deletions src/Query/SelectField.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
*/
class SelectField extends Field
{
const COUNT = 0,
const int COUNT = 0,
SUM = 1,
AVERAGE = 2;
AVERAGE = 2,
MIN = 3,
MAX = 4;

/**
* @var string|null
Expand Down Expand Up @@ -57,4 +59,4 @@ public function setRaw(bool $raw = true): SelectField
$this->raw = $raw;
return $this;
}
}
}
40 changes: 40 additions & 0 deletions test/tests/SQLTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,46 @@ public function testSelectAVG()
$this->assertEquals("SELECT AVG(`number`) FROM `test`", $this->sql->generate($query));
}

public function testSelectMin()
{
$query = new SelectQuery(fields: [
(new SelectField('number'))->setFunction(SelectField::MIN),
]);
$query->modelClassName = TestModel::class;

$this->assertEquals("SELECT MIN(`number`) FROM `test`", $this->sql->generate($query));
}

public function testSelectMinAs()
{
$query = new SelectQuery(fields: [
(new SelectField('number'))->setFunction(SelectField::MIN)->setAlias('minNumber'),
]);
$query->modelClassName = TestModel::class;

$this->assertEquals("SELECT MIN(`number`) AS `minNumber` FROM `test`", $this->sql->generate($query));
}

public function testSelectMax()
{
$query = new SelectQuery(fields: [
(new SelectField('number'))->setFunction(SelectField::MAX),
]);
$query->modelClassName = TestModel::class;

$this->assertEquals("SELECT MAX(`number`) FROM `test`", $this->sql->generate($query));
}

public function testSelectMaxAs()
{
$query = new SelectQuery(fields: [
(new SelectField('number'))->setFunction(SelectField::MAX)->setAlias('maxNumber'),
]);
$query->modelClassName = TestModel::class;

$this->assertEquals("SELECT MAX(`number`) AS `maxNumber` FROM `test`", $this->sql->generate($query));
}

public function testSelectLimitNumber()
{
$query = new SelectQuery(limit:100);
Expand Down
54 changes: 53 additions & 1 deletion test/tests/TestDriverTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
use Aternos\Model\Driver\Test\TestDriver;
use Aternos\Model\Query\CountField;
use Aternos\Model\Query\DeleteQuery;
use Aternos\Model\Query\MaxField;
use Aternos\Model\Query\MinField;
use Aternos\Model\Query\OrderField;
use Aternos\Model\Query\SelectField;
use Aternos\Model\Query\SumField;
Expand Down Expand Up @@ -496,6 +498,56 @@ public function testSelectGroupAverage(): void
}
}

public function testSelectGroupMin(): void
{
$model = new TestModel();
$model->id = "-5A";
$model->text = "A";
$model->number = -5;
$model->save();

$models = TestModel::select(fields: [
new MinField("number"),
new SelectField("number"),
new SelectField("text"),
], group: ["text"]);

$this->assertTrue($models->wasSuccessful());
$this->assertCount(10, $models);
foreach ($models as $model) {
if ($model->text === "A") {
$this->assertEquals(-5, $model->getField("number"));
} else {
$this->assertEquals($model->number, $model->getField("number"));
}
}
}

public function testSelectGroupMax(): void
{
$model = new TestModel();
$model->id = "5A";
$model->text = "A";
$model->number = 5;
$model->save();

$models = TestModel::select(fields: [
new MaxField("number"),
new SelectField("number"),
new SelectField("text"),
], group: ["text"]);

$this->assertTrue($models->wasSuccessful());
$this->assertCount(10, $models);
foreach ($models as $model) {
if ($model->text === "A") {
$this->assertEquals(5, $model->getField("number"));
} else {
$this->assertEquals($model->number, $model->getField("number"));
}
}
}

/**
* @return void
* @throws Exception
Expand Down Expand Up @@ -554,4 +606,4 @@ protected function tearDown(): void
{
TestModel::clearTestEntries();
}
}
}
Loading