package org.fastcatsearch.transport.vo;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.fastcatsearch.common.io.Streamable;
import org.fastcatsearch.ir.group.*;
import org.fastcatsearch.ir.group.value.*;
import org.fastcatsearch.ir.io.DataInput;
import org.fastcatsearch.ir.io.DataOutput;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class StreamableGroupsData implements Streamable {
protected static Logger logger = LoggerFactory.getLogger(StreamableGroupsData.class);
private GroupsData groupsData;
public StreamableGroupsData() {
}
public StreamableGroupsData(GroupsData groupsData) {
this.groupsData = groupsData;
}
public GroupsData groupData() {
return groupsData;
}
@Override
public void readFrom(DataInput input) throws IOException {
int totalSearchCount = input.readVInt();
int groupSize = input.readVInt();
List<GroupEntryList> groupEntryListArray = new ArrayList<GroupEntryList>(groupSize);
GroupFunctionType[] groupFunctionTypeList = GroupFunctionType.values();
for (int groupNum = 0; groupNum < groupSize; groupNum++) {
int totalCount = input.readVInt();
int count = input.readVInt();
List<GroupEntry> entryList = new ArrayList<GroupEntry>(count);
for (int j = 0; j < count; j++) {
String key = input.readString();
int functionSize = input.readVInt();
GroupingValue[] valueList = new GroupingValue[functionSize];
for (int i = 0; i < functionSize; i++) {
GroupFunctionType type = groupFunctionTypeList[input.readVInt()];
Object obj = input.readGenericValue();
if(obj instanceof Integer){
valueList[i] = new IntGroupingValue((Integer) obj, type);
}else if(obj instanceof Long){
valueList[i] = new LongGroupingValue((Long) obj, type);
}else if(obj instanceof Float){
valueList[i] = new FloatGroupingValue((Float) obj, type);
}else if(obj instanceof Double){
valueList[i] = new DoubleGroupingValue((Double) obj, type);
}else if(obj instanceof String){
valueList[i] = new StringGroupingValue((String) obj, type);
}
}
entryList.add(new GroupEntry(key, valueList));
}
groupEntryListArray.add(new GroupEntryList(entryList, totalCount));
}
groupsData = new GroupsData(groupEntryListArray, totalSearchCount);
}
@Override
public void writeTo(DataOutput output) throws IOException {
output.writeVInt(groupsData.totalSearchCount());
List<GroupEntryList> list = groupsData.list();
output.writeVInt(list.size());
for (int groupNum = 0; groupNum < list.size(); groupNum++) {
GroupEntryList entryList = list.get(groupNum);
output.writeVInt(entryList.totalCount());
output.writeVInt(entryList.size());
for (int j = 0; j < entryList.size(); j++) {
// 1. write Key
GroupEntry groupEntry = entryList.getEntry(j);
// logger.debug("groupEntry >> {}", groupEntry);
String groupKey = groupEntry.key;
output.writeString(groupKey);
// 2. group entry list
output.writeVInt(groupEntry.functionSize());
for (GroupingValue groupingValue : groupEntry.groupingValues()) {
if(groupingValue == null) {
output.writeVInt(GroupFunctionType.NONE.ordinal());
output.writeGenericValue("");
} else {
Object result = groupingValue.get();
output.writeVInt(groupingValue.getType().ordinal());
output.writeGenericValue(result);
}
}
}
}
}
}