class KsqlEngine implements Closeable {

  public List<QueryMetadata> buildMultipleQueries(
      final String queriesString,
      final Map<String, Object> overriddenProperties
  ) throws Exception {
    for (String property : overriddenProperties.keySet()) {
      if (IMMUTABLE_PROPERTIES.contains(property)) {
        throw new IllegalArgumentException(
            String.format("Cannot override property '%s'", property)
        );
      }
    }

    // Multiple queries submitted as the same time should success or fail as a whole,
    // Thus we use tempMetaStore to store newly created tables, streams or topics.
    // MetaStore tempMetaStore = new MetaStoreImpl(metaStore);
    MetaStore tempMetaStore = metaStore.clone();

    // Build query AST from the query string
    List<Pair<String, Statement>> queries = parseQueries(
        queriesString,
        overriddenProperties,
        tempMetaStore
    );

    return planQueries(queries, overriddenProperties, tempMetaStore);
  }

  public  KsqlEngine(final KsqlConfig ksqlConfig, final KafkaTopicClient topicClient);
  public  KsqlEngine(
      final KsqlConfig ksqlConfig,
      final KafkaTopicClient topicClient,
      final SchemaRegistryClient schemaRegistryClient,
      final MetaStore metaStore
  );

}