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 2013/05/25 12:56:38 UTC

svn commit: r1486314 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/query/SQLSelect.java test/java/org/apache/cayenne/query/SQLSelectTest.java

Author: aadamchik
Date: Sat May 25 10:56:38 2013
New Revision: 1486314

URL: http://svn.apache.org/r1486314
Log:
CAY-1828  SQLSelect - generics friendly selecting raw sql query

support for scalar values

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SQLSelect.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SQLSelectTest.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SQLSelect.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SQLSelect.java?rev=1486314&r1=1486313&r2=1486314&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SQLSelect.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SQLSelect.java Sat May 25 10:56:38 2013
@@ -29,6 +29,7 @@ import org.apache.cayenne.DataRow;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.map.SQLResult;
 
 /**
  * A selecting query based on raw SQL and featuring fluent API.
@@ -59,12 +60,31 @@ public class SQLSelect<T> extends Indire
      * Creates a query that selects DataObjects.
      */
     public static <T> SQLSelect<T> query(Class<T> type, String sql) {
+        return new SQLSelect<T>(type, sql);
+    }
+
+    /**
+     * Creates a query that selects scalar values and uses default routing.
+     */
+    public static <T> SQLSelect<T> scalarQuery(Class<T> type, String sql) {
+        SQLSelect<T> query = new SQLSelect<T>(sql);
+        query.scalarType = type;
+        return query;
+    }
+
+    /**
+     * Creates a query that selects scalar values and uses routing based on the
+     * provided DataMap name.
+     */
+    public static <T> SQLSelect<T> scalarQuery(Class<T> type, String dataMapName, String sql) {
         SQLSelect<T> query = new SQLSelect<T>(sql);
-        query.type = type;
+        query.dataMapName = dataMapName;
+        query.scalarType = type;
         return query;
     }
 
-    protected Class<T> type;
+    protected Class<T> persistentType;
+    protected Class<T> scalarType;
     protected String dataMapName;
     protected StringBuilder sqlBuffer;
     protected QueryCacheStrategy cacheStrategy;
@@ -80,8 +100,8 @@ public class SQLSelect<T> extends Indire
         this(null, sql);
     }
 
-    public SQLSelect(Class<T> type, String sql) {
-        this.type = type;
+    public SQLSelect(Class<T> persistentType, String sql) {
+        this.persistentType = persistentType;
         this.sqlBuffer = sql != null ? new StringBuilder(sql) : new StringBuilder();
         this.parameters = new HashMap<String, Object>();
         this.limit = QueryMetadata.FETCH_LIMIT_DEFAULT;
@@ -98,7 +118,7 @@ public class SQLSelect<T> extends Indire
     }
 
     /**
-     * Selects a sinlge object using provided context. Essentially the inversion
+     * Selects a single object using provided context. Essentially the inversion
      * of "Cayenne.objectForSelect(context, query)".
      */
     public T selectOne(ObjectContext context) {
@@ -106,7 +126,11 @@ public class SQLSelect<T> extends Indire
     }
 
     public boolean isFetchingDataRows() {
-        return type == null;
+        return persistentType == null;
+    }
+    
+    public boolean isFetchingScalars() {
+        return scalarType != null;
     }
 
     public String getSql() {
@@ -144,8 +168,8 @@ public class SQLSelect<T> extends Indire
 
         Object root;
 
-        if (type != null) {
-            root = type;
+        if (persistentType != null) {
+            root = persistentType;
         } else if (dataMapName != null) {
             DataMap map = resolver.getDataMap(dataMapName);
             if (map == null) {
@@ -179,6 +203,12 @@ public class SQLSelect<T> extends Indire
         template.setFetchOffset(offset);
         template.setPageSize(pageSize);
         template.setStatementFetchSize(statementFetchSize);
+        
+        if(isFetchingScalars()) {
+            SQLResult resultMap = new SQLResult();
+            resultMap.addColumnResult("x");
+            template.setResult(resultMap);
+        }
 
         return template;
     }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SQLSelectTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SQLSelectTest.java?rev=1486314&r1=1486313&r2=1486314&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SQLSelectTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SQLSelectTest.java Sat May 25 10:56:38 2013
@@ -181,4 +181,35 @@ public class SQLSelectTest extends Serve
 
         assertEquals("artist3", a.getArtistName());
     }
+
+    public void test_SelectLong() throws Exception {
+
+        createArtistsDataSet();
+
+        long id = SQLSelect.scalarQuery(Long.class, "SELECT ARTIST_ID FROM ARTIST WHERE ARTIST_NAME = #bind($a)")
+                .bind("a", "artist3").selectOne(context);
+
+        assertEquals(3l, id);
+    }
+
+    public void test_SelectLongArray() throws Exception {
+
+        createArtistsDataSet();
+
+        List<Long> ids = SQLSelect.scalarQuery(Long.class, "SELECT ARTIST_ID FROM ARTIST ORDER BY ARTIST_ID").select(
+                context);
+
+        assertEquals(20, ids.size());
+        assertEquals(2l, ids.get(1).longValue());
+    }
+
+    public void test_SelectCount() throws Exception {
+
+        createArtistsDataSet();
+
+        int c = SQLSelect.scalarQuery(Integer.class, "SELECT COUNT(*) FROM ARTIST").bind("a", "artist3")
+                .selectOne(context);
+
+        assertEquals(20, c);
+    }
 }