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

jshao 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 b8a087a400 [#9792] improvement(lance): Add dataset version handling in 
table operations (#9793)
b8a087a400 is described below

commit b8a087a400d44c387128dd4531b408124dd06279
Author: Mini Yu <[email protected]>
AuthorDate: Wed Jan 28 03:05:54 2026 +0800

    [#9792] improvement(lance): Add dataset version handling in table 
operations (#9793)
    
    ### What changes were proposed in this pull request?
    
    This pull request introduces support for tracking and returning the
    version of a Lance table throughout its creation and description APIs.
    The changes ensure that the table version is stored as a property,
    propagated through responses, and verified in integration tests.
    
    ### Why are the changes needed?
    
    Make APIs in the Lance REST server according to the docs.
    
    Fix: #9792
    
    ### Does this PR introduce _any_ user-facing change?
    
    N/A.
    
    ### How was this patch tested?
    
    ITs
---
 .../catalog/lakehouse/lance/LanceTableOperations.java  | 18 +++++++++++++++++-
 .../ops/gravitino/GravitinoLanceTableOperations.java   | 11 +++++++++--
 .../gravitino/lance/common/utils/LanceConstants.java   |  1 +
 .../lance/integration/test/LanceRESTServiceIT.java     |  2 ++
 4 files changed, 29 insertions(+), 3 deletions(-)

diff --git 
a/catalogs/catalog-lakehouse-generic/src/main/java/org/apache/gravitino/catalog/lakehouse/lance/LanceTableOperations.java
 
b/catalogs/catalog-lakehouse-generic/src/main/java/org/apache/gravitino/catalog/lakehouse/lance/LanceTableOperations.java
index e5f0519a20..d702843819 100644
--- 
a/catalogs/catalog-lakehouse-generic/src/main/java/org/apache/gravitino/catalog/lakehouse/lance/LanceTableOperations.java
+++ 
b/catalogs/catalog-lakehouse-generic/src/main/java/org/apache/gravitino/catalog/lakehouse/lance/LanceTableOperations.java
@@ -22,6 +22,7 @@ import static 
org.apache.gravitino.lance.common.utils.LanceConstants.LANCE_CREAT
 import static 
org.apache.gravitino.lance.common.utils.LanceConstants.LANCE_TABLE_REGISTER;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
 import com.lancedb.lance.Dataset;
 import com.lancedb.lance.WriteParams;
 import com.lancedb.lance.index.DistanceType;
@@ -260,6 +261,8 @@ public class LanceTableOperations extends 
ManagedTableOperations {
       throws NoSuchSchemaException, TableAlreadyExistsException {
 
     if (register) {
+      // Currently, register operation does not read the schema from the 
underlying Lance dataset.
+      // So we can't get the version of the dataset here.
       return super.createTable(
           ident, columns, comment, properties, partitions, distribution, 
sortOrders, indexes);
     }
@@ -285,8 +288,21 @@ public class LanceTableOperations extends 
ManagedTableOperations {
             new 
WriteParams.Builder().withStorageOptions(storageProps).build())) {
       // Only create the table metadata in Gravitino after the Lance dataset 
is successfully
       // created.
+      long datasetVersion = ignored.version();
+      Map<String, String> updatedProperties =
+          ImmutableMap.<String, String>builder()
+              .putAll(properties)
+              .put(LanceConstants.LANCE_TABLE_VERSION, 
String.valueOf(datasetVersion))
+              .build();
       return super.createTable(
-          ident, columns, comment, properties, partitions, distribution, 
sortOrders, indexes);
+          ident,
+          columns,
+          comment,
+          updatedProperties,
+          partitions,
+          distribution,
+          sortOrders,
+          indexes);
     } catch (NoSuchSchemaException e) {
       throw e;
     } catch (TableAlreadyExistsException e) {
diff --git 
a/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/ops/gravitino/GravitinoLanceTableOperations.java
 
b/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/ops/gravitino/GravitinoLanceTableOperations.java
index f94ffdcdbd..66dae0e017 100644
--- 
a/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/ops/gravitino/GravitinoLanceTableOperations.java
+++ 
b/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/ops/gravitino/GravitinoLanceTableOperations.java
@@ -24,6 +24,7 @@ import static 
org.apache.gravitino.lance.common.utils.LanceConstants.LANCE_CREAT
 import static 
org.apache.gravitino.lance.common.utils.LanceConstants.LANCE_LOCATION;
 import static 
org.apache.gravitino.lance.common.utils.LanceConstants.LANCE_TABLE_CREATE_EMPTY;
 import static 
org.apache.gravitino.lance.common.utils.LanceConstants.LANCE_TABLE_FORMAT;
+import static 
org.apache.gravitino.lance.common.utils.LanceConstants.LANCE_TABLE_VERSION;
 import static org.apache.gravitino.rel.Column.DEFAULT_VALUE_NOT_SET;
 
 import com.google.common.base.Preconditions;
@@ -92,7 +93,10 @@ public class GravitinoLanceTableOperations implements 
LanceTableOperations {
     response.setProperties(table.properties());
     response.setLocation(table.properties().get(LANCE_LOCATION));
     response.setSchema(toJsonArrowSchema(table.columns()));
-    response.setVersion(null);
+    response.setVersion(
+        Optional.ofNullable(table.properties().get(LANCE_TABLE_VERSION))
+            .map(Long::valueOf)
+            .orElse(null));
     
response.setStorageOptions(LancePropertiesUtils.getLanceStorageOptions(table.properties()));
     return response;
   }
@@ -147,7 +151,10 @@ public class GravitinoLanceTableOperations implements 
LanceTableOperations {
     // Extract storage options from table properties. All storage options 
stores in table
     // properties.
     
response.setStorageOptions(LancePropertiesUtils.getLanceStorageOptions(t.properties()));
-    response.setVersion(null);
+    response.setVersion(
+        Optional.ofNullable(t.properties().get(LANCE_TABLE_VERSION))
+            .map(Long::valueOf)
+            .orElse(null));
     response.setLocation(t.properties().get(LANCE_LOCATION));
     response.setProperties(t.properties());
     return response;
diff --git 
a/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/utils/LanceConstants.java
 
b/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/utils/LanceConstants.java
index 3dd5e6fd60..991c6b8f26 100644
--- 
a/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/utils/LanceConstants.java
+++ 
b/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/utils/LanceConstants.java
@@ -37,6 +37,7 @@ public class LanceConstants {
 
   public static final String LANCE_TABLE_REGISTER = "lance.register";
 
+  public static final String LANCE_TABLE_VERSION = "lance.version";
   // Mark whether it is to create an empty Lance table(no data files)
   public static final String LANCE_TABLE_CREATE_EMPTY = "lance.create-empty";
 
diff --git 
a/lance/lance-rest-server/src/test/java/org/apache/gravitino/lance/integration/test/LanceRESTServiceIT.java
 
b/lance/lance-rest-server/src/test/java/org/apache/gravitino/lance/integration/test/LanceRESTServiceIT.java
index 2060d93dfd..51ffb0cfb8 100644
--- 
a/lance/lance-rest-server/src/test/java/org/apache/gravitino/lance/integration/test/LanceRESTServiceIT.java
+++ 
b/lance/lance-rest-server/src/test/java/org/apache/gravitino/lance/integration/test/LanceRESTServiceIT.java
@@ -500,12 +500,14 @@ public class LanceRESTServiceIT extends BaseIT {
     Assertions.assertEquals("v1", response.getProperties().get("key1"));
     Assertions.assertEquals("value_a", response.getStorageOptions().get("a"));
     Assertions.assertEquals("value_b", response.getStorageOptions().get("b"));
+    Assertions.assertNotNull(response.getVersion());
 
     DescribeTableRequest describeTableRequest = new DescribeTableRequest();
     describeTableRequest.setId(ids);
     DescribeTableResponse loadTable = ns.describeTable(describeTableRequest);
     Assertions.assertNotNull(loadTable);
     Assertions.assertEquals(location, loadTable.getLocation());
+    Assertions.assertNotNull(loadTable.getVersion());
 
     List<JsonArrowField> jsonArrowFields = loadTable.getSchema().getFields();
     for (int i = 0; i < jsonArrowFields.size(); i++) {

Reply via email to