package esl.cuenet.algorithms.firstk.personal.accessor;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.mongodb.BasicDBObject;
import esl.cuenet.algorithms.firstk.personal.EventContextNetwork;
import esl.cuenet.algorithms.firstk.personal.Location;
import esl.cuenet.algorithms.firstk.personal.Time;
import esl.cuenet.query.drivers.mongodb.MongoDB;
import org.apache.log4j.Logger;
import java.io.FileWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class Twitter implements Source {
private Candidates candidateSet = Candidates.getInstance();
private Logger logger = Logger.getLogger(Twitter.class);
private Multimap<String, TweetObject> hashtagIndex = HashMultimap.create();
protected Twitter() {
(new TwitterLoader()).load();
}
private static Twitter instance = new Twitter();
public static Twitter getInstance() {
return instance;
}
public void lookupHashtag(String query) {
for (TweetObject tw: hashtagIndex.get(query.toLowerCase()))
logger.info(candidateSet.get(tw.source).toStringKey(Candidates.NAME_KEY));
}
@Override
public List<EventContextNetwork> eventsContaining(Candidates.CandidateReference person, Time interval, Location location) {
return null;
}
@Override
public List<EventContextNetwork> participants(EventContextNetwork.Event event) {
return null;
}
@Override
public List<EventContextNetwork> subevents(EventContextNetwork.Event event) {
if ( !event.getInformation().containsField("hashtag") )
return null;
String hashtag = event.getInformation().getString("hashtag");
List<EventContextNetwork> networks = Lists.newArrayList();
return networks;
}
@Override
public List<Candidates.CandidateReference> knows(Candidates.CandidateReference person) {
return null;
}
@Override
public List<EventContextNetwork> knowsAtTime(Candidates.CandidateReference person, Time time) {
return null;
}
@Override
public void writeInstances(FileWriter instanceFile) {
}
private class TweetObject {
Time time;
Location location;
Candidates.CandidateReference source;
BasicDBObject information = new BasicDBObject();
}
public class TwitterLoader extends MongoDB {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss");
public TwitterLoader() {
// super(PConstants.DBNAME);
super("jain");
}
public List<TweetObject> load() {
MongoDB.DBReader reader = startReader("tweets");
reader.getAll(new BasicDBObject());
List<TweetObject> tweets = Lists.newArrayList();
while (reader.hasNext()) {
BasicDBObject object = (BasicDBObject) reader.next();
String text = object.getString("text");
BasicDBObject user = (BasicDBObject) object.get("user");
if (user == null) continue;
String name = user.getString("name");
if (name == null) continue;
String _time = object.getString("created_at");
if (_time == null) continue;
TweetObject tweet = new TweetObject();
tweet.time = Time.createFromMoment(getTime(_time));
tweet.source = candidateSet.createEntity(Lists.newArrayList(Candidates.NAME_KEY),
Lists.newArrayList(name));
for (String t: text.split("\\s+"))
if (t.toLowerCase().charAt(0) == '#') hashtagIndex.put(t.toLowerCase(), tweet);
tweet.information = object;
tweets.add(tweet);
}
return tweets;
}
private long getTime(String time) {
try {
Date d = format.parse(time);
return d.getTime();
} catch (ParseException e) {
e.printStackTrace();
}
return -1;
}
}
}