You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ddlutils-dev@db.apache.org by to...@apache.org on 2006/05/18 16:20:06 UTC

svn commit: r407557 - /db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/ModelBasedResultSetIterator.java

Author: tomdz
Date: Thu May 18 07:20:05 2006
New Revision: 407557

URL: http://svn.apache.org/viewvc?rev=407557&view=rev
Log:
Enhanced the iterator used in query/fetch

Modified:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/ModelBasedResultSetIterator.java

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/ModelBasedResultSetIterator.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/ModelBasedResultSetIterator.java?rev=407557&r1=407556&r2=407557&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/ModelBasedResultSetIterator.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/ModelBasedResultSetIterator.java Thu May 18 07:20:05 2006
@@ -56,6 +56,10 @@
     private ResultSet _resultSet;
     /** The dyna class to use for creating beans. */
     private DynaClass _dynaClass;
+    /** Whether the case of identifiers matters. */
+    private boolean _caseSensitive;
+    /** Maps column names to table objects as given by the query hints. */
+    private Map _preparedQueryHints;
     /** Maps column names to properties. */
     private Map _columnsToProperties = new ListOrderedMap();
     /** Whether the next call to hasNext or next needs advancement. */
@@ -83,10 +87,12 @@
             _platform           = platform;
             _resultSet          = resultSet;
             _cleanUpAfterFinish = cleanUpAfterFinish;
+            _caseSensitive      = _platform.isDelimitedIdentifierModeOn();
+            _preparedQueryHints = prepareQueryHints(queryHints);
 
             try
             {
-                initFromMetaData(model, queryHints);
+                initFromMetaData(model);
             }
             catch (SQLException ex)
             {
@@ -103,16 +109,13 @@
     /**
      * Initializes this iterator from the resultset metadata.
      * 
-     * @param model      The database model
-     * @param queryHints The tables that were queried in the query that produced the given result set
+     * @param model The database model
      */
-    private void initFromMetaData(Database model, Table[] queryHints) throws SQLException
+    private void initFromMetaData(Database model) throws SQLException
     {
-        ResultSetMetaData metaData           = _resultSet.getMetaData();
-        String            tableName          = null;
-        boolean           singleKnownTable   = true;
-        boolean           caseSensitive      = _platform.isDelimitedIdentifierModeOn();
-        Map               preparedQueryHints = prepareQueryHints(queryHints, caseSensitive);
+        ResultSetMetaData metaData         = _resultSet.getMetaData();
+        String            tableName        = null;
+        boolean           singleKnownTable = true;
 
         for (int idx = 1; idx <= metaData.getColumnCount(); idx++)
         {
@@ -123,13 +126,13 @@
             if ((tableOfColumn != null) && (tableOfColumn.length() > 0))
             {
                 // the JDBC driver gave us enough meta data info
-                table = model.findTable(tableOfColumn, caseSensitive);
+                table = model.findTable(tableOfColumn, _caseSensitive);
             }
             else
             {
                 // not enough info in the meta data of the result set, lets try the
                 // user-supplied query hints
-                table         = (Table)preparedQueryHints.get(caseSensitive ? columnName : columnName.toLowerCase());
+                table         = (Table)_preparedQueryHints.get(_caseSensitive ? columnName : columnName.toLowerCase());
                 tableOfColumn = (table == null ? null : table.getName());
             }
             if (tableName == null)
@@ -145,7 +148,7 @@
 
             if (table != null)
             {
-                Column column = table.findColumn(columnName, caseSensitive);
+                Column column = table.findColumn(columnName, _caseSensitive);
 
                 if (column != null)
                 {
@@ -175,11 +178,10 @@
      * Prepares the query hints by extracting the column names and using them as keys
      * into the resulting map pointing to the corresponding table.
      *  
-     * @param queryHints    The query hints
-     * @param caseSensitive Whether the case of the column names is important
+     * @param queryHints The query hints
      * @return The column name -> table map
      */
-    private Map prepareQueryHints(Table[] queryHints, boolean caseSensitive)
+    private Map prepareQueryHints(Table[] queryHints)
     {
         Map result = new HashMap();
 
@@ -189,7 +191,7 @@
             {
                 String columnName = queryHints[tableIdx].getColumn(columnIdx).getName();
 
-                if (!caseSensitive)
+                if (!_caseSensitive)
                 {
                     columnName = columnName.toLowerCase();
                 }
@@ -240,7 +242,13 @@
                     Map.Entry entry      = (Map.Entry)it.next();
                     String    columnName = (String)entry.getKey();
                     String    propName   = (String)entry.getValue();
-                    Object    value      = _platform.getObjectFromResultSet(_resultSet, columnName, table);
+                    Table     curTable   = table;
+
+                    if (curTable == null)
+                    {
+                        curTable = (Table)_preparedQueryHints.get(_caseSensitive ? columnName : columnName.toLowerCase());
+                    }
+                    Object value = _platform.getObjectFromResultSet(_resultSet, columnName, curTable);
 
                     bean.set(propName, value);
                 }