Skip to content

Commit f607925

Browse files
author
Mauro Cassani
committed
Fix on ConsistencyChecker
1 parent 87b45c0 commit f607925

11 files changed

+248
-77
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -279,14 +279,14 @@ $qb = QueryBuilder::create($array);
279279
$qb
280280
->addCriterion('name as n', 'Ervin Howell')
281281
->addCriterion('username as user', 'Antonette')
282-
->addCriterion('address.street as add', 'Victor Plains');
282+
->addCriterion('address.street as street', 'Victor Plains');
283283

284284
foreach ($qb->getResults() as $element){
285285
// ...
286286
// now you have
287287
// $element['n']
288288
// $element['user']
289-
// $element['add']['street']
289+
// $element['street']
290290
}
291291
```
292292

src/Filters/AbstractFilter.php

+3-22
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
use ArrayQuery\Constants;
1414
use ArrayQuery\Exceptions\NotValidKeyElementInArrayException;
15-
use ArrayQuery\Helpers\ArrayConverter;
15+
use ArrayQuery\Helpers\ArrayHelper;
1616

1717
abstract class AbstractFilter
1818
{
@@ -25,29 +25,10 @@ protected static function getArrayElementValueFromKey($key, $arrayElement)
2525
{
2626
return self::getValueFromKeysArray(
2727
explode(Constants::ARRAY_SEPARATOR, $key),
28-
(is_object($arrayElement)) ? self::convertObjectToArray($arrayElement) : $arrayElement
28+
(is_object($arrayElement)) ? ArrayHelper::convertObjectToArray($arrayElement) : $arrayElement
2929
);
3030
}
3131

32-
/**
33-
* @param $arrayElement
34-
* @return array
35-
*/
36-
private static function convertObjectToArray($arrayElement)
37-
{
38-
$convertedArray = [];
39-
40-
foreach (ArrayConverter::convertToPlainArray($arrayElement) as $key => $element) {
41-
$key = explode("\\", $key);
42-
$key = end($key);
43-
$key = explode("\000", $key);
44-
45-
$convertedArray[end($key)] = $element;
46-
}
47-
48-
return $convertedArray;
49-
}
50-
5132
/**
5233
* @param $keysArray
5334
* @param $arrayElement
@@ -59,7 +40,7 @@ private static function getValueFromKeysArray($keysArray, $arrayElement)
5940
if (count($keysArray)>1) {
6041
$key = array_shift($keysArray);
6142

62-
return self::getValueFromKeysArray($keysArray, ArrayConverter::convertToPlainArray($arrayElement[$key]));
43+
return self::getValueFromKeysArray($keysArray, ArrayHelper::convertToPlainArray($arrayElement[$key]));
6344
}
6445

6546
if (!isset($arrayElement[$keysArray[0]])) {

src/Filters/Criterion/InArrayFilter.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
namespace ArrayQuery\Filters\Criterion;
1212

13-
use ArrayQuery\Helpers\ArrayConverter;
13+
use ArrayQuery\Helpers\ArrayHelper;
1414

1515
class InArrayFilter implements FilterInterface
1616
{
@@ -21,6 +21,6 @@ class InArrayFilter implements FilterInterface
2121
*/
2222
public function match($value, $valueToCompare, $dateFormat = null)
2323
{
24-
return in_array($value, ArrayConverter::convertToPlainArray($valueToCompare));
24+
return in_array($value, ArrayHelper::convertToPlainArray($valueToCompare));
2525
}
2626
}

src/Filters/Criterion/InArrayInversedFilter.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
namespace ArrayQuery\Filters\Criterion;
1212

13-
use ArrayQuery\Helpers\ArrayConverter;
13+
use ArrayQuery\Helpers\ArrayHelper;
1414

1515
class InArrayInversedFilter implements FilterInterface
1616
{
@@ -21,6 +21,6 @@ class InArrayInversedFilter implements FilterInterface
2121
*/
2222
public function match($value, $valueToCompare, $dateFormat = null)
2323
{
24-
return in_array($valueToCompare, ArrayConverter::convertToPlainArray($value));
24+
return in_array($valueToCompare, ArrayHelper::convertToPlainArray($value));
2525
}
2626
}

src/Helpers/ArrayConverter.php

-32
This file was deleted.

src/Helpers/ArrayHelper.php

+111
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
<?php
2+
/**
3+
* This file is part of the ArrayQuery package.
4+
*
5+
* (c) Mauro Cassani<https://github.com/mauretto78>
6+
*
7+
* For the full copyright and license information, please view the LICENSE
8+
* file that was distributed with this source code.
9+
*/
10+
11+
namespace ArrayQuery\Helpers;
12+
13+
class ArrayHelper
14+
{
15+
/**
16+
* @param $firstArray
17+
* @param $secondArray
18+
* @return bool
19+
*/
20+
public static function checkIfTwoArraysAreConsistent($firstArray, $secondArray)
21+
{
22+
if (count(array_diff($firstArray, $secondArray)) > 0 || count(array_diff($secondArray, $firstArray)) > 0) {
23+
return false;
24+
}
25+
26+
return true;
27+
}
28+
29+
/**
30+
* @param $itemToCompare
31+
* @param $element
32+
* @return bool
33+
*/
34+
public static function compareElementToItemKeyMap($itemToCompare, $element)
35+
{
36+
foreach ($itemToCompare as $key => $item){
37+
if(is_array($item) && ArrayHelper::isAnAssociativeArray($item)){
38+
if (false === ArrayHelper::checkIfTwoArraysAreConsistent(array_keys($item), array_keys($element[$key]))) {
39+
return false;
40+
}
41+
42+
return self::compareElementToItemKeyMap($item, $element[$key]);
43+
}
44+
}
45+
}
46+
47+
/**
48+
* @param $arrayElement
49+
* @return array
50+
*/
51+
public static function convertObjectToArray($arrayElement)
52+
{
53+
$convertedArray = [];
54+
55+
foreach (self::convertToPlainArray($arrayElement) as $key => $element) {
56+
$key = explode("\\", $key);
57+
$key = end($key);
58+
$key = explode("\000", $key);
59+
60+
$convertedArray[end($key)] = $element;
61+
}
62+
63+
return $convertedArray;
64+
}
65+
66+
/**
67+
* @param $array
68+
* @return mixed
69+
*/
70+
public static function convertToObjectArray($array)
71+
{
72+
return json_decode(json_encode($array));
73+
}
74+
75+
/**
76+
* @param $array
77+
* @return mixed
78+
*/
79+
public static function convertToPlainArray($array)
80+
{
81+
return json_decode(json_encode($array), true);
82+
}
83+
84+
/**
85+
* @param $key
86+
* @param $array
87+
* @return mixed
88+
*/
89+
public static function getValueFromNestedArray(array $key, array $array)
90+
{
91+
array_shift($key);
92+
$value = $array[$key[0]];
93+
94+
if(is_array($value)){
95+
return self::getValueFromNestedArray($key, $value);
96+
}
97+
98+
return $value;
99+
}
100+
101+
/**
102+
* @param array $array
103+
* @return bool
104+
*/
105+
public static function isAnAssociativeArray(array $array)
106+
{
107+
if ([] === $array) return false;
108+
109+
return array_keys($array) !== range(0, count($array) - 1);
110+
}
111+
}

src/Helpers/ConsistencyChecker.php

+8-5
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,21 @@ public static function isElementValid($element, $array)
2121
{
2222
foreach ($array as $key => $item) {
2323
if (is_object($item)) {
24-
$array[$key] = ArrayConverter::convertToPlainArray($item);
24+
$array[$key] = ArrayHelper::convertToPlainArray($item);
2525
}
2626
}
2727

2828
if (is_object($element)) {
29-
$element = ArrayConverter::convertToPlainArray($element);
29+
$element = ArrayHelper::convertToPlainArray($element);
3030
}
3131

32-
$FirstItemKeyMap = array_keys(current($array));
33-
$ItemKeyMap = array_keys($element);
32+
$firstItem = current($array);
3433

35-
if (count(array_diff($FirstItemKeyMap, $ItemKeyMap)) > 0 || count(array_diff($ItemKeyMap, $FirstItemKeyMap)) > 0) {
34+
if (false === ArrayHelper::checkIfTwoArraysAreConsistent(array_keys($firstItem), array_keys($element))) {
35+
return false;
36+
}
37+
38+
if(false === ArrayHelper::compareElementToItemKeyMap($firstItem, $element)) {
3639
return false;
3740
}
3841

src/QueryBuilder.php

+7-5
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
use ArrayQuery\Filters\JoinFilter;
2323
use ArrayQuery\Filters\SortingFilter;
2424
use ArrayQuery\Filters\LimitFilter;
25-
use ArrayQuery\Helpers\ArrayConverter;
25+
use ArrayQuery\Helpers\ArrayHelper;
2626
use ArrayQuery\Helpers\ConsistencyChecker;
2727

2828
class QueryBuilder
@@ -239,7 +239,7 @@ public function getResults()
239239
{
240240
$results = $this->applySortingFilter($this->applyLimitFilter($this->applyCriteriaFilter($this->applyJoinFilter())));
241241

242-
return array_map([ArrayConverter::class, 'convertToPlainArray'], $results);
242+
return array_map([ArrayHelper::class, 'convertToPlainArray'], $results);
243243
}
244244

245245
/**
@@ -334,10 +334,12 @@ private function applyCriteriaFilter(array $array)
334334
$oldkey = explode(Constants::ARRAY_SEPARATOR, $key[0]);
335335
$newkey = $key[1];
336336

337-
$result = ArrayConverter::convertToPlainArray($result);
338-
$result[$newkey] = $result[$oldkey[0]];
339-
unset($result[$oldkey[0]]);
337+
$result = ArrayHelper::convertToPlainArray($result);
338+
$oldResult = $result[$oldkey[0]];
339+
340+
$result[$newkey] = (count($oldkey) > 1) ? ArrayHelper::getValueFromNestedArray($oldkey, $oldResult) : $oldResult;
340341
}
342+
341343
return $result;
342344
}, $results);
343345
}

tests/ArrayConverterTest.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
namespace ArrayQuery\Tests;
1212

13-
use ArrayQuery\Helpers\ArrayConverter;
13+
use ArrayQuery\Helpers\ArrayHelper;
1414
use PHPUnit\Framework\TestCase;
1515

1616
class ArrayConverterTest extends TestCase
@@ -45,7 +45,7 @@ public function it_converts_a_plain_array_in_an_object_array()
4545
],
4646
];
4747

48-
$objectArray = ArrayConverter::convertToObjectArray($array);
48+
$objectArray = ArrayHelper::convertToObjectArray($array);
4949
foreach ($objectArray as $item) {
5050
$this->assertInstanceOf(\stdClass::class, $item);
5151
}
@@ -71,7 +71,7 @@ public function it_converts_an_object_array_in_a_plain_array()
7171
$b
7272
];
7373

74-
$plainArray = ArrayConverter::convertToPlainArray($array);
74+
$plainArray = ArrayHelper::convertToPlainArray($array);
7575
foreach ($plainArray as $item) {
7676
$this->assertTrue(is_array($item));
7777
}

tests/ConsistencyCheckerTest.php

+45
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,51 @@ public function it_returns_false_if_an_not_consistent_array_is_provided()
6060
$this->assertFalse(ConsistencyChecker::isValid($array));
6161
}
6262

63+
/**
64+
* @test
65+
*/
66+
public function it_returns_false_if_an_not_consistent_array_with_nested_keys_is_provided()
67+
{
68+
$array = [
69+
[
70+
'id' => 1,
71+
'name' => 'Mauro Cassani',
72+
'skills' => [
73+
'web' => [
74+
'php' => 5,
75+
'web_design' => 5,
76+
'css' => 4,
77+
]
78+
],
79+
],
80+
[
81+
'id' => 2,
82+
'name' => 'John Doe',
83+
'skills' => [
84+
'web' => [
85+
'php' => 3,
86+
'web_design' => 1,
87+
'css' => 5,
88+
]
89+
],
90+
],
91+
[
92+
'id' => 3,
93+
'name' => 'Maria Callas',
94+
'skills' => [
95+
'web' => [
96+
'php' => 1,
97+
'web_design' => 3,
98+
'css' => 3,
99+
'extra' => 55,
100+
]
101+
],
102+
],
103+
];
104+
105+
$this->assertFalse(ConsistencyChecker::isValid($array));
106+
}
107+
63108
/**
64109
* @test
65110
*/

0 commit comments

Comments
 (0)