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