package com.datastax.oss.driver.api.core.metadata.schema;
import com.datastax.oss.driver.api.core.CqlIdentifier;
import com.datastax.oss.driver.internal.core.metadata.schema.ScriptBuilder;
import com.datastax.oss.driver.internal.core.metadata.schema.parsing.RelationParser;
import edu.umd.cs.findbugs.annotations.NonNull;
import java.util.Optional;
public interface ViewMetadata extends RelationMetadata {
@NonNull
CqlIdentifier getBaseTable();
boolean includesAllColumns();
@NonNull
Optional<String> getWhereClause();
@NonNull
@Override
default String describe(boolean pretty) {
ScriptBuilder builder =
new ScriptBuilder(pretty)
.append("CREATE MATERIALIZED VIEW ")
.append(getKeyspace())
.append(".")
.append(getName())
.append(" AS")
.newLine();
builder.append("SELECT");
if (includesAllColumns()) {
builder.append(" * ");
} else {
builder.newLine().increaseIndent();
boolean first = true;
for (ColumnMetadata column : getColumns().values()) {
if (first) {
first = false;
} else {
builder.append(",").newLine();
}
builder.append(column.getName());
}
builder.newLine().decreaseIndent();
}
builder.append("FROM ").append(getKeyspace()).append(".").append(getBaseTable());
Optional<String> whereClause = getWhereClause();
if (whereClause.isPresent() && !whereClause.get().isEmpty()) {
builder.newLine().append("WHERE ").append(whereClause.get());
}
builder.newLine().append("PRIMARY KEY (");
if (getPartitionKey().size() == 1) {
builder.append(getPartitionKey().get(0).getName());
} else {
builder.append("(");
boolean first = true;
for (ColumnMetadata pkColumn : getPartitionKey()) {
if (first) {
first = false;
} else {
builder.append(", ");
}
builder.append(pkColumn.getName());
}
builder.append(")");
}
for (ColumnMetadata clusteringColumn : getClusteringColumns().keySet()) {
builder.append(", ").append(clusteringColumn.getName());
}
builder.append(")").increaseIndent();
RelationParser.appendOptions(getOptions(), builder);
return builder.append(";").build();
}
@NonNull
@Override
default String describeWithChildren(boolean pretty) {
return describe(pretty);
}
}