/// <summary> /// Validate the constraint expression. /// </summary> /// <param name="bundle">Model to validate.</param> /// <param name="theContext">Validation context to capture the errors.</param> /// <returns> /// Return true if the constraint is valid, return false if /// the constraint is not valid. /// </returns> public override bool Validate(BundleModel bundle, ModelValidationContext theContext) { if (Expression.Node == null) { return(false); } var variableCaptureVisitor = new ConstraintVariableReferenceCaptureVisitor(); Expression.Node.AcceptVisitor(variableCaptureVisitor); var variableReferences = variableCaptureVisitor.GetReferences(); foreach (var singletonVariableReference in variableReferences.SingletonVariableReferences) { if (bundle.Variables.FirstOrDefault(_ => _.Name.IsEqualTo(singletonVariableReference.VariableName)) == null) { theContext.AddError($"Missing singleton variable {singletonVariableReference.VariableName}"); return(false); } } foreach (var aggregateVariableReference in variableReferences.AggregateVariableReferences) { if (bundle.Aggregates.FirstOrDefault(_ => _.Name.IsEqualTo(aggregateVariableReference.VariableName)) == null) { theContext.AddError($"Missing aggregate variable {aggregateVariableReference.VariableName}"); return(false); } } return(true); }