1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Framework\DB\Helper\Mysql;
use Magento\Framework\App\ResourceConnection;
class Fulltext
{
/**
* FULLTEXT search in MySQL search mode "natural language"
*/
const FULLTEXT_MODE_NATURAL = 'IN NATURAL LANGUAGE MODE';
/**
* FULLTEXT search in MySQL search mode "natural language with query expansion"
*/
const FULLTEXT_MODE_NATURAL_QUERY = 'IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION';
/**
* FULLTEXT search in MySQL search mode "boolean"
*/
const FULLTEXT_MODE_BOOLEAN = 'IN BOOLEAN MODE';
/**
* FULLTEXT search in MySQL search mode "query expansion"
*/
const FULLTEXT_MODE_QUERY = 'WITH QUERY EXPANSION';
/**
* FULLTEXT search in MySQL MATCH method
*/
const MATCH = 'MATCH';
/**
* FULLTEXT search in MySQL AGAINST method
*/
const AGAINST = 'AGAINST';
/**
* @var \Magento\Framework\DB\Adapter\AdapterInterface
*/
private $connection;
/**
* @param ResourceConnection $resource
*/
public function __construct(ResourceConnection $resource)
{
$this->connection = $resource->getConnection();
}
/**
* Method for FULLTEXT search in Mysql, will generated MATCH ($columns) AGAINST ('$expression' $mode)
*
* @param string|string[] $columns Columns which add to MATCH ()
* @param string $expression Expression which add to AGAINST ()
* @param string $mode
* @return string
*/
public function getMatchQuery($columns, $expression, $mode = self::FULLTEXT_MODE_NATURAL)
{
if (is_array($columns)) {
$columns = implode(', ', $columns);
}
$expression = $this->connection->quote($expression);
$condition = self::MATCH . " ({$columns}) " . self::AGAINST . " ({$expression} {$mode})";
return $condition;
}
/**
* Method for FULLTEXT search in Mysql, will added generated
* MATCH ($columns) AGAINST ('$expression' $mode) to where clause
*
* @param \Magento\Framework\DB\Select $select
* @param string|string[] $columns Columns which add to MATCH ()
* @param string $expression Expression which add to AGAINST ()
* @param bool $isCondition true=AND, false=OR
* @param string $mode
* @return \Magento\Framework\DB\Select
*/
public function match($select, $columns, $expression, $isCondition = true, $mode = self::FULLTEXT_MODE_NATURAL)
{
$fullCondition = $this->getMatchQuery($columns, $expression, $mode);
if ($isCondition) {
$select->where($fullCondition);
} else {
$select->orWhere($fullCondition);
}
return $select;
}
}