/** * Licensed under the terms of the Apache License 2.0. Please see LICENSE file in the project root for terms. */ package apex.benchmark; import java.util.*; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.datatorrent.api.DefaultOutputPort; import com.datatorrent.api.InputOperator; import com.datatorrent.common.util.BaseOperator; public class JsonGenerator extends BaseOperator implements InputOperator { private static final transient Logger logger = LoggerFactory.getLogger(JsonGenerator.class); public final transient DefaultOutputPort<JSONObject> out = new DefaultOutputPort<JSONObject>(); private int adsIdx = 0; private int eventsIdx = 0; private String pageID = UUID.randomUUID().toString(); private String userID = UUID.randomUUID().toString(); private final String[] eventTypes = new String[]{"view", "click", "purchase"}; public int getNumCampaigns() { return numCampaigns; } public void setNumCampaigns(int numCampaigns) { this.numCampaigns = numCampaigns; } public int getNumAdsPerCampaign() { return numAdsPerCampaign; } public void setNumAdsPerCampaign(int numAdsPerCampaign) { this.numAdsPerCampaign = numAdsPerCampaign; } private int numCampaigns = 100; private int numAdsPerCampaign = 10; private List<String> ads; private final Map<String, List<String>> campaigns; public JsonGenerator() { this.campaigns = generateCampaigns(); this.ads = flattenCampaigns(); dumpCampaigns(); } public void dumpCampaigns() { StringBuilder sb = new StringBuilder(); for (String campaign : campaigns.keySet()) { sb.append(campaign).append("\n"); } logger.info("Campaigns: \n{}", sb.toString()); } public Map<String, List<String>> getCampaigns() { return campaigns; } /** * Generate a single element */ public JSONObject generateElement() { JSONObject jsonObject = new JSONObject(); try { jsonObject.put("user_id", userID); jsonObject.put("page_id", pageID); if (adsIdx == ads.size()) { adsIdx = 0; } if (eventsIdx == eventTypes.length) { eventsIdx = 0; } jsonObject.put("ad_id", ads.get(adsIdx++)); jsonObject.put("ad_type", "banner78"); jsonObject.put("event_type", eventTypes[eventsIdx++]); jsonObject.put("event_time", System.currentTimeMillis()); jsonObject.put("ip_address", "1.2.3.4"); } catch ( JSONException json) { } return jsonObject; } /** * Generate a random list of ads and campaigns */ private Map<String, List<String>> generateCampaigns() { Map<String, List<String>> adsByCampaign = new LinkedHashMap<>(); for (int i = 0; i < numCampaigns; i++) { String campaign = UUID.randomUUID().toString(); ArrayList<String> ads = new ArrayList<>(); adsByCampaign.put(campaign, ads); for (int j = 0; j < numAdsPerCampaign; j++) { ads.add(UUID.randomUUID().toString()); } } return adsByCampaign; } /** * Flatten into just ads */ private List<String> flattenCampaigns() { // Flatten campaigns into simple list of ads List<String> ads = new ArrayList<>(); for (Map.Entry<String, List<String>> entry : campaigns.entrySet()) { for (String ad : entry.getValue()) { ads.add(ad); } } return ads; } @Override public void emitTuples() { for (int index = 0; index < 100; ++index) { out.emit(generateElement()); } } }