package org.yamcs.yarch.streamsql; import java.util.ArrayList; import java.util.List; import org.yamcs.yarch.DataType; import org.yamcs.yarch.DbReaderStream; import org.yamcs.yarch.streamsql.Expression; import org.yamcs.yarch.streamsql.GenericStreamSqlException; import org.yamcs.yarch.streamsql.ParseException; import org.yamcs.yarch.streamsql.StreamSqlException; public class AndExpression extends Expression { public AndExpression(List<Expression>list) throws ParseException { super(list.toArray(new Expression[0])); } @Override public Expression addFilter(DbReaderStream tableStream) throws StreamSqlException { ArrayList<Expression>new_expressions=new ArrayList<Expression>(); for(Expression expr:children) { Expression new_expr=expr.addFilter(tableStream); if(new_expr!=null) new_expressions.add(new_expr); } if(new_expressions.size()==0) return null; else if(new_expressions.size()==1) return new_expressions.get(0); children=new_expressions.toArray(new Expression[0]); return this; } @Override public void fillCode_getValueReturn(StringBuilder code) throws StreamSqlException { boolean first=true; code.append("("); for(Expression expr:children) { if(!first) code.append("&&"); else first=false; expr.fillCode_getValueReturn(code); } code.append(")"); } @Override public void doBind() throws StreamSqlException { for(Expression c:children) { if(c.getType()!=DataType.BOOLEAN) throw new GenericStreamSqlException("'"+c+"' is not of type boolean"); } type=DataType.BOOLEAN; } @Override public String toString() { StringBuffer sb=new StringBuffer(); boolean first=true; for(Expression expr:children) { if(first) first=false; else sb.append(" AND "); sb.append("("); sb.append(expr.toString()); sb.append(")"); } return sb.toString(); } }