Skip to content

Commit a6efcac

Browse files
authored
Merge pull request #43 from Denis74RUS/feature/fix-match-against
Fix logic for parsing MATCH AGAINST statements
2 parents ba91d80 + 9379f84 commit a6efcac

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

src/SQLParser/Node/NodeFactory.php

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ public static function toObject(array $desc)
292292
unset($desc['alias']);
293293
unset($desc['direction']);
294294
unset($desc['delim']);
295+
unset($desc['no_quotes']);
295296
if (!empty($desc)) {
296297
error_log('MagicQuery - NodeFactory: Unexpected parameters in simple function: '.var_export($desc, true));
297298
}
@@ -349,7 +350,6 @@ public static function toObject(array $desc)
349350
case ExpressionType::RECORD:
350351

351352
case ExpressionType::MATCH_ARGUMENTS:
352-
case ExpressionType::MATCH_MODE:
353353

354354
case ExpressionType::ALIAS:
355355
case ExpressionType::POSITION:
@@ -392,6 +392,23 @@ public static function toObject(array $desc)
392392
error_log('MagicQuery - NodeFactory: Unexpected parameters in exception: '.var_export($desc, true));
393393
}
394394

395+
return $expr;
396+
case ExpressionType::MATCH_MODE:
397+
$expr = new ConstNode();
398+
$expr->setValue($desc['base_expr']);
399+
$expr->setIsString(false);
400+
401+
// Debug:
402+
unset($desc['base_expr']);
403+
unset($desc['expr_type']);
404+
unset($desc['sub_tree']);
405+
unset($desc['alias']);
406+
unset($desc['direction']);
407+
unset($desc['delim']);
408+
if (!empty($desc)) {
409+
error_log('MagicQuery - NodeFactory: Unexpected parameters in exception: '.var_export($desc, true));
410+
}
411+
395412
return $expr;
396413
default:
397414
throw new \Exception('Unknown expression type');
@@ -545,6 +562,18 @@ public static function simplify($nodes)
545562
}
546563
$nodes = $newNodes;
547564

565+
// Handle AGAINST function. Without this patch params will be placed after AGAINST() and not inside the brackets
566+
$newNodes = array();
567+
for ($i = 0; $i < count($nodes); ++$i) {
568+
$node = $nodes[$i];
569+
if ($node instanceof SimpleFunction && $node->getBaseExpression() === 'AGAINST' && isset($nodes[$i + 1])) {
570+
$node->setSubTree($nodes[$i + 1]);
571+
$i++;
572+
}
573+
$newNodes[] = $node;
574+
}
575+
$nodes = $newNodes;
576+
548577
// Let's find the highest level operator.
549578
for ($i = count($nodes) - 1; $i >= 0; --$i) {
550579
$node = $nodes[$i];

tests/Mouf/Database/MagicQueryTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,22 @@ public function testMagicJoin3()
329329
$this->assertEquals($expectedSql, self::simplifySql($magicQuery->build($sql)));
330330
}
331331

332+
public function testMatchAgainst()
333+
{
334+
$magicQuery = new MagicQuery();
335+
336+
$sql = "
337+
SELECT MATCH(column) AGAINST(:searchTerm IN BOOLEAN MODE) AS rang FROM table
338+
WHERE MATCH(column) AGAINST(:searchTerm IN BOOLEAN MODE)
339+
ORDER BY MATCH(column) AGAINST(:searchTerm IN BOOLEAN MODE) DESC
340+
";
341+
$expectedSql = "SELECT MATCH(column) AGAINST('searchString' IN BOOLEAN MODE) AS rang FROM table WHERE MATCH(column) AGAINST('searchString' IN BOOLEAN MODE) ORDER BY MATCH(column) AGAINST('searchString' IN BOOLEAN MODE) DESC";
342+
343+
$params["searchTerm"] = "searchString";
344+
345+
$this->assertEquals($expectedSql, self::simplifySql($magicQuery->build($sql, $params)));
346+
}
347+
332348
/**
333349
* @expectedException \Mouf\Database\MagicQueryMissingConnectionException
334350
*/

0 commit comments

Comments
 (0)