diff --git a/src/main/java/net/helenus/core/AbstractUnitOfWork.java b/src/main/java/net/helenus/core/AbstractUnitOfWork.java index 32d7b60..abe1e8a 100644 --- a/src/main/java/net/helenus/core/AbstractUnitOfWork.java +++ b/src/main/java/net/helenus/core/AbstractUnitOfWork.java @@ -213,8 +213,10 @@ public abstract class AbstractUnitOfWork implements UnitOfW }); // log.record(txn::abort) // cache.invalidateSince(txn::start time) - elapsedTime_.stop(); - logTimers("aborted"); + if (!hasAborted()) { + elapsedTime_.stop(); + logTimers("aborted"); + } } private void mergeCache(Table from) { diff --git a/src/main/java/net/helenus/core/operation/AbstractOptionalOperation.java b/src/main/java/net/helenus/core/operation/AbstractOptionalOperation.java index ed5edfa..1a450b7 100644 --- a/src/main/java/net/helenus/core/operation/AbstractOptionalOperation.java +++ b/src/main/java/net/helenus/core/operation/AbstractOptionalOperation.java @@ -72,9 +72,9 @@ public abstract class AbstractOptionalOperation result = Optional.empty(); E cacheResult = null; - boolean updateCache = true; + boolean updateCache = isSessionCacheable(); - if (enableCache) { + if (enableCache && isSessionCacheable()) { List facets = bindFacetValues(); String tableName = CacheUtil.schemaName(facets); cacheResult = (E)sessionOps.checkCache(tableName, facets); @@ -95,7 +95,10 @@ public abstract class AbstractOptionalOperation facets = getFacets(); + if (facets != null && facets.size() > 1) { + sessionOps.updateCache(result.get(), facets); + } } return result; } finally { @@ -123,10 +126,12 @@ public abstract class AbstractOptionalOperation resultStream = null; E cacheResult = null; - boolean updateCache = true; + boolean updateCache = isSessionCacheable(); - if (enableCache) { + if (enableCache && isSessionCacheable()) { List facets = bindFacetValues(); String tableName = CacheUtil.schemaName(facets); cacheResult = (E) sessionOps.checkCache(tableName, facets); @@ -89,13 +89,15 @@ public abstract class AbstractStreamOperation again = new ArrayList<>(); List facets = getFacets(); - resultStream.forEach(result -> { - sessionOps.updateCache(result, facets); - again.add(result); - }); - resultStream = again.stream(); + if (facets != null && facets.size() > 1) { + List again = new ArrayList<>(); + resultStream.forEach(result -> { + sessionOps.updateCache(result, facets); + again.add(result); + }); + resultStream = again.stream(); + } } return resultStream; diff --git a/src/main/java/net/helenus/core/operation/BoundOperation.java b/src/main/java/net/helenus/core/operation/BoundOperation.java index 0c29913..4c71c7d 100644 --- a/src/main/java/net/helenus/core/operation/BoundOperation.java +++ b/src/main/java/net/helenus/core/operation/BoundOperation.java @@ -39,4 +39,7 @@ public final class BoundOperation extends AbstractOperation extends AbstractOptionalOperation extends AbstractStreamOperation { return null; } + public boolean isSessionCacheable() { return false; } + } diff --git a/src/main/java/net/helenus/core/operation/PreparedOperation.java b/src/main/java/net/helenus/core/operation/PreparedOperation.java index 950bc9a..43a56c2 100644 --- a/src/main/java/net/helenus/core/operation/PreparedOperation.java +++ b/src/main/java/net/helenus/core/operation/PreparedOperation.java @@ -43,4 +43,5 @@ public final class PreparedOperation { public String toString() { return preparedStatement.getQueryString(); } + } diff --git a/src/main/java/net/helenus/core/operation/SelectFirstOperation.java b/src/main/java/net/helenus/core/operation/SelectFirstOperation.java index 1419218..8f46c8e 100644 --- a/src/main/java/net/helenus/core/operation/SelectFirstOperation.java +++ b/src/main/java/net/helenus/core/operation/SelectFirstOperation.java @@ -59,4 +59,7 @@ public final class SelectFirstOperation extends AbstractFilterOptionalOperati public Optional transform(ResultSet resultSet) { return delegate.transform(resultSet).findFirst(); } + + @Override + public boolean isSessionCacheable() { return delegate.isSessionCacheable(); } } diff --git a/src/main/java/net/helenus/core/operation/SelectFirstTransformingOperation.java b/src/main/java/net/helenus/core/operation/SelectFirstTransformingOperation.java index 038324a..e878ac6 100644 --- a/src/main/java/net/helenus/core/operation/SelectFirstTransformingOperation.java +++ b/src/main/java/net/helenus/core/operation/SelectFirstTransformingOperation.java @@ -54,4 +54,7 @@ public final class SelectFirstTransformingOperation public Optional transform(ResultSet resultSet) { return delegate.transform(resultSet).findFirst().map(fn); } + + @Override + public boolean isSessionCacheable() { return delegate.isSessionCacheable(); } } diff --git a/src/main/java/net/helenus/core/operation/SelectOperation.java b/src/main/java/net/helenus/core/operation/SelectOperation.java index bb317cd..915cdbf 100644 --- a/src/main/java/net/helenus/core/operation/SelectOperation.java +++ b/src/main/java/net/helenus/core/operation/SelectOperation.java @@ -185,6 +185,9 @@ public final class SelectOperation extends AbstractFilterStreamOperation getFacets() { HelenusEntity entity = props.get(0).getEntity(); diff --git a/src/test/java/net/helenus/test/integration/core/simple/User.java b/src/test/java/net/helenus/test/integration/core/simple/User.java index bf3cd69..f2375e1 100644 --- a/src/test/java/net/helenus/test/integration/core/simple/User.java +++ b/src/test/java/net/helenus/test/integration/core/simple/User.java @@ -21,7 +21,6 @@ import net.helenus.mapping.annotation.PartitionKey; import net.helenus.mapping.annotation.Table; @Table("simple_users") -@Cacheable public interface User { @PartitionKey