This is an automated email from the ASF dual-hosted git repository.

fanng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new dd87cdd45 [#5600] feat(API): Add Java API definition for ML model in 
Gravitino (#5612)
dd87cdd45 is described below

commit dd87cdd45648a55f6366cdfb7dfa0c0edf6fb22b
Author: Jerry Shao <jerrys...@datastrato.com>
AuthorDate: Mon Nov 25 11:28:21 2024 +0800

    [#5600] feat(API): Add Java API definition for ML model in Gravitino (#5612)
    
    ### What changes were proposed in this pull request?
    
    This PR adds the API definition for ML model and model catalog.
    
    ### Why are the changes needed?
    
    This is the first step to support ML model management in Gravitino.
    
    Fix: #5600
    
    ### Does this PR introduce _any_ user-facing change?
    
    Yes.
    
    ### How was this patch tested?
    
    Manual verification.
---
 .../main/java/org/apache/gravitino/Catalog.java    |  14 ++
 .../java/org/apache/gravitino/MetadataObject.java  |   4 +-
 .../java/org/apache/gravitino/MetadataObjects.java |   5 +-
 .../exceptions/ModelAlreadyExistsException.java    |  50 +++++
 .../ModelVersionAliasesAlreadyExistException.java  |  50 +++++
 .../gravitino/exceptions/NoSuchModelException.java |  49 +++++
 .../exceptions/NoSuchModelVersionException.java    |  49 +++++
 .../java/org/apache/gravitino/model/Model.java     |  92 ++++++++
 .../org/apache/gravitino/model/ModelCatalog.java   | 231 +++++++++++++++++++++
 .../org/apache/gravitino/model/ModelVersion.java   |  79 +++++++
 10 files changed, 620 insertions(+), 3 deletions(-)

diff --git a/api/src/main/java/org/apache/gravitino/Catalog.java 
b/api/src/main/java/org/apache/gravitino/Catalog.java
index 343ae5434..ba8cf28d2 100644
--- a/api/src/main/java/org/apache/gravitino/Catalog.java
+++ b/api/src/main/java/org/apache/gravitino/Catalog.java
@@ -24,6 +24,7 @@ import org.apache.gravitino.annotation.Evolving;
 import org.apache.gravitino.authorization.SupportsRoles;
 import org.apache.gravitino.file.FilesetCatalog;
 import org.apache.gravitino.messaging.TopicCatalog;
+import org.apache.gravitino.model.ModelCatalog;
 import org.apache.gravitino.rel.TableCatalog;
 import org.apache.gravitino.tag.SupportsTags;
 
@@ -46,6 +47,9 @@ public interface Catalog extends Auditable {
     /** Catalog Type for Message Queue, like Kafka://topic */
     MESSAGING,
 
+    /** Catalog Type for ML model */
+    MODEL,
+
     /** Catalog Type for test only. */
     UNSUPPORTED;
 
@@ -63,6 +67,8 @@ public interface Catalog extends Auditable {
           return FILESET;
         case "messaging":
           return MESSAGING;
+        case "model":
+          return MODEL;
         default:
           throw new IllegalArgumentException("Unknown catalog type: " + type);
       }
@@ -178,6 +184,14 @@ public interface Catalog extends Auditable {
     throw new UnsupportedOperationException("Catalog does not support topic 
operations");
   }
 
+  /**
+   * @return the {@link ModelCatalog} if the catalog supports model operations.
+   * @throws UnsupportedOperationException if the catalog does not support 
model operations.
+   */
+  default ModelCatalog asModelCatalog() throws UnsupportedOperationException {
+    throw new UnsupportedOperationException("Catalog does not support model 
operations");
+  }
+
   /**
    * @return the {@link SupportsTags} if the catalog supports tag operations.
    * @throws UnsupportedOperationException if the catalog does not support tag 
operations.
diff --git a/api/src/main/java/org/apache/gravitino/MetadataObject.java 
b/api/src/main/java/org/apache/gravitino/MetadataObject.java
index 7e94db194..05beafe9d 100644
--- a/api/src/main/java/org/apache/gravitino/MetadataObject.java
+++ b/api/src/main/java/org/apache/gravitino/MetadataObject.java
@@ -59,7 +59,9 @@ public interface MetadataObject {
     /** A column is a sub-collection of the table that represents a group of 
same type data. */
     COLUMN,
     /** A role is an object contains specific securable objects with 
privileges */
-    ROLE
+    ROLE,
+    /** A model is mapped to the model artifact in ML. */
+    MODEL
   }
 
   /**
diff --git a/api/src/main/java/org/apache/gravitino/MetadataObjects.java 
b/api/src/main/java/org/apache/gravitino/MetadataObjects.java
index 49fe60187..74da23c10 100644
--- a/api/src/main/java/org/apache/gravitino/MetadataObjects.java
+++ b/api/src/main/java/org/apache/gravitino/MetadataObjects.java
@@ -83,8 +83,9 @@ public class MetadataObjects {
         names.size() != 3
             || type == MetadataObject.Type.FILESET
             || type == MetadataObject.Type.TABLE
-            || type == MetadataObject.Type.TOPIC,
-        "If the length of names is 3, it must be FILESET, TABLE or TOPIC");
+            || type == MetadataObject.Type.TOPIC
+            || type == MetadataObject.Type.MODEL,
+        "If the length of names is 3, it must be FILESET, TABLE, TOPIC or 
MODEL");
 
     Preconditions.checkArgument(
         names.size() != 4 || type == MetadataObject.Type.COLUMN,
diff --git 
a/api/src/main/java/org/apache/gravitino/exceptions/ModelAlreadyExistsException.java
 
b/api/src/main/java/org/apache/gravitino/exceptions/ModelAlreadyExistsException.java
new file mode 100644
index 000000000..6ebb610af
--- /dev/null
+++ 
b/api/src/main/java/org/apache/gravitino/exceptions/ModelAlreadyExistsException.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.exceptions;
+
+import com.google.errorprone.annotations.FormatMethod;
+import com.google.errorprone.annotations.FormatString;
+
+/** Exception thrown when a model with specified name already exists. */
+public class ModelAlreadyExistsException extends AlreadyExistsException {
+
+  /**
+   * Constructs a new exception with the specified detail message.
+   *
+   * @param message the detail message.
+   * @param args the arguments to the message.
+   */
+  @FormatMethod
+  public ModelAlreadyExistsException(@FormatString String message, Object... 
args) {
+    super(message, args);
+  }
+
+  /**
+   * Constructs a new exception with the specified detail message and cause.
+   *
+   * @param cause the cause.
+   * @param message the detail message.
+   * @param args the arguments to the message.
+   */
+  @FormatMethod
+  public ModelAlreadyExistsException(
+      Throwable cause, @FormatString String message, Object... args) {
+    super(cause, message, args);
+  }
+}
diff --git 
a/api/src/main/java/org/apache/gravitino/exceptions/ModelVersionAliasesAlreadyExistException.java
 
b/api/src/main/java/org/apache/gravitino/exceptions/ModelVersionAliasesAlreadyExistException.java
new file mode 100644
index 000000000..b4754bebe
--- /dev/null
+++ 
b/api/src/main/java/org/apache/gravitino/exceptions/ModelVersionAliasesAlreadyExistException.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.exceptions;
+
+import com.google.errorprone.annotations.FormatMethod;
+import com.google.errorprone.annotations.FormatString;
+
+/** Exception thrown when the model version aliases already exist. */
+public class ModelVersionAliasesAlreadyExistException extends 
AlreadyExistsException {
+
+  /**
+   * Constructs a new exception with the specified detail message.
+   *
+   * @param message the detail message.
+   * @param args the arguments to the message.
+   */
+  @FormatMethod
+  public ModelVersionAliasesAlreadyExistException(@FormatString String 
message, Object... args) {
+    super(message, args);
+  }
+
+  /**
+   * Constructs a new exception with the specified detail message and cause.
+   *
+   * @param cause the cause.
+   * @param message the detail message.
+   * @param args the arguments to the message.
+   */
+  @FormatMethod
+  public ModelVersionAliasesAlreadyExistException(
+      Throwable cause, @FormatString String message, Object... args) {
+    super(cause, message, args);
+  }
+}
diff --git 
a/api/src/main/java/org/apache/gravitino/exceptions/NoSuchModelException.java 
b/api/src/main/java/org/apache/gravitino/exceptions/NoSuchModelException.java
new file mode 100644
index 000000000..056c83382
--- /dev/null
+++ 
b/api/src/main/java/org/apache/gravitino/exceptions/NoSuchModelException.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.exceptions;
+
+import com.google.errorprone.annotations.FormatMethod;
+import com.google.errorprone.annotations.FormatString;
+
+/** Exception thrown when a model with specified name is not existed. */
+public class NoSuchModelException extends NotFoundException {
+
+  /**
+   * Constructs a new exception with the specified detail message.
+   *
+   * @param message the detail message.
+   * @param args the arguments to the message.
+   */
+  @FormatMethod
+  public NoSuchModelException(@FormatString String message, Object... args) {
+    super(message, args);
+  }
+
+  /**
+   * Constructs a new exception with the specified detail message and cause.
+   *
+   * @param cause the cause.
+   * @param message the detail message.
+   * @param args the arguments to the message.
+   */
+  @FormatMethod
+  public NoSuchModelException(Throwable cause, String message, Object... args) 
{
+    super(cause, message, args);
+  }
+}
diff --git 
a/api/src/main/java/org/apache/gravitino/exceptions/NoSuchModelVersionException.java
 
b/api/src/main/java/org/apache/gravitino/exceptions/NoSuchModelVersionException.java
new file mode 100644
index 000000000..e85fce0c0
--- /dev/null
+++ 
b/api/src/main/java/org/apache/gravitino/exceptions/NoSuchModelVersionException.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.exceptions;
+
+import com.google.errorprone.annotations.FormatMethod;
+import com.google.errorprone.annotations.FormatString;
+
+/** Exception thrown when a model with specified version is not existed. */
+public class NoSuchModelVersionException extends NotFoundException {
+
+  /**
+   * Constructs a new exception with the specified detail message.
+   *
+   * @param message the detail message.
+   * @param args the arguments to the message.
+   */
+  @FormatMethod
+  public NoSuchModelVersionException(@FormatString String message, Object... 
args) {
+    super(message, args);
+  }
+
+  /**
+   * Constructs a new exception with the specified detail message and cause.
+   *
+   * @param cause the cause.
+   * @param message the detail message.
+   * @param args the arguments to the message.
+   */
+  @FormatMethod
+  public NoSuchModelVersionException(Throwable cause, String message, 
Object... args) {
+    super(cause, message, args);
+  }
+}
diff --git a/api/src/main/java/org/apache/gravitino/model/Model.java 
b/api/src/main/java/org/apache/gravitino/model/Model.java
new file mode 100644
index 000000000..fab4e0d53
--- /dev/null
+++ b/api/src/main/java/org/apache/gravitino/model/Model.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.model;
+
+import java.util.Collections;
+import java.util.Map;
+import org.apache.gravitino.Auditable;
+import org.apache.gravitino.Namespace;
+import org.apache.gravitino.annotation.Evolving;
+import org.apache.gravitino.authorization.SupportsRoles;
+import org.apache.gravitino.tag.SupportsTags;
+
+/**
+ * An interface representing an ML model under a schema {@link Namespace}. A 
model is a metadata
+ * object that represents the model artifact in ML. Users can register a model 
object in Gravitino
+ * to manage the model metadata. The typical use case is to manage the model 
in ML lifecycle with a
+ * unified way in Gravitino, and access the model artifact with a unified 
identifier. Also, with the
+ * model registered in Gravitino, users can govern the model with Gravitino's 
unified audit, tag,
+ * and role management.
+ *
+ * <p>The difference of Model and tabular data is that the model is 
schema-free, and the main
+ * property of the model is the model artifact URL. The difference compared to 
the fileset is that
+ * the model is versioned, and the model object contains the version 
information.
+ */
+@Evolving
+public interface Model extends Auditable {
+
+  /** @return Name of the model object. */
+  String name();
+
+  /**
+   * The comment of the model object. This is the general description of the 
model object. User can
+   * still add more detailed information in the model version.
+   *
+   * @return The comment of the model object. Null is returned if no comment 
is set.
+   */
+  default String comment() {
+    return null;
+  }
+
+  /**
+   * The properties of the model object. The properties are key-value pairs 
that can be used to
+   * store additional information of the model object. The properties are 
optional.
+   *
+   * <p>Users can still specify the properties in the model version for 
different information.
+   *
+   * @return the properties of the model object.
+   */
+  default Map<String, String> properties() {
+    return Collections.emptyMap();
+  }
+
+  /**
+   * The latest version of the model object. The latest version is the version 
number of the latest
+   * model checkpoint / snapshot that is linked to the registered model.
+   *
+   * @return The latest version of the model object.
+   */
+  int latestVersion();
+
+  /**
+   * @return The {@link SupportsTags} if the model supports tag operations.
+   * @throws UnsupportedOperationException If the model does not support tag 
operations.
+   */
+  default SupportsTags supportsTags() {
+    throw new UnsupportedOperationException("Model does not support tag 
operations.");
+  }
+
+  /**
+   * @return The {@link SupportsRoles} if the model supports role operations.
+   * @throws UnsupportedOperationException If the model does not support role 
operations.
+   */
+  default SupportsRoles supportsRoles() {
+    throw new UnsupportedOperationException("Model does not support role 
operations.");
+  }
+}
diff --git a/api/src/main/java/org/apache/gravitino/model/ModelCatalog.java 
b/api/src/main/java/org/apache/gravitino/model/ModelCatalog.java
new file mode 100644
index 000000000..d7429fd02
--- /dev/null
+++ b/api/src/main/java/org/apache/gravitino/model/ModelCatalog.java
@@ -0,0 +1,231 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.model;
+
+import java.util.Map;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.Namespace;
+import org.apache.gravitino.annotation.Evolving;
+import org.apache.gravitino.exceptions.ModelAlreadyExistsException;
+import 
org.apache.gravitino.exceptions.ModelVersionAliasesAlreadyExistException;
+import org.apache.gravitino.exceptions.NoSuchModelException;
+import org.apache.gravitino.exceptions.NoSuchModelVersionException;
+import org.apache.gravitino.exceptions.NoSuchSchemaException;
+
+/**
+ * The ModelCatalog interface defines the public API for managing model 
objects in a schema. If the
+ * catalog implementation supports model objects, it should implement this 
interface.
+ */
+@Evolving
+public interface ModelCatalog {
+
+  /**
+   * List the models in a schema namespace from the catalog.
+   *
+   * @param namespace A schema namespace.
+   * @return An array of model identifiers in the namespace.
+   * @throws NoSuchSchemaException If the schema does not exist.
+   */
+  NameIdentifier[] listModels(Namespace namespace) throws 
NoSuchSchemaException;
+
+  /**
+   * Get a model metadata by {@link NameIdentifier} from the catalog.
+   *
+   * @param ident A model identifier.
+   * @return The model metadata.
+   * @throws NoSuchModelException If the model does not exist.
+   */
+  Model getModel(NameIdentifier ident) throws NoSuchModelException;
+
+  /**
+   * Check if a model exists using an {@link NameIdentifier} from the catalog.
+   *
+   * @param ident A model identifier.
+   * @return true If the model exists, false if the model does not exist.
+   */
+  default boolean modelExists(NameIdentifier ident) {
+    try {
+      getModel(ident);
+      return true;
+    } catch (NoSuchModelException e) {
+      return false;
+    }
+  }
+
+  /**
+   * Register a model in the catalog if the model is not existed, otherwise 
the {@link
+   * ModelAlreadyExistsException} will be thrown. The {@link Model} object 
will be created when the
+   * model is registered, users can call {@link 
ModelCatalog#linkModelVersion(NameIdentifier,
+   * String, String[], String, Map)} to link the model version to the 
registered {@link Model}.
+   *
+   * @param ident The name identifier of the model.
+   * @param comment The comment of the model. The comment is optional and can 
be null.
+   * @param properties The properties of the model. The properties are 
optional and can be null or
+   *     empty.
+   * @return The registered model object.
+   * @throws ModelAlreadyExistsException If the model already registered.
+   */
+  default Model registerModel(NameIdentifier ident, String comment, 
Map<String, String> properties)
+      throws ModelAlreadyExistsException {
+    return registerModel(ident, null, new String[0], comment, properties);
+  }
+
+  /**
+   * Register a model in the catalog if the model is not existed, otherwise 
the {@link
+   * ModelAlreadyExistsException} will be thrown. The {@link Model} object 
will be created when the
+   * model is registered, in the meantime, the model version (version 0) will 
also be created and
+   * linked to the registered model.
+   *
+   * @param ident The name identifier of the model.
+   * @param uri The model artifact URI.
+   * @param aliases The aliases of the model version. The alias are optional 
and can be empty.
+   * @param comment The comment of the model. The comment is optional and can 
be null.
+   * @param properties The properties of the model. The properties are 
optional and can be null or
+   *     empty.
+   * @return The registered model object.
+   * @throws ModelAlreadyExistsException If the model already registered.
+   * @throws ModelVersionAliasesAlreadyExistException If the aliases already 
exist in the model.
+   */
+  Model registerModel(
+      NameIdentifier ident,
+      String uri,
+      String[] aliases,
+      String comment,
+      Map<String, String> properties)
+      throws ModelAlreadyExistsException, 
ModelVersionAliasesAlreadyExistException;
+
+  /**
+   * Delete the model from the catalog. If the model does not exist, return 
false. Otherwise, return
+   * true. The deletion of the model will also delete all the model versions 
linked to this model.
+   *
+   * @param ident The name identifier of the model.
+   * @return True if the model is deleted, false if the model does not exist.
+   */
+  boolean deleteModel(NameIdentifier ident);
+
+  /**
+   * List all the versions of the register model by {@link NameIdentifier} in 
the catalog.
+   *
+   * @param ident The name identifier of the model.
+   * @return An array of version numbers of the model.
+   * @throws NoSuchModelException If the model does not exist.
+   */
+  int[] listModelVersions(NameIdentifier ident) throws NoSuchModelException;
+
+  /**
+   * Get a model version by the {@link NameIdentifier} and version number from 
the catalog.
+   *
+   * @param ident The name identifier of the model.
+   * @param version The version number of the model.
+   * @return The model version object.
+   * @throws NoSuchModelVersionException If the model version does not exist.
+   */
+  ModelVersion getModelVersion(NameIdentifier ident, int version)
+      throws NoSuchModelVersionException;
+
+  /**
+   * Get a model version by the {@link NameIdentifier} and version alias from 
the catalog.
+   *
+   * @param ident The name identifier of the model.
+   * @param alias The version alias of the model.
+   * @return The model version object.
+   * @throws NoSuchModelVersionException If the model version does not exist.
+   */
+  ModelVersion getModelVersion(NameIdentifier ident, String alias)
+      throws NoSuchModelVersionException;
+
+  /**
+   * Check if the model version exists by the {@link NameIdentifier} and 
version number. If the
+   * model version exists, return true, otherwise return false.
+   *
+   * @param ident The name identifier of the model.
+   * @param version The version number of the model.
+   * @return True if the model version exists, false if the model version does 
not exist.
+   */
+  default boolean modelVersionExists(NameIdentifier ident, int version) {
+    try {
+      getModelVersion(ident, version);
+      return true;
+    } catch (NoSuchModelVersionException e) {
+      return false;
+    }
+  }
+
+  /**
+   * Check if the model version exists by the {@link NameIdentifier} and 
version alias. If the model
+   * version exists, return true, otherwise return false.
+   *
+   * @param ident The name identifier of the model.
+   * @param alias The version alias of the model.
+   * @return True if the model version exists, false if the model version does 
not exist.
+   */
+  default boolean modelVersionExists(NameIdentifier ident, String alias) {
+    try {
+      getModelVersion(ident, alias);
+      return true;
+    } catch (NoSuchModelVersionException e) {
+      return false;
+    }
+  }
+
+  /**
+   * Link a new model version to the registered model object. The new model 
version will be added to
+   * the model object. If the model object does not exist, it will throw an 
exception. If the
+   * version alias already exists in the model, it will throw an exception.
+   *
+   * @param ident The name identifier of the model.
+   * @param uri The URI of the model version artifact.
+   * @param aliases The aliases of the model version. The aliases should be 
unique in this model,
+   *     otherwise the {@link ModelVersionAliasesAlreadyExistException} will 
be thrown. The aliases
+   *     are optional and can be empty.
+   * @param comment The comment of the model version. The comment is optional 
and can be null.
+   * @param properties The properties of the model version. The properties are 
optional and can be
+   *     null or empty.
+   * @return The model version object.
+   * @throws NoSuchModelException If the model does not exist.
+   * @throws ModelVersionAliasesAlreadyExistException If the aliases already 
exist in the model.
+   */
+  ModelVersion linkModelVersion(
+      NameIdentifier ident,
+      String uri,
+      String[] aliases,
+      String comment,
+      Map<String, String> properties)
+      throws NoSuchModelException, ModelVersionAliasesAlreadyExistException;
+
+  /**
+   * Delete the model version by the {@link NameIdentifier} and version 
number. If the model version
+   * does not exist, return false. If the model version is deleted, return 
true.
+   *
+   * @param ident The name identifier of the model.
+   * @param version The version number of the model.
+   * @return True if the model version is deleted, false if the model version 
does not exist.
+   */
+  boolean deleteModelVersion(NameIdentifier ident, int version);
+
+  /**
+   * Delete the model version by the {@link NameIdentifier} and version alias. 
If the model version
+   * does not exist, return false. If the model version is deleted, return 
true.
+   *
+   * @param ident The name identifier of the model.
+   * @param alias The version alias of the model.
+   * @return True if the model version is deleted, false if the model version 
does not exist.
+   */
+  boolean deleteModelVersion(NameIdentifier ident, String alias);
+}
diff --git a/api/src/main/java/org/apache/gravitino/model/ModelVersion.java 
b/api/src/main/java/org/apache/gravitino/model/ModelVersion.java
new file mode 100644
index 000000000..2557c8607
--- /dev/null
+++ b/api/src/main/java/org/apache/gravitino/model/ModelVersion.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.model;
+
+import java.util.Collections;
+import java.util.Map;
+import org.apache.gravitino.Auditable;
+import org.apache.gravitino.annotation.Evolving;
+
+/**
+ * An interface representing a single model checkpoint under a model {@link 
Model}. A model version
+ * is a snapshot at a point of time of a model artifact in ML. Users can link 
a model version to a
+ * registered model.
+ */
+@Evolving
+public interface ModelVersion extends Auditable {
+
+  /**
+   * The version of this model object. The version number is an integer number 
starts from 0. Each
+   * time the model checkpoint / snapshot is linked to the registered, the 
version number will be
+   * increased by 1.
+   *
+   * @return The version of the model object.
+   */
+  int version();
+
+  /**
+   * The comment of this model version. This comment can be different from the 
comment of the model
+   * to provide more detailed information about this version.
+   *
+   * @return The comment of the model version. Null is returned if no comment 
is set.
+   */
+  default String comment() {
+    return null;
+  }
+
+  /**
+   * The aliases of this model version. The aliases are the alternative names 
of the model version.
+   * The aliases are optional. The aliases are unique for a model version. If 
the alias is already
+   * set to one model version, it cannot be set to another model version.
+   *
+   * @return The aliases of the model version.
+   */
+  String[] aliases();
+
+  /**
+   * The URI of the model artifact. The URI is the location of the model 
artifact. The URI can be a
+   * file path or a remote URI.
+   *
+   * @return The URI of the model artifact.
+   */
+  String uri();
+
+  /**
+   * The properties of the model version. The properties are key-value pairs 
that can be used to
+   * store additional information of the model version. The properties are 
optional.
+   *
+   * @return the properties of the model version.
+   */
+  default Map<String, String> properties() {
+    return Collections.emptyMap();
+  }
+}

Reply via email to