diff --git a/src/main/java/net/helenus/core/AbstractUnitOfWork.java b/src/main/java/net/helenus/core/AbstractUnitOfWork.java index c3cc0fb..3025a73 100644 --- a/src/main/java/net/helenus/core/AbstractUnitOfWork.java +++ b/src/main/java/net/helenus/core/AbstractUnitOfWork.java @@ -245,18 +245,19 @@ public abstract class AbstractUnitOfWork Either> deletedObjectFacets = Either.right(facets); String tableName = CacheUtil.schemaName(facets); Optional optionalValue = cacheLookup(facets); + + for (Facet facet : facets) { + if (!facet.fixed()) { + String columnKey = facet.name() + "==" + facet.value(); + // mark the value identified by the facet to `deleted` + cache.put(tableName, columnKey, deletedObjectFacets); + } + } + + // Now, look for other row/col pairs that referenced the same object, mark them + // `deleted` if the cache had a value before we added the deleted marker objects. if (optionalValue.isPresent()) { Object value = optionalValue.get(); - - for (Facet facet : facets) { - if (!facet.fixed()) { - String columnKey = facet.name() + "==" + facet.value(); - // mark the value identified by the facet to `deleted` - cache.put(tableName, columnKey, deletedObjectFacets); - } - } - // look for other row/col pairs that referenced the same object, mark them - // `deleted` cache .columnKeySet() .forEach( @@ -326,13 +327,6 @@ public abstract class AbstractUnitOfWork } } - // log.record(txn::provisionalCommit) - // examine log for conflicts in read-set and write-set between begin and - // provisional commit - // if (conflict) { throw new ConflictingUnitOfWorkException(this) } - // else return function so as to enable commit.andThen(() -> { do something iff - // commit was successful; }) - if (canCommit) { committed = true; aborted = false; diff --git a/src/main/java/net/helenus/core/operation/AbstractOptionalOperation.java b/src/main/java/net/helenus/core/operation/AbstractOptionalOperation.java index 1292358..911383f 100644 --- a/src/main/java/net/helenus/core/operation/AbstractOptionalOperation.java +++ b/src/main/java/net/helenus/core/operation/AbstractOptionalOperation.java @@ -151,8 +151,8 @@ public abstract class AbstractOptionalOperation iface = MappingUtil.getMappingInterface(cachedResult); if (cachedResult != null) { + Class iface = MappingUtil.getMappingInterface(cachedResult); try { if (Drafted.class.isAssignableFrom(iface)) { result = Optional.of(cachedResult); diff --git a/src/main/java/net/helenus/core/operation/AbstractStreamOperation.java b/src/main/java/net/helenus/core/operation/AbstractStreamOperation.java index 609bbb5..f0dac94 100644 --- a/src/main/java/net/helenus/core/operation/AbstractStreamOperation.java +++ b/src/main/java/net/helenus/core/operation/AbstractStreamOperation.java @@ -157,8 +157,8 @@ public abstract class AbstractStreamOperation iface = MappingUtil.getMappingInterface(cachedResult); if (cachedResult != null) { + Class iface = MappingUtil.getMappingInterface(cachedResult); E result = null; try { if (Drafted.class.isAssignableFrom(iface)) { diff --git a/src/main/java/net/helenus/core/operation/UpdateOperation.java b/src/main/java/net/helenus/core/operation/UpdateOperation.java index caec7e2..c54880d 100644 --- a/src/main/java/net/helenus/core/operation/UpdateOperation.java +++ b/src/main/java/net/helenus/core/operation/UpdateOperation.java @@ -38,7 +38,6 @@ import net.helenus.support.HelenusException; import net.helenus.support.HelenusMappingException; import net.helenus.support.Immutables; - public final class UpdateOperation extends AbstractFilterOperation> { private final Map assignments = new HashMap<>(); @@ -787,13 +786,14 @@ public final class UpdateOperation extends AbstractFilterOperation extends AbstractFilterOperationupdate(s1.update()) - .and(supply::region, eq(region)) .prepend(supply::suppliers, "Pignose Supply, LLC.") .sync(); diff --git a/src/test/java/net/helenus/test/integration/core/unitofwork/UnitOfWorkTest.java b/src/test/java/net/helenus/test/integration/core/unitofwork/UnitOfWorkTest.java index 9ac2bdf..830732a 100644 --- a/src/test/java/net/helenus/test/integration/core/unitofwork/UnitOfWorkTest.java +++ b/src/test/java/net/helenus/test/integration/core/unitofwork/UnitOfWorkTest.java @@ -264,8 +264,13 @@ public class UnitOfWorkTest extends AbstractEmbeddedCassandraTest { Assert.assertEquals(w1, w2); // This should remove the object from the session cache. + session.update(w2).set(widget::name, "Bill").where(widget::id, eq(key)).sync(uow); w3 = - session.update(w2).set(widget::name, "Bill").where(widget::id, eq(key)).sync(uow); + session + .update(w2) + .set(widget::name, w1.name()) + .where(widget::id, eq(key)) + .sync(uow); // Fetch from session cache will cache miss (as it was updated) and trigger a SELECT. w4 = session.select(widget).where(widget::id, eq(key)).single().sync().orElse(null); @@ -284,7 +289,6 @@ public class UnitOfWorkTest extends AbstractEmbeddedCassandraTest { Assert.assertTrue(w5.equals(w2)); Assert.assertTrue(w2.equals(w5)); - Assert.assertEquals(w5.name(), "Bill"); uow.commit() .andThen(