Specialize GroupingEffectiveStatement 57/98857/6
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 6 Dec 2021 11:50:56 +0000 (12:50 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 8 Dec 2021 09:25:37 +0000 (10:25 +0100)
We can save a field if the argument matches the declared value, which
translates to some tiny savings.

JIRA: YANGTOOLS-1316
Change-Id: Id232da26c1acbfad74373d6605b1a9fdd1c86b2e
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/EffectiveStatements.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractGroupingEffectiveStatement.java [moved from model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/GroupingEffectiveStatementImpl.java with 75% similarity]
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/EmptyGroupingEffectiveStatement.java [new file with mode: 0644]
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/RegularGroupingEffectiveStatement.java [new file with mode: 0644]
model/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/LeafrefStaticAnalysisTest.java
model/yang-model-util/src/test/java/org/opendaylight/yangtools/yang/model/util/YT1127Test.java

index ffa548b4115d7002a5e6bce2a555440fd55d0cf3..b18c7c591a61f25732215689606bc2ca3bc4df47 100644 (file)
@@ -181,6 +181,7 @@ import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyErrorMessageE
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyFeatureEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyForeignKeyEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyFractionDigitsEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyGroupingEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyIdentityEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyIfFeatureEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyIncludeEffectiveStatement;
@@ -215,7 +216,6 @@ import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyWhenEffective
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyYangVersionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.EmptyYinElementEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ExtensionEffectiveStatementImpl;
-import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.GroupingEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.ImportEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.NotificationEffectiveStatementImpl;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularAnydataEffectiveStatement;
@@ -236,6 +236,7 @@ import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularErrorMessag
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularFeatureEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularForeignKeyEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularFractionDigitsEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularGroupingEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularIdentityEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularIfFeatureEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff.RegularIncludeEffectiveStatement;
@@ -505,7 +506,9 @@ public final class EffectiveStatements {
     public static GroupingEffectiveStatement createGrouping(final GroupingStatement declared,
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final QName argument,
             final int flags) throws SubstatementIndexingException {
-        return new GroupingEffectiveStatementImpl(declared, substatements, argument, flags);
+        return argument.equals(declared.argument())
+            ? new EmptyGroupingEffectiveStatement(declared, substatements, flags)
+                : new RegularGroupingEffectiveStatement(declared, substatements, argument, flags);
     }
 
     public static IfFeatureEffectiveStatement createIfFeature(final IfFeatureStatement declared,
@@ -7,10 +7,8 @@
  */
 package org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff;
 
-import static java.util.Objects.requireNonNull;
-
+import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableList;
-import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
@@ -24,45 +22,37 @@ import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.D
 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.NotificationNodeContainerMixin;
 import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.SchemaNodeMixin;
 
-public final class GroupingEffectiveStatementImpl
+public abstract class AbstractGroupingEffectiveStatement
         extends WithTypedefNamespace<QName, GroupingStatement, GroupingEffectiveStatement>
         implements GroupingDefinition, GroupingEffectiveStatement,
             DataNodeContainerMixin<QName, GroupingStatement>, SchemaNodeMixin<GroupingStatement>,
             ActionNodeContainerMixin<QName, GroupingStatement>,
             NotificationNodeContainerMixin<QName, GroupingStatement>, AddedByUsesMixin<QName, GroupingStatement> {
-    private final @NonNull QName argument;
     private final int flags;
 
-    public GroupingEffectiveStatementImpl(final GroupingStatement declared,
-            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final QName argument,
-            final int flags) {
+    AbstractGroupingEffectiveStatement(final GroupingStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final int flags) {
         super(declared, substatements);
-        this.argument = requireNonNull(argument);
         this.flags = flags;
     }
 
     @Override
-    public int flags() {
+    public final int flags() {
         return flags;
     }
 
     @Override
-    public QName argument() {
-        return argument;
-    }
-
-    @Override
-    public DataSchemaNode dataChildByName(final QName name) {
+    public final DataSchemaNode dataChildByName(final QName name) {
         return dataSchemaNode(name);
     }
 
     @Override
-    public GroupingEffectiveStatement asEffectiveStatement() {
+    public final GroupingEffectiveStatement asEffectiveStatement() {
         return this;
     }
 
     @Override
-    public String toString() {
-        return GroupingEffectiveStatementImpl.class.getSimpleName() + "[" + "qname=" + argument + "]";
+    public final String toString() {
+        return MoreObjects.toStringHelper(this).add("qname", argument()).toString();
     }
 }
diff --git a/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/EmptyGroupingEffectiveStatement.java b/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/EmptyGroupingEffectiveStatement.java
new file mode 100644 (file)
index 0000000..f14d69a
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. 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.model.ri.stmt.impl.eff;
+
+import com.google.common.collect.ImmutableList;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
+
+public final class EmptyGroupingEffectiveStatement extends AbstractGroupingEffectiveStatement {
+    public EmptyGroupingEffectiveStatement(final GroupingStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final int flags) {
+        super(declared, substatements, flags);
+    }
+
+    @Override
+    public QName argument() {
+        return getDeclared().argument();
+    }
+}
diff --git a/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/RegularGroupingEffectiveStatement.java b/model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/RegularGroupingEffectiveStatement.java
new file mode 100644 (file)
index 0000000..c71ba13
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2015 Cisco Systems, Inc. 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.model.ri.stmt.impl.eff;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
+
+public final class RegularGroupingEffectiveStatement extends AbstractGroupingEffectiveStatement {
+    private final @NonNull QName argument;
+
+    public RegularGroupingEffectiveStatement(final GroupingStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements, final QName argument,
+            final int flags) {
+        super(declared, substatements, flags);
+        this.argument = requireNonNull(argument);
+    }
+
+    @Override
+    public QName argument() {
+        return argument;
+    }
+}
index 5bd25d677aaec99a6323fff6ab3ac8721dd4155e..d4a9fe7163915e98608245821ed79a047a9c8376 100644 (file)
@@ -169,7 +169,7 @@ public class LeafrefStaticAnalysisTest {
         assertThat(ex.getMessage(), startsWith("Illegal parent access in "));
         final Throwable cause = ex.getCause();
         assertThat(cause, instanceOf(IllegalStateException.class));
-        assertEquals("Unexpected current GroupingEffectiveStatementImpl[qname=(leafrefs)grp]", cause.getMessage());
+        assertEquals("Unexpected current EmptyGroupingEffectiveStatement{qname=(leafrefs)grp}", cause.getMessage());
     }
 
     private static void assertThrowsMissingXyzzy(final SchemaInferenceStack stack, final LeafSchemaNode leaf,
index b83a1c13f1352fcf224091c8e53e150225867244..17f74781463c71d1b2886bfdc75cd329d3d63a11 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.yangtools.yang.model.util;
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.startsWith;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThrows;
 
 import java.util.NoSuchElementException;
@@ -52,7 +53,7 @@ public class YT1127Test {
         assertThat(ex.getMessage(), startsWith("Illegal parent access in YangLocationPath"));
         final Throwable cause = ex.getCause();
         assertThat(cause, instanceOf(IllegalStateException.class));
-        assertThat(cause.getMessage(), startsWith("Unexpected current Grouping"));
+        assertEquals("Unexpected current EmptyGroupingEffectiveStatement{qname=(foo)grp}", cause.getMessage());
     }
 
     @Test