Intern PatternExpressions 36/98836/2
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 3 Dec 2021 15:14:22 +0000 (16:14 +0100)
committerRobert Varga <nite@hq.sk>
Fri, 3 Dec 2021 17:26:21 +0000 (17:26 +0000)
Some of the patterns out there are widely duplicated, expecially in
Junos models. Since a PatternExpression is an Immutable object, it can
easily be interned and thus shared across reactors, eliminating ~33K
duplicate objects.

JIRA: YANGTOOLS-1374
Change-Id: I8328d1eab9be07fe87757523543d43f0ea7c64d3
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/PatternExpression.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/pattern/PatternStatementSupport.java

index 0a4f55bef8fed296f55d06ba95a9eed4b25ade46..0e25e07962ec3e4144181783c2e0220dd11ad712 100644 (file)
@@ -10,6 +10,8 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
+import com.google.common.collect.Interner;
+import com.google.common.collect.Interners;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.concepts.Immutable;
@@ -21,6 +23,8 @@ import org.opendaylight.yangtools.concepts.Immutable;
 @Beta
 @NonNullByDefault
 public final class PatternExpression implements Immutable {
+    private static final Interner<PatternExpression> INTERNER = Interners.newWeakInterner();
+
     private final String pattern;
     private final String regex;
 
@@ -57,6 +61,15 @@ public final class PatternExpression implements Immutable {
         return regex;
     }
 
+    /**
+     * Returns an interned instance of this expression.
+     *
+     * @return A shared interned instance.
+     */
+    public PatternExpression intern() {
+        return INTERNER.intern(this);
+    }
+
     @Override
     public int hashCode() {
         return regex.hashCode();
index 7ee798f1d0e0a18d5aaacaa8ac57c29bb2278d2c..d3bfb729f5e2c292c6ef261933e4d0ee1351c86d 100644 (file)
@@ -68,7 +68,7 @@ public final class PatternStatementSupport
         } catch (final PatternSyntaxException e) {
             throw new SourceException(ctx, e, "Pattern \"%s\" failed to compile", pattern);
         }
-        return PatternExpression.of(value, pattern);
+        return PatternExpression.of(value, pattern).intern();
     }
 
     @Override