package com.ldbc.driver.workloads.ldbc.snb.interactive;
import com.google.common.collect.Lists;
import com.ldbc.driver.Operation;
import com.ldbc.driver.csv.charseeker.CharSeeker;
import com.ldbc.driver.csv.charseeker.Extractors;
import com.ldbc.driver.csv.charseeker.Mark;
import com.ldbc.driver.generator.CsvEventStreamReaderTimedTypedCharSeeker;
import com.ldbc.driver.generator.CsvEventStreamReaderTimedTypedCharSeeker.EventDecoder;
import com.ldbc.driver.generator.GeneratorException;
import java.io.IOException;
import java.util.*;
public class WriteEventStreamReaderCharSeeker {
public static Iterator<Operation> create(CharSeeker charSeeker, Extractors extractors, int columnDelimiter) {
Map<Integer, EventDecoder<Operation>> decoders = new HashMap<>();
decoders.put(1, new EventDecoderAddPerson());
decoders.put(2, new EventDecoderAddLikePost());
decoders.put(3, new EventDecoderAddLikeComment());
decoders.put(4, new EventDecoderAddForum());
decoders.put(5, new EventDecoderAddForumMembership());
decoders.put(6, new EventDecoderAddPost());
decoders.put(7, new EventDecoderAddComment());
decoders.put(8, new EventDecoderAddFriendship());
return new CsvEventStreamReaderTimedTypedCharSeeker<>(charSeeker, extractors, decoders, columnDelimiter);
}
public static class EventDecoderAddPerson implements EventDecoder<Operation> {
@Override
public Operation decodeEvent(long scheduledStartTimeAsMilli, long dependencyTimeAsMilli, CharSeeker charSeeker, Extractors extractors, int[] columnDelimiters, Mark mark) {
try {
long personId;
if (charSeeker.seek(mark, columnDelimiters)) {
personId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving person id");
}
String firstName;
if (charSeeker.seek(mark, columnDelimiters)) {
firstName = charSeeker.extract(mark, extractors.string()).value();
if (null == firstName) firstName = "";
} else {
throw new GeneratorException("Error retrieving first name");
}
String lastName;
if (charSeeker.seek(mark, columnDelimiters)) {
lastName = charSeeker.extract(mark, extractors.string()).value();
if (null == lastName) lastName = "";
} else {
throw new GeneratorException("Error retrieving last name");
}
String gender;
if (charSeeker.seek(mark, columnDelimiters)) {
gender = charSeeker.extract(mark, extractors.string()).value();
if (null == gender) gender = "";
} else {
throw new GeneratorException("Error retrieving gender");
}
Long birthdayAsMilli;
if (charSeeker.seek(mark, columnDelimiters)) {
birthdayAsMilli = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving birthday");
}
Date birthday = new Date(birthdayAsMilli);
long creationDateAsMilli;
if (charSeeker.seek(mark, columnDelimiters)) {
creationDateAsMilli = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving creation date");
}
Date creationDate = new Date(creationDateAsMilli);
String locationIp;
if (charSeeker.seek(mark, columnDelimiters)) {
locationIp = charSeeker.extract(mark, extractors.string()).value();
if (null == locationIp) locationIp = "";
} else {
throw new GeneratorException("Error retrieving location ip");
}
String browserUsed;
if (charSeeker.seek(mark, columnDelimiters)) {
browserUsed = charSeeker.extract(mark, extractors.string()).value();
if (null == browserUsed) browserUsed = "";
} else {
throw new GeneratorException("Error retrieving browser");
}
long cityId;
if (charSeeker.seek(mark, columnDelimiters)) {
cityId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving city id");
}
List<String> languages;
if (charSeeker.seek(mark, columnDelimiters)) {
languages = Lists.newArrayList(charSeeker.extract(mark, extractors.stringArray()).value());
} else {
throw new GeneratorException("Error retrieving languages");
}
List<String> emails;
if (charSeeker.seek(mark, columnDelimiters)) {
emails = Lists.newArrayList(charSeeker.extract(mark, extractors.stringArray()).value());
} else {
throw new GeneratorException("Error retrieving emails");
}
List<Long> tagIds = new ArrayList<>();
if (charSeeker.seek(mark, columnDelimiters)) {
long[] tagIdsArray = charSeeker.extract(mark, extractors.longArray()).value();
for (long tagId : tagIdsArray) {
tagIds.add(tagId);
}
} else {
throw new GeneratorException("Error retrieving tags");
}
List<LdbcUpdate1AddPerson.Organization> studyAts;
if (charSeeker.seek(mark, columnDelimiters)) {
studyAts = new ArrayList<>();
int[][] studyAtsArray = charSeeker.extract(mark, extractors.intTupleArray(2)).value();
for (int i = 0; i < studyAtsArray.length; i++) {
studyAts.add(new LdbcUpdate1AddPerson.Organization(
studyAtsArray[i][0],
studyAtsArray[i][1]
)
);
}
} else {
throw new GeneratorException("Error retrieving universities");
}
List<LdbcUpdate1AddPerson.Organization> workAts;
if (charSeeker.seek(mark, columnDelimiters)) {
workAts = new ArrayList<>();
int[][] workAtsArray = charSeeker.extract(mark, extractors.intTupleArray(2)).value();
for (int i = 0; i < workAtsArray.length; i++) {
workAts.add(new LdbcUpdate1AddPerson.Organization(
workAtsArray[i][0],
workAtsArray[i][1]
)
);
}
} else {
throw new GeneratorException("Error retrieving companies");
}
Operation operation = new LdbcUpdate1AddPerson(
personId,
firstName,
lastName,
gender,
birthday,
creationDate,
locationIp,
browserUsed,
cityId,
languages,
emails,
tagIds,
studyAts,
workAts);
operation.setScheduledStartTimeAsMilli(scheduledStartTimeAsMilli);
operation.setTimeStamp(scheduledStartTimeAsMilli);
operation.setDependencyTimeStamp(dependencyTimeAsMilli);
return operation;
} catch (IOException e) {
throw new GeneratorException("Error parsing add person event", e);
}
}
}
public static class EventDecoderAddLikePost implements EventDecoder<Operation> {
@Override
public Operation decodeEvent(long scheduledStartTimeAsMilli, long dependencyTimeAsMilli, CharSeeker charSeeker, Extractors extractors, int[] columnDelimiters, Mark mark) {
try {
long personId;
if (charSeeker.seek(mark, columnDelimiters)) {
personId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving person id");
}
long postId;
if (charSeeker.seek(mark, columnDelimiters)) {
postId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving post id");
}
Date creationDate;
if (charSeeker.seek(mark, columnDelimiters)) {
long creationDateAsMilli = charSeeker.extract(mark, extractors.long_()).longValue();
creationDate = new Date(creationDateAsMilli);
} else {
throw new GeneratorException("Error retrieving creation date");
}
Operation operation = new LdbcUpdate2AddPostLike(personId, postId, creationDate);
operation.setScheduledStartTimeAsMilli(scheduledStartTimeAsMilli);
operation.setTimeStamp(scheduledStartTimeAsMilli);
operation.setDependencyTimeStamp(dependencyTimeAsMilli);
return operation;
} catch (IOException e) {
throw new GeneratorException("Error parsing add post like event", e);
}
}
}
public static class EventDecoderAddLikeComment implements EventDecoder<Operation> {
@Override
public Operation decodeEvent(long scheduledStartTimeAsMilli, long dependencyTimeAsMilli, CharSeeker charSeeker, Extractors extractors, int[] columnDelimiters, Mark mark) {
try {
long personId;
if (charSeeker.seek(mark, columnDelimiters)) {
personId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving person id");
}
long commentId;
if (charSeeker.seek(mark, columnDelimiters)) {
commentId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving comment id");
}
Date creationDate;
if (charSeeker.seek(mark, columnDelimiters)) {
long creationDateAsMilli = charSeeker.extract(mark, extractors.long_()).longValue();
creationDate = new Date(creationDateAsMilli);
} else {
throw new GeneratorException("Error retrieving creation date");
}
Operation operation = new LdbcUpdate3AddCommentLike(personId, commentId, creationDate);
operation.setScheduledStartTimeAsMilli(scheduledStartTimeAsMilli);
operation.setTimeStamp(scheduledStartTimeAsMilli);
operation.setDependencyTimeStamp(dependencyTimeAsMilli);
return operation;
} catch (IOException e) {
throw new GeneratorException("Error parsing add comment like event", e);
}
}
}
public static class EventDecoderAddForum implements EventDecoder<Operation> {
@Override
public Operation decodeEvent(long scheduledStartTimeAsMilli, long dependencyTimeAsMilli, CharSeeker charSeeker, Extractors extractors, int[] columnDelimiters, Mark mark) {
try {
long forumId;
if (charSeeker.seek(mark, columnDelimiters)) {
forumId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving forum id");
}
String forumTitle;
if (charSeeker.seek(mark, columnDelimiters)) {
forumTitle = charSeeker.extract(mark, extractors.string()).value();
if (null == forumTitle) forumTitle = "";
} else {
throw new GeneratorException("Error retrieving forum title");
}
Date creationDate;
if (charSeeker.seek(mark, columnDelimiters)) {
long creationDateAsMilli = charSeeker.extract(mark, extractors.long_()).longValue();
creationDate = new Date(creationDateAsMilli);
} else {
throw new GeneratorException("Error retrieving creation date");
}
long moderatorPersonId;
if (charSeeker.seek(mark, columnDelimiters)) {
moderatorPersonId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving moderator person id");
}
List<Long> tagIds;
if (charSeeker.seek(mark, columnDelimiters)) {
tagIds = new ArrayList<>();
long[] tagIdsArray = charSeeker.extract(mark, extractors.longArray()).value();
for (long tagId : tagIdsArray) {
tagIds.add(tagId);
}
} else {
throw new GeneratorException("Error retrieving tags");
}
Operation operation = new LdbcUpdate4AddForum(forumId, forumTitle, creationDate, moderatorPersonId, tagIds);
operation.setScheduledStartTimeAsMilli(scheduledStartTimeAsMilli);
operation.setTimeStamp(scheduledStartTimeAsMilli);
operation.setDependencyTimeStamp(dependencyTimeAsMilli);
return operation;
} catch (IOException e) {
throw new GeneratorException("Error parsing add forum event", e);
}
}
}
public static class EventDecoderAddForumMembership implements EventDecoder<Operation> {
@Override
public Operation decodeEvent(long scheduledStartTimeAsMilli, long dependencyTimeAsMilli, CharSeeker charSeeker, Extractors extractors, int[] columnDelimiters, Mark mark) {
try {
long forumId;
if (charSeeker.seek(mark, columnDelimiters)) {
forumId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving forum id");
}
long personId;
if (charSeeker.seek(mark, columnDelimiters)) {
personId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving person id");
}
Date creationDate;
if (charSeeker.seek(mark, columnDelimiters)) {
long creationDateAsMilli = charSeeker.extract(mark, extractors.long_()).longValue();
creationDate = new Date(creationDateAsMilli);
} else {
throw new GeneratorException("Error retrieving creation date");
}
Operation operation = new LdbcUpdate5AddForumMembership(forumId, personId, creationDate);
operation.setScheduledStartTimeAsMilli(scheduledStartTimeAsMilli);
operation.setTimeStamp(scheduledStartTimeAsMilli);
operation.setDependencyTimeStamp(dependencyTimeAsMilli);
return operation;
} catch (IOException e) {
throw new GeneratorException("Error parsing add forum membership event", e);
}
}
}
public static class EventDecoderAddPost implements EventDecoder<Operation> {
@Override
public Operation decodeEvent(long scheduledStartTimeAsMilli, long dependencyTimeAsMilli, CharSeeker charSeeker, Extractors extractors, int[] columnDelimiters, Mark mark) {
try {
long postId;
if (charSeeker.seek(mark, columnDelimiters)) {
postId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving post id");
}
String imageFile;
if (charSeeker.seek(mark, columnDelimiters)) {
imageFile = charSeeker.extract(mark, extractors.string()).value();
if (null == imageFile) imageFile = "";
} else {
throw new GeneratorException("Error retrieving image file");
}
Date creationDate;
if (charSeeker.seek(mark, columnDelimiters)) {
long creationDateAsMilli = charSeeker.extract(mark, extractors.long_()).longValue();
creationDate = new Date(creationDateAsMilli);
} else {
throw new GeneratorException("Error retrieving creation date");
}
String locationIp;
if (charSeeker.seek(mark, columnDelimiters)) {
locationIp = charSeeker.extract(mark, extractors.string()).value();
if (null == locationIp) locationIp = "";
} else {
throw new GeneratorException("Error retrieving location ip");
}
String browserUsed;
if (charSeeker.seek(mark, columnDelimiters)) {
browserUsed = charSeeker.extract(mark, extractors.string()).value();
if (null == browserUsed) browserUsed = "";
} else {
throw new GeneratorException("Error retrieving browser");
}
String language;
if (charSeeker.seek(mark, columnDelimiters)) {
language = charSeeker.extract(mark, extractors.string()).value();
if (null == language) language = "";
} else {
throw new GeneratorException("Error retrieving language");
}
String content;
if (charSeeker.seek(mark, columnDelimiters)) {
content = charSeeker.extract(mark, extractors.string()).value();
if (null == content) content = "";
} else {
throw new GeneratorException("Error retrieving content");
}
int length;
if (charSeeker.seek(mark, columnDelimiters)) {
length = charSeeker.extract(mark, extractors.int_()).intValue();
} else {
throw new GeneratorException("Error retrieving length");
}
long authorPersonId;
if (charSeeker.seek(mark, columnDelimiters)) {
authorPersonId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving author person id");
}
long forumId;
if (charSeeker.seek(mark, columnDelimiters)) {
forumId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving forum id");
}
long countryId;
if (charSeeker.seek(mark, columnDelimiters)) {
countryId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving country id");
}
List<Long> tagIds;
if (charSeeker.seek(mark, columnDelimiters)) {
tagIds = new ArrayList<>();
long[] tagIdsArray = charSeeker.extract(mark, extractors.longArray()).value();
for (long tagId : tagIdsArray) {
tagIds.add(tagId);
}
} else {
throw new GeneratorException("Error retrieving tags");
}
Operation operation = new LdbcUpdate6AddPost(
postId,
imageFile,
creationDate,
locationIp,
browserUsed,
language,
content,
length,
authorPersonId,
forumId,
countryId,
tagIds);
operation.setScheduledStartTimeAsMilli(scheduledStartTimeAsMilli);
operation.setTimeStamp(scheduledStartTimeAsMilli);
operation.setDependencyTimeStamp(dependencyTimeAsMilli);
return operation;
} catch (IOException e) {
throw new GeneratorException("Error parsing add post event", e);
}
}
}
public static class EventDecoderAddComment implements EventDecoder<Operation> {
@Override
public Operation decodeEvent(long scheduledStartTimeAsMilli, long dependencyTimeAsMilli, CharSeeker charSeeker, Extractors extractors, int[] columnDelimiters, Mark mark) {
try {
long commentId;
if (charSeeker.seek(mark, columnDelimiters)) {
commentId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving comment id");
}
Date creationDate;
if (charSeeker.seek(mark, columnDelimiters)) {
long creationDateAsMilli = charSeeker.extract(mark, extractors.long_()).longValue();
creationDate = new Date(creationDateAsMilli);
} else {
throw new GeneratorException("Error retrieving creation date");
}
String locationIp;
if (charSeeker.seek(mark, columnDelimiters)) {
locationIp = charSeeker.extract(mark, extractors.string()).value();
if (null == locationIp) locationIp = "";
} else {
throw new GeneratorException("Error retrieving location ip");
}
String browserUsed;
if (charSeeker.seek(mark, columnDelimiters)) {
browserUsed = charSeeker.extract(mark, extractors.string()).value();
if (null == browserUsed) browserUsed = "";
} else {
throw new GeneratorException("Error retrieving browser");
}
String content;
if (charSeeker.seek(mark, columnDelimiters)) {
content = charSeeker.extract(mark, extractors.string()).value();
if (null == content) content = "";
} else {
throw new GeneratorException("Error retrieving content");
}
int length;
if (charSeeker.seek(mark, columnDelimiters)) {
length = charSeeker.extract(mark, extractors.int_()).intValue();
} else {
throw new GeneratorException("Error retrieving length");
}
long authorPersonId;
if (charSeeker.seek(mark, columnDelimiters)) {
authorPersonId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving author person id");
}
long countryId;
if (charSeeker.seek(mark, columnDelimiters)) {
countryId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving country id");
}
long replyOfPostId;
if (charSeeker.seek(mark, columnDelimiters)) {
replyOfPostId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving reply of post id");
}
long replyOfCommentId;
if (charSeeker.seek(mark, columnDelimiters)) {
replyOfCommentId = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving reply of comment id");
}
List<Long> tagIds;
if (charSeeker.seek(mark, columnDelimiters)) {
tagIds = new ArrayList<>();
long[] tagIdsArray = charSeeker.extract(mark, extractors.longArray()).value();
for (long tagId : tagIdsArray) {
tagIds.add(tagId);
}
} else {
throw new GeneratorException("Error retrieving tags");
}
Operation operation = new LdbcUpdate7AddComment(
commentId,
creationDate,
locationIp,
browserUsed,
content,
length,
authorPersonId,
countryId,
replyOfPostId,
replyOfCommentId,
tagIds);
operation.setScheduledStartTimeAsMilli(scheduledStartTimeAsMilli);
operation.setTimeStamp(scheduledStartTimeAsMilli);
operation.setDependencyTimeStamp(dependencyTimeAsMilli);
return operation;
} catch (IOException e) {
throw new GeneratorException("Error parsing add comment event", e);
}
}
}
public static class EventDecoderAddFriendship implements EventDecoder<Operation> {
@Override
public Operation decodeEvent(long scheduledStartTimeAsMilli, long dependencyTimeAsMilli, CharSeeker charSeeker, Extractors extractors, int[] columnDelimiters, Mark mark) {
try {
long person1Id;
if (charSeeker.seek(mark, columnDelimiters)) {
person1Id = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving person id 1");
}
long person2Id;
if (charSeeker.seek(mark, columnDelimiters)) {
person2Id = charSeeker.extract(mark, extractors.long_()).longValue();
} else {
throw new GeneratorException("Error retrieving person id 2");
}
Date creationDate;
if (charSeeker.seek(mark, columnDelimiters)) {
long creationDateAsMilli = charSeeker.extract(mark, extractors.long_()).longValue();
creationDate = new Date(creationDateAsMilli);
} else {
throw new GeneratorException("Error retrieving creation date");
}
Operation operation = new LdbcUpdate8AddFriendship(person1Id, person2Id, creationDate);
operation.setScheduledStartTimeAsMilli(scheduledStartTimeAsMilli);
operation.setTimeStamp(scheduledStartTimeAsMilli);
operation.setDependencyTimeStamp(dependencyTimeAsMilli);
return operation;
} catch (IOException e) {
throw new GeneratorException("Error parsing add friendship event", e);
}
}
}
}