Skip to content

Commit

Permalink
Fix sorting bug (#2404)
Browse files Browse the repository at this point in the history
Fix sorting bug

RISDEV-5333
  • Loading branch information
HPrinz authored Nov 27, 2024
1 parent 1c403b1 commit 86994b8
Show file tree
Hide file tree
Showing 9 changed files with 136 additions and 101 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.Transient;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.util.UUID;
Expand Down Expand Up @@ -55,4 +56,6 @@ public class DependentLiteratureCitationDTO {
private String documentTypeRawValue;

private Integer rank;

@Transient private Integer editionRank;
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import lombok.AllArgsConstructor;
Expand Down Expand Up @@ -54,18 +55,18 @@ public class LegalPeriodicalEditionDTO {
private List<EditionReferenceDTO> editionReferences = new ArrayList<>();

// Methods to get references and literature citations
public List<UUID> getLiteratureCitations() {
public Map<UUID, Integer> getLiteratureCitations() {
return editionReferences.stream()
.filter(ref -> LITERATURE.equals(ref.getDtype()))
.map(EditionReferenceDTO::getReferenceId)
.collect(Collectors.toList());
.collect(
Collectors.toMap(EditionReferenceDTO::getReferenceId, EditionReferenceDTO::getRank));
}

public List<UUID> getReferences() {
public Map<UUID, Integer> getReferences() {
return editionReferences.stream()
.filter(ref -> REFERENCE.equals(ref.getDtype()))
.map(EditionReferenceDTO::getReferenceId)
.collect(Collectors.toList());
.collect(
Collectors.toMap(EditionReferenceDTO::getReferenceId, EditionReferenceDTO::getRank));
}

public void setLiteratureCitations(List<DependentLiteratureCitationDTO> literatureCitations) {
Expand All @@ -77,7 +78,7 @@ public void setLiteratureCitations(List<DependentLiteratureCitationDTO> literatu
EditionReferenceDTO editionReference = new EditionReferenceDTO();
editionReference.setEdition(this);
editionReference.setReferenceId(citation.getId());
editionReference.setRank(citation.getRank());
editionReference.setRank(citation.getEditionRank());
editionReference.setDtype(LITERATURE);
editionReferences.add(editionReference);
}
Expand All @@ -91,7 +92,7 @@ public void setReferences(List<ReferenceDTO> references) {
for (ReferenceDTO reference : references) {
EditionReferenceDTO editionReference = new EditionReferenceDTO();
editionReference.setReferenceId(reference.getId());
editionReference.setRank(reference.getRank());
editionReference.setRank(reference.getEditionRank());
editionReference.setDtype(REFERENCE);
editionReference.setEdition(this);
editionReferences.add(editionReference);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

Expand Down Expand Up @@ -60,15 +62,34 @@ public List<LegalPeriodicalEdition> findAllByLegalPeriodicalId(UUID legalPeriodi
@Transactional(transactionManager = "jpaTransactionManager")
public LegalPeriodicalEdition save(LegalPeriodicalEdition legalPeriodicalEdition) {

List<ReferenceDTO> referenceDTOS = createReferenceDTOs(legalPeriodicalEdition);
List<DependentLiteratureCitationDTO> dependentLiteratureCitationDTOS =
createLiteratureReferenceDTOs(legalPeriodicalEdition);
deleteDocUnitLinksForDeletedReferences(legalPeriodicalEdition);
List<ReferenceDTO> referenceDTOS = new ArrayList<>();
List<DependentLiteratureCitationDTO> dependentLiteratureCitationDTOS = new ArrayList<>();

AtomicInteger editionRank = new AtomicInteger(1);
for (Reference reference :
Optional.ofNullable(legalPeriodicalEdition.references()).orElse(List.of())) {

var docUnit =
documentationUnitRepository.findByDocumentNumber(
reference.documentationUnit().getDocumentNumber());

if (docUnit.isEmpty()) {
continue;
}
if (reference.referenceType().equals(ReferenceType.CASELAW)) {
referenceDTOS.add(createReferenceDTO(reference, docUnit.get(), editionRank));
}
if (reference.referenceType().equals(ReferenceType.LITERATURE)) {
dependentLiteratureCitationDTOS.add(
createLiteratureCitationDTO(reference, docUnit.get(), editionRank));
}
}

var editionDTO = LegalPeriodicalEditionTransformer.transformToDTO(legalPeriodicalEdition);
editionDTO.setReferences(referenceDTOS); // Add the new references
editionDTO.setLiteratureCitations(
dependentLiteratureCitationDTOS); // Add the new literature references
editionDTO.setReferences(referenceDTOS);
editionDTO.setLiteratureCitations(dependentLiteratureCitationDTOS);

deleteDocUnitLinksForDeletedReferences(legalPeriodicalEdition);

return LegalPeriodicalEditionTransformer.transformToDomain(repository.save(editionDTO))
.toBuilder()
Expand All @@ -81,20 +102,32 @@ private ArrayList<Reference> addReferences(LegalPeriodicalEditionDTO editionDTO)

if (editionDTO.getReferences() != null) {
references.addAll(
editionDTO.getReferences().stream()
.map(id -> referenceRepository.findById(id).orElse(null))
editionDTO.getReferences().entrySet().stream()
.map(
entry ->
referenceRepository
.findById(entry.getKey())
.map(dto -> dto.toBuilder().editionRank(entry.getValue()).build())
.orElse(null))
.map(ReferenceTransformer::transformToDomain)
.toList());
}

if (editionDTO.getLiteratureCitations() != null) {
references.addAll(
editionDTO.getLiteratureCitations().stream()
.map(id -> dependentLiteratureCitationRepository.findById(id).orElse(null))
editionDTO.getLiteratureCitations().entrySet().stream()
.map(
entry ->
dependentLiteratureCitationRepository
.findById(entry.getKey())
.map(dto -> dto.toBuilder().editionRank(entry.getValue()).build())
.orElse(null))
.map(DependentLiteratureTransformer::transformToDomain)
.toList());
}
return references;
return references.stream()
.sorted(Comparator.comparingInt(Reference::rank))
.collect(Collectors.toCollection(ArrayList::new));
}

private void deleteDocUnitLinksForDeletedReferences(LegalPeriodicalEdition updatedEdition) {
Expand All @@ -103,12 +136,12 @@ private void deleteDocUnitLinksForDeletedReferences(LegalPeriodicalEdition updat
return;
}
// Ensure it's removed from DocumentationUnit's references
for (UUID reference : oldEdition.get().getReferences()) {
for (Map.Entry<UUID, Integer> reference : oldEdition.get().getReferences().entrySet()) {
// skip all existing and null references
var referenceDTO = referenceRepository.findById(reference);
var referenceDTO = referenceRepository.findById(reference.getKey());
if (referenceDTO.isEmpty()
|| updatedEdition.references().stream()
.anyMatch(newReference -> newReference.id().equals(reference))) {
.anyMatch(newReference -> newReference.id().equals(reference.getKey()))) {
continue;
}

Expand All @@ -121,7 +154,7 @@ private void deleteDocUnitLinksForDeletedReferences(LegalPeriodicalEdition updat
if (docUnit.getSource().stream()
.findFirst()
.map(SourceDTO::getReference)
.filter(ref -> ref.getId().equals(reference))
.filter(ref -> ref.getId().equals(reference.getKey()))
.isPresent()) {
docUnit.getSource().removeFirst();
}
Expand All @@ -130,74 +163,51 @@ private void deleteDocUnitLinksForDeletedReferences(LegalPeriodicalEdition updat
}
}

@NotNull
private List<ReferenceDTO> createReferenceDTOs(LegalPeriodicalEdition legalPeriodicalEdition) {
List<ReferenceDTO> referenceDTOS = new ArrayList<>();
if (legalPeriodicalEdition.references() == null) {
return referenceDTOS;
}
for (Reference reference : legalPeriodicalEdition.references()) {
var docUnit =
documentationUnitRepository.findByDocumentNumber(
reference.documentationUnit().getDocumentNumber());
if (docUnit.isEmpty() || !reference.referenceType().equals(ReferenceType.CASELAW)) {
continue;
}
var newReference = ReferenceTransformer.transformToDTO(reference);
newReference.setDocumentationUnit(docUnit.get());

// keep rank for existing references and set to max rank +1 for new references
newReference.setRank(
docUnit.get().getReferences().stream()
.filter(referenceDTO -> referenceDTO.getId().equals(reference.id()))
.findFirst()
.map(ReferenceDTO::getRank)
.orElseGet(
() ->
docUnit.get().getReferences().stream()
.map(ReferenceDTO::getRank)
.max(Comparator.naturalOrder())
.orElse(0)
+ 1));

referenceDTOS.add(referenceRepository.save(newReference));
}

return referenceDTOS;
private ReferenceDTO createReferenceDTO(
Reference reference, DocumentationUnitDTO docUnit, AtomicInteger editionRank) {
var newReference = ReferenceTransformer.transformToDTO(reference);
newReference.setDocumentationUnit(docUnit);

// keep rank for existing references and set to max rank +1 for new references
newReference.setRank(
docUnit.getReferences().stream()
.filter(referenceDTO -> referenceDTO.getId().equals(reference.id()))
.findFirst()
.map(ReferenceDTO::getRank)
.orElseGet(
() ->
docUnit.getReferences().stream()
.map(ReferenceDTO::getRank)
.max(Comparator.naturalOrder())
.orElse(0)
+ 1));

return referenceRepository.save(newReference).toBuilder()
.editionRank(editionRank.getAndIncrement())
.build();
}

private List<DependentLiteratureCitationDTO> createLiteratureReferenceDTOs(
LegalPeriodicalEdition legalPeriodicalEdition) {
List<DependentLiteratureCitationDTO> dependentLiteratureCitationDTOS = new ArrayList<>();
if (legalPeriodicalEdition.references() == null) {
return dependentLiteratureCitationDTOS;
}
for (Reference reference : legalPeriodicalEdition.references()) {
var docUnit =
documentationUnitRepository.findByDocumentNumber(
reference.documentationUnit().getDocumentNumber());
if (docUnit.isEmpty() || !reference.referenceType().equals(ReferenceType.LITERATURE)) {
continue;
}

var newReference = DependentLiteratureTransformer.transformToDTO(reference);
newReference.setDocumentationUnit(docUnit.get());
// keep rank for existing references and set to max rank +1 for new references
newReference.setRank(
docUnit.get().getReferences().stream()
.filter(referenceDTO -> referenceDTO.getId().equals(reference.id()))
.findFirst()
.map(ReferenceDTO::getRank)
.orElseGet(
() ->
docUnit.get().getDependentLiteratureCitations().stream()
.map(DependentLiteratureCitationDTO::getRank)
.max(Comparator.naturalOrder())
.orElse(0)
+ 1));
dependentLiteratureCitationDTOS.add(dependentLiteratureCitationRepository.save(newReference));
}
return dependentLiteratureCitationDTOS;
private DependentLiteratureCitationDTO createLiteratureCitationDTO(
Reference reference, DocumentationUnitDTO docUnit, AtomicInteger editionRank) {
var newReference = DependentLiteratureTransformer.transformToDTO(reference);
newReference.setDocumentationUnit(docUnit);

// keep rank for existing references and set to max rank +1 for new references
newReference.setRank(
docUnit.getReferences().stream()
.filter(referenceDTO -> referenceDTO.getId().equals(reference.id()))
.findFirst()
.map(ReferenceDTO::getRank)
.orElseGet(
() ->
docUnit.getDependentLiteratureCitations().stream()
.map(DependentLiteratureCitationDTO::getRank)
.max(Comparator.naturalOrder())
.orElse(0)
+ 1));
return dependentLiteratureCitationRepository.save(newReference).toBuilder()
.editionRank(editionRank.getAndIncrement())
.build();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.persistence.Transient;
import jakarta.validation.constraints.NotNull;
import java.util.List;
import java.util.UUID;
Expand Down Expand Up @@ -60,4 +61,6 @@ public class ReferenceDTO {
insertable = false,
updatable = false)
private List<EditionReferenceDTO> editionReferences;

@Transient private Integer editionRank;
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ public static Reference transformToDomain(DependentLiteratureCitationDTO literat
.documentationUnit(
RelatedDocumentationUnitTransformer.transformToDomain(
literatureCitationDTO.getDocumentationUnit()))
// editionRank is only set if reference is requested from edition
.rank(
literatureCitationDTO.getEditionRank() != null
? literatureCitationDTO.getEditionRank()
: literatureCitationDTO.getRank())
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ public static Reference transformToDomain(ReferenceDTO referenceDTO) {
.documentationUnit(
RelatedDocumentationUnitTransformer.transformToDomain(
referenceDTO.getDocumentationUnit()))
// editionRank is only set if reference is requested from edition
.rank(
referenceDTO.getEditionRank() != null
? referenceDTO.getEditionRank()
: referenceDTO.getRank())
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,5 @@ public record Reference(
DocumentType documentType,
String author,
ReferenceType referenceType,
RelatedDocumentationUnit documentationUnit) {}
RelatedDocumentationUnit documentationUnit,
int rank) {}
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,18 @@ private static Stream<Arguments> provideReferencesTestData_toDomain() {
.legalPeriodical(createTestLegalPeriodicalDTO())
.build(),
Reference.builder()
.rank(1)
.citation("2024, 123")
.footnote("footnote")
.referenceSupplement("Klammerzusatz")
.referenceType(ReferenceType.CASELAW)
.documentationUnit(createTestRelatedDocument())
.legalPeriodical(createTestLegalPeriodical())
.build()),
// without legal periodical
// without legal periodical, with editionRank
Arguments.of(
ReferenceDTO.builder()
.editionRank(3)
.rank(1)
.citation("2024, 123")
.footnote("footnote")
Expand All @@ -54,6 +56,7 @@ private static Stream<Arguments> provideReferencesTestData_toDomain() {
.documentationUnit(createTestDocumentationUnitDTO())
.build(),
Reference.builder()
.rank(3)
.citation("2024, 123")
.footnote("footnote")
.referenceSupplement("Klammerzusatz")
Expand Down
Loading

0 comments on commit 86994b8

Please sign in to comment.