Merge pull request #3248 from appwrite/feat-improve-migration-speed
feat: improve migration speed
This commit is contained in:
commit
ba7f655de9
2 changed files with 109 additions and 41 deletions
|
@ -124,21 +124,7 @@ abstract class Migration
|
||||||
$old = $document->getArrayCopy();
|
$old = $document->getArrayCopy();
|
||||||
$new = call_user_func($callback, $document);
|
$new = call_user_func($callback, $document);
|
||||||
|
|
||||||
foreach ($document as &$attr) {
|
if (!self::hasDifference($new->getArrayCopy(), $old)) {
|
||||||
if ($attr instanceof Document) {
|
|
||||||
$attr = call_user_func($callback, $attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (\is_array($attr)) {
|
|
||||||
foreach ($attr as &$child) {
|
|
||||||
if ($child instanceof Document) {
|
|
||||||
$child = call_user_func($callback, $child);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$this->check_diff_multi($new->getArrayCopy(), $old)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,32 +156,25 @@ abstract class Migration
|
||||||
*
|
*
|
||||||
* @param array $array1
|
* @param array $array1
|
||||||
* @param array $array2
|
* @param array $array2
|
||||||
* @return array
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function check_diff_multi(array $array1, array $array2): array
|
public static function hasDifference(array $array1, array $array2): bool
|
||||||
{
|
{
|
||||||
$result = array();
|
foreach ($array1 as $key => $value) {
|
||||||
|
if (is_array($value)) {
|
||||||
foreach ($array1 as $key => $val) {
|
if (!isset($array2[$key]) || !is_array($array2[$key])) {
|
||||||
if (is_array($val) && isset($array2[$key])) {
|
return true;
|
||||||
$tmp = $this->check_diff_multi($val, $array2[$key]);
|
} else {
|
||||||
if ($tmp) {
|
if (self::hasDifference($value, $array2[$key])) {
|
||||||
$result[$key] = $tmp;
|
return true;
|
||||||
}
|
}
|
||||||
} elseif (!isset($array2[$key])) {
|
|
||||||
$result[$key] = null;
|
|
||||||
} elseif ($val !== $array2[$key]) {
|
|
||||||
$result[$key] = $array2[$key];
|
|
||||||
}
|
}
|
||||||
|
} elseif (!array_key_exists($key, $array2) || $array2[$key] !== $value) {
|
||||||
if (isset($array2[$key])) {
|
return true;
|
||||||
unset($array2[$key]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$result = array_merge($result, $array2);
|
return false;
|
||||||
|
|
||||||
return $result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -4,6 +4,7 @@ namespace Appwrite\Tests;
|
||||||
|
|
||||||
use Appwrite\Migration\Migration;
|
use Appwrite\Migration\Migration;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use ReflectionClass;
|
||||||
use ReflectionMethod;
|
use ReflectionMethod;
|
||||||
use Utopia\Database\Document;
|
use Utopia\Database\Document;
|
||||||
|
|
||||||
|
@ -36,12 +37,100 @@ abstract class MigrationTest extends TestCase
|
||||||
*/
|
*/
|
||||||
public function testMigrationVersions()
|
public function testMigrationVersions()
|
||||||
{
|
{
|
||||||
require_once __DIR__.'/../../../app/init.php';
|
require_once __DIR__ . '/../../../app/init.php';
|
||||||
|
|
||||||
foreach (Migration::$versions as $class) {
|
foreach (Migration::$versions as $class) {
|
||||||
$this->assertTrue(class_exists('Appwrite\\Migration\\Version\\'.$class));
|
$this->assertTrue(class_exists('Appwrite\\Migration\\Version\\' . $class));
|
||||||
}
|
}
|
||||||
// Test if current version exists
|
// Test if current version exists
|
||||||
//$this->assertArrayHasKey(APP_VERSION_STABLE, Migration::$versions);
|
$this->assertArrayHasKey(APP_VERSION_STABLE, Migration::$versions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testHasDifference()
|
||||||
|
{
|
||||||
|
$this->assertFalse(Migration::hasDifference([], []));
|
||||||
|
$this->assertFalse(Migration::hasDifference([
|
||||||
|
'bool' => true,
|
||||||
|
'string' => 'abc',
|
||||||
|
'int' => 123,
|
||||||
|
'array' => ['a', 'b', 'c'],
|
||||||
|
'assoc' => [
|
||||||
|
'a' => true,
|
||||||
|
'b' => 'abc',
|
||||||
|
'c' => 123,
|
||||||
|
'd' => ['a', 'b', 'c']
|
||||||
|
]
|
||||||
|
], [
|
||||||
|
'bool' => true,
|
||||||
|
'string' => 'abc',
|
||||||
|
'int' => 123,
|
||||||
|
'array' => ['a', 'b', 'c'],
|
||||||
|
'assoc' => [
|
||||||
|
'a' => true,
|
||||||
|
'b' => 'abc',
|
||||||
|
'c' => 123,
|
||||||
|
'd' => ['a', 'b', 'c']
|
||||||
|
]
|
||||||
|
]));
|
||||||
|
$this->assertFalse(Migration::hasDifference([
|
||||||
|
'bool' => true,
|
||||||
|
'string' => 'abc',
|
||||||
|
'int' => 123,
|
||||||
|
'array' => ['a', 'b', 'c'],
|
||||||
|
'assoc' => [
|
||||||
|
'a' => true,
|
||||||
|
'b' => 'abc',
|
||||||
|
'c' => 123,
|
||||||
|
'd' => ['a', 'b', 'c']
|
||||||
|
]
|
||||||
|
], [
|
||||||
|
'string' => 'abc',
|
||||||
|
'assoc' => [
|
||||||
|
'a' => true,
|
||||||
|
'b' => 'abc',
|
||||||
|
'c' => 123,
|
||||||
|
'd' => ['a', 'b', 'c']
|
||||||
|
],
|
||||||
|
'int' => 123,
|
||||||
|
'array' => ['a', 'b', 'c'],
|
||||||
|
'bool' => true,
|
||||||
|
|
||||||
|
]));
|
||||||
|
$this->assertTrue(Migration::hasDifference([
|
||||||
|
'a' => true
|
||||||
|
], [
|
||||||
|
'b' => true
|
||||||
|
]));
|
||||||
|
$this->assertTrue(Migration::hasDifference([
|
||||||
|
'a' => 'true'
|
||||||
|
], [
|
||||||
|
'a' => true
|
||||||
|
]));
|
||||||
|
$this->assertTrue(Migration::hasDifference([
|
||||||
|
'a' => true
|
||||||
|
], [
|
||||||
|
'a' => false
|
||||||
|
]));
|
||||||
|
$this->assertTrue(Migration::hasDifference([
|
||||||
|
'nested' => [
|
||||||
|
'a' => true
|
||||||
|
]
|
||||||
|
], [
|
||||||
|
'nested' => []
|
||||||
|
]));
|
||||||
|
$this->assertTrue(Migration::hasDifference([
|
||||||
|
'assoc' => [
|
||||||
|
'bool' => true,
|
||||||
|
'string' => 'abc',
|
||||||
|
'int' => 123,
|
||||||
|
'array' => ['a', 'b', 'c']
|
||||||
|
]
|
||||||
|
], [
|
||||||
|
'nested' => [
|
||||||
|
'a' => true,
|
||||||
|
'int' => '123',
|
||||||
|
'array' => ['a', 'b', 'c']
|
||||||
|
]
|
||||||
|
]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue