Upgrade to Cassandra Java Driver 4.x#298
Conversation
Reviewer's GuideUpgrades the project from Datastax Cassandra Java Driver 3.x to Apache Cassandra Java Driver 4.x and adapts the Cassandra query execution and batch loading utilities, along with build and Docker example configuration, to the new driver APIs and metadata model. Sequence diagram for executing a Cassandra query via updated CassandraQueryExecutorsequenceDiagram
actor TestCode
participant CassandraQueryExecutor
participant CqlSession
participant CassandraCluster
TestCode->>CassandraQueryExecutor: new CassandraQueryExecutor(configuration)
CassandraQueryExecutor->>CqlSession: CqlSession.builder()
CqlSession-->>CassandraQueryExecutor: session with contact point and local datacenter
TestCode->>CassandraQueryExecutor: executeQuery(sql)
CassandraQueryExecutor->>CassandraQueryExecutor: checkState(!session.isClosed())
CassandraQueryExecutor->>CqlSession: execute(sql)
CqlSession->>CassandraCluster: send CQL query
CassandraCluster-->>CqlSession: ResultSet
CqlSession-->>CassandraQueryExecutor: ResultSet
CassandraQueryExecutor->>ResultSet: getColumnDefinitions()
CassandraQueryExecutor->>CassandraQueryExecutor: build JDBC types and column names
CassandraQueryExecutor->>ResultSet: iterate rows
CassandraQueryExecutor->>Row: getObject(i) for each column
CassandraQueryExecutor-->>TestCode: QueryResult
TestCode->>CassandraQueryExecutor: close()
CassandraQueryExecutor->>CqlSession: close()
Class diagram for updated CassandraQueryExecutor and CassandraBatchLoaderclassDiagram
class CassandraQueryExecutor {
- Map<DataType, JDBCType> typeMapping
- CqlSession session
+ CassandraQueryExecutor(Configuration configuration)
+ QueryResult executeQuery(String sql) QueryExecutionException
+ CqlSession getSession()
+ List<String> getColumnNames(String keySpace, String tableName)
+ boolean tableExists(String keySpace, String tableName)
+ List<String> getTableNames(String keySpace)
+ void close()
- static JDBCType getJDBCType(DataType type)
}
class CassandraBatchLoader {
- CqlSession session
- String insertQuery
- int columnsCount
- int batchRowsCount
+ CassandraBatchLoader(CqlSession session, String tableName, List<String> columnNames, int batchRowsCount)
+ void load(Iterator<List<Object>> rows)
- static BatchStatementBuilder createBatchStatementBuilder()
}
class CqlSession {
+ boolean isClosed()
+ ResultSet execute(String query)
+ PreparedStatement prepare(String query)
+ Metadata getMetadata()
+ void close()
}
class Metadata {
+ Optional<KeyspaceMetadata> getKeyspace(String keyspaceName)
}
class KeyspaceMetadata {
+ Optional<TableMetadata> getTable(String tableName)
+ Map<CqlIdentifier, TableMetadata> getTables()
}
class TableMetadata {
+ Map<CqlIdentifier, ColumnMetadata> getColumns()
+ CqlIdentifier getName()
}
class ColumnMetadata {
+ CqlIdentifier getName()
}
class ResultSet {
+ Iterable<Row> iterator()
+ Iterable<ColumnDefinition> getColumnDefinitions()
}
class ColumnDefinition {
+ DataType getType()
+ CqlIdentifier getName()
}
class Row {
+ Object getObject(int index)
}
class BatchStatementBuilder {
+ BatchStatementBuilder addStatement(BoundStatement statement)
+ BatchStatement build()
}
CassandraQueryExecutor --> CqlSession : uses
CassandraQueryExecutor --> Metadata : reads metadata
CassandraQueryExecutor --> KeyspaceMetadata : reads keyspace
CassandraQueryExecutor --> TableMetadata : reads table
CassandraQueryExecutor --> ColumnMetadata : reads columns
CassandraQueryExecutor --> ResultSet : executes queries
CassandraQueryExecutor --> ColumnDefinition : inspects columns
CassandraQueryExecutor --> Row : reads row data
CassandraBatchLoader --> CqlSession : uses
CassandraBatchLoader --> BatchStatementBuilder : builds batches
File-Level Changes
Assessment against linked issues
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Hey - I've left some high level feedback:
- The
CqlSessionis built with a hardcoded local datacenter ("datacenter1"); consider wiring this through configuration (with a sensible default) so the code can work against clusters that don’t use that name. - The Maven coordinates for the 4.x driver are usually
com.datastax.oss:java-driver-core; double-check thatorg.apache.cassandra:java-driver-core:${versions.cassandra}is the intended artifact and compatible with the rest of the stack.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- The `CqlSession` is built with a hardcoded local datacenter (`"datacenter1"`); consider wiring this through configuration (with a sensible default) so the code can work against clusters that don’t use that name.
- The Maven coordinates for the 4.x driver are usually `com.datastax.oss:java-driver-core`; double-check that `org.apache.cassandra:java-driver-core:${versions.cassandra}` is the intended artifact and compatible with the rest of the stack.Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
There was a problem hiding this comment.
Pull request overview
This PR upgrades the Cassandra Java Driver from the outdated and End-of-Life 3.x series to the latest supported 4.x series. The driver has been donated to the Apache Foundation and moved to new Maven coordinates. This upgrade is necessary to allow the parent prestodb/presto project to modernize its testing framework dependencies.
Changes:
- Updated Cassandra Java Driver dependency from DataStax 3.4.0 to Apache 4.19.2
- Migrated from deprecated Cluster/Session API to the new CqlSession API
- Updated Docker Cassandra image from 2.1.15 to 3.11.19 for compatibility
Reviewed changes
Copilot reviewed 3 out of 4 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| build.gradle | Updated Cassandra driver Maven coordinates and version from com.datastax.cassandra:cassandra-driver-core:3.4.0 to org.apache.cassandra:java-driver-core:4.19.2 |
| tempto-examples/docker/docker-compose.yml | Upgraded Cassandra Docker image from 2.1.15 to 3.11.19 to support Driver 4.x requirements |
| tempto-core/src/main/java/io/prestodb/tempto/internal/query/CassandraQueryExecutor.java | Migrated from Cluster/Session to CqlSession API, updated DataType constants, converted metadata APIs to Optional-based pattern, and fixed bug in getJDBCType method |
| tempto-core/src/main/java/io/prestodb/tempto/internal/fulfillment/table/cassandra/CassandraBatchLoader.java | Migrated BatchStatement from mutable to builder pattern, updated session type to CqlSession |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
tempto-core/src/main/java/io/prestodb/tempto/internal/query/CassandraQueryExecutor.java
Outdated
Show resolved
Hide resolved
tempto-core/src/main/java/io/prestodb/tempto/internal/query/CassandraQueryExecutor.java
Outdated
Show resolved
Hide resolved
.../main/java/io/prestodb/tempto/internal/fulfillment/table/cassandra/CassandraBatchLoader.java
Outdated
Show resolved
Hide resolved
tempto-core/src/main/java/io/prestodb/tempto/internal/query/CassandraQueryExecutor.java
Outdated
Show resolved
Hide resolved
.../main/java/io/prestodb/tempto/internal/fulfillment/table/cassandra/CassandraBatchLoader.java
Show resolved
Hide resolved
|
@tdcmeehan Can you please have a look? |
Resolves #297
Hello team 👋🏼
This is my 1st attempt on this project and I'd appreciate if someone could validate if I've followed all the project's guidelines and help approve and merge this enhancement followed by a release that I can use in the parent prestodb/presto project to upgrade Cassandra Java Driver to 4.x in the test framework codebase. Thank you in advance!