package com.datastax.dse.driver.internal.core.metadata.schema.parsing;
import com.datastax.dse.driver.api.core.metadata.schema.DseColumnMetadata;
import com.datastax.dse.driver.api.core.metadata.schema.DseViewMetadata;
import com.datastax.dse.driver.internal.core.metadata.schema.DefaultDseColumnMetadata;
import com.datastax.dse.driver.internal.core.metadata.schema.DefaultDseViewMetadata;
import com.datastax.oss.driver.api.core.CqlIdentifier;
import com.datastax.oss.driver.api.core.metadata.schema.ClusteringOrder;
import com.datastax.oss.driver.api.core.metadata.schema.ColumnMetadata;
import com.datastax.oss.driver.api.core.type.DataType;
import com.datastax.oss.driver.api.core.type.UserDefinedType;
import com.datastax.oss.driver.internal.core.adminrequest.AdminRow;
import com.datastax.oss.driver.internal.core.context.InternalDriverContext;
import com.datastax.oss.driver.internal.core.metadata.schema.parsing.RawColumn;
import com.datastax.oss.driver.internal.core.metadata.schema.parsing.RelationParser;
import com.datastax.oss.driver.internal.core.metadata.schema.queries.SchemaRows;
import com.datastax.oss.driver.internal.core.util.Loggers;
import com.datastax.oss.driver.shaded.guava.common.base.MoreObjects;
import com.datastax.oss.driver.shaded.guava.common.collect.ImmutableList;
import com.datastax.oss.driver.shaded.guava.common.collect.ImmutableMap;
import com.datastax.oss.driver.shaded.guava.common.collect.ImmutableMultimap;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import net.jcip.annotations.ThreadSafe;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ThreadSafe
public class DseViewParser extends RelationParser {
private static final Logger LOG = LoggerFactory.getLogger(DseViewParser.class);
public DseViewParser(SchemaRows rows, InternalDriverContext context) {
super(rows, context);
}
public DseViewMetadata parseView(
AdminRow viewRow, CqlIdentifier keyspaceId, Map<CqlIdentifier, UserDefinedType> userTypes) {
CqlIdentifier viewId = CqlIdentifier.fromInternal(viewRow.getString("view_name"));
UUID uuid = viewRow.getUuid("id");
CqlIdentifier baseTableId = CqlIdentifier.fromInternal(viewRow.getString("base_table_name"));
boolean includesAllColumns =
MoreObjects.firstNonNull(viewRow.getBoolean("include_all_columns"), false);
String whereClause = viewRow.getString("where_clause");
List<RawColumn> rawColumns =
RawColumn.toRawColumns(
rows.columns().getOrDefault(keyspaceId, ImmutableMultimap.of()).get(viewId));
if (rawColumns.isEmpty()) {
LOG.warn(
"[{}] Processing VIEW refresh for {}.{} but found no matching rows, skipping",
logPrefix,
keyspaceId,
viewId);
return null;
}
Collections.sort(rawColumns);
ImmutableMap.Builder<CqlIdentifier, ColumnMetadata> allColumnsBuilder = ImmutableMap.builder();
ImmutableList.Builder<ColumnMetadata> partitionKeyBuilder = ImmutableList.builder();
ImmutableMap.Builder<ColumnMetadata, ClusteringOrder> clusteringColumnsBuilder =
ImmutableMap.builder();
for (RawColumn raw : rawColumns) {
DataType dataType = rows.dataTypeParser().parse(keyspaceId, raw.dataType, userTypes, context);
DseColumnMetadata column =
new DefaultDseColumnMetadata(
keyspaceId, viewId, raw.name, dataType, raw.kind.equals(RawColumn.KIND_STATIC));
switch (raw.kind) {
case RawColumn.KIND_PARTITION_KEY:
partitionKeyBuilder.add(column);
break;
case RawColumn.KIND_CLUSTERING_COLUMN:
clusteringColumnsBuilder.put(
column, raw.reversed ? ClusteringOrder.DESC : ClusteringOrder.ASC);
break;
default:
}
allColumnsBuilder.put(column.getName(), column);
}
Map<CqlIdentifier, Object> options;
try {
options = parseOptions(viewRow);
} catch (Exception e) {
Loggers.warnWithException(
LOG,
"[{}] Error while parsing options for {}.{}, getOptions() will be empty",
logPrefix,
keyspaceId,
viewId,
e);
options = Collections.emptyMap();
}
return new DefaultDseViewMetadata(
keyspaceId,
viewId,
baseTableId,
includesAllColumns,
whereClause,
uuid,
partitionKeyBuilder.build(),
clusteringColumnsBuilder.build(),
allColumnsBuilder.build(),
options);
}
}