This is an automated email from the ASF dual-hosted git repository.
emaynard pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git
The following commit(s) were added to refs/heads/main by this push:
new ef9e2572b JDBC: create objects without reflection (#1434)
ef9e2572b is described below
commit ef9e2572b64a83437ded59f8f02e3d4e9e9b928d
Author: Prashant Singh <[email protected]>
AuthorDate: Thu May 1 13:01:25 2025 -0700
JDBC: create objects without reflection (#1434)
---
.../relational/jdbc/JdbcBasePersistenceImpl.java | 26 ++++++++--------
.../relational/jdbc/QueryGenerator.java | 35 ++++++++--------------
.../impl/relational/jdbc/QueryGeneratorTest.java | 4 +--
3 files changed, 28 insertions(+), 37 deletions(-)
diff --git
a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcBasePersistenceImpl.java
b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcBasePersistenceImpl.java
index f58101b91..0d74011cc 100644
---
a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcBasePersistenceImpl.java
+++
b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcBasePersistenceImpl.java
@@ -266,7 +266,7 @@ public class JdbcBasePersistenceImpl implements
BasePersistence, IntegrationPers
@Nonnull PolarisCallContext callCtx, long catalogId, long entityId, int
typeCode) {
Map<String, Object> params =
Map.of("catalog_id", catalogId, "id", entityId, "type_code", typeCode,
"realm_id", realmId);
- String query = generateSelectQuery(ModelEntity.class, params);
+ String query = generateSelectQuery(new ModelEntity(), params);
return getPolarisBaseEntity(query);
}
@@ -289,7 +289,7 @@ public class JdbcBasePersistenceImpl implements
BasePersistence, IntegrationPers
name,
"realm_id",
realmId);
- String query = generateSelectQuery(ModelEntity.class, params);
+ String query = generateSelectQuery(new ModelEntity(), params);
return getPolarisBaseEntity(query);
}
@@ -410,7 +410,7 @@ public class JdbcBasePersistenceImpl implements
BasePersistence, IntegrationPers
// Limit can't be pushed down, due to client side filtering
// absence of transaction.
- String query = QueryGenerator.generateSelectQuery(ModelEntity.class,
params);
+ String query = QueryGenerator.generateSelectQuery(new ModelEntity(),
params);
try {
List<PolarisBaseEntity> results =
datasourceOperations.executeSelect(
@@ -430,7 +430,7 @@ public class JdbcBasePersistenceImpl implements
BasePersistence, IntegrationPers
Map<String, Object> params =
Map.of("catalog_id", catalogId, "id", entityId, "realm_id", realmId);
- String query = QueryGenerator.generateSelectQuery(ModelEntity.class,
params);
+ String query = QueryGenerator.generateSelectQuery(new ModelEntity(),
params);
PolarisBaseEntity b = getPolarisBaseEntity(query);
return b == null ? 0 : b.getGrantRecordsVersion();
}
@@ -457,7 +457,7 @@ public class JdbcBasePersistenceImpl implements
BasePersistence, IntegrationPers
privilegeCode,
"realm_id",
realmId);
- String query = generateSelectQuery(ModelGrantRecord.class, params);
+ String query = generateSelectQuery(new ModelGrantRecord(), params);
try {
List<PolarisGrantRecord> results =
datasourceOperations.executeSelect(
@@ -492,7 +492,7 @@ public class JdbcBasePersistenceImpl implements
BasePersistence, IntegrationPers
securableId,
"realm_id",
realmId);
- String query = generateSelectQuery(ModelGrantRecord.class, params);
+ String query = generateSelectQuery(new ModelGrantRecord(), params);
try {
List<PolarisGrantRecord> results =
datasourceOperations.executeSelect(
@@ -518,7 +518,7 @@ public class JdbcBasePersistenceImpl implements
BasePersistence, IntegrationPers
Map<String, Object> params =
Map.of(
"grantee_catalog_id", granteeCatalogId, "grantee_id", granteeId,
"realm_id", realmId);
- String query = generateSelectQuery(ModelGrantRecord.class, params);
+ String query = generateSelectQuery(new ModelGrantRecord(), params);
try {
List<PolarisGrantRecord> results =
datasourceOperations.executeSelect(
@@ -550,7 +550,7 @@ public class JdbcBasePersistenceImpl implements
BasePersistence, IntegrationPers
if (optionalEntityType != null) {
params.put("type_code", optionalEntityType.getCode());
}
- String query = generateSelectQuery(ModelEntity.class, params);
+ String query = generateSelectQuery(new ModelEntity(), params);
try {
List<ModelEntity> results =
datasourceOperations.executeSelect(
@@ -569,7 +569,7 @@ public class JdbcBasePersistenceImpl implements
BasePersistence, IntegrationPers
public PolarisPrincipalSecrets loadPrincipalSecrets(
@Nonnull PolarisCallContext callCtx, @Nonnull String clientId) {
Map<String, Object> params = Map.of("principal_client_id", clientId,
"realm_id", realmId);
- String query = generateSelectQuery(ModelPrincipalAuthenticationData.class,
params);
+ String query = generateSelectQuery(new ModelPrincipalAuthenticationData(),
params);
try {
List<PolarisPrincipalSecrets> results =
datasourceOperations.executeSelect(
@@ -828,7 +828,7 @@ public class JdbcBasePersistenceImpl implements
BasePersistence, IntegrationPers
policyCatalogId,
"realm_id",
realmId);
- String query = generateSelectQuery(ModelPolicyMappingRecord.class, params);
+ String query = generateSelectQuery(new ModelPolicyMappingRecord(), params);
List<PolarisPolicyMappingRecord> results =
fetchPolicyMappingRecords(query);
Preconditions.checkState(results.size() <= 1, "More than one policy
mapping records found");
return results.size() == 1 ? results.getFirst() : null;
@@ -851,7 +851,7 @@ public class JdbcBasePersistenceImpl implements
BasePersistence, IntegrationPers
policyTypeCode,
"realm_id",
realmId);
- String query = generateSelectQuery(ModelPolicyMappingRecord.class, params);
+ String query = generateSelectQuery(new ModelPolicyMappingRecord(), params);
return fetchPolicyMappingRecords(query);
}
@@ -861,7 +861,7 @@ public class JdbcBasePersistenceImpl implements
BasePersistence, IntegrationPers
@Nonnull PolarisCallContext callCtx, long targetCatalogId, long
targetId) {
Map<String, Object> params =
Map.of("target_catalog_id", targetCatalogId, "target_id", targetId,
"realm_id", realmId);
- String query = generateSelectQuery(ModelPolicyMappingRecord.class, params);
+ String query = generateSelectQuery(new ModelPolicyMappingRecord(), params);
return fetchPolicyMappingRecords(query);
}
@@ -871,7 +871,7 @@ public class JdbcBasePersistenceImpl implements
BasePersistence, IntegrationPers
@Nonnull PolarisCallContext callCtx, long policyCatalogId, long
policyId) {
Map<String, Object> params =
Map.of("policy_catalog_id", policyCatalogId, "policy_id", policyId,
"realm_id", realmId);
- String query = generateSelectQuery(ModelPolicyMappingRecord.class, params);
+ String query = generateSelectQuery(new ModelPolicyMappingRecord(), params);
return fetchPolicyMappingRecords(query);
}
diff --git
a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/QueryGenerator.java
b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/QueryGenerator.java
index 7d0b5ec92..d8f8d0864 100644
---
a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/QueryGenerator.java
+++
b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/QueryGenerator.java
@@ -20,7 +20,6 @@ package
org.apache.polaris.extension.persistence.relational.jdbc;
import com.google.common.annotations.VisibleForTesting;
import jakarta.annotation.Nonnull;
-import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -34,9 +33,9 @@ import
org.apache.polaris.extension.persistence.relational.jdbc.models.ModelPrin
public class QueryGenerator {
- public static String generateSelectQuery(
- @Nonnull Class<?> entityClass, @Nonnull Map<String, Object> whereClause)
{
- return generateSelectQuery(entityClass, generateWhereClause(whereClause));
+ public static <T> String generateSelectQuery(
+ @Nonnull Converter<T> entity, @Nonnull Map<String, Object> whereClause) {
+ return generateSelectQuery(entity, generateWhereClause(whereClause));
}
public static String generateDeleteQueryForEntityGrantRecords(
@@ -96,7 +95,7 @@ public class QueryGenerator {
condition.append(")");
condition.append(" AND realm_id = '").append(realmId).append("'");
- return generateSelectQuery(ModelEntity.class, " WHERE " + condition);
+ return generateSelectQuery(new ModelEntity(), " WHERE " + condition);
}
public static <T> String generateInsertQuery(
@@ -158,24 +157,16 @@ public class QueryGenerator {
@VisibleForTesting
public static <T> String generateSelectQuery(
- @Nonnull Class<?> entityClass, @Nonnull String filter) {
- String tableName = getTableName(entityClass);
- try {
- Converter<T> entity = (Converter<T>)
entityClass.getDeclaredConstructor().newInstance();
- Map<String, Object> objectMap = entity.toMap();
- String columns = String.join(", ", objectMap.keySet());
- StringBuilder query =
- new StringBuilder("SELECT ").append(columns).append(" FROM
").append(tableName);
- if (!filter.isEmpty()) {
- query.append(filter);
- }
- return query.toString();
- } catch (InstantiationException
- | IllegalAccessException
- | InvocationTargetException
- | NoSuchMethodException e) {
- throw new RuntimeException("Failed to create instance of " +
entityClass.getName(), e);
+ @Nonnull Converter<T> entity, @Nonnull String filter) {
+ String tableName = getTableName(entity.getClass());
+ Map<String, Object> objectMap = entity.toMap();
+ String columns = String.join(", ", objectMap.keySet());
+ StringBuilder query =
+ new StringBuilder("SELECT ").append(columns).append(" FROM
").append(tableName);
+ if (!filter.isEmpty()) {
+ query.append(filter);
}
+ return query.toString();
}
@VisibleForTesting
diff --git
a/extension/persistence/relational-jdbc/src/test/java/org/apache/polaris/extension/persistence/impl/relational/jdbc/QueryGeneratorTest.java
b/extension/persistence/relational-jdbc/src/test/java/org/apache/polaris/extension/persistence/impl/relational/jdbc/QueryGeneratorTest.java
index 653487b47..2f886ac69 100644
---
a/extension/persistence/relational-jdbc/src/test/java/org/apache/polaris/extension/persistence/impl/relational/jdbc/QueryGeneratorTest.java
+++
b/extension/persistence/relational-jdbc/src/test/java/org/apache/polaris/extension/persistence/impl/relational/jdbc/QueryGeneratorTest.java
@@ -47,7 +47,7 @@ public class QueryGeneratorTest {
whereClause.put("entity_version", 1);
String expectedQuery =
"SELECT entity_version, to_purge_timestamp, internal_properties,
catalog_id, purge_timestamp, sub_type_code, create_timestamp,
last_update_timestamp, parent_id, name, id, drop_timestamp, properties,
grant_records_version, type_code FROM POLARIS_SCHEMA.ENTITIES WHERE
entity_version = 1 AND name = 'testEntity'";
- assertEquals(expectedQuery,
QueryGenerator.generateSelectQuery(ModelEntity.class, whereClause));
+ assertEquals(expectedQuery, QueryGenerator.generateSelectQuery(new
ModelEntity(), whereClause));
}
@Test
@@ -199,7 +199,7 @@ public class QueryGeneratorTest {
Map<String, Object> emptyWhereClause = Collections.emptyMap();
assertEquals(
expectedQuery,
- QueryGenerator.generateSelectQuery(ModelEntity.class, " WHERE name =
'testEntity'"));
+ QueryGenerator.generateSelectQuery(new ModelEntity(), " WHERE name =
'testEntity'"));
}
@Test