Skip to content

Commit 33a0679

Browse files
authored
Merge pull request #16 from JulianVennen/min-max
Add min and max functions
2 parents b42441b + c8abd90 commit 33a0679

File tree

7 files changed

+168
-6
lines changed

7 files changed

+168
-6
lines changed

src/Driver/Test/TestTableEntryGroup.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@ public function aggregateAndAlias(?array $fields, bool $collapse = true): static
110110
} elseif ($field->function === SelectField::AVERAGE) {
111111
$averageFields[$key]++;
112112
$aggregatedEntry[$key] += $entry[$field->key] ?? 0;
113+
} elseif ($field->function === SelectField::MIN) {
114+
$aggregatedEntry[$key] = min($aggregatedEntry[$key] ?? PHP_INT_MAX, $entry[$field->key] ?? PHP_INT_MAX);
115+
} elseif ($field->function === SelectField::MAX) {
116+
$aggregatedEntry[$key] = max($aggregatedEntry[$key] ?? PHP_INT_MIN, $entry[$field->key] ?? PHP_INT_MIN);
113117
}
114118
}
115119
}
@@ -135,4 +139,4 @@ public function aggregateAndAlias(?array $fields, bool $collapse = true): static
135139

136140
return $this;
137141
}
138-
}
142+
}

src/Query/Generator/SQL.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,12 @@ private function generateFields(Query $query): string
217217
case SelectField::AVERAGE:
218218
$fieldString .= "AVG(";
219219
break;
220+
case SelectField::MIN:
221+
$fieldString .= "MIN(";
222+
break;
223+
case SelectField::MAX:
224+
$fieldString .= "MAX(";
225+
break;
220226
}
221227
}
222228

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

291297
return $this->stringEnclosure . $value . $this->stringEnclosure;
292298
}
293-
}
299+
}

src/Query/MaxField.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace Aternos\Model\Query;
4+
5+
class MaxField extends SelectField
6+
{
7+
public ?int $function = self::MAX;
8+
9+
/**
10+
* MaxField constructor.
11+
*
12+
* @param string|null $key
13+
*/
14+
public function __construct(?string $key = null)
15+
{
16+
parent::__construct($key);
17+
$this->setAlias($key);
18+
}
19+
20+
/**
21+
* @param string|null $key
22+
* @return static
23+
*/
24+
public function setKey(?string $key): static
25+
{
26+
$this->setAlias($key);
27+
return parent::setKey($key);
28+
}
29+
}

src/Query/MinField.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace Aternos\Model\Query;
4+
5+
class MinField extends SelectField
6+
{
7+
public ?int $function = self::MIN;
8+
9+
/**
10+
* MinField constructor.
11+
*
12+
* @param string|null $key
13+
*/
14+
public function __construct(?string $key = null)
15+
{
16+
parent::__construct($key);
17+
$this->setAlias($key);
18+
}
19+
20+
/**
21+
* @param string|null $key
22+
* @return static
23+
*/
24+
public function setKey(?string $key): static
25+
{
26+
$this->setAlias($key);
27+
return parent::setKey($key);
28+
}
29+
}

src/Query/SelectField.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
*/
1010
class SelectField extends Field
1111
{
12-
const COUNT = 0,
12+
const int COUNT = 0,
1313
SUM = 1,
14-
AVERAGE = 2;
14+
AVERAGE = 2,
15+
MIN = 3,
16+
MAX = 4;
1517

1618
/**
1719
* @var string|null
@@ -57,4 +59,4 @@ public function setRaw(bool $raw = true): SelectField
5759
$this->raw = $raw;
5860
return $this;
5961
}
60-
}
62+
}

test/tests/SQLTest.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,46 @@ public function testSelectAVG()
226226
$this->assertEquals("SELECT AVG(`number`) FROM `test`", $this->sql->generate($query));
227227
}
228228

229+
public function testSelectMin()
230+
{
231+
$query = new SelectQuery(fields: [
232+
(new SelectField('number'))->setFunction(SelectField::MIN),
233+
]);
234+
$query->modelClassName = TestModel::class;
235+
236+
$this->assertEquals("SELECT MIN(`number`) FROM `test`", $this->sql->generate($query));
237+
}
238+
239+
public function testSelectMinAs()
240+
{
241+
$query = new SelectQuery(fields: [
242+
(new SelectField('number'))->setFunction(SelectField::MIN)->setAlias('minNumber'),
243+
]);
244+
$query->modelClassName = TestModel::class;
245+
246+
$this->assertEquals("SELECT MIN(`number`) AS `minNumber` FROM `test`", $this->sql->generate($query));
247+
}
248+
249+
public function testSelectMax()
250+
{
251+
$query = new SelectQuery(fields: [
252+
(new SelectField('number'))->setFunction(SelectField::MAX),
253+
]);
254+
$query->modelClassName = TestModel::class;
255+
256+
$this->assertEquals("SELECT MAX(`number`) FROM `test`", $this->sql->generate($query));
257+
}
258+
259+
public function testSelectMaxAs()
260+
{
261+
$query = new SelectQuery(fields: [
262+
(new SelectField('number'))->setFunction(SelectField::MAX)->setAlias('maxNumber'),
263+
]);
264+
$query->modelClassName = TestModel::class;
265+
266+
$this->assertEquals("SELECT MAX(`number`) AS `maxNumber` FROM `test`", $this->sql->generate($query));
267+
}
268+
229269
public function testSelectLimitNumber()
230270
{
231271
$query = new SelectQuery(limit:100);

test/tests/TestDriverTest.php

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
use Aternos\Model\Driver\Test\TestDriver;
77
use Aternos\Model\Query\CountField;
88
use Aternos\Model\Query\DeleteQuery;
9+
use Aternos\Model\Query\MaxField;
10+
use Aternos\Model\Query\MinField;
911
use Aternos\Model\Query\OrderField;
1012
use Aternos\Model\Query\SelectField;
1113
use Aternos\Model\Query\SumField;
@@ -496,6 +498,56 @@ public function testSelectGroupAverage(): void
496498
}
497499
}
498500

501+
public function testSelectGroupMin(): void
502+
{
503+
$model = new TestModel();
504+
$model->id = "-5A";
505+
$model->text = "A";
506+
$model->number = -5;
507+
$model->save();
508+
509+
$models = TestModel::select(fields: [
510+
new MinField("number"),
511+
new SelectField("number"),
512+
new SelectField("text"),
513+
], group: ["text"]);
514+
515+
$this->assertTrue($models->wasSuccessful());
516+
$this->assertCount(10, $models);
517+
foreach ($models as $model) {
518+
if ($model->text === "A") {
519+
$this->assertEquals(-5, $model->getField("number"));
520+
} else {
521+
$this->assertEquals($model->number, $model->getField("number"));
522+
}
523+
}
524+
}
525+
526+
public function testSelectGroupMax(): void
527+
{
528+
$model = new TestModel();
529+
$model->id = "5A";
530+
$model->text = "A";
531+
$model->number = 5;
532+
$model->save();
533+
534+
$models = TestModel::select(fields: [
535+
new MaxField("number"),
536+
new SelectField("number"),
537+
new SelectField("text"),
538+
], group: ["text"]);
539+
540+
$this->assertTrue($models->wasSuccessful());
541+
$this->assertCount(10, $models);
542+
foreach ($models as $model) {
543+
if ($model->text === "A") {
544+
$this->assertEquals(5, $model->getField("number"));
545+
} else {
546+
$this->assertEquals($model->number, $model->getField("number"));
547+
}
548+
}
549+
}
550+
499551
/**
500552
* @return void
501553
* @throws Exception
@@ -554,4 +606,4 @@ protected function tearDown(): void
554606
{
555607
TestModel::clearTestEntries();
556608
}
557-
}
609+
}

0 commit comments

Comments
 (0)