Skip to content

Commit ef9e257

Browse files
authored
JDBC: create objects without reflection (#1434)
1 parent e1c0a1c commit ef9e257

File tree

3 files changed

+28
-37
lines changed

3 files changed

+28
-37
lines changed

extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcBasePersistenceImpl.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ public PolarisBaseEntity lookupEntity(
266266
@Nonnull PolarisCallContext callCtx, long catalogId, long entityId, int typeCode) {
267267
Map<String, Object> params =
268268
Map.of("catalog_id", catalogId, "id", entityId, "type_code", typeCode, "realm_id", realmId);
269-
String query = generateSelectQuery(ModelEntity.class, params);
269+
String query = generateSelectQuery(new ModelEntity(), params);
270270
return getPolarisBaseEntity(query);
271271
}
272272

@@ -289,7 +289,7 @@ public PolarisBaseEntity lookupEntityByName(
289289
name,
290290
"realm_id",
291291
realmId);
292-
String query = generateSelectQuery(ModelEntity.class, params);
292+
String query = generateSelectQuery(new ModelEntity(), params);
293293
return getPolarisBaseEntity(query);
294294
}
295295

@@ -410,7 +410,7 @@ public <T> List<T> listEntities(
410410

411411
// Limit can't be pushed down, due to client side filtering
412412
// absence of transaction.
413-
String query = QueryGenerator.generateSelectQuery(ModelEntity.class, params);
413+
String query = QueryGenerator.generateSelectQuery(new ModelEntity(), params);
414414
try {
415415
List<PolarisBaseEntity> results =
416416
datasourceOperations.executeSelect(
@@ -430,7 +430,7 @@ public int lookupEntityGrantRecordsVersion(
430430

431431
Map<String, Object> params =
432432
Map.of("catalog_id", catalogId, "id", entityId, "realm_id", realmId);
433-
String query = QueryGenerator.generateSelectQuery(ModelEntity.class, params);
433+
String query = QueryGenerator.generateSelectQuery(new ModelEntity(), params);
434434
PolarisBaseEntity b = getPolarisBaseEntity(query);
435435
return b == null ? 0 : b.getGrantRecordsVersion();
436436
}
@@ -457,7 +457,7 @@ public PolarisGrantRecord lookupGrantRecord(
457457
privilegeCode,
458458
"realm_id",
459459
realmId);
460-
String query = generateSelectQuery(ModelGrantRecord.class, params);
460+
String query = generateSelectQuery(new ModelGrantRecord(), params);
461461
try {
462462
List<PolarisGrantRecord> results =
463463
datasourceOperations.executeSelect(
@@ -492,7 +492,7 @@ public List<PolarisGrantRecord> loadAllGrantRecordsOnSecurable(
492492
securableId,
493493
"realm_id",
494494
realmId);
495-
String query = generateSelectQuery(ModelGrantRecord.class, params);
495+
String query = generateSelectQuery(new ModelGrantRecord(), params);
496496
try {
497497
List<PolarisGrantRecord> results =
498498
datasourceOperations.executeSelect(
@@ -518,7 +518,7 @@ public List<PolarisGrantRecord> loadAllGrantRecordsOnGrantee(
518518
Map<String, Object> params =
519519
Map.of(
520520
"grantee_catalog_id", granteeCatalogId, "grantee_id", granteeId, "realm_id", realmId);
521-
String query = generateSelectQuery(ModelGrantRecord.class, params);
521+
String query = generateSelectQuery(new ModelGrantRecord(), params);
522522
try {
523523
List<PolarisGrantRecord> results =
524524
datasourceOperations.executeSelect(
@@ -550,7 +550,7 @@ public boolean hasChildren(
550550
if (optionalEntityType != null) {
551551
params.put("type_code", optionalEntityType.getCode());
552552
}
553-
String query = generateSelectQuery(ModelEntity.class, params);
553+
String query = generateSelectQuery(new ModelEntity(), params);
554554
try {
555555
List<ModelEntity> results =
556556
datasourceOperations.executeSelect(
@@ -569,7 +569,7 @@ public boolean hasChildren(
569569
public PolarisPrincipalSecrets loadPrincipalSecrets(
570570
@Nonnull PolarisCallContext callCtx, @Nonnull String clientId) {
571571
Map<String, Object> params = Map.of("principal_client_id", clientId, "realm_id", realmId);
572-
String query = generateSelectQuery(ModelPrincipalAuthenticationData.class, params);
572+
String query = generateSelectQuery(new ModelPrincipalAuthenticationData(), params);
573573
try {
574574
List<PolarisPrincipalSecrets> results =
575575
datasourceOperations.executeSelect(
@@ -828,7 +828,7 @@ public PolarisPolicyMappingRecord lookupPolicyMappingRecord(
828828
policyCatalogId,
829829
"realm_id",
830830
realmId);
831-
String query = generateSelectQuery(ModelPolicyMappingRecord.class, params);
831+
String query = generateSelectQuery(new ModelPolicyMappingRecord(), params);
832832
List<PolarisPolicyMappingRecord> results = fetchPolicyMappingRecords(query);
833833
Preconditions.checkState(results.size() <= 1, "More than one policy mapping records found");
834834
return results.size() == 1 ? results.getFirst() : null;
@@ -851,7 +851,7 @@ public List<PolarisPolicyMappingRecord> loadPoliciesOnTargetByType(
851851
policyTypeCode,
852852
"realm_id",
853853
realmId);
854-
String query = generateSelectQuery(ModelPolicyMappingRecord.class, params);
854+
String query = generateSelectQuery(new ModelPolicyMappingRecord(), params);
855855
return fetchPolicyMappingRecords(query);
856856
}
857857

@@ -861,7 +861,7 @@ public List<PolarisPolicyMappingRecord> loadAllPoliciesOnTarget(
861861
@Nonnull PolarisCallContext callCtx, long targetCatalogId, long targetId) {
862862
Map<String, Object> params =
863863
Map.of("target_catalog_id", targetCatalogId, "target_id", targetId, "realm_id", realmId);
864-
String query = generateSelectQuery(ModelPolicyMappingRecord.class, params);
864+
String query = generateSelectQuery(new ModelPolicyMappingRecord(), params);
865865
return fetchPolicyMappingRecords(query);
866866
}
867867

@@ -871,7 +871,7 @@ public List<PolarisPolicyMappingRecord> loadAllTargetsOnPolicy(
871871
@Nonnull PolarisCallContext callCtx, long policyCatalogId, long policyId) {
872872
Map<String, Object> params =
873873
Map.of("policy_catalog_id", policyCatalogId, "policy_id", policyId, "realm_id", realmId);
874-
String query = generateSelectQuery(ModelPolicyMappingRecord.class, params);
874+
String query = generateSelectQuery(new ModelPolicyMappingRecord(), params);
875875
return fetchPolicyMappingRecords(query);
876876
}
877877

extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/QueryGenerator.java

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import com.google.common.annotations.VisibleForTesting;
2222
import jakarta.annotation.Nonnull;
23-
import java.lang.reflect.InvocationTargetException;
2423
import java.util.ArrayList;
2524
import java.util.List;
2625
import java.util.Map;
@@ -34,9 +33,9 @@
3433

3534
public class QueryGenerator {
3635

37-
public static String generateSelectQuery(
38-
@Nonnull Class<?> entityClass, @Nonnull Map<String, Object> whereClause) {
39-
return generateSelectQuery(entityClass, generateWhereClause(whereClause));
36+
public static <T> String generateSelectQuery(
37+
@Nonnull Converter<T> entity, @Nonnull Map<String, Object> whereClause) {
38+
return generateSelectQuery(entity, generateWhereClause(whereClause));
4039
}
4140

4241
public static String generateDeleteQueryForEntityGrantRecords(
@@ -96,7 +95,7 @@ public static String generateSelectQueryWithEntityIds(
9695
condition.append(")");
9796
condition.append(" AND realm_id = '").append(realmId).append("'");
9897

99-
return generateSelectQuery(ModelEntity.class, " WHERE " + condition);
98+
return generateSelectQuery(new ModelEntity(), " WHERE " + condition);
10099
}
101100

102101
public static <T> String generateInsertQuery(
@@ -158,24 +157,16 @@ public static <T> String generateDeleteQuery(
158157

159158
@VisibleForTesting
160159
public static <T> String generateSelectQuery(
161-
@Nonnull Class<?> entityClass, @Nonnull String filter) {
162-
String tableName = getTableName(entityClass);
163-
try {
164-
Converter<T> entity = (Converter<T>) entityClass.getDeclaredConstructor().newInstance();
165-
Map<String, Object> objectMap = entity.toMap();
166-
String columns = String.join(", ", objectMap.keySet());
167-
StringBuilder query =
168-
new StringBuilder("SELECT ").append(columns).append(" FROM ").append(tableName);
169-
if (!filter.isEmpty()) {
170-
query.append(filter);
171-
}
172-
return query.toString();
173-
} catch (InstantiationException
174-
| IllegalAccessException
175-
| InvocationTargetException
176-
| NoSuchMethodException e) {
177-
throw new RuntimeException("Failed to create instance of " + entityClass.getName(), e);
160+
@Nonnull Converter<T> entity, @Nonnull String filter) {
161+
String tableName = getTableName(entity.getClass());
162+
Map<String, Object> objectMap = entity.toMap();
163+
String columns = String.join(", ", objectMap.keySet());
164+
StringBuilder query =
165+
new StringBuilder("SELECT ").append(columns).append(" FROM ").append(tableName);
166+
if (!filter.isEmpty()) {
167+
query.append(filter);
178168
}
169+
return query.toString();
179170
}
180171

181172
@VisibleForTesting

extension/persistence/relational-jdbc/src/test/java/org/apache/polaris/extension/persistence/impl/relational/jdbc/QueryGeneratorTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ void testGenerateSelectQuery_withMapWhereClause() {
4747
whereClause.put("entity_version", 1);
4848
String expectedQuery =
4949
"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'";
50-
assertEquals(expectedQuery, QueryGenerator.generateSelectQuery(ModelEntity.class, whereClause));
50+
assertEquals(expectedQuery, QueryGenerator.generateSelectQuery(new ModelEntity(), whereClause));
5151
}
5252

5353
@Test
@@ -199,7 +199,7 @@ void testGenerateSelectQuery_withFilter() {
199199
Map<String, Object> emptyWhereClause = Collections.emptyMap();
200200
assertEquals(
201201
expectedQuery,
202-
QueryGenerator.generateSelectQuery(ModelEntity.class, " WHERE name = 'testEntity'"));
202+
QueryGenerator.generateSelectQuery(new ModelEntity(), " WHERE name = 'testEntity'"));
203203
}
204204

205205
@Test

0 commit comments

Comments
 (0)