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/22 15:07:58 UTC

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

Author: aadamchik
Date: Fri Jun 22 06:07:56 2007
New Revision: 549810

URL: http://svn.apache.org/viewvc?view=rev&rev=549810
Log:
ITS-809 Support for explicit mapping of SQL results with SQLResultSetMapping

Added:
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLResultSetMapping.java
Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQuery.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/DefaultQueryMetadata.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadata.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadataWrapper.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/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalQuery.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/remote/RangeQuery.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/DataObjectUtilsTest.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/MockQueryMetadata.java
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/DataObjectUtilsTest.xml
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextSQLTemplateTest.xml

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQuery.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQuery.java?view=diff&rev=549810&r1=549809&r2=549810
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQuery.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQuery.java Fri Jun 22 06:07:56 2007
@@ -29,6 +29,7 @@
 import org.apache.cayenne.query.QueryRouter;
 import org.apache.cayenne.query.SQLAction;
 import org.apache.cayenne.query.SQLActionVisitor;
+import org.apache.cayenne.query.SQLResultSetMapping;
 import org.apache.cayenne.reflect.ClassDescriptor;
 
 /**
@@ -46,6 +47,10 @@
 
     public QueryMetadata getMetaData(EntityResolver resolver) {
         return this;
+    }
+    
+    public SQLResultSetMapping getResultSetMapping() {
+        return null;
     }
 
     public String getName() {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java?view=diff&rev=549810&r1=549809&r2=549810
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java Fri Jun 22 06:07:56 2007
@@ -48,6 +48,7 @@
 import org.apache.cayenne.query.QueryRouter;
 import org.apache.cayenne.query.RefreshQuery;
 import org.apache.cayenne.query.RelationshipQuery;
+import org.apache.cayenne.query.SQLResultSetMapping;
 import org.apache.cayenne.reflect.ClassDescriptor;
 import org.apache.cayenne.util.GenericResponse;
 import org.apache.cayenne.util.ListResponse;
@@ -121,7 +122,10 @@
         }
 
         if (!noObjectConversion) {
-            interceptObjectConversion();
+
+            if (interceptMappedConversion() != DONE) {
+                interceptObjectConversion();
+            }
         }
 
         return response;
@@ -455,6 +459,66 @@
                 }
             }
         }
+    }
+
+    private boolean interceptMappedConversion() {
+        SQLResultSetMapping rsMapping = metadata.getResultSetMapping();
+
+        if (rsMapping == null) {
+            return !DONE;
+        }
+
+        List mainRows = response.firstList();
+        if (mainRows != null && !mainRows.isEmpty()) {
+
+            Collection columns = rsMapping.getColumnResults();
+            if (columns.isEmpty()) {
+                throw new CayenneRuntimeException(
+                        "Invalid result set mapping, no columns mapped.");
+            }
+
+            Object[] columnsArray = columns.toArray();
+            int rowsLen = mainRows.size();
+            int rowWidth = columnsArray.length;
+
+            List objects = new ArrayList(rowsLen);
+
+            // add scalars to the result
+            if (rowWidth == 1) {
+
+                for (int i = 0; i < rowsLen; i++) {
+                    Map row = (Map) mainRows.get(i);
+                    objects.add(row.get(columnsArray[0]));
+                }
+            }
+            // add Object[]'s to the result
+            else {
+                for (int i = 0; i < rowsLen; i++) {
+                    Map row = (Map) mainRows.get(i);
+                    Object[] rowDecoded = new Object[rowWidth];
+
+                    for (int j = 0; j < rowWidth; j++) {
+                        rowDecoded[j] = row.get(columnsArray[j]);
+                    }
+
+                    objects.add(rowDecoded);
+                }
+            }
+
+            if (response instanceof GenericResponse) {
+                ((GenericResponse) response).replaceResult(mainRows, objects);
+            }
+            else if (response instanceof ListResponse) {
+                this.response = new ListResponse(objects);
+            }
+            else {
+                throw new IllegalStateException("Unknown response object: "
+                        + this.response);
+            }
+
+        }
+
+        return DONE;
     }
 
     public void route(QueryEngine engine, Query query, Query substitutedQuery) {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java?view=diff&rev=549810&r1=549809&r2=549810
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java Fri Jun 22 06:07:56 2007
@@ -51,6 +51,7 @@
 import org.apache.cayenne.query.PrefetchTreeNode;
 import org.apache.cayenne.query.QueryMetadata;
 import org.apache.cayenne.query.RefreshQuery;
+import org.apache.cayenne.query.SQLResultSetMapping;
 import org.apache.cayenne.reflect.AttributeProperty;
 import org.apache.cayenne.reflect.ClassDescriptor;
 import org.apache.cayenne.reflect.PropertyVisitor;
@@ -1097,6 +1098,10 @@
 
         public String getCacheKey() {
             return cacheKey;
+        }
+        
+        public SQLResultSetMapping getResultSetMapping() {
+            return null;
         }
 
         public String[] getCacheGroups() {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java?view=diff&rev=549810&r1=549809&r2=549810
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java Fri Jun 22 06:07:56 2007
@@ -288,6 +288,15 @@
     public ClassDescriptor getClassDescriptor() {
         return classDescriptor;
     }
+    
+    /**
+     * Always returns null, as this is not supported for most classic queries.
+     * 
+     * @since 3.0
+     */
+    public SQLResultSetMapping getResultSetMapping() {
+        return null;
+    }
 
     /**
      * @since 1.2

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/DefaultQueryMetadata.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/DefaultQueryMetadata.java?view=diff&rev=549810&r1=549809&r2=549810
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/DefaultQueryMetadata.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/DefaultQueryMetadata.java Fri Jun 22 06:07:56 2007
@@ -54,6 +54,13 @@
 
         return null;
     }
+    
+    /**
+     * @since 3.0
+     */
+    public SQLResultSetMapping getResultSetMapping() {
+        return null;
+    }
 
     public DbEntity getDbEntity() {
         return null;

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadata.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadata.java?view=diff&rev=549810&r1=549809&r2=549810
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadata.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadata.java Fri Jun 22 06:07:56 2007
@@ -94,7 +94,7 @@
     public static final boolean RESOLVING_INHERITED_DEFAULT = true;
 
     public static final String CACHE_POLICY_PROPERTY = "cayenne.GenericSelectQuery.cachePolicy";
-    
+
     /**
      * @since 3.0
      */
@@ -106,7 +106,7 @@
      * @since 3.0
      */
     ClassDescriptor getClassDescriptor();
-    
+
     /**
      * Returns an ObjEntity associated with a query or null if no such entity exists.
      */
@@ -201,4 +201,12 @@
      * are configured.
      */
     PrefetchTreeNode getPrefetchTree();
+
+    /**
+     * Returns a mapping of the result set data rows. Can be null. If not null overrides
+     * prefetching and data row settings.
+     * 
+     * @since 3.0
+     */
+    SQLResultSetMapping getResultSetMapping();
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadataWrapper.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadataWrapper.java?view=diff&rev=549810&r1=549809&r2=549810
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadataWrapper.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/QueryMetadataWrapper.java Fri Jun 22 06:07:56 2007
@@ -61,6 +61,13 @@
     boolean overrideExists(String key) {
         return overrides != null && overrides.containsKey(key);
     }
+    
+    /**
+     * @since 3.0
+     */
+    public SQLResultSetMapping getResultSetMapping() {
+        return info.getResultSetMapping();
+    }
 
     public DataMap getDataMap() {
         return info.getDataMap();

Added: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLResultSetMapping.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLResultSetMapping.java?view=auto&rev=549810
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLResultSetMapping.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLResultSetMapping.java Fri Jun 22 06:07:56 2007
@@ -0,0 +1,73 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.query;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * A metadata object that defines how a DataRow can be converted to result objects. This
+ * object provides mapping in a JPA-compilant manner, i.e. the DataRow is mapped either to
+ * a single Object or an Object[]. Each object (single result object or an array element
+ * object) can be a scalar or a Persistent object.
+ * 
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+// TODO: andrus, 6/22/2007 - support entity results mapping.
+public class SQLResultSetMapping {
+
+    protected String name;
+    protected Collection columnResults;
+
+    public SQLResultSetMapping() {
+
+    }
+
+    public SQLResultSetMapping(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Returns a collection of mapped columns.
+     */
+    public Collection getColumnResults() {
+        return columnResults != null ? columnResults : Collections.EMPTY_LIST;
+    }
+
+    /**
+     * Adds a result set column name to the mapping.
+     */
+    public void addColumnResult(String column) {
+        if (columnResults == null) {
+            columnResults = new ArrayList(3);
+        }
+
+        columnResults.add(column);
+    }
+}

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=549810&r1=549809&r2=549810
==============================================================================
--- 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 22 06:07:56 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>
@@ -593,5 +593,16 @@
      */
     public void setColumnNamesCapitalization(String columnNameCapitalization) {
         this.columnNamesCapitalization = columnNameCapitalization;
+    }
+
+    /**
+     * Sets an optional explicit mapping of the result set. If result set mapping is
+     * specified, the result of SQLTemplate may not be a normal list of Persistent objects
+     * or DataRows, instead it will follow the {@link SQLResultSetMapping} rules.
+     * 
+     * @since 3.0
+     */
+    public void setResultSetMapping(SQLResultSetMapping resultSetMapping) {
+        selectInfo.setResultSetMapping(resultSetMapping);
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java?view=diff&rev=549810&r1=549809&r2=549810
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java Fri Jun 22 06:07:56 2007
@@ -32,6 +32,16 @@
  * @author Andrus Adamchik
  */
 class SQLTemplateMetadata extends BaseQueryMetadata {
+    
+    private SQLResultSetMapping resultSetMapping;
+    
+    void setResultSetMapping(SQLResultSetMapping resultSetMapping) {
+        this.resultSetMapping = resultSetMapping;
+    }
+    
+    public SQLResultSetMapping getResultSetMapping() {
+        return resultSetMapping;
+    }
 
     boolean resolve(Object root, EntityResolver resolver, SQLTemplate query) {
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalQuery.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalQuery.java?view=diff&rev=549810&r1=549809&r2=549810
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalQuery.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalQuery.java Fri Jun 22 06:07:56 2007
@@ -30,6 +30,7 @@
 import org.apache.cayenne.query.QueryRouter;
 import org.apache.cayenne.query.SQLAction;
 import org.apache.cayenne.query.SQLActionVisitor;
+import org.apache.cayenne.query.SQLResultSetMapping;
 import org.apache.cayenne.reflect.ClassDescriptor;
 
 /**
@@ -62,6 +63,10 @@
 
             public String getCacheKey() {
                 return cacheKey;
+            }
+            
+            public SQLResultSetMapping getResultSetMapping() {
+                return metadata.getResultSetMapping();
             }
             
             public String[] getCacheGroups() {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/remote/RangeQuery.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/remote/RangeQuery.java?view=diff&rev=549810&r1=549809&r2=549810
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/remote/RangeQuery.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/remote/RangeQuery.java Fri Jun 22 06:07:56 2007
@@ -30,6 +30,7 @@
 import org.apache.cayenne.query.QueryRouter;
 import org.apache.cayenne.query.SQLAction;
 import org.apache.cayenne.query.SQLActionVisitor;
+import org.apache.cayenne.query.SQLResultSetMapping;
 import org.apache.cayenne.reflect.ClassDescriptor;
 
 /**
@@ -67,6 +68,10 @@
 
     public QueryMetadata getMetaData(EntityResolver resolver) {
         return new QueryMetadata() {
+            
+            public SQLResultSetMapping getResultSetMapping() {
+                return null;
+            }
 
             public String getCacheKey() {
                 return cacheKey;

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/DataObjectUtilsTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/DataObjectUtilsTest.java?view=diff&rev=549810&r1=549809&r2=549810
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/DataObjectUtilsTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/DataObjectUtilsTest.java Fri Jun 22 06:07:56 2007
@@ -28,7 +28,10 @@
 import org.apache.art.CharPkTestEntity;
 import org.apache.art.CompoundPkTestEntity;
 import org.apache.cayenne.access.DataContext;
+import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.query.ObjectIdQuery;
+import org.apache.cayenne.query.SQLResultSetMapping;
+import org.apache.cayenne.query.SQLTemplate;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.unit.CayenneCase;
 
@@ -40,6 +43,26 @@
     protected void setUp() throws Exception {
         super.setUp();
         deleteTestData();
+    }
+
+    public void testScalarObjectForQuery() throws Exception {
+        createTestData("testScalarObjectForQuery");
+        DataContext context = createDataContext();
+
+        String sql = "SELECT count(1) AS C FROM ARTIST";
+
+        DataMap map = getDomain().getMap("testmap");
+        SQLTemplate query = new SQLTemplate(map, sql);
+        query.setColumnNamesCapitalization(SQLTemplate.UPPERCASE_COLUMN_NAMES);
+
+        SQLResultSetMapping rsMap = new SQLResultSetMapping();
+        rsMap.addColumnResult("C");
+        query.setResultSetMapping(rsMap);
+
+        Object object = DataObjectUtils.objectForQuery(context, query);
+        assertNotNull(object);
+        assertTrue(object instanceof Number);
+        assertEquals(2, ((Number) object).intValue());
     }
 
     public void testObjectForQuery() throws Exception {

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=549810&r1=549809&r2=549810
==============================================================================
--- 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 22 06:07:56 2007
@@ -31,6 +31,8 @@
 import org.apache.cayenne.DataObjectUtils;
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.query.SQLResultSetMapping;
 import org.apache.cayenne.query.SQLTemplate;
 import org.apache.cayenne.unit.CayenneCase;
 
@@ -47,6 +49,55 @@
         context = createDataContext();
     }
 
+    public void testSQLResultSetMappingScalar() throws Exception {
+        createTestData("testSQLResultSetMappingScalar");
+        
+        String sql = "SELECT count(1) AS C FROM ARTIST";
+        
+        DataMap map = getDomain().getMap("testmap");
+        SQLTemplate query = new SQLTemplate(map, sql);
+        query.setColumnNamesCapitalization(SQLTemplate.UPPERCASE_COLUMN_NAMES);
+        
+        SQLResultSetMapping rsMap = new SQLResultSetMapping();
+        rsMap.addColumnResult("C");
+        query.setResultSetMapping(rsMap);
+        
+        List objects = createDataContext().performQuery(query);
+        assertEquals(1, objects.size());
+        
+        Object o = objects.get(0);
+        assertTrue(o instanceof Number);
+        assertEquals(4, ((Number) o).intValue());
+    }
+    
+    public void testSQLResultSetMappingScalarArray() throws Exception {
+        createTestData("testSQLResultSetMappingScalar");
+        
+        String sql = "SELECT count(1) AS C, 77 AS D FROM ARTIST";
+        
+        DataMap map = getDomain().getMap("testmap");
+        SQLTemplate query = new SQLTemplate(map, sql);
+        query.setColumnNamesCapitalization(SQLTemplate.UPPERCASE_COLUMN_NAMES);
+        
+        SQLResultSetMapping rsMap = new SQLResultSetMapping();
+        rsMap.addColumnResult("C");
+        rsMap.addColumnResult("D");
+        query.setResultSetMapping(rsMap);
+        
+        List objects = createDataContext().performQuery(query);
+        assertEquals(1, objects.size());
+        
+        Object o = objects.get(0);
+        assertTrue(o instanceof Object[]);
+        
+        Object[] row = (Object[]) o;
+        assertEquals(2, row.length);
+        
+        assertEquals(4, ((Number) row[0]).intValue());
+        assertEquals(77, ((Number) row[1]).intValue());
+    }
+
+
     public void testColumnNamesCapitalization() throws Exception {
         getAccessStack().createTestData(DataContextCase.class, "testArtists", null);
 
@@ -197,7 +248,6 @@
         assertEquals(33002, DataObjectUtils.intPKForObject(p));
     }
 
-    
     public void testBindObjectEqualNull() throws Exception {
         createTestData("prepare");
 
@@ -262,7 +312,7 @@
         CompoundFkTestEntity p = (CompoundFkTestEntity) objects.get(0);
         assertEquals(33001, DataObjectUtils.intPKForObject(p));
     }
-    
+
     public void testBindObjectNotEqualCompound() throws Exception {
         createTestData("testBindObjectEqualCompound");
 
@@ -289,7 +339,6 @@
         CompoundFkTestEntity p = (CompoundFkTestEntity) objects.get(0);
         assertEquals(33002, DataObjectUtils.intPKForObject(p));
     }
-
 
     public void testBindObjectNotEqualNull() throws Exception {
         createTestData("prepare");

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/query/MockQueryMetadata.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/query/MockQueryMetadata.java?view=diff&rev=549810&r1=549809&r2=549810
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/query/MockQueryMetadata.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/java/org/apache/cayenne/query/MockQueryMetadata.java Fri Jun 22 06:07:56 2007
@@ -26,6 +26,10 @@
 import org.apache.cayenne.reflect.ClassDescriptor;
 
 public class MockQueryMetadata implements QueryMetadata {
+    
+    public SQLResultSetMapping getResultSetMapping() {
+        return null;
+    }
 
     public ObjEntity getObjEntity() {
         return null;

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/DataObjectUtilsTest.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/DataObjectUtilsTest.xml?view=diff&rev=549810&r1=549809&r2=549810
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/DataObjectUtilsTest.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/DataObjectUtilsTest.xml Fri Jun 22 06:07:56 2007
@@ -39,7 +39,16 @@
 	
 	<!-- ======================================= -->
 	<!-- Data Sets -->
-	<!-- ======================================= -->	
+	<!-- ======================================= -->
+	<bean id="testScalarObjectForQuery" class="java.util.ArrayList">
+		<constructor-arg>
+			<list>
+				<ref bean="A1"/>
+				<ref bean="A2"/>
+			</list>
+		</constructor-arg>
+	</bean>
+		
 	<bean id="testCompoundPKForObject" class="java.util.ArrayList">
 		<constructor-arg>
 			<list>

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextSQLTemplateTest.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextSQLTemplateTest.xml?view=diff&rev=549810&r1=549809&r2=549810
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextSQLTemplateTest.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/test/resources/dml/access.DataContextSQLTemplateTest.xml Fri Jun 22 06:07:56 2007
@@ -112,4 +112,15 @@
 			</list>
 		</constructor-arg>
 	</bean>
+	
+	<bean id="testSQLResultSetMappingScalar" class="java.util.ArrayList">
+		<constructor-arg>
+			<list>
+				<ref bean="A1"/>
+				<ref bean="A2"/>
+				<ref bean="A3"/>
+				<ref bean="A4"/>
+			</list>
+		</constructor-arg>
+	</bean>
 </beans>