in core/src/main/java/com/datastax/oss/driver/internal/core/cql/Conversions.java [122:257]
public static Message toMessage(
Statement<?> statement, DriverExecutionProfile config, InternalDriverContext context) {
ConsistencyLevelRegistry consistencyLevelRegistry = context.getConsistencyLevelRegistry();
ConsistencyLevel consistency = statement.getConsistencyLevel();
int consistencyCode =
(consistency == null)
? consistencyLevelRegistry.nameToCode(
config.getString(DefaultDriverOption.REQUEST_CONSISTENCY))
: consistency.getProtocolCode();
int pageSize = statement.getPageSize();
if (pageSize <= 0) {
pageSize = config.getInt(DefaultDriverOption.REQUEST_PAGE_SIZE);
}
ConsistencyLevel serialConsistency = statement.getSerialConsistencyLevel();
int serialConsistencyCode =
(serialConsistency == null)
? consistencyLevelRegistry.nameToCode(
config.getString(DefaultDriverOption.REQUEST_SERIAL_CONSISTENCY))
: serialConsistency.getProtocolCode();
long timestamp = statement.getQueryTimestamp();
if (timestamp == Statement.NO_DEFAULT_TIMESTAMP) {
timestamp = context.getTimestampGenerator().next();
}
CodecRegistry codecRegistry = context.getCodecRegistry();
ProtocolVersion protocolVersion = context.getProtocolVersion();
ProtocolVersionRegistry protocolVersionRegistry = context.getProtocolVersionRegistry();
CqlIdentifier keyspace = statement.getKeyspace();
int nowInSeconds = statement.getNowInSeconds();
if (nowInSeconds != Statement.NO_NOW_IN_SECONDS
&& !protocolVersionRegistry.supports(
protocolVersion, DefaultProtocolFeature.NOW_IN_SECONDS)) {
throw new IllegalArgumentException("Can't use nowInSeconds with protocol " + protocolVersion);
}
if (statement instanceof SimpleStatement) {
SimpleStatement simpleStatement = (SimpleStatement) statement;
List<Object> positionalValues = simpleStatement.getPositionalValues();
Map<CqlIdentifier, Object> namedValues = simpleStatement.getNamedValues();
if (!positionalValues.isEmpty() && !namedValues.isEmpty()) {
throw new IllegalArgumentException(
"Can't have both positional and named values in a statement.");
}
if (keyspace != null
&& !protocolVersionRegistry.supports(
protocolVersion, DefaultProtocolFeature.PER_REQUEST_KEYSPACE)) {
throw new IllegalArgumentException(
"Can't use per-request keyspace with protocol " + protocolVersion);
}
QueryOptions queryOptions =
new QueryOptions(
consistencyCode,
encode(positionalValues, codecRegistry, protocolVersion),
encode(namedValues, codecRegistry, protocolVersion),
false,
pageSize,
statement.getPagingState(),
serialConsistencyCode,
timestamp,
(keyspace == null) ? null : keyspace.asInternal(),
nowInSeconds);
return new Query(simpleStatement.getQuery(), queryOptions);
} else if (statement instanceof BoundStatement) {
BoundStatement boundStatement = (BoundStatement) statement;
if (!protocolVersionRegistry.supports(
protocolVersion, DefaultProtocolFeature.UNSET_BOUND_VALUES)) {
ensureAllSet(boundStatement);
}
boolean skipMetadata =
boundStatement.getPreparedStatement().getResultSetDefinitions().size() > 0;
QueryOptions queryOptions =
new QueryOptions(
consistencyCode,
boundStatement.getValues(),
Collections.emptyMap(),
skipMetadata,
pageSize,
statement.getPagingState(),
serialConsistencyCode,
timestamp,
null,
nowInSeconds);
PreparedStatement preparedStatement = boundStatement.getPreparedStatement();
ByteBuffer id = preparedStatement.getId();
ByteBuffer resultMetadataId = preparedStatement.getResultMetadataId();
return new Execute(
Bytes.getArray(id),
(resultMetadataId == null) ? null : Bytes.getArray(resultMetadataId),
queryOptions);
} else if (statement instanceof BatchStatement) {
BatchStatement batchStatement = (BatchStatement) statement;
if (!protocolVersionRegistry.supports(
protocolVersion, DefaultProtocolFeature.UNSET_BOUND_VALUES)) {
ensureAllSet(batchStatement);
}
if (keyspace != null
&& !protocolVersionRegistry.supports(
protocolVersion, DefaultProtocolFeature.PER_REQUEST_KEYSPACE)) {
throw new IllegalArgumentException(
"Can't use per-request keyspace with protocol " + protocolVersion);
}
List<Object> queriesOrIds = new ArrayList<>(batchStatement.size());
List<List<ByteBuffer>> values = new ArrayList<>(batchStatement.size());
for (BatchableStatement<?> child : batchStatement) {
if (child instanceof SimpleStatement) {
SimpleStatement simpleStatement = (SimpleStatement) child;
if (simpleStatement.getNamedValues().size() > 0) {
throw new IllegalArgumentException(
String.format(
"Batch statements cannot contain simple statements with named values "
+ "(offending statement: %s)",
simpleStatement.getQuery()));
}
queriesOrIds.add(simpleStatement.getQuery());
values.add(encode(simpleStatement.getPositionalValues(), codecRegistry, protocolVersion));
} else if (child instanceof BoundStatement) {
BoundStatement boundStatement = (BoundStatement) child;
queriesOrIds.add(Bytes.getArray(boundStatement.getPreparedStatement().getId()));
values.add(boundStatement.getValues());
} else {
throw new IllegalArgumentException(
"Unsupported child statement: " + child.getClass().getName());
}
}
return new Batch(
batchStatement.getBatchType().getProtocolCode(),
queriesOrIds,
values,
consistencyCode,
serialConsistencyCode,
timestamp,
(keyspace == null) ? null : keyspace.asInternal(),
nowInSeconds);
} else {
throw new IllegalArgumentException(
"Unsupported statement type: " + statement.getClass().getName());
}
}