diff --git a/eZ/Publish/API/Repository/Tests/SearchServiceFieldFiltersTest.php b/eZ/Publish/API/Repository/Tests/SearchServiceFieldFiltersTest.php
new file mode 100644
index 00000000000..aefeef1cb35
--- /dev/null
+++ b/eZ/Publish/API/Repository/Tests/SearchServiceFieldFiltersTest.php
@@ -0,0 +1,4263 @@
+getSetupFactory();
+
+ if ( !$setupFactory instanceof LegacyElasticsearch )
+ {
+ $this->markTestIncomplete( "ATM implemented only for Elasticsearch storage" );
+ }
+
+ parent::setUp();
+ }
+
+ protected function addMapLocationToFolderType()
+ {
+ $repository = $this->getRepository();
+ $contentTypeService = $repository->getContentTypeService();
+
+ $contentTypeDraft = $contentTypeService->createContentTypeDraft(
+ $contentTypeService->loadContentTypeByIdentifier( 'folder' )
+ );
+
+ $fieldDefinitionCreateStruct = $contentTypeService->newFieldDefinitionCreateStruct(
+ "map_location",
+ "ezgmaplocation"
+ );
+ $fieldDefinitionCreateStruct->names = array( "eng-GB" => "Map location field" );
+ $fieldDefinitionCreateStruct->fieldGroup = "main";
+ $fieldDefinitionCreateStruct->position = 1;
+ $fieldDefinitionCreateStruct->isTranslatable = true;
+ $fieldDefinitionCreateStruct->isSearchable = true;
+
+ $contentTypeService->addFieldDefinition( $contentTypeDraft, $fieldDefinitionCreateStruct );
+
+ $contentTypeService->publishContentTypeDraft( $contentTypeDraft );
+ }
+
+ /**
+ * @param string $languageCode1
+ * @param string $name1
+ * @param string $languageCode2
+ * @param string $name2
+ * @param string $mainLanguageCode
+ * @param boolean $alwaysAvailable
+ *
+ * @return \eZ\Publish\API\Repository\Values\Content\Content
+ */
+ protected function createTestFolderWithName(
+ $languageCode1,
+ $name1,
+ $languageCode2,
+ $name2,
+ $mainLanguageCode,
+ $alwaysAvailable = false
+ )
+ {
+ $repository = $this->getRepository();
+ $contentService = $repository->getContentService();
+ $contentTypeService = $repository->getContentTypeService();
+ $locationService = $repository->getLocationService();
+
+ $contentCreateStruct = $contentService->newContentCreateStruct(
+ $contentTypeService->loadContentTypeByIdentifier( 'folder' ),
+ $mainLanguageCode
+ );
+ $contentCreateStruct->alwaysAvailable = $alwaysAvailable;
+
+ $contentCreateStruct->setField( "name", $name1, $languageCode1 );
+ $contentCreateStruct->setField( "name", $name2, $languageCode2 );
+
+ $content = $contentService->publishVersion(
+ $contentService->createContent(
+ $contentCreateStruct,
+ array( $locationService->newLocationCreateStruct( 2 ) )
+ )->versionInfo
+ );
+
+ return $content;
+ }
+
+ /**
+ * @param string $languageCode1
+ * @param string $location1
+ * @param string $languageCode2
+ * @param string $location2
+ * @param string $mainLanguageCode
+ * @param boolean $alwaysAvailable
+ *
+ * @return \eZ\Publish\API\Repository\Values\Content\Content
+ */
+ protected function createTestFolderWithLocation(
+ $languageCode1,
+ $location1,
+ $languageCode2,
+ $location2,
+ $mainLanguageCode,
+ $alwaysAvailable = false
+ )
+ {
+ $repository = $this->getRepository();
+ $contentService = $repository->getContentService();
+ $contentTypeService = $repository->getContentTypeService();
+ $locationService = $repository->getLocationService();
+
+ $contentCreateStruct = $contentService->newContentCreateStruct(
+ $contentTypeService->loadContentTypeByIdentifier( 'folder' ),
+ $mainLanguageCode
+ );
+ $contentCreateStruct->alwaysAvailable = $alwaysAvailable;
+
+ $contentCreateStruct->setField(
+ "map_location",
+ array(
+ "latitude" => $location1[0],
+ "longitude" => $location1[1],
+ "address" => "",
+ ),
+ $languageCode1
+ );
+ $contentCreateStruct->setField(
+ "map_location",
+ array(
+ "latitude" => $location2[0],
+ "longitude" => $location2[1],
+ "address" => "",
+ ),
+ $languageCode2
+ );
+
+ $content = $contentService->publishVersion(
+ $contentService->createContent(
+ $contentCreateStruct,
+ array( $locationService->newLocationCreateStruct( 2 ) )
+ )->versionInfo
+ );
+
+ return $content;
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * Demonstrating how mismatch between field filters and language filtering criteria
+ * when using non-field filtering criteria can cause NotFound exception.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException
+ */
+ public function testFieldFiltersCauseNotFoundException()
+ {
+ // Content with id=54 exists only in eng-US language!
+ $query = new Query(
+ array(
+ "filter" => new Criterion\ContentId( 54 ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ // The content will be found, but field filtering in the service will cause the exception.
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ );
+
+ $searchService->findContent( $query, $fieldFilters );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextQueryLanguageAll( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\FullText( "one" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextQueryLanguage( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\FullText( "one" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextQueryLanguageComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\FullText( "one" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextQueryLanguageEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\FullText( "one" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextQueryLanguageAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", false );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\FullText( "one" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextQueryLanguageAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB", false );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\FullText( "one" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextQueryAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\FullText( "one" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextQueryAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\FullText( "one" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextQueryAlwaysAvailableEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\FullText( "two" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextFilterLanguageAll()
+ {
+ $this->testFullTextQueryLanguageAll( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextFilterLanguage()
+ {
+ $this->testFullTextQueryLanguage( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextFilterLanguageComplement()
+ {
+ $this->testFullTextQueryLanguageComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextFilterLanguageEmpty()
+ {
+ $this->testFullTextQueryLanguageEmpty( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextFilterLanguageAlwaysAvailable()
+ {
+ $this->testFullTextQueryLanguageAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextFilterLanguageAlwaysAvailableComplement()
+ {
+ $this->testFullTextQueryLanguageAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextFilterAlwaysAvailable()
+ {
+ $this->testFullTextQueryAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextFilterAlwaysAvailableComplement()
+ {
+ $this->testFullTextQueryAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFullTextFilterAlwaysAvailableEmpty()
+ {
+ $this->testFullTextQueryAlwaysAvailableEmpty( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldQueryAll( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::EQ, "two" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldQuery( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::EQ, "two" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldQueryComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::EQ, "two" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldQueryEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::EQ, "two" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldQueryLanguageAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", false );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::EQ, "one" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldQueryLanguageAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB", false );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::EQ, "one" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldQueryAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::EQ, "one" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldQueryAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::EQ, "one" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldQueryAlwaysAvailableEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::EQ, "two" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeQueryAll( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::GTE, "z" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeQuery( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::GTE, "z" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeQueryComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::GTE, "z" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeQueryEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::GTE, "z" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeQueryLanguageAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB", false );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::GTE, "z" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_DESC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeQueryLanguageAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB", false );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::GTE, "z" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_DESC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeQueryAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::GTE, "z" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_DESC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeQueryAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::GTE, "z" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeQueryAlwaysAvailableEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\Field( "name", Operator::GTE, "z" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldFilterAll()
+ {
+ $this->testFieldQueryAll( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldFilter()
+ {
+ $this->testFieldQuery( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldFilterComplement()
+ {
+ $this->testFieldQueryComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldFilterEmpty()
+ {
+ $this->testFieldQueryEmpty( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldFilterLanguageAlwaysAvailable()
+ {
+ $this->testFieldQueryLanguageAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldFilterLanguageAlwaysAvailableComplement()
+ {
+ $this->testFieldQueryLanguageAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldFilterAlwaysAvailable()
+ {
+ $this->testFieldQueryAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldFilterAlwaysAvailableComplement()
+ {
+ $this->testFieldQueryAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldFilterAlwaysAvailableEmpty()
+ {
+ $this->testFieldQueryAlwaysAvailableEmpty( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeFilterAll()
+ {
+ $this->testFieldRangeQueryAll( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeFilter()
+ {
+ $this->testFieldRangeQuery( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeFilterComplement()
+ {
+ $this->testFieldRangeQueryComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeFilterEmpty()
+ {
+ $this->testFieldRangeQueryEmpty( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeFilterLanguageAlwaysAvailable()
+ {
+ $this->testFieldRangeQueryLanguageAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeFilterLanguageAlwaysAvailableComplement()
+ {
+ $this->testFieldRangeQueryLanguageAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeFilterAlwaysAvailable()
+ {
+ $this->testFieldRangeQueryAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeFilterAlwaysAvailableComplement()
+ {
+ $this->testFieldRangeQueryAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testFieldRangeFilterAlwaysAvailableEmpty()
+ {
+ $this->testFieldRangeQueryAlwaysAvailableEmpty( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldQueryAll( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field(
+ "short_description",
+ Operator::EQ,
+ "two"
+ ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldQuery( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field(
+ "short_description",
+ Operator::EQ,
+ "two"
+ ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldQueryComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field(
+ "short_description",
+ Operator::EQ,
+ "two"
+ ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldQueryEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field(
+ "short_description",
+ Operator::EQ,
+ "two"
+ ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldQueryLanguageAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", false );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field( "short_description", Operator::EQ, "one" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldQueryLanguageAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB", false );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field( "short_description", Operator::EQ, "one" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldQueryAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field( "short_description", Operator::EQ, "one" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldQueryAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB", true );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field( "short_description", Operator::EQ, "one" ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldQueryAlwaysAvailableEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field( "short_description", Operator::EQ, "two" ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeQueryAll( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field( "short_description", Operator::GTE, "z" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeQuery( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field( "short_description", Operator::GTE, "z" ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeQueryComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field( "short_description", Operator::GTE, "z" ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeQueryEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field( "short_description", Operator::GTE, "z" ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeQueryLanguageAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB", false );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field( "short_description", Operator::GTE, "z" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_DESC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeQueryLanguageAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB", false );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field( "short_description", Operator::GTE, "z" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_DESC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeQueryAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field( "short_description", Operator::GTE, "z" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_DESC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeQueryAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB", true );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field( "short_description", Operator::GTE, "z" ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeQueryAlwaysAvailableEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-US", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB", true );
+
+ $query = new Query(
+ array(
+ $type => $criterion = new Criterion\Field( "short_description", Operator::GTE, "z" ),
+ )
+ );
+
+ $criterion->setCustomField( "folder", "short_description", "folder_name_value_ms" );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldFilterAll()
+ {
+ $this->testModifiedFieldQueryAll( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldFilter()
+ {
+ $this->testModifiedFieldQuery( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldFilterComplement()
+ {
+ $this->testModifiedFieldQueryComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldFilterEmpty()
+ {
+ $this->testModifiedFieldQueryEmpty( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldFilterLanguageAlwaysAvailable()
+ {
+ $this->testModifiedFieldQueryLanguageAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldFilterLanguageAlwaysAvailableComplement()
+ {
+ $this->testModifiedFieldQueryLanguageAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldFilterAlwaysAvailable()
+ {
+ $this->testModifiedFieldQueryAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldFilterAlwaysAvailableComplement()
+ {
+ $this->testModifiedFieldQueryAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldFilterAlwaysAvailableEmpty()
+ {
+ $this->testModifiedFieldQueryAlwaysAvailableEmpty( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeFilterAll()
+ {
+ $this->testModifiedFieldRangeQueryAll( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeFilter()
+ {
+ $this->testModifiedFieldRangeQuery( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeFilterComplement()
+ {
+ $this->testModifiedFieldRangeQueryComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeFilterEmpty()
+ {
+ $this->testModifiedFieldRangeQueryEmpty( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeFilterLanguageAlwaysAvailable()
+ {
+ $this->testModifiedFieldRangeQueryLanguageAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeFilterLanguageAlwaysAvailableComplement()
+ {
+ $this->testModifiedFieldRangeQueryLanguageAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeFilterAlwaysAvailable()
+ {
+ $this->testModifiedFieldRangeQueryAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeFilterAlwaysAvailableComplement()
+ {
+ $this->testModifiedFieldRangeQueryAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testModifiedFieldRangeFilterAlwaysAvailableEmpty()
+ {
+ $this->testModifiedFieldRangeQueryAlwaysAvailableEmpty( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceQueryAll( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $this->addMapLocationToFolderType();
+
+ $content1 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 20, 20 ),
+ "eng-US",
+ array( 30, 30 ),
+ "eng-GB"
+ );
+ $content2 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 30, 30 ),
+ "eng-US",
+ array( 20, 20 ),
+ "eng-GB"
+ );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\MapLocationDistance(
+ "map_location",
+ Criterion\Operator::LTE,
+ 2000,
+ 10,
+ 10
+ ),
+ 'sortClauses' => array(
+ new SortClause\MapLocationDistance(
+ "folder",
+ "map_location",
+ 10,
+ 10,
+ Query::SORT_ASC,
+ "eng-GB"
+ ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceQuery( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $this->addMapLocationToFolderType();
+
+ $content1 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 20, 20 ),
+ "eng-US",
+ array( 30, 30 ),
+ "eng-GB"
+ );
+ $content2 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 30, 30 ),
+ "eng-US",
+ array( 20, 20 ),
+ "eng-GB"
+ );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\MapLocationDistance(
+ "map_location",
+ Criterion\Operator::LTE,
+ 2000,
+ 10,
+ 10
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceQueryComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $this->addMapLocationToFolderType();
+
+ $content1 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 20, 20 ),
+ "eng-US",
+ array( 30, 30 ),
+ "eng-GB"
+ );
+ $content2 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 30, 30 ),
+ "eng-US",
+ array( 20, 20 ),
+ "eng-GB"
+ );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\MapLocationDistance(
+ "map_location",
+ Criterion\Operator::LTE,
+ 2000,
+ 10,
+ 10
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceQueryEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $this->addMapLocationToFolderType();
+
+ $content1 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 20, 20 ),
+ "eng-US",
+ array( 30, 30 ),
+ "eng-GB"
+ );
+ $content2 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 30, 30 ),
+ "eng-US",
+ array( 20, 20 ),
+ "eng-GB"
+ );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\MapLocationDistance(
+ "map_location",
+ Criterion\Operator::LTE,
+ 2000,
+ 10,
+ 10
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceQueryLanguageAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $this->addMapLocationToFolderType();
+
+ $content1 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 20, 20 ),
+ "eng-US",
+ array( 30, 30 ),
+ "eng-GB",
+ false
+ );
+ $content2 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 30, 30 ),
+ "eng-US",
+ array( 20, 20 ),
+ "eng-US",
+ true
+ );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\MapLocationDistance(
+ "map_location",
+ Criterion\Operator::LTE,
+ 2000,
+ 10,
+ 10
+ ),
+ 'sortClauses' => array(
+ new SortClause\MapLocationDistance(
+ "folder",
+ "map_location",
+ 10,
+ 10,
+ Query::SORT_ASC,
+ "eng-GB"
+ ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceQueryLanguageAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $this->addMapLocationToFolderType();
+
+ $content1 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 20, 20 ),
+ "eng-US",
+ array( 30, 30 ),
+ "eng-GB",
+ true
+ );
+ $content2 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 30, 30 ),
+ "eng-US",
+ array( 20, 20 ),
+ "eng-GB",
+ false
+ );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\MapLocationDistance(
+ "map_location",
+ Criterion\Operator::LTE,
+ 2000,
+ 10,
+ 10
+ ),
+ 'sortClauses' => array(
+ new SortClause\MapLocationDistance(
+ "folder",
+ "map_location",
+ 10,
+ 10,
+ Query::SORT_ASC,
+ "eng-GB"
+ ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceQueryAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $this->addMapLocationToFolderType();
+
+ $content1 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 20, 20 ),
+ "eng-US",
+ array( 30, 30 ),
+ "eng-GB",
+ true
+ );
+ $content2 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 30, 30 ),
+ "eng-US",
+ array( 20, 20 ),
+ "eng-US",
+ true
+ );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\MapLocationDistance(
+ "map_location",
+ Criterion\Operator::LTE,
+ 2000,
+ 10,
+ 10
+ ),
+ 'sortClauses' => array(
+ new SortClause\MapLocationDistance(
+ "folder",
+ "map_location",
+ 10,
+ 10,
+ Query::SORT_ASC,
+ "eng-GB"
+ ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceQueryAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $this->addMapLocationToFolderType();
+
+ $content1 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 20, 20 ),
+ "eng-US",
+ array( 30, 30 ),
+ "eng-GB",
+ true
+ );
+ $content2 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 30, 30 ),
+ "eng-US",
+ array( 20, 20 ),
+ "eng-GB",
+ true
+ );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\MapLocationDistance(
+ "map_location",
+ Criterion\Operator::LTE,
+ 2000,
+ 10,
+ 10
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceQueryAlwaysAvailableEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $this->addMapLocationToFolderType();
+
+ $content1 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 20, 20 ),
+ "eng-US",
+ array( 30, 30 ),
+ "eng-US",
+ true
+ );
+ $content2 = $this->createTestFolderWithLocation(
+ "eng-GB",
+ array( 30, 30 ),
+ "eng-US",
+ array( 20, 20 ),
+ "eng-GB",
+ true
+ );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\MapLocationDistance(
+ "map_location",
+ Criterion\Operator::LTE,
+ 2000,
+ 10,
+ 10
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceFilterAll()
+ {
+ $this->testMapLocationDistanceQueryAll( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceFilter()
+ {
+ $this->testMapLocationDistanceQuery( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceFilterComplement()
+ {
+ $this->testMapLocationDistanceQueryComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceFilterEmpty()
+ {
+ $this->testMapLocationDistanceQueryEmpty( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceFilterLanguageAlwaysAvailable()
+ {
+ $this->testMapLocationDistanceQueryLanguageAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceFilterLanguageAlwaysAvailableComplement()
+ {
+ $this->testMapLocationDistanceQueryLanguageAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceFilterAlwaysAvailable()
+ {
+ $this->testMapLocationDistanceQueryAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceFilterAlwaysAvailableComplement()
+ {
+ $this->testMapLocationDistanceQueryAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testMapLocationDistanceFilterAlwaysAvailableEmpty()
+ {
+ $this->testMapLocationDistanceQueryAlwaysAvailableEmpty( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldQueryAll( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField(
+ "folder_name_value_ms",
+ Operator::EQ,
+ "two"
+ ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldQuery( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField(
+ "folder_name_value_ms",
+ Operator::EQ,
+ "two"
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldQueryComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField(
+ "folder_name_value_ms",
+ Operator::EQ,
+ "two"
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldQueryEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField(
+ "folder_name_value_ms",
+ Operator::EQ,
+ "two"
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldQueryLanguageAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", false );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField(
+ "folder_name_value_ms",
+ Operator::EQ,
+ "one"
+ ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldQueryLanguageAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB", false );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField(
+ "folder_name_value_ms",
+ Operator::EQ,
+ "one"
+ ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldQueryAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField(
+ "folder_name_value_ms",
+ Operator::EQ,
+ "one"
+ ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldQueryAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField(
+ "folder_name_value_ms",
+ Operator::EQ,
+ "one"
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldQueryAlwaysAvailableEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "one", "eng-US", "two", "eng-US", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "two", "eng-US", "one", "eng-GB", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField(
+ "folder_name_value_ms",
+ Operator::EQ,
+ "one"
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeQueryAll( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField( "folder_name_value_ms", Operator::GTE, "z" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_ASC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeQuery( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField( "folder_name_value_ms", Operator::GTE, "z" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeQueryComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField( "folder_name_value_ms", Operator::GTE, "z" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeQueryEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB" );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB" );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField( "folder_name_value_ms", Operator::GTE, "z" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeQueryLanguageAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB", false );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField( "folder_name_value_ms", Operator::GTE, "z" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_DESC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-GB",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeQueryLanguageAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB", false );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField( "folder_name_value_ms", Operator::GTE, "z" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_DESC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "eng-US",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeQueryAlwaysAvailable( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-US", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField( "folder_name_value_ms", Operator::GTE, "z" ),
+ 'sortClauses' => array(
+ new SortClause\Field( "folder", "name", Query::SORT_DESC, "eng-GB" ),
+ ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 2, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ $this->assertEquals( $content2->id, $searchResult->searchHits[1]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeQueryAlwaysAvailableComplement( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-GB", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField( "folder_name_value_ms", Operator::GTE, "z" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 1, $searchResult->totalCount );
+ $this->assertEquals( $content1->id, $searchResult->searchHits[0]->valueObject->id );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @param string $type
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeQueryAlwaysAvailableEmpty( $type = null )
+ {
+ if ( $type === null )
+ {
+ $type = "query";
+ }
+
+ $content1 = $this->createTestFolderWithName( "eng-GB", "z", "eng-US", "e", "eng-US", true );
+ $content2 = $this->createTestFolderWithName( "eng-GB", "e", "eng-US", "z", "eng-GB", true );
+
+ $query = new Query(
+ array(
+ $type => new Criterion\CustomField( "folder_name_value_ms", Operator::GTE, "z" ),
+ )
+ );
+
+ $repository = $this->getRepository();
+ $searchService = $repository->getSearchService();
+
+ $fieldFilters = array(
+ "languages" => array(
+ "ger-DE",
+ ),
+ "useAlwaysAvailable" => true,
+ );
+
+ $searchResult = $searchService->findContent( $query, $fieldFilters );
+
+ $this->assertEquals( 0, $searchResult->totalCount );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldFilterAll()
+ {
+ $this->testCustomFieldQueryAll( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldFilter()
+ {
+ $this->testCustomFieldQuery( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldFilterComplement()
+ {
+ $this->testCustomFieldQueryComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldFilterEmpty()
+ {
+ $this->testCustomFieldQueryEmpty( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldFilterLanguageAlwaysAvailable()
+ {
+ $this->testCustomFieldQueryLanguageAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldFilterLanguageAlwaysAvailableComplement()
+ {
+ $this->testCustomFieldQueryLanguageAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldFilterAlwaysAvailable()
+ {
+ $this->testCustomFieldQueryAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldFilterAlwaysAvailableComplement()
+ {
+ $this->testCustomFieldQueryAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldFilterAlwaysAvailableEmpty()
+ {
+ $this->testCustomFieldQueryAlwaysAvailableEmpty( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeFilterAll()
+ {
+ $this->testCustomFieldRangeQueryAll( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeFilter()
+ {
+ $this->testCustomFieldRangeQuery( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeFilterComplement()
+ {
+ $this->testCustomFieldRangeQueryComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeFilterEmpty()
+ {
+ $this->testCustomFieldRangeQueryEmpty( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeFilterLanguageAlwaysAvailable()
+ {
+ $this->testCustomFieldRangeQueryLanguageAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeFilterLanguageAlwaysAvailableComplement()
+ {
+ $this->testCustomFieldRangeQueryLanguageAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeFilterAlwaysAvailable()
+ {
+ $this->testCustomFieldRangeQueryAlwaysAvailable( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeFilterAlwaysAvailableComplement()
+ {
+ $this->testCustomFieldRangeQueryAlwaysAvailableComplement( "filter" );
+ }
+
+ /**
+ * Test for the findContent() method.
+ *
+ * @see \eZ\Publish\API\Repository\SearchService::findContent()
+ * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService
+ */
+ public function testCustomFieldRangeFilterAlwaysAvailableEmpty()
+ {
+ $this->testCustomFieldRangeQueryAlwaysAvailableEmpty( "filter" );
+ }
+}
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/LogicalAnd.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/LogicalAnd.php
index 5f115ff2b97..437dee505c2 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/LogicalAnd.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/LogicalAnd.php
@@ -35,17 +35,18 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
/** @var $criterion \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator */
return array(
"and" => array_map(
- function ( $value ) use ( $dispatcher )
+ function ( $value ) use ( $dispatcher, $fieldFilters )
{
- return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_FILTER );
+ return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_FILTER, $fieldFilters );
},
$criterion->criteria
)
@@ -57,19 +58,20 @@ function ( $value ) use ( $dispatcher )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
/** @var $criterion \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator */
return array(
"bool" => array(
"must" => array(
array_map(
- function ( $value ) use ( $dispatcher )
+ function ( $value ) use ( $dispatcher, $fieldFilters )
{
- return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_QUERY );
+ return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_QUERY, $fieldFilters );
},
$criterion->criteria
),
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/LogicalNot.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/LogicalNot.php
index fa062927148..46f378b23a5 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/LogicalNot.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/LogicalNot.php
@@ -52,16 +52,17 @@ protected function validateCriterionInput( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$this->validateCriterionInput( $criterion );
/** @var $criterion \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator */
return array(
- "not" => $dispatcher->dispatch( $criterion->criteria[0], Dispatcher::CONTEXT_FILTER )
+ "not" => $dispatcher->dispatch( $criterion->criteria[0], Dispatcher::CONTEXT_FILTER, $fieldFilters )
);
}
@@ -70,17 +71,22 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$this->validateCriterionInput( $criterion );
/** @var $criterion \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator */
return array(
"bool" => array(
- "must_not" => $dispatcher->dispatch( $criterion->criteria[0], Dispatcher::CONTEXT_FILTER ),
+ "must_not" => $dispatcher->dispatch(
+ $criterion->criteria[0],
+ Dispatcher::CONTEXT_FILTER,
+ $fieldFilters
+ ),
),
);
}
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/LogicalOr.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/LogicalOr.php
index c13241750c0..7273217ae5d 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/LogicalOr.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/LogicalOr.php
@@ -35,17 +35,18 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
/** @var $criterion \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator */
return array(
"or" => array_map(
- function ( $value ) use ( $dispatcher )
+ function ( $value ) use ( $dispatcher, $fieldFilters )
{
- return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_FILTER );
+ return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_FILTER, $fieldFilters );
},
$criterion->criteria
)
@@ -57,18 +58,19 @@ function ( $value ) use ( $dispatcher )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
/** @var $criterion \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator */
return array(
"bool" => array(
"should" => array_map(
- function ( $value ) use ( $dispatcher )
+ function ( $value ) use ( $dispatcher, $fieldFilters )
{
- return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_FILTER );
+ return $dispatcher->dispatch( $value, Dispatcher::CONTEXT_FILTER, $fieldFilters );
},
$criterion->criteria
),
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/MatchAll.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/MatchAll.php
index 4dc33c699cd..40fb3ec0a5b 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/MatchAll.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/MatchAll.php
@@ -36,10 +36,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"match_all" => new ArrayObject(),
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/MatchNone.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/MatchNone.php
index 50c141950d3..2029de4f3af 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/MatchNone.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Common/CriterionVisitor/MatchNone.php
@@ -35,10 +35,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"terms" => array(
@@ -52,10 +53,11 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"terms" => array(
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor.php
index a4efc3b53c4..ecb2997e9e9 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor.php
@@ -32,10 +32,15 @@ abstract public function canVisit( Criterion $criterion );
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed Hash representation of Elasticsearch filter abstract syntax tree
*/
- abstract public function visitFilter( Criterion $criterion, CriterionVisitorDispatcher $dispatcher = null );
+ abstract public function visitFilter(
+ Criterion $criterion,
+ CriterionVisitorDispatcher $dispatcher,
+ array $fieldFilters
+ );
/**
* Map field value to a proper Elasticsearch query representation
@@ -44,12 +49,13 @@ abstract public function visitFilter( Criterion $criterion, CriterionVisitorDisp
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed Hash representation of Elasticsearch query abstract syntax tree
*/
- public function visitQuery( Criterion $criterion, CriterionVisitorDispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, CriterionVisitorDispatcher $dispatcher, array $fieldFilters )
{
- return $this->visitFilter( $criterion, $dispatcher );
+ return $this->visitFilter( $criterion, $dispatcher, $fieldFilters );
}
/**
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentIdIn.php
index 98dd4fefa9c..f9e10ce90d8 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentIdIn.php
@@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"ids" => array(
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentTypeGroupIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentTypeGroupIdIn.php
index ab3628d3e7c..e9d2d9622ce 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentTypeGroupIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentTypeGroupIdIn.php
@@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentTypeIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentTypeIdIn.php
index 0f52e096ce0..5b64e068b00 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentTypeIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentTypeIdIn.php
@@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentTypeIdentifierIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentTypeIdentifierIn.php
index 5e8eed42cbe..ef1309b519b 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentTypeIdentifierIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ContentTypeIdentifierIn.php
@@ -59,10 +59,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/CustomField.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/CustomField.php
index de796e1113e..e5016988afa 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/CustomField.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/CustomField.php
@@ -16,7 +16,7 @@
/**
* Base class for CustomField criterion visitors
*/
-abstract class CustomField extends CriterionVisitor
+abstract class CustomField extends FieldFilterBase
{
/**
* Returns nested condition common for filter and query contexts.
@@ -34,21 +34,45 @@ abstract protected function getCondition( Criterion $criterion );
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
- return array(
- "nested" => array(
- "path" => "fields_doc",
- "query" => array(
- "bool" => array(
- "should" => $this->getCondition( $criterion ),
- "minimum_should_match" => 1,
- ),
- ),
+ $query = array(
+ "bool" => array(
+ "should" => $this->getCondition( $criterion ),
+ "minimum_should_match" => 1,
),
);
+
+ $fieldFilter = $this->getFieldFilter( $fieldFilters );
+
+ if ( $fieldFilter === null )
+ {
+ $query = array(
+ "nested" => array(
+ "path" => "fields_doc",
+ "query" => $query,
+ ),
+ );
+ }
+ else
+ {
+ $query = array(
+ "nested" => array(
+ "path" => "fields_doc",
+ "query" => array(
+ "filtered" => array(
+ "query" => $query,
+ "filter" => $fieldFilter,
+ ),
+ ),
+ ),
+ );
+ }
+
+ return $query;
}
}
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/CustomField/CustomFieldIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/CustomField/CustomFieldIn.php
index 16023c561e9..b040c37b93e 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/CustomField/CustomFieldIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/CustomField/CustomFieldIn.php
@@ -71,12 +71,13 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
- return array(
+ $filter = array(
"nested" => array(
"path" => "fields_doc",
"filter" => array(
@@ -89,5 +90,21 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
),
),
);
+
+ $fieldFilter = $this->getFieldFilter( $fieldFilters );
+
+ if ( $fieldFilter !== null )
+ {
+ $filter["nested"]["filter"] = array(
+ "bool" => array(
+ "must" => array(
+ $fieldFilter,
+ $filter["nested"]["filter"],
+ ),
+ ),
+ );
+ }
+
+ return $filter;
}
}
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/CustomField/CustomFieldRange.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/CustomField/CustomFieldRange.php
index 818a8ca56f5..5da28ab5e24 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/CustomField/CustomFieldRange.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/CustomField/CustomFieldRange.php
@@ -69,18 +69,31 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
- return array(
+ $filter = array(
"nested" => array(
"path" => "fields_doc",
- "filter" => array(
- "or" => $this->getCondition( $criterion ),
- ),
+ "filter" => $this->getCondition( $criterion ),
),
);
+
+ $fieldFilter = $this->getFieldFilter( $fieldFilters );
+
+ if ( $fieldFilter !== null )
+ {
+ $filter["nested"]["filter"] = array(
+ "and" => array(
+ $fieldFilter,
+ $filter["nested"]["filter"],
+ ),
+ );
+ }
+
+ return $filter;
}
}
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/ModifiedIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/ModifiedIn.php
index 9cb600c869b..c61caef8934 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/ModifiedIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/ModifiedIn.php
@@ -43,10 +43,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/ModifiedRange.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/ModifiedRange.php
index 7a75fe0852d..324694f13a0 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/ModifiedRange.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/ModifiedRange.php
@@ -46,10 +46,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$start = $this->getNativeTime( $criterion->value[0] );
$end = isset( $criterion->value[1] ) ? $this->getNativeTime( $criterion->value[1] ) : null;
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/PublishedIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/PublishedIn.php
index b69ade12d1a..955f82c5625 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/PublishedIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/PublishedIn.php
@@ -43,10 +43,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/PublishedRange.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/PublishedRange.php
index 25df763dd9b..b81aabd4b22 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/PublishedRange.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DateMetadata/PublishedRange.php
@@ -46,10 +46,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$start = $this->getNativeTime( $criterion->value[0] );
$end = isset( $criterion->value[1] ) ? $this->getNativeTime( $criterion->value[1] ) : null;
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DepthIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DepthIn.php
index dcb55898dc8..e02e2370286 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DepthIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DepthIn.php
@@ -68,10 +68,11 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"nested" => array(
@@ -86,10 +87,11 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"nested" => array(
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DepthRange.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DepthRange.php
index b5c427f2685..884507f2ca6 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DepthRange.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/DepthRange.php
@@ -44,10 +44,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$start = $criterion->value[0];
$end = isset( $criterion->value[1] ) ? $criterion->value[1] : null;
@@ -69,10 +70,11 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$start = $criterion->value[0];
$end = isset( $criterion->value[1] ) ? $criterion->value[1] : null;
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field.php
index d772976083f..1b09de6e59e 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field.php
@@ -16,7 +16,7 @@
/**
* Base class for Field criterion visitors
*/
-abstract class Field extends CriterionVisitor
+abstract class Field extends FieldFilterBase
{
/**
* Field map
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field/FieldIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field/FieldIn.php
index abb2b77bc4a..22b0d748067 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field/FieldIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field/FieldIn.php
@@ -85,7 +85,12 @@ protected function getCondition( Criterion $criterion )
}
}
- return $terms;
+ return array(
+ "bool" => array(
+ "should" => $terms,
+ "minimum_should_match" => 1,
+ ),
+ );
}
/**
@@ -95,24 +100,36 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
- return array(
+ $filter = array(
"nested" => array(
"path" => "fields_doc",
"filter" => array(
- "query" => array(
- "bool" => array(
- "should" => $this->getCondition( $criterion ),
- "minimum_should_match" => 1,
- ),
- ),
+ "query" => $this->getCondition( $criterion ),
),
),
);
+
+ $fieldFilter = $this->getFieldFilter( $fieldFilters );
+
+ if ( $fieldFilters !== null )
+ {
+ $filter["nested"]["filter"] = array(
+ "bool" => array(
+ "must" => array(
+ $fieldFilter,
+ $filter["nested"]["filter"],
+ ),
+ ),
+ );
+ }
+
+ return $filter;
}
/**
@@ -122,21 +139,38 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
- return array(
- "nested" => array(
- "path" => "fields_doc",
- "query" => array(
- "bool" => array(
- "should" => $this->getCondition( $criterion ),
- "minimum_should_match" => 1,
+ $fieldFilter = $this->getFieldFilter( $fieldFilters );
+
+ if ( $fieldFilter === null )
+ {
+ $query = array(
+ "nested" => array(
+ "path" => "fields_doc",
+ "query" => $this->getCondition( $criterion ),
+ ),
+ );
+ }
+ else
+ {
+ $query = array(
+ "nested" => array(
+ "path" => "fields_doc",
+ "query" => array(
+ "filtered" => array(
+ "query" => $this->getCondition( $criterion ),
+ "filter" => $fieldFilter,
+ ),
),
),
- ),
- );
+ );
+ }
+
+ return $query;
}
}
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field/FieldRange.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field/FieldRange.php
index 132a8bdf35d..ef0336fd943 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field/FieldRange.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field/FieldRange.php
@@ -92,12 +92,13 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
- return array(
+ $filter = array(
"nested" => array(
"path" => "fields_doc",
"filter" => array(
@@ -105,6 +106,20 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
),
),
);
+
+ $fieldFilter = $this->getFieldFilter( $fieldFilters );
+
+ if ( $fieldFilters !== null )
+ {
+ $filter["nested"]["filter"] = array(
+ "and" => array(
+ $fieldFilter,
+ $filter["nested"]["filter"],
+ ),
+ );
+ }
+
+ return $filter;
}
/**
@@ -114,21 +129,45 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
- return array(
- "nested" => array(
- "path" => "fields_doc",
- "query" => array(
- "bool" => array(
- "should" => $this->getCondition( $criterion ),
- "minimum_should_match" => 1,
- ),
- ),
+ $query = array(
+ "bool" => array(
+ "should" => $this->getCondition( $criterion ),
+ "minimum_should_match" => 1,
),
);
+
+ $fieldFilter = $this->getFieldFilter( $fieldFilters );
+
+ if ( $fieldFilter === null )
+ {
+ $query = array(
+ "nested" => array(
+ "path" => "fields_doc",
+ "query" => $query,
+ ),
+ );
+ }
+ else
+ {
+ $query = array(
+ "nested" => array(
+ "path" => "fields_doc",
+ "query" => array(
+ "filtered" => array(
+ "query" => $query,
+ "filter" => $fieldFilter,
+ ),
+ ),
+ ),
+ );
+ }
+
+ return $query;
}
}
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field/MapLocationDistanceRange.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field/MapLocationDistanceRange.php
index 43ea4babeba..f2170893f92 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field/MapLocationDistanceRange.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Field/MapLocationDistanceRange.php
@@ -116,12 +116,13 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
- return array(
+ $filter = array(
"nested" => array(
"path" => "fields_doc",
"filter" => array(
@@ -129,6 +130,20 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
),
),
);
+
+ $fieldFilter = $this->getFieldFilter( $fieldFilters );
+
+ if ( $fieldFilters !== null )
+ {
+ $filter["nested"]["filter"] = array(
+ "and" => array(
+ $fieldFilter,
+ $filter["nested"]["filter"],
+ ),
+ );
+ }
+
+ return $filter;
}
/**
@@ -138,21 +153,46 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
- return array(
- "nested" => array(
- "path" => "fields_doc",
- "query" => array(
- "bool" => array(
- "should" => $this->getCondition( $criterion ),
- "minimum_should_match" => 1,
- ),
+ $query = array(
+ "filtered" => array(
+ "filter" => array(
+ "or" => $this->getCondition( $criterion ),
),
),
);
+
+ $fieldFilter = $this->getFieldFilter( $fieldFilters );
+
+ if ( $fieldFilter === null )
+ {
+ $query = array(
+ "nested" => array(
+ "path" => "fields_doc",
+ "query" => $query,
+ ),
+ );
+ }
+ else
+ {
+ $query = array(
+ "nested" => array(
+ "path" => "fields_doc",
+ "query" => array(
+ "filtered" => array(
+ "query" => $query,
+ "filter" => $fieldFilter,
+ ),
+ ),
+ ),
+ );
+ }
+
+ return $query;
}
}
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/FieldFilterBase.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/FieldFilterBase.php
new file mode 100644
index 00000000000..16b4600e95a
--- /dev/null
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/FieldFilterBase.php
@@ -0,0 +1,140 @@
+ array(
+ "fields_doc.meta_language_code_s" => $fieldFilters["languages"],
+ ),
+ );
+
+ if ( isset( $fieldFilters["useAlwaysAvailable"] ) && $fieldFilters["useAlwaysAvailable"] === true )
+ {
+ $filter = array(
+ "or" => array(
+ // Enabling caching requires filters to be wrapped in 'filters' element
+ "filters" => array(
+ $filter,
+ array(
+ "term" => array(
+ "meta_is_always_available_b" => true,
+ ),
+ ),
+ ),
+ // For 'or' filter caching is disabled by default
+ // We enable it as it should be heavily reused
+ "_cache" => true,
+ ),
+ );
+ }
+ }
+
+ return $filter;
+ }
+
+ /**
+ * TODO: should really work something like this, but also
+ * needs update to the UrlAliasService etc
+ *
+ * @param array $fieldFilters
+ *
+ * @return array|null
+ */
+ protected function getTodoFieldFilter( array $fieldFilters )
+ {
+ $translationFilter = null;
+
+ if ( !empty( $fieldFilters["languages"] ) )
+ {
+ $translationFilter = array(
+ "terms" => array(
+ "fields_doc.meta_language_code_s" => $fieldFilters["languages"],
+ ),
+ );
+
+ if ( isset( $fieldFilters["defaultTranslationToMainLanguage"] ) )
+ {
+ switch ( $fieldFilters["defaultTranslationToMainLanguage"] )
+ {
+ case true:
+ $translationFilter = array(
+ "or" => array(
+ $translationFilter,
+ "term" => array(
+ "meta_is_main_translation_b" => true,
+ ),
+ ),
+ );
+ break;
+
+ case "use_always_available":
+ $translationFilter = array(
+ "or" => array(
+ $translationFilter,
+ "and" => array(
+ array(
+ "term" => array(
+ "always_available_b" => true,
+ ),
+ ),
+ array(
+ "term" => array(
+ "meta_is_main_translation_b" => true,
+ ),
+ ),
+ ),
+ ),
+ );
+ break;
+
+ case false:
+ // Nothing to do
+ break;
+
+ default:
+ throw new \RuntimeException(
+ "Invalid value for 'defaultTranslationToMainLanguage' field filter: expected one of: " .
+ "true, 'use_always_available', false, got: " .
+ var_export( $fieldFilters["defaultTranslationToMainLanguage"], true )
+ );
+ }
+ }
+ }
+
+ return $translationFilter;
+ }
+}
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/FullText.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/FullText.php
index b4a41298d45..364022156ff 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/FullText.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/FullText.php
@@ -18,7 +18,7 @@
/**
* Visits the FullText criterion
*/
-class FullText extends CriterionVisitor
+class FullText extends FieldFilterBase
{
/**
* Field map
@@ -118,12 +118,13 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
- return array(
+ $filter = array(
"nested" => array(
"path" => "fields_doc",
"filter" => array(
@@ -131,6 +132,22 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
),
),
);
+
+ $fieldFilter = $this->getFieldFilter( $fieldFilters );
+
+ if ( $fieldFilters !== null )
+ {
+ $filter["nested"]["filter"] = array(
+ "bool" => array(
+ "must" => array(
+ $fieldFilter,
+ $filter["nested"]["filter"],
+ ),
+ ),
+ );
+ }
+
+ return $filter;
}
/**
@@ -140,16 +157,38 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
- return array(
- "nested" => array(
- "path" => "fields_doc",
- "query" => $this->getCondition( $criterion ),
- ),
- );
+ $fieldFilter = $this->getFieldFilter( $fieldFilters );
+
+ if ( $fieldFilter === null )
+ {
+ $query = array(
+ "nested" => array(
+ "path" => "fields_doc",
+ "query" => $this->getCondition( $criterion ),
+ ),
+ );
+ }
+ else
+ {
+ $query = array(
+ "nested" => array(
+ "path" => "fields_doc",
+ "query" => array(
+ "filtered" => array(
+ "query" => $this->getCondition( $criterion ),
+ "filter" => $fieldFilter,
+ ),
+ ),
+ ),
+ );
+ }
+
+ return $query;
}
}
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/LanguageCodeIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/LanguageCodeIn.php
index 9cde9a2f8d2..7a8c1010016 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/LanguageCodeIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/LanguageCodeIn.php
@@ -68,10 +68,11 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$filter = $this->getCondition( $criterion );
@@ -98,10 +99,11 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$filter = $this->getCondition( $criterion );
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/LocationIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/LocationIdIn.php
index a759f7cede4..494a4df29fb 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/LocationIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/LocationIdIn.php
@@ -68,10 +68,11 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"nested" => array(
@@ -86,10 +87,11 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"nested" => array(
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/LocationRemoteIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/LocationRemoteIdIn.php
index c82664e6115..f6d63fb96c5 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/LocationRemoteIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/LocationRemoteIdIn.php
@@ -68,10 +68,11 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"nested" => array(
@@ -86,10 +87,11 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"nested" => array(
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ObjectStateIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ObjectStateIdIn.php
index 5f999e7d345..c157f9e2c49 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ObjectStateIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ObjectStateIdIn.php
@@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ParentLocationIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ParentLocationIdIn.php
index 1be26b055a3..863a856adc8 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ParentLocationIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/ParentLocationIdIn.php
@@ -68,10 +68,11 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"nested" => array(
@@ -86,10 +87,11 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"nested" => array(
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/RemoteIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/RemoteIdIn.php
index 3bbe5129b4c..dabbfa9ee1c 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/RemoteIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/RemoteIdIn.php
@@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/SectionIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/SectionIdIn.php
index 9c918d90326..92e281bdf31 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/SectionIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/SectionIdIn.php
@@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/SubtreeIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/SubtreeIn.php
index 792efdeb22c..dbeaf7ce49b 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/SubtreeIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/SubtreeIn.php
@@ -65,10 +65,11 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"nested" => array(
@@ -85,10 +86,11 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"nested" => array(
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/UserMetadataIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/UserMetadataIn.php
index 9abff59f92f..19376718b13 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/UserMetadataIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/UserMetadataIn.php
@@ -44,10 +44,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
switch ( $criterion->target )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Visibility.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Visibility.php
index 99a5a6d5321..c8b3cd36fe7 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Visibility.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitor/Visibility.php
@@ -48,10 +48,11 @@ protected function getInternalValue( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"nested" => array(
@@ -70,10 +71,11 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"nested" => array(
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitorDispatcher.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitorDispatcher.php
index 82bae289628..3714864e56a 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitorDispatcher.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/CriterionVisitorDispatcher.php
@@ -76,10 +76,11 @@ public function addVisitor( CriterionVisitor $visitor )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param string $context
+ * @param array $fieldFilters
*
* @return string
*/
- public function dispatch( Criterion $criterion, $context )
+ public function dispatch( Criterion $criterion, $context, array $fieldFilters = array() )
{
if ( !isset( $this->contextMethodMap[$context] ) )
{
@@ -92,7 +93,7 @@ public function dispatch( Criterion $criterion, $context )
{
if ( $visitor->canVisit( $criterion ) )
{
- return $visitor->{ $this->contextMethodMap[$context] }( $criterion, $this );
+ return $visitor->{ $this->contextMethodMap[$context] }( $criterion, $this, $fieldFilters );
}
}
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Gateway.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Gateway.php
index fa27b3335f0..292a2f38568 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Gateway.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Gateway.php
@@ -36,10 +36,11 @@ abstract public function bulkIndex( array $documents );
*
* @param \eZ\Publish\API\Repository\Values\Content\Query $query
* @param string $type
+ * @param array $fieldFilters
*
* @return mixed
*/
- abstract public function find( Query $query, $type );
+ abstract public function find( Query $query, $type, array $fieldFilters = array() );
/**
* Finds and returns documents of a given $type for a given $query string.
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Gateway/Native.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Gateway/Native.php
index 4a574f89a16..e8adcb67b32 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Gateway/Native.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Gateway/Native.php
@@ -159,10 +159,11 @@ public function bulkIndex( array $documents )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query $query
* @param string $type
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function find( Query $query, $type )
+ public function find( Query $query, $type, array $fieldFilters = array() )
{
$aggregationList = array_map(
array( $this->facetBuilderVisitor, 'visit' ),
@@ -181,13 +182,15 @@ public function find( Query $query, $type )
"query" => array(
$this->criterionVisitorDispatcher->dispatch(
$query->query,
- CriterionVisitorDispatcher::CONTEXT_QUERY
+ CriterionVisitorDispatcher::CONTEXT_QUERY,
+ $fieldFilters
),
),
"filter" => array(
$this->criterionVisitorDispatcher->dispatch(
$query->filter,
- CriterionVisitorDispatcher::CONTEXT_FILTER
+ CriterionVisitorDispatcher::CONTEXT_FILTER,
+ $fieldFilters
),
),
),
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Handler.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Handler.php
index 631b781b495..0891b2740d8 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Handler.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Handler.php
@@ -68,9 +68,7 @@ public function findContent( Query $query, array $fieldFilters = array() )
$query->filter = $query->filter ?: new Criterion\MatchAll();
$query->query = $query->query ?: new Criterion\MatchAll();
- // TODO add field filters to the query
-
- $data = $this->gateway->find( $query, "content" );
+ $data = $this->gateway->find( $query, "content", $fieldFilters );
return $this->extractor->extract( $data );
}
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentIdIn.php
index 75c9eeec0fc..40fdd4798f7 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentIdIn.php
@@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"terms" => array(
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentTypeGroupIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentTypeGroupIdIn.php
index ebad352b3b6..a10d7192d2e 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentTypeGroupIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentTypeGroupIdIn.php
@@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentTypeIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentTypeIdIn.php
index ccee8c47248..64f1686e8e9 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentTypeIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentTypeIdIn.php
@@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentTypeIdentifierIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentTypeIdentifierIn.php
index 84eb728699c..c085cdad32d 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentTypeIdentifierIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ContentTypeIdentifierIn.php
@@ -59,10 +59,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/ModifiedIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/ModifiedIn.php
index f8e84dd68da..005ff98e654 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/ModifiedIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/ModifiedIn.php
@@ -43,10 +43,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/ModifiedRange.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/ModifiedRange.php
index 84348b8e986..354d3be5ba2 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/ModifiedRange.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/ModifiedRange.php
@@ -46,10 +46,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$start = $this->getNativeTime( $criterion->value[0] );
$end = isset( $criterion->value[1] ) ? $this->getNativeTime( $criterion->value[1] ) : null;
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/PublishedIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/PublishedIn.php
index 55abc0a92e6..f75ec64272d 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/PublishedIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/PublishedIn.php
@@ -43,10 +43,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/PublishedRange.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/PublishedRange.php
index 4e4d769fc76..49cbd227a7a 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/PublishedRange.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/DateMetadata/PublishedRange.php
@@ -46,10 +46,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$start = $this->getNativeTime( $criterion->value[0] );
$end = isset( $criterion->value[1] ) ? $this->getNativeTime( $criterion->value[1] ) : null;
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/LanguageCodeIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/LanguageCodeIn.php
index b92e4a45e05..cec382ffd33 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/LanguageCodeIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/LanguageCodeIn.php
@@ -68,10 +68,11 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$filter = $this->getCondition( $criterion );
@@ -98,10 +99,11 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$filter = $this->getCondition( $criterion );
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/DepthIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/DepthIn.php
index 1bbd530c06c..bc12ae0dcc8 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/DepthIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/DepthIn.php
@@ -43,10 +43,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"terms" => array(
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/DepthRange.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/DepthRange.php
index 597d423db44..1bead341fa8 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/DepthRange.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/DepthRange.php
@@ -46,10 +46,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$start = $criterion->value[0];
$end = isset( $criterion->value[1] ) ? $criterion->value[1] : null;
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/IsMainLocation.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/IsMainLocation.php
index d2f1644cc1f..19289cce5d0 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/IsMainLocation.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/IsMainLocation.php
@@ -37,10 +37,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"term" => array(
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/PriorityIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/PriorityIn.php
index 259421fd9fb..9a2498b6dfc 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/PriorityIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/PriorityIn.php
@@ -43,10 +43,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"terms" => array(
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/PriorityRange.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/PriorityRange.php
index 0b8a0e06e5f..a8f5efcccc4 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/PriorityRange.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Location/PriorityRange.php
@@ -46,10 +46,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
$start = $criterion->value[0];
$end = isset( $criterion->value[1] ) ? $criterion->value[1] : null;
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/LocationIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/LocationIdIn.php
index cc2e617c548..177d35d9dd5 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/LocationIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/LocationIdIn.php
@@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/LocationRemoteIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/LocationRemoteIdIn.php
index 4712ff2353b..117a2dd986e 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/LocationRemoteIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/LocationRemoteIdIn.php
@@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ObjectStateIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ObjectStateIdIn.php
index 9f51ad62388..cea6d4b2765 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ObjectStateIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ObjectStateIdIn.php
@@ -39,10 +39,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ParentLocationIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ParentLocationIdIn.php
index 9b1c13364bd..ab580f653a0 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ParentLocationIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/ParentLocationIdIn.php
@@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/RemoteIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/RemoteIdIn.php
index 4202c005be1..5d400114685 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/RemoteIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/RemoteIdIn.php
@@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/SectionIdIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/SectionIdIn.php
index 24057ae92f0..1448eeb3528 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/SectionIdIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/SectionIdIn.php
@@ -41,10 +41,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
if ( count( $criterion->value ) > 1 )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/SubtreeIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/SubtreeIn.php
index 2c2e2c913e4..504fcdf339a 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/SubtreeIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/SubtreeIn.php
@@ -65,10 +65,11 @@ protected function getCondition( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"or" => $this->getCondition( $criterion ),
@@ -80,10 +81,11 @@ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitQuery( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitQuery( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"bool" => array(
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/UserMetadataIn.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/UserMetadataIn.php
index e2b4bbf5b4d..c023e12ee7c 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/UserMetadataIn.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/UserMetadataIn.php
@@ -44,10 +44,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
switch ( $criterion->target )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Visibility.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Visibility.php
index 16a4df097dc..9e2d0521568 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Visibility.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Location/CriterionVisitor/Visibility.php
@@ -36,10 +36,11 @@ public function canVisit( Criterion $criterion )
*
* @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion
* @param \eZ\Publish\Core\Persistence\Elasticsearch\Content\Search\CriterionVisitorDispatcher $dispatcher
+ * @param array $fieldFilters
*
* @return mixed
*/
- public function visitFilter( Criterion $criterion, Dispatcher $dispatcher = null )
+ public function visitFilter( Criterion $criterion, Dispatcher $dispatcher, array $fieldFilters )
{
return array(
"term" => array(
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Mapper.php b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Mapper.php
index 52e0977f753..c366a59db76 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Mapper.php
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Mapper.php
@@ -284,6 +284,14 @@ protected function mapFields( Content $content, Type $contentType )
$content->versionInfo->contentInfo->mainLanguageCode === $languageCode,
new FieldType\BooleanField()
);
+ $fields[] = new Field(
+ 'meta_is_always_available',
+ (
+ $content->versionInfo->contentInfo->mainLanguageCode === $languageCode &&
+ $content->versionInfo->contentInfo->alwaysAvailable
+ ),
+ new FieldType\BooleanField()
+ );
foreach ( $fieldMap[$languageCode] as $field )
{
diff --git a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Resources/mappings/content.json b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Resources/mappings/content.json
index acf1824fbbf..1a4a550fcf3 100644
--- a/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Resources/mappings/content.json
+++ b/eZ/Publish/Core/Persistence/Elasticsearch/Content/Search/Resources/mappings/content.json
@@ -45,6 +45,7 @@
"meta_all": { "type": "string" },
"meta_language_code_s": { "type": "string", "index": "not_analyzed" },
"meta_is_main_translation_b": { "type": "boolean", "index": "not_analyzed" },
+ "meta_is_always_available_b": { "type": "boolean", "index": "not_analyzed" },
"user_first_name_value_ms": { "type": "string", "analyzer": "string_lowercase", "copy_to": "fields_doc.custom_field" },
"user_last_name_value_ms": { "type": "string", "analyzer": "string_lowercase", "copy_to": "fields_doc.custom_field" },
"custom_field": { "type": "string", "analyzer": "string_lowercase" }
diff --git a/phpunit-integration-legacy-elasticsearch.xml b/phpunit-integration-legacy-elasticsearch.xml
index 8fe07baada4..a57a8c861ee 100644
--- a/phpunit-integration-legacy-elasticsearch.xml
+++ b/phpunit-integration-legacy-elasticsearch.xml
@@ -47,6 +47,7 @@
eZ/Publish/API/Repository/Tests/URLWildcardServiceAuthorizationTest.php
eZ/Publish/API/Repository/Tests/ObjectStateServiceAuthorizationTest.php
eZ/Publish/API/Repository/Tests/SearchServiceTest.php
+ eZ/Publish/API/Repository/Tests/SearchServiceFieldFiltersTest.php
eZ/Publish/API/Repository/Tests/SearchServiceLocationTest.php
eZ/Publish/API/Repository/Tests/SearchServiceAuthorizationTest.php
eZ/Publish/API/Repository/Tests/LimitationTest.php