Skip to content

Commit

Permalink
HSEARCH-4676 Use .and() syntax by default with the nested() predicate
Browse files Browse the repository at this point in the history
  • Loading branch information
yrodiere committed Aug 25, 2022
1 parent 918b7e4 commit 962e04a
Show file tree
Hide file tree
Showing 22 changed files with 209 additions and 167 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,9 @@ public void smoke() {
.must( f.range().field( "summary.shipping" )
.atMost( new BigDecimal( "10.0" ) ) )
.must( f.nested( "lineItems" )
.must( f.range().field( "lineItems.amount" )
.add( f.range().field( "lineItems.amount" )
.between( new BigDecimal( "7.0" ), new BigDecimal( "9.0" ) ) )
.must( f.match().field( "lineItems.category" )
.add( f.match().field( "lineItems.category" )
.matching( "BOOK" )
) )
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,8 @@ public void smoke() {
// tag::include[]
List<Book> hits = searchSession.search( Book.class )
.where( f -> f.nested( "authors" ) // <1>
.must( f.match().field( "authors.firstName" ).matching( "Ty" ) ) // <2>
.must( f.match().field( "authors.lastName" ).matching( "Abraham" ) ) ) // <2>
.add( f.match().field( "authors.firstName" ).matching( "Ty" ) ) // <2>
.add( f.match().field( "authors.lastName" ).matching( "Abraham" ) ) ) // <2>
.fetchHits( 20 );

assertThat( hits ).isEmpty(); // <3>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,9 @@ public void nested_explicit() {
// tag::nested_explicit[]
List<Book> hits = searchSession.search( Book.class )
.where( f -> f.nested( "writers" )
.must( f.match().field( "writers.firstName" ) // <1>
.add( f.match().field( "writers.firstName" ) // <1>
.matching( "isaac" ) )
.must( f.match().field( "writers.lastName" )
.add( f.match().field( "writers.lastName" )
.matching( "asimov" ) )
)
.fetchHits( 20 );
Expand All @@ -99,11 +99,11 @@ public void withRoot() {
List<Book> hits = searchSession.search( Book.class )
.where( f -> f.bool()
.should( f.nested( "writers" )
.must( matchFirstAndLastName( // <1>
.add( matchFirstAndLastName( // <1>
f.withRoot( "writers" ), // <2>
"bob", "kane" ) ) )
.should( f.nested( "artists" )
.must( matchFirstAndLastName( // <3>
.add( matchFirstAndLastName( // <3>
f.withRoot( "artists" ), // <4>
"bill", "finger" ) ) ) )
.fetchHits( 20 );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -941,9 +941,9 @@ public void nested() {
// tag::nested[]
List<Book> hits = searchSession.search( Book.class )
.where( f -> f.nested( "authors" ) // <1>
.must( f.match().field( "authors.firstName" )
.add( f.match().field( "authors.firstName" )
.matching( "isaac" ) ) // <2>
.must( f.match().field( "authors.lastName" )
.add( f.match().field( "authors.lastName" )
.matching( "asimov" ) ) ) // <3>
.fetchHits( 20 ); // <4>
// end::nested[]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public interface GenericSimpleBooleanOperatorPredicateClausesStep
S extends C,
C extends SimpleBooleanOperatorPredicateClausesCollector<?>
>
extends SimpleBooleanOperatorPredicateClausesCollector<C> {
extends SimpleBooleanOperatorPredicateClausesCollector<C>, PredicateFinalStep {
@Override
default S add(PredicateFinalStep searchPredicate)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.engine.search.predicate.dsl;

/**
* An object where the <a href="SimpleBooleanOperatorPredicateClausesCollector.html#clauses">clauses</a>
* of a {@link SearchPredicateFactory#nested(String) nested predicate} can be set.
* <p>
* The resulting nested predicate must match <em>all</em> inner clauses,
* similarly to an {@link SearchPredicateFactory#and() "and" predicate}.
*/
public interface NestedPredicateClausesCollector<S extends NestedPredicateClausesCollector<?>>
extends SimpleBooleanOperatorPredicateClausesCollector<S> {

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,17 @@
package org.hibernate.search.engine.search.predicate.dsl;

/**
* The step in a nested predicate definition where clauses can be added.
* The step in a nested predicate definition where
* <a href="SimpleBooleanOperatorPredicateClausesCollector.html#clauses">clauses</a> can be added.
* <p>
* Different types of clauses have different effects;
* see {@link BooleanPredicateOptionsCollector}.
* The resulting nested predicate must match <em>all</em> inner clauses,
* similarly to an {@link SearchPredicateFactory#and() "and" predicate}.
*
* @param <S> The "self" type (the actual exposed type of this step).
*/
public interface NestedPredicateClausesStep<S extends NestedPredicateClausesStep<?>>
extends GenericBooleanPredicateClausesStep<S, NestedPredicateOptionsCollector<?>>,
NestedPredicateOptionsCollector<NestedPredicateOptionsCollector<?>> {
extends GenericSimpleBooleanOperatorPredicateClausesStep<S, NestedPredicateClausesCollector<?>>,
NestedPredicateClausesCollector<NestedPredicateClausesCollector<?>> {

// TODO HSEARCH-3090 add tuning methods, like the "score_mode" in Elasticsearch (avg, min, ...)

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,9 @@ SimpleBooleanOperatorPredicateOptionsStep<?> or(PredicateFinalStep firstSearchPr
/**
* Match documents where a {@link ObjectStructure#NESTED nested object} matches inner predicates
* to be defined in the next steps.
* <p>
* The resulting nested predicate must match <em>all</em> inner clauses,
* similarly to an {@link #and() "and" predicate}.
*
* @param objectFieldPath The <a href="#field-paths">path</a> to the (nested) object field that must match.
* @return The initial step of a DSL where the "nested" predicate can be defined.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@
* For the {@link SearchPredicateFactory#or() or} predicate,
* documents will have to match <em>any</em> clauses (at least one).
* </li>
* <li>
* For the {@link SearchPredicateFactory#nested(String) nested} predicate,
* documents will have to match <em>all</em> clauses.
* </li>
* </ul>
*
* @param <S> The "self" type (the actual exposed type of this collector).
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.engine.search.predicate.dsl.impl;

import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;

import org.hibernate.search.engine.search.predicate.SearchPredicate;
import org.hibernate.search.engine.search.predicate.dsl.BooleanPredicateOptionsCollector;
import org.hibernate.search.engine.search.predicate.dsl.GenericSimpleBooleanOperatorPredicateClausesStep;
import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep;
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
import org.hibernate.search.engine.search.predicate.dsl.SimpleBooleanOperatorPredicateClausesCollector;
import org.hibernate.search.engine.search.predicate.dsl.SimpleBooleanOperatorPredicateClausesStep;
import org.hibernate.search.engine.search.predicate.dsl.spi.AbstractPredicateFinalStep;
import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext;
import org.hibernate.search.engine.search.predicate.spi.BooleanPredicateBuilder;

public abstract class AbstractSimpleBooleanOperatorPredicateClausesStep<S extends C, C extends SimpleBooleanOperatorPredicateClausesCollector<?>>
extends AbstractPredicateFinalStep
implements GenericSimpleBooleanOperatorPredicateClausesStep<S, C> {

public enum SimpleBooleanPredicateOperator
implements BiConsumer<BooleanPredicateBuilder, SearchPredicate> {
AND {
@Override
public void accept(BooleanPredicateBuilder builder,
SearchPredicate searchPredicate) {
builder.must( searchPredicate );
}
},
OR {
@Override
public void accept(BooleanPredicateBuilder builder,
SearchPredicate searchPredicate) {
builder.should( searchPredicate );
}
}
}

private final SimpleBooleanPredicateOperator operator;

private final BooleanPredicateBuilder builder;

private final SearchPredicateFactory factory;

AbstractSimpleBooleanOperatorPredicateClausesStep(SimpleBooleanPredicateOperator operator,
SearchPredicateDslContext<?> dslContext,
SearchPredicateFactory factory) {
super( dslContext );
this.operator = operator;
this.builder = dslContext.scope().predicateBuilders().bool();
this.factory = factory;
}

protected abstract S self();

@Override
public S add(SearchPredicate searchPredicate) {
operator.accept( builder, searchPredicate );
return self();
}

@Override
public S add(Function<? super SearchPredicateFactory, ? extends PredicateFinalStep> clauseContributor) {
return add( clauseContributor.apply( factory ) );
}

public S boost(float boost) {
builder.boost( boost );
return self();
}

public S constantScore() {
builder.constantScore();
return self();
}

@Override
public S with(Consumer<? super C> contributor) {
contributor.accept( self() );
return self();
}

@Override
protected SearchPredicate build() {
return builder.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,22 @@

import org.hibernate.search.engine.search.predicate.SearchPredicate;
import org.hibernate.search.engine.search.predicate.dsl.NestedPredicateClausesStep;
import org.hibernate.search.engine.search.predicate.dsl.NestedPredicateOptionsCollector;
import org.hibernate.search.engine.search.predicate.dsl.NestedPredicateClausesCollector;
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext;
import org.hibernate.search.engine.search.predicate.spi.NestedPredicateBuilder;
import org.hibernate.search.engine.search.predicate.spi.PredicateTypeKeys;


public final class NestedPredicateClausesStepImpl
extends AbstractBooleanPredicateClausesStep<NestedPredicateClausesStepImpl, NestedPredicateOptionsCollector<?>>
extends AbstractSimpleBooleanOperatorPredicateClausesStep<NestedPredicateClausesStepImpl, NestedPredicateClausesCollector<?>>
implements NestedPredicateClausesStep<NestedPredicateClausesStepImpl> {

private final NestedPredicateBuilder builder;

public NestedPredicateClausesStepImpl(SearchPredicateDslContext<?> dslContext, String objectFieldPath,
SearchPredicateFactory factory) {
super( dslContext, factory );
super( SimpleBooleanPredicateOperator.AND, dslContext, factory );
this.builder = dslContext.scope().fieldQueryElement( objectFieldPath, PredicateTypeKeys.NESTED );
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,54 +6,21 @@
*/
package org.hibernate.search.engine.search.predicate.dsl.impl;

import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;

import org.hibernate.search.engine.search.predicate.SearchPredicate;
import org.hibernate.search.engine.search.predicate.dsl.PredicateFinalStep;
import org.hibernate.search.engine.search.predicate.dsl.SearchPredicateFactory;
import org.hibernate.search.engine.search.predicate.dsl.SimpleBooleanOperatorPredicateClausesCollector;
import org.hibernate.search.engine.search.predicate.dsl.SimpleBooleanOperatorPredicateClausesStep;
import org.hibernate.search.engine.search.predicate.dsl.spi.AbstractPredicateFinalStep;
import org.hibernate.search.engine.search.predicate.dsl.spi.SearchPredicateDslContext;
import org.hibernate.search.engine.search.predicate.spi.BooleanPredicateBuilder;

public final class SimpleBooleanOperatorPredicateClausesStepImpl
extends AbstractPredicateFinalStep
extends AbstractSimpleBooleanOperatorPredicateClausesStep<SimpleBooleanOperatorPredicateClausesStepImpl, SimpleBooleanOperatorPredicateClausesCollector<?>>
implements SimpleBooleanOperatorPredicateClausesStep<SimpleBooleanOperatorPredicateClausesStepImpl> {

public enum SimpleBooleanPredicateOperator
implements BiConsumer<BooleanPredicateBuilder, SearchPredicate> {
AND {
@Override
public void accept(BooleanPredicateBuilder builder,
SearchPredicate searchPredicate) {
builder.must( searchPredicate );
}
},
OR {
@Override
public void accept(BooleanPredicateBuilder builder,
SearchPredicate searchPredicate) {
builder.should( searchPredicate );
}
}
}

private final SimpleBooleanPredicateOperator operator;

private final BooleanPredicateBuilder builder;

private final SearchPredicateFactory factory;

public SimpleBooleanOperatorPredicateClausesStepImpl(SimpleBooleanPredicateOperator operator,
SearchPredicateDslContext<?> dslContext,
SearchPredicateFactory factory) {
super( dslContext );
this.operator = operator;
this.builder = dslContext.scope().predicateBuilders().bool();
this.factory = factory;
super( operator, dslContext, factory );
}

public SimpleBooleanOperatorPredicateClausesStepImpl(SimpleBooleanPredicateOperator operator,
Expand Down Expand Up @@ -81,36 +48,7 @@ public SimpleBooleanOperatorPredicateClausesStepImpl(SimpleBooleanPredicateOpera
}

@Override
public SimpleBooleanOperatorPredicateClausesStepImpl add(SearchPredicate searchPredicate) {
operator.accept( builder, searchPredicate );
protected SimpleBooleanOperatorPredicateClausesStepImpl self() {
return this;
}

@Override
public SimpleBooleanOperatorPredicateClausesStepImpl add(
Function<? super SearchPredicateFactory, ? extends PredicateFinalStep> clauseContributor) {
return add( clauseContributor.apply( factory ) );
}

public SimpleBooleanOperatorPredicateClausesStepImpl boost(float boost) {
builder.boost( boost );
return this;
}

public SimpleBooleanOperatorPredicateClausesStepImpl constantScore() {
builder.constantScore();
return this;
}

@Override
public SimpleBooleanOperatorPredicateClausesStepImpl with(
Consumer<? super SimpleBooleanOperatorPredicateClausesCollector<?>> contributor) {
contributor.accept( this );
return this;
}

@Override
protected SearchPredicate build() {
return builder.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
*/
package org.hibernate.search.engine.search.predicate.dsl.spi;

import static org.hibernate.search.engine.search.predicate.dsl.impl.SimpleBooleanOperatorPredicateClausesStepImpl.SimpleBooleanPredicateOperator.AND;
import static org.hibernate.search.engine.search.predicate.dsl.impl.SimpleBooleanOperatorPredicateClausesStepImpl.SimpleBooleanPredicateOperator.OR;
import static org.hibernate.search.engine.search.predicate.dsl.impl.AbstractSimpleBooleanOperatorPredicateClausesStep.SimpleBooleanPredicateOperator.AND;
import static org.hibernate.search.engine.search.predicate.dsl.impl.AbstractSimpleBooleanOperatorPredicateClausesStep.SimpleBooleanPredicateOperator.OR;

import java.util.function.Consumer;

Expand Down

0 comments on commit 962e04a

Please sign in to comment.