package com.qubling.sidekick.fetch.cpan; import java.util.Map; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.qubling.sidekick.fetch.UpdateFetcher; import com.qubling.sidekick.instance.Release; import com.qubling.sidekick.model.Model; import com.qubling.sidekick.search.ResultSet; import com.qubling.sidekick.util.JSONFragment; public class ReleaseRatingsUpdateFetcher extends ReleaseUpdateFetcher implements UpdateFetcher<Release> { public ReleaseRatingsUpdateFetcher(Model<Release> model) { super(model, SearchSection.RATING, "rating_by_distribution"); } @Override public boolean needsUpdate(Release release) { return !release.hasRatingCount(); } @Override protected void prepareRequest(Map<String, Object> variables) { JSONFragment releasesTerms = makeReleasesTerms("rating"); variables.put("distributions", releasesTerms); } @Override protected void consumeResponse(JSONObject response) throws JSONException { ResultSet<Release> releases = getResultSet(); JSONArray facets = response.getJSONObject("facets").getJSONObject("ratings").getJSONArray("terms"); for (int i = 0; i < facets.length(); i++) { JSONObject facet = facets.getJSONObject(i); String releaseName = facet.getString("term"); int ratingCount = facet.getInt("count"); double ratingMean = facet.getDouble("mean"); Release release = releases.get(releaseName); if (release != null) { release.setRatingCount(ratingCount); release.setRatingMean(ratingMean); } } } @Override public String toString() { return getModel() + ":ReleaseRatingsUpdateFetcher(" + getResultSet() + ")"; } }