Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Commands/RebalancePositionsCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ private function rebalanceAllNeeded(
$this->newLine();

foreach ($columnsNeedingRebalancing as $columnId) {
$stats = $rebalancer->getGapStatistics($query, $columnField, (string) $columnId, $positionField);
$stats = $rebalancer->getGapStatistics($query, $columnField, $columnId, $positionField);
$this->line(" - {$columnId}: {$stats['count']} records, {$stats['small_gaps']} small gaps");
}

Expand Down
30 changes: 3 additions & 27 deletions src/Commands/RepairPositionsCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Illuminate\Support\Facades\DB;
use Relaticle\Flowforge\Services\DecimalPosition;

use function Illuminate\Support\enum_value;
use function Laravel\Prompts\confirm;
use function Laravel\Prompts\info;
use function Laravel\Prompts\select;
Expand Down Expand Up @@ -154,29 +155,6 @@ private function applyFilters($query)
return $query;
}

private function convertEnumToString($value): string
{
if (is_object($value)) {
// Handle Laravel Enums (implements UnitEnum)
if ($value instanceof \UnitEnum) {
return $value->value ?? $value->name;
}
// Handle objects with value property
if (property_exists($value, 'value')) {
return (string) $value->value;
}
// Handle objects with __toString method
if (method_exists($value, '__toString')) {
return (string) $value;
}

// Fallback: try to get class name or serialize
return class_basename($value);
}

return (string) $value;
}

/**
* @param class-string<Model> $model
* @return array{total: int, null_positions: int, duplicates: int, groups: array<string, int>}
Expand Down Expand Up @@ -211,8 +189,7 @@ private function analyzePositions(string $model, string $columnField, string $po
->groupBy($columnField)
->pluck('record_count', $columnField)
->mapWithKeys(function ($count, $key) {
// Convert enum to string value if needed
$stringKey = $this->convertEnumToString($key);
$stringKey = (string) enum_value($key);

return [$stringKey => $count];
})
Expand Down Expand Up @@ -259,8 +236,7 @@ private function calculateChanges(string $model, string $columnField, string $po
->pluck($columnField);

foreach ($groups as $group) {
// Convert enum to string for array key
$groupKey = $this->convertEnumToString($group);
$groupKey = (string) enum_value($group);

$records = $this->getRecordsForStrategy($model, $columnField, $positionField, $group, $strategy, $query);

Expand Down
13 changes: 8 additions & 5 deletions src/Services/PositionRebalancer.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

use function Illuminate\Support\enum_value;

/**
* Handles rebalancing of positions within a column when gaps become too small.
*
Expand Down Expand Up @@ -101,10 +103,11 @@ public function findColumnsNeedingRebalancing(
$columns = (clone $query)
->select($columnField)
->distinct()
->pluck($columnField);
->pluck($columnField)
->map(fn ($columnId) => (string) enum_value($columnId));

return $columns->filter(function ($columnId) use ($query, $columnField, $positionField) {
return $this->needsRebalancing($query, $columnField, (string) $columnId, $positionField);
return $columns->filter(function (string $columnId) use ($query, $columnField, $positionField) {
return $this->needsRebalancing($query, $columnField, $columnId, $positionField);
})->values();
}

Expand All @@ -130,10 +133,10 @@ public function rebalanceAll(
);

foreach ($columnsNeedingRebalancing as $columnId) {
$results[(string) $columnId] = $this->rebalanceColumn(
$results[$columnId] = $this->rebalanceColumn(
$query,
$columnField,
(string) $columnId,
$columnId,
$positionField
);
}
Expand Down
Loading