Skip to content

Commit b5d0f95

Browse files
committed
Implementação do parser para joins do select.
1 parent fad9b92 commit b5d0f95

File tree

5 files changed

+131
-2
lines changed

5 files changed

+131
-2
lines changed

src/Db/Select/Parsing/SelectParser.php

+51
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Zend\Db\Sql\Select;
66
use Zend\EntityMapper\Config\Container\Container;
77
use Zend\EntityMapper\Config\Entity;
8+
use Zend\EntityMapper\Db\Select\Reflection\JoinReflector;
89
use Zend\EntityMapper\Db\Select\Reflection\OperatorReflector;
910
use Zend\EntityMapper\Db\Select\Reflection\SelectReflector;
1011

@@ -169,6 +170,56 @@ public function parseOrder(): Select
169170
$order->setValue($select, $parsedOrders);
170171

171172
return $select;
173+
}
174+
175+
/**
176+
* @return Select
177+
* @throws \Zend\EntityMapper\Config\Container\Exceptions\ItemNotFoundException
178+
*/
179+
public function parseJoin(): Select
180+
{
181+
$joins = $this->reflector->getProperty('joins');
182+
$joinReflector = new JoinReflector($joins);
183+
$joinClauses = $joinReflector->getJoinClauses();
184+
$parsedJoinClauses = [];
185+
186+
foreach ($joinClauses as $joinClause) {
187+
188+
$tableName = null;
189+
$rawObjectName = $joinClause['name'];
190+
191+
if(is_array($rawObjectName)) {
192+
foreach ($rawObjectName as $alias => $class) {
193+
$config = $this->container->get($class);
194+
$joinClause['name'] = [$alias => $config->getTable()];
195+
$fields = $config->getFields();
196+
}
197+
}
198+
else {
199+
$config = $this->container->get($rawObjectName);
200+
$fields = $config->getFields();
201+
}
172202

203+
foreach ($fields as $field) {
204+
$joinClause['on'] = str_replace($field->getProperty(), $field->getAlias(), $joinClause['on']);
205+
206+
foreach ($joinClause['columns'] as $key => $column) {
207+
$joinClause['columns'][$key] = str_replace($field->getProperty(), $field->getAlias(), $joinClause['columns'][$key]);
208+
}
209+
}
210+
211+
$parsedJoinClauses[] = $joinClause;
212+
213+
}
214+
215+
$joinsReflection = new \ReflectionObject($joins);
216+
$joinsReflectorJoinsProperty = $joinsReflection->getProperty('joins');
217+
$joinsReflectorJoinsProperty->setAccessible(true);
218+
$joinsReflectorJoinsProperty->setValue($joins, $parsedJoinClauses);
219+
220+
$this->reflector->setProperty('joins', $joins);
221+
$select = $this->reflector->getSelect();
222+
223+
return $select;
173224
}
174225
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
/**
3+
* Created by PhpStorm.
4+
* User: Lucas A. de Araújo
5+
* Date: 05/07/2018
6+
* Time: 08:18
7+
*/
+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace Zend\EntityMapper\Db\Select\Reflection;
4+
5+
use Zend\Db\Sql\Join;
6+
7+
class JoinReflector
8+
{
9+
private $join;
10+
11+
/**
12+
* JoinReflector constructor.
13+
*
14+
* @param Join $join
15+
*/
16+
public function __construct(Join $join)
17+
{
18+
$this->join = $join;
19+
}
20+
21+
/**
22+
* @return mixed
23+
*/
24+
public function getJoinClauses()
25+
{
26+
$joinReflection = new \ReflectionObject($this->join);
27+
$joinsPropertyReflection = $joinReflection->getProperty('joins');
28+
$joinsPropertyReflection->setAccessible(true);
29+
$joinClauses = $joinsPropertyReflection->getValue($this->join);
30+
31+
return $joinClauses;
32+
}
33+
}

src/Db/Select/Reflection/SelectReflector.php

+12-1
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,24 @@ public function getSelect(): Select
4545
* @param string $name
4646
* @return mixed
4747
*/
48-
private function getProperty(string $name)
48+
public function getProperty(string $name)
4949
{
5050
$property = $this->reflection->getProperty($name);
5151
$property->setAccessible(true);
5252
return $property->getValue($this->select);
5353
}
5454

55+
/**
56+
* @param string $name
57+
* @param $value
58+
*/
59+
public function setProperty(string $name, $value): void
60+
{
61+
$property = $this->reflection->getProperty($name);
62+
$property->setAccessible(true);
63+
$property->setValue($this->select, $value);
64+
}
65+
5566
/**
5667
* @return string|array|TableIdentifier
5768
*/

tests/Db/Select/Parsing/SelectParsingTest.php

+28-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public function setUp()
3939
$sql = new Select();
4040
$sql->columns(['hpower' => 'horsepower', 'pistons'])
4141
->from(['a' => Engine::class])
42-
->join(['b' => Engine::class], 'a.id = b.id', [])
42+
->join(['b' => Engine::class], 'a.horsepower = b.horsepower', ['horsepower'])
4343
->where
4444
->greaterThan('horsepower', 200)
4545
->and->lessThan('cm3', 2.0);
@@ -151,4 +151,31 @@ public function testParsingOrderColumns()
151151

152152
$this->assertEquals($order[0], 'hp DESC');
153153
}
154+
155+
public function testParsingJoinClauses()
156+
{
157+
$parser = new SelectParser($this->select);
158+
$parser->parseFrom();
159+
$parser->parseColumns();
160+
$parser->parseWhere();
161+
$parser->parseFrom();
162+
163+
$select = $parser->parseJoin();
164+
165+
$selectReflection = new \ReflectionObject($select);
166+
$joinsProperty = $selectReflection->getProperty('joins');
167+
$joinsProperty->setAccessible(true);
168+
$joins = $joinsProperty->getValue($select);
169+
170+
$joinsReflection = new \ReflectionObject($joins);
171+
$joinsProperty = $joinsReflection->getProperty('joins');
172+
$joinsProperty->setAccessible(true);
173+
$joinsArray = $joinsProperty->getValue($joins);
174+
175+
$clause = $joinsArray[0];
176+
$on = $clause['on'];
177+
178+
$this->assertNotEmpty($joinsArray);
179+
$this->assertEquals($on, 'a.hp = b.hp');
180+
}
154181
}

0 commit comments

Comments
 (0)