<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
    <services>
        <service id="RiccardoSearch\Core\Content\Search\SynonymDefinition">
            <tag name="shopware.entity.definition" entity="riccardo_search_synonym"/>
        </service>
        <service id="RiccardoSearch\Core\Content\Search\RuleDefinition">
            <tag name="shopware.entity.definition" entity="riccardo_search_rule"/>
        </service>
        <service id="RiccardoSearch\Core\Content\Search\TermDefinition">
            <tag name="shopware.entity.definition" entity="riccardo_search_term"/>
        </service>

        <service id="RiccardoSearch\Core\Search\RuleLoader">
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <argument type="service" id="cache.object"/>
            <argument type="service" id="RiccardoSearch\Core\Search\TermRewriter"/>
        </service>

        <!-- Sortierung liegt AUSSEN um die Synonyme: erst die Trefferabfrage
             bauen (inklusive Synonyme), dann gewichten. -->
        <service id="RiccardoSearch\Core\Search\RankingQueryBuilder"
                 decorates="Shopware\Elasticsearch\Product\AbstractProductSearchQueryBuilder"
                 decoration-priority="-10">
            <argument type="service" id="RiccardoSearch\Core\Search\RankingQueryBuilder.inner"/>
            <argument type="service" id="RiccardoSearch\Core\Search\RuleLoader"/>
            <argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService"/>
        </service>

        <service id="RiccardoSearch\Subscriber\MerchandisingSubscriber">
            <argument type="service" id="RiccardoSearch\Core\Search\RuleLoader"/>
            <argument type="service" id="sales_channel.product.repository"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="RiccardoSearch\Subscriber\ClickSubscriber">
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <argument type="service" id="RiccardoSearch\Core\Search\TermRewriter"/>
            <argument type="service" id="logger"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="RiccardoSearch\Subscriber\RedirectSubscriber">
            <argument type="service" id="RiccardoSearch\Core\Search\RuleLoader"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="RiccardoSearch\Storefront\Controller\SearchTrackController" public="true">
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <argument type="service" id="RiccardoSearch\Core\Search\TermRewriter"/>
            <call method="setContainer"><argument type="service" id="service_container"/></call>
        </service>

        <service id="RiccardoSearch\Core\Search\TermRewriter">
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <argument type="service" id="cache.object"/>
        </service>

        <!-- Synonyme als zusätzliche ODER-Bedingung in der OpenSearch-Abfrage.
             Der Suchbegriff selbst bleibt unangetastet - sonst schaltet
             Shopware die Teilwort-Suche ab (siehe Klassenkommentar). -->
        <service id="RiccardoSearch\Core\Search\SynonymQueryBuilder"
                 decorates="Shopware\Elasticsearch\Product\AbstractProductSearchQueryBuilder">
            <argument type="service" id="RiccardoSearch\Core\Search\SynonymQueryBuilder.inner"/>
            <argument type="service" id="RiccardoSearch\Core\Search\TermRewriter"/>
        </service>

        <service id="RiccardoSearch\Subscriber\SearchLogSubscriber">
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <argument type="service" id="RiccardoSearch\Core\Search\TermRewriter"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="RiccardoSearch\Command\SynonymCommand">
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <argument type="service" id="RiccardoSearch\Core\Search\TermRewriter"/>
            <tag name="console.command"/>
        </service>

        <service id="RiccardoSearch\Subscriber\CacheSubscriber">
            <argument type="service" id="RiccardoSearch\Core\Search\RuleLoader"/>
            <argument type="service" id="RiccardoSearch\Core\Search\TermRewriter"/>
            <tag name="kernel.event_subscriber"/>
        </service>

        <service id="RiccardoSearch\Command\ExplainCommand">
            <argument type="service" id="Shopware\Elasticsearch\Product\AbstractProductSearchQueryBuilder"/>
            <argument type="service" id="OpenSearch\Client"/>
            <argument type="service" id="Shopware\Elasticsearch\Framework\ElasticsearchHelper"/>
            <argument type="service" id="Shopware\Core\Content\Product\ProductDefinition"/>
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <tag name="console.command"/>
        </service>

        <service id="RiccardoSearch\Command\SearchReportCommand">
            <argument type="service" id="Doctrine\DBAL\Connection"/>
            <tag name="console.command"/>
        </service>
    </services>
</container>
