package org.yamcs.yarch.streamsql; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.yamcs.yarch.Stream; import org.yamcs.yarch.TableDefinition; import org.yamcs.yarch.TableWriter; import org.yamcs.yarch.TupleDefinition; import org.yamcs.yarch.YarchDatabase; import org.yamcs.yarch.TableWriter.InsertMode; import org.yamcs.yarch.YarchException; import org.yamcs.yarch.streamsql.ExecutionContext; import org.yamcs.yarch.streamsql.GenericStreamSqlException; import org.yamcs.yarch.streamsql.InsertStatement; import org.yamcs.yarch.streamsql.NotImplementedException; import org.yamcs.yarch.streamsql.ResourceNotFoundException; import org.yamcs.yarch.streamsql.StreamExpression; import org.yamcs.yarch.streamsql.StreamSqlException; import org.yamcs.yarch.streamsql.StreamSqlResult; import org.yamcs.yarch.streamsql.StreamSqlStatement; public class InsertStatement extends StreamSqlStatement { String name; StreamExpression expression; static Logger log=LoggerFactory.getLogger(InsertStatement.class.getName()); InsertMode insertMode; public InsertStatement(String name, StreamExpression expression, InsertMode mode) { this.name=name; this.expression=expression; this.insertMode=mode; } @Override public StreamSqlResult execute(ExecutionContext c) throws StreamSqlException { YarchDatabase ydb=YarchDatabase.getInstance(c.getDbName()); synchronized(ydb) { TableDefinition outputTableDef=null; TupleDefinition outputTuple; Stream outputStream=null; if((outputTableDef=ydb.getTable(name))!=null) { outputTuple=outputTableDef.getTupleDefinition(); } else if((outputStream=ydb.getStream(name))!=null) { outputTuple=outputStream.getDefinition(); } else { throw new ResourceNotFoundException(name); } expression.bind(c); Stream inputStream=expression.execute(c); TupleDefinition inputTuple=inputStream.getDefinition(); // compatibility check disabled since we switched to the dynamic schema // String reason=TupleDefinition.checkCompatibility(inputTuple, outputTuple); // if(reason!=null) throw new IncompatibilityException(reason); if(outputTableDef!=null) { try { //writing into a table TableWriter tableWriter=ydb.getStorageEngine(outputTableDef).newTableWriter(outputTableDef, insertMode); inputStream.addSubscriber(tableWriter); return new StreamSqlResult(); } catch(YarchException e) { log.warn("Got exception when creatin table", e); throw new GenericStreamSqlException(e.getMessage()); } } } log.warn("Insert into streams not yet implemented"); throw new NotImplementedException("Inserting into streams"); } }