Skip to content

Commit

Permalink
SHIBUI-2614
Browse files Browse the repository at this point in the history
Fixing performance getting versions for Entity Descriptors
  • Loading branch information
chasegawa committed Oct 3, 2023
1 parent c0bb485 commit e6baac8
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 15 deletions.
50 changes: 50 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 != ''
```
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<Version> findVersionsForPersistentEntity(String resourceId, Class<?> entityClass) {
Expand All @@ -42,6 +52,17 @@ public List<Version> findVersionsForPersistentEntity(String resourceId, Class<?>
return (List<Version>) listOfVersions;
}

public List<Version> 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<Version>) listOfVersions;
}

public Object findSpecificVersionOfPersistentEntity(String resourceId, String versionId, Class<?> entityClass) {
try {
AbstractAuditable abstractAuditable =
Expand Down
Original file line number Diff line number Diff line change
@@ -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;


Expand Down Expand Up @@ -62,4 +64,7 @@ public interface EntityDescriptorRepository extends JpaRepository<EntityDescript

@Query("SELECT COUNT(ed) FROM EntityDescriptor ed WHERE ed.serviceEnabled = true")
int getActiveEntityCount();

@Query(value = "select aud.rev, aud.modified_by, aud.modified_date from entity_descriptor_aud aud, entity_descriptor ed where ed.id=aud.id and ed.resource_id = :resourceId ", nativeQuery = true)
List<Map<String, Object>> findEntityDescriptorVersions(@Param("resourceId") String resourceId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public EnversEntityDescriptorVersionService(EnversVersionServiceSupport enversVe

@Override
public List<Version> findVersionsForEntityDescriptor(String resourceId) throws PersistentEntityNotFound {
List<Version> results = enversVersionServiceSupport.findVersionsForPersistentEntity(resourceId, EntityDescriptor.class);
List<Version> results = enversVersionServiceSupport.findVersionsForPersistentEntityDescriptor(resourceId);
if (results.isEmpty()) {
throw new PersistentEntityNotFound(String.format("No versions found for entity descriptor with resource id [%s].", resourceId));
}
Expand Down

0 comments on commit e6baac8

Please sign in to comment.