package storm.applications.spout.parser;
import java.util.ArrayList;
import java.util.List;
import storm.applications.constants.AdsAnalyticsConstants.Stream;
import storm.applications.model.ads.AdEvent;
import storm.applications.util.stream.StreamValues;
/**
*
* @author mayconbordin
*/
public class AdEventParser extends Parser {
private static final int CLICKS = 0;
private static final int VIEWS = 1;
private static final int DISPLAY_URL = 2;
private static final int AD_ID = 3;
private static final int ADVERTISER_ID = 4;
private static final int DEPTH = 5;
private static final int POSITION = 6;
private static final int QUERY_ID = 7;
private static final int KEYWORD_ID = 8;
private static final int TITLE_ID = 9;
private static final int DESC_ID = 10;
private static final int USER_ID = 11;
@Override
public List<StreamValues> parse(String input) {
String[] record = input.split("\t");
if (record.length != 12)
return null;
int clicks = Integer.parseInt(record[CLICKS]);
int views = Integer.parseInt(record[VIEWS]);
String displayUrl = record[DISPLAY_URL];
long adId = Long.parseLong(record[AD_ID]);
long advertiserId = Long.parseLong(record[ADVERTISER_ID]);
int depth = Integer.parseInt(record[DEPTH]);
int position = Integer.parseInt(record[POSITION]);
long queryId = Long.parseLong(record[QUERY_ID]);
long keywordId = Long.parseLong(record[KEYWORD_ID]);
long titleId = Long.parseLong(record[TITLE_ID]);
long descriptionId = Long.parseLong(record[DESC_ID]);
long userId = Long.parseLong(record[USER_ID]);
List<StreamValues> tuples = new ArrayList<>();
for (int i=0; i<views+clicks; i++) {
AdEvent event = new AdEvent(displayUrl, queryId, adId, userId, advertiserId,
keywordId, titleId, descriptionId, depth, position);
event.setType((i < views) ? AdEvent.Type.Impression : AdEvent.Type.Click);
String streamId = (event.getType() == AdEvent.Type.Click)
? Stream.CLICKS : Stream.IMPRESSIONS;
StreamValues values = new StreamValues(queryId, adId, event);
values.setStreamId(streamId);
tuples.add(values);
}
return tuples;
}
}