Skip to content

Commit 105217c

Browse files
committed
Merge pull request #9 from moufmouf/nomoremissingrefexception
Now, MagicQuery will assume that we are asking for the main table if no table name is passed.
2 parents 58d3dab + d6450f3 commit 105217c

File tree

4 files changed

+22
-40
lines changed

4 files changed

+22
-40
lines changed

src/Mouf/Database/MagicQuery.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ private function magicJoin(NodeInterface $select) {
153153
*/
154154
private function magicJoinOnOneQuery(MagicJoinSelect $magicJoinSelect) {
155155
$tableSearchNodeTraverser = new NodeTraverser();
156-
$detectTableVisitor = new DetectTablesVisitor();
156+
$detectTableVisitor = new DetectTablesVisitor($magicJoinSelect->getMainTable());
157157
$tableSearchNodeTraverser->addVisitor($detectTableVisitor);
158158

159159
$select = $magicJoinSelect->getSelect();

src/SQLParser/Node/Traverser/DetectTablesVisitor.php

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
/**
1010
* This visitor is in charge of detecting references to tables in columns.
11-
* It will throw an exception if a column does not specify a table name.
11+
* Also, it will modify all references to tables that have no table specified by adding the $defaultTable
1212
*/
1313
class DetectTablesVisitor implements VisitorInterface
1414
{
@@ -17,6 +17,8 @@ class DetectTablesVisitor implements VisitorInterface
1717

1818
private $tables = array();
1919

20+
private $defaultTable;
21+
2022
/**
2123
* Removes all detected magic join selects.
2224
* Useful for reusing the visitor instance on another node traversal.
@@ -26,6 +28,16 @@ public function resetVisitor() {
2628
$this->isSelectVisited = false;
2729
}
2830

31+
/**
32+
* @param string $defaultTable Sets the default table that will be used if no table is specified in a colref.
33+
*/
34+
public function __construct($defaultTable)
35+
{
36+
$this->defaultTable = $defaultTable;
37+
}
38+
39+
40+
2941
/**
3042
* Return the list of tables referenced in the Select.
3143
* @return string[] The key and the value are the table name.
@@ -54,9 +66,7 @@ public function enterNode(NodeInterface $node)
5466
}
5567
} elseif ($node instanceof ColRef) {
5668
if (empty($node->getTable())) {
57-
$e = new MissingTableRefException("All column references should be in the form 'table.column'. Table part is missing for column '".$node->getColumn()."'");
58-
$e->setMissingTableColRef($node);
59-
throw $e;
69+
$node->setTable($this->defaultTable);
6070
}
6171
$this->tables[$node->getTable()] = $node->getTable();
6272
}

src/SQLParser/Node/Traverser/MissingTableRefException.php

Lines changed: 0 additions & 28 deletions
This file was deleted.

tests/SQLParser/Node/Traverser/DetectTableVisitorTest.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class DetectTableVisitorTest extends \PHPUnit_Framework_TestCase
88
{
99
public function testStandardSelect()
1010
{
11-
$visitor = new DetectTablesVisitor();
11+
$visitor = new DetectTablesVisitor('users');
1212
$nodeTraverser = new NodeTraverser();
1313
$nodeTraverser->addVisitor($visitor);
1414

@@ -38,7 +38,7 @@ public function testStandardSelect()
3838

3939
public function testWrappedSelect()
4040
{
41-
$visitor = new DetectTablesVisitor();
41+
$visitor = new DetectTablesVisitor('users');
4242
$nodeTraverser = new NodeTraverser();
4343
$nodeTraverser->addVisitor($visitor);
4444

@@ -56,12 +56,10 @@ public function testWrappedSelect()
5656
$visitor->resetVisitor();
5757
}
5858

59-
/**
60-
* @expectedException \SQLParser\Node\Traverser\MissingTableRefException
61-
*/
62-
public function testMissingTableException()
59+
60+
public function testMissingRefTable()
6361
{
64-
$visitor = new DetectTablesVisitor();
62+
$visitor = new DetectTablesVisitor('yop');
6563
$nodeTraverser = new NodeTraverser();
6664
$nodeTraverser->addVisitor($visitor);
6765

@@ -71,5 +69,7 @@ public function testMissingTableException()
7169
$parsed = $parser->parse($sql);
7270
$select = StatementFactory::toObject($parsed);
7371
$nodeTraverser->walk($select);
72+
73+
$this->assertEquals("yop", $select->getWhere()->getLeftOperand()->getTable());
7474
}
7575
}

0 commit comments

Comments
 (0)