package storm.applications.util.window;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* Author: Thilina
* Date: 11/22/14
*/
public class SlidingWindow {
private ArrayDeque<SlidingWindowEntry> window = new ArrayDeque<SlidingWindowEntry>();
private long tsStart;
private long tsEnd;
private long length;
public SlidingWindow(long length) {
this.length = length;
}
public void add(SlidingWindowEntry entry, SlidingWindowCallback callback) {
//System.out.println("Adding " + entry.getTime());
// very first entry in the window
if (tsStart == 0l) {
tsStart = entry.getTime();
}
// add the entry
window.addLast(entry);
// sliding window should be moved.
if (entry.getTime() > tsEnd) {
// update the timestamp end timestamp
tsEnd = entry.getTime();
// now we need to remove the entries which are expired
long newTsStart = tsEnd - length + 1;
ArrayList<SlidingWindowEntry> removed = new ArrayList<SlidingWindowEntry>();
while (tsStart < newTsStart) {
if (window.element().getTime() < newTsStart) {
removed.add(window.removeFirst());
tsStart = window.element().getTime();
}
}
callback.remove(removed);
}
/*System.out.println("start:" + window.element().getTime() + " end:" + window.getLast().getTime());
System.out.print("{");
for (SlidingWindowEntry e : window) {
System.out.print(e.getTime() + ", ");
}
System.out.print("}\n"); */
}
public static void main(String[] args) {
class SlidingWindowEntryImpl implements SlidingWindowEntry {
private long time;
SlidingWindowEntryImpl(long time) {
this.time = time;
}
@Override
public long getTime() {
return time;
}
}
SlidingWindow window = new SlidingWindow(5);
int start = 1000;
Random rnd = new Random(12345);
for (int i = 0; i < 100; i++) {
window.add(new SlidingWindowEntryImpl(start), new SlidingWindowCallback() {
@Override
public void remove(List<SlidingWindowEntry> entries) {
for (SlidingWindowEntry e : entries) {
//System.out.println("Removed " + e.getTime());
}
}
});
start = start + rnd.nextInt(5);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
}
}
}