Skip to content

Commit ee31e82

Browse files
authored
Merge pull request #33 from moufmouf/bugfix/distinct
Fixing DISTINCT management
2 parents 8d86e0c + bcdedb1 commit ee31e82

File tree

3 files changed

+18
-10
lines changed

3 files changed

+18
-10
lines changed

src/SQLParser/Node/NodeFactory.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ public static function toObject(array $desc)
303303
throw new \InvalidArgumentException('Unexpected operator with subtree: '.var_export($desc['sub_tree'], true));
304304
}
305305
unset($desc['sub_tree']);
306+
unset($desc['delim']);
306307
if (!empty($desc)) {
307308
throw new \InvalidArgumentException('Unexpected parameters in exception: '.var_export($desc, true));
308309
}
@@ -322,6 +323,7 @@ public static function toObject(array $desc)
322323
unset($desc['sub_tree']);
323324
unset($desc['alias']);
324325
unset($desc['direction']);
326+
unset($desc['delim']);
325327
if (!empty($desc)) {
326328
throw new \InvalidArgumentException('Unexpected parameters in exception: '.var_export($desc, true));
327329
}

src/SQLParser/Query/StatementFactory.php

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use SQLParser\Node\NodeFactory;
66
use SQLParser\Node\Operator;
7+
use SQLParser\Node\Reserved;
78

89
/**
910
* This class has the ability to create instances implementing NodeInterface based on a descriptive array.
@@ -21,19 +22,21 @@ public static function toObject(array $desc)
2122
return NodeFactory::toObject($item);
2223
}, $desc['SELECT']);
2324
$columns = NodeFactory::simplify($columns);
24-
$select->setColumns($columns);
2525

26-
if (isset($desc['OPTIONS'])) {
27-
$options = $desc['OPTIONS'];
28-
$key = array_search('DISTINCT', $options);
29-
if ($key !== false) {
30-
$select->setDistinct(true);
31-
unset($options[$key]);
32-
} else {
33-
$select->setDistinct(false);
26+
$options = [];
27+
foreach ($columns as $key => $column) {
28+
if ($column instanceof Reserved) {
29+
if (strtoupper($column->getBaseExpression()) === 'DISTINCT') {
30+
$select->setDistinct(true);
31+
} else {
32+
$options[] = $column->getBaseExpression();
33+
}
34+
unset($columns[$key]);
3435
}
35-
$select->setOptions($options);
3636
}
37+
$select->setOptions($options);
38+
39+
$select->setColumns($columns);
3740

3841
if (isset($desc['FROM'])) {
3942
$from = self::mapArrayToNodeObjectList($desc['FROM']);

tests/Mouf/Database/MagicQueryTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ public function testStandardSelect()
126126

127127
$sql = 'SELECT * FROM users WHERE (login LIKE :login)';
128128
$this->assertEquals('SELECT * FROM users', self::simplifySql($magicQuery->build($sql)));
129+
130+
$sql = 'SELECT DISTINCT login FROM users';
131+
$this->assertEquals('SELECT DISTINCT login FROM users', self::simplifySql($magicQuery->build($sql)));
129132
}
130133

131134
/**

0 commit comments

Comments
 (0)