You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2007/06/08 21:29:07 UTC

svn commit: r545601 - in /cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src: main/java/org/apache/cayenne/access/jdbc/ main/java/org/apache/cayenne/query/ test/java/org/apache/cayenne/access/ test/java/org/apache/cayenne/query/

Author: aadamchik
Date: Fri Jun  8 12:29:06 2007
New Revision: 545601

URL: http://svn.apache.org/viewvc?view=rev&rev=545601
Log:
CAY-800: SQLTemplate improvement
runtime support for the capitalization control api. 
still need to do modeler and xml loading support

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptor.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLTemplate.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextSQLTemplateTest.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/query/SQLTemplateTest.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptor.java?view=diff&rev=545601&r1=545600&r2=545601
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptor.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptor.java Fri Jun  8 12:29:06 2007
@@ -77,6 +77,28 @@
 
         indexTypes(types);
     }
+    
+    /**
+     * Converts result column labels to uppercase using the default Locale.
+     * 
+     * @since 3.0 
+     */
+    public void forceUpperCaseColumnNames() {
+        for(int i = 0; i < columns.length; i++) {
+            columns[i].setLabel(columns[i].getLabel().toUpperCase());
+        }
+    }
+    
+    /**
+     * Converts result column labels to lowercase using the default Locale.
+     * 
+     * @since 3.0 
+     */
+    public void forceLowerCaseColumnNames() {
+        for(int i = 0; i < columns.length; i++) {
+            columns[i].setLabel(columns[i].getLabel().toLowerCase());
+        }
+    }
 
     /**
      * Initializes converters for columns.

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java?view=diff&rev=545601&r1=545600&r2=545601
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java Fri Jun  8 12:29:06 2007
@@ -200,6 +200,17 @@
         RowDescriptor descriptor = (compiled.getResultColumns().length > 0)
                 ? new RowDescriptor(compiled.getResultColumns(), types)
                 : new RowDescriptor(resultSet, types);
+                
+           if (query.getColumnNamesCapitalization() != null) {
+            if (SQLTemplate.LOWERCASE_COLUMN_NAMES.equals(query
+                    .getColumnNamesCapitalization())) {
+                descriptor.forceLowerCaseColumnNames();
+            }
+            else if (SQLTemplate.UPPERCASE_COLUMN_NAMES.equals(query
+                    .getColumnNamesCapitalization())) {
+                descriptor.forceUpperCaseColumnNames();
+            }
+        }
 
         JDBCResultIterator result = new JDBCResultIterator(
                 connection,

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLTemplate.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLTemplate.java?view=diff&rev=545601&r1=545600&r2=545601
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLTemplate.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLTemplate.java Fri Jun  8 12:29:06 2007
@@ -48,7 +48,7 @@
  * </p>
  * 
  * <pre>
- *                    SELECT ID, NAME FROM SOME_TABLE WHERE NAME LIKE $a
+ *  SELECT ID, NAME FROM SOME_TABLE WHERE NAME LIKE $a
  * </pre>
  * 
  * <p>
@@ -75,6 +75,16 @@
 public class SQLTemplate extends AbstractQuery implements ParameterizedQuery,
         XMLSerializable {
 
+    /**
+     * @since 3.0
+     */
+    public static final String UPPERCASE_COLUMN_NAMES = "upper";
+
+    /**
+     * @since 3.0
+     */
+    public static final String LOWERCASE_COLUMN_NAMES = "lower";
+
     private static final Transformer nullMapTransformer = new Transformer() {
 
         public Object transform(Object input) {
@@ -85,6 +95,7 @@
     protected String defaultTemplate;
     protected Map templates;
     protected Map[] parameters;
+    protected String columnNamesCapitalization;
 
     SQLTemplateMetadata selectInfo = new SQLTemplateMetadata();
 
@@ -335,7 +346,7 @@
     public void setCachePolicy(String policy) {
         this.selectInfo.setCachePolicy(policy);
     }
-    
+
     /**
      * @since 3.0
      */
@@ -532,5 +543,36 @@
      */
     public void clearPrefetches() {
         selectInfo.clearPrefetches();
+    }
+
+    /**
+     * Returns a column name capitalization policy applied to selecting queries. This is
+     * used to simplify mapping of the queries like "SELECT * FROM ...", ensuring that a
+     * chosen Cayenne column mapping strategy (e.g. all column names in uppercase) is
+     * portable across database engines that can have varying default capitalization.
+     * Default (null) value indicates that column names provided in result set are used
+     * unchanged.
+     * 
+     * @since 3.0
+     */
+    public String getColumnNamesCapitalization() {
+        return columnNamesCapitalization;
+    }
+
+    /**
+     * Sets a column name capitalization policy applied to selecting queries. This is used
+     * to simplify mapping of the queries like "SELECT * FROM ...", ensuring that a chosen
+     * Cayenne column mapping strategy (e.g. all column names in uppercase) is portable
+     * across database engines that can have varying default capitalization. Default
+     * (null) value indicates that column names provided in result set are used unchanged.
+     * <p/> Note that while a non-default setting is useful for queries that do not rely
+     * on a #result directive to describe columns, it works for all SQLTemplates the same way.
+     * 
+     * @param columnNameCapitalization Can be null of one of
+     *            {@link #LOWERCASE_COLUMN_NAMES} or {@link #UPPERCASE_COLUMN_NAMES}.
+     * @since 3.0
+     */
+    public void setColumnNamesCapitalization(String columnNameCapitalization) {
+        this.columnNamesCapitalization = columnNameCapitalization;
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextSQLTemplateTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextSQLTemplateTest.java?view=diff&rev=545601&r1=545600&r2=545601
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextSQLTemplateTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/access/DataContextSQLTemplateTest.java Fri Jun  8 12:29:06 2007
@@ -40,6 +40,37 @@
         context = createDataContext();
     }
 
+    public void testColumnNamesCapitalization() throws Exception {
+        getAccessStack().createTestData(DataContextCase.class, "testArtists", null);
+
+        String template = "SELECT * FROM ARTIST ORDER BY ARTIST_ID";
+        SQLTemplate query = new SQLTemplate(Artist.class, template);
+        query.setColumnNamesCapitalization(SQLTemplate.LOWERCASE_COLUMN_NAMES);
+        query.setFetchingDataRows(true);
+
+        List rows = context.performQuery(query);
+
+        DataRow row1 = (DataRow) rows.get(0);
+        assertFalse(row1.containsKey("ARTIST_ID"));
+        assertTrue(row1.containsKey("artist_id"));
+
+        DataRow row2 = (DataRow) rows.get(1);
+        assertFalse(row2.containsKey("ARTIST_ID"));
+        assertTrue(row2.containsKey("artist_id"));
+    
+        query.setColumnNamesCapitalization(SQLTemplate.UPPERCASE_COLUMN_NAMES);
+        
+        List rowsUpper = context.performQuery(query);
+
+        DataRow row3 = (DataRow) rowsUpper.get(0);
+        assertFalse(row3.containsKey("artist_id"));
+        assertTrue(row3.containsKey("ARTIST_ID"));
+
+        DataRow row4 = (DataRow) rowsUpper.get(1);
+        assertFalse(row4.containsKey("artist_id"));
+        assertTrue(row4.containsKey("ARTIST_ID"));
+    }
+
     public void testFetchDataRows() throws Exception {
         getAccessStack().createTestData(DataContextCase.class, "testArtists", null);
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/query/SQLTemplateTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/query/SQLTemplateTest.java?view=diff&rev=545601&r1=545600&r2=545601
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/query/SQLTemplateTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/query/SQLTemplateTest.java Fri Jun  8 12:29:06 2007
@@ -34,6 +34,13 @@
  * @author Andrus Adamchik
  */
 public class SQLTemplateTest extends TestCase {
+    
+    public void testColumnNameCapitalization() {
+        SQLTemplate q1 = new SQLTemplate("E1", "SELECT");
+        assertNull(q1.getColumnNamesCapitalization());
+        q1.setColumnNamesCapitalization(SQLTemplate.UPPERCASE_COLUMN_NAMES);
+        assertEquals(SQLTemplate.UPPERCASE_COLUMN_NAMES, q1.getColumnNamesCapitalization());
+    }
 
     public void testQueryWithParameters() {
         SQLTemplate q1 = new SQLTemplate("E1", "SELECT");