package io.teknek.intravert.action.impl; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.config.KSMetaData; import org.apache.cassandra.config.Schema; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.thrift.CfDef; import io.teknek.intravert.action.Action; import io.teknek.intravert.model.Operation; import io.teknek.intravert.model.Response; import io.teknek.intravert.service.ApplicationContext; import io.teknek.intravert.service.RequestContext; import io.teknek.intravert.util.ResponseUtil; public class CreateColumnFamilyAction implements Action { @Override public void doAction(Operation operation, Response response, RequestContext request, ApplicationContext application) { String keyspace = (String) operation.getArguments().get("keyspace"); String columnFamily = (String) operation.getArguments().get("columnFamily"); boolean ignoreIfNotExists = (Boolean) operation.getArguments().get("ignoreIfNotExists"); if (!Schema.instance.getNonSystemTables().contains(keyspace)){ throw new RuntimeException("keyspace "+ keyspace + " does not exist"); } KSMetaData ks = Schema.instance.getKSMetaData(keyspace); if (ks.cfMetaData().containsKey(columnFamily)){ if (ignoreIfNotExists){ response.getResults().put(operation.getId(), ResponseUtil.getDefaultHappy()); return; } else { throw new RuntimeException (keyspace +" already exists"); } } try { createColumnfamily(keyspace, columnFamily); } catch (InvalidRequestException | ConfigurationException e) { throw new RuntimeException(e); } response.getResults().put(operation.getId(), ResponseUtil.getDefaultHappy()); } public static void createColumnfamily(String keyspace, String columnFamily) throws InvalidRequestException, ConfigurationException{ CFMetaData cfm = null; CfDef def = new CfDef(); def.unsetId(); def.setKeyspace(keyspace); def.setName(columnFamily); cfm = CFMetaData.fromThrift(def); cfm.addDefaultIndexNames(); MigrationManager.announceNewColumnFamily(cfm); } }