This is an automated email from the ASF dual-hosted git repository.

honahx 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 a53419317 [Policy Store] Add policyTypeCode to Slice/Index for Future 
Filtering Support and Update Policy Persistence Method (#1628)
a53419317 is described below

commit a53419317b11dacffaf08b5556159202779a5206
Author: Honah (Jonas) J. <[email protected]>
AuthorDate: Thu May 22 16:34:15 2025 -0500

    [Policy Store] Add policyTypeCode to Slice/Index for Future Filtering 
Support and Update Policy Persistence Method (#1628)
    
    This PR adds policyTypeCode to the in-memory tree map store's slice and the 
SQL index on policy_mapping_records (already done in JDBC in #1468). This 
prepares for future features that need to filter efficiently by policy type, 
like listing all entities with a data compaction policy.
    
    It also updates the loadAllTargetsOnPolicy method to accept policyTypeCode, 
enabling it to use the new index for better performance.
---
 .../PolarisEclipseLinkMetaStoreSessionImpl.java    | 11 ++++--
 .../impl/eclipselink/PolarisEclipseLinkStore.java  | 26 ++++++++++----
 .../jpa/models/ModelPolicyMappingRecord.java       |  2 +-
 .../relational/jdbc/JdbcBasePersistenceImpl.java   | 17 +++++++--
 .../relational/jdbc/QueryGenerator.java            | 33 ++++++++---------
 .../AtomicOperationMetaStoreManager.java           | 11 ++++--
 .../AbstractTransactionalPersistence.java          | 12 +++++--
 .../TransactionalMetaStoreManagerImpl.java         | 12 +++++--
 .../transactional/TreeMapMetaStore.java            |  3 +-
 .../TreeMapTransactionalPersistenceImpl.java       | 42 ++++++++++++++--------
 .../core/policy/PolicyMappingPersistence.java      | 10 ++++--
 .../TransactionalPolicyMappingPersistence.java     |  9 +++--
 .../persistence/PolarisTestMetaStoreManager.java   |  3 +-
 13 files changed, 131 insertions(+), 60 deletions(-)

diff --git 
a/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/PolarisEclipseLinkMetaStoreSessionImpl.java
 
b/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/PolarisEclipseLinkMetaStoreSessionImpl.java
index b6bd23762..151d1a548 100644
--- 
a/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/PolarisEclipseLinkMetaStoreSessionImpl.java
+++ 
b/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/PolarisEclipseLinkMetaStoreSessionImpl.java
@@ -703,7 +703,7 @@ public class PolarisEclipseLinkMetaStoreSessionImpl extends 
AbstractTransactiona
   @Override
   public void deleteAllEntityPolicyMappingRecordsInCurrentTxn(
       @Nonnull PolarisCallContext callCtx,
-      @Nonnull PolarisEntityCore entity,
+      @Nonnull PolarisBaseEntity entity,
       @Nonnull List<PolarisPolicyMappingRecord> mappingOnTarget,
       @Nonnull List<PolarisPolicyMappingRecord> mappingOnPolicy) {
     this.store.deleteAllEntityPolicyMappingRecords(localSession.get(), entity);
@@ -760,8 +760,13 @@ public class PolarisEclipseLinkMetaStoreSessionImpl 
extends AbstractTransactiona
   @Nonnull
   @Override
   public List<PolarisPolicyMappingRecord> loadAllTargetsOnPolicyInCurrentTxn(
-      @Nonnull PolarisCallContext callCtx, long policyCatalogId, long 
policyId) {
-    return this.store.loadAllTargetsOnPolicy(localSession.get(), 
policyCatalogId, policyId).stream()
+      @Nonnull PolarisCallContext callCtx,
+      long policyCatalogId,
+      long policyId,
+      int policyTypeCode) {
+    return this.store
+        .loadAllTargetsOnPolicy(localSession.get(), policyCatalogId, policyId, 
policyTypeCode)
+        .stream()
         .map(ModelPolicyMappingRecord::toPolicyMappingRecord)
         .toList();
   }
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 4e992e07f..16fb32356 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
@@ -37,6 +37,7 @@ import org.apache.polaris.core.entity.PolarisGrantRecord;
 import org.apache.polaris.core.entity.PolarisPrincipalSecrets;
 import org.apache.polaris.core.persistence.pagination.PageToken;
 import org.apache.polaris.core.policy.PolarisPolicyMappingRecord;
+import org.apache.polaris.core.policy.PolicyEntity;
 import org.apache.polaris.jpa.models.ModelEntity;
 import org.apache.polaris.jpa.models.ModelEntityActive;
 import org.apache.polaris.jpa.models.ModelEntityChangeTracking;
@@ -461,20 +462,29 @@ public class PolarisEclipseLinkStore {
     session.remove(lookupPolicyMappingRecord);
   }
 
-  void deleteAllEntityPolicyMappingRecords(EntityManager session, 
PolarisEntityCore entity) {
+  void deleteAllEntityPolicyMappingRecords(EntityManager session, 
PolarisBaseEntity entity) {
     diagnosticServices.check(session != null, "session_is_null");
     checkInitialized();
 
-    loadAllTargetsOnPolicy(session, entity.getCatalogId(), 
entity.getId()).forEach(session::remove);
-    loadAllPoliciesOnTarget(session, entity.getCatalogId(), entity.getId())
-        .forEach(session::remove);
+    if (entity.getType() == PolarisEntityType.POLICY) {
+      PolicyEntity policyEntity = PolicyEntity.of(entity);
+      loadAllTargetsOnPolicy(
+              session,
+              policyEntity.getCatalogId(),
+              policyEntity.getId(),
+              policyEntity.getPolicyTypeCode())
+          .forEach(session::remove);
+    } else {
+      loadAllPoliciesOnTarget(session, entity.getCatalogId(), entity.getId())
+          .forEach(session::remove);
+    }
   }
 
   ModelPolicyMappingRecord lookupPolicyMappingRecord(
       EntityManager session,
       long targetCatalogId,
       long targetId,
-      long policyTypeCode,
+      int policyTypeCode,
       long policyCatalogId,
       long policyId) {
     diagnosticServices.check(session != null, "session_is_null");
@@ -534,16 +544,18 @@ public class PolarisEclipseLinkStore {
   }
 
   List<ModelPolicyMappingRecord> loadAllTargetsOnPolicy(
-      EntityManager session, long policyCatalogId, long policyId) {
+      EntityManager session, long policyCatalogId, long policyId, int 
policyTypeCode) {
     diagnosticServices.check(session != null, "session_is_null");
     checkInitialized();
 
     return session
         .createQuery(
             "SELECT m from ModelPolicyMappingRecord m "
-                + "where  m.policyCatalogId=:policyCatalogId "
+                + "where m.policyTypeCode=:policyTypeCode "
+                + "and m.policyCatalogId=:policyCatalogId "
                 + "and m.policyId=:policyId",
             ModelPolicyMappingRecord.class)
+        .setParameter("policyTypeCode", policyTypeCode)
         .setParameter("policyCatalogId", policyCatalogId)
         .setParameter("policyId", policyId)
         .getResultList();
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 0448dec67..0a6f587c4 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
@@ -33,7 +33,7 @@ import org.eclipse.persistence.annotations.PrimaryKey;
     indexes = {
       @Index(
           name = "POLICY_MAPPING_RECORDS_BY_POLICY_INDEX",
-          columnList = "policyCatalogId,policyId,targetCatalogId,targetId")
+          columnList = 
"policyTypeCode,policyCatalogId,policyId,targetCatalogId,targetId")
     })
 @PrimaryKey(
     columns = {
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 e229100fe..5fdb32006 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
@@ -780,7 +780,7 @@ public class JdbcBasePersistenceImpl implements 
BasePersistence, IntegrationPers
   @Override
   public void deleteAllEntityPolicyMappingRecords(
       @Nonnull PolarisCallContext callCtx,
-      @Nonnull PolarisEntityCore entity,
+      @Nonnull PolarisBaseEntity entity,
       @Nonnull List<PolarisPolicyMappingRecord> mappingOnTarget,
       @Nonnull List<PolarisPolicyMappingRecord> mappingOnPolicy) {
     try {
@@ -855,9 +855,20 @@ public class JdbcBasePersistenceImpl implements 
BasePersistence, IntegrationPers
   @Nonnull
   @Override
   public List<PolarisPolicyMappingRecord> loadAllTargetsOnPolicy(
-      @Nonnull PolarisCallContext callCtx, long policyCatalogId, long 
policyId) {
+      @Nonnull PolarisCallContext callCtx,
+      long policyCatalogId,
+      long policyId,
+      int policyTypeCode) {
     Map<String, Object> params =
-        Map.of("policy_catalog_id", policyCatalogId, "policy_id", policyId, 
"realm_id", realmId);
+        Map.of(
+            "policy_type_code",
+            policyTypeCode,
+            "policy_catalog_id",
+            policyCatalogId,
+            "policy_id",
+            policyId,
+            "realm_id",
+            realmId);
     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 d8f8d0864..ccd457b6a 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
@@ -21,10 +21,14 @@ package 
org.apache.polaris.extension.persistence.relational.jdbc;
 import com.google.common.annotations.VisibleForTesting;
 import jakarta.annotation.Nonnull;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.polaris.core.entity.PolarisBaseEntity;
 import org.apache.polaris.core.entity.PolarisEntityCore;
 import org.apache.polaris.core.entity.PolarisEntityId;
+import org.apache.polaris.core.entity.PolarisEntityType;
+import org.apache.polaris.core.policy.PolicyEntity;
 import 
org.apache.polaris.extension.persistence.relational.jdbc.models.Converter;
 import 
org.apache.polaris.extension.persistence.relational.jdbc.models.ModelEntity;
 import 
org.apache.polaris.extension.persistence.relational.jdbc.models.ModelGrantRecord;
@@ -60,23 +64,20 @@ public class QueryGenerator {
   }
 
   public static String generateDeleteQueryForEntityPolicyMappingRecords(
-      @Nonnull PolarisEntityCore entity, @Nonnull String realmId) {
-    String targetCondition =
-        String.format(
-            "target_id = %s AND target_catalog_id = %s", entity.getId(), 
entity.getCatalogId());
-    String sourceCondition =
-        String.format(
-            "policy_id = %s AND policy_catalog_id = %s", entity.getId(), 
entity.getCatalogId());
+      @Nonnull PolarisBaseEntity entity, @Nonnull String realmId) {
+    Map<String, Object> queryParams = new HashMap<>();
+    if (entity.getType() == PolarisEntityType.POLICY) {
+      PolicyEntity policyEntity = PolicyEntity.of(entity);
+      queryParams.put("policy_type_code", policyEntity.getPolicyTypeCode());
+      queryParams.put("policy_catalog_id", policyEntity.getCatalogId());
+      queryParams.put("policy_id", policyEntity.getId());
+    } else {
+      queryParams.put("target_catalog_id", entity.getCatalogId());
+      queryParams.put("target_id", entity.getId());
+    }
+    queryParams.put("realm_id", realmId);
 
-    String whereClause =
-        " WHERE ("
-            + targetCondition
-            + " OR "
-            + sourceCondition
-            + ") AND realm_id = '"
-            + realmId
-            + "'";
-    return generateDeleteQuery(ModelPolicyMappingRecord.class, whereClause);
+    return generateDeleteQuery(ModelPolicyMappingRecord.class, queryParams);
   }
 
   public static String generateSelectQueryWithEntityIds(
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java
index 2a32fb6f9..92ccc6eed 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManager.java
@@ -203,7 +203,11 @@ public class AtomicOperationMetaStoreManager extends 
BaseMetaStoreManager {
       try {
         final List<PolarisPolicyMappingRecord> mappingOnPolicy =
             (entity.getType() == PolarisEntityType.POLICY)
-                ? ms.loadAllTargetsOnPolicy(callCtx, entity.getCatalogId(), 
entity.getId())
+                ? ms.loadAllTargetsOnPolicy(
+                    callCtx,
+                    entity.getCatalogId(),
+                    entity.getId(),
+                    PolicyEntity.of(entity).getPolicyTypeCode())
                 : List.of();
         final List<PolarisPolicyMappingRecord> mappingOnTarget =
             (entity.getType() == PolarisEntityType.POLICY)
@@ -1209,7 +1213,10 @@ public class AtomicOperationMetaStoreManager extends 
BaseMetaStoreManager {
         //  need to check if the policy is attached to any entity
         List<PolarisPolicyMappingRecord> records =
             ms.loadAllTargetsOnPolicy(
-                callCtx, refreshEntityToDrop.getCatalogId(), 
refreshEntityToDrop.getId());
+                callCtx,
+                refreshEntityToDrop.getCatalogId(),
+                refreshEntityToDrop.getId(),
+                PolicyEntity.of(refreshEntityToDrop).getPolicyTypeCode());
         if (!records.isEmpty()) {
           return new 
DropEntityResult(BaseResult.ReturnStatus.POLICY_HAS_MAPPINGS, null);
         }
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/AbstractTransactionalPersistence.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/AbstractTransactionalPersistence.java
index e63ea6fed..f08b85e12 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/AbstractTransactionalPersistence.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/AbstractTransactionalPersistence.java
@@ -722,7 +722,7 @@ public abstract class AbstractTransactionalPersistence 
implements TransactionalP
   @Override
   public void deleteAllEntityPolicyMappingRecords(
       @Nonnull PolarisCallContext callCtx,
-      @Nonnull PolarisEntityCore entity,
+      @Nonnull PolarisBaseEntity entity,
       @Nonnull List<PolarisPolicyMappingRecord> mappingOnTarget,
       @Nonnull List<PolarisPolicyMappingRecord> mappingOnPolicy) {
     this.runActionInTransaction(
@@ -778,8 +778,14 @@ public abstract class AbstractTransactionalPersistence 
implements TransactionalP
   @Override
   @Nonnull
   public List<PolarisPolicyMappingRecord> loadAllTargetsOnPolicy(
-      @Nonnull PolarisCallContext callCtx, long policyCatalogId, long 
policyId) {
+      @Nonnull PolarisCallContext callCtx,
+      long policyCatalogId,
+      long policyId,
+      int policyTypeCode) {
     return this.runInReadTransaction(
-        callCtx, () -> this.loadAllTargetsOnPolicyInCurrentTxn(callCtx, 
policyCatalogId, policyId));
+        callCtx,
+        () ->
+            this.loadAllTargetsOnPolicyInCurrentTxn(
+                callCtx, policyCatalogId, policyId, policyTypeCode));
   }
 }
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java
index 62f526a6d..0224dec49 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TransactionalMetaStoreManagerImpl.java
@@ -205,7 +205,10 @@ public class TransactionalMetaStoreManagerImpl extends 
BaseMetaStoreManager {
         final List<PolarisPolicyMappingRecord> mappingOnPolicy =
             (entity.getType() == PolarisEntityType.POLICY)
                 ? ms.loadAllTargetsOnPolicyInCurrentTxn(
-                    callCtx, entity.getCatalogId(), entity.getId())
+                    callCtx,
+                    entity.getCatalogId(),
+                    entity.getId(),
+                    PolicyEntity.of(entity).getPolicyTypeCode())
                 : List.of();
         final List<PolarisPolicyMappingRecord> mappingOnTarget =
             (entity.getType() == PolarisEntityType.POLICY)
@@ -1397,7 +1400,10 @@ public class TransactionalMetaStoreManagerImpl extends 
BaseMetaStoreManager {
       try {
         List<PolarisPolicyMappingRecord> records =
             ms.loadAllTargetsOnPolicyInCurrentTxn(
-                callCtx, refreshEntityToDrop.getCatalogId(), 
refreshEntityToDrop.getId());
+                callCtx,
+                refreshEntityToDrop.getCatalogId(),
+                refreshEntityToDrop.getId(),
+                PolicyEntity.of(refreshEntityToDrop).getPolicyTypeCode());
         if (!records.isEmpty()) {
           return new 
DropEntityResult(BaseResult.ReturnStatus.POLICY_HAS_MAPPINGS, null);
         }
@@ -2448,7 +2454,7 @@ public class TransactionalMetaStoreManagerImpl extends 
BaseMetaStoreManager {
   }
 
   /** See {@link #loadPoliciesOnEntityByType(PolarisCallContext, 
PolarisEntityCore, PolicyType)} */
-  public LoadPolicyMappingsResult doLoadPoliciesOnEntityByType(
+  private LoadPolicyMappingsResult doLoadPoliciesOnEntityByType(
       @Nonnull PolarisCallContext callCtx,
       @Nonnull TransactionalPersistence ms,
       @Nonnull PolarisEntityCore target,
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TreeMapMetaStore.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TreeMapMetaStore.java
index c91414040..781732e42 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TreeMapMetaStore.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TreeMapMetaStore.java
@@ -287,7 +287,8 @@ public class TreeMapMetaStore {
         new Slice<>(
             policyMappingRecord ->
                 String.format(
-                    "%d::%d::%d::%d",
+                    "%d::%d::%d::%d::%d",
+                    policyMappingRecord.getPolicyTypeCode(),
                     policyMappingRecord.getPolicyCatalogId(),
                     policyMappingRecord.getPolicyId(),
                     policyMappingRecord.getTargetCatalogId(),
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TreeMapTransactionalPersistenceImpl.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TreeMapTransactionalPersistenceImpl.java
index 304ac0ce9..44b37c276 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TreeMapTransactionalPersistenceImpl.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/persistence/transactional/TreeMapTransactionalPersistenceImpl.java
@@ -43,6 +43,7 @@ import 
org.apache.polaris.core.persistence.pagination.HasPageSize;
 import org.apache.polaris.core.persistence.pagination.Page;
 import org.apache.polaris.core.persistence.pagination.PageToken;
 import org.apache.polaris.core.policy.PolarisPolicyMappingRecord;
+import org.apache.polaris.core.policy.PolicyEntity;
 import org.apache.polaris.core.storage.PolarisStorageConfigurationInfo;
 import org.apache.polaris.core.storage.PolarisStorageIntegration;
 import org.apache.polaris.core.storage.PolarisStorageIntegrationProvider;
@@ -588,20 +589,30 @@ public class TreeMapTransactionalPersistenceImpl extends 
AbstractTransactionalPe
   @Override
   public void deleteAllEntityPolicyMappingRecordsInCurrentTxn(
       @Nonnull PolarisCallContext callCtx,
-      @Nonnull PolarisEntityCore entity,
+      @Nonnull PolarisBaseEntity entity,
       @Nonnull List<PolarisPolicyMappingRecord> mappingOnTarget,
       @Nonnull List<PolarisPolicyMappingRecord> mappingOnPolicy) {
-    // build composite prefix key and delete policy mapping records on the 
indexed side of each
-    // mapping table
-    String prefix = this.store.buildPrefixKeyComposite(entity.getCatalogId(), 
entity.getId());
-    this.store.getSlicePolicyMappingRecords().deleteRange(prefix);
-    this.store.getSlicePolicyMappingRecordsByPolicy().deleteRange(prefix);
-
-    // also delete the other side. We need to delete these mapping one at a 
time versus doing a
-    // range delete
-    mappingOnTarget.forEach(
-        record -> 
this.store.getSlicePolicyMappingRecordsByPolicy().delete(record));
-    mappingOnPolicy.forEach(record -> 
this.store.getSlicePolicyMappingRecords().delete(record));
+    if (entity.getType() == PolarisEntityType.POLICY) {
+      PolicyEntity policyEntity = PolicyEntity.of(entity);
+      this.store
+          .getSlicePolicyMappingRecordsByPolicy()
+          .deleteRange(
+              this.store.buildPrefixKeyComposite(
+                  policyEntity.getPolicyTypeCode(),
+                  policyEntity.getCatalogId(),
+                  policyEntity.getId()));
+      // also delete the other side. We need to delete these mapping one at a 
time versus doing a
+      // range delete
+      mappingOnPolicy.forEach(record -> 
this.store.getSlicePolicyMappingRecords().delete(record));
+    } else {
+      this.store
+          .getSlicePolicyMappingRecords()
+          
.deleteRange(this.store.buildPrefixKeyComposite(entity.getCatalogId(), 
entity.getId()));
+      // also delete the other side. We need to delete these mapping one at a 
time versus doing a
+      // range delete
+      mappingOnTarget.forEach(
+          record -> 
this.store.getSlicePolicyMappingRecordsByPolicy().delete(record));
+    }
   }
 
   /** {@inheritDoc} */
@@ -644,9 +655,12 @@ public class TreeMapTransactionalPersistenceImpl extends 
AbstractTransactionalPe
   /** {@inheritDoc} */
   @Override
   public @Nonnull List<PolarisPolicyMappingRecord> 
loadAllTargetsOnPolicyInCurrentTxn(
-      @Nonnull PolarisCallContext callCtx, long policyCatalogId, long 
policyId) {
+      @Nonnull PolarisCallContext callCtx,
+      long policyCatalogId,
+      long policyId,
+      int policyTypeCode) {
     return this.store
         .getSlicePolicyMappingRecordsByPolicy()
-        .readRange(this.store.buildPrefixKeyComposite(policyCatalogId, 
policyId));
+        .readRange(this.store.buildPrefixKeyComposite(policyTypeCode, 
policyCatalogId, policyId));
   }
 }
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/policy/PolicyMappingPersistence.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/policy/PolicyMappingPersistence.java
index 33a754668..0456f7b32 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/policy/PolicyMappingPersistence.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/policy/PolicyMappingPersistence.java
@@ -22,7 +22,7 @@ import jakarta.annotation.Nonnull;
 import jakarta.annotation.Nullable;
 import java.util.List;
 import org.apache.polaris.core.PolarisCallContext;
-import org.apache.polaris.core.entity.PolarisEntityCore;
+import org.apache.polaris.core.entity.PolarisBaseEntity;
 
 /**
  * Interface for interacting with the Polaris persistence backend for Policy 
Mapping operations.
@@ -73,7 +73,7 @@ public interface PolicyMappingPersistence {
    */
   default void deleteAllEntityPolicyMappingRecords(
       @Nonnull PolarisCallContext callCtx,
-      @Nonnull PolarisEntityCore entity,
+      @Nonnull PolarisBaseEntity entity,
       @Nonnull List<PolarisPolicyMappingRecord> mappingOnTarget,
       @Nonnull List<PolarisPolicyMappingRecord> mappingOnPolicy) {
     throw new UnsupportedOperationException("Not Implemented");
@@ -141,11 +141,15 @@ public interface PolicyMappingPersistence {
    * @param callCtx call context
    * @param policyCatalogId catalog id of the policy entity, NULL_ID if the 
entity is top-level
    * @param policyId id of the policy entity
+   * @param policyTypeCode type code of the policy entity
    * @return the list of policy mapping records for the specified policy entity
    */
   @Nonnull
   default List<PolarisPolicyMappingRecord> loadAllTargetsOnPolicy(
-      @Nonnull PolarisCallContext callCtx, long policyCatalogId, long 
policyId) {
+      @Nonnull PolarisCallContext callCtx,
+      long policyCatalogId,
+      long policyId,
+      int policyTypeCode) {
     throw new UnsupportedOperationException("Not Implemented");
   }
 }
diff --git 
a/polaris-core/src/main/java/org/apache/polaris/core/policy/TransactionalPolicyMappingPersistence.java
 
b/polaris-core/src/main/java/org/apache/polaris/core/policy/TransactionalPolicyMappingPersistence.java
index 6ad1ac80c..398ddb1a1 100644
--- 
a/polaris-core/src/main/java/org/apache/polaris/core/policy/TransactionalPolicyMappingPersistence.java
+++ 
b/polaris-core/src/main/java/org/apache/polaris/core/policy/TransactionalPolicyMappingPersistence.java
@@ -22,7 +22,7 @@ import jakarta.annotation.Nonnull;
 import jakarta.annotation.Nullable;
 import java.util.List;
 import org.apache.polaris.core.PolarisCallContext;
-import org.apache.polaris.core.entity.PolarisEntityCore;
+import org.apache.polaris.core.entity.PolarisBaseEntity;
 
 public interface TransactionalPolicyMappingPersistence {
   /** See {@link PolicyMappingPersistence#writeToPolicyMappingRecords} */
@@ -54,7 +54,7 @@ public interface TransactionalPolicyMappingPersistence {
   /** See {@link PolicyMappingPersistence#deleteAllEntityPolicyMappingRecords} 
*/
   default void deleteAllEntityPolicyMappingRecordsInCurrentTxn(
       @Nonnull PolarisCallContext callCtx,
-      @Nonnull PolarisEntityCore entity,
+      @Nonnull PolarisBaseEntity entity,
       @Nonnull List<PolarisPolicyMappingRecord> mappingOnTarget,
       @Nonnull List<PolarisPolicyMappingRecord> mappingOnPolicy) {
     throw new UnsupportedOperationException("Not Implemented");
@@ -92,7 +92,10 @@ public interface TransactionalPolicyMappingPersistence {
   /** See {@link PolicyMappingPersistence#loadAllTargetsOnPolicy} */
   @Nonnull
   default List<PolarisPolicyMappingRecord> loadAllTargetsOnPolicyInCurrentTxn(
-      @Nonnull PolarisCallContext callCtx, long policyCatalogId, long 
policyId) {
+      @Nonnull PolarisCallContext callCtx,
+      long policyCatalogId,
+      long policyId,
+      int policyTypeCode) {
     throw new UnsupportedOperationException("Not Implemented");
   }
 }
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 8cddecae3..7d90ab23d 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
@@ -2888,7 +2888,8 @@ public class PolarisTestMetaStoreManager {
 
     BasePersistence ms = polarisCallContext.getMetaStore();
     Assertions.assertThat(
-            ms.loadAllTargetsOnPolicy(polarisCallContext, 
N1_P1.getCatalogId(), N1_P1.getId()))
+            ms.loadAllTargetsOnPolicy(
+                polarisCallContext, N1_P1.getCatalogId(), N1_P1.getId(), 
N1_P1.getPolicyTypeCode()))
         .isEmpty();
 
     attachPolicyToTarget(List.of(catalog, N1, N1_N2), N1_N2_T1, 
List.of(catalog, N1), N1_P2);

Reply via email to