package org.fastcatsearch.transport.vo;
import java.io.IOException;
import org.fastcatsearch.common.io.Streamable;
import org.fastcatsearch.ir.io.DataInput;
import org.fastcatsearch.ir.io.DataOutput;
import org.fastcatsearch.ir.query.Row;
import org.fastcatsearch.ir.search.DocumentResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class StreamableDocumentResult implements Streamable {
private static Logger logger = LoggerFactory.getLogger(StreamableDocumentResult.class);
private DocumentResult documentResult;
public StreamableDocumentResult() {
}
public StreamableDocumentResult(DocumentResult documentResult) {
this.documentResult = documentResult;
}
@Override
public void readFrom(DataInput input) throws IOException {
int size = input.readVInt();
Row[] rows = new Row[size];
for (int i = 0; i < rows.length; i++) {
int fieldCount = input.readVInt();
rows[i] = new Row(fieldCount);
for (int j = 0; j < fieldCount; j++) {
char[] chars = input.readUString();
rows[i].put(j, chars);
}
}
Row[][] bundleRowList = null;
int bundleDocsize = input.readVInt();
if(bundleDocsize > 0) {
bundleRowList = new Row[bundleDocsize][];
for (int i = 0; i < bundleDocsize; i++) {
int rowSize = input.readVInt();
if(rowSize > 0) {
bundleRowList[i] = new Row[rowSize];
for (int j = 0; j < rowSize; j++) {
int fieldCount = input.readVInt();
bundleRowList[i][j] = new Row(fieldCount);
for (int k = 0; k < fieldCount; k++) {
char[] chars = input.readUString();
bundleRowList[i][j].put(k, chars);
}
}
}
}
}
String[] fieldIdList = new String[input.readVInt()];
for (int i = 0; i < fieldIdList.length; i++) {
fieldIdList[i] = input.readString();
}
documentResult = new DocumentResult(rows, bundleRowList, fieldIdList);
}
@Override
public void writeTo(DataOutput output) throws IOException {
Row[] rows = documentResult.rows();
output.writeVInt(rows.length);
for (int i = 0; i < rows.length; i++) {
Row row = rows[i];
int fieldCount = row.getFieldCount();
output.writeVInt(fieldCount);
for (int j = 0; j < fieldCount; j++) {
char[] chars = row.get(j);
output.writeUString(chars, 0, chars.length);
}
}
if(documentResult.bundleRows() != null) {
Row[][] bundleRowList = documentResult.bundleRows();
output.writeVInt(bundleRowList.length);
for(Row[] bundleRow : bundleRowList) {
if(bundleRow != null) {
output.writeVInt(bundleRow.length);
for(Row row : bundleRow) {
int fieldCount = row.getFieldCount();
output.writeVInt(fieldCount);
for (int j = 0; j < fieldCount; j++) {
char[] chars = row.get(j);
output.writeUString(chars, 0, chars.length);
}
}
} else{
output.writeVInt(0);
}
}
}else {
output.writeVInt(0);
}
String[] fieldIdList = documentResult.fieldIdList();
output.writeVInt(fieldIdList.length);
for (int i = 0; i < fieldIdList.length; i++) {
output.writeString(fieldIdList[i]);
}
}
public DocumentResult documentResult() {
return documentResult;
}
}