package org.yamcs.yarch;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Test;
import org.yamcs.yarch.AbstractStream;
import org.yamcs.yarch.DataType;
import org.yamcs.yarch.Stream;
import org.yamcs.yarch.StreamSubscriber;
import org.yamcs.yarch.Tuple;
import org.yamcs.yarch.TupleDefinition;
import org.yamcs.yarch.YarchDatabase;
import org.yamcs.yarch.YarchException;
import org.yamcs.yarch.streamsql.StreamSqlResult;
import static org.junit.Assert.*;
public class StreamSelect1Test extends YarchTestCase {
StreamSqlResult res;
final int n=200;
public void createFeeder1() throws YarchException {
AbstractStream s;
YarchDatabase ydb=YarchDatabase.getInstance(context.getDbName());
final TupleDefinition tpdef=new TupleDefinition();
tpdef.addColumn("x", DataType.INT);
tpdef.addColumn("y", DataType.STRING);
s=(new AbstractStream(ydb,"stream_in",tpdef) {
@Override
public void start() {
for (int i=0;i<n;i++) {
Integer x=i;
String y="s"+i;
Tuple t=new Tuple(tpdef, new Object[]{x,y});
emitTuple(t);
}
close();
}
@Override
protected void doClose() {
}
});
ydb.addStream(s);
}
@Test
public void testLike() throws Exception {
createFeeder1();
res=execute("create stream stream_out1 as select * from stream_in where y like \'s1%\'");
YarchDatabase ydb=YarchDatabase.getInstance(context.getDbName());
Stream s = ydb.getStream("stream_out1");
final Semaphore finished=new Semaphore(0);
final AtomicInteger counter = new AtomicInteger(0);
s.addSubscriber(new StreamSubscriber() {
@Override
public void streamClosed(Stream stream) {
finished.release();
}
int k=1;
@Override
public void onTuple(Stream stream, Tuple tuple) {
int x=(Integer)tuple.getColumn(0);
String y=(String)tuple.getColumn(1);
assertEquals(k, x);
assertEquals("s"+k, y);
counter.incrementAndGet();
do {
k+=1;
} while(!("s"+k).startsWith("s1"));
}
});
s.start();
assertTrue(finished.tryAcquire(5, TimeUnit.SECONDS));
assertEquals(111, counter.get());
}
@Test
public void testNotLike() throws Exception {
createFeeder1();
res=execute("create stream stream_out1 as select * from stream_in where y NOT LIKE \'s1%\'");
YarchDatabase ydb=YarchDatabase.getInstance(context.getDbName());
Stream s = ydb.getStream("stream_out1");
final Semaphore finished=new Semaphore(0);
final AtomicInteger counter = new AtomicInteger(0);
s.addSubscriber(new StreamSubscriber() {
@Override
public void streamClosed(Stream stream) {
finished.release();
}
int k=0;
@Override
public void onTuple(Stream stream, Tuple tuple) {
int x=(Integer)tuple.getColumn(0);
String y=(String)tuple.getColumn(1);
assertEquals(k, x);
assertEquals("s"+k, y);
counter.incrementAndGet();
do {
k++;
} while(("s"+k).startsWith("s1"));
}
});
s.start();
assertTrue(finished.tryAcquire(5, TimeUnit.SECONDS));
assertEquals(89, counter.get());
}
}