fix: flatten business data plan table stats

This commit is contained in:
WuYongJie 2026-09-07 12:48:00 +08:00
parent be670ad988
commit 90a0fd29f5
2 changed files with 45 additions and 2 deletions

View File

@ -80,10 +80,10 @@ class BusinessDataPlan extends Command
->where('TABLE_SCHEMA', $database)
->get(['TABLE_NAME', 'TABLE_ROWS', 'DATA_LENGTH', 'INDEX_LENGTH'])
->mapWithKeys(static fn (object $row): array => [
(string) $row->TABLE_NAME => [[
(string) $row->TABLE_NAME => [
'rows' => $row->TABLE_ROWS === null ? null : (int) $row->TABLE_ROWS,
'bytes' => (int) $row->DATA_LENGTH + (int) $row->INDEX_LENGTH,
]],
],
])->all();
}
}

View File

@ -0,0 +1,43 @@
<?php
namespace Tests\Unit\Console;
use App\Console\Commands\BusinessDataPlan;
use Illuminate\Database\ConnectionInterface;
use Illuminate\Database\Query\Builder;
use Illuminate\Support\Collection;
use Mockery;
use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;
use Modules\EcommerceFinance\Services\BusinessDataPlacement;
use PHPUnit\Framework\TestCase;
use ReflectionMethod;
class BusinessDataPlanTest extends TestCase
{
use MockeryPHPUnitIntegration;
public function test_mysql_table_statistics_are_keyed_by_their_flat_row_shape(): void
{
$connection = Mockery::mock(ConnectionInterface::class);
$query = Mockery::mock(Builder::class);
$placements = Mockery::mock(BusinessDataPlacement::class);
$placements->shouldReceive('connection')->once()->andReturn($connection);
$connection->shouldReceive('getDriverName')->once()->andReturn('mysql');
$connection->shouldReceive('getDatabaseName')->once()->andReturn('caiwu_business_mirror');
$connection->shouldReceive('table')->once()->with('information_schema.TABLES')->andReturn($query);
$query->shouldReceive('where')->once()->with('TABLE_SCHEMA', 'caiwu_business_mirror')->andReturnSelf();
$query->shouldReceive('get')->once()->with(['TABLE_NAME', 'TABLE_ROWS', 'DATA_LENGTH', 'INDEX_LENGTH'])
->andReturn(new Collection([(object) [
'TABLE_NAME' => 'fact_rows',
'TABLE_ROWS' => 123,
'DATA_LENGTH' => 4096,
'INDEX_LENGTH' => 1024,
]]));
$method = new ReflectionMethod(BusinessDataPlan::class, 'tableSizes');
$sizes = $method->invoke(new BusinessDataPlan(), $placements);
$this->assertSame(['rows' => 123, 'bytes' => 5120], $sizes['fact_rows']);
}
}