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 <35593236+singhpk...@users.noreply.github.com> 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