Skip to content

Commit

Permalink
HSEARCH-3476 Add one SearchSort implementation per Elasticsearch sort
Browse files Browse the repository at this point in the history
Instead of the previous hack consisting in shoving both the building
behavior and the sort behavior into the builder in order to have
a single ElasticsearchSearchSort implementation that delegates
to the builder.

Same reason as for predicates, see previous commits.
  • Loading branch information
yrodiere committed Jun 19, 2020
1 parent 34f5415 commit f1a3f51
Show file tree
Hide file tree
Showing 23 changed files with 399 additions and 376 deletions.
Expand Up @@ -8,7 +8,7 @@

import org.hibernate.search.backend.elasticsearch.search.predicate.dsl.ElasticsearchSearchPredicateFactory;
import org.hibernate.search.backend.elasticsearch.search.sort.dsl.ElasticsearchSearchSortFactory;
import org.hibernate.search.backend.elasticsearch.search.sort.impl.ElasticsearchSearchSortBuilder;
import org.hibernate.search.backend.elasticsearch.search.sort.impl.ElasticsearchSearchSort;
import org.hibernate.search.backend.elasticsearch.search.sort.impl.ElasticsearchSearchSortBuilderFactory;
import org.hibernate.search.engine.search.sort.dsl.SortThenStep;
import org.hibernate.search.engine.search.sort.dsl.SearchSortFactory;
Expand Down Expand Up @@ -41,7 +41,7 @@ public SortThenStep fromJson(String jsonString) {
return staticThenStep( dslContext.builderFactory().fromJson( jsonString ) );
}

private SortThenStep staticThenStep(ElasticsearchSearchSortBuilder builder) {
return new StaticSortThenStep( dslContext, builder.build() );
private SortThenStep staticThenStep(ElasticsearchSearchSort sort) {
return new StaticSortThenStep( dslContext, sort );
}
}
Expand Up @@ -14,20 +14,17 @@
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;

public abstract class AbstractElasticsearchReversibleSortBuilder extends AbstractElasticsearchSortBuilder {
public abstract class AbstractElasticsearchReversibleSort extends AbstractElasticsearchSort {

private static final JsonAccessor<JsonElement> ORDER_ACCESSOR = JsonAccessor.root().property( "order" );
private static final JsonPrimitive ASC_KEYWORD_JSON = new JsonPrimitive( "asc" );
private static final JsonPrimitive DESC_KEYWORD_JSON = new JsonPrimitive( "desc" );

private SortOrder order;
private final SortOrder order;

protected AbstractElasticsearchReversibleSortBuilder(ElasticsearchSearchContext searchContext) {
super( searchContext );
}

public void order(SortOrder order) {
this.order = order;
protected AbstractElasticsearchReversibleSort(AbstractBuilder builder) {
super( builder );
order = builder.order;
}

@Override
Expand All @@ -53,4 +50,17 @@ protected void enrichInnerObject(ElasticsearchSearchSortCollector collector, Jso

protected abstract void doToJsonSorts(ElasticsearchSearchSortCollector collector, JsonObject innerObject);

public abstract static class AbstractBuilder extends AbstractElasticsearchSort.AbstractBuilder {

private SortOrder order;

protected AbstractBuilder(ElasticsearchSearchContext searchContext) {
super( searchContext );
}

public void order(SortOrder order) {
this.order = order;
}

}
}
@@ -0,0 +1,39 @@
/*
* 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.backend.elasticsearch.search.sort.impl;

import java.util.Set;

import org.hibernate.search.backend.elasticsearch.search.impl.ElasticsearchSearchContext;
import org.hibernate.search.engine.search.sort.spi.SearchSortBuilder;

public abstract class AbstractElasticsearchSort implements ElasticsearchSearchSort {

protected final Set<String> indexNames;

protected AbstractElasticsearchSort(AbstractBuilder builder) {
this( builder.searchContext );
}

protected AbstractElasticsearchSort(ElasticsearchSearchContext searchContext) {
indexNames = searchContext.indexes().hibernateSearchIndexNames();
}

@Override
public Set<String> indexNames() {
return indexNames;
}

public abstract static class AbstractBuilder implements SearchSortBuilder {

protected final ElasticsearchSearchContext searchContext;

protected AbstractBuilder(ElasticsearchSearchContext searchContext) {
this.searchContext = searchContext;
}
}
}

This file was deleted.

@@ -0,0 +1,51 @@
/*
* 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.backend.elasticsearch.search.sort.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.search.backend.elasticsearch.search.impl.ElasticsearchSearchContext;
import org.hibernate.search.engine.search.sort.SearchSort;
import org.hibernate.search.engine.search.sort.spi.CompositeSortBuilder;

public class ElasticsearchCompositeSort extends AbstractElasticsearchSort {

private final List<ElasticsearchSearchSort> elements;

protected ElasticsearchCompositeSort(Builder builder) {
super( builder );
elements = builder.elements;
// Ensure illegal attempts to mutate the sort will fail
builder.elements = null;
}

@Override
public void toJsonSorts(ElasticsearchSearchSortCollector collector) {
for ( ElasticsearchSearchSort element : elements ) {
element.toJsonSorts( collector );
}
}

public static class Builder extends AbstractBuilder implements CompositeSortBuilder {
private List<ElasticsearchSearchSort> elements = new ArrayList<>();

protected Builder(ElasticsearchSearchContext searchContext) {
super( searchContext );
}

@Override
public void add(SearchSort sort) {
elements.add( ElasticsearchSearchSort.from( searchContext, sort ) );
}

@Override
public SearchSort build() {
return new ElasticsearchCompositeSort( this );
}
}
}

This file was deleted.

Expand Up @@ -10,11 +10,11 @@

import com.google.gson.JsonPrimitive;

class ElasticsearchIndexOrderSortBuilder extends AbstractElasticsearchSortBuilder {
class ElasticsearchIndexOrderSort extends AbstractElasticsearchSort {

private static final JsonPrimitive DOC_SORT_KEYWORD_JSON = new JsonPrimitive( "_doc" );

ElasticsearchIndexOrderSortBuilder(ElasticsearchSearchContext searchContext) {
ElasticsearchIndexOrderSort(ElasticsearchSearchContext searchContext) {
super( searchContext );
}

Expand Down
Expand Up @@ -7,19 +7,19 @@
package org.hibernate.search.backend.elasticsearch.search.sort.impl;

import org.hibernate.search.backend.elasticsearch.search.impl.ElasticsearchSearchContext;
import org.hibernate.search.engine.search.sort.SearchSort;
import org.hibernate.search.engine.search.sort.spi.ScoreSortBuilder;

import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;

class ElasticsearchScoreSortBuilder extends AbstractElasticsearchReversibleSortBuilder
implements ScoreSortBuilder {
class ElasticsearchScoreSort extends AbstractElasticsearchReversibleSort {

private static final String SCORE_SORT_KEYWORD = "_score";
private static final JsonPrimitive SCORE_SORT_KEYWORD_JSON = new JsonPrimitive( SCORE_SORT_KEYWORD );

ElasticsearchScoreSortBuilder(ElasticsearchSearchContext searchContext) {
super( searchContext );
ElasticsearchScoreSort(Builder builder) {
super( builder );
}

@Override
Expand All @@ -33,4 +33,16 @@ public void doToJsonSorts(ElasticsearchSearchSortCollector collector, JsonObject
collector.collectSort( outerObject );
}
}

static class Builder extends AbstractBuilder implements ScoreSortBuilder {

Builder(ElasticsearchSearchContext searchContext) {
super( searchContext );
}

@Override
public SearchSort build() {
return new ElasticsearchScoreSort( this );
}
}
}
Expand Up @@ -14,35 +14,23 @@
import org.hibernate.search.engine.search.sort.SearchSort;
import org.hibernate.search.util.common.logging.impl.LoggerFactory;

class ElasticsearchSearchSort implements SearchSort {
public interface ElasticsearchSearchSort extends SearchSort {

private static final Log log = LoggerFactory.make( Log.class, MethodHandles.lookup() );
Log log = LoggerFactory.make( Log.class, MethodHandles.lookup() );

public static SearchSort of(ElasticsearchSearchContext searchContext, ElasticsearchSearchSortBuilder builder) {
return new ElasticsearchSearchSort( searchContext.indexes().hibernateSearchIndexNames(), builder );
}
Set<String> indexNames();

void toJsonSorts(ElasticsearchSearchSortCollector collector);

public static ElasticsearchSearchSort from(ElasticsearchSearchContext searchContext, SearchSort sort) {
static ElasticsearchSearchSort from(ElasticsearchSearchContext searchContext, SearchSort sort) {
if ( !( sort instanceof ElasticsearchSearchSort ) ) {
throw log.cannotMixElasticsearchSearchSortWithOtherSorts( sort );
}
ElasticsearchSearchSort casted = (ElasticsearchSearchSort) sort;
if ( !searchContext.indexes().hibernateSearchIndexNames().equals( casted.indexNames ) ) {
throw log.sortDefinedOnDifferentIndexes( sort, casted.indexNames,
if ( !searchContext.indexes().hibernateSearchIndexNames().equals( casted.indexNames() ) ) {
throw log.sortDefinedOnDifferentIndexes( sort, casted.indexNames(),
searchContext.indexes().hibernateSearchIndexNames() );
}
return casted;
}

private final Set<String> indexNames;
private final ElasticsearchSearchSortBuilder builder;

private ElasticsearchSearchSort(Set<String> indexName, ElasticsearchSearchSortBuilder builder) {
this.indexNames = indexName;
this.builder = builder;
}

public void toJsonSorts(ElasticsearchSearchSortCollector collector) {
builder.toJsonSorts( collector );
}
}

This file was deleted.

Expand Up @@ -13,8 +13,8 @@
public interface ElasticsearchSearchSortBuilderFactory
extends SearchSortBuilderFactory<ElasticsearchSearchSortCollector> {

ElasticsearchSearchSortBuilder fromJson(JsonObject jsonObject);
ElasticsearchSearchSort fromJson(JsonObject jsonObject);

ElasticsearchSearchSortBuilder fromJson(String jsonString);
ElasticsearchSearchSort fromJson(String jsonString);

}
Expand Up @@ -35,7 +35,7 @@ public void contribute(ElasticsearchSearchSortCollector collector, SearchSort so

@Override
public ScoreSortBuilder score() {
return new ElasticsearchScoreSortBuilder( searchContext );
return new ElasticsearchScoreSort.Builder( searchContext );
}

@Override
Expand All @@ -50,21 +50,21 @@ public DistanceSortBuilder distance(String absoluteFieldPath, GeoPoint location)

@Override
public SearchSort indexOrder() {
return new ElasticsearchIndexOrderSortBuilder( searchContext ).build();
return new ElasticsearchIndexOrderSort( searchContext );
}

@Override
public CompositeSortBuilder composite() {
return new ElasticsearchCompositeSortBuilder( searchContext );
return new ElasticsearchCompositeSort.Builder( searchContext );
}

@Override
public ElasticsearchSearchSortBuilder fromJson(JsonObject jsonObject) {
return new ElasticsearchUserProvidedJsonSortBuilder( searchContext, jsonObject );
public ElasticsearchSearchSort fromJson(JsonObject jsonObject) {
return new ElasticsearchUserProvidedJsonSort( searchContext, jsonObject );
}

@Override
public ElasticsearchSearchSortBuilder fromJson(String jsonString) {
public ElasticsearchSearchSort fromJson(String jsonString) {
return fromJson( searchContext.userFacingGson().fromJson( jsonString, JsonObject.class ) );
}
}

0 comments on commit f1a3f51

Please sign in to comment.