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 2009/09/07 03:24:57 UTC
svn commit: r811963 - in /cayenne/main/trunk: docs/doc/src/main/resources/
framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/
framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/
framework/cayen...
Author: aadamchik
Date: Mon Sep 7 01:24:56 2009
New Revision: 811963
URL: http://svn.apache.org/viewvc?rev=811963&view=rev
Log:
CAY-1269 Remove SelectQuery custom columns feature
Modified:
cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/SelectTranslator.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SelectQuery.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalSelectQuery.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SelectQueryBasicsTest.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SelectQueryTest.java
Modified: cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt?rev=811963&r1=811962&r2=811963&view=diff
==============================================================================
--- cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt (original)
+++ cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt Mon Sep 7 01:24:56 2009
@@ -80,6 +80,7 @@
CAY-1218 Query caching loose ends
CAY-1221 Exclude JPA from releases
CAY-1250 Prefetching doesn't work with prefetched subentity
+CAY-1269 Remove SelectQuery custom columns feature
Bug Fixes Since M5:
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java?rev=811963&r1=811962&r2=811963&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java Mon Sep 7 01:24:56 2009
@@ -19,6 +19,7 @@
package org.apache.cayenne.access;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -29,15 +30,13 @@
import org.apache.cayenne.access.DataDomainSyncBucket.PropagatedValueFactory;
import org.apache.cayenne.access.util.DefaultOperationObserver;
import org.apache.cayenne.dba.PkGenerator;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.DbJoin;
import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.map.ObjRelationship;
import org.apache.cayenne.query.Query;
-import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.query.SQLTemplate;
/**
* A holder of flattened relationship modification data.
@@ -135,7 +134,7 @@
}
/**
- * Returns pk snapshots for join records for the single-stp flattened relationship.
+ * Returns pk snapshots for join records for the single-step flattened relationship.
* Multiple joins between the same pair of objects are theoretically possible, so the
* return value is a list.
*/
@@ -161,24 +160,42 @@
// TODO: this should be optimized in the future, but now DeleteBatchQuery
// expects a PK snapshot, so we must provide it.
- SelectQuery query = new SelectQuery(joinEntity, ExpressionFactory.matchAllDbExp(
- snapshot,
- Expression.EQUAL_TO));
- query.setFetchingDataRows(true);
+ StringBuilder sql = new StringBuilder("SELECT ");
+ Collection<DbAttribute> pk = joinEntity.getPrimaryKeys();
- for (DbAttribute dbAttr : joinEntity.getPrimaryKeys()) {
- query.addCustomDbAttribute(dbAttr.getName());
+ int i = pk.size();
+ for (DbAttribute attribute : joinEntity.getPrimaryKeys()) {
+ sql.append(attribute.getName());
+ if (--i > 0) {
+ sql.append(", ");
+ }
}
- final List[] result = new List[1];
-
- node.performQueries(Collections.singleton((Query) query), new DefaultOperationObserver() {
+ sql.append(" FROM ").append(joinEntity.getFullyQualifiedName()).append(" WHERE ");
+ i = snapshot.size();
+ for (Object key : snapshot.keySet()) {
+ sql.append(key).append(" #bindEqual($").append(key).append(")");
- @Override
- public void nextRows(Query query, List dataRows) {
- result[0] = dataRows;
+ if (--i > 0) {
+ sql.append(" AND ");
}
- });
+ }
+
+ SQLTemplate query = new SQLTemplate(joinEntity.getDataMap(), sql.toString());
+ query.setParameters(snapshot);
+ query.setFetchingDataRows(true);
+
+ final List[] result = new List[1];
+
+ node.performQueries(
+ Collections.singleton((Query) query),
+ new DefaultOperationObserver() {
+
+ @Override
+ public void nextRows(Query query, List dataRows) {
+ result[0] = dataRows;
+ }
+ });
return result[0];
}
@@ -248,7 +265,8 @@
Map<String, ?> sourceId = this.sourceId.getIdSnapshot();
Map<String, ?> destinationId = this.destinationId.getIdSnapshot();
- Map<String, Object> snapshot = new HashMap<String, Object>(sourceId.size() + destinationId.size(), 1);
+ Map<String, Object> snapshot = new HashMap<String, Object>(sourceId.size()
+ + destinationId.size(), 1);
for (DbJoin join : firstDbRel.getJoins()) {
snapshot.put(join.getTargetName(), sourceId.get(join.getSourceName()));
}
@@ -275,7 +293,8 @@
List<DbJoin> fromSourceJoins = firstDbRel.getJoins();
List<DbJoin> toTargetJoins = secondDbRel.getJoins();
- Map<String, Object> snapshot = new HashMap<String, Object>(fromSourceJoins.size() + toTargetJoins.size(), 1);
+ Map<String, Object> snapshot = new HashMap<String, Object>(fromSourceJoins.size()
+ + toTargetJoins.size(), 1);
for (int i = 0, numJoins = fromSourceJoins.size(); i < numJoins; i++) {
DbJoin join = fromSourceJoins.get(i);
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/SelectTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/SelectTranslator.java?rev=811963&r1=811962&r2=811963&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/SelectTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/SelectTranslator.java Mon Sep 7 01:24:56 2009
@@ -280,9 +280,8 @@
List<ColumnDescriptor> columns = new ArrayList<ColumnDescriptor>();
SelectQuery query = getSelectQuery();
- // for query with custom attributes use a different strategy
- if (query.isFetchingCustomAttributes()) {
- appendCustomColumns(columns, query);
+ if (query.getRoot() instanceof DbEntity) {
+ appendDbEntityColumns(columns, query);
}
else if (getQueryMetadata().getPageSize() > 0) {
appendIdColumns(columns, query);
@@ -294,6 +293,20 @@
return columns;
}
+ List<ColumnDescriptor> appendDbEntityColumns(
+ List<ColumnDescriptor> columns,
+ SelectQuery query) {
+
+ final Set<ColumnTracker> attributes = new HashSet<ColumnTracker>();
+
+ DbEntity table = getRootDbEntity();
+ for (DbAttribute dba : table.getAttributes()) {
+ appendColumn(columns, null, dba, attributes, null);
+ }
+
+ return columns;
+ }
+
/**
* Appends columns needed for object SelectQuery to the provided columns list.
*/
@@ -519,35 +532,6 @@
return columns;
}
- /**
- * Appends custom columns from SelectQuery to the provided list.
- *
- * @deprecated since 3.0. Will likely be removed after 3.0M6. Can be replaced with
- * EJBQL.
- */
- @Deprecated
- List<ColumnDescriptor> appendCustomColumns(
- List<ColumnDescriptor> columns,
- SelectQuery query) {
-
- List<String> customAttributes = query.getCustomDbAttributes();
- DbEntity table = getRootDbEntity();
- int len = customAttributes.size();
-
- for (int i = 0; i < len; i++) {
- DbAttribute attribute = (DbAttribute) table.getAttribute(customAttributes
- .get(i));
- if (attribute == null) {
- throw new CayenneRuntimeException("Attribute does not exist: "
- + customAttributes.get(i));
- }
-
- columns.add(new ColumnDescriptor(attribute, getCurrentAlias()));
- }
-
- return columns;
- }
-
private void appendColumn(
List<ColumnDescriptor> columns,
ObjAttribute objAttribute,
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SelectQuery.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SelectQuery.java?rev=811963&r1=811962&r2=811963&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SelectQuery.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/SelectQuery.java Mon Sep 7 01:24:56 2009
@@ -20,7 +20,6 @@
package org.apache.cayenne.query;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -46,7 +45,6 @@
public static final String DISTINCT_PROPERTY = "cayenne.SelectQuery.distinct";
public static final boolean DISTINCT_DEFAULT = false;
- protected List<String> customDbAttributes;
protected List<Ordering> orderings;
protected boolean distinct;
@@ -144,8 +142,8 @@
public QueryMetadata getMetaData(EntityResolver resolver) {
metaData.resolve(root, resolver, this);
- // must force DataRows if custom attributes are fetched
- if (isFetchingCustomAttributes()) {
+ // must force DataRows if DbEntity is fetched
+ if (root instanceof DbEntity) {
QueryMetadataWrapper wrapper = new QueryMetadataWrapper(metaData);
wrapper.override(QueryMetadata.FETCHING_DATA_ROWS_PROPERTY, Boolean.TRUE);
return wrapper;
@@ -311,10 +309,6 @@
query.addOrderings(orderings);
}
- if (customDbAttributes != null) {
- query.addCustomDbAttributes(customDbAttributes);
- }
-
// substitute qualifier parameters
if (qualifier != null) {
query.setQualifier(qualifier.expWithParameters(parameters, pruneMissing));
@@ -410,64 +404,6 @@
}
/**
- * Returns a list of attributes that will be included in the results of this query.
- *
- * @deprecated since 3.0. Will likely be removed after 3.0M6. Can be replaced with
- * EJBQL.
- */
- @Deprecated
- public List<String> getCustomDbAttributes() {
- // if query root is DbEntity, and no custom attributes
- // are defined, return DbEntity attributes.
- if ((customDbAttributes == null || customDbAttributes.isEmpty())
- && (root instanceof DbEntity)) {
- Collection<String> names = ((DbEntity) root).getAttributeMap().keySet();
- return new ArrayList<String>(names);
- }
- else {
- return (customDbAttributes != null)
- ? customDbAttributes
- : Collections.EMPTY_LIST;
- }
- }
-
- /**
- * Adds a path to the DbAttribute that should be included in the results of this
- * query. Valid paths would look like <code>ARTIST_NAME</code>,
- * <code>PAINTING_ARRAY.PAINTING_ID</code>, etc.
- *
- * @deprecated since 3.0. Will likely be removed after 3.0M6. Can be replaced with
- * EJBQL.
- */
- @Deprecated
- public void addCustomDbAttribute(String attributePath) {
- nonNullCustomDbAttributes().add(attributePath);
- }
-
- /**
- * @deprecated since 3.0. Will likely be removed after 3.0M6. Can be replaced with
- * EJBQL.
- */
- @Deprecated
- public void addCustomDbAttributes(List<String> attrPaths) {
- nonNullCustomDbAttributes().addAll(attrPaths);
- }
-
- /**
- * Returns <code>true</code> if there is at least one custom query attribute
- * specified, otherwise returns <code>false</code> for the case when the query results
- * will contain only the root entity attributes.
- * <p>
- * Note that queries that are fetching custom attributes always return data rows
- * instead of DataObjects.
- * </p>
- */
- public boolean isFetchingCustomAttributes() {
- return (root instanceof DbEntity)
- || (customDbAttributes != null && !customDbAttributes.isEmpty());
- }
-
- /**
* @since 1.2
*/
public PrefetchTreeNode getPrefetchTree() {
@@ -512,15 +448,15 @@
* QueryEngine executing this query.
*/
public boolean isFetchingDataRows() {
- return this.isFetchingCustomAttributes() || metaData.isFetchingDataRows();
+ return (root instanceof DbEntity) || metaData.isFetchingDataRows();
}
/**
* Sets query result type. If <code>flag</code> parameter is <code>true</code>, then
* results will be in the form of data rows.
* <p>
- * <i>Note that if <code>isFetchingCustAttributes()</code> returns <code>true</code>,
- * this setting has no effect, and data rows are always fetched. </i>
+ * <i>Note that if the root of this query is a {@link DbEntity}, this setting has no
+ * effect, and data rows are always fetched. </i>
* </p>
*/
public void setFetchingDataRows(boolean flag) {
@@ -671,19 +607,6 @@
}
/**
- * Returns a list that internally stores custom db attributes, creating it on demand.
- *
- * @since 1.2
- */
- List<String> nonNullCustomDbAttributes() {
- if (customDbAttributes == null) {
- customDbAttributes = new ArrayList<String>();
- }
-
- return customDbAttributes;
- }
-
- /**
* Returns a list that internally stores orderings, creating it on demand.
*
* @since 1.2
@@ -695,15 +618,16 @@
return orderings;
}
-
+
/**
* Sets statement's fetch size (0 for no default size)
- * @since 3.0
+ *
+ * @since 3.0
*/
public void setStatementFetchSize(int size) {
metaData.setStatementFetchSize(size);
}
-
+
/**
* @return statement's fetch size
* @since 3.0
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalSelectQuery.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalSelectQuery.java?rev=811963&r1=811962&r2=811963&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalSelectQuery.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/remote/IncrementalSelectQuery.java Mon Sep 7 01:24:56 2009
@@ -165,16 +165,6 @@
}
@Override
- public void addCustomDbAttribute(String attributePath) {
- query.addCustomDbAttribute(attributePath);
- }
-
- @Override
- public void addCustomDbAttributes(List attrPaths) {
- query.addCustomDbAttributes(attrPaths);
- }
-
- @Override
public void addOrdering(Ordering ordering) {
query.addOrdering(ordering);
}
@@ -245,11 +235,6 @@
}
@Override
- public List<String> getCustomDbAttributes() {
- return query.getCustomDbAttributes();
- }
-
- @Override
public int getFetchLimit() {
return query.getFetchLimit();
}
@@ -300,11 +285,6 @@
}
@Override
- public boolean isFetchingCustomAttributes() {
- return query.isFetchingCustomAttributes();
- }
-
- @Override
public boolean isFetchingDataRows() {
return query.isFetchingDataRows();
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SelectQueryBasicsTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SelectQueryBasicsTest.java?rev=811963&r1=811962&r2=811963&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SelectQueryBasicsTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SelectQueryBasicsTest.java Mon Sep 7 01:24:56 2009
@@ -99,37 +99,6 @@
assertTrue(q.isDistinct());
}
- public void testFetchingDataRowsSpecial() {
- SelectQuery q = new SelectQuery();
-
- assertFalse(q.isFetchingDataRows());
- q.addCustomDbAttribute("ARTIST_ID");
- assertTrue(q.isFetchingDataRows());
-
- // this shouldn't have any effect, since custom attributes are fetched
- q.setFetchingDataRows(false);
- assertTrue(q.isFetchingDataRows());
- }
-
- public void testQueryAttributes() throws Exception {
- SelectQuery q = new SelectQuery();
-
- assertEquals(0, q.getCustomDbAttributes().size());
-
- q.addCustomDbAttribute("ARTIST_ID");
- assertEquals(1, q.getCustomDbAttributes().size());
- assertEquals("ARTIST_ID", q.getCustomDbAttributes().get(0));
- }
-
- public void testUsingRootEntityAttributes() throws Exception {
- SelectQuery q = new SelectQuery();
-
- assertFalse(q.isFetchingCustomAttributes());
-
- q.addCustomDbAttribute("ARTIST_ID");
- assertTrue(q.isFetchingCustomAttributes());
- }
-
public void testQueryWithParams1() {
SelectQuery q = new SelectQuery();
q.setRoot(Artist.class);
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SelectQueryTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SelectQueryTest.java?rev=811963&r1=811962&r2=811963&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SelectQueryTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/SelectQueryTest.java Mon Sep 7 01:24:56 2009
@@ -30,6 +30,7 @@
import org.apache.art.Exhibit;
import org.apache.art.Gallery;
import org.apache.art.Painting;
+import org.apache.cayenne.DataRow;
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
@@ -65,6 +66,16 @@
assertEquals(totalRows - 5, results.size());
assertEquals("artist6", results.get(0).getArtistName());
}
+
+ public void testDbEntityRoot() {
+ ObjectContext context = createDataContext();
+
+ SelectQuery query = new SelectQuery(getDbEntity("ARTIST"));
+ List results = context.performQuery(query);
+
+ assertEquals(20, results.size());
+ assertTrue(results.get(0) instanceof DataRow);
+ }
public void testFetchLimitWithOffset() throws Exception {
ObjectContext context = createDataContext();
@@ -312,20 +323,6 @@
assertEquals(20, objects.size());
}
- public void testSelectCustAttributes() throws Exception {
- query.setRoot(Artist.class);
- query.addCustomDbAttribute("ARTIST_NAME");
-
- List results = createDataContext().performQuery(query);
-
- // check query results
- assertEquals(_artistCount, results.size());
-
- Map row = (Map) results.get(0);
- assertNotNull(row.get("ARTIST_NAME"));
- assertEquals(1, row.size());
- }
-
public void testSelectBooleanTrue() throws Exception {
query.setRoot(Artist.class);
Expression qual = ExpressionFactory.expTrue();