package uk.co.flax.examples.xjoin; import java.io.IOException; import java.util.ArrayList; import java.util.List; 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 OfferXJoinResultsFactory implements XJoinResultsFactory<String> { private String url; private String field; private String discountField; @Override @SuppressWarnings("rawtypes") public void init(NamedList args) { url = (String)args.get("url"); field = (String)args.get("field"); discountField = (String)args.get("discountField"); } /** * Use 'offers' REST API to fetch current offer data. */ @Override public XJoinResults<String> getResults(SolrParams params) throws IOException { try (HttpConnection http = new HttpConnection(url)) { JsonArray offers = (JsonArray)http.getJson(); return new OfferResults(offers); } } /** * Results of the external search - methods like getXXX() are used * to expose the property XXX in the SOLR results. */ public class OfferResults implements XJoinResults<String> { private JsonArray offers; public OfferResults(JsonArray offers) { this.offers = offers; } public int getCount() { return offers.size(); } @Override public Iterable<String> getJoinIds() { List<String> ids = new ArrayList<>(); for (JsonValue offer : offers) { ids.add(((JsonObject)offer).getString(field)); } return ids; } @Override public Object getResult(String joinIdStr) { for (JsonValue offer : offers) { String id = ((JsonObject)offer).getString(field); if (id.equals(joinIdStr)) { return new Offer(offer); } } return null; } } /** * A discount offer - methods like getXXX() are used to expose * properties that can be joined with each SOLR result via the join * id field. */ public class Offer { private JsonValue offer; public Offer(JsonValue offer) { this.offer = offer; } public double getDiscount() { return ((JsonObject)offer).getInt(discountField) * 0.01d; } } }