package org.yamcs.yarch.streamsql;
import java.io.StringReader;
import java.util.concurrent.atomic.AtomicInteger;
import org.codehaus.janino.SimpleCompiler;
import org.yamcs.yarch.CompiledAggregateExpression;
import org.yamcs.yarch.streamsql.StreamSqlException.ErrCode;
import org.yamcs.yarch.streamsql.AggregateExpression;
import org.yamcs.yarch.streamsql.Expression;
import org.yamcs.yarch.streamsql.ParseException;
import org.yamcs.yarch.streamsql.StreamSqlException;
public abstract class CompilableAggregateExpression extends AggregateExpression {
public CompilableAggregateExpression(Expression[] args, boolean star)throws ParseException {
super(args, star);
}
private static AtomicInteger counter=new AtomicInteger();
@Override
public CompiledAggregateExpression getCompiledAggregate() throws StreamSqlException {
String className = "AggregateExpression"+counter.incrementAndGet();
StringBuilder code=new StringBuilder();
code.append("package org.yamcs.yarch;\n")
.append("public class "+className+" implements CompiledAggregateExpression {\n");
aggregateFillCode_Declarations(code);
code.append("\tpublic void newData(Tuple tuple) {\n");
aggregateFillCode_newData(code);
code.append("\t}\n");
code.append("\tpublic Object getValue() {\n");
aggregateFillCode_getValue(code);
code.append("\t}\n");
code.append("\tpublic void clear() {\n");
aggregateFillCode_clear(code);
code.append("\t}\n")
.append("}");
try {
SimpleCompiler compiler=new SimpleCompiler();
compiler.cook(code.toString());
Class<?> cexprClass = compiler.getClassLoader().loadClass("org.yamcs.yarch."+className);
return (CompiledAggregateExpression) cexprClass.newInstance();
} catch (Exception e) {
throw new StreamSqlException(ErrCode.COMPILE_ERROR, e.toString());
}
}
protected abstract void aggregateFillCode_clear(StringBuilder code);
protected abstract void aggregateFillCode_getValue(StringBuilder code);
protected abstract void aggregateFillCode_newData(StringBuilder code) throws StreamSqlException;
protected abstract void aggregateFillCode_Declarations(StringBuilder code);
}