package org.fastcatsearch.http.writer; import java.io.IOException; import java.io.Writer; import org.fastcatsearch.ir.query.Result; import org.fastcatsearch.ir.query.Row; import org.fastcatsearch.ir.util.Formatter; import org.fastcatsearch.util.ResponseWriter; import org.fastcatsearch.util.ResultWriterException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 검색결과를 response stream에 기록하는 클래스. * */ public class DocumentSearchResultWriter extends AbstractDocumentSearchResultWriter { protected static Logger logger = LoggerFactory.getLogger(DocumentSearchResultWriter.class); private boolean isAdmin; private String[] fieldNames = null; public DocumentSearchResultWriter(Writer writer, boolean isAdmin) { super(writer); this.isAdmin = isAdmin; } @Override public void writeResult(Object obj, ResponseWriter rStringer, long searchTime, boolean isSuccess) throws ResultWriterException, IOException { Result result = null; if (!isSuccess) { String errorMsg = null; if (obj == null) errorMsg = "null"; else errorMsg = obj.toString(); rStringer.object().key("status").value(1).key("time").value(Formatter.getFormatTime(searchTime)).key("total_count").value(0).key("error_msg").value(errorMsg).endObject(); } else { result = (Result) obj; fieldNames = result.getFieldNameList(); rStringer.object().key("status").value(0).key("time").value(Formatter.getFormatTime(searchTime)).key("total_count").value(result.getTotalCount()).key("count") .value(result.getCount()).key("field_count").value(result.getFieldCount()).key("seg_count").value(result.getSegmentCount()).key("doc_count") .value(result.getDocCount()).key("del_count").value(result.getDeletedDocCount()).key("fieldname_list").array("name"); if (result.getCount() == 0 ) { rStringer.value("_no_"); } else { rStringer.value("_no_"); for (int i = 0; i < fieldNames.length; i++) { rStringer.object(); rStringer.key("name").value(fieldNames[i]); rStringer.endObject(); } } rStringer.endArray(); writeBody(result, rStringer, searchTime); rStringer.endObject(); } writer.write(rStringer.toString()); } public void writeBody(Result result, ResponseWriter rStringer, long searchTime) throws ResultWriterException { rStringer.key("result"); // data Row[] rows = result.getData(); int start = result.getStart(); if (rows.length == 0) { rStringer.array("item").object().key("_no_").value("No result found!").endObject().endArray(); } else { rStringer.array("item"); for (int i = 0; i < rows.length; i++) { Row row = rows[i]; rStringer.object().key("_no_").value(start + i); for (int k = 0; k < fieldNames.length; k++) { char[] f = row.get(k); String fdata = new String(f).trim(); rStringer.key(fieldNames[k]).value(fdata); } if ( row.isDeleted() ) rStringer.key("_delete_").value("true"); else rStringer.key("_delete_").value("false"); rStringer.endObject(); } rStringer.endArray(); } } }