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);
+ }
}