Skip to content

Commit d5fcdd8

Browse files
authored
Merge pull request #47 from TheoBiron/between_issue
Issue with between and parenthesis
2 parents 3eb2186 + 7ad8b0f commit d5fcdd8

File tree

3 files changed

+36
-37
lines changed

3 files changed

+36
-37
lines changed

src/SQLParser/Node/NodeFactory.php

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -452,19 +452,39 @@ private static function buildFromSubtree($subTree)
452452
if (!empty($subTree) && !isset($subTree[0])) {
453453
$subTree = StatementFactory::toObject($subTree);
454454
} else {
455-
$subTree = array_map(function ($item) {
456-
if (is_array($item)) {
457-
return self::toObject($item);
458-
} else {
459-
return $item;
460-
}
461-
}, $subTree);
455+
$subTree = self::mapArrayToNodeObjectList($subTree);
462456
}
463457
}
464458

465459
return $subTree;
466460
}
467461

462+
/**
463+
* @param array $items An array of objects represented as SQLParser arrays.
464+
*/
465+
public static function mapArrayToNodeObjectList(array $items)
466+
{
467+
$list = [];
468+
469+
$nextAndPartOfBetween = false;
470+
471+
// Special case, let's replace the AND of a between with a ANDBETWEEN object.
472+
foreach ($items as $item) {
473+
$obj = NodeFactory::toObject($item);
474+
if ($obj instanceof Operator) {
475+
if ($obj->getValue() == 'BETWEEN') {
476+
$nextAndPartOfBetween = true;
477+
} elseif ($nextAndPartOfBetween && $obj->getValue() == 'AND') {
478+
$nextAndPartOfBetween = false;
479+
$obj->setValue('AND_FROM_BETWEEN');
480+
}
481+
}
482+
$list[] = $obj;
483+
}
484+
485+
return $list;
486+
}
487+
468488
private static $PRECEDENCE = array(
469489
array('INTERVAL'),
470490
array('BINARY', 'COLLATE'),

src/SQLParser/Query/StatementFactory.php

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -39,30 +39,30 @@ public static function toObject(array $desc)
3939
$select->setColumns($columns);
4040

4141
if (isset($desc['FROM'])) {
42-
$from = self::mapArrayToNodeObjectList($desc['FROM']);
42+
$from = NodeFactory::mapArrayToNodeObjectList($desc['FROM']);
4343
$select->setFrom($from);
4444
}
4545

4646
if (isset($desc['WHERE'])) {
47-
$where = self::mapArrayToNodeObjectList($desc['WHERE']);
47+
$where = NodeFactory::mapArrayToNodeObjectList($desc['WHERE']);
4848
$where = NodeFactory::simplify($where);
4949
$select->setWhere($where);
5050
}
5151

5252
if (isset($desc['GROUP'])) {
53-
$group = self::mapArrayToNodeObjectList($desc['GROUP']);
53+
$group = NodeFactory::mapArrayToNodeObjectList($desc['GROUP']);
5454
$group = NodeFactory::simplify($group);
5555
$select->setGroup($group);
5656
}
5757

5858
if (isset($desc['HAVING'])) {
59-
$having = self::mapArrayToNodeObjectList($desc['HAVING']);
59+
$having = NodeFactory::mapArrayToNodeObjectList($desc['HAVING']);
6060
$having = NodeFactory::simplify($having);
6161
$select->setHaving($having);
6262
}
6363

6464
if (isset($desc['ORDER'])) {
65-
$order = self::mapArrayToNodeObjectList($desc['ORDER']);
65+
$order = NodeFactory::mapArrayToNodeObjectList($desc['ORDER']);
6666
$order = NodeFactory::simplify($order);
6767
$select->setOrder($order);
6868
}
@@ -112,29 +112,4 @@ public static function toObject(array $desc)
112112
return ['offset' => $descLimit['offset'], 'limit' => $descLimit['rowcount']];
113113
}*/
114114

115-
/**
116-
* @param array $items An array of objects represented as SQLParser arrays.
117-
*/
118-
private static function mapArrayToNodeObjectList(array $items)
119-
{
120-
$list = [];
121-
122-
$nextAndPartOfBetween = false;
123-
124-
// Special case, let's replace the AND of a between with a ANDBETWEEN object.
125-
foreach ($items as $item) {
126-
$obj = NodeFactory::toObject($item);
127-
if ($obj instanceof Operator) {
128-
if ($obj->getValue() == 'BETWEEN') {
129-
$nextAndPartOfBetween = true;
130-
} elseif ($nextAndPartOfBetween && $obj->getValue() == 'AND') {
131-
$nextAndPartOfBetween = false;
132-
$obj->setValue('AND_FROM_BETWEEN');
133-
}
134-
}
135-
$list[] = $obj;
136-
}
137-
138-
return $list;
139-
}
140115
}

tests/Mouf/Database/MagicQueryTest.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ public function testStandardSelect()
7878
$this->assertEquals("SELECT * FROM myTable WHERE someField <= '4'", self::simplifySql($magicQuery->build($sql, ['value2' => 4])));
7979
$this->assertEquals('SELECT * FROM myTable', self::simplifySql($magicQuery->build($sql, [])));
8080

81+
$sql = 'SELECT * FROM myTable where (someField BETWEEN :value1 AND :value2) AND otherField = :value3';
82+
$this->assertEquals("SELECT * FROM myTable WHERE ((someField BETWEEN '2' AND '4')) AND (otherField = '8')", self::simplifySql($magicQuery->build($sql, ['value1' => 2, 'value2' => 4, 'value3' => 8])));
83+
84+
8185
// Triggers an "expression"
8286
// TODO: find why it fails!
8387
//$sql = 'SELECT * FROM (users) WHERE name LIKE :name';

0 commit comments

Comments
 (0)