Author: gbayon Date: Sun Jul 23 01:45:34 2006 New Revision: 424689 URL: http://svn.apache.org/viewvc?rev=424689&view=rev Log: Fixed IBATISNET-174 Fixed IBATISNET-173
Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Order.xml ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConstructorTest.cs ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/PropertStrategy/ResultMapStrategy.cs Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Order.xml URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Order.xml?rev=424689&r1=424688&r2=424689&view=diff ============================================================================== --- ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Order.xml (original) +++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Order.xml Sun Jul 23 01:45:34 2006 @@ -17,7 +17,7 @@ <resultMap id="order-result-constructor1" class="Order" > <constructor> <argument argumentName="id" column="Order_ID"/> - <argument argumentName="account" column="Account_ID" resultMapping="Account.account-result-nullable-email" /> + <argument argumentName="account" resultMapping="Account.account-result-nullable-email" /> </constructor> <result property="Date" column="Order_Date"/> <result property="CardExpiry" column="Order_CardExpiry"/> @@ -122,6 +122,21 @@ <result property="PostalCode" column="Order_PostalCode"/> </resultMap> + <resultMap id="order-result-constructor8" class="Order" > + <constructor> + <argument argumentName="id" column="Order_ID"/> + <argument argumentName="account" resultMapping="Account.account-result-constructor" /> + </constructor> + <result property="Date" column="Order_Date"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + </resultMap> + <resultMap id="credit-card-result" class="string"> <result property="value" column="Order_CardNumber"/> </resultMap> @@ -354,6 +369,19 @@ <result property="Account" resultMapping="Account.account-result-nullable-email" /> </resultMap> + <resultMap id="order-joined-with-account-constructor" class="Order"> + <result property="Id" column="Order_ID"/> + <result property="Date" column="Order_Date" nullValue="01/01/0001 00:00:00"/> + <result property="CardExpiry" column="Order_CardExpiry"/> + <result property="CardType" column="Order_CardType"/> + <result property="CardNumber" column="Order_CardNumber"/> + <result property="Street" column="Order_Street"/> + <result property="City" column="Order_City"/> + <result property="Province" column="Order_Province"/> + <result property="PostalCode" column="Order_PostalCode"/> + <result property="Account" resultMapping="Account.account-result-constructor" /> + </resultMap> + </resultMaps> <statements> @@ -716,6 +744,36 @@ select * from Orders where Order_ID = #value# </statement> + <select id="GetOrderConstructor8" + parameterClass="Integer" + resultMap="order-result-constructor8"> + select + Order_ID, + Order_Date, + Order_CardExpiry, + Order_CardType, + Order_CardNumber, + Order_Street, + Order_City, + Order_Province, + Order_PostalCode, + acc.Account_ID, + acc.Account_FirstName, + acc.Account_LastName, + acc.Account_Email, + acc.Account_Banner_Option, + acc.Account_Cart_Option + from Orders as ord + LEFT OUTER JOIN Accounts as acc on acc.Account_ID = ord.Account_ID + where Order_ID = #value# + </select> + + <select id="GetOrderConstructor9" + extends="GetOrderConstructor8" + parameterClass="Integer" + resultMap="order-joined-with-account-constructor"> + </select> + </statements> <parameterMaps> Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConstructorTest.cs URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConstructorTest.cs?rev=424689&r1=424688&r2=424689&view=diff ============================================================================== --- ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConstructorTest.cs (original) +++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConstructorTest.cs Sun Jul 23 01:45:34 2006 @@ -111,6 +111,34 @@ Assert.IsNull(order.Account); } + + /// <summary> + /// Test constructor with an argument using a resultMapping where + /// - the resulMap argument use another constructor + /// - all second constructor arguments are null. + /// </remarks> + [Test] + public void TestJIRA173() + { + Order order = sqlMap.QueryForObject("GetOrderConstructor8",11) as Order; + + Assert.IsTrue(order.Id == 11); + Assert.IsNull(order.Account); + } + + /// <summary> + /// Test resultMap with a result property using another resultMap and where + /// - the result property resultMap use a constructor + /// - all the constructor arguments are null. + /// </remarks> + [Test] + public void TestJIRA174() + { + Order order = sqlMap.QueryForObject("GetOrderConstructor9",11) as Order; + + Assert.IsTrue(order.Id == 11); + Assert.IsNull(order.Account); + } /// <summary> /// Test constructor with select attribute on argument Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs?rev=424689&r1=424688&r2=424689&view=diff ============================================================================== --- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs (original) +++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs Sun Jul 23 01:45:34 2006 @@ -50,22 +50,34 @@ ResultProperty mapping, ref IDataReader reader, object keys) { object[] parameters = null; + bool isParameterFound = false; + if (mapping.NestedResultMap.Parameters.Count >0) { - parameters = new object[resultMap.Parameters.Count]; + parameters = new object[mapping.NestedResultMap.Parameters.Count]; // Fill parameters array for(int index=0; index< mapping.NestedResultMap.Parameters.Count; index++) { ResultProperty property = mapping.NestedResultMap.Parameters[index]; parameters[index] = property.GetDataBaseValue( reader ); request.IsRowDataFound = request.IsRowDataFound || (parameters[index] != null); + isParameterFound = isParameterFound || (parameters[index] != null); } } - object obj = mapping.NestedResultMap.CreateInstanceOfResult(parameters); - if (FillObjectWithReaderAndResultMap(request, reader, mapping.NestedResultMap, obj) == false) + object obj = null; + // If I have a constructor tag and all argumments values are null, the obj is null + if (mapping.NestedResultMap.Parameters.Count >0 && isParameterFound==false) { obj = null; + } + else + { + obj = mapping.NestedResultMap.CreateInstanceOfResult(parameters); + if (FillObjectWithReaderAndResultMap(request, reader, mapping.NestedResultMap, obj) == false) + { + obj = null; + } } return obj; Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/PropertStrategy/ResultMapStrategy.cs URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/PropertStrategy/ResultMapStrategy.cs?rev=424689&r1=424688&r2=424689&view=diff ============================================================================== --- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/PropertStrategy/ResultMapStrategy.cs (original) +++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/PropertStrategy/ResultMapStrategy.cs Sun Jul 23 01:45:34 2006 @@ -53,24 +53,36 @@ { // Creates object object[] parameters = null; + bool isParameterFound = false; + if (mapping.NestedResultMap.Parameters.Count >0) { - parameters = new object[resultMap.Parameters.Count]; + parameters = new object[mapping.NestedResultMap.Parameters.Count]; // Fill parameters array for(int index=0; index< mapping.NestedResultMap.Parameters.Count; index++) { ResultProperty resultProperty = mapping.NestedResultMap.Parameters[index]; - parameters[index] = resultProperty.ArgumentStrategy.GetValue(request, resultMap, resultProperty, ref reader, null); + parameters[index] = resultProperty.ArgumentStrategy.GetValue(request, mapping.NestedResultMap, resultProperty, ref reader, null); request.IsRowDataFound = request.IsRowDataFound || (parameters[index] != null); + isParameterFound = isParameterFound || (parameters[index] != null); } } - object obj = mapping.NestedResultMap.CreateInstanceOfResult(parameters); - - // Fills properties on the new object - if (this.FillObjectWithReaderAndResultMap(request, reader, mapping.NestedResultMap, obj) == false) + object obj = null; + // If I have a constructor tag and all argumments values are null, the obj is null + if (mapping.NestedResultMap.Parameters.Count >0 && isParameterFound==false) { obj = null; + } + else + { + obj = mapping.NestedResultMap.CreateInstanceOfResult(parameters); + + // Fills properties on the new object + if (this.FillObjectWithReaderAndResultMap(request, reader, mapping.NestedResultMap, obj) == false) + { + obj = null; + } } // Sets created object on the property