/// <summary> /// Performs analysis and returns a list of problems detected /// </summary> /// <param name="ruleExecutionContext">Contains the schema model and model element to analyze</param> /// <returns> /// The problems detected by the rule in the given element /// </returns> public override IList <SqlRuleProblem> Analyze(SqlRuleExecutionContext ruleExecutionContext) { var problems = new List <SqlRuleProblem>(); var sqlObj = ruleExecutionContext.ModelElement; if (sqlObj == null || sqlObj.IsWhiteListed()) { return(problems); } var fragment = ruleExecutionContext.ScriptFragment.GetFragment(ProgrammingSchemaTypes); var ifVisitor = new IfStatementVisitor(); fragment.Accept(ifVisitor); if (ifVisitor.Count == 0) { return(problems); } foreach (var ifstmt in ifVisitor.Statements) { var functionVisitor = new FunctionCallVisitor("count"); ifstmt.Predicate.Accept(functionVisitor); if (functionVisitor.Statements.Any() && CheckIf(ifstmt)) { problems.Add(new SqlRuleProblem(Message, sqlObj, ifstmt)); } } return(problems); }
/// <summary> /// Performs analysis and returns a list of problems detected /// </summary> /// <param name="ruleExecutionContext">Contains the schema model and model element to analyze</param> /// <returns> /// The problems detected by the rule in the given element /// </returns> public override IList <SqlRuleProblem> Analyze(SqlRuleExecutionContext ruleExecutionContext) { var problems = new List <SqlRuleProblem>(); var sqlObj = ruleExecutionContext.ModelElement; if (sqlObj == null) { return(problems); } var fragment = ruleExecutionContext.ScriptFragment.GetFragment(typeof(CreateProcedureStatement)); IfStatementVisitor ifVisitor = new IfStatementVisitor(); fragment.Accept(ifVisitor); if (!ifVisitor.Statements.Any()) { return(problems); } foreach (var ifStatement in ifVisitor.NotIgnoredStatements(RuleId)) { var tableVisitor = new NamedTableReferenceVisitor() { TypeFilter = ObjectTypeFilter.PermanentOnly }; ifStatement.ThenStatement?.Accept(tableVisitor); ifStatement.ElseStatement?.Accept(tableVisitor); problems.AddRange(tableVisitor.Statements.Select(s => new SqlRuleProblem(Message, sqlObj, s))); } return(problems); }