You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by cb...@apache.org on 2009/12/05 04:26:13 UTC

svn commit: r887489 - in /ibatis/java/ibatis-3/trunk/ibatis-3-core/src: main/java/org/apache/ibatis/builder/ test/java/org/apache/ibatis/submitted/complex_column/

Author: cbegin
Date: Sat Dec  5 03:26:08 2009
New Revision: 887489

URL: http://svn.apache.org/viewvc?rev=887489&view=rev
Log:
IBATIS-706 Complex columns don't work

Added:
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/ComplexColumnTest.java
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/CreateDB.sql
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/Person.java
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/Person.xml
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/PersonMapper.java
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/ibatisConfig.xml
Modified:
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java

Modified: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java?rev=887489&r1=887488&r2=887489&view=diff
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java (original)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/MapperBuilderAssistant.java Sat Dec  5 03:26:08 2009
@@ -300,16 +300,40 @@
     Class javaTypeClass = resolveResultJavaType(resultType, property, javaType);
     TypeHandler typeHandlerInstance = (TypeHandler) resolveInstance(typeHandler);
 
+    List<ResultMapping> composites = parseCompositeColumnName(column);
+    if (composites.size() > 0) {
+      ResultMapping first = composites.get(0);
+      column = first.getColumn();
+    }
+
     ResultMapping.Builder builder = new ResultMapping.Builder(configuration, property, column, javaTypeClass);
     builder.jdbcType(jdbcType);
     builder.nestedQueryId(applyCurrentNamespace(nestedSelect));
     builder.nestedResultMapId(applyCurrentNamespace(nestedResultMap));
     builder.typeHandler(typeHandlerInstance);
     builder.flags(flags == null ? new ArrayList<ResultFlag>() : flags);
-
+    builder.composites(composites);
+    
     return builder.build();
   }
 
+  private List<ResultMapping> parseCompositeColumnName(String columnName) {
+    List<ResultMapping> composites = new ArrayList<ResultMapping>();
+    if (columnName != null) {
+      if (columnName.indexOf('=') > -1
+          || columnName.indexOf(',') > -1) {
+        StringTokenizer parser = new StringTokenizer(columnName, "{}=, ", false);
+        while (parser.hasMoreTokens()) {
+          String property = parser.nextToken();
+          String column = parser.nextToken();
+          ResultMapping.Builder complexBuilder = new ResultMapping.Builder(configuration, property, column, configuration.getTypeHandlerRegistry().getUnkownTypeHandler());
+          composites.add(complexBuilder.build());
+        }
+      }
+    }
+    return composites;
+  }
+
   private Class resolveResultJavaType(Class resultType, String property, Class javaType) {
     if (javaType == null && property != null) {
       try {

Added: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/ComplexColumnTest.java
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/ComplexColumnTest.java?rev=887489&view=auto
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/ComplexColumnTest.java (added)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/ComplexColumnTest.java Sat Dec  5 03:26:08 2009
@@ -0,0 +1,76 @@
+package org.apache.ibatis.submitted.complex_column;
+
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.sql.Connection;
+import java.sql.DriverManager;
+
+import junit.framework.Assert;
+
+import org.apache.ibatis.io.Resources;
+import org.apache.ibatis.jdbc.ScriptRunner;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.apache.ibatis.session.SqlSessionFactoryBuilder;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ComplexColumnTest {
+    
+    private static SqlSessionFactory sqlSessionFactory;
+    
+    @BeforeClass
+    public static void initDatabase() throws Exception {
+        Connection conn = null;
+
+        try {
+            Class.forName("org.hsqldb.jdbcDriver");
+            conn = DriverManager.getConnection("jdbc:hsqldb:mem:complex_column", "sa",
+                    "");
+
+            Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/complex_column/CreateDB.sql");
+
+            ScriptRunner runner = new ScriptRunner(conn);
+            runner.setLogWriter(null);
+            runner.setErrorLogWriter(new PrintWriter(System.err));
+            runner.runScript(reader);
+            conn.commit();
+            reader.close();
+
+            reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/complex_column/ibatisConfig.xml");
+            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
+            reader.close();
+        } finally {
+            if (conn != null) {
+                conn.close();
+            }
+        }
+    }
+    
+    @Test
+    public void testWithoutComplex() {
+        SqlSession sqlSession = sqlSessionFactory.openSession();
+        PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
+        Person person = personMapper.getWithoutComplex(2l);
+        Assert.assertNotNull("person must not be null", person);
+        Assert.assertEquals("Christian", person.getFirstName());
+        Assert.assertEquals("Poitras", person.getLastName());
+        Person parent = person.getParent();
+        Assert.assertNotNull("parent must not be null", parent);
+        Assert.assertEquals("John", parent.getFirstName());
+        Assert.assertEquals("Smith", parent.getLastName());
+    }
+    @Test
+    public void testWithComplex() {
+        SqlSession sqlSession = sqlSessionFactory.openSession();
+        PersonMapper personMapper = sqlSession.getMapper(PersonMapper.class);
+        Person person = personMapper.getWithComplex(2l);
+        Assert.assertNotNull("person must not be null", person);
+        Assert.assertEquals("Christian", person.getFirstName());
+        Assert.assertEquals("Poitras", person.getLastName());
+        Person parent = person.getParent();
+        Assert.assertNotNull("parent must not be null", parent);
+        Assert.assertEquals("John", parent.getFirstName());
+        Assert.assertEquals("Smith", parent.getLastName());
+    }
+}

Added: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/CreateDB.sql
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/CreateDB.sql?rev=887489&view=auto
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/CreateDB.sql (added)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/CreateDB.sql Sat Dec  5 03:26:08 2009
@@ -0,0 +1,17 @@
+create table person (
+  id int,
+  firstName varchar(100),
+  lastName varchar(100),
+  parent_id int default null,
+  parent_firstName varchar(100) default null,
+  parent_lastName varchar(100) default null
+);
+
+INSERT INTO person (id, firstName, lastName)
+VALUES (1, 'John', 'Smith');
+
+INSERT INTO person (id, firstName, lastName, parent_id, parent_firstName, parent_lastName)
+VALUES (2, 'Christian', 'Poitras', 1, 'John', 'Smith');
+
+INSERT INTO person (id, firstName, lastName, parent_id, parent_firstName, parent_lastName)
+VALUES (3, 'Clinton', 'Begin', 1, 'John', 'Smith');

Added: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/Person.java
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/Person.java?rev=887489&view=auto
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/Person.java (added)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/Person.java Sat Dec  5 03:26:08 2009
@@ -0,0 +1,32 @@
+package org.apache.ibatis.submitted.complex_column;
+
+public class Person {
+    private Long id;
+    private String firstName;
+    private String lastName;
+    private Person parent;
+    public String getFirstName() {
+        return firstName;
+    }
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+    public String getLastName() {
+        return lastName;
+    }
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+    public Long getId() {
+        return id;
+    }
+    public void setId(Long id) {
+        this.id = id;
+    }
+    public Person getParent() {
+        return parent;
+    }
+    public void setParent(Person parent) {
+        this.parent = parent;
+    }
+}

Added: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/Person.xml
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/Person.xml?rev=887489&view=auto
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/Person.xml (added)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/Person.xml Sat Dec  5 03:26:08 2009
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE mapper
+    PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
+    "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
+
+<mapper namespace="org.apache.ibatis.submitted.complex_column.PersonMapper">
+    
+    <resultMap id="personMap" type="Person">
+        <id property="id" column="id"/>
+        <result property="firstName" column="firstName"/>
+        <result property="lastName" column="lastName"/>
+        <association property="parent" column="parent_id" select="getParentWithoutComplex"/>
+    </resultMap>
+    <resultMap id="personMapComplex" type="Person">
+        <id property="id" column="id"/>
+        <result property="firstName" column="firstName"/>
+        <result property="lastName" column="lastName"/>
+        <association property="parent" column="{firstName=parent_firstName,lastName=parent_lastName}" select="getParentWithComplex"/>
+    </resultMap>
+    
+    
+    <select id="getWithoutComplex" resultMap="personMap" parameterType="long">
+        SELECT id, firstName, lastName, parent_id, parent_firstName, parent_lastName
+        FROM Person
+        WHERE id = #{id,jdbcType=INTEGER}
+    </select>
+    <select id="getParentWithoutComplex" resultMap="personMap" parameterType="Person">
+        SELECT id, firstName, lastName, parent_id, parent_firstName, parent_lastName
+        FROM Person
+        WHERE id = #{id,jdbcType=INTEGER}
+    </select>
+    <select id="getWithComplex" resultMap="personMapComplex" parameterType="long">
+        SELECT id, firstName, lastName, parent_id, parent_firstName, parent_lastName
+        FROM Person
+        WHERE id = #{id,jdbcType=INTEGER}
+    </select>
+    <select id="getParentWithComplex" resultMap="personMapComplex" parameterType="Person">
+        SELECT id, firstName, lastName, parent_id, parent_firstName, parent_lastName
+        FROM Person
+        WHERE firstName = #{firstName,jdbcType=VARCHAR}
+        AND lastName = #{lastName,jdbcType=VARCHAR}
+        LIMIT 1
+    </select>
+    
+</mapper>

Added: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/PersonMapper.java
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/PersonMapper.java?rev=887489&view=auto
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/PersonMapper.java (added)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/PersonMapper.java Sat Dec  5 03:26:08 2009
@@ -0,0 +1,7 @@
+package org.apache.ibatis.submitted.complex_column;
+
+public interface PersonMapper {
+    
+    public Person getWithoutComplex(Long id);
+    public Person getWithComplex(Long id);
+}

Added: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/ibatisConfig.xml
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/ibatisConfig.xml?rev=887489&view=auto
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/ibatisConfig.xml (added)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/submitted/complex_column/ibatisConfig.xml Sat Dec  5 03:26:08 2009
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE configuration
+    PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
+    "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
+
+<configuration>
+    <typeAliases>
+        <typeAlias alias="Person" type="org.apache.ibatis.submitted.complex_column.Person"/>
+    </typeAliases>
+    
+    <environments default="test">
+        <environment id="test">
+            <transactionManager type="JDBC"></transactionManager>
+            <dataSource type="UNPOOLED">
+                <property name="driver" value="org.hsqldb.jdbcDriver"/>
+                <property name="url" value="jdbc:hsqldb:mem:complex_column"/>
+                <property name="username" value="sa"/>
+            </dataSource>
+        </environment>
+    </environments>
+    
+    <mappers>
+        <mapper resource="org/apache/ibatis/submitted/complex_column/Person.xml"/>
+    </mappers>
+</configuration>