From: Robert Varga Date: Thu, 2 Jul 2020 14:47:40 +0000 (+0200) Subject: Optimize refine statement implementations X-Git-Tag: v5.0.4~42 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=4d84e2993c09cfdf894ffe14b09b9f06ab7e4aa8;p=yangtools.git Optimize refine statement implementations 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 --- diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RefineEffectiveStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RefineEffectiveStatement.java index 0803477082..14a8da0fcf 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RefineEffectiveStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RefineEffectiveStatement.java @@ -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 { - + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.REFINE; + } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RefineStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RefineStatement.java index 711789b966..2297936292 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RefineStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RefineStatement.java @@ -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, DocumentedDeclaredStatement, IfFeatureAwareDeclaredStatement, MandatoryStatementAwareDeclaredStatement, MustStatementAwareDeclaredStatement { + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.REFINE; + } + default @NonNull String getTargetNode() { // FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here return verifyNotNull(rawArgument()); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/AbstractRefineStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/AbstractRefineStatementSupport.java index 5bb975b16a..8e774f7609 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/AbstractRefineStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/AbstractRefineStatementSupport.java @@ -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 { + extends BaseStatementSupport { AbstractRefineStatementSupport() { super(YangStmtMapping.REFINE); @@ -28,13 +32,30 @@ abstract class AbstractRefineStatementSupport } @Override - public final RefineStatement createDeclared(final StmtContext ctx) { - return new RefineStatementImpl(ctx); + protected final RefineStatement createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new RefineStatementImpl(ctx, substatements); } @Override - public final RefineEffectiveStatement createEffective( - final StmtContext ctx) { - return new RefineEffectiveStatementImpl(ctx); + protected final RefineStatement createEmptyDeclared(final StmtContext 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 ctx, + final RefineStatement declared, final ImmutableList> substatements) { + return new RefineEffectiveStatementImpl(declared, substatements, ctx.getSchemaPath().get(), + (SchemaNode) ctx.getEffectOfStatement().iterator().next().buildEffective()); + } + + @Override + protected final RefineEffectiveStatement createEmptyEffective( + final StmtContext ctx, + final RefineStatement declared) { + // Empty refine is exceedingly unlikely: let's be lazy and reuse the implementation + return createEffective(ctx, declared, ImmutableList.of()); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/RefineEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/RefineEffectiveStatementImpl.java index 9085350c4c..a695518034 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/RefineEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/RefineEffectiveStatementImpl.java @@ -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 - implements RefineEffectiveStatement, SchemaNode { - - private final @NonNull QName qname; +// FIXME: 6.0.0: do not implement SchemaNode +public final class RefineEffectiveStatementImpl extends WithSubstatements + implements RefineEffectiveStatement, SchemaNode, DocumentedNodeMixin { private final @NonNull SchemaPath path; private final SchemaNode refineTargetNode; - RefineEffectiveStatementImpl(final StmtContext 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> 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); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/RefineStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/RefineStatementImpl.java index 1cd6c04489..99df0d4206 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/RefineStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/refine/RefineStatementImpl.java @@ -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 implements RefineStatement { - RefineStatementImpl(final StmtContext context) { - super(context); +final class RefineStatementImpl extends WithSubstatements implements RefineStatement { + RefineStatementImpl(final StmtContext context, + final ImmutableList> substatements) { + super(context, substatements); } }