You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/11/10 16:06:45 UTC
[3/6] cayenne git commit: CAY-2175 AliasName used in EJBQLQuery is
not working if it contains mixed case
CAY-2175 AliasName used in EJBQLQuery is not working if it contains mixed case
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/37faf1d3
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/37faf1d3
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/37faf1d3
Branch: refs/heads/STABLE-3.1
Commit: 37faf1d392bc5cc64d2bb3a2028241857938aedf
Parents: e210860
Author: Nikita Timofeev <st...@gmail.com>
Authored: Fri Nov 10 15:44:52 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Fri Nov 10 15:44:52 2017 +0300
----------------------------------------------------------------------
docs/doc/src/main/resources/RELEASE-NOTES.txt | 1 +
.../apache/cayenne/ejbql/parser/Compiler.java | 68 +++++++++++---------
.../ejbql/EJBQLCompiledExpressionTest.java | 32 +++++++++
3 files changed, 69 insertions(+), 32 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/37faf1d3/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index 19fd5a1..569ece0 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -17,6 +17,7 @@ Bug Fixes Since 3.1.1:
CAY-2084 ObjectIdQuery - no cache access polymorphism
CAY-2101 DataContext.currentSnapshot() doesn't set snapshot entity name
CAY-2137 When generating SQL from EJBQL, use "AND" to separate multiple join conditions
+CAY-2175 AliasName used in EJBQLQuery is not working if it contains mixed case
CAY-2226 PK generation for Frontbase: PK cache size must be ignored
CAY-2276 PrePersist listener registered as PostPersist in LifecycleCallbackRegistry.addListener(Class<?>, LifecycleListener)
http://git-wip-us.apache.org/repos/asf/cayenne/blob/37faf1d3/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
----------------------------------------------------------------------
diff --git a/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java b/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
index ba8c9f6..30f8189 100644
--- a/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
+++ b/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
@@ -34,6 +34,7 @@ import org.apache.cayenne.ejbql.EJBQLExpressionVisitor;
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbJoin;
import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.Entity;
import org.apache.cayenne.map.EntityResolver;
import org.apache.cayenne.map.EntityResult;
import org.apache.cayenne.map.ObjAttribute;
@@ -87,49 +88,48 @@ class Compiler {
Map<EJBQLPath, Integer> pathsInSelect = new HashMap<EJBQLPath, Integer>();
- if (parsed != null) {
- for (int i = 0; i < parsed.getChildrenCount(); i++) {
- if (parsed.getChild(i) instanceof EJBQLSelectClause) {
+ for (int i = 0; i < parsed.getChildrenCount(); i++) {
+ if (parsed.getChild(i) instanceof EJBQLSelectClause) {
- EJBQLExpression parsedTemp = parsed.getChild(i);
- boolean stop = false;
+ EJBQLExpression parsedTemp = parsed.getChild(i);
+ boolean stop = false;
- while (parsedTemp.getChildrenCount() > 0 && !stop) {
- EJBQLExpression newParsedTemp = null;
- for (int j = 0; j < parsedTemp.getChildrenCount(); j++) {
- if (parsedTemp.getChild(j) instanceof EJBQLSelectExpression) {
- for (int k = 0; k < parsedTemp
- .getChild(j)
- .getChildrenCount(); k++) {
+ while (parsedTemp.getChildrenCount() > 0 && !stop) {
+ EJBQLExpression newParsedTemp = null;
+ for (int j = 0; j < parsedTemp.getChildrenCount(); j++) {
+ if (parsedTemp.getChild(j) instanceof EJBQLSelectExpression) {
+ for (int k = 0; k < parsedTemp
+ .getChild(j)
+ .getChildrenCount(); k++) {
- if (parsedTemp.getChild(j).getChild(k) instanceof EJBQLPath) {
- pathsInSelect.put((EJBQLPath) parsedTemp
- .getChild(j)
- .getChild(k), j);
+ if (parsedTemp.getChild(j).getChild(k) instanceof EJBQLPath) {
+ pathsInSelect.put((EJBQLPath) parsedTemp
+ .getChild(j)
+ .getChild(k), j);
- }
}
}
+ }
+ else {
+ if (parsedTemp.getChild(j).getChildrenCount() == 0) {
+ stop = true;
+ }
else {
- if (parsedTemp.getChild(j).getChildrenCount() == 0) {
- stop = true;
- }
- else {
- newParsedTemp = parsedTemp.getChild(j);
- }
+ newParsedTemp = parsedTemp.getChild(j);
}
}
+ }
- if (!stop && newParsedTemp != null) {
- parsedTemp = newParsedTemp;
- }
- else {
- stop = true;
- }
+ if (!stop && newParsedTemp != null) {
+ parsedTemp = newParsedTemp;
+ }
+ else {
+ stop = true;
}
}
}
}
+
// postprocess paths, now that all id vars are resolved
if (paths != null) {
for (EJBQLPath path : paths) {
@@ -147,6 +147,10 @@ class Compiler {
for (int i = 1; i < path.getChildrenCount(); i++) {
String pathChunk = path.getChild(i).getText();
+ if(pathChunk.endsWith(Entity.OUTER_JOIN_INDICATOR)) {
+ pathChunk = pathChunk.substring(0, pathChunk.length() - 1);
+ }
+
buffer.append('.').append(pathChunk);
Property property = descriptor.getProperty(pathChunk);
@@ -173,7 +177,7 @@ class Compiler {
Integer integer = pathsInSelect.get(path);
if (integer != null) {
resultComponents.remove(integer.intValue());
- resultComponents.add(pathsInSelect.get(path).intValue(), ident);
+ resultComponents.add(integer, ident);
rootId = pathRelationshipString;
}
}
@@ -530,7 +534,7 @@ class Compiler {
@Override
public boolean visitPath(EJBQLExpression expression, int finishedChildIndex) {
if (finishedChildIndex + 1 < expression.getChildrenCount()) {
- this.id = ((EJBQLPath) expression).getId();
+ this.id = normalizeIdPath(((EJBQLPath) expression).getId());
this.descriptor = descriptorsById.get(id);
if (descriptor == null) {
@@ -560,7 +564,7 @@ class Compiler {
public boolean visitIdentifier(EJBQLExpression expression) {
if (incoming != null) {
- String aliasId = expression.getText();
+ String aliasId = expression.getText().toLowerCase();
// map id variable to class descriptor
ClassDescriptor old = descriptorsById.put(aliasId, descriptor);
http://git-wip-us.apache.org/repos/asf/cayenne/blob/37faf1d3/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ejbql/EJBQLCompiledExpressionTest.java
----------------------------------------------------------------------
diff --git a/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ejbql/EJBQLCompiledExpressionTest.java b/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ejbql/EJBQLCompiledExpressionTest.java
index 5e16edb..82f6392 100644
--- a/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ejbql/EJBQLCompiledExpressionTest.java
+++ b/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ejbql/EJBQLCompiledExpressionTest.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.ejbql;
import org.apache.cayenne.configuration.server.ServerRuntime;
import org.apache.cayenne.di.Inject;
import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.query.EJBQLQuery;
import org.apache.cayenne.unit.di.server.ServerCase;
import org.apache.cayenne.unit.di.server.UseServerRuntime;
@@ -108,4 +109,35 @@ public class EJBQLCompiledExpressionTest extends ServerCase {
assertNotNull(select3.getEntityDescriptor("a"));
assertNotNull(select3.getEntityDescriptor("A"));
}
+
+ /**
+ * CAY-2175
+ */
+ public void testGetEntityDescriptorCaseSensitivityInJoin() {
+ EntityResolver resolver = runtime.getDataDomain().getEntityResolver();
+ EJBQLParser parser = EJBQLParserFactory.getParser();
+
+ EJBQLCompiledExpression select1 = parser.compile(
+ "SELECT artistAlias FROM Artist artistAlias " +
+ "WHERE artistAlias.artistName = 'Abcd'",
+ resolver
+ );
+ assertNotNull(select1.getEntityDescriptor("artistalias"));
+ assertNotNull(select1.getEntityDescriptor("artistAlias"));
+ assertNotNull(select1.getEntityDescriptor("ArTiStAlIaS"));
+
+ EJBQLCompiledExpression select2 = parser.compile(
+ "SELECT artistalias from Artist AS ArtistAlias JOIN artistalias.paintingArray as PaintingAlias " +
+ "where aRtistALiaS.artistName = 'Abcd'",
+ resolver
+ );
+ assertNotNull(select2.getEntityDescriptor("artistalias"));
+ assertNotNull(select2.getEntityDescriptor("artistAlias"));
+ assertNotNull(select2.getEntityDescriptor("ArTiStAlIaS"));
+
+ assertNotNull(select2.getEntityDescriptor("PaintingAlias"));
+ assertNotNull(select2.getEntityDescriptor("paintingalias"));
+ assertNotNull(select2.getEntityDescriptor("PaInTinGAlIaS"));
+ }
+
}