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