From 176bef709d3032333975890962caa01e952148fe Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 2 Jul 2020 17:21:06 +0200 Subject: [PATCH] Optimize deviate statement implementations deviate is a simple statement, optimize the memory layout of its implementation classes. JIRA: YANGTOOLS-1065 Change-Id: Ibffb49bca02952f685250d9b5a6a2cdf56966a7d Signed-off-by: Robert Varga --- .../api/stmt/DeviateEffectiveStatement.java | 7 +- .../yang/model/api/stmt/DeviateStatement.java | 7 ++ .../AbstractDeviateStatementSupport.java | 44 +++++++---- .../DeviateEffectiveStatementImpl.java | 73 +++++++------------ .../stmt/deviate/DeviateStatementImpl.java | 11 ++- 5 files changed, 77 insertions(+), 65 deletions(-) diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviateEffectiveStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviateEffectiveStatement.java index 97d23522be..7c9796e92a 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviateEffectiveStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviateEffectiveStatement.java @@ -9,9 +9,14 @@ package org.opendaylight.yangtools.yang.model.api.stmt; import com.google.common.annotations.Beta; import org.opendaylight.yangtools.yang.model.api.DeviateKind; +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; @Beta public interface DeviateEffectiveStatement extends EffectiveStatement { - + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.DEVIATE; + } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviateStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviateStatement.java index 1379fd635d..719eabbc5d 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviateStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviateStatement.java @@ -11,9 +11,16 @@ import static com.google.common.base.Verify.verifyNotNull; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.model.api.DeviateKind; +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.StatementDefinition; public interface DeviateStatement extends DeclaredStatement { + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.DEVIATE; + } + default @NonNull DeviateKind getValue() { // FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here return verifyNotNull(argument()); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/AbstractDeviateStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/AbstractDeviateStatementSupport.java index f9d85c5b1b..a809ad5a6e 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/AbstractDeviateStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/AbstractDeviateStatementSupport.java @@ -7,6 +7,7 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviate; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; @@ -21,6 +22,7 @@ import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.common.YangVersion; import org.opendaylight.yangtools.yang.model.api.DeviateKind; 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.meta.StatementDefinition; import org.opendaylight.yangtools.yang.model.api.stmt.DeviateEffectiveStatement; @@ -28,7 +30,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace; import org.opendaylight.yangtools.yang.parser.rfc7950.reactor.YangValidationBundles; -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.CopyType; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder; @@ -49,7 +51,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; abstract class AbstractDeviateStatementSupport - extends AbstractStatementSupport { + extends BaseStatementSupport { private static final Logger LOG = LoggerFactory.getLogger(AbstractDeviateStatementSupport.class); private static final SubstatementValidator DEVIATE_NOT_SUPPORTED_SUBSTATEMENT_VALIDATOR = @@ -106,17 +108,6 @@ abstract class AbstractDeviateStatementSupport ctx.getStatementSourceReference(), "String '%s' is not valid deviate argument", value); } - @Override - public final DeviateStatement createDeclared(final StmtContext ctx) { - return new DeviateStatementImpl(ctx); - } - - @Override - public final DeviateEffectiveStatement createEffective( - final StmtContext ctx) { - return new DeviateEffectiveStatementImpl(ctx); - } - @Override public final void onFullDefinitionDeclared( final Mutable deviateStmtCtx) { @@ -196,6 +187,33 @@ abstract class AbstractDeviateStatementSupport return null; } + @Override + protected final DeviateStatement createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new DeviateStatementImpl(ctx, substatements); + } + + @Override + protected final DeviateStatement createEmptyDeclared(final StmtContext ctx) { + // This is exceedingly unlikely, just reuse the implementation + return createDeclared(ctx, ImmutableList.of()); + } + + @Override + protected final DeviateEffectiveStatement createEffective( + final StmtContext ctx, + final DeviateStatement declared, final ImmutableList> substatements) { + return new DeviateEffectiveStatementImpl(declared, substatements); + } + + @Override + protected final DeviateEffectiveStatement createEmptyEffective( + final StmtContext ctx, + final DeviateStatement declared) { + // This is exceedingly unlikely, just reuse the implementation + return createEffective(ctx, declared, ImmutableList.of()); + } + protected SubstatementValidator getSubstatementValidatorForDeviate(final DeviateKind deviateKind) { switch (deviateKind) { case NOT_SUPPORTED: diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/DeviateEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/DeviateEffectiveStatementImpl.java index b5c378dacb..3f08767e80 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/DeviateEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/DeviateEffectiveStatementImpl.java @@ -7,16 +7,15 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviate; +import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; import java.util.Collection; -import java.util.Set; -import org.opendaylight.yangtools.util.OptionalBoolean; import org.opendaylight.yangtools.yang.model.api.DeviateDefinition; import org.opendaylight.yangtools.yang.model.api.DeviateKind; import org.opendaylight.yangtools.yang.model.api.MustDefinition; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; import org.opendaylight.yangtools.yang.model.api.UniqueConstraint; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ConfigEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DefaultEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DeviateEffectiveStatement; @@ -26,41 +25,13 @@ import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsEffectiveStatem import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UnitsEffectiveStatement; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements; -final class DeviateEffectiveStatementImpl extends DeclaredEffectiveStatementBase +final class DeviateEffectiveStatementImpl extends WithSubstatements implements DeviateDefinition, DeviateEffectiveStatement { - - private final String deviatedDefault; - private final Integer deviatedMaxElements; - private final Integer deviatedMinElements; - private final ImmutableSet deviatedMustDefinitions; - private final TypeDefinition deviatedType; - private final ImmutableList deviatedUniqueConstraints; - private final String deviatedUnits; - - private final byte deviatedConfig; - private final byte deviatedMandatory; - - DeviateEffectiveStatementImpl(final StmtContext ctx) { - super(ctx); - - deviatedConfig = OptionalBoolean.ofNullable(findFirstEffectiveSubstatementArgument( - ConfigEffectiveStatement.class).orElse(null)); - deviatedMandatory = OptionalBoolean.ofNullable(findFirstEffectiveSubstatementArgument( - MandatoryEffectiveStatement.class).orElse(null)); - deviatedDefault = findFirstEffectiveSubstatementArgument(DefaultEffectiveStatement.class).orElse(null); - deviatedMaxElements = findFirstEffectiveSubstatementArgument(MaxElementsEffectiveStatement.class) - // FIXME: this does not handle 'unbounded' - .map(Integer::valueOf).orElse(null); - deviatedMinElements = findFirstEffectiveSubstatementArgument(MinElementsEffectiveStatement.class).orElse(null); - deviatedType = findFirstEffectiveSubstatement(TypeEffectiveStatement.class) - .map(TypeEffectiveStatement::getTypeDefinition).orElse(null); - deviatedUnits = findFirstEffectiveSubstatementArgument(UnitsEffectiveStatement.class).orElse(null); - - deviatedMustDefinitions = ImmutableSet.copyOf(allSubstatementsOfType(MustDefinition.class)); - deviatedUniqueConstraints = ImmutableList.copyOf(allSubstatementsOfType(UniqueConstraint.class)); + DeviateEffectiveStatementImpl(final DeviateStatement declared, + final ImmutableList> substatements) { + super(declared, substatements); } @Override @@ -70,46 +41,54 @@ final class DeviateEffectiveStatementImpl extends DeclaredEffectiveStatementBase @Override public Boolean getDeviatedConfig() { - return OptionalBoolean.toNullable(deviatedConfig); + return findFirstEffectiveSubstatementArgument(ConfigEffectiveStatement.class).orElse(null); } @Override public String getDeviatedDefault() { - return deviatedDefault; + return findFirstEffectiveSubstatementArgument(DefaultEffectiveStatement.class).orElse(null); } @Override public Boolean getDeviatedMandatory() { - return OptionalBoolean.toNullable(deviatedMandatory); + return findFirstEffectiveSubstatementArgument(MandatoryEffectiveStatement.class).orElse(null); } @Override public Integer getDeviatedMaxElements() { - return deviatedMaxElements; + return findFirstEffectiveSubstatementArgument(MaxElementsEffectiveStatement.class) + // FIXME: this does not handle 'unbounded' + .map(Integer::valueOf).orElse(null); } @Override public Integer getDeviatedMinElements() { - return deviatedMinElements; + return findFirstEffectiveSubstatementArgument(MinElementsEffectiveStatement.class).orElse(null); } @Override - public Set getDeviatedMusts() { - return deviatedMustDefinitions; + public Collection getDeviatedMusts() { + return allSubstatementsOfType(MustDefinition.class); } @Override public TypeDefinition getDeviatedType() { - return deviatedType; + return findFirstEffectiveSubstatement(TypeEffectiveStatement.class) + .map(TypeEffectiveStatement::getTypeDefinition).orElse(null); } @Override - public Collection getDeviatedUniques() { - return deviatedUniqueConstraints; + public Collection getDeviatedUniques() { + return allSubstatementsOfType(UniqueConstraint.class); } @Override public String getDeviatedUnits() { - return deviatedUnits; + return findFirstEffectiveSubstatementArgument(UnitsEffectiveStatement.class).orElse(null); + } + + @SuppressWarnings("unchecked") + private Collection allSubstatementsOfType(final Class type) { + return Collection.class.cast(Collections2.filter(effectiveSubstatements(), type::isInstance)); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/DeviateStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/DeviateStatementImpl.java index d8d57cc70f..205c4e86d0 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/DeviateStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviate/DeviateStatementImpl.java @@ -7,13 +7,16 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviate; +import com.google.common.collect.ImmutableList; import org.opendaylight.yangtools.yang.model.api.DeviateKind; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement; -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 DeviateStatementImpl extends AbstractDeclaredStatement implements DeviateStatement { - DeviateStatementImpl(final StmtContext context) { - super(context); +final class DeviateStatementImpl extends WithSubstatements implements DeviateStatement { + DeviateStatementImpl(final StmtContext context, + final ImmutableList> substatements) { + super(context, substatements); } } -- 2.36.6