![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/framework/View/Element/UiComponent/DataProvider/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Framework\View\Element\UiComponent\DataProvider; use Magento\Framework\Data\Collection; use Magento\Framework\Data\Collection\AbstractDb; use Magento\Framework\Api\Filter; /** * Class Fulltext */ class FulltextFilter implements FilterApplierInterface { /** * Patterns using for escaping special characters */ private $escapePatterns = [ '/[@\.]/' => '\_', '/([+\-><\(\)~*]+)/' => ' ', ]; /** * Returns list of columns from fulltext index (doesn't support more then one FTI per table) * * @param AbstractDb $collection * @param string $indexTable * @return array */ protected function getFulltextIndexColumns(AbstractDb $collection, $indexTable) { $indexes = $collection->getConnection()->getIndexList($indexTable); foreach ($indexes as $index) { if (strtoupper($index['INDEX_TYPE']) == 'FULLTEXT') { return $index['COLUMNS_LIST']; } } return []; } /** * Add table alias to columns * * @param array $columns * @param AbstractDb $collection * @param string $indexTable * @return array */ protected function addTableAliasToColumns(array $columns, AbstractDb $collection, $indexTable) { $alias = ''; foreach ($collection->getSelect()->getPart('from') as $tableAlias => $data) { if ($indexTable == $data['tableName']) { $alias = $tableAlias; break; } } if ($alias) { $columns = array_map( function ($column) use ($alias) { return '`' . $alias . '`.' . $column; }, $columns ); } return $columns; } /** * Escape against value * * @param string $value * @return string */ private function escapeAgainstValue(string $value): string { return preg_replace(array_keys($this->escapePatterns), array_values($this->escapePatterns), $value); } /** * Apply fulltext filters * * @param Collection $collection * @param Filter $filter * @return void */ public function apply(Collection $collection, Filter $filter) { if (!$collection instanceof AbstractDb) { throw new \InvalidArgumentException('Database collection required.'); } /** @var SearchResult $collection */ $mainTable = $collection->getMainTable(); $columns = $this->getFulltextIndexColumns($collection, $mainTable); if (!$columns) { return; } $columns = $this->addTableAliasToColumns($columns, $collection, $mainTable); $collection->getSelect() ->where( 'MATCH(' . implode(',', $columns) . ') AGAINST(?)', $this->escapeAgainstValue($filter->getValue()) ); } }