use crate::conditions::collections::CollectionOperator;
use crate::conditions::{BinaryOperator, Condition, Value};
use crate::internal::query_context::flat_conditions::FlatCondition;
use crate::internal::query_context::ConditionBuilder;
#[derive(Clone, Debug)]
pub struct In<A, B> {
pub operator: InOperator,
pub fst_arg: A,
pub snd_arg: Vec<B>,
}
#[derive(Copy, Clone, Debug)]
pub enum InOperator {
In,
NotIn,
}
impl<'a, A, B> Condition<'a> for In<A, B>
where
A: Condition<'a>,
B: Condition<'a>,
{
fn build(&self, mut builder: ConditionBuilder<'_, 'a>) {
let bool_fallback;
let collection_operator;
let binary_operator;
match self.operator {
InOperator::In => {
bool_fallback = false;
collection_operator = CollectionOperator::Or;
binary_operator = BinaryOperator::Equals;
}
InOperator::NotIn => {
bool_fallback = true;
collection_operator = CollectionOperator::And;
binary_operator = BinaryOperator::NotEquals;
}
}
if self.snd_arg.is_empty() {
Value::Bool(bool_fallback).build(builder);
} else {
builder.push_condition(FlatCondition::StartCollection(collection_operator));
for snd_arg in self.snd_arg.iter() {
builder.push_condition(FlatCondition::BinaryCondition(binary_operator));
self.fst_arg.build(builder.reborrow());
snd_arg.build(builder.reborrow());
}
builder.push_condition(FlatCondition::EndCollection);
}
}
}