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

yuqi4733 pushed a commit to branch branch-1.2
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/branch-1.2 by this push:
     new 4e5188f947 [Cherry-pick to branch-1.2] [#10444] fix(core): batchSelect 
queries missing version-info JOIN and field aliases (#10451) (#10460)
4e5188f947 is described below

commit 4e5188f9476bcfd2d0ab464a9fbf4290023e9676
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Wed Mar 18 11:02:15 2026 +0800

    [Cherry-pick to branch-1.2] [#10444] fix(core): batchSelect queries missing 
version-info JOIN and field aliases (#10451) (#10460)
    
    **Cherry-pick Information:**
    - Original commit: 421b43d65d4517d7a0bc09aef9f8578ee88ba047
    - Target branch: `branch-1.2`
    - Status: ✅ Clean cherry-pick (no conflicts)
    
    Co-authored-by: Jerry Shao <[email protected]>
---
 .../storage/relational/mapper/JobMetaMapper.java   |   6 -
 .../mapper/JobMetaSQLProviderFactory.java          |   7 --
 .../provider/base/JobMetaBaseSQLProvider.java      |  28 -----
 .../provider/base/TableMetaBaseSQLProvider.java    |  23 +++-
 .../relational/service/TestTableMetaService.java   | 125 +++++++++++++++++++++
 5 files changed, 142 insertions(+), 47 deletions(-)

diff --git 
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/JobMetaMapper.java
 
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/JobMetaMapper.java
index 66ed42469e..7bfe738595 100644
--- 
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/JobMetaMapper.java
+++ 
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/JobMetaMapper.java
@@ -74,10 +74,4 @@ public interface JobMetaMapper {
   @SelectProvider(type = JobMetaSQLProviderFactory.class, method = 
"batchSelectJobByRunIds")
   List<JobPO> batchSelectJobByRunIds(
       @Param("metalakeName") String metalakeName, @Param("jobRunIds") 
List<Long> jobRunIds);
-
-  @SelectProvider(type = JobMetaSQLProviderFactory.class, method = 
"batchSelectJobByIdentifier")
-  List<JobPO> batchSelectJobByIdentifier(
-      @Param("metalakeName") String metalakeName,
-      @Param("jobTemplateName") String jobTemplateName,
-      @Param("jobNames") List<String> jobNames);
 }
diff --git 
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/JobMetaSQLProviderFactory.java
 
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/JobMetaSQLProviderFactory.java
index 35e0839572..269e652504 100644
--- 
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/JobMetaSQLProviderFactory.java
+++ 
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/JobMetaSQLProviderFactory.java
@@ -104,11 +104,4 @@ public class JobMetaSQLProviderFactory {
       @Param("metalakeName") String metalakeName, @Param("jobRunIds") 
List<Long> jobRunIds) {
     return getProvider().batchSelectJobByRunIds(metalakeName, jobRunIds);
   }
-
-  public static String batchSelectJobByIdentifier(
-      @Param("metalakeName") String metalakeName,
-      @Param("jobTemplateName") String jobTemplateName,
-      @Param("jobNames") List<String> jobNames) {
-    return getProvider().batchSelectJobByIdentifier(metalakeName, 
jobTemplateName, jobNames);
-  }
 }
diff --git 
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/JobMetaBaseSQLProvider.java
 
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/JobMetaBaseSQLProvider.java
index 3c4c88ae59..054c093311 100644
--- 
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/JobMetaBaseSQLProvider.java
+++ 
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/JobMetaBaseSQLProvider.java
@@ -183,34 +183,6 @@ public class JobMetaBaseSQLProvider {
         + " WHERE deleted_at < #{legacyTimeline} AND deleted_at > 0 LIMIT 
#{limit}";
   }
 
-  public String batchSelectJobByIdentifier(
-      @Param("metalakeName") String metalakeName,
-      @Param("jobTemplateName") String jobTemplateName,
-      @Param("jobNames") List<String> jobNames) {
-    return "<script>"
-        + "SELECT jm.job_run_id, jm.metalake_id, jm.job_template_id,"
-        + " jm.job_execution_id, jm.job_run_status, jm.job_finished_at,"
-        + " jm.audit_info, jm.current_version, jm.last_version, jm.deleted_at"
-        + " FROM "
-        + JobMetaMapper.TABLE_NAME
-        + " jm"
-        + " JOIN "
-        + JobTemplateMetaMapper.TABLE_NAME
-        + " jtm ON jm.job_template_id = jtm.job_template_id"
-        + " JOIN "
-        + MetalakeMetaMapper.TABLE_NAME
-        + " mm ON jm.metalake_id = mm.metalake_id"
-        + " WHERE mm.metalake_name = #{metalakeName}"
-        + " AND jtm.job_template_name = #{jobTemplateName}"
-        + " AND jm.job_run_id IN ("
-        + "<foreach collection='jobNames' item='jobName' separator=','>"
-        + "#{jobName}"
-        + "</foreach>"
-        + " )"
-        + " AND jm.deleted_at = 0 AND jtm.deleted_at = 0 AND mm.deleted_at = 0"
-        + "</script>";
-  }
-
   public String batchSelectJobByRunIds(
       @Param("metalakeName") String metalakeName, @Param("jobRunIds") 
List<Long> jobRunIds) {
     return "<script>"
diff --git 
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/TableMetaBaseSQLProvider.java
 
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/TableMetaBaseSQLProvider.java
index 6770ebbc2e..60d8bf0d51 100644
--- 
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/TableMetaBaseSQLProvider.java
+++ 
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/TableMetaBaseSQLProvider.java
@@ -350,19 +350,30 @@ public class TableMetaBaseSQLProvider {
             tm.table_id AS tableId,
             tm.table_name AS tableName,
             tm.metalake_id AS metalakeId,
+            tm.catalog_id AS catalogId,
+            tm.schema_id AS schemaId,
             tm.audit_info AS auditInfo,
             tm.current_version AS currentVersion,
             tm.last_version AS lastVersion,
-            tm.deleted_at AS deletedAt
-            FROM %s tm
-            WHERE schema_id = #{schemaId}
-            AND table_name IN
+            tm.deleted_at AS deletedAt,
+            tv.format AS format,
+            tv.properties AS properties,
+            tv.partitioning AS partitions,
+            tv.sort_orders AS sortOrders,
+            tv.distribution AS distribution,
+            tv.indexes AS indexes,
+            tv.comment AS comment
+            FROM %s tm LEFT JOIN %s tv
+            ON tm.table_id = tv.table_id AND tm.current_version = tv.version
+            AND tv.deleted_at = 0
+            WHERE tm.schema_id = #{schemaId}
+            AND tm.table_name IN
             <foreach collection="tableNames" item="tableName" open="(" 
separator="," close=")">
             #{tableName}
             </foreach>
-             AND deleted_at = 0
+             AND tm.deleted_at = 0
              </script>
             """
-        .formatted(TABLE_NAME);
+        .formatted(TABLE_NAME, TableVersionMapper.TABLE_NAME);
   }
 }
diff --git 
a/core/src/test/java/org/apache/gravitino/storage/relational/service/TestTableMetaService.java
 
b/core/src/test/java/org/apache/gravitino/storage/relational/service/TestTableMetaService.java
index 9c4eea387a..0c30660818 100644
--- 
a/core/src/test/java/org/apache/gravitino/storage/relational/service/TestTableMetaService.java
+++ 
b/core/src/test/java/org/apache/gravitino/storage/relational/service/TestTableMetaService.java
@@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import com.google.common.collect.ImmutableMap;
 import java.io.IOException;
 import java.time.Instant;
 import java.util.List;
@@ -30,6 +31,7 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 import org.apache.gravitino.Entity;
 import org.apache.gravitino.EntityAlreadyExistsException;
+import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.Namespace;
 import org.apache.gravitino.exceptions.NoSuchEntityException;
 import org.apache.gravitino.meta.BaseMetalake;
@@ -37,7 +39,19 @@ import org.apache.gravitino.meta.CatalogEntity;
 import org.apache.gravitino.meta.ColumnEntity;
 import org.apache.gravitino.meta.SchemaEntity;
 import org.apache.gravitino.meta.TableEntity;
+import org.apache.gravitino.rel.Table;
+import org.apache.gravitino.rel.expressions.NamedReference;
+import org.apache.gravitino.rel.expressions.distributions.Distribution;
+import org.apache.gravitino.rel.expressions.distributions.Distributions;
+import org.apache.gravitino.rel.expressions.distributions.Strategy;
 import org.apache.gravitino.rel.expressions.literals.Literals;
+import org.apache.gravitino.rel.expressions.sorts.SortDirection;
+import org.apache.gravitino.rel.expressions.sorts.SortOrder;
+import org.apache.gravitino.rel.expressions.sorts.SortOrders;
+import org.apache.gravitino.rel.expressions.transforms.Transform;
+import org.apache.gravitino.rel.expressions.transforms.Transforms;
+import org.apache.gravitino.rel.indexes.Index;
+import org.apache.gravitino.rel.indexes.Indexes;
 import org.apache.gravitino.rel.types.Types;
 import org.apache.gravitino.storage.RandomIdGenerator;
 import org.apache.gravitino.storage.relational.TestJDBCBackend;
@@ -235,6 +249,117 @@ public class TestTableMetaService extends TestJDBCBackend 
{
     compareTwoColumns(updatedTable2.columns(), retrievedTable2.columns());
   }
 
+  @TestTemplate
+  public void testBatchGetTableByIdentifierIncludesVersionInfoFields() throws 
IOException {
+    createAndInsertMakeLake(metalakeName);
+    createAndInsertCatalog(metalakeName, catalogName);
+    createAndInsertSchema(metalakeName, catalogName, schemaName);
+
+    Map<String, String> tableProps =
+        ImmutableMap.of(Table.PROPERTY_TABLE_FORMAT, "delta", "location", 
"s3://bucket/path");
+    Distribution distribution = Distributions.of(Strategy.HASH, 4, 
NamedReference.field("col1"));
+    SortOrder[] sortOrders =
+        new SortOrder[] {SortOrders.of(NamedReference.field("col1"), 
SortDirection.ASCENDING)};
+    Transform[] partitioning = new Transform[] {Transforms.identity("col2")};
+    Index[] indexes = new Index[] {Indexes.primary("pk", new String[][] 
{{"col1"}})};
+
+    TableEntity table =
+        TableEntity.builder()
+            .withId(RandomIdGenerator.INSTANCE.nextId())
+            .withName("delta_table")
+            .withNamespace(NamespaceUtil.ofTable(metalakeName, catalogName, 
schemaName))
+            .withProperties(tableProps)
+            .withComment("test table comment")
+            .withDistribution(distribution)
+            .withSortOrders(sortOrders)
+            .withPartitioning(partitioning)
+            .withIndexes(indexes)
+            .withAuditInfo(AUDIT_INFO)
+            .build();
+    TableMetaService.getInstance().insertTable(table, false);
+
+    NameIdentifier tableIdent =
+        NameIdentifier.of(metalakeName, catalogName, schemaName, 
"delta_table");
+    List<TableEntity> results =
+        
TableMetaService.getInstance().batchGetTableByIdentifier(List.of(tableIdent));
+
+    Assertions.assertEquals(1, results.size());
+    TableEntity result = results.get(0);
+
+    // Verify properties (including format) are returned
+    Assertions.assertNotNull(result.properties());
+    Assertions.assertEquals("delta", 
result.properties().get(Table.PROPERTY_TABLE_FORMAT));
+    Assertions.assertEquals("s3://bucket/path", 
result.properties().get("location"));
+
+    // Verify comment is returned
+    Assertions.assertEquals("test table comment", result.comment());
+
+    // Verify distribution is returned
+    Assertions.assertNotNull(result.distribution());
+    Assertions.assertEquals(distribution, result.distribution());
+
+    // Verify sort orders are returned
+    Assertions.assertNotNull(result.sortOrders());
+    Assertions.assertArrayEquals(sortOrders, result.sortOrders());
+
+    // Verify partitioning is returned — compare field references since 
serialization may change
+    // the concrete implementation class (e.g., IdentityTransform -> 
IdentityPartitioningDTO)
+    Assertions.assertNotNull(result.partitioning());
+    Assertions.assertEquals(partitioning.length, result.partitioning().length);
+    Assertions.assertEquals(
+        ((NamedReference.FieldReference) 
partitioning[0].references()[0]).fieldName()[0],
+        ((NamedReference.FieldReference) 
result.partitioning()[0].references()[0]).fieldName()[0]);
+
+    // Verify indexes are returned
+    Assertions.assertNotNull(result.indexes());
+    Assertions.assertArrayEquals(indexes, result.indexes());
+  }
+
+  @TestTemplate
+  public void testBatchGetTableByIdentifierDoesNotIncludeColumns() throws 
IOException {
+    createAndInsertMakeLake(metalakeName);
+    createAndInsertCatalog(metalakeName, catalogName);
+    createAndInsertSchema(metalakeName, catalogName, schemaName);
+
+    ColumnEntity column =
+        ColumnEntity.builder()
+            .withId(RandomIdGenerator.INSTANCE.nextId())
+            .withName("col1")
+            .withPosition(0)
+            .withDataType(Types.IntegerType.get())
+            .withNullable(true)
+            .withAutoIncrement(false)
+            .withAuditInfo(AUDIT_INFO)
+            .build();
+    TableEntity table =
+        TableEntity.builder()
+            .withId(RandomIdGenerator.INSTANCE.nextId())
+            .withName("table_with_columns")
+            .withNamespace(NamespaceUtil.ofTable(metalakeName, catalogName, 
schemaName))
+            .withColumns(List.of(column))
+            .withAuditInfo(AUDIT_INFO)
+            .build();
+    TableMetaService.getInstance().insertTable(table, false);
+
+    // Verify getTableByIdentifier (single-get path) returns columns
+    TableEntity singleGetResult =
+        TableMetaService.getInstance()
+            .getTableByIdentifier(
+                NameIdentifier.of(metalakeName, catalogName, schemaName, 
"table_with_columns"));
+    Assertions.assertEquals(1, singleGetResult.columns().size());
+
+    // batchGetTableByIdentifier does not fetch columns (separate 
table_column_meta table)
+    NameIdentifier tableIdent =
+        NameIdentifier.of(metalakeName, catalogName, schemaName, 
"table_with_columns");
+    List<TableEntity> results =
+        
TableMetaService.getInstance().batchGetTableByIdentifier(List.of(tableIdent));
+
+    Assertions.assertEquals(1, results.size());
+    Assertions.assertTrue(
+        results.get(0).columns().isEmpty(),
+        "batchGetTableByIdentifier does not fetch columns from 
table_column_meta");
+  }
+
   private void compareTwoColumns(
       List<ColumnEntity> expectedColumns, List<ColumnEntity> actualColumns) {
     Assertions.assertEquals(expectedColumns.size(), actualColumns.size());

Reply via email to