Author: gbayon
Date: Thu Feb 15 11:50:32 2007
New Revision: 508110

URL: http://svn.apache.org/viewvc?view=rev&rev=508110
Log:
- Fixedn IBATISNET-206, invalid result when mixing groupBy and inheritance

Modified:
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/Account.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/User.cs
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.2005.csproj
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Account.xml
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/GroupByTest.cs
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/InheritanceTest.cs
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Scripts/MSSQL/documents-init.sql
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Scripts/MSSQL/user-init.sql
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMap.cs
    
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/PropertStrategy/GroupByStrategy.cs

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/Account.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/Account.cs?view=diff&rev=508110&r1=508109&r2=508110
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/Account.cs 
(original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/Account.cs Thu Feb 
15 11:50:32 2007
@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 
 namespace IBatisNet.DataMapper.Test.Domain
 {
@@ -17,7 +18,23 @@
                private bool _cartOption = false;
            private Document _document = null;
 
-               public Account()
+        #if dotnet2
+        protected IList<Document> documents = new List<Document>();
+
+        public IList<Document> Documents
+        {
+            get { return documents; }
+        }
+        #else
+        protected IList documents = new List();
+
+        public IListDocuments
+        {
+            get { return documents; }
+        }
+        #endif
+
+        public Account()
                {}
 
         public Account(int identifiant, string firstName, string lastName)

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/User.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/User.cs?view=diff&rev=508110&r1=508109&r2=508110
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/User.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Domain/User.cs Thu Feb 15 
11:50:32 2007
@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 
 namespace IBatisNet.DataMapper.Test.Domain
 {
@@ -7,46 +8,25 @@
        /// </summary>
        public class User
        {
-               private string id;
-               private string userName;
-               private string password;
-               private string emailAddress;
-               private DateTime lastLogon;
+        protected Nullable<int> id = null;
+        protected string name;
+           protected IList<Document> documents = new List<Document>();
+
+        public IList<Document> Documents
+        {
+            get { return documents; }
+        }
 
-
-               public User()
-               {
-               }
-
-               public string Id 
+        public Nullable<int> Id 
                {
                        get { return id; }
-                       set { id = value; }
-               }
-
-               public string UserName 
-               {
-                       get { return userName; }
-                       set { userName = value; }
-               }
-
-               public string Password 
-               {
-                       get { return password; }
-                       set { password = value; }
                }
 
-               public string EmailAddress 
+               public string Name 
                {
-                       get { return emailAddress; }
-                       set { emailAddress = value; }
+            get { return name; }
                }
 
-               public DateTime LastLogon 
-               {
-                       get { return lastLogon; }
-                       set { lastLogon = value; }
-               }
 
        }
 }

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.2005.csproj
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.2005.csproj?view=diff&rev=508110&r1=508109&r2=508110
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.2005.csproj
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.2005.csproj
 Thu Feb 15 11:50:32 2007
@@ -78,7 +78,7 @@
       <Name>log4net</Name>
       <HintPath>..\External-Bin\Net\1.1\log4net.dll</HintPath>
     </Reference>
-    <Reference Include="nunit.framework, Version=2.2.8.0, Culture=neutral, 
PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />
+    <Reference Include="nunit.framework, Version=2.2.9.0, Culture=neutral, 
PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />
     <Reference Include="System">
       <Name>System</Name>
     </Reference>

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Account.xml
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Account.xml?view=diff&rev=508110&r1=508109&r2=508110
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Account.xml
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Account.xml
 Thu Feb 15 11:50:32 2007
@@ -148,15 +148,36 @@
                        <result property="LastName"     
column="Account_LastName"/>
                        <result property="EmailAddress" column="Account_Email"/>
                </resultMap>
-               
-       </resultMaps>
-       
-       <!-- =============================================
+
+    <resultMap id="account-groupby"  class="Account" groupBy="id">
+      <result property="id"           column="Account_ID"/>
+      <result property="FirstName"    column="Account_FirstName"/>
+      <result property="documents" resultMapping="Document.document"/>
+    </resultMap>
+
+  </resultMaps>
+
+  <!-- =============================================
         MAPPED STATEMENTS - w/Inline Parameters
     ============================================= 
     -->
-       <statements>
+  <statements>
 
+    <select id="JIRA206"
+       resultMap="account-groupby">
+      SELECT
+      Accounts.Account_ID,
+      Account_FirstName,
+      Document_ID,
+      Document_City,
+      Document_PageNumber,
+      Document_Type,
+      Document_Title
+      FROM         Accounts LEFT OUTER JOIN
+      Documents ON Accounts.Account_ID = Documents.Account_Id
+      Order by Accounts.Account_ID
+    </select>
+    
     <select id="GetMultipleResultMapAccount"
                                resultMap="account-result, account-result">
       select

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/GroupByTest.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/GroupByTest.cs?view=diff&rev=508110&r1=508109&r2=508110
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/GroupByTest.cs
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/GroupByTest.cs
 Thu Feb 15 11:50:32 2007
@@ -23,6 +23,7 @@
         protected override void SetUpFixture()
         {
             base.SetUpFixture();
+
             InitScript(sqlMap.DataSource, ScriptDirectory + 
"petstore-drop.sql");
             InitScript(sqlMap.DataSource, ScriptDirectory + 
"petstore-schema.sql");
             InitScript(sqlMap.DataSource, ScriptDirectory + 
"petstore-init.sql");
@@ -179,5 +180,31 @@
             Assert.AreEqual(1, order.LineItemsIList.Count);
             Assert.IsNull(order.Account);
         }
+
+#if dotnet2
+        /// <summary>
+        /// Test GroupBy With use of Inheritance
+        /// </summary>
+        [Test]
+        public void GroupByWithInheritance()
+        {
+            InitScript(sqlMap.DataSource, ScriptDirectory + 
"petstore-drop.sql");
+            InitScript(sqlMap.DataSource, ScriptDirectory + 
"account-init.sql");
+            InitScript(sqlMap.DataSource, ScriptDirectory + 
"documents-init.sql");
+
+            IList<Account> list = sqlMap.QueryForList<Account>("JIRA206", 
null);
+            
+            Assert.AreEqual(5, list.Count);
+            Assert.AreEqual(0, list[0].Documents.Count);
+            Assert.AreEqual(2, list[1].Documents.Count);
+            Assert.AreEqual(1, list[2].Documents.Count);
+            Assert.AreEqual(0, list[3].Documents.Count);
+            Assert.AreEqual(2, list[4].Documents.Count);
+
+            InitScript(sqlMap.DataSource, ScriptDirectory + 
"petstore-drop.sql");
+            InitScript(sqlMap.DataSource, ScriptDirectory + 
"petstore-schema.sql");
+            InitScript(sqlMap.DataSource, ScriptDirectory + 
"petstore-init.sql");
+        }
+#endif
     }
 }

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/InheritanceTest.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/InheritanceTest.cs?view=diff&rev=508110&r1=508109&r2=508110
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/InheritanceTest.cs
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/InheritanceTest.cs
 Thu Feb 15 11:50:32 2007
@@ -137,13 +137,13 @@
         [Test]
         public void TestJIRA175()
            {
-            Account account = sqlMap.QueryForObject("JIRA175", 5) as Account;
-            Assert.AreEqual(5, account.Id, "account.Id");
-            Assert.AreEqual("Gilles", account.FirstName, "account.FirstName");
+            Account account = sqlMap.QueryForObject("JIRA175", 3) as Account;
+            Assert.AreEqual(3, account.Id, "account.Id");
+            Assert.AreEqual("William", account.FirstName, "account.FirstName");
                
             Book book = account.Document as Book;
             Assert.IsNotNull(book);
-            AssertBook(book, 1, "The World of Null-A", 55);
+            AssertBook(book, 3, "Lord of the Rings", 3587);
            }
            
                #endregion 

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Scripts/MSSQL/documents-init.sql
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Scripts/MSSQL/documents-init.sql?view=diff&rev=508110&r1=508109&r2=508110
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Scripts/MSSQL/documents-init.sql
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Scripts/MSSQL/documents-init.sql
 Thu Feb 15 11:50:32 2007
@@ -28,8 +28,8 @@
 -- Creating Test Data 
 
 INSERT INTO [dbo].[Documents] VALUES (1, 'The World of Null-A', 'Book', 55, 
null, 5);
-INSERT INTO [dbo].[Documents] VALUES (2, 'Le Progres de Lyon', 'Newspaper', 
null , 'Lyon', NULL);
-INSERT INTO [dbo].[Documents] VALUES (3, 'Lord of the Rings', 'Book', 3587, 
null, NULL);
-INSERT INTO [dbo].[Documents] VALUES (4, 'Le Canard enchaine', 'Tabloid', null 
, 'Paris', NULL);
-INSERT INTO [dbo].[Documents] VALUES (5, 'Le Monde', 'Broadsheet', null , 
'Paris', NULL);
-INSERT INTO [dbo].[Documents] VALUES (6, 'Foundation', 'Monograph', 557, null, 
NULL);
+INSERT INTO [dbo].[Documents] VALUES (2, 'Le Progres de Lyon', 'Newspaper', 
null , 'Lyon', 2);
+INSERT INTO [dbo].[Documents] VALUES (3, 'Lord of the Rings', 'Book', 3587, 
null, 3);
+INSERT INTO [dbo].[Documents] VALUES (4, 'Le Canard enchaine', 'Tabloid', null 
, 'Paris', 2);
+INSERT INTO [dbo].[Documents] VALUES (5, 'Le Monde', 'Broadsheet', null , 
'Paris', 5);
+INSERT INTO [dbo].[Documents] VALUES (6, 'Foundation', 'Monograph', 557, null, 
6);

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Scripts/MSSQL/user-init.sql
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Scripts/MSSQL/user-init.sql?view=diff&rev=508110&r1=508109&r2=508110
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Scripts/MSSQL/user-init.sql 
(original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/Scripts/MSSQL/user-init.sql 
Thu Feb 15 11:50:32 2007
@@ -1,6 +1,6 @@
 -- Creating Table
 
-use [NHibernate]
+use [IBatisNet]
 
 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Users]') 
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
 BEGIN
@@ -8,10 +8,16 @@
 END
 
 CREATE TABLE [dbo].[Users] (
-  LogonID nvarchar(20) NOT NULL default '0',
-  Name nvarchar(40) default NULL,
-  Password nvarchar(20) default NULL,
-  EmailAddress nvarchar(40) default NULL,
-  LastLogon datetime default NULL,
-  PRIMARY KEY  (LogonID)
+  [User_ID] [int] NOT NULL ,
+  [Name] [varchar] (32)  NOT NULL
+  PRIMARY KEY  (User_ID)
 )
+
+-- Creating Test Data
+
+INSERT INTO [dbo].[Users] VALUES(1,'Joe');
+INSERT INTO [dbo].[Users] VALUES(2,'Averel');
+INSERT INTO [dbo].[Users] VALUES(3,'William');
+INSERT INTO [dbo].[Users] VALUES(4,'Jack');
+INSERT INTO [dbo].[Users] VALUES(5,'Gilles');
+

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMap.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMap.cs?view=diff&rev=508110&r1=508109&r2=508110
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMap.cs
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMap.cs
 Thu Feb 15 11:50:32 2007
@@ -247,10 +247,6 @@
                {
                        try
                        {
-                               if (_className == "NCategory")
-                               {
-                                       Console.Write("");
-                               }
                                _class = 
configScope.SqlMapper.TypeHandlerFactory.GetType(_className);
                                _dataExchange = 
_dataExchangeFactory.GetDataExchangeForClass(_class);
 
@@ -441,16 +437,24 @@
                        {       
                                ResultProperty mapping = 
_discriminator.ResultProperty;
                                object dataBaseValue = 
mapping.GetDataBaseValue( dataReader );
-                               subMap = _discriminator.GetSubMap( 
dataBaseValue.ToString() );
 
-                               if (subMap == null) 
-                               {
-                                       subMap = this;
-                               } 
-                               else if (subMap != this) 
-                               {
-                                       subMap = 
subMap.ResolveSubMap(dataReader);
-                               }
+                if (dataBaseValue!=null)
+                {
+                                   subMap = _discriminator.GetSubMap( 
dataBaseValue.ToString() );
+
+                                   if (subMap == null) 
+                                   {
+                                           subMap = this;
+                                   } 
+                                   else if (subMap != this) 
+                                   {
+                                           subMap = 
subMap.ResolveSubMap(dataReader);
+                                   }                    
+                }
+                else
+                {
+                    subMap = null;
+                }
                        }
                        return subMap;
                }

Modified: 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/PropertStrategy/GroupByStrategy.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/PropertStrategy/GroupByStrategy.cs?view=diff&rev=508110&r1=508109&r2=508110
==============================================================================
--- 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/PropertStrategy/GroupByStrategy.cs
 (original)
+++ 
ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/PropertStrategy/GroupByStrategy.cs
 Thu Feb 15 11:50:32 2007
@@ -98,42 +98,46 @@
             object result = null;
             IResultMap propertyRresultMap = 
mapping.NestedResultMap.ResolveSubMap(reader);
 
-            if (propertyRresultMap.GroupByProperties.Count>0)
+            if (propertyRresultMap!=null)
             {
-                 string uniqueKey = GetUniqueKey(propertyRresultMap, request, 
reader);
-                // Gets the [key, result object] already build
-                IDictionary buildObjects = 
request.GetUniqueKeys(propertyRresultMap);
-                if (buildObjects != null && buildObjects.Contains(uniqueKey))
+                if (propertyRresultMap.GroupByProperties.Count>0)
                 {
-                    // Unique key is already known, so get the existing result 
object and process additional results.
-                    result = buildObjects[uniqueKey];
-                    // process resulMapping attribute wich point to a groupBy 
attribute
-                    for (int index = 0; index < 
propertyRresultMap.Properties.Count; index++)
+                     string uniqueKey = GetUniqueKey(propertyRresultMap, 
request, reader);
+                    // Gets the [key, result object] already build
+                    IDictionary buildObjects = 
request.GetUniqueKeys(propertyRresultMap);
+                    if (buildObjects != null && 
buildObjects.Contains(uniqueKey))
                     {
-                        ResultProperty resultProperty = 
propertyRresultMap.Properties[index];
-                        if (resultProperty.PropertyStrategy is 
PropertStrategy.GroupByStrategy)
+                        // Unique key is already known, so get the existing 
result object and process additional results.
+                        result = buildObjects[uniqueKey];
+                        // process resulMapping attribute which point to a 
groupBy attribute
+                        for (int index = 0; index < 
propertyRresultMap.Properties.Count; index++)
                         {
-                            resultProperty.PropertyStrategy.Set(request, 
propertyRresultMap, resultProperty, ref result, reader, null);
+                            ResultProperty resultProperty = 
propertyRresultMap.Properties[index];
+                            if (resultProperty.PropertyStrategy is 
PropertStrategy.GroupByStrategy)
+                            {
+                                resultProperty.PropertyStrategy.Set(request, 
propertyRresultMap, resultProperty, ref result, reader, null);
+                            }
                         }
+                        result = SKIP;
                     }
-                    result = SKIP;
+                    else if (uniqueKey == null || buildObjects == null || 
!buildObjects.Contains(uniqueKey))
+                    {
+                        result = _resultMapStrategy.Get(request, resultMap, 
mapping, ref target, reader);
+
+                        if (buildObjects == null)
+                        {
+                            buildObjects = new Hashtable();
+                            request.SetUniqueKeys(propertyRresultMap, 
buildObjects);
+                        }
+                        buildObjects[uniqueKey] = result;
+                    }               
                 }
-                else if (uniqueKey == null || buildObjects == null || 
!buildObjects.Contains(uniqueKey))
+                else // Last resultMap have no groupBy attribute
                 {
                     result = _resultMapStrategy.Get(request, resultMap, 
mapping, ref target, reader);
-
-                    if (buildObjects == null)
-                    {
-                        buildObjects = new Hashtable();
-                        request.SetUniqueKeys(propertyRresultMap, 
buildObjects);
-                    }
-                    buildObjects[uniqueKey] = result;
-                }               
-            }
-            else // Last resultMap have no groupBy attribute
-            {
-                result = _resultMapStrategy.Get(request, resultMap, mapping, 
ref target, reader);
+                }                
             }
+
             
             if ((result != null) && (result != SKIP))
             {


Reply via email to