private int combineResultsFromMultiResponses(List<SearchHit> combinedResults, int totalLimit, int currentCombinedResults, SearchHit[] hits, int currentIndex, MultiSearchRequest multiSearchRequest) { MultiSearchResponse.Item[] responses = client.multiSearch(multiSearchRequest).actionGet().getResponses(); String t1Alias = nestedLoopsRequest.getFirstTable().getAlias(); String t2Alias = nestedLoopsRequest.getSecondTable().getAlias(); for(int j =0 ; j < responses.length && currentCombinedResults < totalLimit ; j++){ SearchHit hitFromFirstTable = hits[currentIndex+j]; onlyReturnedFields(hitFromFirstTable.getSourceAsMap(), nestedLoopsRequest.getFirstTable().getReturnedFields(),nestedLoopsRequest.getFirstTable().getOriginalSelect().isSelectAll()); SearchResponse multiItemResponse = responses[j].getResponse(); updateMetaSearchResults(multiItemResponse); //todo: if responseForHit.getHits.length < responseForHit.getTotalHits(). need to fetch more! SearchHits responseForHit = multiItemResponse.getHits(); if(responseForHit.getHits().length == 0 && nestedLoopsRequest.getJoinType() == SQLJoinTableSource.JoinType.LEFT_OUTER_JOIN){ SearchHit unmachedResult = createUnmachedResult(nestedLoopsRequest.getSecondTable().getReturnedFields(), currentCombinedResults, t1Alias, t2Alias, hitFromFirstTable); combinedResults.add(unmachedResult); currentCombinedResults++; continue; } for(SearchHit matchedHit : responseForHit.getHits() ){ SearchHit searchHit = getMergedHit(currentCombinedResults, t1Alias, t2Alias, hitFromFirstTable, matchedHit); combinedResults.add(searchHit); currentCombinedResults++; if(currentCombinedResults >= totalLimit) break; } if(currentCombinedResults >= totalLimit) break; } return currentCombinedResults; }
assertHitCount(rsp.getResponses()[0].getResponse(), 1L); assertSearchHits(rsp.getResponses()[0].getResponse(), "1"); assertHitCount(rsp.getResponses()[1].getResponse(), 1L); assertSearchHits(rsp.getResponses()[1].getResponse(), "1");
for (InnerHitBuilder innerHitBuilder : innerHitBuilders) { MultiSearchResponse.Item item = it.next(); if (item.isFailure()) { context.onPhaseFailure(this, "failed to expand hits", item.getFailure()); return; SearchHits innerHits = item.getResponse().getHits(); if (hit.getInnerHits() == null) { hit.setInnerHits(new HashMap<>(innerHitBuilders.size()));
for (InnerHitBuilder innerHitBuilder : innerHitBuilders) { MultiSearchResponse.Item item = it.next(); if (item.isFailure()) { context.onPhaseFailure(this, "failed to expand hits", item.getFailure()); return; SearchHits innerHits = item.getResponse().getHits(); if (hit.getInnerHits() == null) { hit.setInnerHits(new HashMap<>(innerHitBuilders.size()));
for (InnerHitBuilder innerHitBuilder : innerHitBuilders) { MultiSearchResponse.Item item = it.next(); if (item.isFailure()) { context.onPhaseFailure(this, "failed to expand hits", item.getFailure()); return; SearchHits innerHits = item.getResponse().getHits(); if (hit.getInnerHits() == null) { hit.setInnerHits(new HashMap<>(innerHitBuilders.size()));
MultiSearchResponse.Item item = r.getResponses()[i]; int originalSlot = originalSlots.get(i); if (item.isFailure()) { items[originalSlot] = new MultiSearchTemplateResponse.Item(null, item.getFailure()); } else { items[originalSlot].getResponse().setResponse(item.getResponse());
MultiSearchResponse.Item item = r.getResponses()[i]; int originalSlot = originalSlots.get(i); if (item.isFailure()) { items[originalSlot] = new MultiSearchTemplateResponse.Item(null, item.getFailure()); } else { items[originalSlot].getResponse().setResponse(item.getResponse());
if (item.isFailure()) { LOG.warn("failure response when querying for status {}", slist[i].name()); continue; SearchResponse res = item.getResponse(); long count = res.getHits().getTotalHits(); latestStatusCounts.put(slist[i].name(), count);
private int combineResultsFromMultiResponses(List<SearchHit> combinedResults, int totalLimit, int currentCombinedResults, SearchHit[] hits, int currentIndex, MultiSearchRequest multiSearchRequest) { MultiSearchResponse.Item[] responses = client.multiSearch(multiSearchRequest).actionGet().getResponses(); String t1Alias = nestedLoopsRequest.getFirstTable().getAlias(); String t2Alias = nestedLoopsRequest.getSecondTable().getAlias(); for(int j =0 ; j < responses.length && currentCombinedResults < totalLimit ; j++){ SearchHit hitFromFirstTable = hits[currentIndex+j]; onlyReturnedFields(hitFromFirstTable.getSourceAsMap(), nestedLoopsRequest.getFirstTable().getReturnedFields(),nestedLoopsRequest.getFirstTable().getOriginalSelect().isSelectAll()); SearchResponse multiItemResponse = responses[j].getResponse(); updateMetaSearchResults(multiItemResponse); //todo: if responseForHit.getHits.length < responseForHit.getTotalHits(). need to fetch more! SearchHits responseForHit = multiItemResponse.getHits(); if(responseForHit.getHits().length == 0 && nestedLoopsRequest.getJoinType() == SQLJoinTableSource.JoinType.LEFT_OUTER_JOIN){ SearchHit unmachedResult = createUnmachedResult(nestedLoopsRequest.getSecondTable().getReturnedFields(), currentCombinedResults, t1Alias, t2Alias, hitFromFirstTable); combinedResults.add(unmachedResult); currentCombinedResults++; continue; } for(SearchHit matchedHit : responseForHit.getHits() ){ SearchHit searchHit = getMergedHit(currentCombinedResults, t1Alias, t2Alias, hitFromFirstTable, matchedHit); combinedResults.add(searchHit); currentCombinedResults++; if(currentCombinedResults >= totalLimit) break; } if(currentCombinedResults >= totalLimit) break; } return currentCombinedResults; }
@Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); builder.startArray(Fields.RESPONSES); for (Item item : items) { builder.startObject(); if (item.isFailure()) { ElasticsearchException.generateFailureXContent(builder, params, item.getFailure(), true); builder.field(Fields.STATUS, ExceptionsHelper.status(item.getFailure()).getStatus()); } else { item.getResponse().innerToXContent(builder, params); builder.field(Fields.STATUS, item.getResponse().status().getStatus()); } builder.endObject(); } builder.endArray(); builder.endObject(); return builder; }
@Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); builder.startArray(Fields.RESPONSES); for (Item item : items) { builder.startObject(); if (item.isFailure()) { ElasticsearchException.generateFailureXContent(builder, params, item.getFailure(), true); builder.field(Fields.STATUS, ExceptionsHelper.status(item.getFailure()).getStatus()); } else { item.getResponse().innerToXContent(builder, params); builder.field(Fields.STATUS, item.getResponse().status().getStatus()); } builder.endObject(); } builder.endArray(); builder.endObject(); return builder; }
public static MultiSearchTemplateResponse fromXContext(XContentParser parser) { //The MultiSearchTemplateResponse is identical to the multi search response so we reuse the parsing logic in multi search response MultiSearchResponse mSearchResponse = MultiSearchResponse.fromXContext(parser); org.elasticsearch.action.search.MultiSearchResponse.Item[] responses = mSearchResponse.getResponses(); Item[] templateResponses = new Item[responses.length]; int i = 0; for (org.elasticsearch.action.search.MultiSearchResponse.Item item : responses) { SearchTemplateResponse stResponse = null; if(item.getResponse() != null){ stResponse = new SearchTemplateResponse(); stResponse.setResponse(item.getResponse()); } templateResponses[i++] = new Item(stResponse, item.getFailure()); } return new MultiSearchTemplateResponse(templateResponses); }
public static MultiSearchTemplateResponse fromXContext(XContentParser parser) { //The MultiSearchTemplateResponse is identical to the multi search response so we reuse the parsing logic in multi search response MultiSearchResponse mSearchResponse = MultiSearchResponse.fromXContext(parser); org.elasticsearch.action.search.MultiSearchResponse.Item[] responses = mSearchResponse.getResponses(); Item[] templateResponses = new Item[responses.length]; int i = 0; for (org.elasticsearch.action.search.MultiSearchResponse.Item item : responses) { SearchTemplateResponse stResponse = null; if(item.getResponse() != null){ stResponse = new SearchTemplateResponse(); stResponse.setResponse(item.getResponse()); } templateResponses[i++] = new Item(stResponse, item.getFailure()); } return new MultiSearchTemplateResponse(templateResponses); }
@Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); builder.startArray(Fields.RESPONSES); for (Item item : items) { builder.startObject(); if (item.isFailure()) { ElasticsearchException.generateFailureXContent(builder, params, item.getFailure(), true); builder.field(Fields.STATUS, ExceptionsHelper.status(item.getFailure()).getStatus()); } else { item.getResponse().innerToXContent(builder, params); builder.field(Fields.STATUS, item.getResponse().status().getStatus()); } builder.endObject(); } builder.endArray(); builder.endObject(); return builder; }
@Override public GetResponse getDelegatedFromInstigator(final MultiSearchResponse searchResponse) { if (searchResponse.getResponses() == null || searchResponse.getResponses().length <= 0) { final Item item = request.getItems().get(0); return new GetResponse(new GetResult(item.index(), item.type(), item.id(), item.version(), false, null, null)); } else if (searchResponse.getResponses().length > 1) { throw new RuntimeException("cannot happen"); } else { final org.elasticsearch.action.search.MultiSearchResponse.Item item = searchResponse.getResponses()[0]; final SearchHit sh = item.getResponse().getHits().getHits()[0]; return new GetResponse(new GetResult(sh.index(), sh.type(), sh.id(), sh.version(), true, sh.getSourceRef(), null)); } } });
@Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startArray(Fields.RESPONSES); for (Item item : items) { builder.startObject(); if (item.isFailure()) { ElasticsearchException.renderThrowable(builder, params, item.getFailure()); } else { item.getResponse().toXContent(builder, params); } builder.endObject(); } builder.endArray(); return builder; }
@Override public void onResponse(final SearchResponse searchResponse) { handleResponse(request.responseSlot, new MultiSearchResponse.Item(searchResponse, null)); }
@Override public void onResponse(final SearchResponse searchResponse) { handleResponse(request.responseSlot, new MultiSearchResponse.Item(searchResponse, null)); }