This is an automated email from the ASF dual-hosted git repository. jermy pushed a commit to branch StringId-hold-bytes in repository https://gitbox.apache.org/repos/asf/incubator-hugegraph.git
commit 7202d54c34d906fd62a8e79b3ad68ae6856ebe4b Author: Jermy Li <je...@apache.org> AuthorDate: Sun Aug 31 01:19:20 2025 +0800 perf(core): StringId hold bytes to avoid decode/encode Change-Id: I1ff93a2ee31f142fb7ab5cfe0e038ef2da2f982d --- .../apache/hugegraph/backend/id/IdGenerator.java | 43 ++++++++++++++++------ .../memory/consumer/impl/id/StringIdOffHeap.java | 1 + 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/IdGenerator.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/IdGenerator.java index 17cc11684..385555bdf 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/IdGenerator.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/IdGenerator.java @@ -23,6 +23,7 @@ import java.util.UUID; import org.apache.hugegraph.backend.id.Id.IdType; import org.apache.hugegraph.backend.serializer.BytesBuffer; import org.apache.hugegraph.structure.HugeVertex; +import org.apache.hugegraph.util.Bytes; import org.apache.hugegraph.util.E; import org.apache.hugegraph.util.LongEncoding; import org.apache.hugegraph.util.NumericUtil; @@ -128,14 +129,19 @@ public abstract class IdGenerator { public static class StringId implements Id { protected String id; + protected byte[] bytes; public StringId(String id) { E.checkArgument(!id.isEmpty(), "The id can't be empty"); this.id = id; + this.bytes = null; } public StringId(byte[] bytes) { - this.id = StringEncoding.decode(bytes); + E.checkArgument(bytes != null && bytes.length > 0, + "The id bytes can't be null or empty"); + this.bytes = bytes; + this.id = null; } @Override @@ -145,27 +151,33 @@ public abstract class IdGenerator { @Override public Object asObject() { - return this.id; + return this.asString(); } @Override public String asString() { + if (this.id == null) { + this.id = StringEncoding.decode(this.bytes); + } return this.id; } @Override public long asLong() { - return Long.parseLong(this.id); + return Long.parseLong(this.asString()); } @Override public byte[] asBytes() { - return StringEncoding.encode(this.id); + if (this.bytes == null) { + this.bytes = StringEncoding.encode(this.id); + } + return this.bytes; } @Override public int length() { - return this.id.length(); + return this.asString().length(); } @Override @@ -174,25 +186,34 @@ public abstract class IdGenerator { if (cmp != 0) { return cmp; } - return this.id.compareTo(other.asString()); + if (this.id != null) { + return this.id.compareTo(other.asString()); + } else { + return Bytes.compare(this.bytes, other.asBytes()); + } } @Override public int hashCode() { - return this.id.hashCode(); + return this.asString().hashCode(); } @Override - public boolean equals(Object other) { - if (!(other instanceof StringId)) { + public boolean equals(Object obj) { + if (!(obj instanceof StringId)) { return false; } - return this.id.equals(((StringId) other).id); + StringId other = (StringId) obj; + if (this.id != null) { + return this.id.equals(other.asString()); + } else { + return Bytes.equals(this.bytes, other.asBytes()); + } } @Override public String toString() { - return this.id; + return this.asString(); } } diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/id/StringIdOffHeap.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/id/StringIdOffHeap.java index be96c2c96..98bdc25ab 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/id/StringIdOffHeap.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/id/StringIdOffHeap.java @@ -70,6 +70,7 @@ public class StringIdOffHeap extends IdGenerator.StringId implements OffHeapObje @Override public void releaseOriginalVarsOnHeap() { this.id = null; + this.bytes = null; } @Override