mirror of
https://github.com/Icinga/icingaweb2-module-director.git
synced 2025-07-31 01:34:12 +02:00
PlainObjectPropertyDiff: diff calculation
This commit is contained in:
parent
654f845e4e
commit
2f1a47c34a
50
library/Director/Db/Branch/PlainObjectPropertyDiff.php
Normal file
50
library/Director/Db/Branch/PlainObjectPropertyDiff.php
Normal file
@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
namespace Icinga\Module\Director\Db\Branch;
|
||||
|
||||
class PlainObjectPropertyDiff
|
||||
{
|
||||
public static function calculate(array $old = null, array $new = null)
|
||||
{
|
||||
if ($new === null) {
|
||||
throw new \RuntimeException('Cannot diff for delete');
|
||||
}
|
||||
if ($old === null) {
|
||||
foreach (BranchSettings::ENCODED_DICTIONARIES as $property) {
|
||||
self::flattenProperty($new, $property);
|
||||
}
|
||||
|
||||
return $new;
|
||||
}
|
||||
$unchangedKeys = [];
|
||||
foreach (BranchSettings::ENCODED_DICTIONARIES as $property) {
|
||||
self::flattenProperty($old, $property);
|
||||
self::flattenProperty($new, $property);
|
||||
}
|
||||
foreach ($old as $key => $value) {
|
||||
if (array_key_exists($key, $new)) {
|
||||
if ($value === $new[$key]) {
|
||||
$unchangedKeys[] = $key;
|
||||
}
|
||||
} else {
|
||||
$new[$key] = null;
|
||||
}
|
||||
}
|
||||
foreach ($unchangedKeys as $key) {
|
||||
unset($new[$key]);
|
||||
}
|
||||
|
||||
return $new;
|
||||
}
|
||||
|
||||
protected static function flattenProperty(array &$properties, $property)
|
||||
{
|
||||
// TODO: dots in varnames -> throw or escape?
|
||||
if (isset($properties[$property])) {
|
||||
foreach ((array) $properties[$property] as $key => $value) {
|
||||
$properties["$property.$key"] = $value;
|
||||
}
|
||||
unset($properties[$property]);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user