/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package ldbc.snb.datagen.generator; import ldbc.snb.datagen.dictionary.Dictionaries; import ldbc.snb.datagen.objects.*; import ldbc.snb.datagen.serializer.PersonActivityExporter; import ldbc.snb.datagen.util.RandomGeneratorFarm; import ldbc.snb.datagen.vocabulary.SN; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.Properties; import java.util.TreeSet; /** * * @author aprat */ public class CommentGenerator { private String[] shortComments_ = {"ok", "good", "great", "cool", "thx", "fine", "LOL", "roflol", "no way!", "I see", "right", "yes", "no", "duh", "thanks", "maybe"}; private TextGenerator generator; private LikeGenerator likeGenerator_; private Comment comment_; /* A set of random number generator for different purposes.*/ public CommentGenerator(TextGenerator generator, LikeGenerator likeGenerator){ this.generator = generator; this.likeGenerator_ = likeGenerator; this.comment_ = new Comment(); } public long createComments(RandomGeneratorFarm randomFarm, final Forum forum, final Post post, long numComments, long startId, PersonActivityExporter exporter) throws IOException { long nextId = startId; ArrayList<Message> replyCandidates = new ArrayList<Message>(); replyCandidates.add(post); Properties prop = new Properties(); prop.setProperty("type","comment"); for( int i = 0; i < numComments; ++i ) { int replyIndex = randomFarm.get(RandomGeneratorFarm.Aspect.REPLY_TO).nextInt(replyCandidates.size()); Message replyTo = replyCandidates.get(replyIndex); ArrayList<ForumMembership> validMemberships = new ArrayList<ForumMembership>(); for( ForumMembership fM : forum.memberships()) { if (fM.creationDate()+DatagenParams.deltaTime <= replyTo.creationDate()){ validMemberships.add(fM); } } if (validMemberships.size() == 0) { return nextId; } ForumMembership member = validMemberships.get(randomFarm.get(RandomGeneratorFarm.Aspect.MEMBERSHIP_INDEX).nextInt(validMemberships.size())); TreeSet<Integer> tags = new TreeSet<Integer>(); String content = ""; boolean isShort = false; if( randomFarm.get(RandomGeneratorFarm.Aspect.REDUCED_TEXT).nextDouble() > 0.6666) { ArrayList<Integer> currentTags = new ArrayList<Integer>(); Iterator<Integer> it = replyTo.tags().iterator(); while(it.hasNext()) { Integer tag = it.next(); if( randomFarm.get(RandomGeneratorFarm.Aspect.TAG).nextDouble() > 0.5) { tags.add(tag); } currentTags.add(tag); } for( int j = 0; j < (int)Math.ceil(replyTo.tags().size() / 2.0); ++j) { int randomTag = currentTags.get(randomFarm.get(RandomGeneratorFarm.Aspect.TAG).nextInt(currentTags.size())); tags.add(Dictionaries.tagMatrix.getRandomRelated(randomFarm.get(RandomGeneratorFarm.Aspect.TOPIC), randomTag)); } content = this.generator.generateText(member.person(), tags,prop); } else { isShort = true; int index = randomFarm.get(RandomGeneratorFarm.Aspect.TEXT_SIZE).nextInt(shortComments_.length); content = shortComments_[index]; } long creationDate = Dictionaries.dates.powerlawCommDateDay(randomFarm.get(RandomGeneratorFarm.Aspect.DATE),replyTo.creationDate()+DatagenParams.deltaTime); /*if( creationDate <= Dictionaries.dates.getEndDateTime() )*/ { Comment comment = new Comment(SN.formId(SN.composeId(nextId++,creationDate)), creationDate, member.person(), forum.id(), content, tags, Dictionaries.ips.getIP(randomFarm.get(RandomGeneratorFarm.Aspect.IP), randomFarm.get(RandomGeneratorFarm.Aspect.DIFF_IP), randomFarm.get(RandomGeneratorFarm.Aspect.DIFF_IP_FOR_TRAVELER), member.person().ipAddress(), creationDate), Dictionaries.browsers.getPostBrowserId(randomFarm.get(RandomGeneratorFarm.Aspect.DIFF_BROWSER), randomFarm.get(RandomGeneratorFarm.Aspect.BROWSER), member.person().browserId()), post.messageId(), replyTo.messageId()); if(!isShort) replyCandidates.add(new Comment(comment)); exporter.export(comment); if( comment.content().length() > 10 && randomFarm.get(RandomGeneratorFarm.Aspect.NUM_LIKE).nextDouble() <= 0.1 ) { likeGenerator_.generateLikes(randomFarm.get(RandomGeneratorFarm.Aspect.NUM_LIKE), forum, comment, Like.LikeType.COMMENT, exporter); } } } replyCandidates.clear(); return nextId; } }