Skip to content
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

Policy Entity, Policy Types, and PolicyMappingRecord with Persistence Impl #1104

Draft
wants to merge 13 commits into
base: main
Choose a base branch
from
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 @@ -529,6 +531,90 @@ public int lookupEntityGrantRecordsVersion(
.toList();
}

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

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

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

/** {@inheritDoc} */
@Override
public void deleteAllEntityPolicyMappingRecords(
@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 lookupPolicyMappingRecord(
@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> loadPoliciesOnTargetByType(
@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> loadAllPoliciesOnTarget(
@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> loadAllPoliciesOnPolicy(
@Nonnull PolarisCallContext callCtx, long policyCatalogId, long policyId) {
return this.store
.loadAllPoliciesOnPolicy(localSession.get(), policyCatalogId, policyId)
.stream()
.map(ModelPolicyMappingRecord::toPolicyMappingRecord)
.toList();
}

/** {@inheritDoc} */
@Override
public @Nullable PolarisPrincipalSecrets loadPrincipalSecrets(
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,121 @@ 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));
}

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();

loadAllPoliciesOnPolicy(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> loadAllPoliciesOnPolicy(
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