Iterator literals ($filters[].FieldName) aren't parsed properly when used within conditional tags -------------------------------------------------------------------------------------------------
Key: IBATISNET-278 URL: https://issues.apache.org/jira/browse/IBATISNET-278 Project: iBatis for .NET Issue Type: Bug Components: DataMapper Reporter: Ron Grabowski Apparently we don't fully support using iterate literals inside conditional tags. This doesn't work: <isPropertyAvailable property="filters"> AND <iterate open="(" close=")" property="filters" conjunction=" AND "> <isEqual property="filters[].FilterTypeValue" compareValue="IsEqualTo">$filters[].FieldName$ = #filters[].Begin#</isEqual> <isEqual property="filters[].FilterTypeValue" compareValue="IsNotEqualTo">$filters[].FieldName$ <> #filters[].Begin#</isEqual> <isEqual property="filters[].FilterTypeValue" compareValue="IsGreaterThan">$filters[].FieldName$ > #filters[].Begin#</isEqual> </iterate> </isPropertyAvailable> The problem is that the filters[] tokens aren't being expanded to hold the current iterator value: #filters[0].Begin# #filters[1].Begin# etc... $filters[0].FieldName$ $filters[0].FieldName$ etc... I hacked up the code in DynamicSql.cs that handles adding SqlText fragments (around line 256): // DynamicSql.cs ParameterProperty[] parameters = sqlText.Parameters; if (parameters != null) { int length = parameters.Length; for (int i = 0; i< length; i++) { ParameterProperty parameterProperty = parameters[i]; // HACK! IterateContext iterateContext = ctx.PeekIterateContext(); if (iterateContext != null) { int currentIterateIndex = 0; if (ctx.PeekIterateContext().Index > 0) { currentIterateIndex = ctx.PeekIterateContext().Index; } parameterProperty.PropertyName = parameterProperty.PropertyName.Replace("[]", "[" + currentIterateIndex + "]"); } ctx.AddParameterMapping(parameterProperty); } } as well as ConditionalTagHandler.DoEndFragment. Its not really patch worthy...I just hacked the code to make my stuff work :-/ // ConditionalTagHandler.cs public override int DoEndFragment(...) { Iterate iterateTag = tag.Parent as Iterate; if (iterateTag != null) { // HACK! iterate.Index starts at -1 IterateContext iterate = ctx.PeekIterateContext(); string find = iterateTag.Property + "[]"; tring replace = iterateTag.Property + "[" + (iterate.Index + 1) + "]"; //Parameter-index-Dynamic Replace(bodyContent, find, replace); } return BaseTagHandler.INCLUDE_BODY; } The Java version seems to support that as well as the concept of nested iterators: http://issues.apache.org/jira/browse/IBATIS-131 http://issues.apache.org/jira/browse/IBATIS-281 http://issues.apache.org/jira/browse/IBATIS-293 -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.