Skip to content

Commit

Permalink
HSEARCH-2662 Elasticsearch: Make SearchResult responsible for most ac…
Browse files Browse the repository at this point in the history
…cesses to the JSON object

This will help to return a stubbed result when there is no index manager
to search in.
  • Loading branch information
yrodiere authored and Sanne committed Apr 13, 2017
1 parent f436278 commit b99c995
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 21 deletions.
Expand Up @@ -188,11 +188,7 @@ public Explanation explain(int documentId) {
execute();
}

JsonObject hit = searchResult.getJsonObject()
.get( "hits" )
.getAsJsonObject()
.get( "hits" )
.getAsJsonArray()
JsonObject hit = searchResult.getHits()
// TODO Is it right to use the document id that way? I am not quite clear about its semantics
.get( documentId )
.getAsJsonObject();
Expand Down Expand Up @@ -264,12 +260,11 @@ public List<EntityInfo> queryEntityInfos() {
execute();
}

JsonObject searchResultJsonObject = searchResult.getJsonObject();
JsonArray hits = searchResultJsonObject.get( "hits" ).getAsJsonObject().get( "hits" ).getAsJsonArray();
JsonArray hits = searchResult.getHits();
List<EntityInfo> results = new ArrayList<>( hits.size() );

for ( JsonElement hit : hits ) {
EntityInfo entityInfo = searcher.convertQueryHit( searchResultJsonObject, hit.getAsJsonObject() );
EntityInfo entityInfo = searcher.convertQueryHit( searchResult, hit.getAsJsonObject() );
if ( entityInfo != null ) {
results.add( entityInfo );
}
Expand Down Expand Up @@ -726,7 +721,7 @@ void clearScroll(String scrollId) {
}
}

EntityInfo convertQueryHit(JsonObject searchResult, JsonObject hit) {
EntityInfo convertQueryHit(SearchResult searchResult, JsonObject hit) {
String type = hit.get( "_type" ).getAsString();
Class<?> clazz = entityTypesByName.get( type );

Expand Down Expand Up @@ -801,10 +796,10 @@ EntityInfo convertQueryHit(JsonObject searchResult, JsonObject hit) {
}
break;
case ElasticsearchProjectionConstants.TOOK:
projections[i] = searchResult.get( "took" ).getAsInt();
projections[i] = searchResult.getTook();
break;
case ElasticsearchProjectionConstants.TIMED_OUT:
projections[i] = searchResult.get( "timed_out" ).getAsBoolean();
projections[i] = searchResult.getTimedOut();
break;
case ElasticsearchProjectionConstants.THIS:
// Use EntityInfo.ENTITY_PLACEHOLDER as placeholder.
Expand Down Expand Up @@ -1020,11 +1015,10 @@ public Object convertHit(JsonObject hit, ConversionContext conversionContext) {
@Override
protected void extractFacetResults() {
SearchResult searchResult = getSearchResult();
JsonElement aggregationsElement = searchResult.getJsonObject().get( "aggregations" );
if ( aggregationsElement == null ) {
JsonObject aggregations = searchResult.getAggregations();
if ( aggregations == null ) {
return;
}
JsonObject aggregations = aggregationsElement.getAsJsonObject();

Map<String, List<Facet>> results = new HashMap<>();
for ( FacetingRequest facetRequest : getFacetManager().getFacetRequests().values() ) {
Expand Down Expand Up @@ -1278,12 +1272,11 @@ private boolean fetchNextResults() {
* @return {@code true} if at least one result was fetched, {@code false} otherwise.
*/
private boolean extractWindow(SearchResult searchResult) {
JsonObject searchResultJsonObject = searchResult.getJsonObject();
boolean fetchedAtLeastOne = false;
scrollId = searchResultJsonObject.get( "_scroll_id" ).getAsString();
JsonArray hits = searchResultJsonObject.get( "hits" ).getAsJsonObject().get( "hits" ).getAsJsonArray();
scrollId = searchResult.getScrollId();
JsonArray hits = searchResult.getHits();
for ( JsonElement hit : hits ) {
EntityInfo converted = searcher.convertQueryHit( searchResultJsonObject, hit.getAsJsonObject() );
EntityInfo converted = searcher.convertQueryHit( searchResult, hit.getAsJsonObject() );
if ( converted != null ) {
results.add( converted );
fetchedAtLeastOne = true;
Expand Down
Expand Up @@ -6,15 +6,24 @@
*/
package org.hibernate.search.elasticsearch.work.impl;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

/**
* @author Yoann Rodiere
*/
public interface SearchResult {

JsonObject getJsonObject();
JsonArray getHits();

int getTotalHitCount();

JsonObject getAggregations();

int getTook();

boolean getTimedOut();

String getScrollId();

}
Expand Up @@ -20,6 +20,8 @@
import org.hibernate.search.util.logging.impl.DefaultLogCategories;
import org.hibernate.search.util.logging.impl.LoggerFactory;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

/**
Expand Down Expand Up @@ -114,8 +116,18 @@ public ElasticsearchWork<SearchResult> build() {

static class SearchResultImpl implements SearchResult {

private static final JsonAccessor HITS_HITS_ACCESSOR = JsonAccessor.root().property( "hits" ).property( "hits" );

private static final JsonAccessor COUNT_ACCESSOR = JsonAccessor.root().property( "hits" ).property( "total" );

private static final JsonAccessor AGGREGATIONS_ACCESSOR = JsonAccessor.root().property( "aggregations" );

private static final JsonAccessor TOOK_ACCESSOR = JsonAccessor.root().property( "took" );

private static final JsonAccessor TIMED_OUT_ACCESSOR = JsonAccessor.root().property( "timed_out" );

private static final JsonAccessor SCROLL_ID_ACCESSOR = JsonAccessor.root().property( "_scroll_id" );

private final JsonObject jsonObject;

public SearchResultImpl(JsonObject jsonObject) {
Expand All @@ -124,14 +136,36 @@ public SearchResultImpl(JsonObject jsonObject) {
}

@Override
public JsonObject getJsonObject() {
return jsonObject;
public JsonArray getHits() {
return HITS_HITS_ACCESSOR.get( jsonObject ).getAsJsonArray();
}

@Override
public int getTotalHitCount() {
return COUNT_ACCESSOR.get( jsonObject ).getAsInt();
}

@Override
public JsonObject getAggregations() {
JsonElement element = AGGREGATIONS_ACCESSOR.get( jsonObject );
return element == null ? null : element.getAsJsonObject();
}

@Override
public int getTook() {
return TOOK_ACCESSOR.get( jsonObject ).getAsInt();
}

@Override
public boolean getTimedOut() {
return TIMED_OUT_ACCESSOR.get( jsonObject ).getAsBoolean();
}

@Override
public String getScrollId() {
JsonElement element = SCROLL_ID_ACCESSOR.get( jsonObject );
return element == null ? null : element.getAsString();
}

}
}

0 comments on commit b99c995

Please sign in to comment.