<?xml version="1.0"?>
<!--
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Framework\Search\Adapter\Mysql\Field\ResolverInterface" type="Magento\CatalogSearch\Model\Adapter\Mysql\Field\Resolver" />
    <preference for="Magento\Framework\Search\Adapter\Mysql\Aggregation\DataProviderInterface" type="Magento\CatalogSearch\Model\Adapter\Mysql\Aggregation\DataProvider"/>
    <preference for="Magento\Framework\Search\Adapter\Mysql\Filter\PreprocessorInterface" type="Magento\CatalogSearch\Model\Adapter\Mysql\Filter\Preprocessor" />
    <preference for="Magento\Framework\Search\Dynamic\DataProviderInterface" type="Magento\CatalogSearch\Model\Adapter\Mysql\Dynamic\DataProvider" />
    <preference for="Magento\Framework\Search\Adapter\OptionsInterface" type="Magento\CatalogSearch\Model\Adapter\Options" />
    <preference for="Magento\CatalogSearch\Model\Search\FilterMapper\FilterStrategyInterface" type="Magento\CatalogSearch\Model\Search\FilterMapper\FilterContext"/>
    <type name="Magento\CatalogSearch\Model\Indexer\IndexerHandlerFactory">
        <arguments>
            <argument name="configPath" xsi:type="const">Magento\CatalogSearch\Model\ResourceModel\EngineInterface::CONFIG_ENGINE_PATH</argument>
            <argument name="handlers" xsi:type="array">
                <item name="mysql" xsi:type="string">Magento\CatalogSearch\Model\Indexer\IndexerHandler</item>
            </argument>
        </arguments>
    </type>
    <type name="Magento\CatalogSearch\Model\Indexer\IndexStructureFactory">
        <arguments>
            <argument name="configPath" xsi:type="const">Magento\CatalogSearch\Model\ResourceModel\EngineInterface::CONFIG_ENGINE_PATH</argument>
            <argument name="structures" xsi:type="array">
                <item name="mysql" xsi:type="string">Magento\CatalogSearch\Model\Indexer\IndexStructure</item>
            </argument>
        </arguments>
    </type>
    <preference for="Magento\Framework\Indexer\IndexStructureInterface" type="Magento\CatalogSearch\Model\Indexer\IndexStructureProxy" />
    <type name="Magento\Framework\Search\Adapter\Mysql\Aggregation\DataProviderContainer">
        <arguments>
            <argument name="dataProviders" xsi:type="array">
                <item name="catalogsearch_fulltext" xsi:type="object">Magento\CatalogSearch\Model\Adapter\Mysql\Aggregation\DataProvider</item>
            </argument>
        </arguments>
    </type>
    <type name="Magento\Framework\Module\Setup\Migration">
        <arguments>
            <argument name="compositeModules" xsi:type="array">
                <item name="catalogsearch" xsi:type="string">Magento_CatalogSearch</item>
            </argument>
        </arguments>
    </type>
    <type name="Magento\Catalog\Model\ResourceModel\Product">
        <plugin name="catalogsearchFulltextProduct" type="Magento\CatalogSearch\Model\Indexer\Fulltext\Plugin\Product"/>
    </type>
    <type name="Magento\Catalog\Model\ResourceModel\Category">
        <plugin name="catalogsearchFulltextCategory" type="Magento\CatalogSearch\Model\Indexer\Fulltext\Plugin\Category"/>
    </type>
    <type name="Magento\Catalog\Model\Product\Action">
        <plugin name="catalogsearchFulltextMassAction" type="Magento\CatalogSearch\Model\Indexer\Fulltext\Plugin\Product\Action"/>
    </type>
    <type name="Magento\Store\Model\ResourceModel\Store">
        <plugin name="catalogsearchFulltextIndexerStoreView" type="Magento\CatalogSearch\Model\Indexer\Fulltext\Plugin\Store\View" />
    </type>
    <type name="Magento\Store\Model\ResourceModel\Group">
        <plugin name="catalogsearchFulltextIndexerStoreGroup" type="Magento\CatalogSearch\Model\Indexer\Fulltext\Plugin\Store\Group"/>
    </type>
    <type name="Magento\Catalog\Model\ResourceModel\Attribute">
        <plugin name="catalogsearchFulltextIndexerAttribute" type="Magento\CatalogSearch\Model\Indexer\Fulltext\Plugin\Attribute"/>
    </type>
    <type name="Magento\Framework\Search\EntityMetadata" />
    <virtualType name="Magento\Framework\Search\ProductEntityMetadata" type="Magento\Framework\Search\EntityMetadata">
        <arguments>
            <argument name="entityId" xsi:type="string">entity_id</argument>
        </arguments>
    </virtualType>
    <type name="Magento\Framework\Search\Adapter\Mysql\DocumentFactory">
        <arguments>
            <argument name="entityMetadata" xsi:type="object">Magento\Framework\Search\ProductEntityMetadata</argument>
        </arguments>
    </type>
    <type name="Magento\Framework\Search\Adapter\Mysql\Aggregation\Builder">
        <arguments>
            <argument name="entityMetadata" xsi:type="object">Magento\Framework\Search\ProductEntityMetadata</argument>
        </arguments>
    </type>
    <type name="Magento\Framework\Search\Request\Config\FilesystemReader">
        <plugin name="catalogSearchDynamicFields"  type="Magento\CatalogSearch\Model\Search\ReaderPlugin" />
    </type>
    <type name="Magento\Framework\Search\Dynamic\IntervalFactory">
        <arguments>
            <argument name="configPath" xsi:type="const">Magento\CatalogSearch\Model\ResourceModel\EngineInterface::CONFIG_ENGINE_PATH</argument>
            <argument name="intervals" xsi:type="array">
                <item name="mysql" xsi:type="string">Magento\Framework\Search\Adapter\Mysql\Aggregation\Interval</item>
            </argument>
            <argument name="scope" xsi:type="const">Magento\Store\Model\ScopeInterface::SCOPE_STORE</argument>
        </arguments>
    </type>
    <type name="Magento\Framework\Search\Dynamic\DataProviderFactory">
        <arguments>
            <argument name="configPath" xsi:type="const">Magento\CatalogSearch\Model\ResourceModel\EngineInterface::CONFIG_ENGINE_PATH</argument>
            <argument name="dataProviders" xsi:type="array">
                <item name="mysql" xsi:type="string">Magento\CatalogSearch\Model\Adapter\Mysql\Dynamic\DataProvider</item>
            </argument>
            <argument name="scope" xsi:type="const">Magento\Store\Model\ScopeInterface::SCOPE_STORE</argument>
        </arguments>
    </type>
    <type name="Magento\Backend\Controller\Adminhtml\Index\GlobalSearch">
        <arguments>
            <argument name="searchModules" xsi:type="array">
                <item name="products" xsi:type="array">
                    <item name="class" xsi:type="string">Magento\CatalogSearch\Model\Search\Catalog</item>
                    <item name="acl" xsi:type="string">Magento_Catalog::catalog</item>
                </item>
            </argument>
        </arguments>
    </type>
    <preference for="Magento\Search\Model\SearchCollectionInterface" type="Magento\CatalogSearch\Model\ResourceModel\Search\Collection" />
    <type name="Magento\Catalog\Model\Layer\Search\CollectionFilter">
        <plugin name="searchQuery" type="Magento\CatalogSearch\Model\Layer\Search\Plugin\CollectionFilter" />
    </type>
    <virtualType name="categoryFilterList" type="Magento\Catalog\Model\Layer\FilterList">
        <arguments>
            <argument name="filters" xsi:type="array">
                <item name="attribute" xsi:type="string">Magento\CatalogSearch\Model\Layer\Filter\Attribute</item>
                <item name="price" xsi:type="string">Magento\CatalogSearch\Model\Layer\Filter\Price</item>
                <item name="decimal" xsi:type="string">Magento\CatalogSearch\Model\Layer\Filter\Decimal</item>
                <item name="category" xsi:type="string">Magento\CatalogSearch\Model\Layer\Filter\Category</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="searchFilterList" type="Magento\Catalog\Model\Layer\FilterList">
        <arguments>
            <argument name="filters" xsi:type="array">
                <item name="attribute" xsi:type="string">Magento\CatalogSearch\Model\Layer\Filter\Attribute</item>
                <item name="price" xsi:type="string">Magento\CatalogSearch\Model\Layer\Filter\Price</item>
                <item name="decimal" xsi:type="string">Magento\CatalogSearch\Model\Layer\Filter\Decimal</item>
                <item name="category" xsi:type="string">Magento\CatalogSearch\Model\Layer\Filter\Category</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="Magento\CatalogSearch\Model\ResourceModel\Fulltext\CollectionFactory" type="Magento\Catalog\Model\ResourceModel\Product\CollectionFactory">
        <arguments>
            <argument name="instanceName" xsi:type="string">Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection</argument>
        </arguments>
    </virtualType>
    <type name="Magento\CatalogSearch\Model\Layer\Category\ItemCollectionProvider">
        <arguments>
            <argument name="collectionFactory" xsi:type="object">Magento\CatalogSearch\Model\ResourceModel\Fulltext\CollectionFactory</argument>
        </arguments>
    </type>

    <virtualType name="Magento\CatalogSearch\Model\ResourceModel\Fulltext\SearchCollection" type="Magento\CatalogSearch\Model\ResourceModel\Fulltext\Collection">
        <arguments>
            <argument name="searchRequestName" xsi:type="string">quick_search_container</argument>
        </arguments>
    </virtualType>

    <virtualType name="Magento\CatalogSearch\Model\ResourceModel\Fulltext\SearchCollectionFactory" type="Magento\Catalog\Model\ResourceModel\Product\CollectionFactory">
        <arguments>
            <argument name="instanceName" xsi:type="string">Magento\CatalogSearch\Model\ResourceModel\Fulltext\SearchCollection</argument>
        </arguments>
    </virtualType>

    <virtualType name="Magento\CatalogSearch\Model\Layer\Search\ItemCollectionProvider" type="Magento\Catalog\Model\Layer\Search\ItemCollectionProvider">
        <arguments>
            <argument name="collectionFactory" xsi:type="object">Magento\CatalogSearch\Model\ResourceModel\Fulltext\SearchCollectionFactory</argument>
        </arguments>
    </virtualType>
    <virtualType name="Magento\CatalogSearch\Model\ResourceModel\Advanced\CollectionFactory"
                 type="Magento\Catalog\Model\ResourceModel\Product\CollectionFactory">
        <arguments>
            <argument name="instanceName" xsi:type="string">Magento\CatalogSearch\Model\ResourceModel\Advanced\Collection</argument>
        </arguments>
    </virtualType>
    <type name="Magento\CatalogSearch\Model\Advanced">
        <arguments>
            <argument name="productCollectionFactory" xsi:type="object">Magento\CatalogSearch\Model\ResourceModel\Advanced\CollectionFactory</argument>
        </arguments>
    </type>
    <virtualType name="Magento\CatalogSearch\Model\Layer\Category\Context" type="Magento\Catalog\Model\Layer\Category\Context">
        <arguments>
            <argument name="collectionProvider" xsi:type="object">Magento\CatalogSearch\Model\Layer\Category\ItemCollectionProvider</argument>
        </arguments>
    </virtualType>
    <virtualType name="Magento\CatalogSearch\Model\Layer\Search\Context" type="Magento\Catalog\Model\Layer\Search\Context">
        <arguments>
            <argument name="collectionProvider" xsi:type="object">Magento\CatalogSearch\Model\Layer\Search\ItemCollectionProvider</argument>
            <argument name="stateKey" xsi:type="object">Magento\CatalogSearch\Model\Layer\Search\StateKey</argument>
        </arguments>
    </virtualType>
    <type name="Magento\Catalog\Model\Layer\Category">
        <arguments>
            <argument name="context" xsi:type="object">Magento\CatalogSearch\Model\Layer\Category\Context</argument>
        </arguments>
    </type>
    <type name="Magento\Catalog\Model\Layer\Search">
        <arguments>
            <argument name="context" xsi:type="object">Magento\CatalogSearch\Model\Layer\Search\Context</argument>
        </arguments>
    </type>
    <type name="Magento\CatalogSearch\Model\Adapter\Mysql\Aggregation\DataProvider">
        <arguments>
            <argument name="range" xsi:type="object">Magento\Catalog\Model\Layer\Filter\Price\Range\Proxy</argument>
        </arguments>
        <plugin name="categoryIdAggregation" type="Magento\CatalogSearch\Model\Adapter\Mysql\Plugin\Aggregation\Category\DataProvider" />
    </type>
    <type name="Magento\Framework\Search\Adapter\Mysql\Mapper">
        <arguments>
            <argument name="indexProviders" xsi:type="array">
                <item name="catalogsearch_fulltext" xsi:type="object">Magento\CatalogSearch\Model\Search\IndexBuilder</item>
            </argument>
            <argument name="entityMetadata" xsi:type="object">Magento\Framework\Search\ProductEntityMetadata</argument>
        </arguments>
    </type>
    <type name="Magento\CatalogSearch\Model\Adapter\Mysql\Filter\Preprocessor">
        <arguments>
            <argument name="attributePrefix" xsi:type="const">Magento\CatalogSearch\Model\ResourceModel\Engine::ATTRIBUTE_PREFIX</argument>
        </arguments>
    </type>
    <type name="Magento\CatalogSearch\Model\ResourceModel\EngineProvider">
        <arguments>
            <argument name="engines" xsi:type="array">
                <item name="mysql" xsi:type="string">Magento\CatalogSearch\Model\ResourceModel\Engine</item>
            </argument>
        </arguments>
    </type>
    <type name="Magento\Search\Model\AdapterFactory">
        <arguments>
            <argument name="path" xsi:type="const">Magento\CatalogSearch\Model\ResourceModel\EngineInterface::CONFIG_ENGINE_PATH</argument>
            <argument name="scopeType" xsi:type="const">\Magento\Store\Model\ScopeInterface::SCOPE_STORE</argument>
        </arguments>
    </type>
    <type name="Magento\Search\Model\Autocomplete">
        <arguments>
            <argument name="dataProviders" xsi:type="array">
                <item name="10" xsi:type="object">Magento\CatalogSearch\Model\Autocomplete\DataProvider</item>
            </argument>
        </arguments>
    </type>
    <type name="Magento\Framework\Search\Adapter\Aggregation\AggregationResolver">
        <arguments>
            <argument name="resolvers" xsi:type="array">
                <item name="catalogsearch_fulltext" xsi:type="object">Magento\CatalogSearch\Model\Adapter\Aggregation\AggregationResolver</item>
            </argument>
        </arguments>
    </type>
    <type name="Magento\CatalogSearch\Model\Search\RequestGenerator\GeneratorResolver">
        <arguments>
            <argument name="defaultGenerator" xsi:type="object">\Magento\CatalogSearch\Model\Search\RequestGenerator\General</argument>
            <argument name="generators" xsi:type="array">
                <item name="decimal" xsi:type="object">Magento\CatalogSearch\Model\Search\RequestGenerator\Decimal</item>
            </argument>
        </arguments>
    </type>
</config>
