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 2007/12/27 14:37:02 UTC
svn commit: r607069 - in
/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne:
access/jdbc/ ejbql/ ejbql/parser/
Author: aadamchik
Date: Thu Dec 27 05:37:01 2007
New Revision: 607069
URL: http://svn.apache.org/viewvc?rev=607069&view=rev
Log:
CAY-948 Implement flattened attributes in Cayenne
(preliminary refactoring of EJBQL translator)
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLJoinAppender.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/ejbql/EJBQLCompiledExpression.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/CompiledExpression.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java?rev=607069&r1=607068&r2=607069&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java Thu Dec 27 05:37:01 2007
@@ -42,7 +42,6 @@
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.DbJoin;
import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.ObjRelationship;
import org.apache.cayenne.reflect.ClassDescriptor;
/**
@@ -166,11 +165,9 @@
context.append(subqueryTableName).append(' ').append(subqueryRootAlias);
context.append(" WHERE");
- ObjRelationship relationship = context.getIncomingRelationship(id);
-
// TODO: andrus, 8/11/2007 flattened?
- DbRelationship correlatedJoinRelationship = relationship
- .getDbRelationships()
+ DbRelationship correlatedJoinRelationship = context
+ .getIncomingRelationships(id)
.get(0);
Iterator<DbJoin> it = correlatedJoinRelationship.getJoins().iterator();
while (it.hasNext()) {
@@ -246,10 +243,9 @@
context.append(subqueryTableName).append(' ').append(subqueryRootAlias);
context.append(" WHERE");
- ObjRelationship relationship = context.getIncomingRelationship(id);
// TODO: andrus, 8/11/2007 flattened?
- DbRelationship correlatedJoinRelationship = relationship
- .getDbRelationships()
+ DbRelationship correlatedJoinRelationship = context
+ .getIncomingRelationships(id)
.get(0);
for (DbJoin join : correlatedJoinRelationship.getJoins()) {
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLJoinAppender.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLJoinAppender.java?rev=607069&r1=607068&r2=607069&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLJoinAppender.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLJoinAppender.java Thu Dec 27 05:37:01 2007
@@ -20,12 +20,12 @@
import java.util.HashMap;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import org.apache.cayenne.ejbql.EJBQLException;
import org.apache.cayenne.map.DbJoin;
import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.ObjRelationship;
import org.apache.cayenne.reflect.ClassDescriptor;
/**
@@ -58,8 +58,7 @@
String sourceIdPath,
String relationship,
String targetId) {
-
-
+
if (reusableJoins == null) {
reusableJoins = new HashMap<String, String>();
}
@@ -86,13 +85,13 @@
protected void appendJoin(String marker, String lhsId, String rhsId, String semantics) {
- ObjRelationship joinRelationship = context.getIncomingRelationship(rhsId);
- if (joinRelationship == null) {
+ List<DbRelationship> joinRelationships = context.getIncomingRelationships(rhsId);
+ if (joinRelationships.isEmpty()) {
throw new EJBQLException("No join configured for id " + rhsId);
}
// TODO: andrus, 4/8/2007 - support for flattened relationships
- DbRelationship incomingDB = joinRelationship.getDbRelationships().get(0);
+ DbRelationship incomingDB = joinRelationships.get(0);
String sourceAlias = context.getTableAlias(lhsId, incomingDB
.getSourceEntity()
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=607069&r1=607068&r2=607069&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 Thu Dec 27 05:37:01 2007
@@ -19,10 +19,12 @@
package org.apache.cayenne.access.jdbc;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.apache.cayenne.ejbql.EJBQLCompiledExpression;
import org.apache.cayenne.ejbql.EJBQLException;
+import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.map.ObjRelationship;
import org.apache.cayenne.query.SQLResultSetMapping;
import org.apache.cayenne.query.SQLTemplate;
@@ -96,8 +98,8 @@
return compiledExpression.getEntityDescriptor(resolveId(id));
}
- ObjRelationship getIncomingRelationship(String id) {
- return compiledExpression.getIncomingRelationship(resolveId(id));
+ List<DbRelationship> getIncomingRelationships(String id) {
+ return compiledExpression.getIncomingRelationships(resolveId(id));
}
/**
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/EJBQLCompiledExpression.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/EJBQLCompiledExpression.java?rev=607069&r1=607068&r2=607069&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/EJBQLCompiledExpression.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/EJBQLCompiledExpression.java Thu Dec 27 05:37:01 2007
@@ -18,7 +18,9 @@
****************************************************************/
package org.apache.cayenne.ejbql;
-import org.apache.cayenne.map.ObjRelationship;
+import java.util.List;
+
+import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.query.SQLResultSetMapping;
import org.apache.cayenne.reflect.ClassDescriptor;
@@ -47,10 +49,10 @@
ClassDescriptor getEntityDescriptor(String identifier);
/**
- * Returns a relationship that joins identifier with a parent entity. Returns null if
- * the identifier corresponds to one of the query roots.
+ * Returns a collection of relationships that joins identifier with a parent entity.
+ * Returns null if the identifier corresponds to one of the query roots.
*/
- ObjRelationship getIncomingRelationship(String identifier);
+ List<DbRelationship> getIncomingRelationships(String identifier);
/**
* Returns EJB QL source of the compiled expression if available.
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/CompiledExpression.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/CompiledExpression.java?rev=607069&r1=607068&r2=607069&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/CompiledExpression.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/CompiledExpression.java Thu Dec 27 05:37:01 2007
@@ -18,10 +18,13 @@
****************************************************************/
package org.apache.cayenne.ejbql.parser;
+import java.util.Collections;
+import java.util.List;
import java.util.Map;
import org.apache.cayenne.ejbql.EJBQLCompiledExpression;
import org.apache.cayenne.ejbql.EJBQLExpression;
+import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.map.ObjRelationship;
import org.apache.cayenne.query.SQLResultSetMapping;
import org.apache.cayenne.reflect.ClassDescriptor;
@@ -36,8 +39,8 @@
private String source;
private String rootId;
- private Map descriptorsById;
- private Map incomingById;
+ private Map<String, ClassDescriptor> descriptorsById;
+ private Map<String, ObjRelationship> incomingById;
private EJBQLExpression expression;
private SQLResultSetMapping resultSetMapping;
@@ -46,10 +49,9 @@
return null;
}
- return (ClassDescriptor) descriptorsById
- .get(Compiler.normalizeIdPath(idVariable));
+ return descriptorsById.get(Compiler.normalizeIdPath(idVariable));
}
-
+
public SQLResultSetMapping getResultSetMapping() {
return resultSetMapping;
}
@@ -58,8 +60,13 @@
return rootId != null ? getEntityDescriptor(rootId) : null;
}
- public ObjRelationship getIncomingRelationship(String identifier) {
- return (ObjRelationship) incomingById.get(identifier);
+ public List<DbRelationship> getIncomingRelationships(String identifier) {
+ ObjRelationship relationship = incomingById.get(identifier);
+ if (relationship == null) {
+ return Collections.emptyList();
+ }
+
+ return relationship.getDbRelationships();
}
public EJBQLExpression getExpression() {
@@ -74,11 +81,11 @@
this.expression = expression;
}
- void setDescriptorsById(Map descriptorsById) {
+ void setDescriptorsById(Map<String, ClassDescriptor> descriptorsById) {
this.descriptorsById = descriptorsById;
}
- void setIncomingById(Map incomingById) {
+ void setIncomingById(Map<String, ObjRelationship> incomingById) {
this.incomingById = incomingById;
}
@@ -89,7 +96,7 @@
void setRootId(String rootId) {
this.rootId = rootId;
}
-
+
void setResultSetMapping(SQLResultSetMapping resultSetMapping) {
this.resultSetMapping = resultSetMapping;
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java?rev=607069&r1=607068&r2=607069&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java Thu Dec 27 05:37:01 2007
@@ -21,7 +21,6 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
import org.apache.cayenne.ejbql.EJBQLBaseVisitor;
@@ -50,9 +49,9 @@
private String rootId;
private EntityResolver resolver;
- private Map descriptorsById;
- private Map incomingById;
- private Collection paths;
+ private Map<String, ClassDescriptor> descriptorsById;
+ private Map<String, ObjRelationship> incomingById;
+ private Collection<EJBQLPath> paths;
private EJBQLExpressionVisitor fromItemVisitor;
private EJBQLExpressionVisitor joinVisitor;
private EJBQLExpressionVisitor pathVisitor;
@@ -61,8 +60,8 @@
Compiler(EntityResolver resolver) {
this.resolver = resolver;
- this.descriptorsById = new HashMap();
- this.incomingById = new HashMap();
+ this.descriptorsById = new HashMap<String, ClassDescriptor>();
+ this.incomingById = new HashMap<String, ObjRelationship>();
this.rootDescriptorVisitor = new SelectExpressionVisitor();
this.fromItemVisitor = new FromItemVisitor();
@@ -75,17 +74,15 @@
// postprocess paths, now that all id vars are resolved
if (paths != null) {
- Iterator it = paths.iterator();
- while (it.hasNext()) {
- EJBQLPath path = (EJBQLPath) it.next();
+ for (EJBQLPath path : paths) {
String id = normalizeIdPath(path.getId());
- ClassDescriptor descriptor = (ClassDescriptor) descriptorsById.get(id);
+ ClassDescriptor descriptor = descriptorsById.get(id);
if (descriptor == null) {
throw new EJBQLException("Unmapped id variable: " + id);
}
- StringBuffer buffer = new StringBuffer(id);
+ StringBuilder buffer = new StringBuilder(id);
for (int i = 1; i < path.getChildrenCount(); i++) {
@@ -118,9 +115,9 @@
return compiled;
}
- private void addPath(EJBQLExpression path) {
+ private void addPath(EJBQLPath path) {
if (paths == null) {
- paths = new ArrayList();
+ paths = new ArrayList<EJBQLPath>();
}
paths.add(path);
@@ -215,9 +212,7 @@
// per JPA spec, 4.4.2, "Identification variables are case insensitive."
String id = normalizeIdPath(expression.getId());
- ClassDescriptor old = (ClassDescriptor) descriptorsById.put(
- id,
- descriptor);
+ ClassDescriptor old = descriptorsById.put(id, descriptor);
if (old != null && old != descriptor) {
throw new EJBQLException(
"Duplicate identification variable definition: "
@@ -253,7 +248,7 @@
public boolean visitPath(EJBQLExpression expression, int finishedChildIndex) {
if (finishedChildIndex + 1 < expression.getChildrenCount()) {
this.id = ((EJBQLPath) expression).getId();
- this.descriptor = (ClassDescriptor) descriptorsById.get(id);
+ this.descriptor = descriptorsById.get(id);
if (descriptor == null) {
throw new EJBQLException("Unmapped id variable: " + id);
@@ -283,9 +278,7 @@
String aliasId = expression.getText();
// map id variable to class descriptor
- ClassDescriptor old = (ClassDescriptor) descriptorsById.put(
- aliasId,
- descriptor);
+ ClassDescriptor old = descriptorsById.put(aliasId, descriptor);
if (old != null && old != descriptor) {
throw new EJBQLException(
"Duplicate identification variable definition: "
@@ -308,7 +301,7 @@
class PathVisitor extends EJBQLBaseVisitor {
public boolean visitPath(EJBQLExpression expression, int finishedChildIndex) {
- addPath(expression);
+ addPath((EJBQLPath) expression);
return false;
}
}
@@ -326,7 +319,7 @@
}
public boolean visitPath(EJBQLExpression expression, int finishedChildIndex) {
- addPath(expression);
+ addPath((EJBQLPath) expression);
addResultSetColumn();
return false;
}