package com.codecademy.eventhub.index;
import com.google.common.base.Joiner;
import com.google.common.collect.Sets;
import com.codecademy.eventhub.base.DB;
import com.codecademy.eventhub.base.KeyValueCallback;
import com.codecademy.eventhub.model.Event;
import com.codecademy.eventhub.model.User;
import java.io.Closeable;
import java.io.IOException;
import java.util.List;
import java.util.Set;
public class PropertiesIndex implements Closeable {
private static final Set<String> KEYS_IGNORED = Sets.newHashSet("", "date",
"external_user_id", "event_type");
private static final byte[] DUMMY = new byte[0];
private final DB db;
public PropertiesIndex(DB db) {
this.db = db;
}
public void addEvent(final Event event) {
final String eventType = event.getEventType();
db.put(new DB.AtomicWrite() {
@Override
public void write(final DB.WriteBatch writeBatch) {
event.enumerate(new KeyValueCallback() {
@Override
public void callback(String key, String value) {
if (KEYS_IGNORED.contains(key)) {
return;
}
writeBatch.put(getKeyPrefixForEventType(eventType) + key, DUMMY);
writeBatch.put(getKeyPrefixForEventTypeAndKey(eventType, key) + value, DUMMY);
}
});
}
});
}
public void addUser(final User user) {
db.put(new DB.AtomicWrite() {
@Override
public void write(final DB.WriteBatch writeBatch) {
user.enumerate(new KeyValueCallback() {
@Override
public void callback(String key, String value) {
if (KEYS_IGNORED.contains(key)) {
return;
}
writeBatch.put(getKeyPrefixForUser() + key, DUMMY);
writeBatch.put(getKeyPrefixForUserAndKey(key) + value, DUMMY);
}
});
}
});
}
public List<String> getEventKeys(String eventType) {
String keyKey = getKeyPrefixForEventType(eventType);
return db.findByPrefix(keyKey, keyKey.length());
}
public List<String> getEventValues(String eventType, String key, String valuePrefix) {
String valueKey = getKeyPrefixForEventTypeAndKey(eventType, key);
return db.findByPrefix(valueKey + valuePrefix, valueKey.length());
}
public List<String> getUserKeys() {
String prefix = getKeyPrefixForUser();
return db.findByPrefix(prefix, prefix.length());
}
public List<String> getUserValues(String key, String valuePrefix) {
String valueKey = getKeyPrefixForUserAndKey(key);
return db.findByPrefix(valueKey + valuePrefix, valueKey.length());
}
@Override
public void close() throws IOException {
db.close();
}
private String getKeyPrefixForUser() {
return "__USER_KEY@@__KEY";
}
private String getKeyPrefixForUserAndKey(String key) {
return Joiner.on("@@").join("__USER_KEY", key);
}
private String getKeyPrefixForEventType(String eventType) {
return Joiner.on("@@").join(eventType, "__KEY");
}
private String getKeyPrefixForEventTypeAndKey(String eventType, String key) {
return Joiner.on("@@").join(eventType, key);
}
}