/**
* Copyright (C) 2010 Peter Karich <jetwick_@_pannous_._info>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.jetwick.data;
import de.jetwick.util.Helper;
import java.io.Serializable;
import java.util.Date;
/**
*
* @author Peter Karich, peat_hal 'at' users 'dot' sourceforge 'dot' net
*/
public class JTag implements ElasticObject<JTag>, Serializable, Comparable<JTag> {
private static final long serialVersionUID = 1L;
public static final String TERM = "term";
public static final long DEFAULT_Q_I = 5 * 1000L;
private String term;
/** Save the maximum creation date of the tweet list for the last twitter search */
private long maxCreateTime = 0L;
/**
* Save when the last twitter search was performed. Then TweetCollector prefer
* tags with a higher frequency even after interrupted
*/
private long lastMillis = 0L;
/** How long to wait until the TweetCollector should perform the new twitter search
*/
private long queryInterval = DEFAULT_Q_I;
private int pages = 1;
private Date lastRequest = new Date();
private int requestCount = 0;
private double tweetsPerSec = 1;
private String user;
public JTag() {
}
public JTag(String term) {
setTerm(term);
}
public JTag(String term, String user) {
setTerm(term);
setUser(user);
}
public JTag clearProperties() {
setPages(5).setMaxCreateTime(0L).setLastMillis(0).
setQueryInterval(1000).setTweetsPerSec(1);
return this;
}
public double getTweetsPerSec() {
return tweetsPerSec;
}
public JTag setTweetsPerSec(double tweetsPerSec) {
this.tweetsPerSec = tweetsPerSec;
return this;
}
public void setTerm(String term) {
this.term = toLowerCaseOnlyOnTerms(term);
}
public void setUser(String user) {
this.user = toLowerCaseOnlyOnTerms(user);
}
public String getUser() {
return user;
}
public int getRequestCount() {
return requestCount;
}
public void setRequestCount(int requestCount) {
this.requestCount = requestCount;
}
public Date getLastRequest() {
if (lastRequest == null)
return new Date();
return lastRequest;
}
public JTag setLastRequest(Date lastRequest) {
this.lastRequest = lastRequest;
return this;
}
public long getLastMillis() {
return lastMillis;
}
public JTag setLastMillis(long lastMillis) {
this.lastMillis = lastMillis;
return this;
}
public long getMaxCreateTime() {
return maxCreateTime;
}
public JTag setMaxCreateTime(long maxCreateTime) {
this.maxCreateTime = maxCreateTime;
return this;
}
public long getQueryInterval() {
return queryInterval;
}
public String getTerm() {
return term;
}
public JTag setQueryInterval(long queryInterval) {
this.queryInterval = queryInterval;
return this;
}
public float getWaitingSeconds() {
return (queryInterval - (System.currentTimeMillis() - lastMillis)) / 1000.0f;
}
public boolean nextQuery() {
if ((System.currentTimeMillis() - lastMillis) > queryInterval) {
lastMillis = System.currentTimeMillis();
return true;
} else
return false;
}
public void optimizeQueryFrequency(int newTweets) {
// try to get 100 tweets per search
if (newTweets == 0)
queryInterval *= 20;
else
queryInterval = (long) (20.0 / newTweets) * queryInterval;
// force at least 10 second
queryInterval = Math.max(queryInterval, 10 * 1001);
// force max 60 min
queryInterval = Math.min(queryInterval, 60 * 60 * 1001);
}
public int getPages() {
return pages;
}
public JTag setPages(int p) {
pages = p;
return this;
}
@Override
public String toString() {
String str = term + " ";
if (!Helper.isEmpty(user))
str += user + " ";
return str + (float) getTweetsPerSec();
}
@Override
public String getId() {
if (Helper.isEmpty(user))
return term;
return term + "_" + user;
}
@Override
public JTag setVersion(long v) {
// this.version = v;
return this;
}
@Override
public long getVersion() {
return 0;
}
/**
* toLowerCase only on none keywords
*/
public static String toLowerCaseOnlyOnTerms(String str) {
if (Helper.isEmpty(str))
return str;
StringBuilder sb = new StringBuilder();
int counter = 0;
for (String t : str.split(" ")) {
if (counter > 0)
sb.append(" ");
if (t.equals("OR") || t.equals("AND"))
sb.append(t);
else
sb.append(t.toLowerCase());
counter++;
}
return sb.toString();
}
@Override
public int compareTo(JTag o) {
float tmp1 = o.getWaitingSeconds();
float tmp2 = getWaitingSeconds();
if (tmp1 > tmp2)
return -1;
else if (tmp1 < tmp2)
return 1;
else
return 0;
}
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final JTag other = (JTag) obj;
if ((this.term == null) ? (other.term != null) : !this.term.equals(other.term))
return false;
if ((this.user == null) ? (other.user != null) : !this.user.equals(other.user))
return false;
return true;
}
@Override
public int hashCode() {
int hash = 7;
hash = 97 * hash + (this.term != null ? this.term.hashCode() : 0);
hash = 97 * hash + (this.user != null ? this.user.hashCode() : 0);
return hash;
}
@Override
public JTag updateFrom(JTag other) {
if (other.getLastRequest().getTime() > getLastRequest().getTime())
setLastRequest(other.getLastRequest());
if (other.getRequestCount() > getRequestCount()) {
setRequestCount(other.getRequestCount());
setLastRequest(other.getLastRequest());
}
tweetsPerSec = other.tweetsPerSec;
lastMillis = other.lastMillis;
queryInterval = other.queryInterval;
maxCreateTime = other.maxCreateTime;
return this;
}
}