package org.fastcatsearch.http.writer;
import org.fastcatsearch.ir.field.ScoreField;
import org.fastcatsearch.ir.query.Result;
import org.fastcatsearch.ir.query.Row;
import org.fastcatsearch.ir.util.Formatter;
import org.fastcatsearch.settings.SearchPageSettings.SearchCategorySetting;
import org.fastcatsearch.util.ResponseWriter;
import org.fastcatsearch.util.ResultWriterException;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DemoSearchResultWriter extends AbstractSearchResultWriter {
private SearchCategorySetting setting;
public DemoSearchResultWriter(ResponseWriter resultStringer, SearchCategorySetting setting) {
super(resultStringer);
this.setting = setting;
}
@Override
public void writeResult(Object obj, long searchTime, boolean isSuccess) throws ResultWriterException, IOException {
if(!isSuccess){
String errorMsg = null;
if(obj == null){
errorMsg = "null";
}else{
errorMsg = obj.toString();
}
resultWriter.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 = (Result)obj;
// fieldNames = result.getFieldNameList();
resultWriter.object()
.key("status").value(0)
.key("time").value(Formatter.getFormatTime(searchTime))
.key("start").value(result.getStart())
.key("total_count").value(result.getTotalCount())
.key("count").value(result.getCount());
// .key("field_count").value(fieldNames.length)
// .key("fieldname_list")
// .array("name");
//
// for (int i = 0; i < fieldNames.length; i++) {
// resultWriter.value(fieldNames[i]);
// }
// resultWriter.endArray();
writeBody(result, resultWriter, searchTime);
resultWriter.endObject();
resultWriter.done();
}
}
Pattern patt = Pattern.compile("\\$[a-zA-Z_\\-\\d]+");
Pattern patt2 = Pattern.compile("\\$\\{[a-zA-Z_\\-\\d]+\\}");
private Set<String> findIdList(String source) {
if(source == null) {
return new HashSet<String>();
}
Set<String> set = new HashSet<String>();
logger.debug("source > {}", source);
Matcher matcher = patt.matcher(source);
while(matcher.find()){
String g = matcher.group();
set.add(g.substring(1));
}
matcher = patt2.matcher(source);
while(matcher.find()){
String g = matcher.group();
int len = g.length();
set.add(g.substring(2, len - 1));
}
return set;
}
public void writeBody(Result result, ResponseWriter resultWriter, long searchTime) throws ResultWriterException {
String[] fieldNames = result.getFieldNameList();
String thumbnailField = setting.getThumbnailField();
String titleField = setting.getTitleField();
String bodyField = setting.getBodyField();
String bundleField = setting.getBundleField();
Set<String> thumbnailIdSet = findIdList(thumbnailField);
Set<String> titleIdSet = findIdList(titleField);
Set<String> bodyIdSet = findIdList(bodyField);
Set<String> bundleIdSet = findIdList(bundleField);
resultWriter.key("result");
//data
Row[] rows = result.getData();
Row[][] bundleRowsList = result.getBundleData();
int[] bundleTotalSizeList = result.getBundleTotalSizeList();
if(rows.length == 0){
resultWriter.array("item").endArray();
}else{
resultWriter.array("item");
for (int i = 0; i < rows.length; i++) {
Row row = rows[i];
Row[] bundleRows = null;
int bundleTotalSize = 0;
if(bundleRowsList != null) {
bundleRows = bundleRowsList[i];
bundleTotalSize = bundleTotalSizeList[i];
}
resultWriter.object();
/*
* 0. thumbnail
* */
resultWriter.key("thumbnail");
Iterator<String> iter = thumbnailIdSet.iterator();
String thumbnailData = thumbnailField;
while(iter.hasNext()) {
String fieldId = iter.next();
String fieldData = getFieldData(fieldId, row, fieldNames, bundleTotalSize);
thumbnailData = thumbnailData.replaceAll("\\$\\{"+fieldId+"\\}", fieldData);
thumbnailData = thumbnailData.replaceAll("\\$"+fieldId, fieldData);
}
resultWriter.value(thumbnailData);
/*
* 1. title
* */
resultWriter.key("title");
iter = titleIdSet.iterator();
String titleData = titleField;
while(iter.hasNext()) {
String fieldId = iter.next();
String fieldData = getFieldData(fieldId, row, fieldNames, bundleTotalSize);
titleData = titleData.replaceAll("\\$\\{"+fieldId+"\\}", fieldData);
titleData = titleData.replaceAll("\\$"+fieldId, fieldData);
}
resultWriter.value(titleData);
/*
* 2. body
* */
String bodyData = bodyField;
resultWriter.key("body");
iter = bodyIdSet.iterator();
while(iter.hasNext()) {
String fieldId = iter.next();
String fieldData = getFieldData(fieldId, row, fieldNames, bundleTotalSize);
fieldData = fieldData.replaceAll("\\$", "$");
bodyData = bodyData.replaceAll("([\\$])"+fieldId+"", fieldData);
bodyData = bodyData.replaceAll("\\$\\{"+fieldId+"\\}", fieldData);
}
resultWriter.value(bodyData);
/*
* 3. bundle
* */
if(bundleRows != null) {
resultWriter.key("bundle").array("item");
for(Row bundleRow : bundleRows) {
String bundleData = bundleField;
iter = bundleIdSet.iterator();
while(iter.hasNext()) {
String fieldId = iter.next();
String fieldData = getFieldData(fieldId, bundleRow, fieldNames, bundleTotalSize);
bundleData = bundleData.replaceAll("\\$"+fieldId, fieldData);
}
resultWriter.value(bundleData);
}
resultWriter.endArray();
}
resultWriter.endObject();
}
resultWriter.endArray();
// GroupResults groupResult = result.getGroupResult();
//
// new GroupResultWriter(null).writeBody(groupResult, resultWriter);
}
}
private String getFieldData(String fieldId, Row row, String[] fieldNames, int bundleTotalSize) {
if(fieldId.equalsIgnoreCase(ScoreField.fieldName)){
return String.valueOf(row.getScore());
}
if(fieldId.equalsIgnoreCase("_bundleSize")){
return String.valueOf(bundleTotalSize);
}
for(int k = 0; k < fieldNames.length; k++) {
if(fieldId.equalsIgnoreCase(fieldNames[k])){
return new String(row.get(k)).trim();
}
}
return "";
}
}