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


Reply via email to