From c4b58f8f8307749bd6781926c0cddbae38e8d527 Mon Sep 17 00:00:00 2001 From: Joao Gilberto Magalhaes Date: Thu, 5 Dec 2024 13:18:14 -0600 Subject: [PATCH] Add Sort to the Dataset Array --- composer.json | 5 ++++ src/ArrayDataset.php | 46 ++++++++++++++++++++++++++++++++++++ tests/ArrayDatasetTest.php | 46 +++++++++++++++++++++++++++--------- tests/Sample/ModelGetter.php | 3 ++- tests/Sample/ModelPublic.php | 3 ++- 5 files changed, 90 insertions(+), 13 deletions(-) diff --git a/composer.json b/composer.json index 4a4dede..3dbc44a 100644 --- a/composer.json +++ b/composer.json @@ -6,6 +6,11 @@ "ByJG\\AnyDataset\\Lists\\": "src/" } }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, "prefer-stable": true, "minimum-stability": "dev", "require": { diff --git a/src/ArrayDataset.php b/src/ArrayDataset.php index 5a81f65..1a1a002 100644 --- a/src/ArrayDataset.php +++ b/src/ArrayDataset.php @@ -4,6 +4,7 @@ use ByJG\AnyDataset\Core\GenericIterator; use ByJG\AnyDataset\Core\IteratorFilter; +use ByJG\AnyDataset\Core\Row; class ArrayDataset { @@ -64,4 +65,49 @@ public function getIterator(IteratorFilter $filter = null): GenericIterator { return new ArrayDatasetIterator($this->array, $filter, $this->propertyIndexName, $this->propertyKeyName); } + + /** + * + * @param string $field + * @return void + */ + public function sort(string $field): void + { + if (count($this->array) == 0) { + return; + } + + $this->array = $this->quickSortExec($this->array, $field); + } + + /** + * @param Row[] $seq + * @param string $field + * @return array + */ + protected function quickSortExec(array $seq, string $field): array + { + if (!count($seq)) { + return $seq; + } + + $key = $seq[0]; + $left = $right = array(); + + $cntSeq = count($seq); + for ($i = 1; $i < $cntSeq; $i ++) { + if (($seq[$i][$field] ?? null) <= ($key[$field] ?? null)) { + $left[] = $seq[$i]; + } else { + $right[] = $seq[$i]; + } + } + + return array_merge( + $this->quickSortExec($left, $field), + [ $key ], + $this->quickSortExec($right, $field) + ); + } + } diff --git a/tests/ArrayDatasetTest.php b/tests/ArrayDatasetTest.php index 74e1c24..ec14a39 100644 --- a/tests/ArrayDatasetTest.php +++ b/tests/ArrayDatasetTest.php @@ -1,6 +1,6 @@ moveNext(); $this->assertField($sr, "__id", 0); $this->assertField($sr, "__key", 0); - $this->assertField($sr, "__class", "Tests\\AnyDataset\\Sample\\ModelPublic"); + $this->assertField($sr, "__class", "Tests\\Sample\\ModelPublic"); $this->assertField($sr, "id", 1); $this->assertField($sr, "name", 'ProdA'); $count++; @@ -198,7 +194,7 @@ public function testnavigateFromModel1() $sr = $arrayIterator->moveNext(); $this->assertField($sr, "__id", 1); $this->assertField($sr, "__key", 1); - $this->assertField($sr, "__class", "Tests\\AnyDataset\\Sample\\ModelPublic"); + $this->assertField($sr, "__class", "Tests\\Sample\\ModelPublic"); $this->assertField($sr, "id", 2); $this->assertField($sr, "name", 'ProdB'); $count++; @@ -207,7 +203,7 @@ public function testnavigateFromModel1() $sr = $arrayIterator->moveNext(); $this->assertField($sr, "__id", 2); $this->assertField($sr, "__key", 2); - $this->assertField($sr, "__class", "Tests\\AnyDataset\\Sample\\ModelPublic"); + $this->assertField($sr, "__class", "Tests\\Sample\\ModelPublic"); $this->assertField($sr, "id", 3); $this->assertField($sr, "name", 'ProdC'); $count++; @@ -235,7 +231,7 @@ public function testnavigateFilterFromModel1() $sr = $arrayIterator->moveNext(); $this->assertField($sr, "__id", 1); $this->assertField($sr, "__key", 1); - $this->assertField($sr, "__class", "Tests\\AnyDataset\\Sample\\ModelPublic"); + $this->assertField($sr, "__class", "Tests\\Sample\\ModelPublic"); $this->assertField($sr, "id", 2); $this->assertField($sr, "name", 'ProdB'); $count++; @@ -374,5 +370,33 @@ public function testPropertyKeyNameEmpty() $row = $iterator->moveNext(); $this->assertEquals(["value" => 'ProdA'], $row->toArray()); } + + public function testSort() + { + $array = [ + ['name' => 'joao', 'age' => 41], + ['name' => 'fernanda', 'age' => 45], + ['name' => 'jf', 'age' => 15], + ['name' => 'jg jr', 'age' => 4] + ]; + + $dataset = new ArrayDataset($array); + + $this->assertEquals([ + ['__id' => 0, '__key' => 0, 'name' => 'joao', 'age' => 41], + ['__id' => 1, '__key' => 1, 'name' => 'fernanda', 'age' => 45], + ['__id' => 2, '__key' => 2, 'name' => 'jf', 'age' => 15], + ['__id' => 3, '__key' => 3, 'name' => 'jg jr', 'age' => 4] + ], $dataset->getIterator()->toArray()); + + $dataset->sort('age'); + + $this->assertEquals([ + ['__id' => 0, '__key' => 0, 'name' => 'jg jr', 'age' => 4], + ['__id' => 1, '__key' => 1, 'name' => 'jf', 'age' => 15], + ['__id' => 2, '__key' => 2, 'name' => 'joao', 'age' => 41], + ['__id' => 3, '__key' => 3, 'name' => 'fernanda', 'age' => 45], + ], $dataset->getIterator()->toArray()); + } } diff --git a/tests/Sample/ModelGetter.php b/tests/Sample/ModelGetter.php index 73a2bb6..f38c570 100644 --- a/tests/Sample/ModelGetter.php +++ b/tests/Sample/ModelGetter.php @@ -1,6 +1,6 @@ _Id = $Id; $this->_Name = $Name; + parent::__construct(); } public function getId() diff --git a/tests/Sample/ModelPublic.php b/tests/Sample/ModelPublic.php index adc36c6..3bcb691 100644 --- a/tests/Sample/ModelPublic.php +++ b/tests/Sample/ModelPublic.php @@ -1,6 +1,6 @@ Id = $Id; $this->Name = $Name; + parent::__construct(); } }