You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2013/04/30 16:13:08 UTC
svn commit: r1477643 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory:
ModifiedNodeState.java MutableNodeState.java
Author: jukka
Date: Tue Apr 30 14:13:08 2013
New Revision: 1477643
URL: http://svn.apache.org/r1477643
Log:
OAK-781: Clarify / fix effects of MISSING_NODE as base state of NodeBuilder
Reduce the number of temporary ModifiedNodeState instances and NodeState maps we need
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ModifiedNodeState.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MutableNodeState.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ModifiedNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ModifiedNodeState.java?rev=1477643&r1=1477642&r2=1477643&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ModifiedNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ModifiedNodeState.java Tue Apr 30 14:13:08 2013
@@ -44,7 +44,6 @@ import org.apache.jackrabbit.oak.spi.sta
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
-import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
/**
@@ -108,15 +107,40 @@ public class ModifiedNodeState extends A
}
}
- static NodeState withNodes(
+ static long getChildNodeCount(
NodeState base, Map<String, ? extends NodeState> nodes) {
- if (nodes.isEmpty()) {
- return base;
- } else {
- return new ModifiedNodeState(base, ImmutableMap.<String, PropertyState>of(), nodes);
+ long count = 0;
+ if (base.exists()) {
+ count = base.getChildNodeCount();
+ for (Map.Entry<String, ? extends NodeState> entry
+ : nodes.entrySet()) {
+ if (base.getChildNode(entry.getKey()).exists()) {
+ count--;
+ }
+ if (entry.getValue() != null && entry.getValue().exists()) {
+ count++;
+ }
+ }
}
+ return count;
}
+ static Iterable<String> getChildNodeNames(
+ NodeState base, Map<String, ? extends NodeState> nodes,
+ boolean copy) {
+ if (!base.exists()) {
+ return emptyList();
+ } else if (nodes.isEmpty()) {
+ return base.getChildNodeNames(); // shortcut
+ } else {
+ if (copy) {
+ nodes = newHashMap(nodes);
+ }
+ return concat(
+ filter(base.getChildNodeNames(), not(in(nodes.keySet()))),
+ filterValues(nodes, notNull()).keySet());
+ }
+ }
static NodeState with(
NodeState base,
Map<String, PropertyState> properties,
@@ -225,21 +249,7 @@ public class ModifiedNodeState extends A
@Override
public long getChildNodeCount() {
- if (!exists()) {
- return 0;
- }
- long count = base.getChildNodeCount();
-
- for (Map.Entry<String, ? extends NodeState> entry : nodes.entrySet()) {
- if (base.getChildNode(entry.getKey()).exists()) {
- count--;
- }
- if (entry.getValue() != null && entry.getValue().exists()) {
- count++;
- }
- }
-
- return count;
+ return getChildNodeCount(base, nodes);
}
@Override
@@ -257,11 +267,7 @@ public class ModifiedNodeState extends A
@Override
public Iterable<String> getChildNodeNames() {
- if (!exists()) {
- return emptyList();
- } else {
- return super.getChildNodeNames();
- }
+ return getChildNodeNames(base, nodes, false);
}
@Override
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MutableNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MutableNodeState.java?rev=1477643&r1=1477642&r2=1477643&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MutableNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MutableNodeState.java Tue Apr 30 14:13:08 2013
@@ -24,7 +24,6 @@ import static com.google.common.collect.
import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.MISSING_NODE;
import static org.apache.jackrabbit.oak.plugins.memory.ModifiedNodeState.with;
-import static org.apache.jackrabbit.oak.plugins.memory.ModifiedNodeState.withNodes;
import java.util.Iterator;
import java.util.Map;
@@ -396,7 +395,7 @@ class MutableNodeState extends AbstractN
@Override
public long getChildNodeCount() {
assert base != null;
- return withNodes(base, nodes).getChildNodeCount();
+ return ModifiedNodeState.getChildNodeCount(base, nodes);
}
@Override
@@ -404,7 +403,14 @@ class MutableNodeState extends AbstractN
assert base != null;
checkNotNull(name);
// checkArgument(!name.isEmpty()); TODO: should be caught earlier
- return withNodes(base, nodes).hasChildNode(name);
+ NodeState child = nodes.get(name);
+ if (child != null) {
+ return child.exists();
+ } else if (nodes.containsKey(name)) {
+ return false;
+ } else {
+ return base.hasChildNode(name);
+ }
}
@Override
@@ -415,8 +421,7 @@ class MutableNodeState extends AbstractN
@Override @Nonnull
public Iterable<String> getChildNodeNames() {
assert base != null;
- Map<String, MutableNodeState> copy = newHashMap(nodes);
- return withNodes(base, copy).getChildNodeNames();
+ return ModifiedNodeState.getChildNodeNames(base, nodes, true);
}
@Override @Nonnull