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 f58101b915..0d74011cc6 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 PolarisBaseEntity lookupEntity( @Nonnull PolarisCallContext callCtx, long catalogId, long entityId, int typeCode) { Map 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 PolarisBaseEntity lookupEntityByName( name, "realm_id", realmId); - String query = generateSelectQuery(ModelEntity.class, params); + String query = generateSelectQuery(new ModelEntity(), params); return getPolarisBaseEntity(query); } @@ -410,7 +410,7 @@ public List listEntities( // 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 results = datasourceOperations.executeSelect( @@ -430,7 +430,7 @@ public int lookupEntityGrantRecordsVersion( Map 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 PolarisGrantRecord lookupGrantRecord( privilegeCode, "realm_id", realmId); - String query = generateSelectQuery(ModelGrantRecord.class, params); + String query = generateSelectQuery(new ModelGrantRecord(), params); try { List results = datasourceOperations.executeSelect( @@ -492,7 +492,7 @@ public List loadAllGrantRecordsOnSecurable( securableId, "realm_id", realmId); - String query = generateSelectQuery(ModelGrantRecord.class, params); + String query = generateSelectQuery(new ModelGrantRecord(), params); try { List results = datasourceOperations.executeSelect( @@ -518,7 +518,7 @@ public List loadAllGrantRecordsOnGrantee( Map 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 results = datasourceOperations.executeSelect( @@ -550,7 +550,7 @@ public boolean hasChildren( if (optionalEntityType != null) { params.put("type_code", optionalEntityType.getCode()); } - String query = generateSelectQuery(ModelEntity.class, params); + String query = generateSelectQuery(new ModelEntity(), params); try { List results = datasourceOperations.executeSelect( @@ -569,7 +569,7 @@ public boolean hasChildren( public PolarisPrincipalSecrets loadPrincipalSecrets( @Nonnull PolarisCallContext callCtx, @Nonnull String clientId) { Map params = Map.of("principal_client_id", clientId, "realm_id", realmId); - String query = generateSelectQuery(ModelPrincipalAuthenticationData.class, params); + String query = generateSelectQuery(new ModelPrincipalAuthenticationData(), params); try { List results = datasourceOperations.executeSelect( @@ -828,7 +828,7 @@ public PolarisPolicyMappingRecord lookupPolicyMappingRecord( policyCatalogId, "realm_id", realmId); - String query = generateSelectQuery(ModelPolicyMappingRecord.class, params); + String query = generateSelectQuery(new ModelPolicyMappingRecord(), params); List 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 List loadPoliciesOnTargetByType( policyTypeCode, "realm_id", realmId); - String query = generateSelectQuery(ModelPolicyMappingRecord.class, params); + String query = generateSelectQuery(new ModelPolicyMappingRecord(), params); return fetchPolicyMappingRecords(query); } @@ -861,7 +861,7 @@ public List loadAllPoliciesOnTarget( @Nonnull PolarisCallContext callCtx, long targetCatalogId, long targetId) { Map 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 List loadAllTargetsOnPolicy( @Nonnull PolarisCallContext callCtx, long policyCatalogId, long policyId) { Map 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 7d0b5ec928..d8f8d0864f 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 @@ 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 @@ public class QueryGenerator { - public static String generateSelectQuery( - @Nonnull Class entityClass, @Nonnull Map whereClause) { - return generateSelectQuery(entityClass, generateWhereClause(whereClause)); + public static String generateSelectQuery( + @Nonnull Converter entity, @Nonnull Map whereClause) { + return generateSelectQuery(entity, generateWhereClause(whereClause)); } public static String generateDeleteQueryForEntityGrantRecords( @@ -96,7 +95,7 @@ public static String generateSelectQueryWithEntityIds( condition.append(")"); condition.append(" AND realm_id = '").append(realmId).append("'"); - return generateSelectQuery(ModelEntity.class, " WHERE " + condition); + return generateSelectQuery(new ModelEntity(), " WHERE " + condition); } public static String generateInsertQuery( @@ -158,24 +157,16 @@ public static String generateDeleteQuery( @VisibleForTesting public static String generateSelectQuery( - @Nonnull Class entityClass, @Nonnull String filter) { - String tableName = getTableName(entityClass); - try { - Converter entity = (Converter) entityClass.getDeclaredConstructor().newInstance(); - Map 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 entity, @Nonnull String filter) { + String tableName = getTableName(entity.getClass()); + Map 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 653487b472..2f886ac69c 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 @@ void testGenerateSelectQuery_withMapWhereClause() { 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 @@ void testGenerateSelectQuery_withFilter() { Map emptyWhereClause = Collections.emptyMap(); assertEquals( expectedQuery, - QueryGenerator.generateSelectQuery(ModelEntity.class, " WHERE name = 'testEntity'")); + QueryGenerator.generateSelectQuery(new ModelEntity(), " WHERE name = 'testEntity'")); } @Test