Return-Path: X-Original-To: apmail-jackrabbit-oak-commits-archive@minotaur.apache.org Delivered-To: apmail-jackrabbit-oak-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 69145D2C6 for ; Fri, 20 Jul 2012 22:26:26 +0000 (UTC) Received: (qmail 66621 invoked by uid 500); 20 Jul 2012 22:26:26 -0000 Delivered-To: apmail-jackrabbit-oak-commits-archive@jackrabbit.apache.org Received: (qmail 66589 invoked by uid 500); 20 Jul 2012 22:26:26 -0000 Mailing-List: contact oak-commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: oak-commits@jackrabbit.apache.org Delivered-To: mailing list oak-commits@jackrabbit.apache.org Received: (qmail 66576 invoked by uid 99); 20 Jul 2012 22:26:25 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 20 Jul 2012 22:26:25 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 20 Jul 2012 22:26:22 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 3946423888FD; Fri, 20 Jul 2012 22:26:02 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1363984 - in /jackrabbit/oak/trunk: oak-core/ oak-core/src/main/java/org/apache/jackrabbit/oak/core/ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/ oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/ oak-it/osgi/ ... Date: Fri, 20 Jul 2012 22:26:01 -0000 To: oak-commits@jackrabbit.apache.org From: jukka@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120720222602.3946423888FD@eris.apache.org> Author: jukka Date: Fri Jul 20 22:26:01 2012 New Revision: 1363984 URL: http://svn.apache.org/viewvc?rev=1363984&view=rev Log: OAK-175: MemoryNodeStateBuilder inefficient for large child node lists Reduce the amount of getNodeState() calls by making latest property information available directly from NodeStateBuilder. Use Guava instead of custom utility classes for generic iterables. Modified: jackrabbit/oak/trunk/oak-core/pom.xml jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStateBuilder.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateBuilder.java jackrabbit/oak/trunk/oak-it/osgi/src/test/java/org/apache/jackrabbit/oak/osgi/OSGiIT.java jackrabbit/oak/trunk/oak-it/osgi/test-bundles.xml Modified: jackrabbit/oak/trunk/oak-core/pom.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/pom.xml?rev=1363984&r1=1363983&r2=1363984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/pom.xml (original) +++ jackrabbit/oak/trunk/oak-core/pom.xml Fri Jul 20 22:26:01 2012 @@ -132,6 +132,11 @@ commons-collections 3.2.1 + + com.google.guava + guava + 12.0.1 + Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java?rev=1363984&r1=1363983&r2=1363984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java Fri Jul 20 22:26:01 2012 @@ -114,7 +114,7 @@ public class TreeImpl implements Tree, P @Override public PropertyState getProperty(String name) { - return getNodeState().getProperty(name); + return getNodeStateBuilder().getProperty(name); } @Override @@ -162,17 +162,17 @@ public class TreeImpl implements Tree, P @Override public boolean hasProperty(String name) { - return getNodeState().getProperty(name) != null; + return getProperty(name) != null; } @Override public long getPropertyCount() { - return getNodeState().getPropertyCount(); + return getNodeStateBuilder().getPropertyCount(); } @Override public Iterable getProperties() { - return getNodeState().getProperties(); + return getNodeStateBuilder().getProperties(); } @Override @@ -437,10 +437,6 @@ public class TreeImpl implements Tree, P } } - public void clear() { - children.clear(); - } - @Override public Iterator iterator() { return children.values().iterator(); Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStateBuilder.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStateBuilder.java?rev=1363984&r1=1363983&r2=1363984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStateBuilder.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStateBuilder.java Fri Jul 20 22:26:01 2012 @@ -21,10 +21,17 @@ import org.apache.jackrabbit.oak.api.Pro import org.apache.jackrabbit.oak.spi.state.NodeState; import org.apache.jackrabbit.oak.spi.state.NodeStateBuilder; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import com.google.common.collect.Iterables; + +import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; /** * Basic in-memory node state builder. @@ -121,6 +128,47 @@ public class MemoryNodeStateBuilder impl } @Override + public long getPropertyCount() { + long count = base.getPropertyCount(); + for (Map.Entry entry : properties.entrySet()) { + PropertyState before = base.getProperty(entry.getKey()); + PropertyState after = entry.getValue(); + if (before == null && after != null) { + count++; + } else if (before != null && after == null) { + count--; + } + } + return count; + } + + @Override + public Iterable getProperties() { + frozen = true; + final Set names = properties.keySet(); + Predicate predicate = new Predicate() { + @Override + public boolean apply(PropertyState input) { + return !names.contains(input.getName()); + } + }; + return Iterables.concat( + Iterables.filter(properties.values(), Predicates.notNull()), + Iterables.filter(base.getProperties(), predicate)); + } + + + @Override + public PropertyState getProperty(String name) { + PropertyState property = properties.get(name); + if (property != null || properties.containsKey(name)) { + return property; + } else { + return base.getProperty(name); + } + } + + @Override public void setProperty(String name, CoreValue value) { unfreeze(); properties.put(name, new SinglePropertyState(name, value)); Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateBuilder.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateBuilder.java?rev=1363984&r1=1363983&r2=1363984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateBuilder.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateBuilder.java Fri Jul 20 22:26:01 2012 @@ -21,6 +21,7 @@ import java.util.List; import javax.annotation.Nonnull; import org.apache.jackrabbit.oak.api.CoreValue; +import org.apache.jackrabbit.oak.api.PropertyState; /** * Builder interface for constructing new {@link NodeState node states}. @@ -51,6 +52,29 @@ public interface NodeStateBuilder { void removeNode(String name); /** + * Returns the current number of properties. + * + * @return number of properties + */ + long getPropertyCount(); + + /** + * Returns the current properties. + * + * @return current properties + */ + Iterable getProperties(); + + /** + * Returns the current state of the named property, or {@code null} + * if the property is not set. + * + * @param name property name + * @return property state + */ + PropertyState getProperty(String name); + + /** * Set a property. * * @param name property name Modified: jackrabbit/oak/trunk/oak-it/osgi/src/test/java/org/apache/jackrabbit/oak/osgi/OSGiIT.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-it/osgi/src/test/java/org/apache/jackrabbit/oak/osgi/OSGiIT.java?rev=1363984&r1=1363983&r2=1363984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-it/osgi/src/test/java/org/apache/jackrabbit/oak/osgi/OSGiIT.java (original) +++ jackrabbit/oak/trunk/oak-it/osgi/src/test/java/org/apache/jackrabbit/oak/osgi/OSGiIT.java Fri Jul 20 22:26:01 2012 @@ -50,6 +50,7 @@ public class OSGiIT { bundle(new File(base, "jcr.jar").toURI().toURL().toString()), bundle(new File(base, "commons-io.jar").toURI().toURL().toString()), bundle(new File(base, "commons-collections.jar").toURI().toURL().toString()), + bundle(new File(base, "guava.jar").toURI().toURL().toString()), bundle(new File(base, "jackrabbit-api.jar").toURI().toURL().toString()), bundle(new File(base, "jackrabbit-jcr-commons.jar").toURI().toURL().toString()), bundle(new File(base, "oak-commons.jar").toURI().toURL().toString()), Modified: jackrabbit/oak/trunk/oak-it/osgi/test-bundles.xml URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-it/osgi/test-bundles.xml?rev=1363984&r1=1363983&r2=1363984&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-it/osgi/test-bundles.xml (original) +++ jackrabbit/oak/trunk/oak-it/osgi/test-bundles.xml Fri Jul 20 22:26:01 2012 @@ -31,6 +31,7 @@ javax.jcr:jcr commons-io:commons-io commons-collections:commons-collections + com.google.guava:guava org.apache.jackrabbit:jackrabbit-api org.apache.jackrabbit:jackrabbit-jcr-commons org.apache.jackrabbit:oak-commons