package streamcruncher.test.func.generic;
import java.sql.Timestamp;
import java.util.LinkedHashMap;
import java.util.List;
import org.testng.Assert;
import streamcruncher.api.artifact.RowSpec;
import streamcruncher.api.artifact.RowSpec.Info;
import streamcruncher.test.func.BatchResult;
import streamcruncher.test.func.MultiStreamEventGenerator;
/*
* Author: Ashwin Jayaprakash Date: Mar 14, 2007 Time: 8:10:02 PM
*/
/**
* <p>
* This test uses only one Stream. The other Streams are dormant.
* </p>
*/
public abstract class OutOfOrderEventTest extends MultiStreamEventGenerator {
protected static final int windowSeconds = 5;
/**
* Timestamp column will be filled later.
*/
protected final Event[] eventSequence = new Event[] {
new Event(EventType.stg1_event, new Object[] { "YHOO", 28.0,
new Timestamp(System.currentTimeMillis()), 1L }, 3),
new Event(EventType.stg1_event, new Object[] { "GOOG", 27.0,
new Timestamp(System.currentTimeMillis()), 2L }, 3),
new Event(EventType.stg1_event, new Object[] { "GOOG", 25.0,
new Timestamp(System.currentTimeMillis()), 3L }, 3),
new Event(EventType.stg1_event, new Object[] { "YHOO", 30.0,
new Timestamp(System.currentTimeMillis()), 4L }, 3),
new Event(EventType.stg1_event, new Object[] { "YHOO", 26.0,
new Timestamp(System.currentTimeMillis()), 7L }, 3),
new Event(EventType.pause, new Object[] { 5500L }, -1),
new Event(EventType.stg1_event, new Object[] { "GOOG", 26.0,
new Timestamp(System.currentTimeMillis() + 5500), 8L }, 3),
// ---Out of order events.
new Event(EventType.stg1_event, new Object[] { "GOOG", 30.5,
new Timestamp(System.currentTimeMillis() + 1000), 5L }, 3),
new Event(EventType.stg1_event, new Object[] { "YHOO", 29.75,
new Timestamp(System.currentTimeMillis() + 1000), 6L }, 3),
// ---
new Event(EventType.stg1_event, new Object[] { "GOOG", 27.0,
new Timestamp(System.currentTimeMillis() + 5500), 9L }, 3),
new Event(EventType.stg1_event, new Object[] { "YHOO", 25.5,
new Timestamp(System.currentTimeMillis() + 5500), 10L }, 3),
new Event(EventType.pause, new Object[] { 1500L }, -1),
new Event(EventType.stg1_event, new Object[] { "YHOO", 22.0,
new Timestamp(System.currentTimeMillis() + 6500), 11L }, 3),
new Event(EventType.stg1_event, new Object[] { "GOOG", 22.5,
new Timestamp(System.currentTimeMillis() + 6500), 12L }, 3),
new Event(EventType.stg1_event, new Object[] { "YHOO", 24.5,
new Timestamp(System.currentTimeMillis() + 6500), 13L }, 3),
new Event(EventType.pause, new Object[] { 3500L }, -1),
new Event(EventType.stg1_event, new Object[] { "YHOO", 26.5,
new Timestamp(System.currentTimeMillis() + 9500), 14L }, 3) };
protected String getCurrentTimestampKeyword() {
return "current_timestamp";
}
@Override
protected String[] getResultColumnTypes() {
return new String[] { RowSpec.addInfo(java.lang.String.class.getName(), Info.SIZE, 15),
java.lang.Double.class.getName(), java.sql.Timestamp.class.getName(),
java.lang.Long.class.getName(), java.sql.Timestamp.class.getName() };
}
@Override
protected String[] getStage1ColumnTypes() {
return new String[] { RowSpec.addInfo(java.lang.String.class.getName(), Info.SIZE, 15),
java.lang.Double.class.getName(), java.sql.Timestamp.class.getName(),
java.lang.Long.class.getName() };
}
@Override
protected String[] getStage2ColumnTypes() {
return new String[] { RowSpec.addInfo(java.lang.String.class.getName(), Info.SIZE, 15),
java.lang.Double.class.getName(), java.sql.Timestamp.class.getName(),
java.lang.Long.class.getName() };
}
@Override
protected String[] getStage3ColumnTypes() {
return new String[] { RowSpec.addInfo(java.lang.String.class.getName(), Info.SIZE, 15),
java.lang.Double.class.getName(), java.sql.Timestamp.class.getName(),
java.lang.Long.class.getName() };
}
@Override
protected String[] getResultColumnNames() {
return new String[] { "levela", "levelb", "event_time", "event_id",
getCurrentTimestampKeyword() };
}
@Override
protected String getRQL() {
return "select levela, levelb, event_time, event_id, " + getCurrentTimestampKeyword()
+ " from stg1_event (partition store last " + windowSeconds + " seconds max "
+ windowSeconds + ") as quotes"
+ " where quotes.$row_status is not dead order by event_id;";
}
@Override
protected Event[] createEventArray() {
return eventSequence;
}
@Override
protected void verify(List<BatchResult> results) {
long[] idOrder = { 1, 2, 3, 4, 7, 5, 6, 8, 9, 10, 11, 12, 13, 14 };
LinkedHashMap<Long, Long> ids = new LinkedHashMap<Long, Long>();
System.out.println("--Results--");
for (BatchResult result : results) {
System.out.println("Batch created at: " + new Timestamp(result.getTimestamp())
+ ". Rows: " + result.getRows().size());
List<Object[]> rows = result.getRows();
System.out.println(" Batch results");
for (Object[] objects : rows) {
System.out.print(" ");
for (Object object : objects) {
System.out.print(object + " ");
}
/*
* "levela", "levelb", "event_time", "event_id", "curr_time".
*/
String levela = (String) objects[0];
Double levelb = (Double) objects[1];
long eventId = (Long) objects[3];
Timestamp inputTime = (Timestamp) objects[2];
Timestamp outputTime = (Timestamp) objects[4];
long diff = outputTime.getTime() - inputTime.getTime();
ids.put(eventId, diff);
System.out.println();
}
}
System.out.println("Received Ids: " + ids);
int time = (windowSeconds * 1000) +
/*
* Extra time, just in case; because the original timestamps were
* hardcoded.
*/
1000;
for (int i = 0; i < idOrder.length; i++) {
Assert.assertTrue(ids.containsKey(idOrder[i]), "Results missing");
Assert.assertFalse(ids.get(idOrder[i]) > time,
"Event was allowed to stay for longer than " + time + " seconds");
}
int i = 0;
for (Long l : ids.keySet()) {
i++;
}
}
}