From 18cfc85f452e0d364f93962349bee09bbbcf4791 Mon Sep 17 00:00:00 2001 From: Greg Burd Date: Wed, 2 Aug 2017 11:35:11 -0400 Subject: [PATCH] Move logic that filters out unset columns from INSERT statements into InsertOperations because we need to use the proxy implementation's ability to fetch default type-specific values in other places. This change also enables concrete implementations of mapped interfaces to implement MapExportable and use the same method to filter unset values. --- helenus-core.iml | 2 ++ pom.xml | 2 +- .../operation/AbstractStatementOperation.java | 1 + .../core/operation/InsertOperation.java | 36 +++++++++++++------ .../core/reflect/MapperInvocationHandler.java | 2 +- .../core/compound/CompondKeyTest.java | 4 +-- 6 files changed, 31 insertions(+), 16 deletions(-) diff --git a/helenus-core.iml b/helenus-core.iml index 42b1cc5..77f2a38 100644 --- a/helenus-core.iml +++ b/helenus-core.iml @@ -11,6 +11,8 @@ + + diff --git a/pom.xml b/pom.xml index fec721c..89abb41 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 net.helenus helenus-core - 2.0.4-SNAPSHOT + 2.0.5-SNAPSHOT jar helenus diff --git a/src/main/java/net/helenus/core/operation/AbstractStatementOperation.java b/src/main/java/net/helenus/core/operation/AbstractStatementOperation.java index c360705..c15b372 100644 --- a/src/main/java/net/helenus/core/operation/AbstractStatementOperation.java +++ b/src/main/java/net/helenus/core/operation/AbstractStatementOperation.java @@ -193,6 +193,7 @@ public abstract class AbstractStatementOperation keys = (pojo instanceof MapExportable) ? ((MapExportable)pojo).toMap().keySet() : null; + Collection properties = entity.getOrderedProperties(); - for (HelenusProperty prop : entity.getOrderedProperties()) { + for (HelenusProperty prop : properties) { - Object value = BeanColumnValueProvider.INSTANCE.getColumnValue(pojo, -1, prop); - value = sessionOps.getValuePreparer().prepareColumnValue(value, prop); + // Skip properties that are not in the map of the pojo we're storing. This creates a path + // for entity instances to be {in,up}serted without including all columns in the INSERT statement. + if (keys == null || keys.contains(prop.getPropertyName())) { - if (value != null) { - HelenusPropertyNode node = new HelenusPropertyNode(prop, Optional.empty()); - values.add(Fun.Tuple2.of(node, value)); - } + Object value = BeanColumnValueProvider.INSTANCE.getColumnValue(pojo, -1, prop); + value = sessionOps.getValuePreparer().prepareColumnValue(value, prop); + + if (value != null) { + HelenusPropertyNode node = new HelenusPropertyNode(prop, Optional.empty()); + values.add(Fun.Tuple2.of(node, value)); + } + + } } @@ -102,6 +113,9 @@ public final class InsertOperation extends AbstractOperation addPropertyNode(t._1)); + if (values.isEmpty()) + return null; + if (entity == null) { throw new HelenusMappingException("unknown entity"); } diff --git a/src/main/java/net/helenus/core/reflect/MapperInvocationHandler.java b/src/main/java/net/helenus/core/reflect/MapperInvocationHandler.java index c244666..99b3fd6 100644 --- a/src/main/java/net/helenus/core/reflect/MapperInvocationHandler.java +++ b/src/main/java/net/helenus/core/reflect/MapperInvocationHandler.java @@ -88,7 +88,7 @@ public class MapperInvocationHandler implements InvocationHandler { Object value = src.get(methodName); - if (value == null && src.containsKey(methodName)) { + if (value == null) { Class returnType = method.getReturnType(); diff --git a/src/test/java/net/helenus/test/integration/core/compound/CompondKeyTest.java b/src/test/java/net/helenus/test/integration/core/compound/CompondKeyTest.java index bc448dc..3241cc6 100644 --- a/src/test/java/net/helenus/test/integration/core/compound/CompondKeyTest.java +++ b/src/test/java/net/helenus/test/integration/core/compound/CompondKeyTest.java @@ -54,9 +54,7 @@ public class CompondKeyTest extends AbstractEmbeddedCassandraTest { public String text() { return text; } - - - + } @Before