package streamcruncher.test.func.generic;
import java.sql.Timestamp;
import java.util.HashSet;
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
*/
/**
* Test complex expression evaluation in Correlations.
*/
public abstract class CorrelationExpressionsTest extends MultiStreamEventGenerator {
@Override
protected Event[] createEventArray() {
/**
* Timestamp column will be filled later.
*/
return new Event[] {
new Event(EventType.stg1_event, new Object[] { "TX", "Austin", null, 100L }, 3),
new Event(EventType.stg1_event, new Object[] { "TX", "Austin", null, 200L }, 3),
new Event(EventType.stg1_event, new Object[] { "TX", "Austin", null, 300L }, 3),
new Event(EventType.stg1_event, new Object[] { "TX", "Austin", null, 400L }, 3),
new Event(EventType.pause, new Object[] { 2500L }, -1),
new Event(EventType.stg2_event, new Object[] { "TX", "Austin", null, 100L }, 3),
new Event(EventType.stg2_event, new Object[] { "TX", "Austin", null, 200L }, 3),
new Event(EventType.stg2_event, new Object[] { "TX", "Austin", null, 300L }, 3),
new Event(EventType.stg2_event, new Object[] { "TX", "Austin", null, 400L }, 3),
new Event(EventType.pause, new Object[] { 250L }, -1),
new Event(EventType.stg3_event, new Object[] { "TX", "Austin", null, 100L }, 3),
new Event(EventType.stg3_event, new Object[] { "TX", "Austin", null, 400L }, 3),
new Event(EventType.pause, new Object[] { 4000L }, -1),
new Event(EventType.stg3_event, new Object[] { "TX", "Dallas", null, 500L }, 3),
new Event(EventType.stg3_event, new Object[] { "TX", "Austin", null, 600L }, 3),
new Event(EventType.stg3_event, new Object[] { "TX", "Austin", null, 700L }, 3),
new Event(EventType.stg3_event, new Object[] { "TX", "Austin", null, 800L }, 3),
new Event(EventType.stg3_event, new Object[] { "TX", "Austin", null, 900L }, 3),
new Event(EventType.stg3_event, new Object[] { "TX", "Austin", null, 1000L }, 3),
new Event(EventType.pause, new Object[] { 2500L }, -1),
new Event(EventType.stg2_event, new Object[] { "TX", "Dallas", null, 500L }, 3),
new Event(EventType.stg2_event, new Object[] { "TX", "Austin", null, 600L }, 3),
new Event(EventType.stg2_event, new Object[] { "TX", "Austin", null, 900L }, 3),
new Event(EventType.pause, new Object[] { 250L }, -1),
new Event(EventType.stg1_event, new Object[] { "TX", "Dallas", null, 500L }, 3),
new Event(EventType.stg1_event, new Object[] { "TX", "Austin", null, 600L }, 3),
new Event(EventType.stg1_event, new Object[] { "TX", "Austin", null, 700L }, 3),
new Event(EventType.stg1_event, new Object[] { "TX", "Austin", null, 800L }, 3),
new Event(EventType.stg1_event, new Object[] { "TX", "Austin", null, 1000L }, 3),
new Event(EventType.pause, new Object[] { 2500L }, -1),
new Event(EventType.stg3_event, new Object[] { "TX", "Austin", null, 1100L }, 3),
new Event(EventType.stg1_event, new Object[] { "TX", "Austin", null, 1100L }, 3),
new Event(EventType.pause, new Object[] { 6500L }, -1),
// Stage1 arrives, but not in time.
new Event(EventType.stg2_event, new Object[] { "TX", "Austin", null, 1100L }, 3),
new Event(EventType.pause, new Object[] { 2500L }, -1),
new Event(EventType.stg3_event, new Object[] { "TX", "Austin", null, 1200L }, 3),
new Event(EventType.stg2_event, new Object[] { "TX", "Austin", null, 1200L }, 3),
new Event(EventType.stg1_event, new Object[] { "TX", "Austin", null, 1200L }, 3) };
}
@Override
protected String[] getResultColumnTypes() {
return new String[] { java.lang.Long.class.getName(), java.lang.Long.class.getName(),
java.lang.Long.class.getName(), java.lang.Double.class.getName(),
RowSpec.addInfo(java.lang.String.class.getName(), Info.SIZE, 20),
java.sql.Timestamp.class.getName() };
}
@Override
protected String[] getStage1ColumnTypes() {
return new String[] { RowSpec.addInfo(java.lang.String.class.getName(), Info.SIZE, 10),
RowSpec.addInfo(java.lang.String.class.getName(), Info.SIZE, 10),
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, 10),
RowSpec.addInfo(java.lang.String.class.getName(), Info.SIZE, 10),
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, 10),
RowSpec.addInfo(java.lang.String.class.getName(), Info.SIZE, 10),
java.sql.Timestamp.class.getName(), java.lang.Long.class.getName() };
}
@Override
protected String[] getResultColumnNames() {
return new String[] { "stg1_id", "stg2_id", "stg3_id", "expr", "comments",
"current_timestamp" };
}
@Override
protected String getRQLColumnsCSV() {
String[] columns = getResultColumnNames();
// Insert a complex expression column as "expr".
/*
* todo OGNL problem: (((stg1_id * stg2_id)/10) * stg3_id) + (3000 -
* 200)
*/
columns[3] = "stg1_id + stg2_id + stg3_id + (3000 - 200) as " + columns[3];
// Insert a case..when script pseudo column at the end as "comments".
columns[4] = "case"
+ " when stg2_id = 200 then 'Stage 2 is 200!'"
+ " when stg3_id > 1100 then 'Stage 3 is above 1100!'"
+ " when stg1_id is not null and stg2_id = 300 then 'Stage 1 is not null and Stage 2 is 300!'"
+ " else 'All OK!' end as " + columns[4];
String csv = "";
for (int i = 0; i < columns.length; i++) {
if (csv != "") {
csv = csv + ", ";
}
csv = csv + columns[i];
}
return csv;
}
@Override
protected String getRQL() {
String csv = getRQLColumnsCSV();
return "select first 30 "
+ csv
+ " from"
+ " alert one_event.event_id as stg1_id,"
+ " two_event.event_id as stg2_id,"
+ " three_event.event_id as stg3_id,"
+ " one_event.levelb as levelb"
+ " using stg1_event (partition store last 5 seconds) as one_event correlate on event_id,"
+ " stg2_event (partition store last 5 seconds) as two_event correlate on event_id,"
+ " stg3_event (partition store last 5 seconds) as three_event correlate on event_id"
+ " when present(one_event and two_event and three_event)"
/*
* todo OGNL problem: ((stg1_id * 2) + 8) = (stg2_id *
* 1000/1000) + (stg3_id + 8))
*/
+ " where (stg1_id + 8 = stg2_id + 8) and (levelb = 'Auckland' or levelb = 'Austin');";
}
protected HashSet<String> getExpectedResults() {
HashSet<String> expectedResults = new HashSet<String>();
expectedResults.add("100 100 100");
expectedResults.add("400 400 400");
expectedResults.add("600 600 600");
expectedResults.add("1200 1200 1200");
return expectedResults;
}
@Override
protected void verify(List<BatchResult> results) {
HashSet<String> expectedResults = getExpectedResults();
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 + " ");
}
/*
* "stg1_id", "stg2_id", "stg3_id", "expr", "comment",
* "timestamp".
*/
Long stg1Id = objects[0] == null ? null : ((Number) objects[0]).longValue();
Long stg2Id = objects[1] == null ? null : ((Number) objects[1]).longValue();
Long stg3Id = objects[2] == null ? null : ((Number) objects[2]).longValue();
Assert.assertNotNull(objects[3], "Expression should not've been null");
Assert.assertNotNull(objects[4], "Comment should not've been null");
Assert.assertNotNull(objects[5], "Timestamp should not've been null");
String hash = stg1Id + " " + stg2Id + " " + stg3Id;
boolean exists = expectedResults.remove(hash);
Assert.assertTrue(exists, "Pattern " + hash + " does not match expected results");
System.out.println();
}
}
Assert.assertEquals(expectedResults.size(), 0, "All expected Patterns did not arrive");
}
}