<?xml version="1.0"?>
<component name="org.nuxeo.ecm.platform.tag.service.pageprovider.override">

  <require>org.nuxeo.ecm.platform.tag.service.pageprovider</require>

  <extension point="providers" target="org.nuxeo.ecm.platform.query.api.PageProviderService">

    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_DOCUMENT_IDS_FOR_FACETED_TAG">
      <property name="useUnrestrictedSession">true</property>
      <pattern>
        SELECT DISTINCT ecm:uuid FROM Document WHERE nxtag:tags/*/label = ?
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_DOCUMENT_IDS_FOR_TAG">
      <property name="useUnrestrictedSession">true</property>
      <pattern>
        SELECT ecm:uuid FROM Tag WHERE tag:label = ? AND ecm:isProxy = 0
      </pattern>
      <pageSize>1</pageSize>
    </genericPageProvider>

    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_FIRST_TAGGING_FOR_DOC_AND_TAG">
      <property name="useUnrestrictedSession">true</property>
      <pattern>
        SELECT ecm:uuid FROM Tagging WHERE relation:source = ? AND
        relation:target = ?
      </pattern>
      <pageSize>1</pageSize>
    </genericPageProvider>

    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_FIRST_TAGGING_FOR_DOC_AND_TAG_AND_USER">
      <property name="useUnrestrictedSession">true</property>
      <pattern>
        SELECT ecm:uuid FROM Tagging WHERE relation:source = ? AND
        relation:target = ? AND dc:creator = ?
      </pattern>
      <pageSize>1</pageSize>
    </genericPageProvider>

    <!-- page provider that can be optimized using ES for instance -->
    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_TAGS_FOR_DOCUMENT">
      <property name="useUnrestrictedSession">true</property>
      <property name="language">NXTAG</property>
      <pattern>
        TAGISTARGET: SELECT DISTINCT tag:label FROM Tagging WHERE
        relation:source = ?
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

    <!-- page provider that should keep on using the VCS storage -->
    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_TAGS_FOR_DOCUMENT_CORE">
      <property name="useUnrestrictedSession">true</property>
      <property name="language">NXTAG</property>
      <pattern>
        TAGISTARGET: SELECT DISTINCT tag:label FROM Tagging WHERE
        relation:source = ?
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_DOCUMENTS_FOR_TAG">
      <property name="useUnrestrictedSession">true</property>
      <property name="language">NXTAG</property>
      <pattern>
        TAGISTARGET: SELECT DISTINCT relation:source FROM Tagging WHERE
        tag:label = ?
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

    <!-- page provider that can be optimized using ES for instance -->
    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_TAGS_FOR_DOCUMENT_AND_USER">
      <property name="useUnrestrictedSession">true</property>
      <property name="language">NXTAG</property>
      <pattern>
        TAGISTARGET: SELECT DISTINCT tag:label FROM Tagging WHERE
        relation:source = ? AND dc:creator = ?
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

    <!-- page provider that should keep on using the VCS storage -->
    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_TAGS_FOR_DOCUMENT_AND_USER_CORE">
      <property name="useUnrestrictedSession">true</property>
      <property name="language">NXTAG</property>
      <pattern>
        TAGISTARGET: SELECT DISTINCT tag:label FROM Tagging WHERE
        relation:source = ? AND dc:creator = ?
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_DOCUMENTS_FOR_TAG_AND_USER">
      <property name="useUnrestrictedSession">true</property>
      <property name="language">NXTAG</property>
      <pattern>
        TAGISTARGET: SELECT DISTINCT relation:source FROM Tagging WHERE
        tag:label = ? AND dc:creator = ?
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_TAGS_TO_COPY_FOR_DOCUMENT">
      <property name="useUnrestrictedSession">true</property>
      <property name="language">NXTAG</property>
      <pattern>
        TAGISTARGET: SELECT tag:label, dc:created, dc:creator,
        relation:target FROM Tagging
        WHERE relation:source = ?
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_FACETED_TAG_SUGGESTIONS">
      <property name="useUnrestrictedSession">true</property>
      <pattern>
        SELECT nxtag:tags/*1/label FROM Document WHERE nxtag:tags/*1/label LIKE ? AND
        ecm:isProxy = 0
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_TAG_SUGGESTIONS">
      <property name="useUnrestrictedSession">true</property>
      <pattern>
        SELECT DISTINCT tag:label FROM Tag WHERE tag:label LIKE ? AND
        ecm:isProxy = 0
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_TAG_SUGGESTIONS_FOR_USER">
      <property name="useUnrestrictedSession">true</property>
      <pattern>
        SELECT DISTINCT tag:label FROM Tag WHERE tag:label LIKE ? AND
        ecm:isProxy = 0
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_ALL_TAGS">
      <property name="useUnrestrictedSession">true</property>
      <property name="language">NXTAG</property>
      <pattern>
        COUNTSOURCE: SELECT tag:label, relation:source FROM Tagging
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_ALL_TAGS_FOR_USER">
      <property name="useUnrestrictedSession">true</property>
      <property name="language">NXTAG</property>
      <pattern>
        COUNTSOURCE: SELECT tag:label, relation:source FROM Tagging WHERE
        dc:creator = ?
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_TAGS_FOR_DOCUMENTS">
      <property name="useUnrestrictedSession">true</property>
      <property name="language">NXTAG</property>
      <pattern>
        COUNTSOURCE: SELECT tag:label, relation:source FROM Tagging WHERE
        relation:source IN ?
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_TAGS_FOR_DOCUMENTS_AND_USER">
      <property name="useUnrestrictedSession">true</property>
      <property name="language">NXTAG</property>
      <pattern>
        COUNTSOURCE: SELECT tag:label, relation:source FROM Tagging WHERE
        relation:source IN ? AND dc:creator = ?
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

    <genericPageProvider class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider" name="GET_TAGGED_DOCUMENTS_UNDER">
      <property name="useUnrestrictedSession">true</property>
      <pattern>
        SELECT ecm:uuid FROM Document WHERE ecm:path STARTSWITH ?
      </pattern>
      <pageSize>0</pageSize>
      <maxPageSize>0</maxPageSize>
    </genericPageProvider>

  </extension>

</component>
