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 2006/01/24 23:47:36 UTC

svn commit: r372039 - in /ibatis/trunk/java/mapper/mapper2: src/com/ibatis/sqlmap/engine/mapper/ src/com/ibatis/sqlmap/engine/mapper/matcher/ src/com/ibatis/sqlmap/engine/mapper/metadata/ test/com/ibatis/sqlmap/mapper/

Author: cbegin
Date: Tue Jan 24 14:47:31 2006
New Revision: 372039

URL: http://svn.apache.org/viewcvs?rev=372039&view=rev
Log:
added primary key support to database metadata

Added:
    ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/ClassMapper.java
    ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/
    ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/Canonicalizer.java
    ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/Match.java
    ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/MatchCalculator.java
    ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/NameMatcher.java
Removed:
    ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/Canonicalizer.java
    ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/Match.java
    ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/MatchCalculator.java
    ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/NameMatcher.java
Modified:
    ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/metadata/DatabaseFactory.java
    ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/metadata/Table.java
    ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/CanonicalizerTest.java
    ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/DatabaseMetadataTest.java
    ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/MatchCalculatorTest.java
    ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/NameMatcherTest.java

Added: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/ClassMapper.java
URL: http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/ClassMapper.java?rev=372039&view=auto
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/ClassMapper.java (added)
+++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/ClassMapper.java Tue Jan 24 14:47:31 2006
@@ -0,0 +1,7 @@
+package com.ibatis.sqlmap.engine.mapper;
+
+public class ClassMapper {
+
+  
+
+}

Added: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/Canonicalizer.java
URL: http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/Canonicalizer.java?rev=372039&view=auto
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/Canonicalizer.java (added)
+++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/Canonicalizer.java Tue Jan 24 14:47:31 2006
@@ -0,0 +1,177 @@
+package com.ibatis.sqlmap.engine.mapper.matcher;
+
+import java.util.StringTokenizer;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+
+public class Canonicalizer {
+
+  public Map buildCanonicalMap(String[] originals) {
+    return buildCanonicalMap(originals, null);
+  }
+  public Map buildCanonicalMap(String[] originals, String parentName) {
+    Map map = new HashMap();
+    for (int i=0; i < originals.length; i++) {
+      map.put(originals[i], originals[i]);
+    }
+    upperCase(map);
+    removeUnderscores(map);
+    removePKFK(map);
+    removePrefixes(map);
+    removeSuffixes(map);
+    removePluralization(map);
+    removeParentName(map, parentName);
+    return map;
+  }
+
+  private void removeParentName(Map map, String parentName) {
+    if (parentName != null) {
+      parentName = parentName.toUpperCase();
+      Iterator i = map.keySet().iterator();
+      while (i.hasNext()) {
+        String original = (String) i.next();
+        String canonical = (String) map.get(original);
+        if (canonical.startsWith(parentName)) {
+          map.put(original, canonical.substring(parentName.length()));
+        }
+        if (canonical.endsWith(parentName)) {
+          map.put(original, canonical.substring(0, canonical.length() - parentName.length()));
+        }
+      }
+    }
+  }
+
+  private void upperCase(Map map) {
+    Iterator i = map.keySet().iterator();
+    while (i.hasNext()) {
+      String original = (String) i.next();
+      String canonical = (String) map.get(original);
+      map.put(original, canonical.toUpperCase());
+    }
+  }
+
+  private void removePKFK(Map map) {
+    Iterator i = map.keySet().iterator();
+    while (i.hasNext()) {
+      String original = (String) i.next();
+      String canonical = (String) map.get(original);
+      if (canonical.startsWith("PK")) {
+        map.put(original, canonical.substring(2));
+      } else if (canonical.startsWith("FK")) {
+        map.put(original, canonical.substring(2));
+      }
+      if (canonical.endsWith("PK")) {
+        map.put(original, canonical.substring(0, canonical.length() - 2));
+      } else if (canonical.endsWith("FK")) {
+        map.put(original, canonical.substring(0, canonical.length() - 2));
+      }
+    }
+  }
+
+  private void removePrefixes(Map map) {
+    int prefix = findPrefixLength(map);
+
+    if (prefix > 1) {
+      Iterator i = map.keySet().iterator();
+      while (i.hasNext()) {
+        String original = (String) i.next();
+        String canonical = (String) map.get(original);
+        map.put(original, canonical.substring(prefix));
+      }
+    }
+  }
+
+  private void removeSuffixes(Map map) {
+    int suffix = findSuffixLength(map);
+
+    if (suffix > 1) {
+      Iterator i = map.keySet().iterator();
+      while (i.hasNext()) {
+        String original = (String) i.next();
+        String canonical = (String) map.get(original);
+        map.put(original, canonical.substring(0, canonical.length() - suffix));
+      }
+    }
+  }
+
+  private int findPrefixLength(Map map) {
+    String[] originals = (String[])map.keySet().toArray(new String[map.keySet().size()]);
+    char[] samples = ((String) map.get(findShortestString(originals))).toCharArray();
+    int prefix = 0;
+    for (int i=0; i < samples.length; i++) {
+      for (int j=0; j < originals.length; j++) {
+        String original = originals[j];
+        String canonical = (String) map.get(original);
+        if (canonical.charAt(prefix) != samples[i]) {
+          return prefix;
+        }
+      }
+      prefix++;
+    }
+    if (prefix == samples.length) {
+      prefix = 0;
+    }
+    return prefix;
+  }
+
+  private int findSuffixLength(Map map) {
+    String[] originals = (String[])map.keySet().toArray(new String[map.keySet().size()]);
+    char[] samples = ((String) map.get(findShortestString(originals))).toCharArray();
+    int suffix = 0;
+    for (int i=0; i < samples.length; i++) {
+      for (int j=0; j < originals.length; j++) {
+        String original = originals[j];
+        String canonical = (String) map.get(original);
+        if (canonical.charAt(canonical.length() - suffix - 1) != samples[samples.length - i - 1]) {
+          return suffix;
+        }
+      }
+      suffix++;
+    }
+    if (suffix == samples.length) {
+      suffix = 0;
+    }
+    return suffix;
+  }
+
+  private String findShortestString(String[] originals) {
+    String shortest = originals[0];
+    for (int i=0; i < originals.length; i++) {
+      if (originals[i].length() < shortest.length()) {
+        shortest = originals[i];
+      }
+    }
+    return shortest;
+  }
+
+  private void removeUnderscores (Map map) {
+    Iterator i = map.keySet().iterator();
+    while (i.hasNext()) {
+      String original = (String) i.next();
+      String canonical = (String) map.get(original);
+      map.put(original, removeUnderscoresFromString(canonical));
+    }
+  }
+
+  private void removePluralization (Map map) {
+    Iterator i = map.keySet().iterator();
+    while (i.hasNext()) {
+      String original = (String) i.next();
+      String canonical = (String) map.get(original);
+      if (canonical.endsWith("S") || canonical.endsWith("s")) {
+        map.put(original, canonical.substring(0, canonical.length() - 1));
+      }
+    }
+  }
+
+  private String removeUnderscoresFromString (String original) {
+    StringBuffer canonical = new StringBuffer();
+    StringTokenizer parser = new StringTokenizer (original, "_", false);
+    while(parser.hasMoreTokens()) {
+      canonical.append(parser.nextToken());
+    }
+    return canonical.toString();
+  }
+
+}

Added: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/Match.java
URL: http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/Match.java?rev=372039&view=auto
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/Match.java (added)
+++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/Match.java Tue Jan 24 14:47:31 2006
@@ -0,0 +1,32 @@
+package com.ibatis.sqlmap.engine.mapper.matcher;
+
+public class Match {
+
+  private String property;
+  private String field;
+  private double matchScore;
+
+  public Match(String property, String field, double matchScore) {
+    this.property = property;
+    this.field = field;
+    this.matchScore = matchScore;
+  }
+
+  public String getProperty() {
+    return property;
+  }
+
+  public String getField() {
+    return field;
+  }
+
+  public double getMatchScore() {
+    return matchScore;
+  }
+
+
+  public String toString() {
+    return property + " => " + field + " ("+matchScore+")";
+  }
+
+}

Added: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/MatchCalculator.java
URL: http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/MatchCalculator.java?rev=372039&view=auto
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/MatchCalculator.java (added)
+++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/MatchCalculator.java Tue Jan 24 14:47:31 2006
@@ -0,0 +1,69 @@
+package com.ibatis.sqlmap.engine.mapper.matcher;
+
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Iterator;
+
+public class MatchCalculator {
+
+  private static final int SET_BEGIN = 2;
+  private static final int SET_END = 5;
+  private static final double MAX_VALUE = 1;
+
+  public MatchCalculator() {
+  }
+
+  public double calculateMatch (String first, String second) {
+
+    Set firstSet = buildSets(first);
+    Set secondSet = buildSets(second);
+
+    double value1 = compareSets(firstSet, secondSet);
+    double value2 = compareSets(secondSet, firstSet);
+    return (value1 + value2) / 2;
+  }
+
+  private Set buildSets(String string) {
+    Set set = new HashSet();
+    char[] chars = string.toUpperCase().toCharArray();
+    for (int i = SET_BEGIN; i <= SET_END; i++) {
+      setsOf(i, chars, set);
+    }
+    return set;
+  }
+
+  private void setsOf(int size, char[] chars, Set set) {
+    for (int i=0; i < chars.length - size + 1; i++) {
+      char[] group = new char[size];
+      for (int j=0; j < group.length; j++) {
+        group[j] = chars[i+j];
+      }
+      set.add(new String(group));
+    }
+  }
+
+  private double compareSets(Set firstSet, Set secondSet) {
+    double value = MAX_VALUE;
+    double interval = calculateInterval(firstSet, secondSet);
+    Iterator i = firstSet.iterator();
+    while (i.hasNext()) {
+      String group = (String)i.next();
+      if (!secondSet.contains(group)) {
+        value -= interval;
+      }
+    }
+    return value;
+  }
+
+  private double calculateInterval(Set firstSet, Set secondSet) {
+    double interval;
+    if (firstSet.size() > secondSet.size()) {
+      interval = MAX_VALUE / firstSet.size();
+    } else {
+      interval = MAX_VALUE / secondSet.size();
+    }
+    return interval;
+  }
+
+
+}

Added: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/NameMatcher.java
URL: http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/NameMatcher.java?rev=372039&view=auto
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/NameMatcher.java (added)
+++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/matcher/NameMatcher.java Tue Jan 24 14:47:31 2006
@@ -0,0 +1,94 @@
+package com.ibatis.sqlmap.engine.mapper.matcher;
+
+import com.ibatis.sqlmap.engine.mapper.matcher.Canonicalizer;
+import com.ibatis.sqlmap.engine.mapper.matcher.Match;
+import com.ibatis.sqlmap.engine.mapper.matcher.MatchCalculator;
+
+import java.util.*;
+
+public class NameMatcher {
+
+  public Map matchNames(String[] properties, String[] fields) {
+    Map propertyMap = invertMap(buildCanonicalMap(properties));
+    Map fieldMap = invertMap(buildCanonicalMap(fields));
+
+    String[] canonicalProperties = setToStringArray(propertyMap.keySet());
+    String[] canonicalFields = setToStringArray(fieldMap.keySet());
+
+    // consider building in both directions
+    // consider tracking which fields have already been mapped to avoid duplicate mappings
+    List matchList = buildMatchList(canonicalProperties, canonicalFields);
+
+    Map matchedNames = new HashMap();
+    Iterator matches = matchList.iterator();
+    while(matches.hasNext()) {
+      Match match = (Match)matches.next();
+      String property = (String) propertyMap.get(match.getProperty());
+      String field = (String) fieldMap.get(match.getField());
+      matchedNames.put(property, field);
+    }
+    return matchedNames;
+  }
+
+  private Map buildCanonicalMap(String[] properties) {
+    return new Canonicalizer().buildCanonicalMap(properties);
+  }
+
+  private String[] setToStringArray(Set set) {
+    return (String[]) set.toArray(new String[set.size()]);
+  }
+
+  private List buildMatchList(String[] canonicalProperties, String[] canonicalFields) {
+    List matchList = new LinkedList();
+    MatchCalculator calc = new MatchCalculator();
+    for (int i = 0; i < canonicalProperties.length; i++) {
+      for (int j = 0; j < canonicalFields.length; j++) {
+        String prop = canonicalProperties[i];
+        String field = canonicalFields[j];
+        double score = calc.calculateMatch(prop, field);
+        Match match = new Match(prop, field, score);
+        matchList.add(match);
+      }
+    }
+    sortMatches(matchList);
+    removeDuplicatesAndLowScores (matchList);
+    return matchList;
+  }
+
+  private void removeDuplicatesAndLowScores(List matchList) {
+    Set usedProperties = new HashSet();
+    Set usedFields = new HashSet();
+    Iterator i = matchList.iterator();
+    while (i.hasNext()) {
+      Match m = (Match)i.next();
+      if (usedProperties.contains(m.getProperty()) || usedFields.contains(m.getField()) || m.getMatchScore() < 0.40) {
+        i.remove();
+      } else {
+        usedProperties.add(m.getProperty());
+        usedFields.add(m.getField());
+      }
+    }
+
+  }
+
+  private void sortMatches(List matchList) {
+    Collections.sort(matchList, new Comparator () {
+      public int compare(Object o1, Object o2) {
+        Match m1 = (Match) o1;
+        Match m2 = (Match) o2;
+        return m1.getMatchScore() < m2.getMatchScore() ? 1 : m1.getMatchScore() > m2.getMatchScore() ? -1 : 0;
+      }
+    });
+  }
+
+  private Map invertMap(Map original) {
+    Map inverse = new HashMap();
+    Iterator keys = original.keySet().iterator();
+    while (keys.hasNext()) {
+      Object key = keys.next();
+      Object value = original.get(key);
+      inverse.put(value, key);
+    }
+    return inverse;
+  }
+}

Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/metadata/DatabaseFactory.java
URL: http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/metadata/DatabaseFactory.java?rev=372039&r1=372038&r2=372039&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/metadata/DatabaseFactory.java (original)
+++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/metadata/DatabaseFactory.java Tue Jan 24 14:47:31 2006
@@ -1,40 +1,52 @@
 package com.ibatis.sqlmap.engine.mapper.metadata;
 
 import javax.sql.DataSource;
-import java.sql.SQLException;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.DatabaseMetaData;
+import java.sql.*;
 
 public class DatabaseFactory {
-
   private DatabaseFactory() {
   }
 
-  public static Database newDatabase (DataSource dataSource, String catalog, String schema) throws SQLException {
-    Database database = new Database (catalog, schema);
+  public static Database newDatabase(DataSource dataSource, String catalog, String schema) throws SQLException {
+    Database database = new Database(catalog, schema);
     Connection conn = dataSource.getConnection();
     ResultSet rs = null;
     try {
       DatabaseMetaData dbmd = conn.getMetaData();
-      rs = dbmd.getColumns(catalog, schema, null, null);
-      while (rs.next()) {
-        String tableName = rs.getString ("TABLE_NAME");
-        String columnName = rs.getString ("COLUMN_NAME");
-        int dataType = Integer.parseInt(rs.getString ("DATA_TYPE"));
-        Table table = database.getTable(tableName);
-        if (table == null) {
-          table = new Table(tableName);
-          database.addTable(table);
+
+      try {
+        rs = dbmd.getColumns(catalog, schema, null, null);
+        while (rs.next()) {
+          String tableName = rs.getString("TABLE_NAME");
+          String columnName = rs.getString("COLUMN_NAME");
+          int dataType = Integer.parseInt(rs.getString("DATA_TYPE"));
+          Table table = database.getTable(tableName);
+          if (table == null) {
+            table = new Table(tableName);
+            database.addTable(table);
+          }
+          table.addColumn(new Column(columnName, dataType));
         }
-        table.addColumn(new Column(columnName, dataType));
+      } finally {
+        if (rs != null) rs.close();
       }
-    } finally {
+
       try {
-        if (rs != null) rs.close();
+        String[] tableNames = database.getTableNames();
+        for (int i=0; i < tableNames.length; i++) {
+          Table table = database.getTable(tableNames[i]);
+          rs = dbmd.getPrimaryKeys(catalog, schema, table.getName());
+          if (rs.next()) {
+            String columnName = rs.getString("COLUMN_NAME");
+            table.setPrimaryKey (table.getColumn(columnName));
+          }
+        }
       } finally {
-        conn.close();
+        if (rs != null) rs.close();
       }
+
+    } finally {
+      conn.close();
     }
     return database;
   }

Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/metadata/Table.java
URL: http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/metadata/Table.java?rev=372039&r1=372038&r2=372039&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/metadata/Table.java (original)
+++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapper/metadata/Table.java Tue Jan 24 14:47:31 2006
@@ -4,10 +4,9 @@
 import java.util.Map;
 
 public class Table {
-
   private String name;
-
   private Map columns = new HashMap();
+  private Column primaryKey;
 
   public Table(String name) {
     this.name = name;
@@ -17,26 +16,31 @@
     return name;
   }
 
-  public void addColumn (Column col) {
+  public void addColumn(Column col) {
     columns.put(col.getName(), col);
   }
 
-  public Column getColumn (String name) {
+  public Column getColumn(String name) {
     return (Column) columns.get(name);
   }
 
-  public String[] getColumnNames () {
-    return (String[])columns.keySet().toArray(new String[columns.size()]);
+  public String[] getColumnNames() {
+    return (String[]) columns.keySet().toArray(new String[columns.size()]);
+  }
+
+  public void setPrimaryKey(Column column) {
+    primaryKey = column;
+  }
+
+  public Column getPrimaryKey() {
+    return primaryKey;
   }
 
   public boolean equals(Object o) {
     if (this == o) return true;
     if (o == null || getClass() != o.getClass()) return false;
-
     final Table table = (Table) o;
-
     if (name != null ? !name.equals(table.name) : table.name != null) return false;
-
     return true;
   }
 

Modified: ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/CanonicalizerTest.java
URL: http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/CanonicalizerTest.java?rev=372039&r1=372038&r2=372039&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/CanonicalizerTest.java (original)
+++ ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/CanonicalizerTest.java Tue Jan 24 14:47:31 2006
@@ -1,7 +1,7 @@
 package com.ibatis.sqlmap.mapper;
 
 import junit.framework.TestCase;
-import com.ibatis.sqlmap.engine.mapper.Canonicalizer;
+import com.ibatis.sqlmap.engine.mapper.matcher.Canonicalizer;
 
 import java.util.Map;
 

Modified: ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/DatabaseMetadataTest.java
URL: http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/DatabaseMetadataTest.java?rev=372039&r1=372038&r2=372039&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/DatabaseMetadataTest.java (original)
+++ ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/DatabaseMetadataTest.java Tue Jan 24 14:47:31 2006
@@ -32,6 +32,7 @@
     assertNotNull(table.getColumn("ACC_DATE_ADDED"));
     assertNotNull(table.getColumn("ACC_AGE"));
     assertNotNull(table.getColumn("ACC_CART_OPTION"));
+    assertEquals(table.getColumn("ACC_ID"), table.getPrimaryKey());
   }
 
 }

Modified: ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/MatchCalculatorTest.java
URL: http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/MatchCalculatorTest.java?rev=372039&r1=372038&r2=372039&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/MatchCalculatorTest.java (original)
+++ ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/MatchCalculatorTest.java Tue Jan 24 14:47:31 2006
@@ -1,7 +1,7 @@
 package com.ibatis.sqlmap.mapper;
 
 import junit.framework.TestCase;
-import com.ibatis.sqlmap.engine.mapper.MatchCalculator;
+import com.ibatis.sqlmap.engine.mapper.matcher.MatchCalculator;
 
 public class MatchCalculatorTest extends TestCase {
 

Modified: ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/NameMatcherTest.java
URL: http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/NameMatcherTest.java?rev=372039&r1=372038&r2=372039&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/NameMatcherTest.java (original)
+++ ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/mapper/NameMatcherTest.java Tue Jan 24 14:47:31 2006
@@ -1,6 +1,6 @@
 package com.ibatis.sqlmap.mapper;
 
-import com.ibatis.sqlmap.engine.mapper.NameMatcher;
+import com.ibatis.sqlmap.engine.mapper.matcher.NameMatcher;
 import junit.framework.TestCase;
 
 import java.util.Map;