use super::*;
impl MergeWhen {
#[inline]
pub const fn as_sql(self) -> &'static str {
match self {
Self::Matched => "MATCHED",
Self::NotMatched => "NOT MATCHED",
Self::NotMatchedBySource => "NOT MATCHED BY SOURCE",
}
}
}
impl Merge {
pub(crate) fn into(target: impl Into<Source>, using: impl Into<Source>, on: BoolExpr) -> Self {
Self {
ctes: Vec::new(),
target: target.into(),
using: using.into(),
on,
actions: Vec::new(),
returning: Vec::new(),
}
}
#[inline]
pub fn with(mut self, cte: Cte) -> Self {
self.ctes.push(cte);
self
}
#[inline]
pub fn when_matched(self) -> MatchedMergeBuilder {
MatchedMergeBuilder {
merge: self,
condition: None,
}
}
#[inline]
pub fn when_matched_if(self, condition: BoolExpr) -> MatchedMergeBuilder {
MatchedMergeBuilder {
merge: self,
condition: Some(Box::new(condition)),
}
}
#[inline]
pub fn when_not_matched(self) -> NotMatchedMergeBuilder {
NotMatchedMergeBuilder {
merge: self,
condition: None,
}
}
#[inline]
pub fn when_not_matched_if(self, condition: BoolExpr) -> NotMatchedMergeBuilder {
NotMatchedMergeBuilder {
merge: self,
condition: Some(Box::new(condition)),
}
}
#[inline]
pub fn when_not_matched_by_source(self) -> NotMatchedBySourceMergeBuilder {
NotMatchedBySourceMergeBuilder {
merge: self,
condition: None,
}
}
#[inline]
pub fn when_not_matched_by_source_if(
self,
condition: BoolExpr,
) -> NotMatchedBySourceMergeBuilder {
NotMatchedBySourceMergeBuilder {
merge: self,
condition: Some(Box::new(condition)),
}
}
pub fn returning(mut self, fields: impl IntoColumns) -> Self {
self.returning.extend(fields.into_columns().items);
self
}
pub fn returning_as(mut self, expr: impl Into<ValueExpr>, alias: impl Into<String>) -> Self {
self.returning.push(SelectItem {
expr: expr.into(),
alias: Some(alias.into()),
});
self
}
#[inline]
pub fn returning_all(mut self) -> Self {
self.returning.clear();
push_returning_fields(&self.target, &mut self.returning);
self
}
}
impl MatchedMergeBuilder {
pub fn update(self, assignments: impl IntoAssignments) -> Merge {
finish_merge_action(
self.merge,
MergeAction::Update {
when: MergeWhen::Matched,
condition: self.condition,
assignments: normalized_assignments(assignments),
},
)
}
#[inline]
pub fn delete(self) -> Merge {
finish_merge_action(
self.merge,
MergeAction::Delete {
when: MergeWhen::Matched,
condition: self.condition,
},
)
}
#[inline]
pub fn do_nothing(self) -> Merge {
finish_merge_action(
self.merge,
MergeAction::DoNothing {
when: MergeWhen::Matched,
condition: self.condition,
},
)
}
}
impl NotMatchedMergeBuilder {
pub fn insert(self, assignments: impl IntoAssignments) -> Merge {
finish_merge_action(
self.merge,
MergeAction::Insert {
when: MergeWhen::NotMatched,
condition: self.condition,
assignments: normalized_assignments(assignments),
},
)
}
#[inline]
pub fn do_nothing(self) -> Merge {
finish_merge_action(
self.merge,
MergeAction::DoNothing {
when: MergeWhen::NotMatched,
condition: self.condition,
},
)
}
}
impl NotMatchedBySourceMergeBuilder {
pub fn update(self, assignments: impl IntoAssignments) -> Merge {
finish_merge_action(
self.merge,
MergeAction::Update {
when: MergeWhen::NotMatchedBySource,
condition: self.condition,
assignments: normalized_assignments(assignments),
},
)
}
#[inline]
pub fn delete(self) -> Merge {
finish_merge_action(
self.merge,
MergeAction::Delete {
when: MergeWhen::NotMatchedBySource,
condition: self.condition,
},
)
}
#[inline]
pub fn do_nothing(self) -> Merge {
finish_merge_action(
self.merge,
MergeAction::DoNothing {
when: MergeWhen::NotMatchedBySource,
condition: self.condition,
},
)
}
}
fn finish_merge_action(mut merge: Merge, action: MergeAction) -> Merge {
merge.actions.push(action);
merge
}
impl From<Merge> for Stmt {
fn from(stmt: Merge) -> Self {
Self::Merge(Box::new(stmt))
}
}