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

yuqi4733 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 ca7175e067 [#4024]Refactor: Reduce unnecessary queries in catalog JDBC 
implementation (#6540)
ca7175e067 is described below

commit ca7175e06776de0b99cc68c0b9b8452d5a1e9c57
Author: Zhengke Zhou <madzh...@gmail.com>
AuthorDate: Fri Apr 11 14:18:25 2025 +0800

    [#4024]Refactor: Reduce unnecessary queries in catalog JDBC implementation 
(#6540)
    
    ### What changes were proposed in this pull request?
    
    For queries involving more related tables, use a JOIN operation instead
    of executing separate queries to retrieve the results.
    
    ### Why are the changes needed?
    There are many unnecessary query operations, and the two tables can be
    directly associated to reduce these operations.
    
    Part of: #4024
    
    ### Does this PR introduce _any_ user-facing change?
    
    no
    
    ### How was this patch tested?
    
    unit tests & backend intergation tests
---
 .../relational/mapper/CatalogMetaMapper.java       | 13 +++++++
 .../mapper/CatalogMetaSQLProviderFactory.java      | 14 +++++++
 .../provider/base/CatalogMetaBaseSQLProvider.java  | 43 ++++++++++++++++++++++
 .../relational/service/CatalogMetaService.java     | 43 +++++++++++++---------
 .../storage/relational/TestJDBCBackend.java        | 27 ++++++++++++++
 5 files changed, 122 insertions(+), 18 deletions(-)

diff --git 
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/CatalogMetaMapper.java
 
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/CatalogMetaMapper.java
index f74be4275e..90a86e26cc 100644
--- 
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/CatalogMetaMapper.java
+++ 
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/CatalogMetaMapper.java
@@ -39,6 +39,11 @@ import org.apache.ibatis.annotations.UpdateProvider;
 public interface CatalogMetaMapper {
   String TABLE_NAME = "catalog_meta";
 
+  @SelectProvider(
+      type = CatalogMetaSQLProviderFactory.class,
+      method = "listCatalogPOsByMetalakeName")
+  List<CatalogPO> listCatalogPOsByMetalakeName(@Param("metalakeName") String 
metalakeName);
+
   @SelectProvider(type = CatalogMetaSQLProviderFactory.class, method = 
"listCatalogPOsByMetalakeId")
   List<CatalogPO> listCatalogPOsByMetalakeId(@Param("metalakeId") Long 
metalakeId);
 
@@ -51,12 +56,20 @@ public interface CatalogMetaMapper {
   Long selectCatalogIdByMetalakeIdAndName(
       @Param("metalakeId") Long metalakeId, @Param("catalogName") String name);
 
+  @SelectProvider(type = CatalogMetaSQLProviderFactory.class, method = 
"selectCatalogIdByName")
+  Long selectCatalogIdByName(
+      @Param("metalakeName") String metalakeName, @Param("catalogName") String 
name);
+
   @SelectProvider(
       type = CatalogMetaSQLProviderFactory.class,
       method = "selectCatalogMetaByMetalakeIdAndName")
   CatalogPO selectCatalogMetaByMetalakeIdAndName(
       @Param("metalakeId") Long metalakeId, @Param("catalogName") String name);
 
+  @SelectProvider(type = CatalogMetaSQLProviderFactory.class, method = 
"selectCatalogMetaByName")
+  CatalogPO selectCatalogMetaByName(
+      @Param("metalakeName") String metalakeName, @Param("catalogName") String 
catalogName);
+
   @SelectProvider(type = CatalogMetaSQLProviderFactory.class, method = 
"selectCatalogMetaById")
   CatalogPO selectCatalogMetaById(@Param("catalogId") Long catalogId);
 
diff --git 
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/CatalogMetaSQLProviderFactory.java
 
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/CatalogMetaSQLProviderFactory.java
index e54a1481b1..9d81957617 100644
--- 
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/CatalogMetaSQLProviderFactory.java
+++ 
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/CatalogMetaSQLProviderFactory.java
@@ -53,6 +53,10 @@ public class CatalogMetaSQLProviderFactory {
 
   static class CatalogMetaH2Provider extends CatalogMetaBaseSQLProvider {}
 
+  public static String listCatalogPOsByMetalakeName(@Param("metalakeName") 
String metalakeName) {
+    return getProvider().listCatalogPOsByMetalakeName(metalakeName);
+  }
+
   public static String listCatalogPOsByMetalakeId(@Param("metalakeId") Long 
metalakeId) {
     return getProvider().listCatalogPOsByMetalakeId(metalakeId);
   }
@@ -61,6 +65,11 @@ public class CatalogMetaSQLProviderFactory {
     return getProvider().listCatalogPOsByCatalogIds(catalogIds);
   }
 
+  public static String selectCatalogIdByName(
+      @Param("metalakeName") String metalakeName, @Param("catalogName") String 
catalogName) {
+    return getProvider().selectCatalogIdByName(metalakeName, catalogName);
+  }
+
   public static String selectCatalogIdByMetalakeIdAndName(
       @Param("metalakeId") Long metalakeId, @Param("catalogName") String name) 
{
     return getProvider().selectCatalogIdByMetalakeIdAndName(metalakeId, name);
@@ -71,6 +80,11 @@ public class CatalogMetaSQLProviderFactory {
     return getProvider().selectCatalogMetaByMetalakeIdAndName(metalakeId, 
name);
   }
 
+  public static String selectCatalogMetaByName(
+      @Param("metalakeName") String metalakeName, @Param("catalogName") String 
catalogName) {
+    return getProvider().selectCatalogMetaByName(metalakeName, catalogName);
+  }
+
   public static String selectCatalogIdByMetalakeNameAndCatalogName(
       @Param("metalakeName") String metalakeName, @Param("catalogName") String 
catalogName) {
     return 
getProvider().selectCatalogIdByMetalakeNameAndCatalogName(metalakeName, 
catalogName);
diff --git 
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/CatalogMetaBaseSQLProvider.java
 
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/CatalogMetaBaseSQLProvider.java
index 6a62044cbf..53d22eca25 100644
--- 
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/CatalogMetaBaseSQLProvider.java
+++ 
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/base/CatalogMetaBaseSQLProvider.java
@@ -22,10 +22,26 @@ package 
org.apache.gravitino.storage.relational.mapper.provider.base;
 import static 
org.apache.gravitino.storage.relational.mapper.CatalogMetaMapper.TABLE_NAME;
 
 import java.util.List;
+import org.apache.gravitino.storage.relational.mapper.MetalakeMetaMapper;
 import org.apache.gravitino.storage.relational.po.CatalogPO;
 import org.apache.ibatis.annotations.Param;
 
 public class CatalogMetaBaseSQLProvider {
+  public String listCatalogPOsByMetalakeName(@Param("metalakeName") String 
metalakeName) {
+    return "SELECT cm.catalog_id as catalogId, cm.catalog_name as catalogName,"
+        + " cm.metalake_id as metalakeId, cm.type, cm.provider,"
+        + " cm.catalog_comment as catalogComment, cm.properties, cm.audit_info 
as auditInfo,"
+        + " cm.current_version as currentVersion, cm.last_version as 
lastVersion,"
+        + " cm.deleted_at as deletedAt"
+        + " FROM "
+        + TABLE_NAME
+        + " cm JOIN "
+        + MetalakeMetaMapper.TABLE_NAME
+        + " mm ON cm.metalake_id = mm.metalake_id"
+        + " WHERE mm.metalake_name = #{metalakeName}"
+        + " AND mm.deleted_at = 0 AND cm.deleted_at = 0";
+  }
+
   public String listCatalogPOsByMetalakeId(@Param("metalakeId") Long 
metalakeId) {
     return "SELECT catalog_id as catalogId, catalog_name as catalogName,"
         + " metalake_id as metalakeId, type, provider,"
@@ -55,6 +71,17 @@ public class CatalogMetaBaseSQLProvider {
         + "</script>";
   }
 
+  public String selectCatalogIdByName(
+      @Param("metalakeName") String metalakeName, @Param("catalogName") String 
catalogName) {
+    return "SELECT cm.catalog_id as catalogId FROM "
+        + TABLE_NAME
+        + " cm JOIN "
+        + MetalakeMetaMapper.TABLE_NAME
+        + " mm ON cm.metalake_id = mm.metalake_id"
+        + " WHERE catalog_name = #{catalogName} AND mm.metalake_name = 
#{metalakeName}"
+        + " AND cm.deleted_at = 0 AND mm.deleted_at = 0";
+  }
+
   public String selectCatalogIdByMetalakeIdAndName(
       @Param("metalakeId") Long metalakeId, @Param("catalogName") String name) 
{
     return "SELECT catalog_id as catalogId FROM "
@@ -74,6 +101,22 @@ public class CatalogMetaBaseSQLProvider {
         + " WHERE metalake_id = #{metalakeId} AND catalog_name = 
#{catalogName} AND deleted_at = 0";
   }
 
+  public String selectCatalogMetaByName(
+      @Param("metalakeName") String metalakeName, @Param("catalogName") String 
catalogName) {
+    return "SELECT cm.catalog_id as catalogId, cm.catalog_name as catalogName,"
+        + " cm.metalake_id as metalakeId, cm.type, cm.provider,"
+        + " cm.catalog_comment as catalogComment, cm.properties, cm.audit_info 
as auditInfo,"
+        + " cm.current_version as currentVersion, cm.last_version as 
lastVersion,"
+        + " cm.deleted_at as deletedAt"
+        + " FROM "
+        + TABLE_NAME
+        + " cm JOIN "
+        + MetalakeMetaMapper.TABLE_NAME
+        + " mm ON cm.metalake_id = mm.metalake_id"
+        + " WHERE cm.catalog_name = #{catalogName} AND mm.metalake_name = 
#{metalakeName}"
+        + " AND cm.deleted_at = 0 AND mm.deleted_at = 0";
+  }
+
   public String selectCatalogIdByMetalakeNameAndCatalogName(
       @Param("metalakeName") String metalakeName, @Param("catalogName") String 
catalogName) {
     return "SELECT me.metalake_id as metalakeId, ca.catalog_id as catalogId 
FROM "
diff --git 
a/core/src/main/java/org/apache/gravitino/storage/relational/service/CatalogMetaService.java
 
b/core/src/main/java/org/apache/gravitino/storage/relational/service/CatalogMetaService.java
index 71b700e1b5..16b328c351 100644
--- 
a/core/src/main/java/org/apache/gravitino/storage/relational/service/CatalogMetaService.java
+++ 
b/core/src/main/java/org/apache/gravitino/storage/relational/service/CatalogMetaService.java
@@ -66,11 +66,11 @@ public class CatalogMetaService {
 
   private CatalogMetaService() {}
 
-  public CatalogPO getCatalogPOByMetalakeIdAndName(Long metalakeId, String 
catalogName) {
+  public CatalogPO getCatalogPOByName(String metalakeName, String catalogName) 
{
     CatalogPO catalogPO =
         SessionUtils.getWithoutCommit(
             CatalogMetaMapper.class,
-            mapper -> mapper.selectCatalogMetaByMetalakeIdAndName(metalakeId, 
catalogName));
+            mapper -> mapper.selectCatalogMetaByName(metalakeName, 
catalogName));
 
     if (catalogPO == null) {
       throw new NoSuchEntityException(
@@ -112,26 +112,36 @@ public class CatalogMetaService {
     return catalogId;
   }
 
+  public Long getCatalogIdByName(String metalakeName, String catalogName) {
+    Long catalogId =
+        SessionUtils.doWithCommitAndFetchResult(
+            CatalogMetaMapper.class,
+            mapper -> mapper.selectCatalogIdByName(metalakeName, catalogName));
+
+    if (catalogId == null) {
+      throw new NoSuchEntityException(
+          NoSuchEntityException.NO_SUCH_ENTITY_MESSAGE,
+          Entity.EntityType.CATALOG.name().toLowerCase(),
+          catalogName);
+    }
+    return catalogId;
+  }
+
   public CatalogEntity getCatalogByIdentifier(NameIdentifier identifier) {
     NameIdentifierUtil.checkCatalog(identifier);
     String catalogName = identifier.name();
 
-    Long metalakeId =
-        
CommonMetaService.getInstance().getParentEntityIdByNamespace(identifier.namespace());
-
-    CatalogPO catalogPO = getCatalogPOByMetalakeIdAndName(metalakeId, 
catalogName);
+    CatalogPO catalogPO = getCatalogPOByName(identifier.namespace().level(0), 
catalogName);
 
     return POConverters.fromCatalogPO(catalogPO, identifier.namespace());
   }
 
   public List<CatalogEntity> listCatalogsByNamespace(Namespace namespace) {
     NamespaceUtil.checkCatalog(namespace);
-
-    Long metalakeId = 
CommonMetaService.getInstance().getParentEntityIdByNamespace(namespace);
-
     List<CatalogPO> catalogPOS =
         SessionUtils.getWithoutCommit(
-            CatalogMetaMapper.class, mapper -> 
mapper.listCatalogPOsByMetalakeId(metalakeId));
+            CatalogMetaMapper.class,
+            mapper -> mapper.listCatalogPOsByMetalakeName(namespace.level(0)));
 
     return POConverters.fromCatalogPOs(catalogPOS, namespace);
   }
@@ -165,10 +175,8 @@ public class CatalogMetaService {
     NameIdentifierUtil.checkCatalog(identifier);
 
     String catalogName = identifier.name();
-    Long metalakeId =
-        
CommonMetaService.getInstance().getParentEntityIdByNamespace(identifier.namespace());
 
-    CatalogPO oldCatalogPO = getCatalogPOByMetalakeIdAndName(metalakeId, 
catalogName);
+    CatalogPO oldCatalogPO = 
getCatalogPOByName(identifier.namespace().level(0), catalogName);
 
     CatalogEntity oldCatalogEntity =
         POConverters.fromCatalogPO(oldCatalogPO, identifier.namespace());
@@ -186,7 +194,8 @@ public class CatalogMetaService {
               CatalogMetaMapper.class,
               mapper ->
                   mapper.updateCatalogMeta(
-                      POConverters.updateCatalogPOWithVersion(oldCatalogPO, 
newEntity, metalakeId),
+                      POConverters.updateCatalogPOWithVersion(
+                          oldCatalogPO, newEntity, 
oldCatalogPO.getMetalakeId()),
                       oldCatalogPO));
     } catch (RuntimeException re) {
       ExceptionUtils.checkSQLException(
@@ -204,11 +213,9 @@ public class CatalogMetaService {
   public boolean deleteCatalog(NameIdentifier identifier, boolean cascade) {
     NameIdentifierUtil.checkCatalog(identifier);
 
+    String metalakeName = identifier.namespace().level(0);
     String catalogName = identifier.name();
-    Long metalakeId =
-        
CommonMetaService.getInstance().getParentEntityIdByNamespace(identifier.namespace());
-
-    Long catalogId = getCatalogIdByMetalakeIdAndName(metalakeId, catalogName);
+    long catalogId = getCatalogIdByName(metalakeName, catalogName);
 
     if (cascade) {
       SessionUtils.doMultipleWithCommit(
diff --git 
a/core/src/test/java/org/apache/gravitino/storage/relational/TestJDBCBackend.java
 
b/core/src/test/java/org/apache/gravitino/storage/relational/TestJDBCBackend.java
index 98bd74fe05..332c082e77 100644
--- 
a/core/src/test/java/org/apache/gravitino/storage/relational/TestJDBCBackend.java
+++ 
b/core/src/test/java/org/apache/gravitino/storage/relational/TestJDBCBackend.java
@@ -29,6 +29,7 @@ import static 
org.apache.gravitino.Configs.ENTITY_RELATIONAL_STORE;
 import static org.apache.gravitino.Configs.ENTITY_STORE;
 import static org.apache.gravitino.Configs.RELATIONAL_ENTITY_STORE;
 import static org.apache.gravitino.SupportsRelationOperations.Type.OWNER_REL;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -81,8 +82,10 @@ import org.apache.gravitino.meta.TagEntity;
 import org.apache.gravitino.meta.TopicEntity;
 import org.apache.gravitino.meta.UserEntity;
 import org.apache.gravitino.storage.RandomIdGenerator;
+import org.apache.gravitino.storage.relational.mapper.CatalogMetaMapper;
 import org.apache.gravitino.storage.relational.mapper.GroupMetaMapper;
 import org.apache.gravitino.storage.relational.mapper.UserMetaMapper;
+import org.apache.gravitino.storage.relational.service.CatalogMetaService;
 import org.apache.gravitino.storage.relational.service.MetalakeMetaService;
 import org.apache.gravitino.storage.relational.service.RoleMetaService;
 import org.apache.gravitino.storage.relational.session.SqlSessionFactoryHelper;
@@ -763,6 +766,13 @@ public class TestJDBCBackend {
         backend.list(catalog.namespace(), Entity.EntityType.CATALOG, true);
     assertTrue(catalogs.contains(catalog));
 
+    assertEquals(
+        1,
+        SessionUtils.doWithCommitAndFetchResult(
+                CatalogMetaMapper.class,
+                mapper -> mapper.listCatalogPOsByMetalakeName(metalake.name()))
+            .size());
+
     List<SchemaEntity> schemas = backend.list(schema.namespace(), 
Entity.EntityType.SCHEMA, true);
     assertTrue(schemas.contains(schema));
 
@@ -786,6 +796,16 @@ public class TestJDBCBackend {
     assertEquals(1, 
RoleMetaService.getInstance().listRolesByUserId(user.id()).size());
     assertEquals(1, 
RoleMetaService.getInstance().listRolesByGroupId(group.id()).size());
 
+    CatalogEntity catalogEntity = backend.get(catalog.nameIdentifier(), 
Entity.EntityType.CATALOG);
+    assertEquals(catalog, catalogEntity);
+    assertNotNull(
+        CatalogMetaService.getInstance()
+            .getCatalogPOByName(catalogEntity.namespace().level(0), 
catalog.name()));
+    assertEquals(
+        catalog.id(),
+        CatalogMetaService.getInstance()
+            .getCatalogIdByName(catalog.namespace().level(0), catalog.name()));
+
     UserEntity userEntity = backend.get(user.nameIdentifier(), 
Entity.EntityType.USER);
     assertEquals(user, userEntity);
     assertEquals(
@@ -860,6 +880,13 @@ public class TestJDBCBackend {
     // meta data soft delete
     backend.delete(metalake.nameIdentifier(), Entity.EntityType.METALAKE, 
true);
 
+    assertEquals(
+        0,
+        SessionUtils.doWithCommitAndFetchResult(
+                CatalogMetaMapper.class,
+                mapper -> mapper.listCatalogPOsByMetalakeName(metalake.name()))
+            .size());
+
     // check existence after soft delete
     assertFalse(backend.exists(metalake.nameIdentifier(), 
Entity.EntityType.METALAKE));
     assertTrue(backend.exists(anotherMetaLake.nameIdentifier(), 
Entity.EntityType.METALAKE));

Reply via email to