Skip to content

Commit

Permalink
MODLD-261: merging graphs as java objects PoC (#200)
Browse files Browse the repository at this point in the history
* MODLD-261 POC: Verify the default merging logic by Hibernate

* MODLD-261: merging graphs as java objects PoC

* MODLD-290: minor adjustments

* MODLD-290: use custom merging in create/update

---------

Co-authored-by: PK Jacob <[email protected]>
  • Loading branch information
PBobylev and pkjacob authored Mar 18, 2024
1 parent b39182d commit bb218c7
Show file tree
Hide file tree
Showing 6 changed files with 366 additions and 8 deletions.
16 changes: 16 additions & 0 deletions .run/LinkedDataApplication [LocalDev].run.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="LinkedDataApplication [LocalDev]" type="Application" factoryName="Application">
<option name="MAIN_CLASS_NAME" value="org.folio.linked.data.LinkedDataApplication" />
<module name="mod-linked-data" />
<option name="VM_PARAMETERS" value="-Dspring.profiles.active=folio,search,localDev" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="org.folio.linked.data.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.folio.linked.data.domain.dto.ResourceDto;
import org.folio.linked.data.domain.dto.ResourceGraphDto;
import org.folio.linked.data.domain.dto.ResourceShortInfoPage;
import org.folio.linked.data.model.entity.Resource;

public interface ResourceService {

Expand All @@ -22,4 +23,7 @@ public interface ResourceService {
void updateIndexDateBatch(Set<Long> ids);

ResourceGraphDto getResourceGraphById(Long id);

Resource saveMergingGraph(Resource resource);

}
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ public ResourceDto createResource(ResourceDto resourceDto) {
if (resourceRepo.existsById(mapped.getResourceHash())) {
throw new AlreadyExistsException(RESOURCE_WITH_GIVEN_ID + mapped.getResourceHash() + EXISTS_ALREADY);
}
var persisted = resourceRepo.save(mapped);
log.info("createResource [{}]\nfrom Marva DTO [{}]", persisted, resourceDto);
log.info("createResource\n[{}]\nfrom Marva DTO [{}]", mapped, resourceDto);
var persisted = saveMergingGraph(mapped);
extractWork(persisted)
.map(ResourceCreatedEvent::new)
.ifPresentOrElse(applicationEventPublisher::publishEvent,
Expand All @@ -73,7 +73,7 @@ public ResourceDto createResource(ResourceDto resourceDto) {
@Override
public Long createResource(org.folio.ld.dictionary.model.Resource modelResource) {
var mapped = resourceModelMapper.toEntity(modelResource);
var persisted = resourceRepo.save(mapped);
var persisted = saveMergingGraph(mapped);
log.info("createResource [{}]\nfrom modelResource [{}]", persisted, modelResource);
extractWork(persisted)
.map(ResourceCreatedEvent::new)
Expand All @@ -99,7 +99,7 @@ public ResourceDto updateResource(Long id, ResourceDto resourceDto) {
breakCircularEdges(old);
resourceRepo.delete(old);
var mapped = resourceDtoMapper.toEntity(resourceDto);
var persisted = resourceRepo.save(mapped);
var persisted = saveMergingGraph(mapped);
if (isOfType(persisted, WORK)) {
applicationEventPublisher.publishEvent(new ResourceUpdatedEvent(persisted, oldWork));
} else {
Expand All @@ -108,6 +108,36 @@ public ResourceDto updateResource(Long id, ResourceDto resourceDto) {
return resourceDtoMapper.toDto(persisted);
}

@Override
public Resource saveMergingGraph(Resource resource) {
resource = takeExistingAddingNewEdges(resource, 4);
return resourceRepo.save(resource);
}

private Resource takeExistingAddingNewEdges(Resource newResource, int edgesDeep) {
final var counter = --edgesDeep;
if (counter <= 0) {
return newResource;
}
return resourceRepo.findById(newResource.getResourceHash())
.map(existed -> {
newResource.getOutgoingEdges().stream()
.map(newOe -> new ResourceEdge(existed, takeExistingAddingNewEdges(newOe.getTarget(), counter),
newOe.getPredicate()))
.forEach(existed.getOutgoingEdges()::add);
newResource.getIncomingEdges().stream()
.map(newIe -> new ResourceEdge(takeExistingAddingNewEdges(newIe.getSource(), counter), existed,
newIe.getPredicate()))
.forEach(existed.getIncomingEdges()::add);
return existed;
})
.orElseGet(() -> {
newResource.getOutgoingEdges().forEach(oe -> oe.setTarget(takeExistingAddingNewEdges(oe.getTarget(), counter)));
newResource.getIncomingEdges().forEach(ie -> ie.setSource(takeExistingAddingNewEdges(ie.getSource(), counter)));
return newResource;
});
}

private void reindexParentWorkAfterInstanceUpdate(Resource instance, Resource oldWork) {
extractWork(instance).ifPresentOrElse(newWork -> {
if (nonNull(oldWork) && newWork.getResourceHash().equals(oldWork.getResourceHash())) {
Expand Down
Loading

0 comments on commit bb218c7

Please sign in to comment.