package org.yamcs.yarch.streamsql;
import java.util.ArrayList;
import org.yamcs.yarch.PartitioningSpec;
import org.yamcs.yarch.TableDefinition;
import org.yamcs.yarch.TableDefinition.PartitionStorage;
import org.yamcs.yarch.TupleDefinition;
import org.yamcs.yarch.YarchDatabase;
import org.yamcs.yarch.YarchException;
public class CreateTableStatement extends StreamSqlStatement {
boolean ifNotExists;
String tableName;
TupleDefinition tupleDefinition;
ArrayList<String> primaryKey;
ArrayList<String> histoColumns;
PartitioningSpec partitioningSpec;
PartitionStorage partitionStorage;
String dataDir;
String engine;
private boolean compressed=false;
public CreateTableStatement(boolean ifNotExists, String tableName, TupleDefinition tupleDefinition, ArrayList<String> primaryKey) {
this.ifNotExists=ifNotExists;
this.tableName=tableName;
this.tupleDefinition=tupleDefinition;
this.primaryKey=primaryKey;
}
public void setDataDir(String dataDir) {
this.dataDir=dataDir;
}
public void setPartitioning(PartitioningSpec pspec) {
this.partitioningSpec=pspec;
}
public void setCompressed(boolean c) {
this.compressed=c;
}
public void addHistogramColumn(String columnName) {
if(histoColumns==null) {
histoColumns=new ArrayList<String>();
}
histoColumns.add(columnName);
}
@Override
public StreamSqlResult execute(ExecutionContext c) throws StreamSqlException {
YarchDatabase ydb=YarchDatabase.getInstance(c.getDbName());
synchronized(ydb) {
TableDefinition tableDefinition=new TableDefinition(tableName, tupleDefinition, primaryKey);
tableDefinition.validate();
if(dataDir!=null) {
tableDefinition.setDataDir(dataDir);
tableDefinition.setCustomDataDir(true);
} else {
tableDefinition.setDataDir(ydb.getRoot());
tableDefinition.setCustomDataDir(false);
}
if(engine!=null) {
tableDefinition.setStorageEngineName(engine);
} else {
tableDefinition.setStorageEngineName(ydb.getDefaultStorageEngineName());
}
tableDefinition.setCompressed(compressed);
if(partitioningSpec!=null) {
tableDefinition.setPartitioningSpec(partitioningSpec);
} else {
tableDefinition.setPartitioningSpec(PartitioningSpec.noneSpec());
}
if(histoColumns!=null) {
tableDefinition.setHistogramColumns(histoColumns);
}
if(partitionStorage!=null) {
tableDefinition.setPartitionStorage(partitionStorage);
}
try {
if(!ifNotExists || ydb.getTable(tableName)==null) {
ydb.createTable(tableDefinition);
}
return new StreamSqlResult();
} catch(YarchException e) {
throw new GenericStreamSqlException("Cannot create table: "+e.getMessage());
}
}
}
public void setEngine(String engine) {
this.engine=engine;
}
public void setPartitionStorage(PartitionStorage pstorage) {
this.partitionStorage = pstorage;
}
}