Optimize unique statement implementations 73/90873/3
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 2 Jul 2020 14:30:33 +0000 (16:30 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 2 Jul 2020 20:01:48 +0000 (22:01 +0200)
unique is a simple statement, optimize the memory layout of its
implementation classes.

JIRA: YANGTOOLS-1065
Change-Id: Idccce468b38726ac25851b11352528c489e92b5e
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/UniqueConstraint.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/UniqueEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/UniqueStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/EmptyUniqueEffectiveStatement.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/UniqueEffectiveStatementImpl.java with 59% similarity]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/EmptyUniqueStatement.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/UniqueStatementImpl.java with 61% similarity]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/RegularUniqueEffectiveStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/RegularUniqueStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/UniqueStatementSupport.java

index 36f4853d88d76ca7ddf45d15b3e0339523012b7f..4082d4e411e8450deba5c2029220ae648a36474a 100644 (file)
@@ -21,6 +21,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Desce
  * leafs exist (for more information see RFC-6020 section 7.8.3.).
  */
 @Beta
+// FIXME: 6.0.0: replace all usages of this class with UniqueEffectiveStatement and remove this
 public interface UniqueConstraint {
     @NonNull Set<Descendant> getTag();
 }
index 649013b76710ab684b23930248db1ce06c524273..206aba9a04de2967c5d0fed7cdf94cac71aa8344 100644 (file)
@@ -9,10 +9,15 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import com.google.common.annotations.Beta;
 import java.util.Set;
+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 UniqueEffectiveStatement extends EffectiveStatement<Set<Descendant>, UniqueStatement> {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.UNIQUE;
+    }
 }
index 9d05a2402359d5eba4009a6df27026d99d5390e1..165f413a5c61b6b3834d51f6692eb414c5092feb 100644 (file)
@@ -10,10 +10,16 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 import static com.google.common.base.Verify.verifyNotNull;
 
 import java.util.Set;
+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;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 
 public interface UniqueStatement extends DeclaredStatement<Set<SchemaNodeIdentifier.Descendant>> {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.UNIQUE;
+    }
 
     default Set<Descendant> getTag() {
         // FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -14,17 +14,16 @@ import org.opendaylight.yangtools.yang.model.api.UniqueConstraint;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement;
-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;
 
-final class UniqueEffectiveStatementImpl extends DeclaredEffectiveStatementBase<Set<Descendant>, UniqueStatement>
-        implements UniqueConstraint, UniqueEffectiveStatement {
-    UniqueEffectiveStatementImpl(final StmtContext<Set<Descendant>, UniqueStatement, ?> ctx) {
-        super(ctx);
+class EmptyUniqueEffectiveStatement extends DefaultArgument<Set<Descendant>, UniqueStatement>
+        implements UniqueEffectiveStatement, UniqueConstraint {
+    EmptyUniqueEffectiveStatement(final UniqueStatement declared) {
+        super(declared);
     }
 
     @Override
-    public Set<Descendant> getTag() {
+    public final Set<Descendant> getTag() {
         // FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here
         return verifyNotNull(argument());
     }
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -10,11 +10,11 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.unique;
 import java.util.Set;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithArgument;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-final class UniqueStatementImpl extends AbstractDeclaredStatement<Set<Descendant>> implements UniqueStatement {
-    UniqueStatementImpl(final StmtContext<Set<Descendant>, UniqueStatement, ?> context) {
+final class EmptyUniqueStatement extends WithArgument<Set<Descendant>> implements UniqueStatement {
+    EmptyUniqueStatement(final StmtContext<Set<Descendant>, ?, ?> context) {
         super(context);
     }
 }
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/RegularUniqueEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/RegularUniqueEffectiveStatement.java
new file mode 100644 (file)
index 0000000..0b35795
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.unique;
+
+import com.google.common.collect.ImmutableList;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement;
+
+final class RegularUniqueEffectiveStatement extends EmptyUniqueEffectiveStatement {
+    private final @NonNull Object substatements;
+
+    RegularUniqueEffectiveStatement(final UniqueStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(declared);
+        this.substatements = maskList(substatements);
+    }
+
+    @Override
+    public ImmutableList<? extends EffectiveStatement<?, ?>> effectiveSubstatements() {
+        return unmaskList(substatements);
+    }
+}
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/RegularUniqueStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/unique/RegularUniqueStatement.java
new file mode 100644 (file)
index 0000000..ffd6638
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.unique;
+
+import com.google.common.collect.ImmutableList;
+import java.util.Set;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
+import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithArgument.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+
+final class RegularUniqueStatement extends WithSubstatements<Set<Descendant>> implements UniqueStatement {
+    RegularUniqueStatement(final StmtContext<Set<Descendant>, ?, ?> context,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(context, substatements);
+    }
+}
index 6e0154a85f9cfdc887e5bfcde2598726db82c693..d38cc11fa0b840dd9c993e5b19022cfa1cf01bcd 100644 (file)
@@ -9,24 +9,27 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.unique;
 
 import com.google.common.base.CharMatcher;
 import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.regex.Pattern;
 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.SchemaNodeIdentifier;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement;
 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;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
 
 public final class UniqueStatementSupport
-        extends AbstractStatementSupport<Set<Descendant>, UniqueStatement, UniqueEffectiveStatement> {
+        extends BaseStatementSupport<Set<Descendant>, UniqueStatement, UniqueEffectiveStatement> {
     /**
      * Support 'sep' ABNF rule in RFC7950 section 14. CRLF pattern is used to squash line-break from CRLF to LF form
      * and then we use SEP_SPLITTER, which can operate on single characters.
@@ -49,8 +52,8 @@ public final class UniqueStatementSupport
     }
 
     @Override
-    public Set<Descendant> parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
-        final Set<Descendant> uniqueConstraints = parseUniqueConstraintArgument(ctx, value);
+    public ImmutableSet<Descendant> parseArgumentValue(final StmtContext<?, ?, ?> ctx, final String value) {
+        final ImmutableSet<Descendant> uniqueConstraints = parseUniqueConstraintArgument(ctx, value);
         SourceException.throwIf(uniqueConstraints.isEmpty(), ctx.getStatementSourceReference(),
                 "Invalid argument value '%s' of unique statement. The value must contains at least "
                         + "one descendant schema node identifier.", value);
@@ -58,22 +61,36 @@ public final class UniqueStatementSupport
     }
 
     @Override
-    public UniqueStatement createDeclared(final StmtContext<Set<Descendant>, UniqueStatement, ?> ctx) {
-        return new UniqueStatementImpl(ctx);
+    protected SubstatementValidator getSubstatementValidator() {
+        return SUBSTATEMENT_VALIDATOR;
     }
 
     @Override
-    public UniqueEffectiveStatement createEffective(
-            final StmtContext<Set<Descendant>, UniqueStatement, UniqueEffectiveStatement> ctx) {
-        return new UniqueEffectiveStatementImpl(ctx);
+    protected UniqueStatement createDeclared(final StmtContext<Set<Descendant>, UniqueStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new RegularUniqueStatement(ctx, substatements);
     }
 
     @Override
-    protected SubstatementValidator getSubstatementValidator() {
-        return SUBSTATEMENT_VALIDATOR;
+    protected UniqueStatement createEmptyDeclared(final StmtContext<Set<Descendant>, UniqueStatement, ?> ctx) {
+        return new EmptyUniqueStatement(ctx);
+    }
+
+    @Override
+    protected UniqueEffectiveStatement createEffective(
+            final StmtContext<Set<Descendant>, UniqueStatement, UniqueEffectiveStatement> ctx,
+            final UniqueStatement declared, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new RegularUniqueEffectiveStatement(declared, substatements);
+    }
+
+    @Override
+    protected UniqueEffectiveStatement createEmptyEffective(
+            final StmtContext<Set<Descendant>, UniqueStatement, UniqueEffectiveStatement> ctx,
+            final UniqueStatement declared) {
+        return new EmptyUniqueEffectiveStatement(declared);
     }
 
-    private static Set<Descendant> parseUniqueConstraintArgument(final StmtContext<?, ?, ?> ctx,
+    private static ImmutableSet<Descendant> parseUniqueConstraintArgument(final StmtContext<?, ?, ?> ctx,
             final String argumentValue) {
         // deal with 'line-break' rule, which is either "\n" or "\r\n", but not "\r"
         final String nocrlf = CRLF_PATTERN.matcher(argumentValue).replaceAll("\n");