/// <summary> /// Parse dynamic tags /// </summary> /// <param name="statementConfig">The statement config.</param> /// <param name="dynamic">The dynamic.</param> /// <param name="sqlBuffer">The SQL buffer.</param> /// <param name="isDynamic">if set to <c>true</c> [is dynamic].</param> /// <param name="postParseRequired">if set to <c>true</c> [post parse required].</param> /// <param name="statement">The statement.</param> /// <returns></returns> private bool ParseDynamicTags( IConfiguration statementConfig, IDynamicParent dynamic, StringBuilder sqlBuffer, bool isDynamic, bool postParseRequired, IStatement statement) { ConfigurationCollection children = statementConfig.Children; int count = children.Count; for (int i = 0; i < count; i++) { IConfiguration child = children[i]; if (child.Type == ConfigConstants.ELEMENT_TEXT || child.Type == ConfigConstants.ELEMENT_CDATA) { string childValueString = child.Value; if (statement.PreserveWhitespace) { childValueString = childValueString .Replace('\n', ' ') .Replace('\r', ' ') .Replace('\t', ' ') .Trim(); } SqlText sqlText = null; if (postParseRequired) { sqlText = new SqlText(); sqlText.Text = childValueString; } else { sqlText = InlineParameterMapParser.ParseInlineParameterMap(modelStore.DataExchangeFactory, statementConfig.Id, null, childValueString); } dynamic.AddChild(sqlText); sqlBuffer.Append(" " + childValueString); } else if (child.Type == ConfigConstants.ELEMENT_SELECTKEY || child.Type == ConfigConstants.ELEMENT_INCLUDE) { } else { IDeSerializer serializer = deSerializerFactory.GetDeSerializer(child.Type); if (serializer != null) { isDynamic = true; SqlTag tag; tag = serializer.Deserialize(child); dynamic.AddChild(tag); if (child.Children.Count > 0) { isDynamic = ParseDynamicTags(child, tag, sqlBuffer, isDynamic, tag.Handler.IsPostParseRequired, statement); } } } } return(isDynamic); }
/// <summary> /// Parse dynamic tags /// </summary> /// <param name="statementConfig">The statement config.</param> /// <param name="dynamic">The dynamic.</param> /// <param name="sqlBuffer">The SQL buffer.</param> /// <param name="isDynamic">if set to <c>true</c> [is dynamic].</param> /// <param name="postParseRequired">if set to <c>true</c> [post parse required].</param> /// <param name="statement">The statement.</param> /// <returns></returns> private bool ParseDynamicTags( IConfiguration statementConfig, IDynamicParent dynamic, StringBuilder sqlBuffer, bool isDynamic, bool postParseRequired, IStatement statement) { //具体文本的集合 可能是需要拼接成完整的SQL语句 ConfigurationCollection children = statementConfig.Children; int count = children.Count; for (int i = 0; i < count; i++) { IConfiguration child = children[i]; if (child.Type == ConfigConstants.ELEMENT_TEXT || child.Type == ConfigConstants.ELEMENT_CDATA) { //第一步处理 获取当前文本的一个值 并处理"\r\n" string childValueString = child.Value; if (statement.PreserveWhitespace) { childValueString = childValueString.Replace('\n', ' ').Replace('\r', ' ').Replace('\t', ' ').Trim(); } //第二部处理 将处理的当前一个部分SQL语句放入到SqlText类中 SqlText sqlText = null; if (postParseRequired) { sqlText = new SqlText(); sqlText.Text = childValueString; } else { //分析SQL语句中的参数 例如# # ,@{}等内部参数 最后的结果是一个语句保存 和 参数列表在SqlText类中 sqlText = InlineParameterMapParser.ParseInlineParameterMap(modelStore.DataExchangeFactory, statementConfig.Id, null, childValueString); } //将此次分析的SQL语句结果保存到dynamic类对象中 可能需要添加多次 dynamic.AddChild(sqlText);//按顺序放置 最后拼接即可 //sqlBuffer字符串拼接每一部分的sql语句 最后是当前节点的完整语句 sqlBuffer.Append(" " + childValueString); } else if (child.Type == ConfigConstants.ELEMENT_SELECTKEY || child.Type == ConfigConstants.ELEMENT_INCLUDE) { //此处没有处理代码 } else { //从deSerializerFactory工厂类的字典serializerMap中获取对应的处理IDeSerializer类 IDeSerializer serializer = deSerializerFactory.GetDeSerializer(child.Type);//child.Type就是节点的名 if (serializer != null) { isDynamic = true; SqlTag tag; //当前child是一个element 进行解析 tag = serializer.Deserialize(child); //添加到IList<ISqlChild> children中 dynamic.AddChild(tag); if (child.Children.Count > 0) { //递归处理子节点 注意是子节点Tag了 递归下去 但sqlBuffer字符串一直是同一个 isDynamic = ParseDynamicTags(child, tag, sqlBuffer, isDynamic, tag.Handler.IsPostParseRequired, statement); } } } } return(isDynamic); }