use of io.confluent.ksql.rest.entity.CommandStatus in project ksql by confluentinc.
the class Console method printAsTable.
private void printAsTable(KsqlEntity ksqlEntity) {
List<String> header = new ArrayList<>();
List<String> footer = new ArrayList<>();
List<String> columnHeaders = new ArrayList<>();
List<List<String>> rowValues = new ArrayList<>();
if (ksqlEntity instanceof CommandStatusEntity) {
CommandStatusEntity commandStatusEntity = (CommandStatusEntity) ksqlEntity;
columnHeaders = Arrays.asList("Message");
CommandStatus commandStatus = commandStatusEntity.getCommandStatus();
rowValues = Collections.singletonList(Arrays.asList(commandStatus.getMessage().split("\n", 2)[0]));
} else if (ksqlEntity instanceof ErrorMessageEntity) {
ErrorMessage errorMessage = ((ErrorMessageEntity) ksqlEntity).getErrorMessage();
printErrorMessage(errorMessage);
return;
} else if (ksqlEntity instanceof PropertiesList) {
PropertiesList propertiesList = CliUtils.propertiesListWithOverrides((PropertiesList) ksqlEntity, restClient.getLocalProperties());
Map<String, Object> properties = propertiesList.getProperties();
columnHeaders = Arrays.asList("Property", "Value");
rowValues = properties.entrySet().stream().map(propertyEntry -> Arrays.asList(propertyEntry.getKey(), Objects.toString(propertyEntry.getValue()))).collect(Collectors.toList());
} else if (ksqlEntity instanceof Queries) {
List<Queries.RunningQuery> runningQueries = ((Queries) ksqlEntity).getQueries();
columnHeaders = Arrays.asList("Query ID", "Kafka Topic", "Query String");
rowValues = runningQueries.stream().map(runningQuery -> Arrays.asList(runningQuery.getId().toString(), runningQuery.getKafkaTopic(), runningQuery.getQueryString())).collect(Collectors.toList());
footer.add("For detailed information on a Query run: EXPLAIN <Query ID>;");
} else if (ksqlEntity instanceof SourceDescription) {
SourceDescription sourceDescription = (SourceDescription) ksqlEntity;
List<SourceDescription.FieldSchemaInfo> fields = sourceDescription.getSchema();
if (!fields.isEmpty()) {
columnHeaders = Arrays.asList("Field", "Type");
rowValues = fields.stream().map(field -> Arrays.asList(field.getName(), formatFieldType(field, sourceDescription.getKey()))).collect(Collectors.toList());
}
printExtendedInformation(header, footer, sourceDescription);
} else if (ksqlEntity instanceof TopicDescription) {
columnHeaders = new ArrayList<>();
columnHeaders.add("Topic Name");
columnHeaders.add("Kafka Topic");
columnHeaders.add("Type");
List<String> topicInfo = new ArrayList<>();
TopicDescription topicDescription = (TopicDescription) ksqlEntity;
topicInfo.add(topicDescription.getName());
topicInfo.add(topicDescription.getKafkaTopic());
topicInfo.add(topicDescription.getFormat());
if (topicDescription.getFormat().equalsIgnoreCase("AVRO")) {
columnHeaders.add("AvroSchema");
topicInfo.add(topicDescription.getSchemaString());
}
rowValues = Arrays.asList(topicInfo);
} else if (ksqlEntity instanceof StreamsList) {
List<SourceInfo.Stream> streamInfos = ((StreamsList) ksqlEntity).getStreams();
columnHeaders = Arrays.asList("Stream Name", "Kafka Topic", "Format");
rowValues = streamInfos.stream().map(streamInfo -> Arrays.asList(streamInfo.getName(), streamInfo.getTopic(), streamInfo.getFormat())).collect(Collectors.toList());
} else if (ksqlEntity instanceof TablesList) {
List<SourceInfo.Table> tableInfos = ((TablesList) ksqlEntity).getTables();
columnHeaders = Arrays.asList("Table Name", "Kafka Topic", "Format", "Windowed");
rowValues = tableInfos.stream().map(tableInfo -> Arrays.asList(tableInfo.getName(), tableInfo.getTopic(), tableInfo.getFormat(), Boolean.toString(tableInfo.getIsWindowed()))).collect(Collectors.toList());
} else if (ksqlEntity instanceof KsqlTopicsList) {
List<KsqlTopicInfo> topicInfos = ((KsqlTopicsList) ksqlEntity).getTopics();
columnHeaders = Arrays.asList("Ksql Topic", "Kafka Topic", "Format");
rowValues = topicInfos.stream().map(topicInfo -> Arrays.asList(topicInfo.getName(), topicInfo.getKafkaTopic(), topicInfo.getFormat().name())).collect(Collectors.toList());
} else if (ksqlEntity instanceof KafkaTopicsList) {
List<KafkaTopicInfo> topicInfos = ((KafkaTopicsList) ksqlEntity).getTopics();
columnHeaders = Arrays.asList("Kafka Topic", "Registered", "Partitions", "Partition Replicas", "Consumers", "Consumer Groups");
rowValues = topicInfos.stream().map(topicInfo -> Arrays.asList(topicInfo.getName(), Boolean.toString(topicInfo.getRegistered()), Integer.toString(topicInfo.getReplicaInfo().size()), getTopicReplicaInfo(topicInfo.getReplicaInfo()), Integer.toString(topicInfo.getConsumerCount()), Integer.toString(topicInfo.getConsumerGroupCount()))).collect(Collectors.toList());
} else if (ksqlEntity instanceof ExecutionPlan) {
ExecutionPlan executionPlan = (ExecutionPlan) ksqlEntity;
columnHeaders = Arrays.asList("Execution Plan");
rowValues = Collections.singletonList(Arrays.asList(executionPlan.getExecutionPlan()));
} else {
throw new RuntimeException(String.format("Unexpected KsqlEntity class: '%s'", ksqlEntity.getClass().getCanonicalName()));
}
printTable(columnHeaders, rowValues, header, footer);
}
use of io.confluent.ksql.rest.entity.CommandStatus in project ksql by confluentinc.
the class StatementExecutor method executeStatement.
private void executeStatement(Statement statement, Command command, CommandId commandId, Map<QueryId, CommandId> terminatedQueries, boolean wasDropped) throws Exception {
String statementStr = command.getStatement();
DdlCommandResult result = null;
String successMessage = "";
if (statement instanceof DdlStatement) {
result = ksqlEngine.executeDdlStatement(statementStr, (DdlStatement) statement, command.getKsqlProperties());
} else if (statement instanceof CreateAsSelect) {
successMessage = handleCreateAsSelect((CreateAsSelect) statement, command, commandId, terminatedQueries, statementStr, wasDropped);
if (successMessage == null) {
return;
}
} else if (statement instanceof TerminateQuery) {
terminateQuery((TerminateQuery) statement);
successMessage = "Query terminated.";
} else if (statement instanceof RunScript) {
handleRunScript(command);
} else {
throw new Exception(String.format("Unexpected statement type: %s", statement.getClass().getName()));
}
// TODO: change to unified return message
CommandStatus successStatus = new CommandStatus(CommandStatus.Status.SUCCESS, result != null ? result.getMessage() : successMessage);
statusStore.put(commandId, successStatus);
completeStatusFuture(commandId, successStatus);
}
use of io.confluent.ksql.rest.entity.CommandStatus in project ksql by confluentinc.
the class StatementExecutor method startQuery.
private boolean startQuery(String queryString, Query query, CommandId commandId, Map<QueryId, CommandId> terminatedQueries, Command command, boolean wasDropped) throws Exception {
if (query.getQueryBody() instanceof QuerySpecification) {
QuerySpecification querySpecification = (QuerySpecification) query.getQueryBody();
Relation into = querySpecification.getInto();
if (into instanceof Table) {
Table table = (Table) into;
if (ksqlEngine.getMetaStore().getSource(table.getName().getSuffix()) != null) {
throw new Exception(String.format("Sink specified in INTO clause already exists: %s", table.getName().getSuffix().toUpperCase()));
}
}
}
QueryMetadata queryMetadata = ksqlEngine.buildMultipleQueries(queryString, command.getKsqlProperties()).get(0);
if (queryMetadata instanceof PersistentQueryMetadata) {
PersistentQueryMetadata persistentQueryMetadata = (PersistentQueryMetadata) queryMetadata;
final QueryId queryId = persistentQueryMetadata.getId();
if (terminatedQueries != null && terminatedQueries.containsKey(queryId)) {
CommandId terminateId = terminatedQueries.get(queryId);
statusStore.put(terminateId, new CommandStatus(CommandStatus.Status.SUCCESS, "Termination request granted"));
statusStore.put(commandId, new CommandStatus(CommandStatus.Status.TERMINATED, "Query terminated"));
ksqlEngine.terminateQuery(queryId, false);
return false;
} else if (wasDropped) {
ksqlEngine.terminateQuery(queryId, false);
return false;
} else {
persistentQueryMetadata.getKafkaStreams().start();
return true;
}
} else {
throw new Exception(String.format("Unexpected query metadata type: %s; was expecting %s", queryMetadata.getClass().getCanonicalName(), PersistentQueryMetadata.class.getCanonicalName()));
}
}
use of io.confluent.ksql.rest.entity.CommandStatus in project ksql by confluentinc.
the class KsqlResource method distributeStatement.
private CommandStatusEntity distributeStatement(String statementText, Statement statement, Map<String, Object> streamsProperties) throws KsqlException {
CommandId commandId = commandStore.distributeStatement(statementText, statement, streamsProperties);
CommandStatus commandStatus;
try {
commandStatus = statementExecutor.registerQueuedStatement(commandId).get(distributedCommandResponseTimeout, TimeUnit.MILLISECONDS);
} catch (TimeoutException exception) {
log.warn("Timeout to get commandStatus, waited {} milliseconds:, statementText:" + statementText, distributedCommandResponseTimeout, exception);
commandStatus = statementExecutor.getStatus(commandId).get();
} catch (Exception e) {
throw new KsqlException(String.format("Could not write the statement '%s' into the command " + "topic.", statementText), e);
}
return new CommandStatusEntity(statementText, commandId, commandStatus);
}
use of io.confluent.ksql.rest.entity.CommandStatus in project ksql by confluentinc.
the class StatementExecutorTest method shouldHandlePriorStatement.
@Test
public void shouldHandlePriorStatement() throws Exception {
TestUtils testUtils = new TestUtils();
List<Pair<CommandId, Command>> priorCommands = testUtils.getAllPriorCommandRecords();
final RestoreCommands restoreCommands = new RestoreCommands();
priorCommands.forEach(pair -> restoreCommands.addCommand(pair.left, pair.right));
CommandId topicCommandId = new CommandId(CommandId.Type.TOPIC, "_CSASTopicGen", CommandId.Action.CREATE);
CommandId csCommandId = new CommandId(CommandId.Type.STREAM, "_CSASStreamGen", CommandId.Action.CREATE);
CommandId csasCommandId = new CommandId(CommandId.Type.STREAM, "_CSASGen", CommandId.Action.CREATE);
CommandId ctasCommandId = new CommandId(CommandId.Type.TABLE, "_CTASGen", CommandId.Action.CREATE);
statementExecutor.handleRestoration(restoreCommands);
Map<CommandId, CommandStatus> statusStore = statementExecutor.getStatuses();
Assert.assertNotNull(statusStore);
Assert.assertEquals(4, statusStore.size());
Assert.assertEquals(CommandStatus.Status.SUCCESS, statusStore.get(topicCommandId).getStatus());
Assert.assertEquals(CommandStatus.Status.SUCCESS, statusStore.get(csCommandId).getStatus());
Assert.assertEquals(CommandStatus.Status.SUCCESS, statusStore.get(csasCommandId).getStatus());
Assert.assertEquals(CommandStatus.Status.ERROR, statusStore.get(ctasCommandId).getStatus());
}
Aggregations