use crate::errors::{ErrorKind, Result};
use crate::query::Filter;
use crate::Bins;
use crate::Value;
#[derive(Clone)]
pub struct Aggregation {
pub package_name: String,
pub function_name: String,
pub function_args: Option<Vec<Value>>,
}
pub struct Statement {
pub namespace: String,
pub set_name: String,
pub index_name: Option<String>,
pub bins: Bins,
pub filters: Option<Vec<Filter>>,
pub aggregation: Option<Aggregation>,
}
impl Statement {
pub fn new(namespace: &str, set_name: &str, bins: Bins) -> Self {
Statement {
namespace: namespace.to_owned(),
set_name: set_name.to_owned(),
bins,
index_name: None,
aggregation: None,
filters: None,
}
}
pub fn add_filter(&mut self, filter: Filter) {
if let Some(ref mut filters) = self.filters {
filters.push(filter);
} else {
let mut filters = vec![];
filters.push(filter);
self.filters = Some(filters);
}
}
pub fn set_aggregate_function(
&mut self,
package_name: &str,
function_name: &str,
function_args: Option<&[Value]>,
) {
let agg = Aggregation {
package_name: package_name.to_owned(),
function_name: function_name.to_owned(),
function_args: match function_args {
Some(args) => Some(args.to_vec()),
None => None,
},
};
self.aggregation = Some(agg);
}
#[doc(hidden)]
pub fn is_scan(&self) -> bool {
match self.filters {
Some(ref filters) => filters.is_empty(),
None => true,
}
}
#[doc(hidden)]
pub fn validate(&self) -> Result<()> {
if let Some(ref filters) = self.filters {
if filters.len() > 1 {
bail!(ErrorKind::InvalidArgument(
"Too many filter expressions".to_string()
));
}
}
if self.set_name.is_empty() {
bail!(ErrorKind::InvalidArgument("Empty set name".to_string()));
}
if let Some(ref index_name) = self.index_name {
if index_name.is_empty() {
bail!(ErrorKind::InvalidArgument("Empty index name".to_string()));
}
}
if let Some(ref agg) = self.aggregation {
if agg.package_name.is_empty() {
bail!(ErrorKind::InvalidArgument(
"Empty UDF package name".to_string()
));
}
if agg.function_name.is_empty() {
bail!(ErrorKind::InvalidArgument(
"Empty UDF function name".to_string()
));
}
}
Ok(())
}
}