[jira] [Commented] (CAY-2848) Vertical Inheritance: Updating one-to-many with inverse nullifies other columns.
[ 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.
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
[ 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
[ 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
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
[ 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
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(); } -