package edu.illinois.lis.query; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import edu.illinois.lis.document.FeatureVector; /** * reads and holds GQueries stored as a serialized JSON file on disk. * * @author Miles Efron * */ public class GQueriesJsonImpl implements GQueries { private static final Logger LOG = Logger.getLogger(GQueriesJsonImpl.class); private static final JsonParser JSON_PARSER = new JsonParser(); private List<GQuery> queryList; private Map<String,Integer> nameToIndex; public void read(String pathToQueries) { JsonObject obj = null; try { obj = (JsonObject) JSON_PARSER.parse(new BufferedReader(new FileReader(pathToQueries))); } catch (Exception e) { LOG.fatal("died reading queries from json file", e); System.exit(-1); } JsonArray queryObjectArray = obj.getAsJsonArray("queries"); queryList = new ArrayList<GQuery>(queryObjectArray.size()); nameToIndex = new HashMap<String,Integer>(queryList.size()); Iterator<JsonElement> queryObjectIterator = queryObjectArray.iterator(); int k=0; while(queryObjectIterator.hasNext()) { JsonObject queryObject = (JsonObject) queryObjectIterator.next(); String title = queryObject.get("title").getAsString(); String text = queryObject.get("text").getAsString(); double epoch = queryObject.get("epoch").getAsDouble(); long querytweettime = queryObject.get("querytweettime").getAsLong(); nameToIndex.put(title, k++); FeatureVector featureVector = new FeatureVector(null); JsonArray modelObjectArray = queryObject.getAsJsonArray("model"); Iterator<JsonElement> featureIterator = modelObjectArray.iterator(); while(featureIterator.hasNext()) { JsonObject featureObject = (JsonObject)featureIterator.next(); double weight = featureObject.get("weight").getAsDouble(); String feature = featureObject.get("feature").getAsString(); featureVector.addTerm(feature, weight); } GQuery gQuery = new GQuery(); gQuery.setTitle(title); gQuery.setText(text); gQuery.setEpoch(epoch); gQuery.setQuerytweettime(querytweettime); gQuery.setFeatureVector(featureVector); queryList.add(gQuery); } } public GQuery getIthQuery(int i) { if(queryList == null || i >= queryList.size()) { LOG.fatal("died trying to get query number " + i + " when we have only " + queryList.size() + " queries."); System.exit(-1); } return queryList.get(i); } public GQuery getNamedQuery(String queryName) { if(queryList == null || ! nameToIndex.containsKey(queryName)) { LOG.fatal("died trying to get query " + queryName + "."); System.exit(-1); } return queryList.get(nameToIndex.get(queryName)); } public Iterator<GQuery> iterator() { return queryList.iterator(); } public int numQueries() { return queryList.size(); } @Override public String toString() { StringBuilder b = new StringBuilder(); Iterator<GQuery> it = queryList.iterator(); while(it.hasNext()) { b.append(it.next()); } return b.toString(); } }