for (SenseiHit hit : hits)
{
Map<String, String[]> fieldMap = hit.getFieldValues();
int fieldMapSize = fieldMap == null ? 0 : fieldMap.size();
JSONObject hitObj = new FastJSONObject(20 + fieldMapSize);
if (selectSet == null || selectSet.contains(PARAM_RESULT_HIT_UID))
{
hitObj.put(PARAM_RESULT_HIT_UID, hit.getUID());
}
if (selectSet == null || selectSet.contains(PARAM_RESULT_HIT_DOCID))
{
hitObj.put(PARAM_RESULT_HIT_DOCID, hit.getDocid());
}
if (selectSet == null || selectSet.contains(PARAM_RESULT_HIT_SCORE))
{
hitObj.put(PARAM_RESULT_HIT_SCORE, formatScore(req.getScoreMeaningfulDigits(), hit.getScore()));
}
if (selectSet == null || selectSet.contains(PARAM_RESULT_HIT_GROUPFIELD))
{
hitObj.put(PARAM_RESULT_HIT_GROUPFIELD, hit.getGroupField());
}
if (selectSet == null || selectSet.contains(PARAM_RESULT_HIT_GROUPVALUE))
{
hitObj.put(PARAM_RESULT_HIT_GROUPVALUE, hit.getGroupValue());
}
if (selectSet == null || selectSet.contains(PARAM_RESULT_HIT_GROUPHITSCOUNT))
{
hitObj.put(PARAM_RESULT_HIT_GROUPHITSCOUNT, hit.getGroupHitsCount());
}
if (hit.getGroupHits() != null && hit.getGroupHits().length > 0)
hitObj.put(PARAM_RESULT_HIT_GROUPHITS, buildJSONHits(req, hit.getSenseiGroupHits()));
// get fetchStored even if request does not have it because it could be set at the
// federated broker level
if (selectSet == null || selectSet.contains(PARAM_RESULT_HIT_SRC_DATA) ||
req.isFetchStoredFields() || hit.getSrcData() != null)
{
hitObj.put(PARAM_RESULT_HIT_SRC_DATA, hit.getSrcData());
}
if (fieldMap != null)
{
Set<Entry<String, String[]>> entries = fieldMap.entrySet();
for (Entry<String, String[]> entry : entries)
{
String key = entry.getKey();
if (key.equals(PARAM_RESULT_HIT_UID))
{
// UID is already set.
continue;
}
if (selectSet == null || selectSet.contains(key))
{
String[] vals = entry.getValue();
JSONArray valArray;
if (vals != null)
{
valArray = new FastJSONArray(vals.length);
for (String val : vals)
{
valArray.put(val);
}
}
else
{
valArray = new FastJSONArray();
}
hitObj.put(key, valArray);
}
}
}
Document doc = hit.getStoredFields();
if (doc != null)
{
if (selectSet == null || selectSet.contains(PARAM_RESULT_HIT_STORED_FIELDS))
{
List<Fieldable> fields = doc.getFields();
List<JSONObject> storedData = new ArrayList<JSONObject>(fields.size());
for (Fieldable field : fields)
{
JSONObject data = new FastJSONObject(4);
data.put(PARAM_RESULT_HIT_STORED_FIELDS_NAME, field.name());
data.put(PARAM_RESULT_HIT_STORED_FIELDS_VALUE, field.stringValue());
storedData.add(data);
}
hitObj.put(PARAM_RESULT_HIT_STORED_FIELDS, new FastJSONArray(storedData));
}
}
Map<String,BrowseHit.TermFrequencyVector> tvMap = hit.getTermFreqMap();
if (tvMap != null && tvMap.size() > 0){
JSONObject tvObj = new FastJSONObject(2 * tvMap.entrySet().size());
if (selectSet == null || selectSet.contains(PARAM_RESULT_HIT_TERMVECTORS))
{
hitObj.put(PARAM_RESULT_HIT_TERMVECTORS, tvObj);
}
Set<Entry<String,BrowseHit.TermFrequencyVector>> entries = tvMap.entrySet();
for (Entry<String,BrowseHit.TermFrequencyVector> entry : entries){
String field = entry.getKey();
String[] terms = entry.getValue().terms;
int[] freqs = entry.getValue().freqs;
JSONArray tvArray = new FastJSONArray(terms.length);
for (int i=0;i<terms.length;++i){
JSONObject tv = new FastJSONObject(4);
tv.put("term", terms[i]);
tv.put("freq", freqs[i]);
tvArray.put(tv);
}
tvObj.put(field, tvArray);
}