Search in sources :

Example 1 with Event

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", ""));
}
Also used : Event(com.codecademy.eventhub.model.Event) Test(org.junit.Test)

Example 2 with Event

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));
}
Also used : Event(com.codecademy.eventhub.model.Event)

Example 3 with 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;
            }
        });
    }
}
Also used : PropertiesIndex(com.codecademy.eventhub.index.PropertiesIndex) JournalUserStorage(com.codecademy.eventhub.storage.JournalUserStorage) UserStorage(com.codecademy.eventhub.storage.UserStorage) ShardedEventIndex(com.codecademy.eventhub.index.ShardedEventIndex) UserEventIndex(com.codecademy.eventhub.index.UserEventIndex) Random(java.util.Random) Injector(com.google.inject.Injector) CountDownLatch(java.util.concurrent.CountDownLatch) DatedEventIndex(com.codecademy.eventhub.index.DatedEventIndex) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Event(com.codecademy.eventhub.model.Event) ShardedEventIndex(com.codecademy.eventhub.index.ShardedEventIndex) UserEventIndex(com.codecademy.eventhub.index.UserEventIndex) EventIndex(com.codecademy.eventhub.index.EventIndex) DatedEventIndex(com.codecademy.eventhub.index.DatedEventIndex) EventStorage(com.codecademy.eventhub.storage.EventStorage) JournalEventStorage(com.codecademy.eventhub.storage.JournalEventStorage) Test(org.junit.Test)

Example 4 with Event

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));
}
Also used : TypeToken(com.google.common.reflect.TypeToken) Event(com.codecademy.eventhub.model.Event) Map(java.util.Map) PrintWriter(java.io.PrintWriter)

Example 5 with Event

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));
}
Also used : Event(com.codecademy.eventhub.model.Event)

Aggregations

Event (com.codecademy.eventhub.model.Event)5 Test (org.junit.Test)2 DatedEventIndex (com.codecademy.eventhub.index.DatedEventIndex)1 EventIndex (com.codecademy.eventhub.index.EventIndex)1 PropertiesIndex (com.codecademy.eventhub.index.PropertiesIndex)1 ShardedEventIndex (com.codecademy.eventhub.index.ShardedEventIndex)1 UserEventIndex (com.codecademy.eventhub.index.UserEventIndex)1 EventStorage (com.codecademy.eventhub.storage.EventStorage)1 JournalEventStorage (com.codecademy.eventhub.storage.JournalEventStorage)1 JournalUserStorage (com.codecademy.eventhub.storage.JournalUserStorage)1 UserStorage (com.codecademy.eventhub.storage.UserStorage)1 TypeToken (com.google.common.reflect.TypeToken)1 Injector (com.google.inject.Injector)1 PrintWriter (java.io.PrintWriter)1 Map (java.util.Map)1 Random (java.util.Random)1 CountDownLatch (java.util.concurrent.CountDownLatch)1 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)1