Add StatementContextBase.hasEmptySubstatements() 57/87357/14
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 2 Feb 2020 09:47:21 +0000 (10:47 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 3 Feb 2020 11:23:12 +0000 (12:23 +0100)
This is a performance optimization shortcut so that empty substatements
do not need to perform magic tricks for us.

JIRA: YANGTOOLS-652
Change-Id: Ibfca38418133d4dc670e1858154da10b24556009
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/AbstractResumedStatement.java
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/InferredStatementContext.java
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementContextBase.java

index cd438c5b11a1cc33acfc5876a38f9bde3263a438..48de7e3e63732428cb512eb83640e514765b04c0 100644 (file)
@@ -151,6 +151,11 @@ abstract class AbstractResumedStatement<A, D extends DeclaredStatement<A>, E ext
         return ret;
     }
 
+    @Override
+    final boolean hasEmptySubstatements() {
+        return substatements.size() == 0 && hasEmptyEffectiveSubstatements();
+    }
+
     /**
      * Lookup substatement by its offset in this statement.
      *
index 1f7594d430ee4139f7ec4c1b4dbe86af0fcf9b1a..6d3a50c7c02eaf2326d25a1329aca34380b6d0f1 100644 (file)
@@ -125,6 +125,11 @@ final class InferredStatementContext<A, D extends DeclaredStatement<A>, E extend
         return new InferredStatementContext<>(this, newParent);
     }
 
+    @Override
+    boolean hasEmptySubstatements() {
+        return hasEmptyEffectiveSubstatements();
+    }
+
     // Instantiate this statement's effective substatements. Note this method has side-effects in namespaces and overall
     // BuildGlobalContext, hence it must be called at most once.
     private List<Mutable<?, ?, ?>> createEffective() {
index 8ec1097155e6e2d18d60d90ee51c3fdfa4dc4426..a3f6ca286905459874d97b667fc8e1f9c31f4af0 100644 (file)
@@ -759,8 +759,7 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
         final CopyPolicy policy = support.applyCopyPolicy(this, parent, type, targetModule);
         switch (policy) {
             case CONTEXT_INDEPENDENT:
-                // FIXME: YANGTOOLS-652: we need isEmpty() here for performance reasons
-                if (allSubstatementsStream().findAny().isEmpty()) {
+                if (hasEmptySubstatements()) {
                     // This statement is context-independent and has no substatements -- hence it can be freely shared.
                     return Optional.of(this);
                 }
@@ -858,6 +857,17 @@ public abstract class StatementContextBase<A, D extends DeclaredStatement<A>, E
 
     abstract StatementContextBase<A, D, E> reparent(StatementContextBase<?, ?, ?> newParent);
 
+    /**
+     * Indicate that the set of substatements is empty. This is a preferred shortcut to substatement stream filtering.
+     *
+     * @return True if {@link #allSubstatements()} and {@link #allSubstatementsStream()} would return an empty stream.
+     */
+    abstract boolean hasEmptySubstatements();
+
+    final boolean hasEmptyEffectiveSubstatements() {
+        return effective.isEmpty();
+    }
+
     /**
      * Config statements are not all that common which means we are performing a recursive search towards the root
      * every time {@link #isConfiguration()} is invoked. This is quite expensive because it causes a linear search