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 7365715b5 CAY-2552 fix bug with flattened attributes
new 2965b9a0c Merge pull request #556 from
aperaverzeu/4.3-FEATURE-CAY-2552-ColumnQuery-bug-with-flattened-attribute
7365715b5 is described below
commit 7365715b5b2bb37fb6007ca765135225995ba06c
Author: Aliaksei Peraverzeu <[email protected]>
AuthorDate: Fri Dec 30 13:49:57 2022 +0300
CAY-2552 fix bug with flattened attributes
---
.../select/DescriptorColumnExtractor.java | 17 ++-
.../access/DataContextFlattenedAttributesIT.java | 147 ++++++++++++++++++++-
.../cayenne/access/VerticalInheritanceIT.java | 109 ++++++++++++++-
.../select/DescriptorColumnExtractorIT.java | 83 ++++++++++++
.../map/DefaultEntityResultSegmentTest.java | 54 ++++++++
.../testdo/inheritance_vertical/auto/_Iv1Root.java | 6 +-
.../testdo/inheritance_vertical/auto/_Iv1Sub1.java | 6 +-
.../testdo/inheritance_vertical/auto/_Iv2Root.java | 6 +-
.../testdo/inheritance_vertical/auto/_Iv2Sub1.java | 5 +-
.../testdo/inheritance_vertical/auto/_Iv2X.java | 7 +-
.../inheritance_vertical/auto/_IvAbstract.java | 6 +-
.../testdo/inheritance_vertical/auto/_IvBase.java | 6 +-
.../inheritance_vertical/auto/_IvBaseWithLock.java | 6 +-
.../inheritance_vertical/auto/_IvConcrete.java | 4 +-
.../inheritance_vertical/auto/_IvGenKeyRoot.java | 6 +-
.../inheritance_vertical/auto/_IvGenKeySub.java | 7 +-
.../testdo/inheritance_vertical/auto/_IvImpl.java | 5 +-
.../inheritance_vertical/auto/_IvImplWithLock.java | 5 +-
.../testdo/inheritance_vertical/auto/_IvOther.java | 6 +-
.../testdo/inheritance_vertical/auto/_IvRoot.java | 6 +-
.../testdo/inheritance_vertical/auto/_IvSub1.java | 26 +++-
.../inheritance_vertical/auto/_IvSub1Sub1.java | 6 +-
.../testdo/inheritance_vertical/auto/_IvSub2.java | 6 +-
.../testdo/inheritance_vertical/auto/_IvSub3.java | 5 +-
.../test/resources/inheritance-vertical.map.xml | 4 +
25 files changed, 514 insertions(+), 30 deletions(-)
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractor.java
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractor.java
index 7f8025976..0ecd53fe4 100644
---
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractor.java
+++
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractor.java
@@ -118,9 +118,16 @@ class DescriptorColumnExtractor extends
BaseColumnExtractor implements PropertyV
int count = result.getDbAttributes().size();
for(int i=0; i<count; i++) {
ResultNodeDescriptor resultNodeDescriptor =
processTranslationResult(result, i);
- if(resultNodeDescriptor != null && i == count - 1) {
+ if(resultNodeDescriptor != null) {
resultNodeDescriptor.setJavaType(oa.getType());
- addEntityResultField(oa.getDbAttribute());
+ if (result.getDbAttributes().size() >= 2) {
+ DbAttribute dbAttribute = result.getDbAttributes().get(i);
+ String dataRowKey = result.getAttributePaths().get(i) +
"." + dbAttribute.getName();
+ resultNodeDescriptor.setDataRowKey(dataRowKey);
+ addEntityResultField(dataRowKey);
+ } else {
+ addEntityResultField(result.getDbAttributes().get(i));
+ }
}
}
@@ -177,6 +184,12 @@ class DescriptorColumnExtractor extends
BaseColumnExtractor implements PropertyV
}
}
+ private void addEntityResultField(String nameForFlattenedAttribute) {
+ if (context.getQuery().needsResultSetMapping()) {
+ entityResult.addDbField(nameForFlattenedAttribute,
nameForFlattenedAttribute);
+ }
+ }
+
@Override
public boolean visitToMany(ToManyProperty property) {
return true;
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextFlattenedAttributesIT.java
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextFlattenedAttributesIT.java
index adb152b79..4ec42b608 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextFlattenedAttributesIT.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextFlattenedAttributesIT.java
@@ -22,8 +22,11 @@ package org.apache.cayenne.access;
import org.apache.cayenne.Cayenne;
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.PersistenceState;
+import org.apache.cayenne.access.translator.select.DefaultSelectTranslator;
import org.apache.cayenne.configuration.server.ServerRuntime;
import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.DefaultEntityResultSegment;
+import org.apache.cayenne.query.ColumnSelect;
import org.apache.cayenne.query.EJBQLQuery;
import org.apache.cayenne.query.ObjectSelect;
import org.apache.cayenne.query.SelectById;
@@ -37,6 +40,7 @@ import org.apache.cayenne.testdo.testmap.Gallery;
import org.apache.cayenne.unit.di.server.CayenneProjects;
import org.apache.cayenne.unit.di.server.ServerCase;
import org.apache.cayenne.unit.di.server.UseServerRuntime;
+import org.junit.Before;
import org.junit.Test;
import java.math.BigDecimal;
@@ -61,11 +65,17 @@ public class DataContextFlattenedAttributesIT extends
ServerCase {
@Inject
private DBHelper dbHelper;
- private void createTestDataSet() throws Exception {
- TableHelper tArtist = new TableHelper(dbHelper, "ARTIST");
+ private TableHelper tArtist;
+ private TableHelper tPainting;
+ private TableHelper tPaintingInfo;
+ private TableHelper tGallery;
+
+ @Before
+ public void createTestDataSetStructure() {
+ tArtist = new TableHelper(dbHelper, "ARTIST");
tArtist.setColumns("ARTIST_ID", "ARTIST_NAME", "DATE_OF_BIRTH");
- TableHelper tPainting = new TableHelper(dbHelper, "PAINTING");
+ tPainting = new TableHelper(dbHelper, "PAINTING");
tPainting.setColumns(
"PAINTING_ID",
"PAINTING_TITLE",
@@ -78,12 +88,14 @@ public class DataContextFlattenedAttributesIT extends
ServerCase {
Types.DECIMAL,
Types.INTEGER);
- TableHelper tPaintingInfo = new TableHelper(dbHelper, "PAINTING_INFO");
+ tPaintingInfo = new TableHelper(dbHelper, "PAINTING_INFO");
tPaintingInfo.setColumns("PAINTING_ID", "TEXT_REVIEW");
- TableHelper tGallery = new TableHelper(dbHelper, "GALLERY");
+ tGallery = new TableHelper(dbHelper, "GALLERY");
tGallery.setColumns("GALLERY_ID", "GALLERY_NAME");
+ }
+ private void createTestDataSet() throws Exception {
long dateBase = System.currentTimeMillis();
for (int i = 1; i <= 4; i++) {
tArtist.insert(i + 1, "artist" + i, new java.sql.Date(dateBase
@@ -193,6 +205,115 @@ public class DataContextFlattenedAttributesIT extends
ServerCase {
assertNotNull(objects);
}
+ @Test
+ public void testColumnQueryWithFlattenedAttribute() throws Exception {
+ createTestDataSet();
+ ColumnSelect<Object[]> originalQuery =
ObjectSelect.query(CompoundPaintingLongNames.class)
+ .columns(CompoundPaintingLongNames.SELF);
+
+ DataNode dataNode =
context.getParentDataDomain().getDataNodes().iterator().next();
+ DefaultSelectTranslator translator =
+ new DefaultSelectTranslator(originalQuery,
dataNode.getAdapter(), context.getEntityResolver());
+
+ translator.getSql();
+
+ DefaultEntityResultSegment segment = (DefaultEntityResultSegment)
originalQuery
+ .getMetaData(context.getEntityResolver())
+ .getResultSetMapping()
+ .get(0);
+
+ assertEquals(12, segment.getFields().size());
+ assertEquals(12, translator.getResultColumns().length);
+ assertEquals(segment.getFields().size(),
translator.getResultColumns().length);
+ }
+
+ @Test
+ public void testSelectColumnQuery() throws Exception {
+ createTestDataWithDeletion();
+
+ ColumnSelect<CompoundPaintingLongNames> originalQuery =
ObjectSelect.query(CompoundPaintingLongNames.class)
+ .column(CompoundPaintingLongNames.SELF);
+
+ CompoundPaintingLongNames beforeCompoundPainting = originalQuery
+ .where(CompoundPaintingLongNames.PAINTING_ID_PK_PROPERTY.eq(1))
+ .selectOne(context);
+
+ String beforeArtistNameFromContext =
beforeCompoundPainting.getArtistLongName();
+ String beforePaintingTitleFromContext =
beforeCompoundPainting.getPaintingTitle();
+
+ String beforeArtistNameFromDatabase = (String)
tArtist.selectAll().get(0)[1];
+ String beforePaintingTitleFromDatabase = (String)
tPainting.selectAll().get(0)[1];
+
+ assertNotNull(beforeArtistNameFromDatabase);
+ assertNotNull(beforePaintingTitleFromDatabase);
+
+ assertEquals(beforeArtistNameFromDatabase.trim(),
beforeArtistNameFromContext);
+ assertEquals(beforePaintingTitleFromDatabase.trim(),
beforePaintingTitleFromContext);
+
+ beforeCompoundPainting.setArtistLongName("some");
+ beforeCompoundPainting.setPaintingTitle("omes");
+ context.commitChanges();
+
+ CompoundPaintingLongNames afterCompoundPainting = originalQuery
+ .where(CompoundPaintingLongNames.PAINTING_ID_PK_PROPERTY.eq(1))
+ .selectOne(context);
+
+ String afterArtistNameFromContext =
afterCompoundPainting.getArtistLongName();
+ String afterPaintingTitleFromContext =
afterCompoundPainting.getPaintingTitle();
+
+ String afterArtistNameFromDatabase = (String)
tArtist.selectAll().get(0)[1];
+ String afterPaintingTitleFromDatabase = (String)
tPainting.selectAll().get(0)[1];
+
+ assertNotNull(afterArtistNameFromDatabase);
+ assertNotNull(afterPaintingTitleFromDatabase);
+
+ assertEquals((afterArtistNameFromDatabase).trim(),
afterArtistNameFromContext);
+ assertEquals((afterPaintingTitleFromDatabase).trim(),
afterPaintingTitleFromContext);
+ }
+
+ @Test
+ public void testObjectSelectQuery() throws Exception {
+ createTestDataWithDeletion();
+
+ ObjectSelect<CompoundPaintingLongNames> originalQuery =
ObjectSelect.query(CompoundPaintingLongNames.class);
+
+ CompoundPaintingLongNames beforeCompoundPainting = originalQuery
+ .where(CompoundPaintingLongNames.PAINTING_ID_PK_PROPERTY.eq(1))
+ .selectOne(context);
+
+ String beforeArtistNameFromContext =
beforeCompoundPainting.getArtistLongName();
+ String beforePaintingTitleFromContext =
beforeCompoundPainting.getPaintingTitle();
+
+ String beforeArtistNameFromDatabase = (String)
tArtist.selectAll().get(0)[1];
+ String beforePaintingTitleFromDatabase = (String)
tPainting.selectAll().get(0)[1];
+
+ assertNotNull(beforeArtistNameFromDatabase);
+ assertNotNull(beforePaintingTitleFromDatabase);
+
+ assertEquals(beforeArtistNameFromDatabase.trim(),
beforeArtistNameFromContext);
+ assertEquals(beforePaintingTitleFromDatabase.trim(),
beforePaintingTitleFromContext);
+
+ beforeCompoundPainting.setArtistLongName("some");
+ beforeCompoundPainting.setPaintingTitle("omes");
+ context.commitChanges();
+
+ CompoundPaintingLongNames afterCompoundPainting = originalQuery
+ .where(CompoundPaintingLongNames.PAINTING_ID_PK_PROPERTY.eq(1))
+ .selectOne(context);
+
+ String afterArtistNameFromContext =
afterCompoundPainting.getArtistLongName();
+ String afterPaintingTitleFromContext =
afterCompoundPainting.getPaintingTitle();
+
+ String afterArtistNameFromDatabase = (String)
tArtist.selectAll().get(0)[1];
+ String afterPaintingTitleFromDatabase = (String)
tPainting.selectAll().get(0)[1];
+
+ assertNotNull(afterArtistNameFromDatabase);
+ assertNotNull(afterPaintingTitleFromDatabase);
+
+ assertEquals(afterArtistNameFromDatabase.trim(),
afterArtistNameFromContext);
+ assertEquals(afterPaintingTitleFromDatabase.trim(),
afterPaintingTitleFromContext);
+ }
+
@Test
public void testSelectEJQBQL() throws Exception {
createTestDataSet();
@@ -423,4 +544,20 @@ public class DataContextFlattenedAttributesIT extends
ServerCase {
assertEquals("TX1", o3.getTextReview());
}
}
+
+ /**
+ * Guarantee initial structure of database via deletion all data inside
+ */
+ private void createTestDataWithDeletion() throws Exception {
+ tPaintingInfo.deleteAll();
+ tPainting.deleteAll();
+ tGallery.deleteAll();
+ tArtist.deleteAll();
+
+ long dateBase = System.currentTimeMillis();
+ tArtist.insert(1, "artist1", new java.sql.Date(dateBase + 1000 * 60 *
60 * 24));
+ tGallery.insert(1, "gallery1");
+ tPainting.insert(1, "painting1", 1, new BigDecimal("1000"), 1);
+ tPaintingInfo.insert(1, "painting review1");
+ }
}
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/access/VerticalInheritanceIT.java
b/cayenne-server/src/test/java/org/apache/cayenne/access/VerticalInheritanceIT.java
index 7bcbff3ea..645a3f68b 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/access/VerticalInheritanceIT.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/access/VerticalInheritanceIT.java
@@ -22,6 +22,7 @@ import org.apache.cayenne.Cayenne;
import org.apache.cayenne.ObjectContext;
import org.apache.cayenne.configuration.server.ServerRuntime;
import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.ColumnSelect;
import org.apache.cayenne.query.EJBQLQuery;
import org.apache.cayenne.query.ObjectSelect;
import org.apache.cayenne.query.SelectById;
@@ -262,14 +263,15 @@ public class VerticalInheritanceIT extends ServerCase {
ivRootTable.setColumns("ID", "NAME", "DISCRIMINATOR");
TableHelper ivSub1Table = new TableHelper(dbHelper, "IV_SUB1");
- ivSub1Table.setColumns("ID", "SUB1_NAME");
+ ivSub1Table.setColumns("ID", "SUB1_NAME", "SUB1_PRICE");
TableHelper ivSub1Sub1Table = new TableHelper(dbHelper,
"IV_SUB1_SUB1");
- ivSub1Sub1Table.setColumns("ID", "SUB1_SUB1_NAME");
+ ivSub1Sub1Table.setColumns("ID", "SUB1_SUB1_NAME",
"SUB1_SUB1_PRICE");
IvSub1Sub1 sub1Sub1 = context.newObject(IvSub1Sub1.class);
sub1Sub1.setName("XyZN");
sub1Sub1.setSub1Name("mDA");
+ sub1Sub1.setPrice(42.0);
sub1Sub1.setSub1Sub1Name("3DQa");
sub1Sub1.getObjectContext().commitChanges();
@@ -285,14 +287,16 @@ public class VerticalInheritanceIT extends ServerCase {
assertEquals("IvSub1Sub1", data[2]);
Object[] subdata = ivSub1Table.select();
- assertEquals(2, subdata.length);
+ assertEquals(3, subdata.length);
assertEquals(data[0], subdata[0]);
assertEquals("mDA", subdata[1]);
+ assertNull(subdata[2]);
Object[] subsubdata = ivSub1Sub1Table.select();
- assertEquals(2, subsubdata.length);
+ assertEquals(3, subsubdata.length);
assertEquals(data[0], subsubdata[0]);
assertEquals("3DQa", subsubdata[1]);
+ assertNull(subdata[2]);
}
@Test
@@ -748,4 +752,101 @@ public class VerticalInheritanceIT extends ServerCase {
assertTrue(Cayenne.intPKForObject(sub) > 0);
}
+
+ @Test
+ public void testColumnSelectVerticalInheritance_Sub1() throws
SQLException {
+ TableHelper ivRootTable = new TableHelper(dbHelper, "IV_ROOT");
+ ivRootTable.setColumns("ID", "NAME", "DISCRIMINATOR");
+
+ TableHelper ivSub1Table = new TableHelper(dbHelper, "IV_SUB1");
+ ivSub1Table.setColumns("ID", "SUB1_NAME", "SUB1_PRICE");
+
+ TableHelper ivSub1Sub1Table = new TableHelper(dbHelper,
"IV_SUB1_SUB1");
+ ivSub1Sub1Table.setColumns("ID", "SUB1_SUB1_NAME",
"SUB1_SUB1_PRICE");
+
+ IvSub1Sub1 sub1Sub1 = context.newObject(IvSub1Sub1.class);
+ sub1Sub1.setName("XyZN");
+ sub1Sub1.setSub1Name("mDA");
+ sub1Sub1.setPrice(42.0);
+ sub1Sub1.setSub1Sub1Name("3DQa");
+ sub1Sub1.getObjectContext().commitChanges();
+
+ assertEquals(1, ivRootTable.getRowCount());
+ assertEquals(1, ivSub1Table.getRowCount());
+ assertEquals(1, ivSub1Sub1Table.getRowCount());
+
+ Object[] data = ivRootTable.select();
+ assertEquals(3, data.length);
+ assertTrue(data[0] instanceof Number);
+ assertTrue(((Number) data[0]).intValue() > 0);
+ assertEquals("XyZN", data[1]);
+ assertEquals("IvSub1Sub1", data[2]);
+
+ Object[] subdata = ivSub1Table.select();
+ assertEquals(3, subdata.length);
+ assertEquals(data[0], subdata[0]);
+ assertEquals("mDA", subdata[1]);
+
+ Object[] subsubdata = ivSub1Sub1Table.select();
+ assertEquals(3, subsubdata.length);
+ assertEquals(data[0], subsubdata[0]);
+ assertEquals("3DQa", subsubdata[1]);
+
+ ColumnSelect<IvSub1> originalQueryForSub1 =
ObjectSelect.query(IvSub1.class)
+ .column(IvSub1.SELF);
+
+ IvSub1 result = originalQueryForSub1.selectOne(context);
+ assertEquals("XyZN", result.getName());
+ assertEquals(Double.valueOf(42.0), result.getPrice());
+ assertEquals("mDA", result.getSub1Name());
+ }
+
+ @Test
+ public void testColumnSelectVerticalInheritance_Sub1Sub1() throws
SQLException {
+ TableHelper ivRootTable = new TableHelper(dbHelper, "IV_ROOT");
+ ivRootTable.setColumns("ID", "NAME", "DISCRIMINATOR");
+
+ TableHelper ivSub1Table = new TableHelper(dbHelper, "IV_SUB1");
+ ivSub1Table.setColumns("ID", "SUB1_NAME", "SUB1_PRICE");
+
+ TableHelper ivSub1Sub1Table = new TableHelper(dbHelper,
"IV_SUB1_SUB1");
+ ivSub1Sub1Table.setColumns("ID", "SUB1_SUB1_NAME",
"SUB1_SUB1_PRICE");
+
+ IvSub1Sub1 sub1Sub1 = context.newObject(IvSub1Sub1.class);
+ sub1Sub1.setName("XyZN");
+ sub1Sub1.setSub1Name("mDA");
+ sub1Sub1.setPrice(42.0);
+ sub1Sub1.setSub1Sub1Name("3DQa");
+ sub1Sub1.getObjectContext().commitChanges();
+
+ assertEquals(1, ivRootTable.getRowCount());
+ assertEquals(1, ivSub1Table.getRowCount());
+ assertEquals(1, ivSub1Sub1Table.getRowCount());
+
+ Object[] data = ivRootTable.select();
+ assertEquals(3, data.length);
+ assertTrue(data[0] instanceof Number);
+ assertTrue(((Number) data[0]).intValue() > 0);
+ assertEquals("XyZN", data[1]);
+ assertEquals("IvSub1Sub1", data[2]);
+
+ Object[] subdata = ivSub1Table.select();
+ assertEquals(3, subdata.length);
+ assertEquals(data[0], subdata[0]);
+ assertEquals("mDA", subdata[1]);
+
+ Object[] subsubdata = ivSub1Sub1Table.select();
+ assertEquals(3, subsubdata.length);
+ assertEquals(data[0], subsubdata[0]);
+ assertEquals("3DQa", subsubdata[1]);
+
+ ColumnSelect<IvSub1Sub1> originalQueryForSub1Sub1 =
ObjectSelect.query(IvSub1Sub1.class)
+ .column(IvSub1Sub1.SELF);
+
+ IvSub1Sub1 result = originalQueryForSub1Sub1.selectOne(context);
+ assertEquals("XyZN", result.getName());
+ assertEquals(Double.valueOf(42.0), result.getPrice());
+ assertEquals("mDA", result.getSub1Name());
+ assertEquals("3DQa", result.getSub1Sub1Name());
+ }
}
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractorIT.java
b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractorIT.java
new file mode 100644
index 000000000..ff76c4c04
--- /dev/null
+++
b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractorIT.java
@@ -0,0 +1,83 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+package org.apache.cayenne.access.translator.select;
+
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.query.ObjectSelect;
+import org.apache.cayenne.reflect.ClassDescriptor;
+import org.apache.cayenne.testdo.testmap.CompoundPaintingLongNames;
+import org.apache.cayenne.unit.di.server.CayenneProjects;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+
+@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
+public class DescriptorColumnExtractorIT extends ServerCase {
+ @Inject
+ private ObjectContext context;
+
+ private final List<String> expectedFlattenedDbFields = List.of(
+ "toArtist.ARTIST_ID",
+ "toArtist.ARTIST_NAME",
+ "toGallery.GALLERY_ID",
+ "toGallery.GALLERY_NAME",
+ "toPaintingInfo.PAINTING_ID",
+ "toPaintingInfo.TEXT_REVIEW");
+
+ @Test
+ public void testEntityResultAddDbFieldsForFlattenedAttributes() {
+
+ EntityResolver resolver = context.getEntityResolver();
+ ClassDescriptor classDescriptor =
resolver.getClassDescriptor("CompoundPaintingLongNames");
+
+ TranslatorContext translatorContext = new TranslatorContext(
+ new
FluentSelectWrapper(ObjectSelect.query(CompoundPaintingLongNames.class)
+ .column(CompoundPaintingLongNames.SELF)),
+ Mockito.mock(DbAdapter.class),
+ resolver,
+ null);
+
+ DescriptorColumnExtractor descriptor = new
DescriptorColumnExtractor(translatorContext, classDescriptor);
+ descriptor.extract();
+
+ List<String> actualFlattenedDbFields =
translatorContext.getRootEntityResult()
+ .getDbFields(resolver)
+ .keySet()
+ .stream()
+ .filter(key -> key.startsWith("to"))
+ .sorted()
+ .collect(Collectors.toList());
+
+ assertEquals(expectedFlattenedDbFields.get(0),
actualFlattenedDbFields.get(0));
+ assertEquals(expectedFlattenedDbFields.get(1),
actualFlattenedDbFields.get(1));
+ assertEquals(expectedFlattenedDbFields.get(2),
actualFlattenedDbFields.get(2));
+ assertEquals(expectedFlattenedDbFields.get(3),
actualFlattenedDbFields.get(3));
+ assertEquals(expectedFlattenedDbFields.get(4),
actualFlattenedDbFields.get(4));
+ assertEquals(expectedFlattenedDbFields.get(5),
actualFlattenedDbFields.get(5));
+ }
+}
\ No newline at end of file
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/map/DefaultEntityResultSegmentTest.java
b/cayenne-server/src/test/java/org/apache/cayenne/map/DefaultEntityResultSegmentTest.java
new file mode 100644
index 000000000..317b63c71
--- /dev/null
+++
b/cayenne-server/src/test/java/org/apache/cayenne/map/DefaultEntityResultSegmentTest.java
@@ -0,0 +1,54 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+package org.apache.cayenne.map;
+
+import org.apache.cayenne.reflect.PersistentDescriptor;
+import org.junit.Test;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import static org.junit.Assert.assertEquals;
+
+public class DefaultEntityResultSegmentTest {
+ private final List<String> expectedColumnPath = List.of("key1", "key2");
+
+ private final Map<String, String> fields =
+ new ConcurrentHashMap<>(Map.of("key1", "value1", "key2",
"value2"));
+
+ private final DefaultEntityResultSegment resultSegment =
+ new DefaultEntityResultSegment(new PersistentDescriptor(), fields,
fields.size());
+
+ @Test
+ public void testGetColumnPath() {
+ List<String> actualColumnPath = fields.values()
+ .stream()
+ .map(resultSegment::getColumnPath)
+ .collect(Collectors.toList());
+
+ assertEquals(expectedColumnPath.size(), actualColumnPath.size());
+
+ IntStream.range(0, actualColumnPath.size())
+ .forEach(i -> assertEquals(expectedColumnPath.get(i),
actualColumnPath.get(i)));
+ }
+
+}
\ No newline at end of file
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java
index ca063539d..51f57bdbc 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Root.java
@@ -5,8 +5,10 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.cayenne.BaseDataObject;
+import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
+import org.apache.cayenne.testdo.inheritance_vertical.Iv1Root;
/**
* Class _Iv1Root was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.exp.property.StringProperty;
*/
public abstract class _Iv1Root extends BaseDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<Iv1Root> SELF =
PropertyFactory.createSelf(Iv1Root.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
index 18f538111..e63f47dae 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv1Sub1.java
@@ -4,9 +4,11 @@ import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
import org.apache.cayenne.testdo.inheritance_vertical.Iv1Root;
+import org.apache.cayenne.testdo.inheritance_vertical.Iv1Sub1;
/**
* Class _Iv1Sub1 was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.testdo.inheritance_vertical.Iv1Root;
*/
public abstract class _Iv1Sub1 extends Iv1Root {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<Iv1Sub1> SELF =
PropertyFactory.createSelf(Iv1Sub1.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java
index 97d5e0c10..349d7cba4 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Root.java
@@ -5,8 +5,10 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.cayenne.BaseDataObject;
+import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
+import org.apache.cayenne.testdo.inheritance_vertical.Iv2Root;
/**
* Class _Iv2Root was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.exp.property.StringProperty;
*/
public abstract class _Iv2Root extends BaseDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<Iv2Root> SELF =
PropertyFactory.createSelf(Iv2Root.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
index 7ad3f83ec..a8ec72e20 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2Sub1.java
@@ -7,6 +7,7 @@ import java.io.ObjectOutputStream;
import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.testdo.inheritance_vertical.Iv2Root;
+import org.apache.cayenne.testdo.inheritance_vertical.Iv2Sub1;
import org.apache.cayenne.testdo.inheritance_vertical.Iv2X;
/**
@@ -17,7 +18,9 @@ import org.apache.cayenne.testdo.inheritance_vertical.Iv2X;
*/
public abstract class _Iv2Sub1 extends Iv2Root {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<Iv2Sub1> SELF =
PropertyFactory.createSelf(Iv2Sub1.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2X.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2X.java
index c43ad20ab..f24176cf3 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2X.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_Iv2X.java
@@ -5,6 +5,9 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.cayenne.BaseDataObject;
+import org.apache.cayenne.exp.property.EntityProperty;
+import org.apache.cayenne.exp.property.PropertyFactory;
+import org.apache.cayenne.testdo.inheritance_vertical.Iv2X;
/**
* Class _Iv2X was generated by Cayenne.
@@ -14,7 +17,9 @@ import org.apache.cayenne.BaseDataObject;
*/
public abstract class _Iv2X extends BaseDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<Iv2X> SELF =
PropertyFactory.createSelf(Iv2X.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java
index b77509e77..d14cfa395 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvAbstract.java
@@ -5,8 +5,10 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.cayenne.BaseDataObject;
+import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
+import org.apache.cayenne.testdo.inheritance_vertical.IvAbstract;
/**
* Class _IvAbstract was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.exp.property.StringProperty;
*/
public abstract class _IvAbstract extends BaseDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<IvAbstract> SELF =
PropertyFactory.createSelf(IvAbstract.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java
index cd554f207..a8e850f56 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBase.java
@@ -5,8 +5,10 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.cayenne.BaseDataObject;
+import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
+import org.apache.cayenne.testdo.inheritance_vertical.IvBase;
/**
* Class _IvBase was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.exp.property.StringProperty;
*/
public abstract class _IvBase extends BaseDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<IvBase> SELF =
PropertyFactory.createSelf(IvBase.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java
index 601ccde21..052c73a35 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvBaseWithLock.java
@@ -5,8 +5,10 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.cayenne.BaseDataObject;
+import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
+import org.apache.cayenne.testdo.inheritance_vertical.IvBaseWithLock;
/**
* Class _IvBaseWithLock was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.exp.property.StringProperty;
*/
public abstract class _IvBaseWithLock extends BaseDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<IvBaseWithLock> SELF =
PropertyFactory.createSelf(IvBaseWithLock.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
index 6c479ed68..3f140a568 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvConcrete.java
@@ -20,7 +20,9 @@ import
org.apache.cayenne.testdo.inheritance_vertical.IvConcrete;
*/
public abstract class _IvConcrete extends IvAbstract {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<IvConcrete> SELF =
PropertyFactory.createSelf(IvConcrete.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeyRoot.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeyRoot.java
index c0c9a0d95..504287ea2 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeyRoot.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeyRoot.java
@@ -5,8 +5,10 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.cayenne.BaseDataObject;
+import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
+import org.apache.cayenne.testdo.inheritance_vertical.IvGenKeyRoot;
/**
* Class _IvGenKeyRoot was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.exp.property.StringProperty;
*/
public abstract class _IvGenKeyRoot extends BaseDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<IvGenKeyRoot> SELF =
PropertyFactory.createSelf(IvGenKeyRoot.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeySub.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeySub.java
index 62d534579..7326efe73 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeySub.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvGenKeySub.java
@@ -4,7 +4,10 @@ import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import org.apache.cayenne.exp.property.EntityProperty;
+import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.testdo.inheritance_vertical.IvGenKeyRoot;
+import org.apache.cayenne.testdo.inheritance_vertical.IvGenKeySub;
/**
* Class _IvGenKeySub was generated by Cayenne.
@@ -14,7 +17,9 @@ import
org.apache.cayenne.testdo.inheritance_vertical.IvGenKeyRoot;
*/
public abstract class _IvGenKeySub extends IvGenKeyRoot {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<IvGenKeySub> SELF =
PropertyFactory.createSelf(IvGenKeySub.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
index 86ab1abf4..da1ea5578 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImpl.java
@@ -8,6 +8,7 @@ import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
import org.apache.cayenne.testdo.inheritance_vertical.IvBase;
+import org.apache.cayenne.testdo.inheritance_vertical.IvImpl;
import org.apache.cayenne.testdo.inheritance_vertical.IvOther;
/**
@@ -18,7 +19,9 @@ import org.apache.cayenne.testdo.inheritance_vertical.IvOther;
*/
public abstract class _IvImpl extends IvBase {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<IvImpl> SELF =
PropertyFactory.createSelf(IvImpl.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
index 19e3e4e76..5eacdf279 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvImplWithLock.java
@@ -8,6 +8,7 @@ import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
import org.apache.cayenne.testdo.inheritance_vertical.IvBaseWithLock;
+import org.apache.cayenne.testdo.inheritance_vertical.IvImplWithLock;
import org.apache.cayenne.testdo.inheritance_vertical.IvOther;
/**
@@ -18,7 +19,9 @@ import org.apache.cayenne.testdo.inheritance_vertical.IvOther;
*/
public abstract class _IvImplWithLock extends IvBaseWithLock {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<IvImplWithLock> SELF =
PropertyFactory.createSelf(IvImplWithLock.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
index ae8c98b38..c2d0791b1 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvOther.java
@@ -6,11 +6,13 @@ import java.io.ObjectOutputStream;
import java.util.List;
import org.apache.cayenne.BaseDataObject;
+import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.ListProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
import org.apache.cayenne.testdo.inheritance_vertical.IvImpl;
import org.apache.cayenne.testdo.inheritance_vertical.IvImplWithLock;
+import org.apache.cayenne.testdo.inheritance_vertical.IvOther;
/**
* Class _IvOther was generated by Cayenne.
@@ -20,7 +22,9 @@ import
org.apache.cayenne.testdo.inheritance_vertical.IvImplWithLock;
*/
public abstract class _IvOther extends BaseDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<IvOther> SELF =
PropertyFactory.createSelf(IvOther.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java
index 78277c64e..fb101ac15 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvRoot.java
@@ -5,8 +5,10 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.cayenne.BaseDataObject;
+import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
+import org.apache.cayenne.testdo.inheritance_vertical.IvRoot;
/**
* Class _IvRoot was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.exp.property.StringProperty;
*/
public abstract class _IvRoot extends BaseDataObject {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<IvRoot> SELF =
PropertyFactory.createSelf(IvRoot.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
index 8fef82ea4..8d861755f 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1.java
@@ -4,9 +4,12 @@ import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import org.apache.cayenne.exp.property.EntityProperty;
+import org.apache.cayenne.exp.property.NumericProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
import org.apache.cayenne.testdo.inheritance_vertical.IvRoot;
+import org.apache.cayenne.testdo.inheritance_vertical.IvSub1;
/**
* Class _IvSub1 was generated by Cayenne.
@@ -16,15 +19,29 @@ import
org.apache.cayenne.testdo.inheritance_vertical.IvRoot;
*/
public abstract class _IvSub1 extends IvRoot {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<IvSub1> SELF =
PropertyFactory.createSelf(IvSub1.class);
public static final String ID_PK_COLUMN = "ID";
+ public static final NumericProperty<Double> PRICE =
PropertyFactory.createNumeric("price", Double.class);
public static final StringProperty<String> SUB1NAME =
PropertyFactory.createString("sub1Name", String.class);
+ protected Double price;
protected String sub1Name;
+ public void setPrice(Double price) {
+ beforePropertyWrite("price", this.price, price);
+ this.price = price;
+ }
+
+ public Double getPrice() {
+ beforePropertyRead("price");
+ return this.price;
+ }
+
public void setSub1Name(String sub1Name) {
beforePropertyWrite("sub1Name", this.sub1Name, sub1Name);
this.sub1Name = sub1Name;
@@ -42,6 +59,8 @@ public abstract class _IvSub1 extends IvRoot {
}
switch(propName) {
+ case "price":
+ return this.price;
case "sub1Name":
return this.sub1Name;
default:
@@ -56,6 +75,9 @@ public abstract class _IvSub1 extends IvRoot {
}
switch (propName) {
+ case "price":
+ this.price = (Double)val;
+ break;
case "sub1Name":
this.sub1Name = (String)val;
break;
@@ -75,12 +97,14 @@ public abstract class _IvSub1 extends IvRoot {
@Override
protected void writeState(ObjectOutputStream out) throws IOException {
super.writeState(out);
+ out.writeObject(this.price);
out.writeObject(this.sub1Name);
}
@Override
protected void readState(ObjectInputStream in) throws IOException,
ClassNotFoundException {
super.readState(in);
+ this.price = (Double)in.readObject();
this.sub1Name = (String)in.readObject();
}
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
index bf6a8b6a4..4a5c6a100 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub1Sub1.java
@@ -4,9 +4,11 @@ import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
import org.apache.cayenne.testdo.inheritance_vertical.IvSub1;
+import org.apache.cayenne.testdo.inheritance_vertical.IvSub1Sub1;
/**
* Class _IvSub1Sub1 was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.testdo.inheritance_vertical.IvSub1;
*/
public abstract class _IvSub1Sub1 extends IvSub1 {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<IvSub1Sub1> SELF =
PropertyFactory.createSelf(IvSub1Sub1.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
index 6b133b91a..2da2e503b 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub2.java
@@ -4,9 +4,11 @@ import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.exp.property.StringProperty;
import org.apache.cayenne.testdo.inheritance_vertical.IvRoot;
+import org.apache.cayenne.testdo.inheritance_vertical.IvSub2;
/**
* Class _IvSub2 was generated by Cayenne.
@@ -16,7 +18,9 @@ import org.apache.cayenne.testdo.inheritance_vertical.IvRoot;
*/
public abstract class _IvSub2 extends IvRoot {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<IvSub2> SELF =
PropertyFactory.createSelf(IvSub2.class);
public static final String ID_PK_COLUMN = "ID";
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
index 50fdb3053..6d1ba67dd 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/testdo/inheritance_vertical/auto/_IvSub3.java
@@ -7,6 +7,7 @@ import java.io.ObjectOutputStream;
import org.apache.cayenne.exp.property.EntityProperty;
import org.apache.cayenne.exp.property.PropertyFactory;
import org.apache.cayenne.testdo.inheritance_vertical.IvRoot;
+import org.apache.cayenne.testdo.inheritance_vertical.IvSub3;
/**
* Class _IvSub3 was generated by Cayenne.
@@ -16,7 +17,9 @@ import org.apache.cayenne.testdo.inheritance_vertical.IvRoot;
*/
public abstract class _IvSub3 extends IvRoot {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
+
+ public static final EntityProperty<IvSub3> SELF =
PropertyFactory.createSelf(IvSub3.class);
public static final String ID_PK_COLUMN = "ID";
diff --git a/cayenne-server/src/test/resources/inheritance-vertical.map.xml
b/cayenne-server/src/test/resources/inheritance-vertical.map.xml
index cbad1bccb..4cf9f46e9 100644
--- a/cayenne-server/src/test/resources/inheritance-vertical.map.xml
+++ b/cayenne-server/src/test/resources/inheritance-vertical.map.xml
@@ -76,10 +76,12 @@
<db-entity name="IV_SUB1">
<db-attribute name="ID" type="INTEGER" isPrimaryKey="true"
isMandatory="true"/>
<db-attribute name="SUB1_NAME" type="VARCHAR" length="100"/>
+ <db-attribute name="SUB1_PRICE" type="DOUBLE"/>
</db-entity>
<db-entity name="IV_SUB1_SUB1">
<db-attribute name="ID" type="INTEGER" isPrimaryKey="true"
isMandatory="true"/>
<db-attribute name="SUB1_SUB1_NAME" type="VARCHAR"
length="100"/>
+ <db-attribute name="SUB1_SUB1_PRICE" type="INTEGER"/>
</db-entity>
<db-entity name="IV_SUB2">
<db-attribute name="ID" type="INTEGER" isPrimaryKey="true"
isMandatory="true"/>
@@ -147,6 +149,7 @@
</obj-entity>
<obj-entity name="IvSub1" superEntityName="IvRoot"
className="org.apache.cayenne.testdo.inheritance_vertical.IvSub1">
<qualifier><![CDATA[discriminator = "IvSub1"]]></qualifier>
+ <obj-attribute name="price" type="java.lang.Double"
db-attribute-path="sub1.SUB1_PRICE"/>
<obj-attribute name="sub1Name" type="java.lang.String"
db-attribute-path="sub1.SUB1_NAME"/>
<attribute-override name="discrimiantor"
db-attribute-path="DISCRIMINATOR"/>
<attribute-override name="discriminator"
db-attribute-path="DISCRIMINATOR"/>
@@ -155,6 +158,7 @@
<obj-entity name="IvSub1Sub1" superEntityName="IvSub1"
className="org.apache.cayenne.testdo.inheritance_vertical.IvSub1Sub1">
<qualifier><![CDATA[discriminator = "IvSub1Sub1"]]></qualifier>
<obj-attribute name="sub1Sub1Name" type="java.lang.String"
db-attribute-path="sub1.sub1Sub1.SUB1_SUB1_NAME"/>
+ <attribute-override name="price"
db-attribute-path="sub1.sub1Sub1.SUB1_SUB1_PRICE"/>
<attribute-override name="sub1Name"
db-attribute-path="sub1.SUB1_NAME"/>
</obj-entity>
<obj-entity name="IvSub2" superEntityName="IvRoot"
className="org.apache.cayenne.testdo.inheritance_vertical.IvSub2">