Skip to content

Commit c876551

Browse files
authored
Merge pull request #5 from byjg/5.0
Add Sort to the Dataset Array
2 parents a185418 + c4b58f8 commit c876551

File tree

5 files changed

+90
-13
lines changed

5 files changed

+90
-13
lines changed

composer.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66
"ByJG\\AnyDataset\\Lists\\": "src/"
77
}
88
},
9+
"autoload-dev": {
10+
"psr-4": {
11+
"Tests\\": "tests/"
12+
}
13+
},
914
"prefer-stable": true,
1015
"minimum-stability": "dev",
1116
"require": {

src/ArrayDataset.php

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use ByJG\AnyDataset\Core\GenericIterator;
66
use ByJG\AnyDataset\Core\IteratorFilter;
7+
use ByJG\AnyDataset\Core\Row;
78

89
class ArrayDataset
910
{
@@ -64,4 +65,49 @@ public function getIterator(IteratorFilter $filter = null): GenericIterator
6465
{
6566
return new ArrayDatasetIterator($this->array, $filter, $this->propertyIndexName, $this->propertyKeyName);
6667
}
68+
69+
/**
70+
*
71+
* @param string $field
72+
* @return void
73+
*/
74+
public function sort(string $field): void
75+
{
76+
if (count($this->array) == 0) {
77+
return;
78+
}
79+
80+
$this->array = $this->quickSortExec($this->array, $field);
81+
}
82+
83+
/**
84+
* @param Row[] $seq
85+
* @param string $field
86+
* @return array
87+
*/
88+
protected function quickSortExec(array $seq, string $field): array
89+
{
90+
if (!count($seq)) {
91+
return $seq;
92+
}
93+
94+
$key = $seq[0];
95+
$left = $right = array();
96+
97+
$cntSeq = count($seq);
98+
for ($i = 1; $i < $cntSeq; $i ++) {
99+
if (($seq[$i][$field] ?? null) <= ($key[$field] ?? null)) {
100+
$left[] = $seq[$i];
101+
} else {
102+
$right[] = $seq[$i];
103+
}
104+
}
105+
106+
return array_merge(
107+
$this->quickSortExec($left, $field),
108+
[ $key ],
109+
$this->quickSortExec($right, $field)
110+
);
111+
}
112+
67113
}

tests/ArrayDatasetTest.php

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
<?php
22

3-
namespace Tests\AnyDataset\Lists;
3+
namespace Tests;
44

55
use ByJG\AnyDataset\Core\Enum\Relation;
66
use ByJG\AnyDataset\Core\IteratorFilter;
77
use ByJG\AnyDataset\Core\IteratorInterface;
88
use ByJG\AnyDataset\Core\Row;
99
use ByJG\AnyDataset\Lists\ArrayDataset;
1010
use PHPUnit\Framework\TestCase;
11-
use Tests\AnyDataset\Sample\ModelGetter;
12-
use Tests\AnyDataset\Sample\ModelPublic;
13-
use UnexpectedValueException;
14-
15-
require_once "Sample/ModelGetter.php";
16-
require_once "Sample/ModelPublic.php";
11+
use Tests\Sample\ModelGetter;
12+
use Tests\Sample\ModelPublic;
1713

1814
class ArrayDatasetTest extends TestCase
1915
{
@@ -189,7 +185,7 @@ public function testnavigateFromModel1()
189185
$sr = $arrayIterator->moveNext();
190186
$this->assertField($sr, "__id", 0);
191187
$this->assertField($sr, "__key", 0);
192-
$this->assertField($sr, "__class", "Tests\\AnyDataset\\Sample\\ModelPublic");
188+
$this->assertField($sr, "__class", "Tests\\Sample\\ModelPublic");
193189
$this->assertField($sr, "id", 1);
194190
$this->assertField($sr, "name", 'ProdA');
195191
$count++;
@@ -198,7 +194,7 @@ public function testnavigateFromModel1()
198194
$sr = $arrayIterator->moveNext();
199195
$this->assertField($sr, "__id", 1);
200196
$this->assertField($sr, "__key", 1);
201-
$this->assertField($sr, "__class", "Tests\\AnyDataset\\Sample\\ModelPublic");
197+
$this->assertField($sr, "__class", "Tests\\Sample\\ModelPublic");
202198
$this->assertField($sr, "id", 2);
203199
$this->assertField($sr, "name", 'ProdB');
204200
$count++;
@@ -207,7 +203,7 @@ public function testnavigateFromModel1()
207203
$sr = $arrayIterator->moveNext();
208204
$this->assertField($sr, "__id", 2);
209205
$this->assertField($sr, "__key", 2);
210-
$this->assertField($sr, "__class", "Tests\\AnyDataset\\Sample\\ModelPublic");
206+
$this->assertField($sr, "__class", "Tests\\Sample\\ModelPublic");
211207
$this->assertField($sr, "id", 3);
212208
$this->assertField($sr, "name", 'ProdC');
213209
$count++;
@@ -235,7 +231,7 @@ public function testnavigateFilterFromModel1()
235231
$sr = $arrayIterator->moveNext();
236232
$this->assertField($sr, "__id", 1);
237233
$this->assertField($sr, "__key", 1);
238-
$this->assertField($sr, "__class", "Tests\\AnyDataset\\Sample\\ModelPublic");
234+
$this->assertField($sr, "__class", "Tests\\Sample\\ModelPublic");
239235
$this->assertField($sr, "id", 2);
240236
$this->assertField($sr, "name", 'ProdB');
241237
$count++;
@@ -374,5 +370,33 @@ public function testPropertyKeyNameEmpty()
374370
$row = $iterator->moveNext();
375371
$this->assertEquals(["value" => 'ProdA'], $row->toArray());
376372
}
373+
374+
public function testSort()
375+
{
376+
$array = [
377+
['name' => 'joao', 'age' => 41],
378+
['name' => 'fernanda', 'age' => 45],
379+
['name' => 'jf', 'age' => 15],
380+
['name' => 'jg jr', 'age' => 4]
381+
];
382+
383+
$dataset = new ArrayDataset($array);
384+
385+
$this->assertEquals([
386+
['__id' => 0, '__key' => 0, 'name' => 'joao', 'age' => 41],
387+
['__id' => 1, '__key' => 1, 'name' => 'fernanda', 'age' => 45],
388+
['__id' => 2, '__key' => 2, 'name' => 'jf', 'age' => 15],
389+
['__id' => 3, '__key' => 3, 'name' => 'jg jr', 'age' => 4]
390+
], $dataset->getIterator()->toArray());
391+
392+
$dataset->sort('age');
393+
394+
$this->assertEquals([
395+
['__id' => 0, '__key' => 0, 'name' => 'jg jr', 'age' => 4],
396+
['__id' => 1, '__key' => 1, 'name' => 'jf', 'age' => 15],
397+
['__id' => 2, '__key' => 2, 'name' => 'joao', 'age' => 41],
398+
['__id' => 3, '__key' => 3, 'name' => 'fernanda', 'age' => 45],
399+
], $dataset->getIterator()->toArray());
400+
}
377401
}
378402

tests/Sample/ModelGetter.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
22

3-
namespace Tests\AnyDataset\Sample;
3+
namespace Tests\Sample;
44

55
use ByJG\Serializer\BaseModel;
66

@@ -23,6 +23,7 @@ public function __construct($Id, $Name)
2323
{
2424
$this->_Id = $Id;
2525
$this->_Name = $Name;
26+
parent::__construct();
2627
}
2728

2829
public function getId()

tests/Sample/ModelPublic.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
22

3-
namespace Tests\AnyDataset\Sample;
3+
namespace Tests\Sample;
44

55
use ByJG\Serializer\BaseModel;
66

@@ -20,5 +20,6 @@ public function __construct($Id, $Name)
2020
{
2121
$this->Id = $Id;
2222
$this->Name = $Name;
23+
parent::__construct();
2324
}
2425
}

0 commit comments

Comments
 (0)