public object GetMemberComparePropertyValue(SqlTagContext ctx, Conditional tag, object parameterObject) { if (ctx == null) { throw new ArgumentNullException("ctx"); } if (tag == null) { throw new ArgumentNullException("tag"); } return(GetMemberValue(ctx, tag, tag.CompareProperty, parameterObject)); }
/// <summary> /// 完成动态SQL语句中子语句的拼接 和 参数信息的取出 /// </summary> /// <param name="request"></param> /// <param name="parameterObject"></param> /// <returns></returns> private string Process(RequestScope request, object parameterObject) { SqlTagContext ctx = new SqlTagContext(); IList <ISqlChild> localChildren = children; ProcessBodyChildren(request, ctx, parameterObject, localChildren); #region 所有参数对应的属性类的集合信息放入到ParameterMap中 // Builds a 'dynamic' ParameterMap ParameterMap parameterMap = new ParameterMap( statement.Id + "-InlineParameterMap", statement.ParameterClass.FullName, string.Empty, statement.ParameterClass, dataExchangeFactory.GetDataExchangeForClass(null), usePositionalParameters); // Adds 'dynamic' ParameterProperty IList parameters = ctx.GetParameterMappings(); int count = parameters.Count; for (int i = 0; i < count; i++) { parameterMap.AddParameterProperty((ParameterProperty)parameters[i]); } request.ParameterMap = parameterMap; #endregion #region 完整的SQL语句 string dynSql = ctx.BodyText; if (statement is Procedure) { dynSql = dynSql.Replace(MARK_TOKEN, string.Empty).Replace(COMMA_TOKEN, string.Empty).Trim(); } // Processes $substitutions$ after DynamicSql if (SimpleDynamicSql.IsSimpleDynamicSql(dynSql)) { dynSql = new SimpleDynamicSql( dataExchangeFactory, dbHelperParameterCache, dynSql, statement).GetSql(parameterObject); } #endregion return(dynSql); }
private IterateContext FindParentIteratorContext(SqlTagContext ctx, BaseTag tag) { if (tag.Parent is Iterate) { return(ctx.GetAttribute(tag.Parent) as IterateContext); } var parentBaseTag = tag.Parent as BaseTag; if (tag.Parent == null || parentBaseTag == null) { return(null); } return(FindParentIteratorContext(ctx, parentBaseTag)); }
private static Iterate FindParentIteratorTag(SqlTagContext ctx, BaseTag tag) { if (tag.Parent is Iterate) { return(tag.Parent as Iterate); } var parentBaseTag = tag.Parent as BaseTag; if (tag.Parent == null || parentBaseTag == null) { return(null); } return(FindParentIteratorTag(ctx, parentBaseTag)); }
public object GetMemberValue(SqlTagContext ctx, BaseTag tag, string propertyName, object parameterObject) { var iteratorContext = FindParentIteratorContext(ctx, tag); if (iteratorContext != null) { var indexOfIndexer = propertyName.IndexOf(ReflectionMapper.THIS_ENUMERATOR_PLACEHOLDER); if (indexOfIndexer == 0) { parameterObject = iteratorContext.Current; propertyName = propertyName.Substring(indexOfIndexer + ReflectionMapper.THIS_ENUMERATOR_PLACEHOLDER.Length); } } return(ObjectProbe.GetMemberValue(parameterObject, propertyName, _accessorFactory)); }
public DynamicSqlTextTokenHandler(SqlTagContext ctx, SqlText sqlText) { if (ctx == null) { throw new ArgumentNullException("ctx"); } if (sqlText == null) { throw new ArgumentNullException("sqlText"); } _ctx = ctx; _sqlText = sqlText; KeepSurroundingToken = true; }
internal void ApplyIteratePropertyReferenceHandling(SqlTagContext ctx, SqlText sqlText) { if (ctx == null) { throw new ArgumentNullException("ctx"); } if (sqlText == null) { throw new ArgumentNullException("sqlText"); } if (_propertyPlaceholder != null) { var parsedPropertyName = ReflectionMapper.GetReflectedFullName(ctx, sqlText, this._propertyPlaceholder); this._currentPropertyName = parsedPropertyName; } }
/// <summary> /// /// </summary> /// <param name="request"></param> /// <param name="parameterObject"></param> /// <returns></returns> private string Process(RequestScope request, object parameterObject) { SqlTagContext ctx = new SqlTagContext(); IList <ISqlChild> localChildren = children; ProcessBodyChildren(request, ctx, parameterObject, localChildren); // Builds a 'dynamic' ParameterMap ParameterMap parameterMap = new ParameterMap( statement.Id + "-InlineParameterMap", statement.ParameterClass.FullName, string.Empty, statement.ParameterClass, dataExchangeFactory.GetDataExchangeForClass(null), usePositionalParameters); // Adds 'dynamic' ParameterProperty var parameters = ctx.GetParameterMappings(); parameterMap.AddParameterProperties(parameters); request.ParameterMap = parameterMap; string dynSql = ctx.BodyText; if (statement is Procedure) { dynSql = dynSql.Replace(MARK_TOKEN, string.Empty).Replace(COMMA_TOKEN, string.Empty).Trim(); } // Processes $substitutions$ after DynamicSql if (SimpleDynamicSql.IsSimpleDynamicSql(dynSql)) { dynSql = new SimpleDynamicSql( dataExchangeFactory, dbHelperParameterCache, dynSql, statement).GetSql(parameterObject); } return(dynSql); }
public static bool ReplacePropertyIndexerWithFullName(SqlTagContext ctx, BaseTag tag, StringBuilder bodyContent) { if (ctx == null) { throw new ArgumentNullException("ctx"); } if (tag == null) { throw new ArgumentNullException("tag"); } if (bodyContent == null) { throw new ArgumentNullException("bodyContent"); } string propertyName = tag.Property; if (propertyName == null) { propertyName = String.Empty; } if (propertyName.StartsWith(THIS_ENUMERATOR_PLACEHOLDER)) { var builtPropertyName = GetReflectedFullName(ctx, tag, propertyName); var suffix = String.Empty; // if the property name is just the current item reference, then do not suffix the property name with a "." if (propertyName != THIS_ENUMERATOR_PLACEHOLDER) { suffix = "."; } StringHandler.Replace(bodyContent, THIS_ENUMERATOR_PLACEHOLDER, builtPropertyName + suffix); return(true); } return(false); }
/// <summary> /// /// </summary> /// <param name="request"></param> /// <param name="parameterObject"></param> /// <returns></returns> private string Process(RequestScope request, object parameterObject) { SqlTagContext ctx = new SqlTagContext(); IList localChildren = _children; ProcessBodyChildren(request, ctx, parameterObject, localChildren); // Builds a 'dynamic' ParameterMap ParameterMap parameterMap = new ParameterMap( _statement.Id + "-InlineParameterMap", _statement.ParameterClass.FullName, string.Empty, _statement.ParameterClass, request.DataExchangeFactory.GetDataExchangeForClass(_statement.ParameterClass), _usePositionalParameters); //parameterMap.Id = _statement.Id + "-InlineParameterMap"; //parameterMap.Initialize(_usePositionalParameters, request); //parameterMap.Class = _statement.ParameterClass; // Adds 'dynamic' ParameterProperty IList parameters = ctx.GetParameterMappings(); int count = parameters.Count; for (int i = 0; i < count; i++) { parameterMap.AddParameterProperty((ParameterProperty)parameters[i]); } request.ParameterMap = parameterMap; string dynSql = ctx.BodyText; // Processes $substitutions$ after DynamicSql if (SimpleDynamicSql.IsSimpleDynamicSql(dynSql)) { dynSql = new SimpleDynamicSql(request, dynSql, _statement).GetSql(parameterObject); } return(dynSql); }
public static string GetReflectedFullName(SqlTagContext ctx, SqlText sqlText, string propertyName) { if (ctx == null) { throw new ArgumentNullException("ctx"); } if (sqlText == null) { throw new ArgumentNullException("sqlText"); } if (propertyName == null) { throw new ArgumentNullException("propertyName"); } if (sqlText.Parent == null) { return(propertyName); } if (sqlText.Parent is Iterate) { return(BuildReflectedFullName(ctx, (Iterate)sqlText.Parent, propertyName)); } if (sqlText.Parent is BaseTag) { var parentIteratorTag = FindParentIteratorTag(ctx, (BaseTag)sqlText.Parent); // is current node a child of another iterate node? if (parentIteratorTag != null) { return(BuildReflectedFullName(ctx, parentIteratorTag, propertyName)); } } return(propertyName); }
/// <summary> /// Processes the body children. /// </summary> /// <param name="request">The request.</param> /// <param name="ctx">The CTX.</param> /// <param name="parameterObject">The parameter object.</param> /// <param name="childEnumerator">The child enumerator.</param> /// <param name="buffer">The buffer.</param> private void ProcessBodyChildren( RequestScope request, SqlTagContext ctx, object parameterObject, IEnumerator <ISqlChild> childEnumerator, StringBuilder buffer) { while (childEnumerator.MoveNext()) { ISqlChild child = childEnumerator.Current; if (child is SqlText) { // this represents the content within a mybatis xml tag, typically the hand-crafted sql itself var sqlText = (SqlText)child; if (sqlText.IsWhiteSpace) { buffer.Append(sqlText.Text); } else { // BODY OUT var textPropertyProbe = new TextPropertyProbe(sqlText.Text); // process the sql text content, replacing bindings and property usage. var sqlStatment = textPropertyProbe.Process(new DynamicSqlTextTokenHandler(ctx, sqlText)); buffer.Append(" "); buffer.Append(sqlStatment); ctx.AddParameterMappings(sqlText); } } else if (child is SqlTag) { SqlTag tag = (SqlTag)child; ISqlTagHandler handler = tag.Handler; int response = BaseTagHandler.INCLUDE_BODY; do { var body = new StringBuilder(); // if the tag is a bind element, add the bind element to a list so that we can later on work out how to replace variable usage. if (tag is Bind) { ctx.RememberBinding((Bind)tag); } response = handler.DoStartFragment(ctx, tag, parameterObject); // replace any bind variables found within the body content. // what's a bit confusing here is that the body element is essentially populated by actions that take place after this line // a recursive call could then be made which results in this being called again. ctx.ReplaceBindingVariables(body); if (response == BaseTagHandler.SKIP_BODY) { break; } ctx.CheckAssignFirstDynamicTagWithPrepend(tag); ProcessBodyChildren(request, ctx, parameterObject, tag.GetChildrenEnumerator(), body); response = handler.DoEndFragment(ctx, tag, parameterObject, body); handler.DoPrepend(ctx, tag, parameterObject, body); if (response == BaseTagHandler.SKIP_BODY) { break; } if (body.Length > 0) { // BODY OUT if (handler.IsPostParseRequired) { var sqlText = InlineParameterMapParser.ParseInlineParameterMap(dataExchangeFactory, statement.Id, null, body.ToString()); sqlText.Parent = tag; buffer.Append(sqlText.Text); ctx.AddParameterMappings(sqlText); } else { buffer.Append(" "); buffer.Append(body.ToString()); } if (tag.IsPrependAvailable && tag == ctx.FirstNonDynamicTagWithPrepend) { ctx.IsOverridePrepend = false; } } }while (response == BaseTagHandler.REPEAT_BODY); } } }
/// <summary> /// /// </summary> /// <param name="request"></param> /// <param name="ctx"></param> /// <param name="parameterObject"></param> /// <param name="localChildren"></param> /// <param name="buffer"></param> private void ProcessBodyChildren(RequestScope request, SqlTagContext ctx, object parameterObject, IEnumerator localChildren, StringBuilder buffer) { while (localChildren.MoveNext()) { ISqlChild child = (ISqlChild)localChildren.Current; if (child is SqlText) { SqlText sqlText = (SqlText)child; string sqlStatement = sqlText.Text; if (sqlText.IsWhiteSpace) { buffer.Append(sqlStatement); } else { // if (SimpleDynamicSql.IsSimpleDynamicSql(sqlStatement)) // { // sqlStatement = new SimpleDynamicSql(sqlStatement, _statement).GetSql(parameterObject); // SqlText newSqlText = _paramParser.ParseInlineParameterMap( null, sqlStatement ); // sqlStatement = newSqlText.Text; // ParameterProperty[] mappings = newSqlText.Parameters; // if (mappings != null) // { // for (int i = 0; i < mappings.Length; i++) // { // ctx.AddParameterMapping(mappings[i]); // } // } // } // BODY OUT buffer.Append(" "); buffer.Append(sqlStatement); ParameterProperty[] parameters = sqlText.Parameters; if (parameters != null) { int length = parameters.Length; for (int i = 0; i < length; i++) { ctx.AddParameterMapping(parameters[i]); } } } } else if (child is SqlTag) { SqlTag tag = (SqlTag)child; ISqlTagHandler handler = tag.Handler; int response = BaseTagHandler.INCLUDE_BODY; do { StringBuilder body = new StringBuilder(); response = handler.DoStartFragment(ctx, tag, parameterObject); if (response != BaseTagHandler.SKIP_BODY) { if (ctx.IsOverridePrepend && ctx.FirstNonDynamicTagWithPrepend == null && tag.IsPrependAvailable && !(tag.Handler is DynamicTagHandler)) { ctx.FirstNonDynamicTagWithPrepend = tag; } ProcessBodyChildren(request, ctx, parameterObject, tag.GetChildrenEnumerator(), body); response = handler.DoEndFragment(ctx, tag, parameterObject, body); handler.DoPrepend(ctx, tag, parameterObject, body); if (response != BaseTagHandler.SKIP_BODY) { if (body.Length > 0) { // BODY OUT if (handler.IsPostParseRequired) { SqlText sqlText = _paramParser.ParseInlineParameterMap(request, null, body.ToString()); buffer.Append(sqlText.Text); ParameterProperty[] mappings = sqlText.Parameters; if (mappings != null) { int length = mappings.Length; for (int i = 0; i < length; i++) { ctx.AddParameterMapping(mappings[i]); } } } else { buffer.Append(" "); buffer.Append(body.ToString()); } if (tag.IsPrependAvailable && tag == ctx.FirstNonDynamicTagWithPrepend) { ctx.IsOverridePrepend = false; } } } } }while (response == BaseTagHandler.REPEAT_BODY); } } }
/// <summary> /// Processes the body children. /// 最终的处理的语句结果在buffer中,也即ctx中的StringBuilder,处理的参数结果在ctx中的ArrayList中 /// </summary> /// <param name="request">The request.</param> /// <param name="ctx">The CTX.</param> /// <param name="parameterObject">The parameter object.</param> /// <param name="childEnumerator">The child enumerator.</param> /// <param name="buffer">The buffer.</param> private void ProcessBodyChildren( RequestScope request, SqlTagContext ctx, object parameterObject, IEnumerator <ISqlChild> childEnumerator, StringBuilder buffer) { while (childEnumerator.MoveNext()) { ISqlChild child = childEnumerator.Current; if (child is SqlText) { SqlText sqlText = (SqlText)child; string sqlStatement = sqlText.Text; if (sqlText.IsWhiteSpace) { buffer.Append(sqlStatement); } else { // if (SimpleDynamicSql.IsSimpleDynamicSql(sqlStatement)) // { // sqlStatement = new SimpleDynamicSql(sqlStatement, _statement).GetSql(parameterObject); // SqlText newSqlText = _paramParser.ParseInlineParameterMap( null, sqlStatement ); // sqlStatement = newSqlText.Text; // ParameterProperty[] mappings = newSqlText.Parameters; // if (mappings != null) // { // for (int i = 0; i < mappings.Length; i++) // { // ctx.AddParameterMapping(mappings[i]); // } // } // } // BODY OUT buffer.Append(" "); buffer.Append(sqlStatement); //添加当前的SQL语句 //处理参数列表 ParameterProperty[] parameters = sqlText.Parameters; if (parameters != null) { int length = parameters.Length; for (int i = 0; i < length; i++) { ctx.AddParameterMapping(parameters[i]); } } } } else if (child is SqlTag) { SqlTag tag = (SqlTag)child; ISqlTagHandler handler = tag.Handler;//此处是DynamicTagHandler处理类 int response = BaseTagHandler.INCLUDE_BODY; do { StringBuilder body = new StringBuilder(); //返回INCLUDE_BODY,即1 此处为处理开头的情况准备 response = handler.DoStartFragment(ctx, tag, parameterObject); if (response != BaseTagHandler.SKIP_BODY) { if (ctx.IsOverridePrepend && ctx.FirstNonDynamicTagWithPrepend == null && tag.IsPrependAvailable && !(tag.Handler is DynamicTagHandler)) { //此处应该是判断第一个查询条件时的开头问题 ctx.FirstNonDynamicTagWithPrepend = tag; } //递归调用,当前SqlTag中处理后的SQL语句保存到了临时的body中 后面再加入到buffer中 ProcessBodyChildren(request, ctx, parameterObject, tag.GetChildrenEnumerator(), body); //处理结尾的片段部分 返回INCLUDE_BODY,1 response = handler.DoEndFragment(ctx, tag, parameterObject, body); //处理prepend属性节点的问题 handler.DoPrepend(ctx, tag, parameterObject, body); if (response != BaseTagHandler.SKIP_BODY) { if (body.Length > 0) { // BODY OUT if (handler.IsPostParseRequired) { //将body中的SQL语句分析参数和SQL语句到SqlText中 SqlText sqlText = InlineParameterMapParser.ParseInlineParameterMap(dataExchangeFactory, statement.Id, null, body.ToString()); buffer.Append(sqlText.Text); ParameterProperty[] mappings = sqlText.Parameters; if (mappings != null) { int length = mappings.Length; for (int i = 0; i < length; i++) { ctx.AddParameterMapping(mappings[i]); } } } else { buffer.Append(" "); buffer.Append(body.ToString()); } //此处是判断SQL语句查询条件时的关键字开头问题 if (tag.IsPrependAvailable && tag == ctx.FirstNonDynamicTagWithPrepend) { ctx.IsOverridePrepend = false; } } } } }while (response == BaseTagHandler.REPEAT_BODY); } } }
private void ProcessBodyChildren(RequestScope request, SqlTagContext ctx, object parameterObject, IEnumerator localChildren, StringBuilder buffer) { while (localChildren.MoveNext()) { ISqlChild current = (ISqlChild)localChildren.Current; if (current is SqlText) { SqlText text = (SqlText)current; string str = text.Text; if (text.IsWhiteSpace) { buffer.Append(str); } else { buffer.Append(" "); buffer.Append(str); ParameterProperty[] parameters = text.Parameters; if (parameters != null) { int length = parameters.Length; for (int i = 0; i < length; i++) { ctx.AddParameterMapping(parameters[i]); } } } } else if (current is SqlTag) { SqlTag tag = (SqlTag)current; ISqlTagHandler handler = tag.Handler; int num3 = 1; do { StringBuilder builder = new StringBuilder(); num3 = handler.DoStartFragment(ctx, tag, parameterObject); if (num3 != 0) { if ((ctx.IsOverridePrepend && (ctx.FirstNonDynamicTagWithPrepend == null)) && (tag.IsPrependAvailable && !(tag.Handler is DynamicTagHandler))) { ctx.FirstNonDynamicTagWithPrepend = tag; } this.ProcessBodyChildren(request, ctx, parameterObject, tag.GetChildrenEnumerator(), builder); num3 = handler.DoEndFragment(ctx, tag, parameterObject, builder); handler.DoPrepend(ctx, tag, parameterObject, builder); if ((num3 != 0) && (builder.Length > 0)) { if (handler.IsPostParseRequired) { SqlText text2 = this._paramParser.ParseInlineParameterMap(request, null, builder.ToString()); buffer.Append(text2.Text); ParameterProperty[] propertyArray2 = text2.Parameters; if (propertyArray2 != null) { int num4 = propertyArray2.Length; for (int j = 0; j < num4; j++) { ctx.AddParameterMapping(propertyArray2[j]); } } } else { buffer.Append(" "); buffer.Append(builder.ToString()); } if (tag.IsPrependAvailable && (tag == ctx.FirstNonDynamicTagWithPrepend)) { ctx.IsOverridePrepend = false; } } } }while (num3 == 2); } } }
private void ProcessBodyChildren(RequestScope request, SqlTagContext ctx, object parameterObject, IList localChildren) { StringBuilder writer = ctx.GetWriter(); this.ProcessBodyChildren(request, ctx, parameterObject, localChildren.GetEnumerator(), writer); }