Author: aadamchik
Date: Fri Jan 16 04:32:46 2009
New Revision: 734987
URL: http://svn.apache.org/viewvc?rev=734987&view=rev
Log:
CAY-1047 Aligning query capabilities
added pagination to EJBQLQuery - patch by Dima Loiko
Added:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLIdColumnsTranslator.java
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLIdentifierColumnsTranslator.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EntityRowReader.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/JDBCResultIterator.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/JdbcEJBQLTranslatorFactory.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/EJBQLQuery.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextTest.java
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java?rev=734987&r1=734986&r2=734987&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLAction.java
Fri Jan 16 04:32:46 2009
@@ -97,6 +97,7 @@
sqlQuery.setFetchLimit(md.getFetchLimit());
sqlQuery.setFetchOffset(md.getFetchOffset());
sqlQuery.setResult(compiledExpression.getResult());
+ sqlQuery.setPageSize(md.getPageSize());
actionFactory.sqlAction(sqlQuery).performAction(connection, observer);
}
Added:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLIdColumnsTranslator.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLIdColumnsTranslator.java?rev=734987&view=auto
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLIdColumnsTranslator.java
(added)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLIdColumnsTranslator.java
Fri Jan 16 04:32:46 2009
@@ -0,0 +1,84 @@
+/*****************************************************************
+ * 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.access.jdbc;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.ejbql.EJBQLExpression;
+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.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.reflect.ArcProperty;
+import org.apache.cayenne.reflect.AttributeProperty;
+import org.apache.cayenne.reflect.ClassDescriptor;
+import org.apache.cayenne.reflect.PropertyVisitor;
+import org.apache.cayenne.reflect.ToManyProperty;
+import org.apache.cayenne.reflect.ToOneProperty;
+
+
+public class EJBQLIdColumnsTranslator extends EJBQLIdentifierColumnsTranslator
{
+
+ private EJBQLTranslationContext context;
+ private Set<String> columns;
+
+ EJBQLIdColumnsTranslator(EJBQLTranslationContext context) {
+ super(context);
+ this.context = context;
+ }
+
+ @Override
+ public boolean visitIdentifier(EJBQLExpression expression) {
+
+ Map<String, String> xfields = null;
+ if (context.isAppendingResultColumns()) {
+ xfields = context.nextEntityResult().getFields();
+ }
+
+ // assign whatever we have to a final ivar so that it can be accessed
within
+ // the inner class
+ final Map<String, String> fields = xfields;
+ final String idVar = expression.getText();
+
+ ClassDescriptor descriptor = context.getEntityDescriptor(idVar);
+ ObjEntity oe = descriptor.getEntity();
+
+
+ Iterator<ObjAttribute> ObjIterator = oe.getPrimaryKeys().iterator();
+ try{
+ while(ObjIterator.hasNext()){
+
+ ObjAttribute temp = ObjIterator.next();
+ DbAttribute t = (DbAttribute)
oe.getDbEntity().getAttribute(temp.getDbAttributeName());
+ appendColumn(idVar, temp,t, fields ,temp.getType());
+ }
+ }catch (Exception e) {
+ // TODO: handle exception
+ }
+
+ return false;
+ }
+
+}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLIdentifierColumnsTranslator.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLIdentifierColumnsTranslator.java?rev=734987&r1=734986&r2=734987&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLIdentifierColumnsTranslator.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLIdentifierColumnsTranslator.java
Fri Jan 16 04:32:46 2009
@@ -154,7 +154,7 @@
return false;
}
- private void appendColumn(
+ public void appendColumn(
String identifier,
ObjAttribute property,
DbAttribute column,
@@ -162,7 +162,7 @@
appendColumn(identifier, property, column, fields, null);
}
- private void appendColumn(
+ public void appendColumn(
String identifier,
ObjAttribute property,
DbAttribute column,
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java?rev=734987&r1=734986&r2=734987&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java
Fri Jan 16 04:32:46 2009
@@ -31,6 +31,7 @@
import org.apache.cayenne.map.EntityResolver;
import org.apache.cayenne.query.EJBQLQuery;
import org.apache.cayenne.query.EntityResultSegment;
+import org.apache.cayenne.query.QueryMetadata;
import org.apache.cayenne.query.SQLTemplate;
import org.apache.cayenne.query.ScalarResultSegment;
import org.apache.cayenne.reflect.ClassDescriptor;
@@ -59,6 +60,7 @@
private List<StringBuilder> bufferChain;
private StringBuilder stackTop;
private int subselectCount;
+ private QueryMetadata queryMetadata;
// a flag indicating whether column expressions should be treated as
result columns or
// not.
@@ -76,7 +78,7 @@
this.positionalParameters = query.getPositionalParameters();
this.translatorFactory = translatorFactory;
this.usingAliases = true;
-
+ this.queryMetadata = query.getMetaData(entityResolver);
// buffer stack will hold named buffers during translation in the
order they were
// requested
this.bufferStack = new ArrayList<StringBuilder>();
@@ -105,6 +107,10 @@
query.setParameters(boundParameters);
return query;
}
+
+ public QueryMetadata getMetadata(){
+ return queryMetadata;
+ }
private String resolveId(String id) {
if (idAliases == null) {
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EntityRowReader.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EntityRowReader.java?rev=734987&r1=734986&r2=734987&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EntityRowReader.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EntityRowReader.java
Fri Jan 16 04:32:46 2009
@@ -49,9 +49,8 @@
if (classDescriptor != null) {
this.entityName = classDescriptor.getEntity().getName();
}
-
+
int segmentWidth = segmentMetadata.getFields().size();
-
this.startIndex = segmentMetadata.getColumnOffset();
this.converters = new ExtendedType[segmentWidth];
this.types = new int[segmentWidth];
@@ -59,7 +58,6 @@
ExtendedType[] converters = descriptor.getConverters();
ColumnDescriptor[] columns = descriptor.getColumns();
-
for (int i = 0; i < segmentWidth; i++) {
this.converters[i] = converters[startIndex + i];
types[i] = columns[startIndex + i].getJdbcType();
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/JDBCResultIterator.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/JDBCResultIterator.java?rev=734987&r1=734986&r2=734987&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/JDBCResultIterator.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/JDBCResultIterator.java
Fri Jan 16 04:32:46 2009
@@ -136,7 +136,10 @@
RowDescriptor descriptor,
EntityResultSegment resultMetadata) {
- if (resultMetadata.getClassDescriptor() != null
+ if (queryMetadata.getPageSize() > 0) {
+ return new IdRowReader(descriptor, queryMetadata);
+ }
+ else if (resultMetadata.getClassDescriptor() != null
&&
resultMetadata.getClassDescriptor().getEntityInheritanceTree() != null) {
return new InheritanceAwareEntityRowReader(descriptor,
resultMetadata);
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/JdbcEJBQLTranslatorFactory.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/JdbcEJBQLTranslatorFactory.java?rev=734987&r1=734986&r2=734987&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/JdbcEJBQLTranslatorFactory.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/JdbcEJBQLTranslatorFactory.java
Fri Jan 16 04:32:46 2009
@@ -74,7 +74,12 @@
public EJBQLExpressionVisitor getIdentifierColumnsTranslator(
EJBQLTranslationContext context) {
- return new EJBQLIdentifierColumnsTranslator(context);
+ if(context.getMetadata().getPageSize() > 0){
+ return new EJBQLIdColumnsTranslator(context);
+ }
+ else{
+ return new EJBQLIdentifierColumnsTranslator(context);
+ }
}
public EJBQLExpressionVisitor getOrderByTranslator(EJBQLTranslationContext
context) {
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/EJBQLQuery.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/EJBQLQuery.java?rev=734987&r1=734986&r2=734987&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/EJBQLQuery.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/query/EJBQLQuery.java
Fri Jan 16 04:32:46 2009
@@ -52,7 +52,7 @@
public EJBQLQuery() {
}
-
+
public void initWithProperties(Map<String, ?> properties) {
// must init defaults even if properties are empty
@@ -66,33 +66,31 @@
metadata.resolve(resolver, this);
return metadata;
}
-
+
public boolean isFetchingDataRows() {
return metadata.isFetchingDataRows();
}
-
-
+
public void setFetchingDataRows(boolean flag) {
metadata.setFetchingDataRows(flag);
}
-
+
public String[] getCacheGroups() {
return metadata.getCacheGroups();
}
-
+
public QueryCacheStrategy getCacheStrategy() {
return metadata.getCacheStrategy();
}
-
public void setCacheGroups(String... cacheGroups) {
this.metadata.setCacheGroups(cacheGroups);
}
-
+
public void setCacheStrategy(QueryCacheStrategy strategy) {
metadata.setCacheStrategy(strategy);
}
-
+
public void route(QueryRouter router, EntityResolver resolver, Query
substitutedQuery) {
DataMap map = getMetaData(resolver).getDataMap();
@@ -141,17 +139,16 @@
* Returns unmodifiable map of combined named and positional parameters.
Positional
* parameter keys are Integers, while named parameter keys are strings.
*/
-
+
public Map<String, Object> getNamedParameters() {
return namedParameters != null
? Collections.unmodifiableMap(namedParameters)
: Collections.EMPTY_MAP;
}
-
+
public Map<Integer, Object> getPositionalParameters() {
- return positionalParameters != null
- ? Collections.unmodifiableMap(positionalParameters)
- : Collections.EMPTY_MAP;
+ return positionalParameters != null ? Collections
+ .unmodifiableMap(positionalParameters) : Collections.EMPTY_MAP;
}
/**
@@ -228,22 +225,28 @@
encoder.println("\">");
encoder.indent(1);
-
+
metadata.encodeAsXML(encoder);
-
+
if (ejbqlStatement != null) {
encoder.print("<ejbql><![CDATA[");
encoder.print(ejbqlStatement);
encoder.println("]]></ejbql>");
}
-
+
encoder.indent(-1);
- encoder.println("</query>");
+ encoder.println("</query>");
}
public void setEjbqlStatement(String text) {
this.ejbqlStatement = text;
}
-
-
+
+ public int getPageSize() {
+ return metadata.getPageSize();
+ }
+
+ public void setPageSize(int pageSize) {
+ metadata.setPageSize(pageSize);
+ }
}
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextTest.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextTest.java?rev=734987&r1=734986&r2=734987&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextTest.java
(original)
+++
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextTest.java
Fri Jan 16 04:32:46 2009
@@ -39,6 +39,7 @@
import org.apache.cayenne.conn.PoolManager;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
+import org.apache.cayenne.query.EJBQLQuery;
import org.apache.cayenne.query.ObjectIdQuery;
import org.apache.cayenne.query.Ordering;
import org.apache.cayenne.query.SQLTemplate;
@@ -313,7 +314,18 @@
List objects = context.performQuery(query);
assertNotNull(objects);
assertTrue(objects instanceof IncrementalFaultList);
-
+ assertTrue(((IncrementalFaultList<?>) objects).elements.get(0)
instanceof Long);
+ assertTrue(((IncrementalFaultList<?>) objects).elements.get(7)
instanceof Long);
+
+ assertTrue(objects.get(0) instanceof Artist);
+ }
+
+ public void testPerformPaginatedQuery1() throws Exception {
+ EJBQLQuery query = new EJBQLQuery("select a FROM Artist a");
+ query.setPageSize(5);
+ List objects = context.performQuery(query);
+ assertNotNull(objects);
+ assertTrue(objects instanceof IncrementalFaultList);
assertTrue(((IncrementalFaultList<?>) objects).elements.get(0)
instanceof Long);
assertTrue(((IncrementalFaultList<?>) objects).elements.get(7)
instanceof Long);