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