You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2019/08/26 12:50:57 UTC

[cayenne] 03/05: CAY-2527 API to map Object[] result to POJO - combine multiple mappers

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

commit d3856d212d7c050c4185ede7ad0e7add56923fd8
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Wed Aug 7 17:04:23 2019 +0300

    CAY-2527 API to map Object[] result to POJO
      - combine multiple mappers
---
 .../apache/cayenne/query/ColumnSelectMetadata.java |  7 +++++-
 .../apache/cayenne/query/SQLTemplateMetadata.java  |  6 ++++-
 .../org/apache/cayenne/query/ColumnSelectIT.java   | 26 ++++++++++++++++++++++
 3 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelectMetadata.java b/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelectMetadata.java
index 2ab406e..1222346 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelectMetadata.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelectMetadata.java
@@ -136,8 +136,13 @@ class ColumnSelectMetadata extends ObjectSelectMetadata {
 		this.suppressingDistinct = suppressingDistinct;
 	}
 
+	@SuppressWarnings("unchecked")
 	void setResultMapper(Function<?, ?> resultMapper) {
-		this.resultMapper = resultMapper;
+		if(this.resultMapper != null) {
+			this.resultMapper = this.resultMapper.andThen((Function)resultMapper);
+		} else {
+			this.resultMapper = resultMapper;
+		}
 	}
 
 	@Override
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java
index 6bd92ed..99910ca 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLTemplateMetadata.java
@@ -129,7 +129,11 @@ public class SQLTemplateMetadata extends BaseQueryMetadata {
 	}
 
 	void setResultMapper(Function<?,?> resultMapper) {
-		this.resultMapper = resultMapper;
+		if(this.resultMapper != null) {
+			this.resultMapper = this.resultMapper.andThen((Function)resultMapper);
+		} else {
+			this.resultMapper = resultMapper;
+		}
     }
 
 	@Override
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectIT.java
index 6ec41fb..5220e7b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/ColumnSelectIT.java
@@ -1178,6 +1178,25 @@ public class ColumnSelectIT extends ServerCase {
         assertNotNull(testPojo19.date);
     }
 
+    @Test
+    public void testDoubleMapToPojo() {
+        List<TestPojo2> result = ObjectSelect.query(Artist.class)
+                .columns(Artist.ARTIST_NAME, Artist.DATE_OF_BIRTH, Artist.ARTIST_NAME.trim().length())
+                .where(Artist.ARTIST_NAME.like("artist%"))
+                .orderBy(Artist.ARTIST_ID_PK_PROPERTY.asc())
+                .map(TestPojo::new)
+                .map(TestPojo2::new)
+                .select(context);
+        assertEquals(20, result.size());
+
+        TestPojo2 testPojo0 = result.get(0);
+        assertNotNull(testPojo0);
+        assertEquals("artist1", testPojo0.pojo.name);
+        assertNotNull(testPojo0.pojo.date);
+        assertEquals(7, testPojo0.pojo.length);
+
+    }
+
     static class TestPojo {
         String name;
         Date date;
@@ -1188,4 +1207,11 @@ public class ColumnSelectIT extends ServerCase {
             length = (Integer)data[2];
         }
     }
+
+    static class TestPojo2 {
+        TestPojo pojo;
+        TestPojo2(TestPojo pojo) {
+            this.pojo = pojo;
+        }
+    }
 }