use super::*;
pub(super) fn extend_assignments(assignments: &mut Vec<Assignment>, next: Vec<Assignment>) {
for assignment in next {
push_assignment(assignments, assignment);
}
}
pub(super) fn push_column(columns: &mut Vec<Meta>, field: Meta) {
if !columns.iter().any(|existing| existing.db == field.db) {
columns.push(field);
}
}
pub(super) fn push_assignment(assignments: &mut Vec<Assignment>, assignment: Assignment) {
assignments.retain(|existing| existing.field.db != assignment.field.db);
assignments.push(assignment);
}
pub(super) fn select_item_for_field<T>(field: Field<T>) -> SelectItem {
let alias = field_alias(field.meta);
SelectItem {
expr: field.expr(),
alias,
}
}
pub(super) fn select_item_for_ref<T>(field: FieldRef<T>) -> SelectItem {
let alias = field_ref_alias(&field);
SelectItem {
expr: field.expr(),
alias,
}
}
pub(super) fn select_item_for_meta(meta: Meta) -> SelectItem {
let alias = field_alias(&meta);
SelectItem {
expr: ValueExpr::field(meta, None),
alias,
}
}
pub(super) fn select_item_for_source_meta(meta: Meta, qualifier: Option<&str>) -> SelectItem {
let alias = field_alias(&meta);
SelectItem {
expr: ValueExpr::field(meta, qualifier.map(str::to_owned)),
alias,
}
}
pub(super) fn push_all_source_fields(source: &Source, items: &mut Vec<SelectItem>) {
source.for_each_field(|meta| items.push(select_item_for_meta(*meta)));
}
pub(super) fn push_default_source_fields(source: &Source, items: &mut Vec<SelectItem>) {
let qualifier = source.explicit_alias();
source.for_each_field(|meta| items.push(select_item_for_source_meta(*meta, qualifier)));
}
pub(super) fn field_alias(meta: &Meta) -> Option<String> {
(meta.api != meta.db).then(|| meta.api.to_owned())
}
pub(super) fn field_ref_alias<T>(field: &FieldRef<T>) -> Option<String> {
match &field.qualifier {
Some(qualifier) => Some(format!("{qualifier}_{}", field.meta.api)),
None => field_alias(field.meta),
}
}