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 2008/12/25 20:51:15 UTC

svn commit: r729435 - /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/

Author: aadamchik
Date: Thu Dec 25 11:51:15 2008
New Revision: 729435

URL: http://svn.apache.org/viewvc?rev=729435&view=rev
Log:
CAY-1162 SelectDescriptor concept

support for reading IDs, refactoring

Removed:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/SelectSegment.java
Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/CompoundRowReader.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/CompoundSelectDescriptor.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/EntityRowReader.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/EntitySegment.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/EntitySegmentBuilder.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/RowReader.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/ScalarRowReader.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/ScalarSegment.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/ScalarSegmentBuilder.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/CompoundRowReader.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/CompoundRowReader.java?rev=729435&r1=729434&r2=729435&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/CompoundRowReader.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/CompoundRowReader.java Thu Dec 25 11:51:15 2008
@@ -39,6 +39,12 @@
         this.readers[pos] = reader;
     }
 
+    public void setColumnOffset(int offset) {
+        for (int i = 0; i < readers.length; i++) {
+            readers[i].setColumnOffset(offset);
+        }
+    }
+
     public Object[] readRow(ResultSet resultSet) throws CayenneException {
 
         int width = readers.length;

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/CompoundSelectDescriptor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/CompoundSelectDescriptor.java?rev=729435&r1=729434&r2=729435&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/CompoundSelectDescriptor.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/CompoundSelectDescriptor.java Thu Dec 25 11:51:15 2008
@@ -29,15 +29,15 @@
  */
 class CompoundSelectDescriptor implements SelectDescriptor<Object[]> {
 
-    private SelectSegment[] segments;
+    private SelectDescriptor<Object>[] segments;
     private CompoundRowReader rowReader;
     private List<SelectColumn> columns;
 
     CompoundSelectDescriptor(int width) {
-        this.segments = new SelectSegment[width];
+        this.segments = new SelectDescriptor[width];
     }
 
-    void append(int position, SelectSegment segmentDescriptor) {
+    void append(int position, SelectDescriptor<Object> segmentDescriptor) {
         segments[position] = segmentDescriptor;
     }
 
@@ -60,9 +60,13 @@
 
         // finish descriptor initialization
         for (int i = 0; i < segments.length; i++) {
-            segments[i].setColumnOffset(columns.size());
+
+            int offset = columns.size();
             columns.addAll(segments[i].getColumns());
-            rowReader.addRowReader(i, segments[i].getRowReader(resultSet));
+
+            RowReader<Object> rowReader = segments[i].getRowReader(resultSet);
+            rowReader.setColumnOffset(offset);
+            this.rowReader.addRowReader(i, rowReader);
         }
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/EntityRowReader.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/EntityRowReader.java?rev=729435&r1=729434&r2=729435&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/EntityRowReader.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/EntityRowReader.java Thu Dec 25 11:51:15 2008
@@ -57,7 +57,7 @@
         }
     }
 
-    void setColumnOffset(int offset) {
+    public void setColumnOffset(int offset) {
         for (int i = 0; i < columnIndexes.length; i++) {
             columnIndexes[i] = i + offset + 1;
         }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/EntitySegment.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/EntitySegment.java?rev=729435&r1=729434&r2=729435&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/EntitySegment.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/EntitySegment.java Thu Dec 25 11:51:15 2008
@@ -26,21 +26,16 @@
 /**
  * @since 3.0
  */
-class EntitySegment implements SelectSegment {
+class EntitySegment implements SelectDescriptor<Object> {
 
     private List<? extends SelectColumn> columns;
-    private EntityRowReader rowReader;
+    private RowReader<Object> rowReader;
 
-    EntitySegment(EntityRowReader rowReader, List<? extends SelectColumn> columns) {
+    EntitySegment(RowReader<Object> rowReader, List<? extends SelectColumn> columns) {
         this.columns = columns;
         this.rowReader = rowReader;
     }
 
-    public void setColumnOffset(int offset) {
-        rowReader.setColumnOffset(offset);
-
-    }
-
     public List<? extends SelectColumn> getColumns() {
         return columns;
     }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/EntitySegmentBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/EntitySegmentBuilder.java?rev=729435&r1=729434&r2=729435&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/EntitySegmentBuilder.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/EntitySegmentBuilder.java Thu Dec 25 11:51:15 2008
@@ -51,7 +51,7 @@
         this.metadata = metadata;
     }
 
-    SelectSegment getSegment(int position) {
+    SelectDescriptor<Object> getSegment(int position) {
 
         ClassDescriptor rootDescriptor;
         EntityResultSegment segmentMetadata;
@@ -81,7 +81,7 @@
         return forEntity(rootDescriptor, segmentMetadata);
     }
 
-    private SelectSegment forEntity(
+    private SelectDescriptor<Object> forEntity(
             ClassDescriptor rootDescriptor,
             EntityResultSegment segmentMetadata) {
 
@@ -97,7 +97,7 @@
 
     }
 
-    private SelectSegment forSingleSelectEntity(
+    private SelectDescriptor<Object> forSingleSelectEntity(
             ClassDescriptor rootDescriptor,
             EntityResultSegment segmentMetadata,
             DbEntity root) {
@@ -111,14 +111,22 @@
             appender.appendAll();
         }
 
-        EntityRowReader rowReader = new EntityRowReader(rootDescriptor
-                .getEntity()
-                .getName(), appender.columns);
+        RowReader<Object> rowReader;
+        // read single column ID as scalar
+        if (metadata.getPageSize() > 0 && appender.columns.size() == 1) {
+            EntitySelectColumn column = appender.columns.get(0);
+            rowReader = new ScalarRowReader(column.getConverter(), column.getJdbcType());
+        }
+        else {
+            rowReader = new EntityRowReader(
+                    rootDescriptor.getEntity().getName(),
+                    appender.columns);
+        }
 
         return new EntitySegment(rowReader, appender.columns);
     }
 
-    private SelectSegment forUnionSelectEntity(
+    private SelectDescriptor<Object> forUnionSelectEntity(
             ClassDescriptor rootDescriptor,
             EntityResultSegment segmentMetadata,
             Collection<DbEntity> unionRoots) {
@@ -126,7 +134,7 @@
         throw new UnsupportedOperationException("TODO: union query");
     }
 
-    private SelectSegment forDbEntity(
+    private SelectDescriptor<Object> forDbEntity(
             DbEntity dbEntity,
             EntityResultSegment segmentMetadata) {
         // TODO - queries with DbEntity root

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/RowReader.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/RowReader.java?rev=729435&r1=729434&r2=729435&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/RowReader.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/RowReader.java Thu Dec 25 11:51:15 2008
@@ -34,4 +34,10 @@
      * Extracts a DataRow from the ResultSet at its current position.
      */
     T readRow(ResultSet resultSet) throws CayenneException;
+
+    /**
+     * Sets an absolute offset of the first column processed by the reader from the
+     * begginging of the result set row.
+     */
+    void setColumnOffset(int offset);
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/ScalarRowReader.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/ScalarRowReader.java?rev=729435&r1=729434&r2=729435&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/ScalarRowReader.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/ScalarRowReader.java Thu Dec 25 11:51:15 2008
@@ -22,7 +22,6 @@
 
 import org.apache.cayenne.CayenneException;
 import org.apache.cayenne.access.types.ExtendedType;
-import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.util.Util;
 
 /**
@@ -32,16 +31,21 @@
 
     private ExtendedType converter;
     private int index;
+    private int jdbcType;
 
-    ScalarRowReader(ExtendedType converter, int index) {
+    ScalarRowReader(ExtendedType converter, int jdbcType) {
         this.converter = converter;
-        this.index = index;
+        this.index = 1;
+        this.jdbcType = jdbcType;
+    }
+    
+    public void setColumnOffset(int offset) {
+        this.index = offset + 1;
     }
 
     public Object readRow(ResultSet resultSet) throws CayenneException {
         try {
-            return converter
-                    .materializeObject(resultSet, index, TypesMapping.NOT_DEFINED);
+            return converter.materializeObject(resultSet, index, jdbcType);
         }
         catch (CayenneException cex) {
             // rethrow unmodified

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/ScalarSegment.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/ScalarSegment.java?rev=729435&r1=729434&r2=729435&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/ScalarSegment.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/ScalarSegment.java Thu Dec 25 11:51:15 2008
@@ -31,19 +31,14 @@
  * 
  * @since 3.0
  */
-class ScalarSegment implements SelectSegment, SelectColumn {
+class ScalarSegment implements SelectDescriptor<Object>, SelectColumn {
 
     private String columnName;
-    private ExtendedType converter;
     private RowReader<Object> rowReader;
 
     ScalarSegment(String columnName, ExtendedType converter) {
         this.columnName = columnName;
-        this.converter = converter;
-    }
-
-    private RowReader<Object> createRowReader(int offset) {
-        return new ScalarRowReader(converter, offset + 1);
+        this.rowReader = new ScalarRowReader(converter, TypesMapping.NOT_DEFINED);
     }
 
     public List<SelectColumn> getColumns() {
@@ -51,18 +46,9 @@
     }
 
     public RowReader<Object> getRowReader(ResultSet resultSet) {
-
-        if (rowReader == null) {
-            rowReader = createRowReader(0);
-        }
-
         return rowReader;
     }
 
-    public void setColumnOffset(int offset) {
-        this.rowReader = createRowReader(offset);
-    }
-
     public String getColumnName(int unionSegmentIndex, String tableAlias) {
         if (tableAlias == null || tableAlias.length() == 0) {
             return columnName;
@@ -77,11 +63,11 @@
 
     public String getDataRowKey() {
         throw new UnsupportedOperationException(
-                "'dataRowKey' is meaningless for Scalar columns");
+                "'dataRowKey' is meaningless for Scalar segments");
     }
 
     public List<DbRelationship> getPath(int unionSegmentIndex) {
         throw new UnsupportedOperationException(
-                "'dataRowKey' is unsupported for Scalar columns");
+                "'getPath' is unsupported for Scalar segments");
     }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/ScalarSegmentBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/ScalarSegmentBuilder.java?rev=729435&r1=729434&r2=729435&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/ScalarSegmentBuilder.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/select/ScalarSegmentBuilder.java Thu Dec 25 11:51:15 2008
@@ -36,7 +36,7 @@
         this.metadata = metadata;
     }
 
-    SelectSegment getSegment(int position) {
+    SelectDescriptor<Object> getSegment(int position) {
         ScalarResultSegment segment = metadata.getScalarSegment(position);
         return new ScalarSegment(segment.getColumn(), converter);
     }