Completed
Push — master ( adc131...6e9eb4 )
by Kevin
03:32
created

CompoundColumnGenerator::__construct()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 22
rs 9.2568
c 0
b 0
f 0
cc 5
nc 5
nop 7
1
<?php
2
3
namespace DBFaker\Generators;
4
5
6
use DBFaker\DBFaker;
7
use DBFaker\Exceptions\SchemaLogicException;
8
use DBFaker\Helpers\DBFakerSchemaManager;
9
use DBFaker\Helpers\SchemaHelper;
10
use Doctrine\DBAL\Schema\AbstractSchemaManager;
11
use Doctrine\DBAL\Schema\Index;
12
use Doctrine\DBAL\Schema\Table;
13
14
class CompoundColumnGenerator implements FakeDataGeneratorInterface
15
{
16
17
    /**
18
     * @var mixed[]
19
     */
20
    private $possibleValues = [];
21
22
    /**
23
     * @var mixed[]
24
     */
25
    private $generatedValues = [];
26
27
28
    /**
29
     * CompoundColumnGenerator constructor.
30
     * @param Table $table
31
     * @param Index $index
32
     * @param SchemaHelper $schemaHelper
33
     * @param DBFaker $dbFaker
34
     * @param AbstractSchemaManager $schemaManager
35
     * @param int $valuesCount
36
     * @throws \DBFaker\Exceptions\SchemaLogicException
37
     * @throws \DBFaker\Exceptions\UnsupportedDataTypeException
38
     * @throws \Doctrine\DBAL\Schema\SchemaException
39
     * @throws \Doctrine\DBAL\DBALException
40
     */
41
    public function __construct(Table $table, Index $index, SchemaHelper $schemaHelper, DBFaker $dbFaker, AbstractSchemaManager $schemaManager, DBFakerSchemaManager $fakerManagerHelper, int $valuesCount)
42
    {
43
        foreach ($index->getColumns() as  $columnName){
44
            //FK or normal column ?
45
            $column = $table->getColumn($columnName);
46
            if ($schemaHelper->isColumnPartOfForeignKeyConstraint($table, $column)){
47
                $fkConstraint = $schemaHelper->getForeignKeyConstraintByLocal($table, $column);
48
                if ($fkConstraint === null){
49
                    throw new SchemaLogicException($column->getName() . ' was detected as foreign key but could not get it');
50
                }
51
                $foreignTableName = $fkConstraint->getForeignTableName();
52
                $foreignColumn = $fakerManagerHelper->getForeignColumn($table, $column);
53
                $foreignTable = $schemaManager->listTableDetails($foreignTableName);
54
                $pkRegistry = $dbFaker->getPkRegistry($foreignTable);
55
                $values = $pkRegistry->loadValuesFromTable()->getAllValues();
56
                $this->possibleValues[$columnName] = array_map(function ($value) use ($foreignColumn) {
57
                    return $value[$foreignColumn->getName()];
58
                }, $values);
59
            }else{
60
                $generator = $dbFaker->getSimpleColumnGenerator($table, $column);
61
                for($i = 0; $i < $valuesCount; $i++) {
62
                    $this->possibleValues[$columnName][] = $generator();
63
                }
64
            }
65
        }
66
    }
67
    /**
68
     * @return mixed[]
69
     */
70
    public function __invoke() : array
71
    {
72
        $returnVal = [];
73
        foreach ($this->possibleValues as $columnName => $values){
74
            $returnVal[$columnName] = $values[array_rand($values)];
75
        }
76
        if (!\in_array($returnVal, $this->generatedValues, true)){
77
            $this->generatedValues[] = $returnVal;
78
            return $returnVal;
79
        }
80
        return $this();
81
    }
82
83
}