use crate::statement::{prepared_statement::PreparedStatement, query::Query};
use crate::transport::retry_policy::RetryPolicy;
use super::StatementConfig;
pub use super::{Consistency, SerialConsistency};
pub use crate::frame::request::batch::BatchType;
/// CQL batch statement.
///
/// This represents a CQL batch that can be executed on a server.
#[derive(Clone)]
pub struct Batch {
pub(crate) config: StatementConfig,
pub statements: Vec<BatchStatement>,
batch_type: BatchType,
}
impl Batch {
/// Creates a new, empty `Batch` of `batch_type` type.
pub fn new(batch_type: BatchType) -> Self {
Self {
batch_type,
..Default::default()
}
}
/// Creates a new, empty `Batch` of `batch_type` type with the provided statements.
pub fn new_with_statements(batch_type: BatchType, statements: Vec<BatchStatement>) -> Self {
Self {
batch_type,
statements,
..Default::default()
}
}
/// Appends a new statement to the batch.
pub fn append_statement(&mut self, statement: impl Into<BatchStatement>) {
self.statements.push(statement.into());
}
/// Gets type of batch.
pub fn get_type(&self) -> BatchType {
self.batch_type
}
/// Sets the consistency to be used when executing this batch.
pub fn set_consistency(&mut self, c: Consistency) {
self.config.consistency = Some(c);
}
/// Gets the consistency to be used when executing this batch if it is filled.
/// If this is empty, the default_consistency of the session will be used.
pub fn get_consistency(&self) -> Option<Consistency> {
self.config.consistency
}
/// Sets the serial consistency to be used when executing this batch.
/// (Ignored unless the batch is an LWT)
pub fn set_serial_consistency(&mut self, sc: Option<SerialConsistency>) {
self.config.serial_consistency = sc;
}
/// Gets the serial consistency to be used when executing this batch.
/// (Ignored unless the batch is an LWT)
pub fn get_serial_consistency(&self) -> Option<SerialConsistency> {
self.config.serial_consistency
}
/// Sets the idempotence of this batch
/// A query is idempotent if it can be applied multiple times without changing the result of the initial application
/// If set to `true` we can be sure that it is idempotent
/// If set to `false` it is unknown whether it is idempotent
/// This is used in [`RetryPolicy`] to decide if retrying a query is safe
pub fn set_is_idempotent(&mut self, is_idempotent: bool) {
self.config.is_idempotent = is_idempotent;
}
/// Gets the idempotence of this batch
pub fn get_is_idempotent(&self) -> bool {
self.config.is_idempotent
}
/// Sets a custom [`RetryPolicy`] to be used with this batch
/// By default Session's retry policy is used, this allows to use a custom retry policy
pub fn set_retry_policy(&mut self, retry_policy: Box<dyn RetryPolicy>) {
self.config.retry_policy = Some(retry_policy);
}
/// Gets custom [`RetryPolicy`] used by this batch
pub fn get_retry_policy(&self) -> &Option<Box<dyn RetryPolicy>> {
&self.config.retry_policy
}
/// Enable or disable CQL Tracing for this batch
/// If enabled session.batch() will return a BatchResult containing tracing_id
/// which can be used to query tracing information about the execution of this query
pub fn set_tracing(&mut self, should_trace: bool) {
self.config.tracing = should_trace;
}
/// Gets whether tracing is enabled for this batch
pub fn get_tracing(&self) -> bool {
self.config.tracing
}
/// Sets the default timestamp for this batch in microseconds.
/// If not None, it will replace the server side assigned timestamp as default timestamp for
/// all the statements contained in the batch.
pub fn set_timestamp(&mut self, timestamp: Option<i64>) {
self.config.timestamp = timestamp
}
/// Gets the default timestamp for this batch in microseconds.
pub fn get_timestamp(&self) -> Option<i64> {
self.config.timestamp
}
}
impl Default for Batch {
fn default() -> Self {
Self {
statements: Vec::new(),
batch_type: BatchType::Logged,
config: Default::default(),
}
}
}
/// This enum represents a CQL statement, that can be part of batch.
#[derive(Clone)]
pub enum BatchStatement {
Query(Query),
PreparedStatement(PreparedStatement),
}
impl From<&str> for BatchStatement {
fn from(s: &str) -> Self {
BatchStatement::Query(Query::from(s))
}
}
impl From<Query> for BatchStatement {
fn from(q: Query) -> Self {
BatchStatement::Query(q)
}
}
impl From<PreparedStatement> for BatchStatement {
fn from(p: PreparedStatement) -> Self {
BatchStatement::PreparedStatement(p)
}
}