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 13:16:06 UTC
svn commit: r607047 - in
/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc:
EJBQLIdentifierColumnsTranslator.java EJBQLJoinAppender.java
EJBQLPathTranslator.java EJBQLTranslationContext.java
Author: aadamchik
Date: Thu Dec 27 04:16:05 2007
New Revision: 607047
URL: http://svn.apache.org/viewvc?rev=607047&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/EJBQLIdentifierColumnsTranslator.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/EJBQLPathTranslator.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLTranslationContext.java
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=607047&r1=607046&r2=607047&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 Thu Dec 27 04:16:05 2007
@@ -52,6 +52,7 @@
this.context = context;
}
+ @Override
public boolean visitIdentifier(EJBQLExpression expression) {
final String idVar = expression.getText();
@@ -64,6 +65,11 @@
public boolean visitAttribute(AttributeProperty property) {
ObjAttribute oa = property.getAttribute();
Iterator<?> dbPathIterator = oa.getDbPathIterator();
+
+ EJBQLJoinAppender joinAppender = null;
+ String marker = null;
+ String lhsId = idVar;
+
while (dbPathIterator.hasNext()) {
Object pathPart = dbPathIterator.next();
@@ -73,13 +79,22 @@
}
else if (pathPart instanceof DbRelationship) {
- // DbRelationship rel = (DbRelationship) pathPart;
- // dbRelationshipAdded(rel);
+
+ if (marker == null) {
+ marker = EJBQLJoinAppender.makeJoinTailMarker(idVar);
+ joinAppender = context
+ .getTranslatorFactory()
+ .getJoinAppender(context);
+ }
+
+ DbRelationship dr = (DbRelationship) pathPart;
+
+ String rhsId = lhsId + ".db:" + dr.getName();
+ joinAppender.appendOuterJoin(marker, lhsId, rhsId);
+ lhsId = rhsId;
}
else if (pathPart instanceof DbAttribute) {
- DbAttribute dbAttr = (DbAttribute) pathPart;
-
- appendColumn(idVar, dbAttr, oa.getType());
+ appendColumn(idVar, (DbAttribute) pathPart, oa.getType());
}
}
return true;
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=607047&r1=607046&r2=607047&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 04:16:05 2007
@@ -18,7 +18,9 @@
****************************************************************/
package org.apache.cayenne.access.jdbc;
+import java.util.HashMap;
import java.util.Iterator;
+import java.util.Map;
import org.apache.cayenne.ejbql.EJBQLException;
import org.apache.cayenne.map.DbJoin;
@@ -35,11 +37,45 @@
public class EJBQLJoinAppender {
protected EJBQLTranslationContext context;
+ private Map<String, String> reusableJoins;
+
+ static String makeJoinTailMarker(String id) {
+ return "FROM_TAIL" + id;
+ }
public EJBQLJoinAppender(EJBQLTranslationContext context) {
this.context = context;
}
+ /**
+ * Registers a "reusable" join, returning a preexisting ID if the join is already
+ * registered. Reusable joins are the implicit inner joins that are added as a result
+ * of processing of path expressions in SELECT or WHERE clauses. Note that if an
+ * implicit INNER join overlaps with an explicit INNER join, both joins are added to
+ * the query.
+ */
+ public String registerReusableJoin(
+ String sourceIdPath,
+ String relationship,
+ String targetId) {
+
+
+ if (reusableJoins == null) {
+ reusableJoins = new HashMap<String, String>();
+ }
+
+ String key = sourceIdPath + ":" + relationship;
+
+ String oldId = reusableJoins.put(key, targetId);
+ if (oldId != null) {
+ // revert back to old id
+ reusableJoins.put(key, oldId);
+ return oldId;
+ }
+
+ return null;
+ }
+
public void appendInnerJoin(String marker, String lhsId, String rhsId) {
appendJoin(marker, lhsId, rhsId, "INNER JOIN");
}
@@ -127,7 +163,4 @@
}
}
- static String makeJoinTailMarker(String id) {
- return "FROM_TAIL" + id;
- }
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java?rev=607047&r1=607046&r2=607047&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java Thu Dec 27 04:16:05 2007
@@ -103,9 +103,15 @@
}
private void resolveJoin(boolean inner) {
+
+ EJBQLJoinAppender joinAppender = context.getTranslatorFactory().getJoinAppender(
+ context);
String newPath = idPath + '.' + lastPathComponent;
- String oldPath = context.registerReusableJoin(idPath, lastPathComponent, newPath);
+ String oldPath = joinAppender.registerReusableJoin(
+ idPath,
+ lastPathComponent,
+ newPath);
this.fullPath = fullPath + '.' + lastPathComponent;
@@ -115,10 +121,6 @@
.getDbEntityName());
}
else {
-
- EJBQLJoinAppender joinAppender = context
- .getTranslatorFactory()
- .getJoinAppender(context);
// register join
if (inner) {
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=607047&r1=607046&r2=607047&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 04:16:05 2007
@@ -42,7 +42,6 @@
private StringBuilder currentBuffer;
private EJBQLCompiledExpression compiledExpression;
private Map<String, Object> attributes;
- private Map<String, String> reusableJoins;
private Map<Object, Object> parameters;
private Map<String, String> idAliases;
private int columnAliasPosition;
@@ -276,30 +275,6 @@
Object getBoundParameter(String name) {
return boundParameters != null ? boundParameters.get(name) : null;
- }
-
- /**
- * Registers a "reusable" join, returning a preexisting ID if the join is already
- * registered. Reusable joins are the implicit inner joins that are added as a result
- * of processing of path expressions in SELECT or WHERE clauses. Note that if an
- * implicit INNER join overlaps with an explicit INNER join, both joins are added to
- * the query.
- */
- String registerReusableJoin(String sourceIdPath, String relationship, String targetId) {
- if (reusableJoins == null) {
- reusableJoins = new HashMap<String, String>();
- }
-
- String key = sourceIdPath + ":" + relationship;
-
- String oldId = reusableJoins.put(key, targetId);
- if (oldId != null) {
- // revert back to old id
- reusableJoins.put(key, oldId);
- return oldId;
- }
-
- return null;
}
/**