[jira] [Commented] (CAY-2848) Vertical Inheritance: Updating one-to-many with inverse nullifies other columns.

2024-03-05 Thread Jadon Hansell (Jira)


[ 
https://issues.apache.org/jira/browse/CAY-2848?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=17823781#comment-17823781
 ] 

Jadon Hansell commented on CAY-2848:


I believe this was an existing error before CAY-2838, I've begun migrating 
columns back to the child DbEntities after that ticket to test and ran into 
this.

> Vertical Inheritance: Updating one-to-many with inverse nullifies other 
> columns.
> 
>
> Key: CAY-2848
> URL: https://issues.apache.org/jira/browse/CAY-2848
> Project: Cayenne
>  Issue Type: Bug
>Reporter: Jadon Hansell
>Priority: Major
> Attachments: update-flattened-relationship-nullify-other-columns.patch
>
>
> When there is a one-to-many relationship on the child DbEntity of a vertical 
> inheritance scenario, giving it an inverse fails when the relationship is 
> updated to anything non-null.
> An update query is issued that contains the PK of the child row and the new 
> ID for the relationship, but sets every other column to null. I've included a 
> breaking test as a patch in 4.2-STABLE.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)


[jira] [Created] (CAY-2848) Vertical Inheritance: Updating one-to-many with inverse nullifies other columns.

2024-03-05 Thread Jadon Hansell (Jira)
Jadon Hansell created CAY-2848:
--

 Summary: Vertical Inheritance: Updating one-to-many with inverse 
nullifies other columns.
 Key: CAY-2848
 URL: https://issues.apache.org/jira/browse/CAY-2848
 Project: Cayenne
  Issue Type: Bug
Reporter: Jadon Hansell
 Attachments: update-flattened-relationship-nullify-other-columns.patch

When there is a one-to-many relationship on the child DbEntity of a vertical 
inheritance scenario, giving it an inverse fails when the relationship is 
updated to anything non-null.



An update query is issued that contains the PK of the child row and the new ID 
for the relationship, but sets every other column to null. I've included a 
breaking test as a patch in 4.2-STABLE.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)


[jira] [Updated] (CAY-2814) Select query iterator() and batchIterator() methods return incorrect results

2024-03-05 Thread Nikita Timofeev (Jira)


 [ 
https://issues.apache.org/jira/browse/CAY-2814?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Nikita Timofeev updated CAY-2814:
-
Affects Version/s: 4.1
   4.1.2
   4.2.1

> Select query iterator() and batchIterator() methods return incorrect results
> 
>
> Key: CAY-2814
> URL: https://issues.apache.org/jira/browse/CAY-2814
> Project: Cayenne
>  Issue Type: Bug
>  Components: Core Library
>Affects Versions: 4.1, 4.1.1, 4.2.RC1, 4.1.2, 4.2, 4.2.1
>Reporter: Nikita Timofeev
>Assignee: Nikita Timofeev
>Priority: Major
> Fix For: 5.0-M1
>
>  Time Spent: 40m
>  Remaining Estimate: 0h
>
> Iterated queries can handle only basic results like single entity, 
> {{Object[]}} and {{DataRow}}
> everything else is missing in the processing.
> This affects ColumnQuery most as it can return many more variants.
> What variants are broken:
> * all selects: joint prefetches
> * column query: several entities or entity + some other fields
> * column query: embeddables
> * column query: map function (see CAY-2812)
> * maybe something else (?)



--
This message was sent by Atlassian Jira
(v8.20.10#820010)


[jira] [Closed] (CAY-2844) Joint prefetch doesn't use ObjEntity qualifier

2024-03-05 Thread Nikita Timofeev (Jira)


 [ 
https://issues.apache.org/jira/browse/CAY-2844?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Nikita Timofeev closed CAY-2844.

Resolution: Fixed

*5.0*: 
https://github.com/apache/cayenne/commit/55acf42bcd29f3d663f5e343d20e8f681c856c43

*4.2*: 
https://github.com/apache/cayenne/commit/1124cb9deca380f68449a1cdc50f86e71eb96f54

> Joint prefetch doesn't use ObjEntity qualifier
> --
>
> Key: CAY-2844
> URL: https://issues.apache.org/jira/browse/CAY-2844
> Project: Cayenne
>  Issue Type: Bug
>  Components: Core Library
>Affects Versions: 4.2
>Reporter: Nikita Timofeev
>Assignee: Nikita Timofeev
>Priority: Major
> Fix For: 4.2.1, 5.0-M1
>
>
> Joint prefetch ignores existing qualifier on ObjEntity. 
> Disjoint and DisjointById prefetches are working fine.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)


(cayenne) branch STABLE-4.2 updated: CAY-2844 Joint prefetch doesn't use ObjEntity qualifier

2024-03-05 Thread ntimofeev
This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch STABLE-4.2
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/STABLE-4.2 by this push:
 new 1124cb9de CAY-2844 Joint prefetch doesn't use ObjEntity qualifier
1124cb9de is described below

commit 1124cb9deca380f68449a1cdc50f86e71eb96f54
Author: Nikita Timofeev 
AuthorDate: Tue Mar 5 13:26:51 2024 +0400

CAY-2844 Joint prefetch doesn't use ObjEntity qualifier

(cherry picked from commit 55acf42bcd29f3d663f5e343d20e8f681c856c43)
---
 RELEASE-NOTES.txt  |  1 +
 .../access/translator/select/DbPathProcessor.java  |  5 +-
 .../access/translator/select/PathProcessor.java| 11 ++--
 .../translator/select/PrefetchNodeStage.java   | 19 +-
 .../access/translator/select/TableTree.java| 12 +++-
 .../access/translator/select/TableTreeNode.java| 11 +++-
 .../translator/select/TableTreeQualifierStage.java | 50 ---
 .../translator/select/TranslatorContext.java   | 11 
 .../org/apache/cayenne/CDOQualifiedEntitiesIT.java | 72 ++
 9 files changed, 151 insertions(+), 41 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index dbad3137f..cd90a551c 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -23,6 +23,7 @@ CAY-2815 Incorrect translation of aliased expression
 CAY-2838 Vertical Inheritance: Problem setting db attribute to null via 
flattened path
 CAY-2840 Vertical Inheritance: Missing subclass attributes with joint prefetch
 CAY-2841 Multi column ColumnSelect with SHARED_CACHE fails after 1st select
+CAY-2844 Joint prefetch doesn't use ObjEntity qualifier
 
 --
 Release: 4.2
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DbPathProcessor.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DbPathProcessor.java
index 104299df0..c01bd0582 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DbPathProcessor.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DbPathProcessor.java
@@ -30,7 +30,7 @@ import org.apache.cayenne.map.JoinType;
  */
 class DbPathProcessor extends PathProcessor {
 
-private boolean flattenedPath;
+private final boolean flattenedPath;
 
 DbPathProcessor(TranslatorContext context, DbEntity entity, String 
parentPath, boolean flattenedPath) {
 super(context, entity);
@@ -47,6 +47,9 @@ class DbPathProcessor extends PathProcessor {
 
 @Override
 protected void processNormalAttribute(String next) {
+if(next.startsWith("p:")) {
+next = next.substring(2);
+}
 DbAttribute dbAttribute = entity.getAttribute(next);
 if (dbAttribute != null) {
 processAttribute(dbAttribute);
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/PathProcessor.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/PathProcessor.java
index 8c68ebf57..3786eac13 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/PathProcessor.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/PathProcessor.java
@@ -21,7 +21,6 @@ package org.apache.cayenne.access.translator.select;
 
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.Entity;
 
 import java.util.ArrayList;
@@ -61,6 +60,9 @@ abstract class PathProcessor implements 
PathTranslationResult
 }
 
 public PathTranslationResult process(String path) {
+if(path.startsWith("p:")) {
+currentDbPath.insert(0, "p:");
+}
 PathComponents components = new PathComponents(path);
 String[] rawComponents = components.getAll();
 for (int i = 0; i < rawComponents.length; i++) {
@@ -111,18 +113,13 @@ abstract class PathProcessor implements 
PathTranslationResult
 return Optional.of(relationship);
 }
 
-@Override
-public Optional getEmbeddable() {
-return Optional.empty();
-}
-
 @Override
 public String getFinalPath() {
 return currentDbPath.toString();
 }
 
 protected void appendCurrentPath(String nextSegment) {
-if (currentDbPath.length() > 0) {
+if (currentDbPath.length() > 0 && 
currentDbPath.charAt(currentDbPath.length() - 1) != ':') {
 currentDbPath.append('.');
 }
 currentDbPath.append(nextSegment);
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/PrefetchNodeStage.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/PrefetchNodeStage.java
index 924a6e916..f85c0a465 100644
--- 

[jira] [Closed] (CAY-2838) Vertical Inheritance: Problem setting db attribute to null via flattened path

2024-03-05 Thread Nikita Timofeev (Jira)


 [ 
https://issues.apache.org/jira/browse/CAY-2838?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Nikita Timofeev closed CAY-2838.

Resolution: Fixed

New fix is ready

*5.0*: 
https://github.com/apache/cayenne/commit/e60ac710be75799a735bbe1a458b4ba09704a5c7

*4.2*: 
https://github.com/apache/cayenne/commit/cc51de1baecc1e67e08206a9603d8618cb91aecd
 + following commits

> Vertical Inheritance: Problem setting db attribute to null via flattened path
> -
>
> Key: CAY-2838
> URL: https://issues.apache.org/jira/browse/CAY-2838
> Project: Cayenne
>  Issue Type: Bug
>  Components: Core Library
>Affects Versions: 4.2
> Environment: Cayenne 4.2, Java 17, MacOS 14
>Reporter: Jadon Hansell
>Assignee: Nikita Timofeev
>Priority: Major
> Fix For: 4.2.1, 5.0-M1
>
> Attachments: NullifyFlattenedTests.patch, 
> concrete-to-abstract-error.patch
>
>  Time Spent: 20m
>  Remaining Estimate: 0h
>
> While using vertical inheritance, I ran into a bug with a non-required 
> attribute on a child {{{}DbEntity{}}}. The issue occurs when an attribute, 
> accessed via a flattened path like '{{{}child.attr{}}}' on the child's 
> {{{}ObjEntity{}}}, is initially set to a value and then later changed to 
> null. This causes Cayenne to attempt to set the primary key of the {{child}} 
> db entity to null as well.
> I've attached a patch that contains failing tests demonstrating this issue on 
> both an ObjEntity's attribute and a belongs-to relationship.
> A temporary workaround I've used is to relocate these columns to the parent 
> DbEntity so the path isn't flattened.
>  
> The root of the problem appears to start in the 
> {{{}ValuesCreationHandler{}}}. During the operation, it runs 
> {{processFlattenedPath}} to identify the target row's ID, with 
> {{{}add=false{}}}. This then iterates through the db path components and 
> invokes {{processRelationship}} for each db relationship, again with 
> {{{}add=false{}}}.
> While processing the first path component, {{processRelationship}} creates an 
> {{UPDATE}} row operation, attempting to update the child's uuid to its 
> current value (case 2 in the comments). Normally, this would not cause an 
> error. But, because the '{{{}add'{}}} parameter is set to false, the 
> {{ValuePropagationVisitor}} replaces the current ID with null.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)


(cayenne) branch master updated: CAY-2844 Joint prefetch doesn't use ObjEntity qualifier

2024-03-05 Thread ntimofeev
This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/master by this push:
 new 55acf42bc CAY-2844 Joint prefetch doesn't use ObjEntity qualifier
55acf42bc is described below

commit 55acf42bcd29f3d663f5e343d20e8f681c856c43
Author: Nikita Timofeev 
AuthorDate: Tue Mar 5 13:26:51 2024 +0400

CAY-2844 Joint prefetch doesn't use ObjEntity qualifier
---
 RELEASE-NOTES.txt  |  3 +-
 .../access/translator/select/PathProcessor.java|  4 +-
 .../translator/select/PrefetchNodeStage.java   | 18 +-
 .../access/translator/select/TableTree.java| 11 +++-
 .../access/translator/select/TableTreeNode.java| 11 +++-
 .../translator/select/TableTreeQualifierStage.java | 41 ++--
 .../translator/select/TranslatorContext.java   | 11 
 .../org/apache/cayenne/CDOQualifiedEntitiesIT.java | 72 ++
 8 files changed, 139 insertions(+), 32 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 0fdc8e180..1b60260c1 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -98,4 +98,5 @@ CAY-2815 Incorrect translation of aliased expression
 CAY-2827 Saved data-source XML data doesn't correspond to the XSD schema
 CAY-2838 Vertical Inheritance: Problem setting db attribute to null via 
flattened path
 CAY-2840 Vertical Inheritance: Missing subclass attributes with joint prefetch
-CAY-2841 Multi column ColumnSelect with SHARED_CACHE fails after 1st select
\ No newline at end of file
+CAY-2841 Multi column ColumnSelect with SHARED_CACHE fails after 1st select
+CAY-2844 Joint prefetch doesn't use ObjEntity qualifier
\ No newline at end of file
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/PathProcessor.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/PathProcessor.java
index 2f4712cbe..f4968031b 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/PathProcessor.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/PathProcessor.java
@@ -36,7 +36,6 @@ import java.util.Optional;
  */
 abstract class PathProcessor> implements 
PathTranslationResult {
 
-public static final char OUTER_JOIN_INDICATOR = '+';
 public static final char SPLIT_PATH_INDICATOR = '#';
 public static final String DB_PATH_ALIAS_INDICATOR = "db:";
 
@@ -62,6 +61,9 @@ abstract class PathProcessor> 
implements PathTranslation
 }
 
 public PathTranslationResult process(CayennePath path) {
+if(path.marker() != CayennePath.NO_MARKER) {
+currentDbPath = currentDbPath.withMarker(path.marker());
+}
 List segments = path.segments();
 int size = segments.size();
 for (int i = 0; i < size; i++) {
diff --git 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/PrefetchNodeStage.java
 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/PrefetchNodeStage.java
index e4d010c71..accabd374 100644
--- 
a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/PrefetchNodeStage.java
+++ 
b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/PrefetchNodeStage.java
@@ -81,9 +81,11 @@ class PrefetchNodeStage implements TranslationStage {
 
 for(PrefetchTreeNode node : prefetch.adjacentJointNodes()) {
 Expression prefetchExp = ExpressionFactory.pathExp(node.getPath());
+ObjRelationship targetRel = (ObjRelationship) 
prefetchExp.evaluate(objEntity);
 ASTDbPath dbPrefetch = (ASTDbPath) 
objEntity.translateToDbPath(prefetchExp);
 CayennePath dbPath = dbPrefetch.getPath();
 DbEntity dbEntity = objEntity.getDbEntity();
+Expression targetQualifier = 
context.getResolver().getClassDescriptor(targetRel.getTargetEntityName()).getEntityInheritanceTree().qualifierForEntityAndSubclasses();
 
 CayennePath fullPath = 
CayennePath.EMPTY_PATH.withMarker(CayennePath.PREFETCH_MARKER);
 
@@ -94,13 +96,16 @@ class PrefetchNodeStage implements TranslationStage {
 }
 
 fullPath = fullPath.dot(c);
-context.getTableTree().addJoinTable(fullPath, rel, 
JoinType.LEFT_OUTER);
+if(targetQualifier != null && c == dbPath.last()) {
+targetQualifier = 
translateToPrefetchQualifier(targetRel.getTargetEntity(), targetQualifier);
+
context.getTableTree().addJoinTable(fullPath.withMarker(CayennePath.PREFETCH_MARKER),
 rel, JoinType.LEFT_OUTER, targetQualifier);
+} else {
+
context.getTableTree().addJoinTable(fullPath.withMarker(CayennePath.PREFETCH_MARKER),
 rel, JoinType.LEFT_OUTER);
+}
 dbEntity = rel.getTargetEntity();
 }
 
-