package org.fastcatsearch.http.writer; import java.io.IOException; import java.io.Writer; import java.util.HashSet; import java.util.Set; import org.fastcatsearch.common.Strings; import org.fastcatsearch.ir.dic.HashSetDictionary; import org.fastcatsearch.ir.group.GroupEntry; import org.fastcatsearch.ir.group.GroupResult; import org.fastcatsearch.ir.group.GroupResults; import org.fastcatsearch.ir.group.GroupingValue; import org.fastcatsearch.util.ResponseWriter; import org.fastcatsearch.util.ResultWriterException; public class GroupResultWriter extends AbstractSearchResultWriter { public GroupResultWriter(ResponseWriter resultWriter) { super(resultWriter); } @Override public void writeResult(Object result, long searchTime, boolean isSuccess) throws ResultWriterException, IOException{ resultWriter.object(); if(!isSuccess){ String errorMsg = null; if(result == null){ errorMsg = "null"; }else{ errorMsg = result.toString(); } resultWriter.key("status").value(1) .key("time").value(Strings.getHumanReadableTimeInterval(searchTime)) .key("total_count").value(0) .key("count").value(0) .key("error_msg").value(errorMsg); }else{ GroupResults groupResults = (GroupResults) result; resultWriter.key("status").value(0) .key("time").value(Strings.getHumanReadableTimeInterval(searchTime)) .key("total_count").value(groupResults.totalSearchCount()) .key("count").value(groupResults.totalSearchCount()); writeBody(groupResults, resultWriter); } resultWriter.endObject(); resultWriter.done(); } public void writeBody(GroupResults groupResults, ResponseWriter resultStringer) throws ResultWriterException { if(groupResults == null){ resultStringer.key("group_result").array("group_list").endArray(); } else { GroupResult[] groupResultList = groupResults.groupResultList(); resultStringer.key("group_result").array("group_list"); for (int i = 0; i < groupResultList.length; i++) { GroupResult groupResult = groupResultList[i]; resultStringer.object() .key("label").value(groupResult.fieldId()) .key("functionNameList").array("function_item"); String[] functionName = groupResult.headerNameList(); for (int k = 0; k < functionName.length; k++) { resultStringer.value(functionName[k]); } resultStringer.endArray(); resultStringer.key("result").array("group_item"); int size = groupResult == null ? 0 : groupResult.size(); for (int k = 0; k < size; k++) { GroupEntry e = groupResult.getEntry(k); String keyData = e.key; resultStringer.object() .key("_KEY").value(keyData); Set<String> dupSet = new HashSet<String>(); for (int j = 0; j < functionName.length; j++) { //동일그룹기능에 동일컬럼으로 중복되게 호출했을 경우, 헤더이름이 동일해서 json에러가 발생할수 있다. if(dupSet.add(functionName[j])) { GroupingValue val = e.groupingValue(j); resultStringer.key(functionName[j]).value(val != null ? val.toString() : ""); } } resultStringer.endObject(); }//for resultStringer.endArray();//group_item resultStringer.endObject(); }//for resultStringer.endArray(); }//if else } }