[
https://issues.apache.org/jira/browse/FLINK-39195?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
ASF GitHub Bot updated FLINK-39195:
-----------------------------------
Labels: pull-request-available (was: )
> ObjectPath should implement Comparable
> --------------------------------------
>
> Key: FLINK-39195
> URL: https://issues.apache.org/jira/browse/FLINK-39195
> Project: Flink
> Issue Type: Improvement
> Components: Table SQL / API
> Reporter: Liu
> Priority: Major
> Labels: pull-request-available
>
> h2. Motivation
> ObjectPath is a core value object in Flink's Table/SQL API that represents a
> database name and object (table/view/function) name combo in a catalog. It
> already
> implements equals() and hashCode(), and is widely used as a Map key
> throughout the
> codebase (e.g., GenericInMemoryCatalog has 8 Map<ObjectPath, ...> fields).
> However, ObjectPath does not implement Comparable<ObjectPath>, which causes
> issues
> in several scenarios:
> 1. *Jackson JSON Serialization Failure*: Flink Planner's
> CompiledPlanSerdeUtil
> enables SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS (line 110), which
> requires
> Map keys to implement Comparable. Any object containing Map<ObjectPath,
> ...> fields
> that goes through compilePlan().toJson() will fail with:
> \{code}
> java.lang.ClassCastException: class
> org.apache.flink.table.catalog.ObjectPath
> cannot be cast to class java.lang.Comparable
> \{code}
> 2. *Value Object Completeness*: As a widely-used identifier class, ObjectPath
> has a
> natural ordering semantic (databaseName + objectName, both Strings).
> Implementing
> Comparable is a standard practice for value objects in Java (similar to
> java.io.File,
> java.net.URI, java.nio.file.Path).
> 3. *Usability*: Users cannot currently use ObjectPath with TreeMap, TreeSet,
> or
> Collections.sort(), which limits its utility in scenarios requiring sorted
> output
> (logging, debugging, deterministic serialization).
> h2. Proposed Change
> Add Comparable<ObjectPath> to ObjectPath:
> {code:java}
> @PublicEvolving
> public class ObjectPath implements Serializable, Comparable<ObjectPath> {
> // ... existing code unchanged ...
> @Override
> public int compareTo(ObjectPath other) {
> int cmp = this.databaseName.compareTo(other.databaseName);
> if (cmp != 0) {
> return cmp;
> }
> return this.objectName.compareTo(other.objectName);
> }
> }
> {code}
> The comparison uses lexicographic ordering: first by databaseName, then by
> objectName.
> This is consistent with the format returned by getFullName()
> ("databaseName.objectName").
> h2. Compatibility
> * *API Compatible*: Only adds a new interface implementation; no existing
> method
> signatures are changed.
> * *Behavior Compatible*: equals/hashCode behavior is unchanged.
> * *Binary Compatible*: Adding a new method does not break existing bytecode.
> h2. Impact
> * Fixes Jackson serialization failure for any Map<ObjectPath, ...> in the
> Compiled
> Plan JSON serialization path.
> * Enables ObjectPath to be used with TreeMap/TreeSet/sorted collections.
> * Zero risk to existing functionality.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)