package uk.co.flax.examples.xjoin; import java.io.IOException; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import javax.json.JsonArray; import javax.json.JsonObject; import javax.json.JsonValue; import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.NamedList; import org.apache.solr.search.xjoin.XJoinResults; import org.apache.solr.search.xjoin.XJoinResultsFactory; public class ClickXJoinResultsFactory implements XJoinResultsFactory<String> { private String url; @Override @SuppressWarnings("rawtypes") public void init(NamedList args) { url = (String)args.get("url"); } /** * Use 'click' REST API to fetch current click data. */ @Override public XJoinResults<String> getResults(SolrParams params) throws IOException { String q = URLEncoder.encode(params.get("q"), "UTF-8"); String apiUrl = url + "?q=" + q; try (HttpConnection http = new HttpConnection(apiUrl)) { JsonArray products = (JsonArray)http.getJson(); return new ClickResults(products); } } public class ClickResults implements XJoinResults<String> { private Map<String, Click> clickMap; public ClickResults(JsonArray products) { clickMap = new HashMap<>(); for (JsonValue product : products) { JsonObject object = (JsonObject)product; String id = object.getString("id"); double weight = object.getJsonNumber("weight").doubleValue(); clickMap.put(id, new Click(id, weight)); } } public int getCount() { return clickMap.size(); } @Override public Iterable<String> getJoinIds() { return clickMap.keySet(); } @Override public Object getResult(String id) { return clickMap.get(id); } } public class Click { private String id; private double weight; public Click(String id, double weight) { this.id = id; this.weight = weight; } public String getId() { return id; } public double getWeight() { return weight; } } }