use serde_json::Value;
use crate::parser::query_builder::{
Condition, ConditionOperator, build_array_clause, build_in_clause, build_is_clause,
create_placeholder_clause,
};
pub(crate) fn format_condition_clause(
column: &str,
condition: &Condition,
idx: &mut usize,
values: &mut Vec<Value>,
) -> Option<String> {
let clause: String = match condition.operator {
ConditionOperator::Eq => create_placeholder_clause(
column,
idx,
values,
condition,
condition.values.first()?,
"=",
)?,
ConditionOperator::Neq => create_placeholder_clause(
column,
idx,
values,
condition,
condition.values.first()?,
"<>",
)?,
ConditionOperator::Gt => create_placeholder_clause(
column,
idx,
values,
condition,
condition.values.first()?,
">",
)?,
ConditionOperator::Gte => create_placeholder_clause(
column,
idx,
values,
condition,
condition.values.first()?,
">=",
)?,
ConditionOperator::Lt => create_placeholder_clause(
column,
idx,
values,
condition,
condition.values.first()?,
"<",
)?,
ConditionOperator::Lte => create_placeholder_clause(
column,
idx,
values,
condition,
condition.values.first()?,
"<=",
)?,
ConditionOperator::Like => create_placeholder_clause(
column,
idx,
values,
condition,
condition.values.first()?,
"LIKE",
)?,
ConditionOperator::ILike => create_placeholder_clause(
column,
idx,
values,
condition,
condition.values.first()?,
"ILIKE",
)?,
ConditionOperator::Is => build_is_clause(column, condition, idx, values)?,
ConditionOperator::In => build_in_clause(column, condition, idx, values)?,
ConditionOperator::Contains => build_array_clause(column, condition, idx, values, "@>")?,
ConditionOperator::Contained => build_array_clause(column, condition, idx, values, "<@")?,
};
let clause = if condition.negated {
format!("NOT ({})", clause)
} else {
clause
};
Some(clause)
}