Skip to content

Policy Store: PolicyMappingRecord with Persistence Impl #1104

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 15 commits into from
Apr 1, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,15 @@
import org.apache.polaris.core.persistence.PrincipalSecretsGenerator;
import org.apache.polaris.core.persistence.RetryOnConcurrencyException;
import org.apache.polaris.core.persistence.transactional.AbstractTransactionalPersistence;
import org.apache.polaris.core.policy.PolarisPolicyMappingRecord;
import org.apache.polaris.core.storage.PolarisStorageConfigurationInfo;
import org.apache.polaris.core.storage.PolarisStorageIntegration;
import org.apache.polaris.core.storage.PolarisStorageIntegrationProvider;
import org.apache.polaris.jpa.models.ModelEntity;
import org.apache.polaris.jpa.models.ModelEntityActive;
import org.apache.polaris.jpa.models.ModelEntityChangeTracking;
import org.apache.polaris.jpa.models.ModelGrantRecord;
import org.apache.polaris.jpa.models.ModelPolicyMappingRecord;
import org.apache.polaris.jpa.models.ModelPrincipalSecrets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -664,6 +666,88 @@ PolarisStorageIntegration<T> loadPolarisStorageIntegrationInCurrentTxn(
return storageIntegrationProvider.getStorageIntegrationForConfig(storageConfig);
}

/** {@inheritDoc} */
@Override
public void writeToPolicyMappingRecordsInCurrentTxn(
@Nonnull PolarisCallContext callCtx, @Nonnull PolarisPolicyMappingRecord record) {

this.store.writeToPolicyMappingRecords(localSession.get(), record);
}

/** {@inheritDoc} */
@Override
public void deleteFromPolicyMappingRecordsInCurrentTxn(
@Nonnull PolarisCallContext callCtx, @Nonnull PolarisPolicyMappingRecord record) {
this.store.deleteFromPolicyMappingRecords(localSession.get(), record);
}

/** {@inheritDoc} */
@Override
public void deleteAllEntityPolicyMappingRecordsInCurrentTxn(
@Nonnull PolarisCallContext callCtx,
@Nonnull PolarisEntityCore entity,
@Nonnull List<PolarisPolicyMappingRecord> mappingOnTarget,
@Nonnull List<PolarisPolicyMappingRecord> mappingOnPolicy) {
this.store.deleteAllEntityPolicyMappingRecords(localSession.get(), entity);
}

/** {@inheritDoc} */
@Nullable
@Override
public PolarisPolicyMappingRecord lookupPolicyMappingRecordInCurrentTxn(
@Nonnull PolarisCallContext callCtx,
long targetCatalogId,
long targetId,
int policyTypeCode,
long policyCatalogId,
long policyId) {
return ModelPolicyMappingRecord.toPolicyMappingRecord(
this.store.lookupPolicyMappingRecord(
localSession.get(),
targetCatalogId,
targetId,
policyTypeCode,
policyCatalogId,
policyId));
}

/** {@inheritDoc} */
@Nonnull
@Override
public List<PolarisPolicyMappingRecord> loadPoliciesOnTargetByTypeInCurrentTxn(
@Nonnull PolarisCallContext callCtx,
long targetCatalogId,
long targetId,
int policyTypeCode) {
return this.store
.loadPoliciesOnTargetByType(localSession.get(), targetCatalogId, targetId, policyTypeCode)
.stream()
.map(ModelPolicyMappingRecord::toPolicyMappingRecord)
.toList();
}

/** {@inheritDoc} */
@Nonnull
@Override
public List<PolarisPolicyMappingRecord> loadAllPoliciesOnTargetInCurrentTxn(
@Nonnull PolarisCallContext callCtx, long targetCatalogId, long targetId) {
return this.store
.loadAllPoliciesOnTarget(localSession.get(), targetCatalogId, targetId)
.stream()
.map(ModelPolicyMappingRecord::toPolicyMappingRecord)
.toList();
}

/** {@inheritDoc} */
@Nonnull
@Override
public List<PolarisPolicyMappingRecord> loadAllTargetsOnPolicyInCurrentTxn(
@Nonnull PolarisCallContext callCtx, long policyCatalogId, long policyId) {
return this.store.loadAllTargetsOnPolicy(localSession.get(), policyCatalogId, policyId).stream()
.map(ModelPolicyMappingRecord::toPolicyMappingRecord)
.toList();
}

@Override
public void rollback() {
EntityManager session = localSession.get();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,12 @@
import org.apache.polaris.core.entity.PolarisEntityType;
import org.apache.polaris.core.entity.PolarisGrantRecord;
import org.apache.polaris.core.entity.PolarisPrincipalSecrets;
import org.apache.polaris.core.policy.PolarisPolicyMappingRecord;
import org.apache.polaris.jpa.models.ModelEntity;
import org.apache.polaris.jpa.models.ModelEntityActive;
import org.apache.polaris.jpa.models.ModelEntityChangeTracking;
import org.apache.polaris.jpa.models.ModelGrantRecord;
import org.apache.polaris.jpa.models.ModelPolicyMappingRecord;
import org.apache.polaris.jpa.models.ModelPrincipalSecrets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -411,6 +413,120 @@ void deletePrincipalSecrets(EntityManager session, String clientId) {
session.remove(modelPrincipalSecrets);
}

void writeToPolicyMappingRecords(
EntityManager session, PolarisPolicyMappingRecord mappingRecord) {
diagnosticServices.check(session != null, "session_is_null");
checkInitialized();

session.persist(ModelPolicyMappingRecord.fromPolicyMappingRecord(mappingRecord));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we check if ModelPolicyMappingRecord.fromPolicyMappingRecord(mappingRecord) is null?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's fine not checking because the method is only called in writeToPolicyMappingRecords whose signature specify that the argument should be Nonnull. We also not check null in other methods like

void writeToGrantRecords(EntityManager session, PolarisGrantRecord grantRec) {
diagnosticServices.check(session != null, "session_is_null");
checkInitialized();
session.persist(ModelGrantRecord.fromGrantRecord(grantRec));
}

Probably we can add @Nonull annotation to the arguments here too?

}

void deleteFromPolicyMappingRecords(
EntityManager session, PolarisPolicyMappingRecord mappingRecord) {
diagnosticServices.check(session != null, "session_is_null");
checkInitialized();

ModelPolicyMappingRecord lookupPolicyMappingRecord =
lookupPolicyMappingRecord(
session,
mappingRecord.getTargetCatalogId(),
mappingRecord.getTargetId(),
mappingRecord.getPolicyTypeCode(),
mappingRecord.getPolicyCatalogId(),
mappingRecord.getPolicyId());

diagnosticServices.check(lookupPolicyMappingRecord != null, "policy_mapping_record_not_found");
session.remove(lookupPolicyMappingRecord);
}

void deleteAllEntityPolicyMappingRecords(EntityManager session, PolarisEntityCore 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);
}

ModelPolicyMappingRecord lookupPolicyMappingRecord(
EntityManager session,
long targetCatalogId,
long targetId,
long policyTypeCode,
long policyCatalogId,
long policyId) {
diagnosticServices.check(session != null, "session_is_null");
checkInitialized();

return session
.createQuery(
"SELECT m from ModelPolicyMappingRecord m "
+ "where m.targetCatalogId=:targetCatalogId "
+ "and m.targetId=:targetId "
+ "and m.policyTypeCode=:policyTypeCode "
+ "and m.policyCatalogId=:policyCatalogId "
+ "and m.policyId=:policyId",
ModelPolicyMappingRecord.class)
.setParameter("targetCatalogId", targetCatalogId)
.setParameter("targetId", targetId)
.setParameter("policyTypeCode", policyTypeCode)
.setParameter("policyCatalogId", policyCatalogId)
.setParameter("policyId", policyId)
.getResultStream()
.findFirst()
.orElse(null);
}

List<ModelPolicyMappingRecord> loadPoliciesOnTargetByType(
EntityManager session, long targetCatalogId, long targetId, int policyTypeCode) {
diagnosticServices.check(session != null, "session_is_null");
checkInitialized();

return session
.createQuery(
"SELECT m from ModelPolicyMappingRecord m "
+ "where m.targetCatalogId=:targetCatalogId "
+ "and m.targetId=:targetId "
+ "and m.policyTypeCode=:policyTypeCode",
ModelPolicyMappingRecord.class)
.setParameter("targetCatalogId", targetCatalogId)
.setParameter("targetId", targetId)
.setParameter("policyTypeCode", policyTypeCode)
.getResultList();
}

List<ModelPolicyMappingRecord> loadAllPoliciesOnTarget(
EntityManager session, long targetCatalogId, long targetId) {
diagnosticServices.check(session != null, "session_is_null");
checkInitialized();

return session
.createQuery(
"SELECT m from ModelPolicyMappingRecord m "
+ " where m.targetCatalogId=:targetCatalogId "
+ "and m.targetId=:targetId",
ModelPolicyMappingRecord.class)
.setParameter("targetCatalogId", targetCatalogId)
.setParameter("targetId", targetId)
.getResultList();
}

List<ModelPolicyMappingRecord> loadAllTargetsOnPolicy(
EntityManager session, long policyCatalogId, long policyId) {
diagnosticServices.check(session != null, "session_is_null");
checkInitialized();

return session
.createQuery(
"SELECT m from ModelPolicyMappingRecord m "
+ "where m.policyCatalogId=:policyCatalogId "
+ "and m.policyId=:policyId",
ModelPolicyMappingRecord.class)
.setParameter("policyCatalogId", policyCatalogId)
.setParameter("policyId", policyId)
.getResultList();
}

private void checkInitialized() {
diagnosticServices.check(this.initialized.get(), "store_not_initialized");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
<class>org.apache.polaris.jpa.models.ModelEntityActive</class>
<class>org.apache.polaris.jpa.models.ModelEntityChangeTracking</class>
<class>org.apache.polaris.jpa.models.ModelGrantRecord</class>
<class>org.apache.polaris.jpa.models.ModelPolicyMappingRecord</class>
<class>org.apache.polaris.jpa.models.ModelPrincipalSecrets</class>
<class>org.apache.polaris.jpa.models.ModelSequenceId</class>
<shared-cache-mode>NONE</shared-cache-mode>
Expand Down
Loading