package org.ariadne_eu.utils.rest; import java.util.Arrays; public class QueryResult { public int[] intIDs; public int[] rankValues; public String[] facetKeys; public int[] facetCounts; public int nrOfResults = 0; public int nrOfIDs = 0; public Query query; public QueryResult(Query qry){ query = qry; intIDs = new int[qry.idListOffset+qry.idListSize]; rankValues = new int[qry.idListOffset+qry.idListSize]; } public void initialise(SearchNode node){ int dimfacets = 0; for (int i=0;i< query.facets.length;i++) dimfacets = dimfacets+node.getKeysDimension(query.facets[i]); facetKeys = new String[dimfacets]; facetCounts = new int[dimfacets]; int cnt = 0; for (int i=0;i< query.facets.length;i++){ String[] temp = node.getKeys(query.facets[i]); for (int j=0;j<temp.length;j++) facetKeys[cnt++] = query.facets[i]+":"+temp[j]; } } public String toJson(){ int nrToShow = nrOfIDs; boolean errorFound = false; String error = ""; String errorMessage = ""; String jsonResult = "{\"result\":{\"nrOfResults\":"+nrOfResults+","; //Add ids String ids = "\"id\":["; boolean firstID = true; //TODO adapt numbers to show //nrToShow = nrOfRes; //if (nrToShow > maxNrOfIDs) nrToShow = maxNrOfIDs; //System.out.println("nrToShow="+nrToShow); for (int i=0; i<nrToShow;i++){ if (firstID) firstID = false; else ids = ids +","; ids = ids + intIDs[i]; } //ids = ids + "123,456"; jsonResult = jsonResult + ids + "],"; //Add metadata String metadata = "\"metadata\":["; //String metadata = ""; boolean firstTitle = true; //TODO adapt numbers to show //We should not show all of them. The array of IDs can be larger than what we need to show for (int i=0; i<nrToShow;i++){ if (firstTitle) firstTitle = false; else metadata = metadata +","; //LOMResult lr = eng.getLOMResult(result.intIDs[i]); //metadata = metadata + "{\"title\":\""+lr.title //+"\",\"location\":\""+lr.location+"\"}"; try { metadata = metadata + query.searchEngine.getJsonResult(intIDs[i]); } catch (Exception ex) { errorFound = true; } } jsonResult = jsonResult + metadata + "],"; //Add facets //{"facets":[{"field":"language",[{"value":"fr","count":1045},{"value":"fr","count":1045},{"value":"fr","count":1045}]},{"field":"lrt",[{"value":"animation","count":123},{"value":"experimentation","count":456},{"value":"web page","count":789}]}]} String facets = "\"facets\":["; for (int i=0;i<query.facets.length;i++){ String curFacetField = query.facets[i]; if (i>0) facets = facets + ","; facets = facets + "{\"field\":\""+curFacetField+ "\",\"numbers\":["; boolean found = false; int j = -1 - Arrays.binarySearch(facetKeys, curFacetField+":"); if (j < facetKeys.length){ String facetField = facetKeys[j].substring(0, facetKeys[j].indexOf(":")); found = facetField.equals(curFacetField); } boolean nextNumber = false; while (found){ int separatorPos = facetKeys[j].indexOf(":"); String facetField = facetKeys[j].substring(0, separatorPos); String facetValue = facetKeys[j].substring(separatorPos+1); if (found = facetField.equals(curFacetField)){ if (nextNumber) { facets = facets + ","; } else { nextNumber = true; } facets = facets + "{\"val\":\""+facetValue+"\",\"count\":"+facetCounts[j]+"}"; j++; found = j < facetKeys.length; } } facets = facets + "]}"; } /* for (int j=0;j<facetCounts.length;j++){ int separatorPos = facetKeys[j].indexOf(":"); String facetField = facetKeys[j].substring(0, separatorPos); String facetValue = facetKeys[j].substring(separatorPos+1); if (!facetField.equals(curFacetField)){ //A new facetField //if (curFacetField.length()>0) facets = facets + "]},"; if (j>0) facets = facets + "]},"; facets = facets + "{\"field\":\""+facetField+ "\",\"numbers\":["; curFacetField = facetField; } else { facets = facets + ","; } facets = facets + "{\"val\":\""+facetValue+"\",\"count\":"+facetCounts[j]+"}"; //System.out.println(result.facetKeys[i]+"= "+result.facetCounts[i]); } if (facetCounts.length>0) facets = facets + "]}";*/ jsonResult = jsonResult + facets + "],"; // Add error message jsonResult = jsonResult + "\"error\":\""+error+"\",\"errorMessage\":\""+errorMessage+"\""; //Add end json string jsonResult = jsonResult + "}}"; return jsonResult; } }