use crate::expressions::Expression;
use crate::policy::{BasePolicy, Policy, PolicyLike, QueryDuration, Replica, StreamPolicy};
use aerospike_rt::time::{Duration, Instant};
#[derive(Debug, Clone)]
pub struct QueryPolicy {
pub base_policy: BasePolicy,
pub max_concurrent_nodes: usize,
pub max_records: u64,
pub record_queue_size: usize,
pub records_per_second: u32,
pub expected_duration: QueryDuration,
pub include_bin_data: bool,
pub replica: Replica,
}
impl QueryPolicy {
pub fn new() -> Self {
QueryPolicy::default()
}
pub const fn filter_expression(&self) -> &Option<Expression> {
&self.base_policy.filter_expression
}
}
impl Default for QueryPolicy {
fn default() -> Self {
let mut res = QueryPolicy {
base_policy: BasePolicy::default(),
max_concurrent_nodes: 0,
max_records: 0,
records_per_second: 0,
record_queue_size: 1024,
expected_duration: QueryDuration::Long,
include_bin_data: true,
replica: Replica::default(),
};
res.base_policy.total_timeout = 0;
res.base_policy.max_retries = 5;
res
}
}
impl PolicyLike for QueryPolicy {
fn base(&self) -> &BasePolicy {
&self.base_policy
}
}
impl StreamPolicy for &QueryPolicy {
fn max_records(&self) -> Option<u64> {
if self.max_records > 0 {
Some(self.max_records)
} else {
None
}
}
fn sleep_between_retries(&self) -> Option<Duration> {
self.base_policy.sleep_between_retries()
}
fn deadline(&self) -> Option<Instant> {
self.base_policy.deadline()
}
fn socket_timeout(&self) -> u32 {
self.base_policy.socket_timeout()
}
fn total_timeout(&self) -> u32 {
self.base_policy.total_timeout
}
fn replica(&self) -> crate::policy::Replica {
self.replica
}
fn max_retries(&self) -> usize {
self.base_policy.max_retries
}
}