/** * Add a "must not" clause based on an almost-built {@link SearchPredicate}. * <p> * Documents matching the "must not" clause won't match the "match all" predicate. * * @param terminalContext The terminal context allowing to retrieve a {@link SearchPredicate}. * @return A context allowing to get the resulting predicate. */ default MatchAllPredicateContext except(SearchPredicateTerminalContext terminalContext) { return except( terminalContext.toPredicate() ); } /*
/** * Add a "must not" clause based on an almost-built {@link SearchPredicate}. * <p> * Documents matching the "must not" clause won't match the "match all" predicate. * * @param terminalContext The terminal context allowing to retrieve a {@link SearchPredicate}. * @return A context allowing to get the resulting predicate. */ default MatchAllPredicateContext except(SearchPredicateTerminalContext terminalContext) { return except( terminalContext.toPredicate() ); } /*
@Test public void matchAll_multipleExcepts() { StubMappingSearchTarget searchTarget = indexManager.createSearchTarget(); SearchQuery<DocumentReference> query = searchTarget.query() .asReference() .predicate( f -> f.matchAll() .except( f.match().onField( "string" ).matching( STRING_1 ) ) .except( f.match().onField( "string" ).matching( STRING_2 ) ) .toPredicate() ) .build(); assertThat( query ) .hasDocRefHitsAnyOrder( INDEX_NAME, DOCUMENT_3 ); SearchPredicate searchPredicate1 = searchTarget.predicate().match().onField( "string" ).matching( STRING_3 ).toPredicate(); SearchPredicate searchPredicate2 = searchTarget.predicate().match().onField( "string" ).matching( STRING_2 ).toPredicate(); query = searchTarget.query() .asReference() .predicate( f -> f.matchAll().except( searchPredicate1 ).except( searchPredicate2 ).toPredicate() ) .build(); assertThat( query ) .hasDocRefHitsAnyOrder( INDEX_NAME, DOCUMENT_1 ); }
@Test public void matchAll_except() { StubMappingSearchTarget searchTarget = indexManager.createSearchTarget(); SearchQuery<DocumentReference> query = searchTarget.query() .asReference() .predicate( f -> f.matchAll().except( c2 -> c2.match().onField( "string" ).matching( STRING_1 ).toPredicate() ).toPredicate() ) .build(); assertThat( query ) .hasDocRefHitsAnyOrder( INDEX_NAME, DOCUMENT_2, DOCUMENT_3 ); SearchPredicate searchPredicate = searchTarget.predicate().match().onField( "string" ).matching( STRING_2 ).toPredicate(); query = searchTarget.query() .asReference() .predicate( f -> f.matchAll().except( searchPredicate ).toPredicate() ) .build(); assertThat( query ) .hasDocRefHitsAnyOrder( INDEX_NAME, DOCUMENT_1, DOCUMENT_3 ); }