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 <[email protected]>
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));