Optimize refine statement implementations 75/90875/4
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 2 Jul 2020 14:47:40 +0000 (16:47 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 2 Jul 2020 22:31:55 +0000 (00:31 +0200)
refine is a simple statement, optimize the memory layout of its
implementation classes. Most of the benefits here are coming from
not needing to retain source/definition, but for simple refines
we can also skip a singleton list.

Also mark future direction for evolving the implementation contract,
as it has some aspects which are definitely not nice.

JIRA: YANGTOOLS-1065
Change-Id: Ic07ba74b0d2ea685a3ce8aed567a89125d04850e
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RefineEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RefineStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/AbstractRefineStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/RefineEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/RefineStatementImpl.java

index 08034770826f3e4637cb9cf0963dd808d908e604..14a8da0fcf488c0b1896c160003eb676b03ac7c1 100644 (file)
@@ -8,10 +8,15 @@
 package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 
 @Beta
 public interface RefineEffectiveStatement extends EffectiveStatement<Descendant, RefineStatement> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.REFINE;
+    }
 }
index 711789b966dbd767668d2ce2ce437aaff1524f0d..2297936292ec9c218665798209408e2a25864c52 100644 (file)
@@ -13,12 +13,19 @@ import java.util.Collection;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 
 public interface RefineStatement extends ConfigStatementAwareDeclaredStatement<Descendant>,
         DocumentedDeclaredStatement<Descendant>, IfFeatureAwareDeclaredStatement<Descendant>,
         MandatoryStatementAwareDeclaredStatement<Descendant>,
         MustStatementAwareDeclaredStatement<Descendant> {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.REFINE;
+    }
+
     default @NonNull String getTargetNode() {
         // FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here
         return verifyNotNull(rawArgument());
index 5bb975b16ab97ddf7cd6d4d09e712250c3078b21..8e774f760919902e038b4873899ba8318e511fca 100644 (file)
@@ -7,16 +7,20 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.refine;
 
+import com.google.common.collect.ImmutableList;
+import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RefineEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ArgumentUtils;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
 abstract class AbstractRefineStatementSupport
-        extends AbstractStatementSupport<Descendant, RefineStatement, RefineEffectiveStatement> {
+        extends BaseStatementSupport<Descendant, RefineStatement, RefineEffectiveStatement> {
 
     AbstractRefineStatementSupport() {
         super(YangStmtMapping.REFINE);
@@ -28,13 +32,30 @@ abstract class AbstractRefineStatementSupport
     }
 
     @Override
-    public final RefineStatement createDeclared(final StmtContext<Descendant, RefineStatement, ?> ctx) {
-        return new RefineStatementImpl(ctx);
+    protected final RefineStatement createDeclared(final StmtContext<Descendant, RefineStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new RefineStatementImpl(ctx, substatements);
     }
 
     @Override
-    public final RefineEffectiveStatement createEffective(
-            final StmtContext<Descendant, RefineStatement, RefineEffectiveStatement> ctx) {
-        return new RefineEffectiveStatementImpl(ctx);
+    protected final RefineStatement createEmptyDeclared(final StmtContext<Descendant, RefineStatement, ?> ctx) {
+        // Empty refine is exceedingly unlikely: let's be lazy and reuse the implementation
+        return new RefineStatementImpl(ctx, ImmutableList.of());
     }
-}
\ No newline at end of file
+
+    @Override
+    protected final RefineEffectiveStatement createEffective(
+            final StmtContext<Descendant, RefineStatement, RefineEffectiveStatement> ctx,
+            final RefineStatement declared, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new RefineEffectiveStatementImpl(declared, substatements, ctx.getSchemaPath().get(),
+            (SchemaNode) ctx.getEffectOfStatement().iterator().next().buildEffective());
+    }
+
+    @Override
+    protected final RefineEffectiveStatement createEmptyEffective(
+            final StmtContext<Descendant, RefineStatement, RefineEffectiveStatement> ctx,
+            final RefineStatement declared) {
+        // Empty refine is exceedingly unlikely: let's be lazy and reuse the implementation
+        return createEffective(ctx, declared, ImmutableList.of());
+    }
+}
index 9085350c4c625790d25735433ca9c149f1f19e04..a695518034341c4f4ce76dcdfa4d8b73a89417e9 100644 (file)
@@ -7,31 +7,36 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.refine;
 
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.Status;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RefineEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveDocumentedNodeWithStatus;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DocumentedNodeMixin;
 
 // FIXME: 6.0.0: hide this class
-public final class RefineEffectiveStatementImpl
-        extends AbstractEffectiveDocumentedNodeWithStatus<Descendant, RefineStatement>
-        implements RefineEffectiveStatement, SchemaNode {
-
-    private final @NonNull QName qname;
+// FIXME: 6.0.0: do not implement SchemaNode
+public final class RefineEffectiveStatementImpl extends WithSubstatements<Descendant, RefineStatement>
+        implements RefineEffectiveStatement, SchemaNode, DocumentedNodeMixin<Descendant, RefineStatement> {
     private final @NonNull SchemaPath path;
     private final SchemaNode refineTargetNode;
 
-    RefineEffectiveStatementImpl(final StmtContext<Descendant, RefineStatement, ?> ctx) {
-        super(ctx);
-        qname = Iterables.getLast(ctx.coerceStatementArgument().getNodeIdentifiers());
-        path = ctx.getSchemaPath().get();
-        refineTargetNode = (SchemaNode) ctx.getEffectOfStatement().iterator().next().buildEffective();
+    RefineEffectiveStatementImpl(final RefineStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final SchemaPath path,
+            final SchemaNode refineTargetNode) {
+        super(declared, substatements);
+        this.path = requireNonNull(path);
+        this.refineTargetNode = requireNonNull(refineTargetNode);
     }
 
     public SchemaNode getRefineTargetNode() {
@@ -39,8 +44,9 @@ public final class RefineEffectiveStatementImpl
     }
 
     @Override
+    @Deprecated
     public QName getQName() {
-        return qname;
+        return Iterables.getLast(argument().getNodeIdentifiers());
     }
 
     @Override
@@ -48,4 +54,9 @@ public final class RefineEffectiveStatementImpl
     public SchemaPath getPath() {
         return path;
     }
-}
\ No newline at end of file
+
+    @Override
+    public Status getStatus() {
+        return findFirstEffectiveSubstatementArgument(StatusEffectiveStatement.class).orElse(Status.CURRENT);
+    }
+}
index 1cd6c04489e2a082a75ebce8c627bd224f980703..99df0d4206db42b95670f37f1d05912625771b81 100644 (file)
@@ -7,13 +7,16 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.refine;
 
+import com.google.common.collect.ImmutableList;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithArgument.WithSubstatements;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-final class RefineStatementImpl extends AbstractDeclaredStatement<Descendant> implements RefineStatement {
-    RefineStatementImpl(final StmtContext<Descendant, RefineStatement, ?> context) {
-        super(context);
+final class RefineStatementImpl extends WithSubstatements<Descendant> implements RefineStatement {
+    RefineStatementImpl(final StmtContext<Descendant, ?, ?> context,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(context, substatements);
     }
 }