<?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="api_platform.doctrine.metadata_factory" class="Doctrine\Persistence\Mapping\ClassMetadataFactory" public="false">
            <factory service="doctrine.orm.default_entity_manager" method="getMetadataFactory" />
        </service>

        <service id="api_platform.doctrine.orm.state.remove_processor" class="ApiPlatform\Doctrine\Common\State\RemoveProcessor">
            <argument type="service" id="doctrine" />

            <tag name="api_platform.state_processor" priority="-100" key="api_platform.doctrine.orm.state.remove_processor" />
            <tag name="api_platform.state_processor" priority="-100" key="ApiPlatform\Doctrine\Common\State\RemoveProcessor" />
        </service>
        <service id="ApiPlatform\Doctrine\Common\State\RemoveProcessor" alias="api_platform.doctrine.orm.state.remove_processor" />

        <service id="api_platform.doctrine.orm.state.persist_processor" class="ApiPlatform\Doctrine\Common\State\PersistProcessor">
            <argument type="service" id="doctrine" />

            <tag name="api_platform.state_processor" priority="-100" key="api_platform.doctrine.orm.state.persist_processor" />
            <tag name="api_platform.state_processor" priority="-100" key="ApiPlatform\Doctrine\Common\State\PersistProcessor" />
        </service>
        <service id="ApiPlatform\Doctrine\Common\State\PersistProcessor" alias="api_platform.doctrine.orm.state.persist_processor" />

        <!-- Filter -->

        <service id="api_platform.doctrine.orm.order_filter" class="ApiPlatform\Doctrine\Orm\Filter\OrderFilter" public="false" abstract="true">
            <argument type="service" id="doctrine" />
            <argument>%api_platform.collection.order_parameter_name%</argument>
            <argument type="service" id="logger" on-invalid="ignore" />
            <argument key="$nameConverter" type="service" id="api_platform.name_converter" on-invalid="ignore" />
            <argument key="$orderNullsComparison">%api_platform.collection.order_nulls_comparison%</argument>
        </service>
        <service id="ApiPlatform\Doctrine\Orm\Filter\OrderFilter" alias="api_platform.doctrine.orm.order_filter" />
        <service id="api_platform.doctrine.orm.date_filter.instance" parent="api_platform.doctrine.orm.date_filter">
            <argument type="collection"></argument>
        </service>

        <service id="api_platform.doctrine.orm.range_filter" class="ApiPlatform\Doctrine\Orm\Filter\RangeFilter" public="false" abstract="true">
            <argument type="service" id="doctrine" />
            <argument type="service" id="logger" on-invalid="ignore" />
            <argument key="$nameConverter" type="service" id="api_platform.name_converter" on-invalid="ignore" />
        </service>
        <service id="ApiPlatform\Doctrine\Orm\Filter\RangeFilter" alias="api_platform.doctrine.orm.range_filter" />
        <service id="api_platform.doctrine.orm.range_filter.instance" parent="api_platform.doctrine.orm.range_filter">
            <argument type="collection"></argument>
        </service>

        <service id="api_platform.doctrine.orm.date_filter" class="ApiPlatform\Doctrine\Orm\Filter\DateFilter" public="false" abstract="true">
            <argument type="service" id="doctrine" />
            <argument type="service" id="logger" on-invalid="ignore" />
            <argument key="$nameConverter" type="service" id="api_platform.name_converter" on-invalid="ignore" />
        </service>
        <service id="ApiPlatform\Doctrine\Orm\Filter\DateFilter" alias="api_platform.doctrine.orm.date_filter" />
        <service id="api_platform.doctrine.orm.date_filter.instance" parent="api_platform.doctrine.orm.date_filter">
            <argument type="collection"></argument>
        </service>

        <service id="api_platform.doctrine.orm.backed_enum_filter" class="ApiPlatform\Doctrine\Orm\Filter\BackedEnumFilter" public="false" abstract="true">
            <argument type="service" id="doctrine" />
            <argument type="service" id="logger" on-invalid="ignore" />
            <argument key="$nameConverter" type="service" id="api_platform.name_converter" on-invalid="ignore" />
        </service>
        <service id="ApiPlatform\Doctrine\Orm\Filter\BackedEnumFilter" alias="api_platform.doctrine.orm.backed_enum_filter" />
        <service id="api_platform.doctrine.orm.backed_enum_filter.instance" parent="api_platform.doctrine.orm.backed_enum_filter">
            <argument type="collection"></argument>
        </service>

        <service id="api_platform.doctrine.orm.boolean_filter" class="ApiPlatform\Doctrine\Orm\Filter\BooleanFilter" public="false" abstract="true">
            <argument type="service" id="doctrine" />
            <argument type="service" id="logger" on-invalid="ignore" />
            <argument key="$nameConverter" type="service" id="api_platform.name_converter" on-invalid="ignore" />
        </service>
        <service id="ApiPlatform\Doctrine\Orm\Filter\BooleanFilter" alias="api_platform.doctrine.orm.boolean_filter" />
        <service id="api_platform.doctrine.orm.boolean_filter.instance" parent="api_platform.doctrine.orm.boolean_filter">
            <argument type="collection"></argument>
        </service>

        <service id="api_platform.doctrine.orm.numeric_filter" class="ApiPlatform\Doctrine\Orm\Filter\NumericFilter" public="false" abstract="true">
            <argument type="service" id="doctrine" />
            <argument type="service" id="logger" on-invalid="ignore" />
            <argument key="$nameConverter" type="service" id="api_platform.name_converter" on-invalid="ignore" />
        </service>
        <service id="ApiPlatform\Doctrine\Orm\Filter\NumericFilter" alias="api_platform.doctrine.orm.numeric_filter" />
        <service id="api_platform.doctrine.orm.numeric_filter.instance" parent="api_platform.doctrine.orm.numeric_filter">
            <argument type="collection"></argument>
        </service>

        <service id="api_platform.doctrine.orm.exists_filter" class="ApiPlatform\Doctrine\Orm\Filter\ExistsFilter" public="false" abstract="true">
            <argument type="service" id="doctrine" />
            <argument type="service" id="logger" on-invalid="ignore" />
            <argument key="$existsParameterName">%api_platform.collection.exists_parameter_name%</argument>
            <argument key="$nameConverter" type="service" id="api_platform.name_converter" on-invalid="ignore" />
        </service>
        <service id="ApiPlatform\Doctrine\Orm\Filter\ExistsFilter" alias="api_platform.doctrine.orm.exists_filter" />
        <service id="api_platform.doctrine.orm.exists_filter.instance" parent="api_platform.doctrine.orm.exists_filter">
            <argument type="collection"></argument>
        </service>

        <!-- Doctrine Query extensions -->

        <service id="api_platform.doctrine.orm.query_extension.eager_loading" class="ApiPlatform\Doctrine\Orm\Extension\EagerLoadingExtension" public="false">
            <argument type="service" id="api_platform.metadata.property.name_collection_factory" />
            <argument type="service" id="api_platform.metadata.property.metadata_factory" />
            <argument>%api_platform.eager_loading.max_joins%</argument>
            <argument>%api_platform.eager_loading.force_eager%</argument>
            <argument>%api_platform.eager_loading.fetch_partial%</argument>
            <argument type="service" id="serializer.mapping.class_metadata_factory" />

            <tag name="api_platform.doctrine.orm.query_extension.item" priority="-8" />
            <!-- After filter_eager_loading -->
            <tag name="api_platform.doctrine.orm.query_extension.collection" priority="-18" />
        </service>
        <service id="ApiPlatform\Doctrine\Orm\Extension\EagerLoadingExtension" alias="api_platform.doctrine.orm.query_extension.eager_loading" />

        <service id="api_platform.doctrine.orm.query_extension.filter" class="ApiPlatform\Doctrine\Orm\Extension\FilterExtension" public="false">
            <argument type="service" id="api_platform.filter_locator" />

            <tag name="api_platform.doctrine.orm.query_extension.collection" priority="-16" />
        </service>
        <service id="ApiPlatform\Doctrine\Orm\Extension\FilterExtension" alias="api_platform.doctrine.orm.query_extension.filter" />

        <!-- This needs to be executed right after the filter extension -->

        <service id="api_platform.doctrine.orm.query_extension.filter_eager_loading" class="ApiPlatform\Doctrine\Orm\Extension\FilterEagerLoadingExtension" public="false">
            <argument>%api_platform.eager_loading.force_eager%</argument>
            <argument type="service" id="api_platform.resource_class_resolver" />

            <tag name="api_platform.doctrine.orm.query_extension.collection" priority="-17" />
        </service>
        <service id="ApiPlatform\Doctrine\Orm\Extension\FilterEagerLoadingExtension" alias="api_platform.doctrine.orm.query_extension.filter_eager_loading" />

        <service id="api_platform.doctrine.orm.query_extension.pagination" class="ApiPlatform\Doctrine\Orm\Extension\PaginationExtension" public="false">
            <argument type="service" id="doctrine" />
            <argument type="service" id="api_platform.pagination" />

            <tag name="api_platform.doctrine.orm.query_extension.collection" priority="-64" />
        </service>
        <service id="ApiPlatform\Doctrine\Orm\Extension\PaginationExtension" alias="api_platform.doctrine.orm.query_extension.pagination" />

        <service id="api_platform.doctrine.orm.query_extension.order" class="ApiPlatform\Doctrine\Orm\Extension\OrderExtension" public="false">
            <argument>%api_platform.collection.order%</argument>

            <tag name="api_platform.doctrine.orm.query_extension.collection" priority="-32" />
        </service>
        <service id="ApiPlatform\Doctrine\Orm\Extension\OrderExtension" alias="api_platform.doctrine.orm.query_extension.order" />

        <service id="api_platform.doctrine.orm.extension.parameter_extension" class="ApiPlatform\Doctrine\Orm\Extension\ParameterExtension" public="false">
            <argument type="service" id="api_platform.filter_locator" />
            <tag name="api_platform.doctrine.orm.query_extension.collection" priority="-16" />
            <tag name="api_platform.doctrine.orm.query_extension.item" priority="-9" />
        </service>
        <service id="ApiPlatform\Doctrine\Orm\Extension\ParameterExtension" alias="api_platform.doctrine.orm.extension.parameter_extension" />

        <!-- Metadata loader -->
        <service id="api_platform.doctrine.orm.metadata.property.metadata_factory" class="ApiPlatform\Doctrine\Orm\Metadata\Property\DoctrineOrmPropertyMetadataFactory" decorates="api_platform.metadata.property.metadata_factory" decoration-priority="40" public="false">
            <argument type="service" id="doctrine" />
            <argument type="service" id="api_platform.doctrine.orm.metadata.property.metadata_factory.inner" />
        </service>

        <service id="api_platform.doctrine.orm.state.collection_provider" class="ApiPlatform\Doctrine\Orm\State\CollectionProvider" public="false">
            <argument type="service" id="api_platform.metadata.resource.metadata_collection_factory" />
            <argument type="service" id="doctrine" />
            <argument type="tagged_iterator" tag="api_platform.doctrine.orm.query_extension.collection" />
            <argument type="tagged_locator" tag="api_platform.doctrine.orm.links_handler" index-by="key" />

            <tag name="api_platform.state_provider" priority="-100" key="ApiPlatform\Doctrine\Orm\State\CollectionProvider" />
            <tag name="api_platform.state_provider" priority="-100" key="api_platform.doctrine.orm.state.collection_provider" />
        </service>
        <service id="ApiPlatform\Doctrine\Orm\State\CollectionProvider" alias="api_platform.doctrine.orm.state.collection_provider" />

        <service id="api_platform.doctrine.orm.state.item_provider" class="ApiPlatform\Doctrine\Orm\State\ItemProvider" public="false">
            <argument type="service" id="api_platform.metadata.resource.metadata_collection_factory" />
            <argument type="service" id="doctrine" />
            <argument type="tagged_iterator" tag="api_platform.doctrine.orm.query_extension.item" />
            <argument type="tagged_locator" tag="api_platform.doctrine.orm.links_handler" index-by="key" />

            <tag name="api_platform.state_provider" priority="-100" key="ApiPlatform\Doctrine\Orm\State\ItemProvider" />
            <tag name="api_platform.state_provider" priority="-100" key="api_platform.doctrine.orm.state.item_provider" />
        </service>
        <service id="ApiPlatform\Doctrine\Orm\State\ItemProvider" alias="api_platform.doctrine.orm.state.item_provider" />
        <service id="api_platform.state.item_provider" alias="ApiPlatform\Doctrine\Orm\State\ItemProvider" />

        <service id="api_platform.doctrine.orm.search_filter" class="ApiPlatform\Doctrine\Orm\Filter\SearchFilter" public="false" abstract="true">
            <argument type="service" id="doctrine" />
            <argument type="service" id="api_platform.iri_converter" />
            <argument type="service" id="api_platform.property_accessor" />
            <argument type="service" id="logger" on-invalid="ignore" />
            <argument key="$identifiersExtractor" type="service" id="api_platform.identifiers_extractor" on-invalid="ignore" />
            <argument key="$nameConverter" type="service" id="api_platform.name_converter" on-invalid="ignore" />
        </service>
        <service id="ApiPlatform\Doctrine\Orm\Filter\SearchFilter" alias="api_platform.doctrine.orm.search_filter" />

        <service id="api_platform.doctrine.orm.search_filter.instance" parent="api_platform.doctrine.orm.search_filter">
            <argument type="collection"></argument>
        </service>

        <service id="api_platform.doctrine.orm.metadata.resource.metadata_collection_factory" class="ApiPlatform\Doctrine\Orm\Metadata\Resource\DoctrineOrmResourceCollectionMetadataFactory" decorates="api_platform.metadata.resource.metadata_collection_factory" decoration-priority="40">
            <argument type="service" id="doctrine" />
            <argument type="service" id="api_platform.doctrine.orm.metadata.resource.metadata_collection_factory.inner" />
        </service>

        <service id="api_platform.doctrine.orm.metadata.resource.link_factory" class="ApiPlatform\Doctrine\Orm\Metadata\Resource\DoctrineOrmLinkFactory" decorates="api_platform.metadata.resource.link_factory" decoration-priority="40">
            <argument type="service" id="doctrine" />
            <argument type="service" id="api_platform.metadata.property.name_collection_factory" />
            <argument type="service" id="api_platform.resource_class_resolver" />
            <argument type="service" id="api_platform.doctrine.orm.metadata.resource.link_factory.inner" />
        </service>

        <service id="api_platform.doctrine.orm.links_handler" class="ApiPlatform\Doctrine\Orm\State\LinksHandler">
            <argument type="service" id="api_platform.metadata.resource.metadata_collection_factory" />
            <argument type="service" id="doctrine" />

            <tag name="api_platform.doctrine.orm.links_handler" key="api_platform.doctrine.orm.links_handler" />
        </service>
    </services>

</container>
