diff --git a/teaql-core/src/main/java/io/teaql/core/ChangeSetStack.java b/teaql-core/src/main/java/io/teaql/core/ChangeSetStack.java index 4c424b9..f6c27c2 100644 --- a/teaql-core/src/main/java/io/teaql/core/ChangeSetStack.java +++ b/teaql-core/src/main/java/io/teaql/core/ChangeSetStack.java @@ -31,8 +31,10 @@ public EntityChangeSet pop() { public Object get(EntityKey key, String field) { for (int i = stack.size() - 1; i >= 0; i--) { - Object value = stack.get(i).get(key, field); - if (value != null) return value; + EntityChangeSet changeSet = stack.get(i); + if (changeSet.contains(key, field)) { + return changeSet.get(key, field); + } } return null; } diff --git a/teaql-core/src/main/java/io/teaql/core/EntityChangeSet.java b/teaql-core/src/main/java/io/teaql/core/EntityChangeSet.java index db34687..840f7d9 100644 --- a/teaql-core/src/main/java/io/teaql/core/EntityChangeSet.java +++ b/teaql-core/src/main/java/io/teaql/core/EntityChangeSet.java @@ -22,6 +22,11 @@ public Object get(EntityKey key, String field) { return record != null ? record.get(field) : null; } + boolean contains(EntityKey key, String field) { + Map record = changes.get(key); + return record != null && record.containsKey(field); + } + public Map> changes() { return Collections.unmodifiableMap(changes); } diff --git a/teaql-core/src/test/java/io/teaql/core/ChangeSetStackTest.java b/teaql-core/src/test/java/io/teaql/core/ChangeSetStackTest.java index 01b34b7..6ea91cd 100644 --- a/teaql-core/src/test/java/io/teaql/core/ChangeSetStackTest.java +++ b/teaql-core/src/test/java/io/teaql/core/ChangeSetStackTest.java @@ -48,6 +48,21 @@ public void topScopeShadowsLowerScopeAndPopRestoresIt() { assertEquals("CREATED", stack.get(ORDER, "status")); } + @Test + public void explicitNullInTopScopeShadowsLowerValue() { + ChangeSetStack stack = new ChangeSetStack(); + stack.set(ORDER, "status", "CREATED"); + stack.push(); + stack.set(ORDER, "status", null); + + assertNull(stack.get(ORDER, "status")); + + stack.pop(); + + assertEquals("CREATED", stack.get(ORDER, "status")); + assertNull(stack.get(ORDER, "missing")); + } + @Test public void clearCurrentClearsOnlyTopScope() { ChangeSetStack stack = new ChangeSetStack();