use std::time::Duration;
use crate::{FieldPath, Value};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Record {
pub key: Vec<u8>,
pub value: Value,
}
impl Record {
pub fn new(key: impl Into<Vec<u8>>, value: Value) -> Self {
Self {
key: key.into(),
value,
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum CompareOperator {
Equal,
NotEqual,
Less,
LessOrEqual,
Greater,
GreaterOrEqual,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Filter {
MatchAll,
Exists(FieldPath),
Compare {
path: FieldPath,
operator: CompareOperator,
value: Value,
},
Prefix {
path: FieldPath,
prefix: Value,
},
Contains {
path: FieldPath,
needle: Value,
},
All(Vec<Self>),
Any(Vec<Self>),
Not(Box<Self>),
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum SortDirection {
Ascending,
Descending,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum NullPlacement {
First,
Last,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct SortField {
pub path: FieldPath,
pub direction: SortDirection,
pub nulls: NullPlacement,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Cursor {
pub sort_values: Vec<Option<Value>>,
pub key: Vec<u8>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Metric {
Count,
Sum(FieldPath),
Min(FieldPath),
Max(FieldPath),
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct NamedMetric {
pub name: String,
pub metric: Metric,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct AggregationPlan {
pub group_by: Vec<FieldPath>,
pub metrics: Vec<NamedMetric>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Query {
pub filter: Filter,
pub sort: Vec<SortField>,
pub cursor: Option<Cursor>,
pub limit: usize,
pub aggregation: Option<AggregationPlan>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ExecutionLimits {
pub max_scanned_records: u64,
pub max_matched_records: u64,
pub max_returned_records: usize,
pub max_groups: usize,
pub max_filter_nodes: usize,
pub max_filter_depth: usize,
pub max_sort_fields: usize,
pub max_group_fields: usize,
pub max_metrics: usize,
pub timeout: Duration,
}
impl Default for ExecutionLimits {
fn default() -> Self {
Self {
max_scanned_records: 1_000_000,
max_matched_records: 100_000,
max_returned_records: 1_000,
max_groups: 10_000,
max_filter_nodes: 256,
max_filter_depth: 64,
max_sort_fields: 16,
max_group_fields: 8,
max_metrics: 32,
timeout: Duration::from_secs(30),
}
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum MetricValue {
Count(u64),
Integer(Option<i128>),
Value(Option<Value>),
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct NamedMetricValue {
pub name: String,
pub value: MetricValue,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct GroupResult {
pub key: Vec<Option<Value>>,
pub metrics: Vec<NamedMetricValue>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct AggregationResult {
pub grouped: bool,
pub groups: Vec<GroupResult>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct QueryResult {
pub rows: Vec<Record>,
pub next_cursor: Option<Cursor>,
pub aggregation: Option<AggregationResult>,
pub scanned_records: u64,
pub matched_records: u64,
}