package crmdna.mail2; import com.google.gson.Gson; import com.googlecode.objectify.Key; import com.googlecode.objectify.cmd.Query; import crmdna.client.Client; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import static crmdna.common.AssertUtils.ensureNotNull; import static crmdna.common.OfyService.ofy; // TODO: consider removing this class EmailStats { private String client; private List<Key<SentMailEntity>> recipients; private List<Key<SentMailEntity>> rejects; private List<Key<SentMailEntity>> defers; private List<Key<SentMailEntity>> hardBounces; private List<Key<SentMailEntity>> softBounces; private List<Key<SentMailEntity>> opens; private List<Key<SentMailEntity>> mobileClicks; private List<Key<SentMailEntity>> countryCityKeys; private List<Key<SentMailEntity>> clicks; private List<Key<SentMailEntity>> complaints; EmailStats(String client, Query<SentMailEntity> q) { Client.ensureValid(client); this.client = client; ensureNotNull(q, "query q is null"); recipients = q.keys().list(); System.out.println("recipients: " + new Gson().toJson(recipients)); rejects = q.filter("reject", true).keys().list(); defers = q.filter("defer", true).keys().list(); hardBounces = q.filter("hardBounce", true).keys().list(); softBounces = q.filter("softBounce", true).keys().list(); opens = q.filter("open", true).keys().list(); mobileClicks = q.filter("mobile", true).keys().list(); // countryCities = q.filter("click", true).project("countryCity").list(); countryCityKeys = q.filter("click", true).keys().list(); clicks = q.filter("click", true).keys().list(); complaints = q.filter("spam", true).keys().list(); } MailStatsProp getStatsNow() { // this will be a blocking call ensureNotNull(recipients); ensureNotNull(rejects); ensureNotNull(defers); ensureNotNull(hardBounces); ensureNotNull(softBounces); ensureNotNull(opens); ensureNotNull(mobileClicks); ensureNotNull(countryCityKeys); ensureNotNull(clicks); ensureNotNull(complaints); List<SentMailEntity> countryCities = new ArrayList<>(); if (!countryCityKeys.isEmpty()) countryCities = ofy(client).load().type(SentMailEntity.class).filterKey("in", countryCityKeys) .project("countryCity").list(); MailStatsProp prop = new MailStatsProp(); prop.numRecipientsSendAttempted = recipients.size(); prop.numRecipientsSendAttempted = prop.rejects = rejects.size(); prop.defers = defers.size(); prop.hardBounces = hardBounces.size(); prop.softBounces = softBounces.size(); prop.numRecipientsSent = prop.numRecipientsSendAttempted - prop.rejects - prop.defers - prop.hardBounces - prop.softBounces; prop.numRecipientsThatOpened = opens.size(); prop.numRecipientsThatClickedALinkFromMobile = mobileClicks.size(); final String NOT_AVAILABLE = "N.A"; for (SentMailEntity entity : countryCities) { if ((entity.countryCity == null) || !entity.countryCity.contains("/")) entity.countryCity = NOT_AVAILABLE + "/" + NOT_AVAILABLE; String split[] = entity.countryCity.split(Pattern.quote("/")); String country = NOT_AVAILABLE; if (split.length == 2) { country = split[0]; } Map<String, Integer> map = prop.countryVsNumRecipientsThatClickedALink; if (!map.containsKey(country)) map.put(country, 0); map.put(country, map.get(country) + 1); map = prop.cityVsNumRecipientsThatClickedALink; if (!map.containsKey(entity.countryCity)) map.put(entity.countryCity, 0); map.put(entity.countryCity, map.get(entity.countryCity) + 1); } prop.numRecipientsThatClickedALink = clicks.size(); prop.numRecipientsThatReportedAsSpam = complaints.size(); return prop; } }