package org.fastcatsearch.transport.vo;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.fastcatsearch.common.io.Streamable;
import org.fastcatsearch.ir.io.DataInput;
import org.fastcatsearch.ir.io.DataOutput;
import org.fastcatsearch.ir.query.HighlightInfo;
import org.fastcatsearch.ir.query.InternalSearchResult;
import org.fastcatsearch.ir.search.Explanation;
public class StreamableInternalSearchResult implements Streamable {
private InternalSearchResult internalSearchResult;
public StreamableInternalSearchResult(){ }
public StreamableInternalSearchResult(InternalSearchResult internalSearchResult) {
this.internalSearchResult = internalSearchResult;
}
public InternalSearchResult getInternalSearchResult() {
return internalSearchResult;
}
@Override
public void readFrom(DataInput input) throws IOException {
String collectionId = null;
if (input.readBoolean()) {
collectionId = input.readString();
}
int totalCount = input.readInt();
StreamableHitElement sHitElement = new StreamableHitElement();
sHitElement.readFrom(input);
int count = sHitElement.count();
StreamableGroupsData sGroupData = new StreamableGroupsData();
if(input.readBoolean()){
sGroupData.readFrom(input);
}
HighlightInfo highlightInfo = null;
if(input.readBoolean()){
highlightInfo = new HighlightInfo((Map<String, String>) input.readGenericValue(), (Map<String, String>) input.readGenericValue(), (Map<String, String>) input.readGenericValue(), (Map<String, Integer>) input.readGenericValue());
}
List<Explanation> explanations = null;
if(input.readBoolean()){
int size = input.readVInt();
explanations = new ArrayList<Explanation>(size);
}
this.internalSearchResult = new InternalSearchResult(collectionId, sHitElement.getHitElementList(), count, totalCount,
sGroupData.groupData(), highlightInfo, explanations);
}
@Override
public void writeTo(DataOutput output) throws IOException {
String collectionId = internalSearchResult.collectionId();
if (collectionId == null) {
output.writeBoolean(false);
} else {
output.writeBoolean(true);
output.writeString(collectionId);
}
output.writeInt(internalSearchResult.getTotalCount());
new StreamableHitElement(internalSearchResult.getHitElementList(), internalSearchResult.getCount()).writeTo(output);
if(internalSearchResult.getGroupsData() != null){
output.writeBoolean(true);
new StreamableGroupsData(internalSearchResult.getGroupsData()).writeTo(output);
}else{
output.writeBoolean(false);
}
if(internalSearchResult.getHighlightInfo() != null){
output.writeBoolean(true);
output.writeGenericValue(internalSearchResult.getHighlightInfo().fieldIndexAnalyzerMap());
output.writeGenericValue(internalSearchResult.getHighlightInfo().fieldQueryAnalyzerMap());
output.writeGenericValue(internalSearchResult.getHighlightInfo().fieldQueryTermMap());
output.writeGenericValue(internalSearchResult.getHighlightInfo().fieldSearchOptionMap());
}else{
output.writeBoolean(false);
}
if(internalSearchResult.getExplanations() != null) {
output.writeBoolean(true);
output.writeVInt(internalSearchResult.getExplanations().size());
for(Explanation explanation : internalSearchResult.getExplanations()){
new StreamableExplanation(explanation).writeTo(output);
}
}else{
output.writeBoolean(false);
}
}
}