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 6211a66f0 CAY-2552 ColumnQuery with flattened attributes bug
6211a66f0 is described below
commit 6211a66f0846e554bc272f4c8860a97eaa1fbbdc
Author: Nikita Timofeev <[email protected]>
AuthorDate: Fri Jan 27 14:29:41 2023 +0300
CAY-2552 ColumnQuery with flattened attributes bug
---
RELEASE-NOTES.txt | 1 +
.../select/DescriptorColumnExtractor.java | 17 ++-
.../access/DataContextFlattenedAttributesIT.java | 148 ++++++++++++++++++++-
.../cayenne/access/VerticalInheritanceIT.java | 110 ++++++++++++++-
.../select/DescriptorColumnExtractorIT.java | 86 ++++++++++++
.../map/DefaultEntityResultSegmentTest.java | 57 ++++++++
.../testdo/inheritance_vertical/auto/_Iv1Root.java | 2 +-
.../testdo/inheritance_vertical/auto/_Iv1Sub1.java | 2 +-
.../testdo/inheritance_vertical/auto/_Iv2Root.java | 2 +-
.../testdo/inheritance_vertical/auto/_Iv2Sub1.java | 2 +-
.../testdo/inheritance_vertical/auto/_Iv2X.java | 2 +-
.../inheritance_vertical/auto/_IvAbstract.java | 2 +-
.../testdo/inheritance_vertical/auto/_IvBase.java | 2 +-
.../inheritance_vertical/auto/_IvBaseWithLock.java | 2 +-
.../inheritance_vertical/auto/_IvConcrete.java | 2 +-
.../inheritance_vertical/auto/_IvGenKeyRoot.java | 2 +-
.../inheritance_vertical/auto/_IvGenKeySub.java | 2 +-
.../testdo/inheritance_vertical/auto/_IvImpl.java | 2 +-
.../inheritance_vertical/auto/_IvImplWithLock.java | 2 +-
.../testdo/inheritance_vertical/auto/_IvOther.java | 2 +-
.../testdo/inheritance_vertical/auto/_IvRoot.java | 2 +-
.../testdo/inheritance_vertical/auto/_IvSub1.java | 22 ++-
.../inheritance_vertical/auto/_IvSub1Sub1.java | 2 +-
.../testdo/inheritance_vertical/auto/_IvSub2.java | 2 +-
.../testdo/inheritance_vertical/auto/_IvSub3.java | 2 +-
.../test/resources/inheritance-vertical.map.xml | 4 +
26 files changed, 451 insertions(+), 30 deletions(-)
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index b8b33d185..530306011 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -15,6 +15,7 @@ Changes/New Features:
Bug Fixes:
+CAY-2552 ColumnQuery with flattened attributes bug
CAY-2783 DbEntity to ObjEntity synchronization should check mandatory flag for
primitive java types
CAY-2789 MalformedJsonException thrown when reading manually edited JSON data
in Postgres
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..494519c75 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) {
+ DbAttribute dbAttribute = result.getDbAttributes().get(i);
+ if(resultNodeDescriptor != null) {
resultNodeDescriptor.setJavaType(oa.getType());
- addEntityResultField(oa.getDbAttribute());
+ if (result.getDbAttributes().size() > 1) {
+ String dataRowKey = result.getAttributePaths().get(i) +
"." + dbAttribute.getName();
+ resultNodeDescriptor.setDataRowKey(dataRowKey);
+ addEntityResultField(dataRowKey);
+ } else {
+ addEntityResultField(dbAttribute);
+ }
}
}
@@ -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..8e04719a4 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,12 @@ 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.exp.property.PropertyFactory;
+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 +41,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 +66,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 +89,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 +206,115 @@ public class DataContextFlattenedAttributesIT extends
ServerCase {
assertNotNull(objects);
}
+ @Test
+ public void testColumnQueryWithFlattenedAttribute() throws Exception {
+ createTestDataSet();
+ ColumnSelect<Object[]> originalQuery =
ObjectSelect.query(CompoundPaintingLongNames.class)
+
.columns(PropertyFactory.createSelf(CompoundPaintingLongNames.class));
+
+ 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(PropertyFactory.createSelf(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 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 +545,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 4a83c8392..8aa1b7e94 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,8 @@ 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.exp.property.PropertyFactory;
+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 +264,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 +288,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
@@ -749,4 +754,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(PropertyFactory.createSelf(IvSub1.class));
+
+ 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(PropertyFactory.createSelf(IvSub1Sub1.class));
+
+ 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..33e5bef14
--- /dev/null
+++
b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractorIT.java
@@ -0,0 +1,86 @@
+/*****************************************************************
+ * 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.exp.property.PropertyFactory;
+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.Arrays;
+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 = Arrays.asList(
+ "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(PropertyFactory.createSelf(CompoundPaintingLongNames.class))),
+ 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..85f0e6dbc
--- /dev/null
+++
b/cayenne-server/src/test/java/org/apache/cayenne/map/DefaultEntityResultSegmentTest.java
@@ -0,0 +1,57 @@
+/*****************************************************************
+ * 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.Arrays;
+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 = Arrays.asList("key1",
"key2");
+
+ private final Map<String, String> fields = new ConcurrentHashMap<String,
String>() {{
+ put("key1", "value1");
+ put("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..0faf5348c 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
@@ -16,7 +16,7 @@ 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 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..d5ce067c0 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
@@ -16,7 +16,7 @@ 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 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..b5c626914 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
@@ -16,7 +16,7 @@ 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 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..aad06629f 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
@@ -17,7 +17,7 @@ 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 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..e2b523640 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
@@ -14,7 +14,7 @@ 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 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..48d19280c 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
@@ -16,7 +16,7 @@ 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 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..97c2e182f 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
@@ -16,7 +16,7 @@ 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 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..b68690887 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
@@ -16,7 +16,7 @@ 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 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..2f34f3ac0 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,7 @@ 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 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..349a2d611 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
@@ -16,7 +16,7 @@ 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 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..2aec4441d 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
@@ -14,7 +14,7 @@ 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 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..d81814ea6 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
@@ -18,7 +18,7 @@ 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 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..43c93a836 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
@@ -18,7 +18,7 @@ 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 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..075309868 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
@@ -20,7 +20,7 @@ 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 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..69060d318 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
@@ -16,7 +16,7 @@ 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 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..d432c0389 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,6 +4,7 @@ import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+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;
@@ -16,15 +17,27 @@ 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 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 +55,8 @@ public abstract class _IvSub1 extends IvRoot {
}
switch(propName) {
+ case "price":
+ return this.price;
case "sub1Name":
return this.sub1Name;
default:
@@ -56,6 +71,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 +93,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..5c0b3aeab 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
@@ -16,7 +16,7 @@ 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 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..856ca31d7 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
@@ -16,7 +16,7 @@ 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 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..dc872740a 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
@@ -16,7 +16,7 @@ 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 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 1a108ae0d..b7ed482d0 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">