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 ec1cb9d30 Ensure writeToPolicyMappingRecord update existing record if
primary key equals in EclipseLink Persistence Impl (#1469)
ec1cb9d30 is described below
commit ec1cb9d3018828ea163a00376d480154cb5dd78e
Author: Honah (Jonas) J. <[email protected]>
AuthorDate: Tue Apr 29 01:46:52 2025 -0500
Ensure writeToPolicyMappingRecord update existing record if primary key
equals in EclipseLink Persistence Impl (#1469)
* update PolicyMappingRecord if not exists
* update test
* add TODO
---
.../impl/eclipselink/PolarisEclipseLinkStore.java | 17 ++++++-
.../jpa/models/ModelPolicyMappingRecord.java | 9 ++++
.../persistence/PolarisTestMetaStoreManager.java | 57 +++++++++++++++++++---
3 files changed, 75 insertions(+), 8 deletions(-)
diff --git
a/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/PolarisEclipseLinkStore.java
b/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/PolarisEclipseLinkStore.java
index 9ebb4e816..0988dcb7f 100644
---
a/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/PolarisEclipseLinkStore.java
+++
b/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/PolarisEclipseLinkStore.java
@@ -420,7 +420,22 @@ public class PolarisEclipseLinkStore {
diagnosticServices.check(session != null, "session_is_null");
checkInitialized();
-
session.persist(ModelPolicyMappingRecord.fromPolicyMappingRecord(mappingRecord));
+ // TODO: combine existence check and write into one statement
+ ModelPolicyMappingRecord model =
+ lookupPolicyMappingRecord(
+ session,
+ mappingRecord.getTargetCatalogId(),
+ mappingRecord.getTargetId(),
+ mappingRecord.getPolicyTypeCode(),
+ mappingRecord.getPolicyCatalogId(),
+ mappingRecord.getPolicyId());
+ if (model != null) {
+ model.update(mappingRecord);
+ } else {
+ model = ModelPolicyMappingRecord.fromPolicyMappingRecord(mappingRecord);
+ }
+
+ session.persist(model);
}
void deleteFromPolicyMappingRecords(
diff --git
a/extension/persistence/jpa-model/src/main/java/org/apache/polaris/jpa/models/ModelPolicyMappingRecord.java
b/extension/persistence/jpa-model/src/main/java/org/apache/polaris/jpa/models/ModelPolicyMappingRecord.java
index c77975843..0448dec67 100644
---
a/extension/persistence/jpa-model/src/main/java/org/apache/polaris/jpa/models/ModelPolicyMappingRecord.java
+++
b/extension/persistence/jpa-model/src/main/java/org/apache/polaris/jpa/models/ModelPolicyMappingRecord.java
@@ -135,6 +135,15 @@ public class ModelPolicyMappingRecord {
}
}
+ public void update(PolarisPolicyMappingRecord record) {
+ this.targetCatalogId = record.getTargetCatalogId();
+ this.targetId = record.getTargetId();
+ this.policyTypeCode = record.getPolicyTypeCode();
+ this.policyCatalogId = record.getPolicyCatalogId();
+ this.policyId = record.getPolicyId();
+ this.parameters = record.getParameters();
+ }
+
public static ModelPolicyMappingRecord fromPolicyMappingRecord(
PolarisPolicyMappingRecord record) {
if (record == null) return null;
diff --git
a/polaris-core/src/testFixtures/java/org/apache/polaris/core/persistence/PolarisTestMetaStoreManager.java
b/polaris-core/src/testFixtures/java/org/apache/polaris/core/persistence/PolarisTestMetaStoreManager.java
index 428ecf00c..da72308a0 100644
---
a/polaris-core/src/testFixtures/java/org/apache/polaris/core/persistence/PolarisTestMetaStoreManager.java
+++
b/polaris-core/src/testFixtures/java/org/apache/polaris/core/persistence/PolarisTestMetaStoreManager.java
@@ -1001,9 +1001,19 @@ public class PolarisTestMetaStoreManager {
PolarisBaseEntity target,
List<PolarisEntityCore> policyCatalogPath,
PolicyEntity policy) {
+ attachPolicyToTarget(targetCatalogPath, target, policyCatalogPath, policy,
null);
+ }
+
+ void attachPolicyToTarget(
+ List<PolarisEntityCore> targetCatalogPath,
+ PolarisBaseEntity target,
+ List<PolarisEntityCore> policyCatalogPath,
+ PolicyEntity policy,
+ Map<String, String> parameters) {
polarisMetaStoreManager.attachPolicyToEntity(
- polarisCallContext, targetCatalogPath, target, policyCatalogPath,
policy, null);
- ensurePolicyMappingRecordExists(target, policy);
+ polarisCallContext, targetCatalogPath, target, policyCatalogPath,
policy, parameters);
+
+ ensurePolicyMappingRecordExists(target, policy, parameters);
}
/** detach a policy from a target */
@@ -1022,8 +1032,10 @@ public class PolarisTestMetaStoreManager {
*
* @param target the target
* @param policy the policy
+ * @param parameters the parameters
*/
- void ensurePolicyMappingRecordExists(PolarisBaseEntity target, PolicyEntity
policy) {
+ void ensurePolicyMappingRecordExists(
+ PolarisBaseEntity target, PolicyEntity policy, Map<String, String>
parameters) {
target =
polarisMetaStoreManager
.loadEntity(
@@ -1048,7 +1060,7 @@ public class PolarisTestMetaStoreManager {
validateLoadedPolicyMappings(loadPolicyMappingsResult);
checkPolicyMappingRecordExists(
- loadPolicyMappingsResult.getPolicyMappingRecords(), target, policy);
+ loadPolicyMappingsResult.getPolicyMappingRecords(), target, policy,
parameters);
// also try load by specific type
LoadPolicyMappingsResult loadPolicyMappingsResultByType =
@@ -1056,7 +1068,7 @@ public class PolarisTestMetaStoreManager {
this.polarisCallContext, target, policy.getPolicyType());
validateLoadedPolicyMappings(loadPolicyMappingsResultByType);
checkPolicyMappingRecordExists(
- loadPolicyMappingsResultByType.getPolicyMappingRecords(), target,
policy);
+ loadPolicyMappingsResultByType.getPolicyMappingRecords(), target,
policy, parameters);
}
/**
@@ -1140,8 +1152,9 @@ public class PolarisTestMetaStoreManager {
void checkPolicyMappingRecordExists(
List<PolarisPolicyMappingRecord> policyMappingRecords,
PolarisBaseEntity target,
- PolicyEntity policy) {
- boolean exists = isPolicyMappingRecordExists(policyMappingRecords, target,
policy);
+ PolicyEntity policy,
+ Map<String, String> parameters) {
+ boolean exists = isPolicyMappingRecordExists(policyMappingRecords, target,
policy, parameters);
Assertions.assertThat(exists).isTrue();
}
@@ -1184,6 +1197,32 @@ public class PolarisTestMetaStoreManager {
return policyMappingCount == 1;
}
+ /**
+ * Check if the policy mapping record exists and verify if the parameters
also equals
+ *
+ * @param policyMappingRecords list of policy mapping records
+ * @param target the target
+ * @param policy the policy
+ * @param parameters the parameters
+ */
+ boolean isPolicyMappingRecordExists(
+ List<PolarisPolicyMappingRecord> policyMappingRecords,
+ PolarisBaseEntity target,
+ PolicyEntity policy,
+ Map<String, String> parameters) {
+ PolarisPolicyMappingRecord expected =
+ new PolarisPolicyMappingRecord(
+ target.getCatalogId(),
+ target.getId(),
+ policy.getCatalogId(),
+ policy.getId(),
+ policy.getPolicyTypeCode(),
+ parameters);
+ long policyMappingCount =
+ policyMappingRecords.stream().filter(record ->
expected.equals(record)).count();
+ return policyMappingCount == 1;
+ }
+
/**
* Create a test catalog. This is a new catalog which will have the
following objects (N is for a
* namespace, T for a table, V for a view, R for a role, P for a principal,
POL for a policy):
@@ -2781,6 +2820,10 @@ public class PolarisTestMetaStoreManager {
Assertions.assertThat(policyAttachmentResult.getReturnStatus())
.isEqualTo(BaseResult.ReturnStatus.POLICY_MAPPING_OF_SAME_TYPE_ALREADY_EXISTS);
+ // Attach the same policy to same target again should succeed and replace
the existing one
+ attachPolicyToTarget(
+ List.of(catalog, N1, N1_N2), N1_N2_T1, List.of(catalog, N1), N1_P1,
Map.of("test", "test"));
+
LoadPolicyMappingsResult loadPolicyMappingsResult =
polarisMetaStoreManager.loadPoliciesOnEntityByType(
polarisCallContext, N1_N2_T1,
PredefinedPolicyTypes.DATA_COMPACTION);