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 re...@apache.org on 2025/11/26 15:04:48 UTC
(jackrabbit-oak) 01/01: OAK-11731: expose NodeCounter (getEstimatedChildNodeCounts) in JackrabbitNode (wip)
This is an automated email from the ASF dual-hosted git repository.
reschke pushed a commit to branch OAK-11731
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
commit ce261e917bd714b391ad3771e96b84d1e65d168b
Author: Julian Reschke <re...@apache.org>
AuthorDate: Wed Nov 26 16:04:24 2025 +0100
OAK-11731: expose NodeCounter (getEstimatedChildNodeCounts) in JackrabbitNode (wip)
---
.../src/main/java/org/apache/jackrabbit/api/JackrabbitNode.java | 4 ++++
.../src/main/java/org/apache/jackrabbit/api/package-info.java | 2 +-
.../java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java | 5 +++++
.../org/apache/jackrabbit/oak/jcr/session/SessionContext.java | 9 +++++++++
.../java/org/apache/jackrabbit/oak/jcr/JackrabbitNodeTest.java | 8 +++++++-
5 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/JackrabbitNode.java b/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/JackrabbitNode.java
index c5669fb102..afc2d0d19a 100644
--- a/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/JackrabbitNode.java
+++ b/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/JackrabbitNode.java
@@ -103,4 +103,8 @@ public interface JackrabbitNode extends Node {
return null;
}
}
+
+ default long getEstimatedChildNodes() throws RepositoryException {
+ return -1;
+ }
}
diff --git a/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/package-info.java b/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/package-info.java
index 0994258e1b..811b8cf240 100644
--- a/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/package-info.java
+++ b/oak-jackrabbit-api/src/main/java/org/apache/jackrabbit/api/package-info.java
@@ -18,6 +18,6 @@
/**
* Jackrabbit extensions for JCR core interfaces
*/
-@org.osgi.annotation.versioning.Version("2.11.0")
+@org.osgi.annotation.versioning.Version("2.12.0")
package org.apache.jackrabbit.api;
diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
index 73c7a39f10..72cace8b09 100644
--- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
+++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
@@ -1695,6 +1695,11 @@ public class NodeImpl<T extends NodeDelegate> extends ItemImpl<T> implements Jac
});
}
+ @Override
+ public long getEstimatedChildNodes() throws RepositoryException {
+ return sessionContext.getNodeCounterMBean().getEstimatedNodeCount(dlg.getPath());
+ }
+
/**
* Provide current node path. Should be invoked from within
* the SessionDelegate#perform and preferred instead of getPath
diff --git a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
index ebc3781783..4ecbbe0f8c 100644
--- a/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
+++ b/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
@@ -53,6 +53,7 @@ import org.apache.jackrabbit.oak.jcr.security.AccessManager;
import org.apache.jackrabbit.oak.jcr.session.operation.SessionOperation;
import org.apache.jackrabbit.oak.namepath.NamePathMapper;
import org.apache.jackrabbit.oak.namepath.impl.NamePathMapperImpl;
+import org.apache.jackrabbit.oak.plugins.index.counter.jmx.NodeCounterMBean;
import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager;
import org.apache.jackrabbit.oak.plugins.observation.CommitRateLimiter;
import org.apache.jackrabbit.oak.plugins.value.jcr.ValueFactoryImpl;
@@ -65,6 +66,7 @@ import org.apache.jackrabbit.oak.spi.security.principal.PrincipalConfiguration;
import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConfiguration;
import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
+import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils;
import org.apache.jackrabbit.oak.spi.xml.ProtectedItemImporter;
import org.apache.jackrabbit.oak.stats.CounterStats;
import org.apache.jackrabbit.oak.stats.MeterStats;
@@ -108,6 +110,7 @@ public class SessionContext implements NamePathMapper {
private PrivilegeManager privilegeManager;
private ObservationManagerImpl observationManager;
private BlobAccessProvider blobAccessProvider;
+ private NodeCounterMBean nodeCounterMBean;
/** Paths (tokens) of all open scoped locks held by this session. */
private final Set<String> openScopedLocks = new TreeSet<>();
@@ -152,6 +155,7 @@ public class SessionContext implements NamePathMapper {
this.valueFactory = new ValueFactoryImpl(
delegate.getRoot(), namePathMapper, this.blobAccessProvider);
this.sessionQuerySettings = sessionQuerySettings;
+ this.nodeCounterMBean = WhiteboardUtils.getService(whiteboard, NodeCounterMBean.class);
}
public final Map<String, Object> getAttributes() {
@@ -333,6 +337,11 @@ public class SessionContext implements NamePathMapper {
return mountInfoProvider;
}
+ @Nullable
+ public NodeCounterMBean getNodeCounterMBean() {
+ return nodeCounterMBean;
+ }
+
//-----------------------------------------------------< NamePathMapper >---
@Override
diff --git a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/JackrabbitNodeTest.java b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/JackrabbitNodeTest.java
index 6510a3daf8..5dc1ba252d 100644
--- a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/JackrabbitNodeTest.java
+++ b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/JackrabbitNodeTest.java
@@ -323,7 +323,13 @@ public class JackrabbitNodeTest extends AbstractJCRTest {
assertNotNull(jn.getNodeOrNull("a"));
assertNotNull(jn.getNodeOrNull("a/aa"));
}
-
+
+ public void testEstimated() throws Exception {
+ // needs a proper test scenario
+ JackrabbitNode jn = (JackrabbitNode) testRootNode;
+ assertTrue(-2 < jn.getEstimatedChildNodes());
+ }
+
public void testGetPropertyOrNull() throws Exception {
JackrabbitNode jn = (JackrabbitNode) testRootNode;
Node aa = jn.addNode("a/aa", NodeTypeConstants.NT_OAK_UNSTRUCTURED);