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. <hon...@apache.org>
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);

Reply via email to