Passed
Push — main ( c1cea3...1d91de )
by Osvaldo
13:30
created

JoinWhereBetweenOrderByLimit::crear()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 25
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 16
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 25
rs 9.7333
1
<?php
2
namespace src\factory;
3
4
use src\FactoryClassInterface;
5
use src\pdodatabase\conexion\CrearConexionBaseDeDatos;
6
use src\pdodatabase\consultas\select\ConsultaJoinWhereOrdenYLimite;
7
use src\pdodatabase\ejecutar\EjecutarConsultaConDatos;
8
use src\pdodatabase\elementos\Campos;
9
use src\pdodatabase\elementos\Join as ElementosJoin;
10
use src\pdodatabase\elementos\Joins;
11
use src\pdodatabase\elementos\Limite;
12
use src\pdodatabase\elementos\NombreColumnaJoin;
13
use src\pdodatabase\elementos\Orden;
14
use src\pdodatabase\elementos\OrdenYLimite;
15
use src\pdodatabase\elementos\Tabla;
16
use src\pdodatabase\elementos\TipoDeJoin;
17
use src\pdodatabase\elementos\ValidadorDeParametrosWhereBetween;
18
use src\pdodatabase\elementos\WhereBetween;
19
use src\pdodatabase\sentencias\select\SentenciaJoinWhereOrdenYLimite;
20
21
class JoinWhereBetweenOrderByLimit implements FactoryClassInterface
22
{
23
    private $_joins = [];
24
25
    public function crear(array $array): ConsultaJoinWhereOrdenYLimite
26
    {
27
        $conexion = new CrearConexionBaseDeDatos;
28
        $conexion = $conexion->crear([]);
29
30
        $sentencia = new SentenciaJoinWhereOrdenYLimite(
31
            new Joins(
32
                new Tabla($array['tabla']),
33
                new Campos($array['campos']),
34
                $this->obtenerJoins($array)
35
            ),
36
            new WhereBetween(
37
                new ValidadorDeParametrosWhereBetween($array['where'])
38
            ),
39
            new OrdenYLimite(
40
                new Orden($array['order']),
41
                new Limite($array['limit'])
42
            )
43
        );
44
        
45
        return new ConsultaJoinWhereOrdenYLimite(
46
            new EjecutarConsultaConDatos(
47
                $conexion
48
            ),
49
            $sentencia
50
        );
51
    }
52
53
    private function obtenerJoins(array $array): array
54
    {
55
        foreach ($array['join'] as $value)
56
        {
57
            array_push($this->_joins, $this->crearJoin($value, $array['tabla']));           
58
59
            $this->multilplesJoin($value, $value['tabla']);
60
        }
61
62
        return $this->_joins;
63
    }
64
65
    private function crearJoin(array $array, string $tablaPadre): ElementosJoin
66
    {
67
        return new ElementosJoin(
68
            new TipoDeJoin($array['tipo']),
69
            new Tabla($tablaPadre),
70
            new Tabla($array['tabla']),
71
            new Campos($array['campos']),
72
            new NombreColumnaJoin($array['key'])
73
        );
74
    }
75
76
    private function multilplesJoin(array $value, string $tablaPadre): void
77
    {
78
        if(isset($value['join']))
79
        {
80
            foreach ($value['join'] as $value)
81
            {
82
               array_push($this->_joins, $this->crearJoin($value, $tablaPadre));
83
            }
84
85
            $this->multilplesJoin($value, $value['tabla']);
86
        }
87
    }
88
}