From 1db5cf34c1e747c3b0abe4bd75ae497a5e23109e Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 3 Nov 2015 12:48:01 +0100 Subject: [PATCH] Store key arguments in an ImmutableSet Make sure we copy key statements from groupings efficiently by reusing SchemaNodeIdentifiers which have not changed. Also store them in an ImmutableSet, rather than a HashSet. Change-Id: I979e417d722bef54e395459403394bdaccdcc339 Signed-off-by: Robert Varga --- .../parser/spi/meta/StmtContextUtils.java | 22 +++++++++++++------ .../parser/stmt/rfc6020/KeyStatementImpl.java | 2 +- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java index f16937565a..186ef6bca7 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StmtContextUtils.java @@ -10,9 +10,9 @@ package org.opendaylight.yangtools.yang.parser.spi.meta; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSet.Builder; import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.Set; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; @@ -165,12 +165,20 @@ public final class StmtContextUtils { final StmtContext, KeyStatement, ?> keyStmtCtx, final QNameModule newQNameModule) { - Set newKeys = new LinkedHashSet<>(); - for (String keyToken : LIST_KEY_SPLITTER.split(keyStmtCtx.rawStatementArgument())) { - final QName keyQName = QName.create(newQNameModule, keyToken); - newKeys.add(SchemaNodeIdentifier.create(false, keyQName)); + final Builder builder = ImmutableSet.builder(); + boolean replaced = false; + for (SchemaNodeIdentifier arg : keyStmtCtx.getStatementArgument()) { + final QName qname = arg.getLastComponent(); + if (!newQNameModule.equals(qname)) { + final QName newQname = QName.create(newQNameModule, qname.getLocalName()); + builder.add(SchemaNodeIdentifier.create(false, newQname)); + replaced = true; + } else { + builder.add(arg); + } } - return newKeys; + // This makes sure we reuse the collection when a grouping is instantiated in the same module + return replaced ? builder.build() : keyStmtCtx.getStatementArgument(); } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/KeyStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/KeyStatementImpl.java index 8a967f6209..128e3b6c76 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/KeyStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/KeyStatementImpl.java @@ -38,7 +38,7 @@ public class KeyStatementImpl extends AbstractDeclaredStatement parseArgumentValue(final StmtContext ctx, final String value) { - final Builder builder = ImmutableSet.builder(); + final Builder builder = ImmutableSet.builder(); int tokens = 0; for (String keyToken : StmtContextUtils.LIST_KEY_SPLITTER.split(value)) { builder.add(SchemaNodeIdentifier.create(false, Utils.qNameFromArgument(ctx, keyToken))); -- 2.36.6