use rusqlite::types::Value;
use crate::rusqlite::AssemblyContext;
use crate::rusqlite::InvertableRusqliteQuery;
use crate::rusqlite::RusqliteQuery;
use crate::sql::Field;
pub trait ToRusqliteSingleField<F: Field> {
fn get_sql_where(&self, field_name: &str) -> String;
fn get_inverted_sql_where(&self, _field_name: &str) -> Option<String> {
None
}
fn get_where_values(&self, is_inverted: bool) -> Vec<Value>;
fn assemble_query(
&self,
assembly_context: &AssemblyContext,
field: &F,
) -> InvertableRusqliteQuery<F> {
let full_field_name = field.sql_safe_prefixed_field_name(assembly_context.prefix());
let where_clause = if assembly_context.is_branch_inverted() {
self.get_inverted_sql_where(&full_field_name)
} else {
None
};
let is_inverted = where_clause.is_some();
let where_clause = if let Some(where_clause) = where_clause {
where_clause
} else {
self.get_sql_where(&full_field_name)
};
RusqliteQuery {
used_prefix: assembly_context.prefix().to_string(),
sql_where_clause: where_clause,
where_values: self.get_where_values(is_inverted),
sql_joins: Vec::new(),
}
.as_invertable()
.invert_if(is_inverted)
}
}