use of com.codecademy.eventhub.model.Event in project EventHub by Codecademy.
the class PropertiesIndexTest method testAll.
@Test
public void testAll() throws Exception {
final String USER_ID = "foo";
final String DATE = "20140101";
Provider<PropertiesIndex> propertiesIndexProvider = getPropertiesIndexProvider();
PropertiesIndex propertiesIndex = propertiesIndexProvider.get();
List<Event> events = Lists.newArrayList(new Event.Builder("signup", USER_ID, DATE, ImmutableMap.of("experiment", "foo1", "treatment", "bar1")).build(), new Event.Builder("signup", USER_ID, DATE, ImmutableMap.of("experiment", "foo1", "treatment", "bar2")).build(), new Event.Builder("signup", USER_ID, DATE, ImmutableMap.of("hello", "world")).build(), new Event.Builder("signup", USER_ID, DATE, ImmutableMap.of("", "")).build(), new Event.Builder("submission", USER_ID, DATE, ImmutableMap.of("experiment", "foo2", "treatment", "bar3")).build(), new Event.Builder("submission", USER_ID, DATE, ImmutableMap.of("experiment", "foo2", "treatment", "bar3")).build(), new Event.Builder("submission", USER_ID, DATE, ImmutableMap.of("x", "y")).build());
for (Event event : events) {
propertiesIndex.addEvent(event);
}
propertiesIndex.addUser(new User.Builder("user_id1", ImmutableMap.of("foo1", "bar1")).build());
propertiesIndex.addUser(new User.Builder("user_id2", ImmutableMap.of("foo1", "bar2", "foo2", "bar3")).build());
Assert.assertEquals(Lists.newArrayList("experiment", "hello", "treatment"), propertiesIndex.getEventKeys("signup"));
Assert.assertEquals(Lists.newArrayList("foo1"), propertiesIndex.getEventValues("signup", "experiment", ""));
Assert.assertEquals(Lists.newArrayList("bar1", "bar2"), propertiesIndex.getEventValues("signup", "treatment", ""));
Assert.assertEquals(Lists.newArrayList("experiment", "treatment", "x"), propertiesIndex.getEventKeys("submission"));
Assert.assertEquals(Lists.newArrayList("foo2"), propertiesIndex.getEventValues("submission", "experiment", ""));
Assert.assertEquals(Lists.newArrayList("bar3"), propertiesIndex.getEventValues("submission", "treatment", ""));
Assert.assertEquals(Lists.newArrayList("bar1", "bar2"), propertiesIndex.getEventValues("signup", "treatment", "bar"));
Assert.assertEquals(Lists.newArrayList("bar1"), propertiesIndex.getEventValues("signup", "treatment", "bar1"));
Assert.assertEquals(Lists.newArrayList("bar2"), propertiesIndex.getEventValues("signup", "treatment", "bar2"));
Assert.assertEquals(Lists.newArrayList("foo1", "foo2"), propertiesIndex.getUserKeys());
Assert.assertEquals(Lists.newArrayList("bar1", "bar2"), propertiesIndex.getUserValues("foo1", "b"));
Assert.assertTrue(propertiesIndex.getUserValues("foo1", "c").isEmpty());
Assert.assertEquals(Lists.newArrayList("bar3"), propertiesIndex.getUserValues("foo2", ""));
propertiesIndex.close();
propertiesIndex = propertiesIndexProvider.get();
Assert.assertEquals(Lists.newArrayList("experiment", "hello", "treatment"), propertiesIndex.getEventKeys("signup"));
Assert.assertEquals(Lists.newArrayList("foo1"), propertiesIndex.getEventValues("signup", "experiment", ""));
Assert.assertEquals(Lists.newArrayList("bar1", "bar2"), propertiesIndex.getEventValues("signup", "treatment", ""));
Assert.assertEquals(Lists.newArrayList("experiment", "treatment", "x"), propertiesIndex.getEventKeys("submission"));
Assert.assertEquals(Lists.newArrayList("foo2"), propertiesIndex.getEventValues("submission", "experiment", ""));
Assert.assertEquals(Lists.newArrayList("bar3"), propertiesIndex.getEventValues("submission", "treatment", ""));
Assert.assertEquals(Lists.newArrayList("bar1", "bar2"), propertiesIndex.getEventValues("signup", "treatment", "bar"));
Assert.assertEquals(Lists.newArrayList("bar1"), propertiesIndex.getEventValues("signup", "treatment", "bar1"));
Assert.assertEquals(Lists.newArrayList("bar2"), propertiesIndex.getEventValues("signup", "treatment", "bar2"));
Assert.assertEquals(Lists.newArrayList("foo1", "foo2"), propertiesIndex.getUserKeys());
Assert.assertEquals(Lists.newArrayList("bar1", "bar2"), propertiesIndex.getUserValues("foo1", "b"));
Assert.assertTrue(propertiesIndex.getUserValues("foo1", "c").isEmpty());
Assert.assertEquals(Lists.newArrayList("bar3"), propertiesIndex.getUserValues("foo2", ""));
}
use of com.codecademy.eventhub.model.Event in project EventHub by Codecademy.
the class TrackEvent method execute.
@Override
public synchronized void execute(final HttpServletRequest request, final HttpServletResponse response) throws IOException {
String date = request.getParameter("date");
if (date == null) {
date = dateHelper.getDate();
}
Event event = new Event.Builder(request.getParameter("event_type"), request.getParameter("external_user_id"), date, toProperties(request)).build();
response.getWriter().println(eventHub.addEvent(event));
}
use of com.codecademy.eventhub.model.Event in project EventHub by Codecademy.
the class EventHubTest method testConcurrentAddEvent.
@Test
public void testConcurrentAddEvent() throws Exception {
Injector injector = getInjector();
final String directory = injector.getInstance(Key.get(String.class, Names.named("eventhub.directory")));
final ShardedEventIndex shardedEventIndex = injector.getInstance(ShardedEventIndex.class);
final DatedEventIndex datedEventIndex = injector.getInstance(DatedEventIndex.class);
final PropertiesIndex propertiesIndex = injector.getInstance(PropertiesIndex.class);
final UserEventIndex userEventIndex = injector.getInstance(UserEventIndex.class);
final EventStorage eventStorage = injector.getInstance(JournalEventStorage.class);
final UserStorage userStorage = injector.getInstance(JournalUserStorage.class);
final EventHub eventHub = new EventHub(directory, shardedEventIndex, datedEventIndex, propertiesIndex, userEventIndex, eventStorage, userStorage);
final int NUM_EVENTS = 2000;
// NUM_EVENTS needs to be muliple of NUM_THREADS
final int NUM_THREADS = 20;
final String[] EVENT_TYPES = { "eventType1", "eventType2", "eventType3", "eventType4" };
final String[] EXTERNAL_USER_IDS = { "10", "11", "12", "13", "14", "15", "16", "17", "18" };
final String[] DATES = { "20130101", "20130102", "20130103", "20130104", "20130105" };
final AtomicInteger counter = new AtomicInteger(0);
final Random random = new Random();
final CountDownLatch latch = new CountDownLatch(NUM_THREADS);
Thread[] threads = new Thread[NUM_THREADS];
for (int i = 0; i < NUM_THREADS; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
latch.countDown();
try {
latch.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
for (int j = 0; j < NUM_EVENTS / NUM_THREADS; j++) {
int eventTypeIndex = random.nextInt(EVENT_TYPES.length);
int userIdIndex = random.nextInt(EXTERNAL_USER_IDS.length);
int dateIndex = counter.getAndIncrement() * DATES.length / NUM_EVENTS;
addEvent(eventHub, EVENT_TYPES[eventTypeIndex], EXTERNAL_USER_IDS[userIdIndex], DATES[dateIndex], Maps.<String, String>newHashMap());
}
}
});
threads[i] = thread;
thread.start();
}
for (int i = 0; i < NUM_THREADS; i++) {
threads[i].join();
}
for (int eventId = 0; eventId < NUM_EVENTS; eventId++) {
Event event = eventStorage.getEvent(eventId);
Assert.assertEquals(shardedEventIndex.getEventTypeId(event.getEventType()), eventStorage.getEventTypeId(eventId));
Assert.assertEquals(userStorage.getId(event.getExternalUserId()), eventStorage.getUserId(eventId));
}
Set<String> externalUserIds = Sets.newHashSet();
for (int i = 0; i < EXTERNAL_USER_IDS.length; i++) {
externalUserIds.add(userStorage.getUser(i).getExternalId());
}
Assert.assertEquals(Sets.newHashSet(EXTERNAL_USER_IDS), externalUserIds);
try {
userStorage.getUser(EXTERNAL_USER_IDS.length);
Assert.fail("Should fail when fetching an user with inexistent id.");
} catch (RuntimeException e) {
}
for (int eventTypeId = 0; eventTypeId < EVENT_TYPES.length; eventTypeId++) {
final int EVENT_TYPE_ID = eventTypeId;
// didn't bother check the callback is actually called
shardedEventIndex.enumerateEventIds(EVENT_TYPES[eventTypeId], DATES[0], "21991231", new EventIndex.Callback() {
@Override
public void onEventId(long eventId) {
Assert.assertEquals(EVENT_TYPES[EVENT_TYPE_ID], eventStorage.getEvent(eventId).getEventType());
}
});
}
for (int userId = 0; userId < EXTERNAL_USER_IDS.length; userId++) {
final int USER_ID = userId;
userEventIndex.enumerateEventIds(userId, 0, NUM_EVENTS, new UserEventIndex.Callback() {
@Override
public boolean shouldContinueOnEventId(long eventId) {
Assert.assertEquals(USER_ID, userStorage.getId(eventStorage.getEvent(eventId).getExternalUserId()));
return true;
}
});
}
}
use of com.codecademy.eventhub.model.Event in project EventHub by Codecademy.
the class BatchTrackEvent method execute.
@Override
public synchronized void execute(final HttpServletRequest request, final HttpServletResponse response) throws IOException {
List<Map<String, String>> events = gson.fromJson(request.getParameter("events"), new TypeToken<List<Map<String, String>>>() {
}.getType());
List<Long> eventIds = Lists.newArrayList();
PrintWriter writer = response.getWriter();
for (Map<String, String> eventMap : events) {
String date = eventMap.get("date");
if (date == null) {
date = dateHelper.getDate();
}
Event event = new Event.Builder(eventMap.get("event_type"), eventMap.get("external_user_id"), date, eventMap).build();
eventIds.add(eventHub.addEvent(event));
}
writer.println(gson.toJson(eventIds));
}
use of com.codecademy.eventhub.model.Event in project EventHub by Codecademy.
the class ViewEvent method execute.
@Override
public synchronized void execute(final HttpServletRequest request, final HttpServletResponse response) throws IOException {
Event event = eventHub.getEvent(Long.parseLong(request.getParameter("event_id")));
response.getWriter().println(gson.toJson(event));
}
Aggregations