Skip to content
This repository has been archived by the owner on Jan 24, 2024. It is now read-only.

Commit

Permalink
Merge pull request #21 from spiral/feature/named-indexes
Browse files Browse the repository at this point in the history
Feature/named indexes
  • Loading branch information
wolfy-j authored Mar 2, 2018
2 parents 48181cc + c7ab13c commit b27974c
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 11 deletions.
4 changes: 2 additions & 2 deletions source/Spiral/ORM/RecordEntity.php
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,8 @@ abstract class RecordEntity extends AbstractRecord implements RecordInterface
*
* @see Record::INDEXES
*/
const INDEX = 1000; //Default index type
const UNIQUE = 2000; //Unique index definition
const INDEX = 1000; //Default index type
const UNIQUE = 2000; //Unique index definition

/*
* ================================================
Expand Down
18 changes: 15 additions & 3 deletions source/Spiral/ORM/Schemas/Definitions/IndexDefinition.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@
*/
final class IndexDefinition
{
/**
* @var string|null
*/
private $name;

/**
* @var array
*/
Expand All @@ -23,13 +28,16 @@ final class IndexDefinition
private $unique;

/**
* @param array $columns
* @param bool $unique
* @param array $columns
* @param bool $unique
* @param string|null $name
*/
public function __construct(array $columns, bool $unique = false)
public function __construct(array $columns, bool $unique = false, string $name = null)
{
$this->index = $columns;
$this->unique = $unique;

$this->name = $name;
}

/**
Expand All @@ -55,6 +63,10 @@ public function isUnique(): bool
*/
public function getName(): string
{
if (!empty($this->name)) {
return $this->name;
}

$name = ($this->isUnique() ? 'unique_' : 'index_') . join('_', $this->getColumns());

return strlen($name) > 64 ? md5($name) : $name;
Expand Down
26 changes: 21 additions & 5 deletions source/Spiral/ORM/Schemas/RecordSchema.php
Original file line number Diff line number Diff line change
Expand Up @@ -330,16 +330,32 @@ protected function isRelation($type): bool
*/
protected function castIndex(array $definition)
{
$name = null;
$unique = null;
$columns = [];

foreach ($definition as $chunk) {
if ($chunk == RecordEntity::INDEX || $chunk == RecordEntity::UNIQUE) {
$unique = $chunk === RecordEntity::UNIQUE;

foreach ($definition as $key => $value) {

if ($key == RecordEntity::INDEX || $key == RecordEntity::UNIQUE) {
$unique = ($key === RecordEntity::UNIQUE);

if (!is_string($value) || empty($value)){
throw new DefinitionException(
"Record '{$this}' has index definition with invalid index name"
);
}

$name = $value;
continue;
}

if ($value == RecordEntity::INDEX || $value == RecordEntity::UNIQUE) {
$unique = ($value === RecordEntity::UNIQUE);
continue;
}

$columns[] = $chunk;
$columns[] = $value;
}

if (is_null($unique)) {
Expand All @@ -354,7 +370,7 @@ protected function castIndex(array $definition)
);
}

return new IndexDefinition($columns, $unique);
return new IndexDefinition($columns, $unique, $name);
}

/**
Expand Down
8 changes: 8 additions & 0 deletions tests/ORM/ColumnRendererTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,17 @@
namespace Spiral\Tests\ORM;

use Spiral\ORM\Helpers\ColumnRenderer;
use Spiral\Tests\ORM\Fixtures\User;

abstract class ColumnRendererTest extends BaseTest
{
public function testNamedIndexes()
{
$table = $this->orm->table(User::class);
$this->assertSame('status_index', $table->getSchema()->index(['status'])->getName());
}


public function testRenderString()
{
$table = $this->db->sample->getSchema();
Expand Down
2 changes: 1 addition & 1 deletion tests/ORM/Fixtures/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,6 @@ class User extends BaseRecord implements
];

const INDEXES = [
[self::INDEX, 'status']
[self::INDEX => 'status_index', 'status']
];
}

0 comments on commit b27974c

Please sign in to comment.