pub struct CrossTableSumConstraint { /* private fields */ }Expand description
Cross-table sum constraint for validating that sums from different tables match.
This constraint ensures that aggregated sums from one table match the sums from another table, optionally grouped by common columns. This is essential for validating referential integrity of financial data, inventory tracking, or any scenario where related tables should have consistent totals.
The constraint supports:
- Qualified column names (table.column format)
- GROUP BY columns for validating sums within groups
- Configurable tolerance for floating-point comparisons
- Detailed violation reporting with specific group information
- Performance optimization through efficient SQL generation
Implementations§
Source§impl CrossTableSumConstraint
impl CrossTableSumConstraint
Sourcepub fn new(
left_column: impl Into<String>,
right_column: impl Into<String>,
) -> Self
pub fn new( left_column: impl Into<String>, right_column: impl Into<String>, ) -> Self
Create a new cross-table sum constraint.
§Arguments
left_column- Column specification for left side sum (table.column format)right_column- Column specification for right side sum (table.column format)
§Examples
use term_guard::constraints::CrossTableSumConstraint;
let constraint = CrossTableSumConstraint::new("orders.total", "payments.amount");Sourcepub fn group_by(self, columns: Vec<impl Into<String>>) -> Self
pub fn group_by(self, columns: Vec<impl Into<String>>) -> Self
Set the GROUP BY columns for the comparison.
When specified, sums will be compared within each group rather than as a single total. This is useful for validating consistency at a more granular level.
§Examples
use term_guard::constraints::CrossTableSumConstraint;
let constraint = CrossTableSumConstraint::new("orders.total", "payments.amount")
.group_by(vec!["customer_id", "order_date"]);Sourcepub fn tolerance(self, tolerance: f64) -> Self
pub fn tolerance(self, tolerance: f64) -> Self
Set the tolerance for floating-point comparisons.
When tolerance is greater than 0.0, sums are considered equal if their absolute difference is within the tolerance. This is useful for handling floating-point precision issues.
§Examples
use term_guard::constraints::CrossTableSumConstraint;
let constraint = CrossTableSumConstraint::new("orders.total", "payments.amount")
.tolerance(0.01); // Allow 1 cent differenceSourcepub fn max_violations_reported(self, max_violations: usize) -> Self
pub fn max_violations_reported(self, max_violations: usize) -> Self
Set the maximum number of violation examples to report.
Defaults to 100. Set to 0 to disable violation example collection.
Sourcepub fn left_column(&self) -> &str
pub fn left_column(&self) -> &str
Get the left column specification
Sourcepub fn right_column(&self) -> &str
pub fn right_column(&self) -> &str
Get the right column specification
Sourcepub fn group_by_columns(&self) -> &[String]
pub fn group_by_columns(&self) -> &[String]
Get the group by columns
Trait Implementations§
Source§impl Clone for CrossTableSumConstraint
impl Clone for CrossTableSumConstraint
Source§fn clone(&self) -> CrossTableSumConstraint
fn clone(&self) -> CrossTableSumConstraint
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Constraint for CrossTableSumConstraint
impl Constraint for CrossTableSumConstraint
Source§fn evaluate<'life0, 'life1, 'async_trait>(
&'life0 self,
ctx: &'life1 SessionContext,
) -> Pin<Box<dyn Future<Output = Result<ConstraintResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn evaluate<'life0, 'life1, 'async_trait>(
&'life0 self,
ctx: &'life1 SessionContext,
) -> Pin<Box<dyn Future<Output = Result<ConstraintResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Source§fn column(&self) -> Option<&str>
fn column(&self) -> Option<&str>
Source§fn description(&self) -> Option<&str>
fn description(&self) -> Option<&str>
Source§fn metadata(&self) -> ConstraintMetadata
fn metadata(&self) -> ConstraintMetadata
Source§impl Debug for CrossTableSumConstraint
impl Debug for CrossTableSumConstraint
Source§impl<'de> Deserialize<'de> for CrossTableSumConstraint
impl<'de> Deserialize<'de> for CrossTableSumConstraint
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for CrossTableSumConstraint
impl RefUnwindSafe for CrossTableSumConstraint
impl Send for CrossTableSumConstraint
impl Sync for CrossTableSumConstraint
impl Unpin for CrossTableSumConstraint
impl UnwindSafe for CrossTableSumConstraint
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more