POC with bifunction

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/1ebb82ca
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/1ebb82ca
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/1ebb82ca

Branch: refs/heads/master
Commit: 1ebb82caa9f7948a7d9d890d3b40f95cef660901
Parents: 5cfe856
Author: Matthieu Baechler <[email protected]>
Authored: Tue Sep 27 20:45:34 2016 +0200
Committer: Benoit Tellier <[email protected]>
Committed: Thu Sep 29 12:51:00 2016 +0200

----------------------------------------------------------------------
 .../java/org/apache/james/util/ValuePatch.java  |  1 +
 .../vacation/CassandraVacationDAO.java          | 46 ++++++++++----------
 2 files changed, 25 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/1ebb82ca/server/container/util-java8/src/main/java/org/apache/james/util/ValuePatch.java
----------------------------------------------------------------------
diff --git 
a/server/container/util-java8/src/main/java/org/apache/james/util/ValuePatch.java
 
b/server/container/util-java8/src/main/java/org/apache/james/util/ValuePatch.java
index 5c3d01a..27a065f 100644
--- 
a/server/container/util-java8/src/main/java/org/apache/james/util/ValuePatch.java
+++ 
b/server/container/util-java8/src/main/java/org/apache/james/util/ValuePatch.java
@@ -22,6 +22,7 @@ package org.apache.james.util;
 import java.util.NoSuchElementException;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.function.BiFunction;
 import java.util.function.Function;
 
 import com.google.common.base.Preconditions;

http://git-wip-us.apache.org/repos/asf/james-project/blob/1ebb82ca/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/vacation/CassandraVacationDAO.java
----------------------------------------------------------------------
diff --git 
a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/vacation/CassandraVacationDAO.java
 
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/vacation/CassandraVacationDAO.java
index 6cecbcb..8394be1 100644
--- 
a/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/vacation/CassandraVacationDAO.java
+++ 
b/server/data/data-jmap-cassandra/src/main/java/org/apache/james/jmap/cassandra/vacation/CassandraVacationDAO.java
@@ -27,6 +27,7 @@ import static 
com.datastax.driver.core.querybuilder.QueryBuilder.select;
 import java.time.ZonedDateTime;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
+import java.util.function.BiFunction;
 import java.util.function.Function;
 
 import javax.inject.Inject;
@@ -39,7 +40,6 @@ import org.apache.james.jmap.api.vacation.AccountId;
 import org.apache.james.jmap.api.vacation.Vacation;
 import org.apache.james.jmap.api.vacation.VacationPatch;
 import org.apache.james.jmap.cassandra.vacation.tables.CassandraVacationTable;
-import org.apache.james.util.FunctionGenerator;
 import org.apache.james.util.ValuePatch;
 
 import com.datastax.driver.core.PreparedStatement;
@@ -55,7 +55,7 @@ public class CassandraVacationDAO {
     private final CassandraAsyncExecutor cassandraAsyncExecutor;
     private final PreparedStatement readStatement;
     private final UserType zonedDateTimeUserType;
-    private final FunctionGenerator<VacationPatch, Insert> 
insertGeneratorPipeline;
+    private final BiFunction<VacationPatch, Insert, Insert> 
insertGeneratorPipeline;
 
     @Inject
     public CassandraVacationDAO(Session session, CassandraTypesProvider 
cassandraTypesProvider) {
@@ -67,16 +67,16 @@ public class CassandraVacationDAO {
             .where(eq(CassandraVacationTable.ACCOUNT_ID,
                 bindMarker(CassandraVacationTable.ACCOUNT_ID))));
 
-        insertGeneratorPipeline = 
ImmutableList.<FunctionGenerator<VacationPatch, Insert>>of(
-            patch -> applyPatchForField(CassandraVacationTable.SUBJECT, 
patch.getSubject()),
-            patch -> applyPatchForField(CassandraVacationTable.HTML, 
patch.getHtmlBody()),
-            patch -> applyPatchForField(CassandraVacationTable.TEXT, 
patch.getTextBody()),
-            patch -> applyPatchForField(CassandraVacationTable.IS_ENABLED, 
patch.getIsEnabled()),
-            patch -> 
applyPatchForFieldZonedDateTime(CassandraVacationTable.FROM_DATE, 
patch.getFromDate()),
-            patch -> 
applyPatchForFieldZonedDateTime(CassandraVacationTable.TO_DATE, 
patch.getToDate()))
+        insertGeneratorPipeline = ImmutableList.of(
+            applyPatchForField(CassandraVacationTable.SUBJECT, 
VacationPatch::getSubject),
+            applyPatchForField(CassandraVacationTable.HTML, 
VacationPatch::getHtmlBody),
+            applyPatchForField(CassandraVacationTable.TEXT, 
VacationPatch::getTextBody),
+            applyPatchForField(CassandraVacationTable.IS_ENABLED, 
VacationPatch::getIsEnabled),
+            applyPatchForFieldZonedDateTime(CassandraVacationTable.FROM_DATE, 
VacationPatch::getFromDate),
+            applyPatchForFieldZonedDateTime(CassandraVacationTable.TO_DATE, 
VacationPatch::getToDate))
             .stream()
-            .reduce(FunctionGenerator::composeGeneratedFunctions)
-            .get();
+            .reduce((vacation, insert) -> insert, 
+                    (a, b) -> (vacation, insert) -> b.apply(vacation, 
a.apply(vacation, insert)));
     }
 
     public CompletableFuture<Void> modifyVacation(AccountId accountId, 
VacationPatch vacationPatch) {
@@ -108,23 +108,25 @@ public class CassandraVacationDAO {
     }
 
     private Insert createSpecificUpdate(VacationPatch vacationPatch, Insert 
baseInsert) {
-        return insertGeneratorPipeline
-            .apply(vacationPatch)
-            .apply(baseInsert);
+        return insertGeneratorPipeline.apply(vacationPatch, baseInsert);
     }
 
-    public <T> Function<Insert, Insert> applyPatchForField(String field, 
ValuePatch<T> valuePatch) {
-        return valuePatch.mapNotKeptToOptional(optionalValue -> 
applyPatchForField(field, optionalValue))
-            .orElse(Function.identity());
+    public <T> BiFunction<VacationPatch, Insert, Insert> 
applyPatchForField(String field, Function<VacationPatch, ValuePatch<T>> getter) 
{
+        return (vacation, insert) -> 
+            getter.apply(vacation)
+                .mapNotKeptToOptional(optionalValue -> 
applyPatchForField(field, optionalValue, insert))
+                .orElse(insert);
     }
 
-    public Function<Insert, Insert> applyPatchForFieldZonedDateTime(String 
field, ValuePatch<ZonedDateTime> valuePatch) {
-        return valuePatch.mapNotKeptToOptional(optionalValue -> 
applyPatchForField(field, convertToUDTOptional(optionalValue)))
-            .orElse(Function.identity());
+    public BiFunction<VacationPatch, Insert, Insert> 
applyPatchForFieldZonedDateTime(String field, Function<VacationPatch, 
ValuePatch<ZonedDateTime>> getter) {
+        return (vacation, insert) -> 
+            getter.apply(vacation)
+                .mapNotKeptToOptional(optionalValue -> 
applyPatchForField(field, convertToUDTOptional(optionalValue), insert))
+                .orElse(insert);
     }
 
-    private <T> Function<Insert, Insert> applyPatchForField(String field, 
Optional<T> value) {
-        return insert -> insert.value(field, value.orElse(null));
+    private <T> Insert applyPatchForField(String field, Optional<T> value, 
Insert insert) {
+        return insert.value(field, value.orElse(null));
     }
 
     private Optional<UDTValue> convertToUDTOptional(Optional<ZonedDateTime> 
zonedDateTimeOptional) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to