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 2026/10/08 17:41:56 UTC
(cayenne) 02/03: cleanup
This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 42d4d30cefd18d876a1e3df932394a2f45730471
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Thu Oct 8 13:40:30 2026 -0400
cleanup
---
.../org/apache/cayenne/exp/path/CayennePath.java | 5 +++++
.../cayenne/exp/path/CayennePathSegment.java | 2 +-
.../org/apache/cayenne/exp/path/PathParser.java | 4 ++--
.../cayenne/exp/property/EntityProperty.java | 24 ++++++++++++++--------
.../main/java/org/apache/cayenne/map/Entity.java | 8 +++++---
.../java/org/apache/cayenne/ql/QLParserHelper.java | 5 +++--
6 files changed, 31 insertions(+), 17 deletions(-)
diff --git a/cayenne/src/main/java/org/apache/cayenne/exp/path/CayennePath.java b/cayenne/src/main/java/org/apache/cayenne/exp/path/CayennePath.java
index 47972d5b7f..16b4d2c51d 100644
--- a/cayenne/src/main/java/org/apache/cayenne/exp/path/CayennePath.java
+++ b/cayenne/src/main/java/org/apache/cayenne/exp/path/CayennePath.java
@@ -61,6 +61,11 @@ public interface CayennePath extends Iterable<CayennePathSegment> {
*/
CayennePath EMPTY_PATH = new EmptyCayennePath(NO_MARKER);
+ /**
+ * A suffix of a path segment indicating that an OUTER JOIN should be used when resolving that segment.
+ */
+ char OUTER_JOIN_INDICATOR = '+';
+
/**
* Create path from a given String
* <p>
diff --git a/cayenne/src/main/java/org/apache/cayenne/exp/path/CayennePathSegment.java b/cayenne/src/main/java/org/apache/cayenne/exp/path/CayennePathSegment.java
index f025f2d81b..79168f4730 100644
--- a/cayenne/src/main/java/org/apache/cayenne/exp/path/CayennePathSegment.java
+++ b/cayenne/src/main/java/org/apache/cayenne/exp/path/CayennePathSegment.java
@@ -86,7 +86,7 @@ public class CayennePathSegment implements CharSequence {
if (!outer) {
return segment;
}
- return segment + "+";
+ return segment + CayennePath.OUTER_JOIN_INDICATOR;
}
@Override
diff --git a/cayenne/src/main/java/org/apache/cayenne/exp/path/PathParser.java b/cayenne/src/main/java/org/apache/cayenne/exp/path/PathParser.java
index 88ff458da8..dd8f58aad1 100644
--- a/cayenne/src/main/java/org/apache/cayenne/exp/path/PathParser.java
+++ b/cayenne/src/main/java/org/apache/cayenne/exp/path/PathParser.java
@@ -71,7 +71,7 @@ class PathParser {
}
static CayennePathSegment parseSegment(String segment, int start, int end) {
- if(segment.charAt(end - 1) == '+') {
+ if(segment.charAt(end - 1) == CayennePath.OUTER_JOIN_INDICATOR) {
return new CayennePathSegment(segment.substring(start, end - 1), true);
} else {
return new CayennePathSegment(segment.substring(start, end), false);
@@ -80,7 +80,7 @@ class PathParser {
static CayennePathSegment parseSegment(String segment) {
boolean outer = false;
- if(segment.length() > 1 && segment.charAt(segment.length() - 1) == '+') {
+ if(segment.length() > 1 && segment.charAt(segment.length() - 1) == CayennePath.OUTER_JOIN_INDICATOR) {
segment = segment.substring(0, segment.length() - 1);
outer = true;
}
diff --git a/cayenne/src/main/java/org/apache/cayenne/exp/property/EntityProperty.java b/cayenne/src/main/java/org/apache/cayenne/exp/property/EntityProperty.java
index 0e9cef6e8e..a77abd1078 100644
--- a/cayenne/src/main/java/org/apache/cayenne/exp/property/EntityProperty.java
+++ b/cayenne/src/main/java/org/apache/cayenne/exp/property/EntityProperty.java
@@ -19,12 +19,6 @@
package org.apache.cayenne.exp.property;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.ObjectId;
import org.apache.cayenne.Persistent;
@@ -32,6 +26,13 @@ import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.cayenne.exp.PathExp;
import org.apache.cayenne.exp.path.CayennePath;
+import org.apache.cayenne.exp.path.CayennePathSegment;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
/**
* Property that represents to-one relationships.
@@ -255,14 +256,19 @@ public class EntityProperty<E extends Persistent> extends BaseProperty<E> implem
*/
@Override
public EntityProperty<E> outer() {
- return getName().endsWith("+")
- ? this
- : PropertyFactory.createEntity(getName() + "+", getType());
+ CayennePathSegment last = getPath().last();
+ if (last.isOuterJoin()) {
+ return this;
+ } else {
+ CayennePath outerPath = getPath().parent().dot(last.outer());
+ return PropertyFactory.createEntity(outerPath, getType());
+ }
}
/**
* @return property that will be translated relative to parent query
*/
+ @Override
public EntityProperty<E> enclosing() {
return PropertyFactory.createEntity(ExpressionFactory.enclosingObjectExp(getExpression()), getType());
}
diff --git a/cayenne/src/main/java/org/apache/cayenne/map/Entity.java b/cayenne/src/main/java/org/apache/cayenne/map/Entity.java
index 077b50558a..c99a822088 100644
--- a/cayenne/src/main/java/org/apache/cayenne/map/Entity.java
+++ b/cayenne/src/main/java/org/apache/cayenne/map/Entity.java
@@ -45,11 +45,13 @@ public abstract class Entity<E extends Entity<E, A, R>, A extends Attribute<E, A
public static final String PATH_SEPARATOR = ".";
/**
- * A prefix or a suffix that can be used in a path component to indicate that an OUTER
- * JOIN should be used when resolving the expression.
- *
+ * A suffix that can be used in a path component to indicate that an OUTER JOIN should be used when resolving
+ * the expression.
+ *
* @since 3.0
+ * @deprecated in favor of {@link CayennePath#OUTER_JOIN_INDICATOR}
*/
+ @Deprecated(since = "5.0", forRemoval = true)
public static final String OUTER_JOIN_INDICATOR = "+";
protected String name;
diff --git a/cayenne/src/main/java/org/apache/cayenne/ql/QLParserHelper.java b/cayenne/src/main/java/org/apache/cayenne/ql/QLParserHelper.java
index abebf9d3de..1378d5e922 100644
--- a/cayenne/src/main/java/org/apache/cayenne/ql/QLParserHelper.java
+++ b/cayenne/src/main/java/org/apache/cayenne/ql/QLParserHelper.java
@@ -22,6 +22,7 @@ package org.apache.cayenne.ql;
import org.apache.cayenne.exp.EnumRef;
import org.apache.cayenne.exp.ListExp;
import org.apache.cayenne.exp.PathExp;
+import org.apache.cayenne.exp.path.CayennePath;
import java.util.Collection;
import java.util.HashMap;
@@ -48,8 +49,8 @@ class QLParserHelper {
for (int i = 0; i < pathSegments.length; i++) {
if (pathSegments[i].contains("#")) {
String[] splitSegment = pathSegments[i].split("#");
- if(splitSegment[1].endsWith("+")) {
- splitSegment[0] += '+';
+ if(splitSegment[1].charAt(splitSegment[1].length() - 1) == CayennePath.OUTER_JOIN_INDICATOR) {
+ splitSegment[0] += CayennePath.OUTER_JOIN_INDICATOR;
splitSegment[1] = splitSegment[1].substring(0, splitSegment[1].length() - 1);
}
String previousAlias = aliasMap.putIfAbsent(splitSegment[1], splitSegment[0]);