From e6baac8f26c242ab8a0d3909849b20075e89b719 Mon Sep 17 00:00:00 2001 From: chasegawa Date: Tue, 3 Oct 2023 13:26:03 -0700 Subject: [PATCH] SHIBUI-2614 Fixing performance getting versions for Entity Descriptors --- README.md | 50 +++++++++++++++++++ .../EntitiesVersioningConfiguration.java | 13 ++--- .../admin/ui/domain/AbstractAuditable.java | 8 +-- .../admin/ui/domain/util/DateConverter.java | 18 +++++++ .../envers/EnversVersionServiceSupport.java | 25 +++++++++- .../EntityDescriptorRepository.java | 5 ++ .../EnversEntityDescriptorVersionService.java | 2 +- 7 files changed, 106 insertions(+), 15 deletions(-) create mode 100644 backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/util/DateConverter.java diff --git a/README.md b/README.md index 9f31bc7e4..da6af5ee0 100644 --- a/README.md +++ b/README.md @@ -114,4 +114,54 @@ springdoc.pathsToMatch=/entities, /api/** # This property enables the openapi and swagger-ui endpoints to be exposed beneath the actuator base path. management.endpoints.web.exposure.include=openapi, swagger-ui management.server.port=9090 +``` + +## Random SQL +### Get Release attributes for a given entity id +```sql +select xs_stringvalue +from xsstring +where id in (select attribute_values_id + from attribute_abstractxmlobject + where attribute_id = (select id + from attribute + where id in (select attributes_id + from entity_attributes_attribute + where entity_attributes_id = (select unknownxmlobjects_id + from abstract_element_extensiblexmlobject_abstractxmlobject + where abstract_element_extensiblexmlobject_id = + (select extensions_id from entity_descriptor where entityid = 'someentityid'))) + and name = 'http://shibboleth.net/ns/attributes/releaseAllValues')) +``` + +### Get Relying Party Overrides by entity id +```sql +with join_table as (select rpo.id1, + rpo.id2 + from (select attribute_id id1, attribute_values_id id2 + from attribute_abstractxmlobject + where attribute_id in (select id + from attribute + where id in (select attributes_id + from entity_attributes_attribute + where entity_attributes_id = (select unknownxmlobjects_id + from abstract_element_extensiblexmlobject_abstractxmlobject + where abstract_element_extensiblexmlobject_id = + (select extensions_id from entity_descriptor where entityid = 'someentityid'))))) as rpo) +select attribute_1.name relying_party_override, + attribute_2.value +from join_table + inner join + attribute as attribute_1 + on join_table.id1 = attribute_1.id + inner join + (select id, stored_value value from xsboolean + UNION + select id, CAST(int_value AS varchar) value from xsinteger + UNION + select id, xs_stringvalue value from xsstring + UNION + select id, text_context value from xsany) as attribute_2 + on join_table.id2 = attribute_2.id +where value is not null and value != '' ``` \ No newline at end of file diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/EntitiesVersioningConfiguration.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/EntitiesVersioningConfiguration.java index abe82bc78..cb24c8fcd 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/EntitiesVersioningConfiguration.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/configuration/EntitiesVersioningConfiguration.java @@ -1,6 +1,7 @@ package edu.internet2.tier.shibboleth.admin.ui.configuration; import edu.internet2.tier.shibboleth.admin.ui.envers.EnversVersionServiceSupport; +import edu.internet2.tier.shibboleth.admin.ui.repository.EntityDescriptorRepository; import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorService; import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorVersionService; import edu.internet2.tier.shibboleth.admin.ui.service.EnversEntityDescriptorVersionService; @@ -18,17 +19,17 @@ public class EntitiesVersioningConfiguration { private EntityManager entityManager; @Bean - public EntityDescriptorVersionService entityDescriptorVersionService(EntityDescriptorService entityDescriptorService) { - return new EnversEntityDescriptorVersionService(enversVersionServiceSupport(), entityDescriptorService); + public EntityDescriptorVersionService entityDescriptorVersionService(EntityDescriptorService entityDescriptorService, EntityDescriptorRepository repo) { + return new EnversEntityDescriptorVersionService(enversVersionServiceSupport(repo), entityDescriptorService); } @Bean - public MetadataResolverVersionService metadataResolverVersionService() { - return new EnversMetadataResolverVersionService(enversVersionServiceSupport()); + public MetadataResolverVersionService metadataResolverVersionService(EntityDescriptorRepository repo) { + return new EnversMetadataResolverVersionService(enversVersionServiceSupport(repo)); } @Bean - public EnversVersionServiceSupport enversVersionServiceSupport() { - return new EnversVersionServiceSupport(entityManager); + public EnversVersionServiceSupport enversVersionServiceSupport(EntityDescriptorRepository repo) { + return new EnversVersionServiceSupport(entityManager, repo); } } \ No newline at end of file diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java index 1ddbcf6a8..0391dcdb8 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; +import edu.internet2.tier.shibboleth.admin.ui.domain.util.DateConverter; import io.swagger.v3.oas.annotations.Hidden; import jakarta.persistence.Column; import jakarta.persistence.EntityListeners; @@ -137,12 +138,7 @@ public void markAsCurrent() { } private static ZonedDateTime toZonedDateTime(LocalDateTime localDateTime) { - return localDateTime - .atZone(ZoneId.systemDefault()) - .toInstant() - .atOffset(ZoneOffset.UTC) - .toZonedDateTime() - .truncatedTo(ChronoUnit.MILLIS); + return DateConverter.toZonedDateTime(localDateTime); } @EqualsAndHashCode.Include diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/util/DateConverter.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/util/DateConverter.java new file mode 100644 index 000000000..518444425 --- /dev/null +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/util/DateConverter.java @@ -0,0 +1,18 @@ +package edu.internet2.tier.shibboleth.admin.ui.domain.util; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; + +public class DateConverter { + public static ZonedDateTime toZonedDateTime(LocalDateTime localDateTime) { + return localDateTime + .atZone(ZoneId.systemDefault()) + .toInstant() + .atOffset(ZoneOffset.UTC) + .toZonedDateTime() + .truncatedTo(ChronoUnit.MILLIS); + } +} \ No newline at end of file diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java index db696b0ea..2b88d1bcc 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/envers/EnversVersionServiceSupport.java @@ -1,13 +1,22 @@ package edu.internet2.tier.shibboleth.admin.ui.envers; import edu.internet2.tier.shibboleth.admin.ui.domain.AbstractAuditable; +import edu.internet2.tier.shibboleth.admin.ui.domain.util.DateConverter; import edu.internet2.tier.shibboleth.admin.ui.domain.versioning.Version; +import edu.internet2.tier.shibboleth.admin.ui.repository.EntityDescriptorRepository; import jakarta.persistence.EntityManager; import jakarta.persistence.NoResultException; +import jakarta.persistence.Temporal; import org.hibernate.envers.AuditReaderFactory; import org.hibernate.envers.query.AuditEntity; +import java.sql.Timestamp; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.temporal.TemporalAccessor; +import java.util.ArrayList; import java.util.List; +import java.util.Map; import static java.util.Comparator.comparing; import static java.util.stream.Collectors.toList; @@ -17,11 +26,12 @@ * to query for revisions of various persistent entities. */ public class EnversVersionServiceSupport { - + private final EntityDescriptorRepository repository; private EntityManager entityManager; - public EnversVersionServiceSupport(EntityManager entityManager) { + public EnversVersionServiceSupport(EntityManager entityManager, EntityDescriptorRepository repository) { this.entityManager = entityManager; + this.repository = repository; } public List findVersionsForPersistentEntity(String resourceId, Class entityClass) { @@ -42,6 +52,17 @@ public List findVersionsForPersistentEntity(String resourceId, Class return (List) listOfVersions; } + public List findVersionsForPersistentEntityDescriptor(String resourceId) { + Object listOfVersions = repository.findEntityDescriptorVersions(resourceId).stream() + .map(it -> { + return new Version(it.get("REV").toString(), it.get("MODIFIED_BY").toString(), DateConverter.toZonedDateTime(((Timestamp) it.get("MODIFIED_DATE")).toLocalDateTime()) ); + }) + .sorted(comparing(Version::getDate)) + .collect(toList()); + + return (List) listOfVersions; + } + public Object findSpecificVersionOfPersistentEntity(String resourceId, String versionId, Class entityClass) { try { AbstractAuditable abstractAuditable = diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/EntityDescriptorRepository.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/EntityDescriptorRepository.java index 44ca96afe..fdd00e0c0 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/EntityDescriptorRepository.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/repository/EntityDescriptorRepository.java @@ -1,11 +1,13 @@ package edu.internet2.tier.shibboleth.admin.ui.repository; import edu.internet2.tier.shibboleth.admin.ui.domain.EntityDescriptor; +import edu.internet2.tier.shibboleth.admin.ui.domain.versioning.Version; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.util.List; +import java.util.Map; import java.util.stream.Stream; @@ -62,4 +64,7 @@ public interface EntityDescriptorRepository extends JpaRepository> findEntityDescriptorVersions(@Param("resourceId") String resourceId); } \ No newline at end of file diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EnversEntityDescriptorVersionService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EnversEntityDescriptorVersionService.java index 398517a51..7e99f7061 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EnversEntityDescriptorVersionService.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/EnversEntityDescriptorVersionService.java @@ -24,7 +24,7 @@ public EnversEntityDescriptorVersionService(EnversVersionServiceSupport enversVe @Override public List findVersionsForEntityDescriptor(String resourceId) throws PersistentEntityNotFound { - List results = enversVersionServiceSupport.findVersionsForPersistentEntity(resourceId, EntityDescriptor.class); + List results = enversVersionServiceSupport.findVersionsForPersistentEntityDescriptor(resourceId); if (results.isEmpty()) { throw new PersistentEntityNotFound(String.format("No versions found for entity descriptor with resource id [%s].", resourceId)); }