You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ke...@apache.org on 2011/09/07 21:19:37 UTC

svn commit: r1166321 - in /incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql: sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/ sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/ sql-tests-commo...

Author: kevin
Date: Wed Sep  7 19:19:37 2011
New Revision: 1166321

URL: http://svn.apache.org/viewvc?rev=1166321&view=rev
Log:
ISIS-118: Adding support for allMatches(PersistenceQueryFindByPattern) to return instances of subclasses, too, if the query pattern is of the subclass.

Modified:
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/ObjectMapping.java
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/SqlObjectStore.java
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/AutoMapper.java
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/testsystem/SqlDataClassFactory.java
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-tests-common/src/test/java/org/apache/isis/runtimes/dflt/objectstores/sql/PolymorphismTest.java

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/ObjectMapping.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/ObjectMapping.java?rev=1166321&r1=1166320&r2=1166321&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/ObjectMapping.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/ObjectMapping.java Wed Sep  7 19:19:37 2011
@@ -19,6 +19,8 @@
 
 package org.apache.isis.runtimes.dflt.objectstores.sql;
 
+import java.util.Vector;
+
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -30,11 +32,11 @@ public interface ObjectMapping {
 
     void destroyObject(DatabaseConnector connector, ObjectAdapter object);
 
-    ObjectAdapter[] getInstances(DatabaseConnector connector, ObjectSpecification spec);
+    Vector<ObjectAdapter> getInstances(DatabaseConnector connector, ObjectSpecification spec);
 
-    ObjectAdapter[] getInstances(DatabaseConnector connector, ObjectSpecification spec, String title);
+    Vector<ObjectAdapter> getInstances(DatabaseConnector connector, ObjectSpecification spec, String title);
 
-    ObjectAdapter[] getInstances(DatabaseConnector connector, ObjectSpecification spec,
+    Vector<ObjectAdapter> getInstances(DatabaseConnector connector, ObjectSpecification spec,
         PersistenceQueryFindByPattern query);
 
     ObjectAdapter getObject(DatabaseConnector connector, Oid oid, ObjectSpecification hint);

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/SqlObjectStore.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/SqlObjectStore.java?rev=1166321&r1=1166320&r2=1166321&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/SqlObjectStore.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/SqlObjectStore.java Wed Sep  7 19:19:37 2011
@@ -209,12 +209,35 @@ public final class SqlObjectStore implem
         final ObjectSpecification specification = query.getSpecification();
         final DatabaseConnector connector = connectionPool.acquire();
 
+        final Vector<ObjectAdapter> matchingInstances = new Vector<ObjectAdapter>();
+
         // TODO find derived types, too.
-        final ObjectMapping mapper = objectMappingLookup.getMapping(specification, connector);
-        final ObjectAdapter instances[] = mapper.getInstances(connector, specification, query);
+        if (!specification.isAbstract()) {
+            addSpecQueryInstances(specification, connector, query, matchingInstances);
+        }
+
+        // Search for subclasses, too.
+        if (specification.hasSubclasses()) {
+            final List<ObjectSpecification> subclasses = specification.subclasses();
+            for (ObjectSpecification subclassSpec : subclasses) {
+                // if (subclassSpec.equals(specification)) {
+                addSpecQueryInstances(subclassSpec, connector, query, matchingInstances);
+                // }
+            }
+        }
 
         connectionPool.release(connector);
-        return instances;
+
+        final ObjectAdapter[] instanceArray = new ObjectAdapter[matchingInstances.size()];
+        matchingInstances.copyInto(instanceArray);
+        return instanceArray;
+    }
+
+    private void addSpecQueryInstances(ObjectSpecification specification, DatabaseConnector connector,
+        PersistenceQueryFindByPattern query, Vector<ObjectAdapter> matchingInstances) {
+        final ObjectMapping mapper = objectMappingLookup.getMapping(specification, connector);
+        Vector<ObjectAdapter> instances = mapper.getInstances(connector, specification, query);
+        matchingInstances.addAll(instances);
     }
 
     private ObjectAdapter[] getAllInstances(final PersistenceQueryFindAllInstances criteria) {
@@ -248,10 +271,8 @@ public final class SqlObjectStore implem
     private void addSpecInstances(ObjectSpecification spec, DatabaseConnector connector,
         Vector<ObjectAdapter> matchingInstances) {
         final ObjectMapping mapper = objectMappingLookup.getMapping(spec, connector);
-        final ObjectAdapter[] instances = mapper.getInstances(connector, spec);
-        for (final ObjectAdapter instance : instances) {
-            matchingInstances.addElement(instance);
-        }
+        final Vector<ObjectAdapter> instances = mapper.getInstances(connector, spec);
+        matchingInstances.addAll(instances);
     }
 
     private ObjectAdapter[] findByTitle(final PersistenceQueryFindByTitle criteria) {
@@ -259,9 +280,10 @@ public final class SqlObjectStore implem
         final DatabaseConnector connector = connectionPool.acquire();
         final ObjectMapping mapper = objectMappingLookup.getMapping(spec, connector);
 
-        final ObjectAdapter[] instances = mapper.getInstances(connector, spec, criteria.getTitle());
+        final Vector<ObjectAdapter> instances = mapper.getInstances(connector, spec, criteria.getTitle());
         connectionPool.release(connector);
-        return instances;
+
+        return (ObjectAdapter[]) instances.toArray();
     }
 
     @Override

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/AutoMapper.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/AutoMapper.java?rev=1166321&r1=1166320&r2=1166321&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/AutoMapper.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/AutoMapper.java Wed Sep  7 19:19:37 2011
@@ -139,41 +139,53 @@ public class AutoMapper extends Abstract
     }
 
     @Override
-    public ObjectAdapter[] getInstances(final DatabaseConnector connector, final ObjectSpecification spec) {
+    public Vector<ObjectAdapter> getInstances(final DatabaseConnector connector, final ObjectSpecification spec) {
         final StringBuffer sql = createSelectStatement();
-        return loadInstances(connector, spec, completeSelectStatement(sql));
+        final Vector<ObjectAdapter> instances = new Vector<ObjectAdapter>();
+        loadInstancesToVector(connector, spec, completeSelectStatement(sql), instances);
+        return instances;
     }
 
     @Override
-    public ObjectAdapter[] getInstances(final DatabaseConnector connector, final ObjectSpecification spec,
+    public Vector<ObjectAdapter> getInstances(final DatabaseConnector connector, final ObjectSpecification spec,
         final PersistenceQueryFindByPattern query) {
+        final Vector<ObjectAdapter> instances = new Vector<ObjectAdapter>();
+
         final StringBuffer sql = createSelectStatement();
         sql.append(" WHERE ");
 
         final int initialLength = sql.length();
         final ObjectAdapter pattern = query.getPattern();
-        for (final ObjectAssociation assoc : specification.getAssociations()) {
-            final ObjectAdapter field = assoc.get(pattern);
-            if (field != null) {
-                final FieldMapping fieldMapping = fieldMappingFor(assoc);
-                if (fieldMapping != null) {
-                    if (sql.length() > initialLength) {
-                        sql.append(" AND ");
+        try {
+            for (final ObjectAssociation assoc : specification.getAssociations()) {
+                final ObjectAdapter field = assoc.get(pattern);
+                if (field != null) {
+                    final FieldMapping fieldMapping = fieldMappingFor(assoc);
+                    if (fieldMapping != null) {
+                        if (sql.length() > initialLength) {
+                            sql.append(" AND ");
+                        }
+                        fieldMapping.appendWhereClause(connector, sql, pattern);
                     }
-                    fieldMapping.appendWhereClause(connector, sql, pattern);
                 }
             }
+            loadInstancesToVector(connector, spec, completeSelectStatement(sql), instances);
+        } catch (IllegalArgumentException a) {
+
         }
-        return loadInstances(connector, spec, completeSelectStatement(sql));
+        return instances;
     }
 
     @Override
-    public ObjectAdapter[] getInstances(final DatabaseConnector connector, final ObjectSpecification spec,
+    public Vector<ObjectAdapter> getInstances(final DatabaseConnector connector, final ObjectSpecification spec,
         final String title) {
+        final Vector<ObjectAdapter> instances = new Vector<ObjectAdapter>();
+
         final StringBuffer sql = createSelectStatement();
         sql.append(" WHERE ");
         titleMapping.appendWhereClause(sql, title);
-        return loadInstances(connector, spec, completeSelectStatement(sql));
+        loadInstancesToVector(connector, spec, completeSelectStatement(sql), instances);
+        return instances;
     }
 
     @Override
@@ -245,10 +257,9 @@ public class AutoMapper extends Abstract
         }
     }
 
-    private ObjectAdapter[] loadInstances(final DatabaseConnector connector, final ObjectSpecification cls,
-        final String selectStatment) {
+    private void loadInstancesToVector(final DatabaseConnector connector, final ObjectSpecification cls,
+        final String selectStatment, Vector<ObjectAdapter> instances) {
         LOG.debug("loading instances from SQL " + table);
-        final Vector<ObjectAdapter> instances = new Vector<ObjectAdapter>();
 
         final Results rs = connector.select(selectStatment);
         for (int count = 0; rs.next() && count < MAX_INSTANCES; count++) {
@@ -257,10 +268,6 @@ public class AutoMapper extends Abstract
             instances.addElement(instance);
         }
         rs.close();
-
-        final ObjectAdapter[] array = new ObjectAdapter[instances.size()];
-        instances.copyInto(array);
-        return array;
     }
 
     private ObjectAdapter loadObject(final DatabaseConnector connector, final ObjectSpecification cls, final Results rs) {

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/testsystem/SqlDataClassFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/testsystem/SqlDataClassFactory.java?rev=1166321&r1=1166320&r2=1166321&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/testsystem/SqlDataClassFactory.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-tests-common/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/testsystem/SqlDataClassFactory.java Wed Sep  7 19:19:37 2011
@@ -137,6 +137,10 @@ public class SqlDataClassFactory extends
         return allInstances(PolyInterface.class);
     }
 
+    public List<PolyInterface> queryPolyInterfaces(PolyInterface query) {
+        return allMatches(PolyInterface.class, query);
+    }
+
     // }}
 
 }

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-tests-common/src/test/java/org/apache/isis/runtimes/dflt/objectstores/sql/PolymorphismTest.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-tests-common/src/test/java/org/apache/isis/runtimes/dflt/objectstores/sql/PolymorphismTest.java?rev=1166321&r1=1166320&r2=1166321&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-tests-common/src/test/java/org/apache/isis/runtimes/dflt/objectstores/sql/PolymorphismTest.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-tests-common/src/test/java/org/apache/isis/runtimes/dflt/objectstores/sql/PolymorphismTest.java Wed Sep  7 19:19:37 2011
@@ -14,6 +14,7 @@ import org.apache.isis.runtimes.dflt.obj
 
 public class PolymorphismTest extends SqlIntegrationTestCommonBase {
 
+    private static final String IMPL_A_STRING = "Impl A String";
     private static final String CHILD_1 = "Child 1";
     private static PolyInterfaceImplA polyIntImpA;
     private static PolyInterfaceImplB polyIntImpB;
@@ -91,7 +92,7 @@ public class PolymorphismTest extends Sq
         // polyTestClass.setPolyTestInterface(polyTestClass);
 
         polyIntImpA = factory.newPolyInterfaceImplA();
-        polyIntImpA.setString("Impl A String");
+        polyIntImpA.setString(IMPL_A_STRING);
         factory.save(polyIntImpA);
 
         polyTestClass.setPolyInterfaceType(polyIntImpA);
@@ -197,6 +198,21 @@ public class PolymorphismTest extends Sq
         assertEquals(2, list.size());
     }
 
+    public void testInterfacesLoadedByQuery() {
+        final SqlDataClassFactory factory = SqlIntegrationTestSingleton.getSqlDataClassFactory();
+        PolyInterface query = polyIntImpA;
+
+        // PolyInterface query = new PolyInterface() {
+        // @Override
+        // public String getString() {
+        // return IMPL_A_STRING;
+        // }
+        // };
+
+        List<PolyInterface> list = factory.queryPolyInterfaces(query);
+        assertEquals(1, list.size());
+    }
+
     // Last "test" - Set the Singleton state to 0 to invoke a clean shutdown.
     public void testZSetStateZero() {
         getSingletonInstance().setState(0);