1818import org .brapi .test .BrAPITestServer .model .entity .germ .PedigreeEdgeEntity ;
1919import org .brapi .test .BrAPITestServer .model .entity .germ .PedigreeEdgeEntity .EdgeType ;
2020import org .brapi .test .BrAPITestServer .model .entity .germ .PedigreeNodeEntity ;
21+ import org .brapi .test .BrAPITestServer .repository .germ .PedigreeEdgeRepository ;
2122import org .brapi .test .BrAPITestServer .repository .germ .PedigreeRepository ;
2223import org .brapi .test .BrAPITestServer .service .PagingUtility ;
2324import org .brapi .test .BrAPITestServer .service .SearchQueryBuilder ;
@@ -45,13 +46,15 @@ public class PedigreeService {
4546 private static final Logger log = LoggerFactory .getLogger (PedigreeService .class );
4647
4748 private final PedigreeRepository pedigreeRepository ;
49+ private final PedigreeEdgeRepository pedigreeEdgeRepository ;
4850 private final CrossingProjectService crossingProjectService ;
4951 private final GermplasmService germplasmService ;
5052
5153 @ Autowired
52- public PedigreeService (PedigreeRepository pedigreeRepository , CrossingProjectService crossingProjectService ,
53- GermplasmService germplasmService ) {
54+ public PedigreeService (PedigreeRepository pedigreeRepository , PedigreeEdgeRepository pedigreeEdgeRepository ,
55+ CrossingProjectService crossingProjectService , GermplasmService germplasmService ) {
5456 this .pedigreeRepository = pedigreeRepository ;
57+ this .pedigreeEdgeRepository = pedigreeEdgeRepository ;
5558 this .crossingProjectService = crossingProjectService ;
5659 this .germplasmService = germplasmService ;
5760 }
@@ -284,12 +287,15 @@ public List<PedigreeNode> updatePedigreeNodes(Map<String, PedigreeNode> request)
284287 public void updateGermplasmPedigree (List <Germplasm > data ) throws BrAPIServerException {
285288 List <PedigreeNode > createPedigreeNodes = new ArrayList <>();
286289 Map <String , PedigreeNode > updatePedigreeNodes = new HashMap <>();
290+
291+ Map <String , PedigreeNodeEntity > nodesByGermplasm = getExistingPedigreeNodes (
292+ data .stream ().map (p -> p .getGermplasmDbId ()).collect (Collectors .toList ()));
293+
287294 for (Germplasm germplasm : data ) {
288- GermplasmEntity germplasmEntity = germplasmService .getGermplasmEntity (germplasm .getGermplasmDbId ());
289- if (germplasmEntity .getPedigree () == null ) {
290- createPedigreeNodes .add (convertFromGermplasmToPedigree (germplasm ));
291- } else {
295+ if (nodesByGermplasm .containsKey (germplasm .getGermplasmDbId ())) {
292296 updatePedigreeNodes .put (germplasm .getGermplasmDbId (), convertFromGermplasmToPedigree (germplasm ));
297+ } else {
298+ createPedigreeNodes .add (convertFromGermplasmToPedigree (germplasm ));
293299 }
294300 }
295301
@@ -299,18 +305,23 @@ public void updateGermplasmPedigree(List<Germplasm> data) throws BrAPIServerExce
299305 }
300306
301307 private Map <String , PedigreeNodeEntity > getExistingPedigreeNodes (List <String > germplasmDbIds ) {
302- PedigreeSearchRequest searchReq = new PedigreeSearchRequest ();
303- searchReq .setGermplasmDbIds (germplasmDbIds );
304- searchReq .setIncludeParents (false );
305- searchReq .setIncludeProgeny (false );
306- searchReq .setIncludeSiblings (false );
307-
308- List <PedigreeNodeEntity > nodeEntities = findPedigreeEntities (searchReq , null );
309308 Map <String , PedigreeNodeEntity > nodesByGermplasm = new HashMap <>();
310309
311- for (PedigreeNodeEntity nodeEntity : nodeEntities ) {
312- if (nodeEntity .getGermplasm () != null && nodeEntity .getGermplasm ().getId () != null ) {
313- nodesByGermplasm .put (nodeEntity .getGermplasm ().getId (), nodeEntity );
310+ if (null != germplasmDbIds && !germplasmDbIds .isEmpty ()) {
311+ PedigreeSearchRequest searchReq = new PedigreeSearchRequest ();
312+ searchReq .setGermplasmDbIds (germplasmDbIds );
313+ searchReq .setIncludeParents (false );
314+ searchReq .setIncludeProgeny (false );
315+ searchReq .setIncludeSiblings (false );
316+ searchReq .setPedigreeDepth (0 );
317+ searchReq .setProgenyDepth (0 );
318+
319+ List <PedigreeNodeEntity > nodeEntities = findPedigreeEntities (searchReq , null );
320+
321+ for (PedigreeNodeEntity nodeEntity : nodeEntities ) {
322+ if (nodeEntity .getGermplasm () != null && nodeEntity .getGermplasm ().getId () != null ) {
323+ nodesByGermplasm .put (nodeEntity .getGermplasm ().getId (), nodeEntity );
324+ }
314325 }
315326 }
316327
@@ -422,24 +433,22 @@ static public String getPedigreeString(PedigreeNodeEntity entity) {
422433 if (entity .getPedigreeString () == null || entity .getPedigreeString ().isEmpty ()) {
423434 String pedStr = "" ;
424435 if (entity .getParentEdges () != null && !entity .getParentEdges ().isEmpty ()) {
425- Optional <PedigreeNodeEntity > mother = entity .getParentEdges ().stream ()
426- .filter (parentEdge -> {return ParentType .FEMALE == parentEdge .getParentType ();})
427- .map (PedigreeEdgeEntity ::getConncetedNode )
428- .findFirst ();
429- Optional <PedigreeNodeEntity > father = entity .getParentEdges ().stream ()
430- .filter (parentEdge -> {return ParentType .MALE == parentEdge .getParentType ();})
431- .map (PedigreeEdgeEntity ::getConncetedNode )
432- .findFirst ();
433-
434- if (mother .isPresent ()) {
436+ Optional <PedigreeNodeEntity > mother = entity .getParentEdges ().stream ().filter (parentEdge -> {
437+ return ParentType .FEMALE == parentEdge .getParentType ();
438+ }).map (PedigreeEdgeEntity ::getConncetedNode ).findFirst ();
439+ Optional <PedigreeNodeEntity > father = entity .getParentEdges ().stream ().filter (parentEdge -> {
440+ return ParentType .MALE == parentEdge .getParentType ();
441+ }).map (PedigreeEdgeEntity ::getConncetedNode ).findFirst ();
442+
443+ if (mother .isPresent ()) {
435444 pedStr += mother .get ().getGermplasm ().getGermplasmName () + "/" ;
436- }else {
445+ } else {
437446 pedStr += "Unknown/" ;
438447 }
439-
440- if (father .isPresent ()) {
448+
449+ if (father .isPresent ()) {
441450 pedStr += father .get ().getGermplasm ().getGermplasmName ();
442- }else {
451+ } else {
443452 pedStr += "Unknown" ;
444453 }
445454 }
@@ -454,7 +463,7 @@ private void updateEntity(PedigreeNodeEntity entity, PedigreeNode node) throws B
454463 GermplasmEntity germplasm = germplasmService .getGermplasmEntity (node .getGermplasmDbId ());
455464 entity .setGermplasm (germplasm );
456465 }
457-
466+
458467 UpdateUtility .updateEntity (node , entity );
459468
460469 if (node .getCrossingYear () != null )
@@ -475,25 +484,37 @@ private void updateEntityWithEdges(PedigreeNodeEntity entity, PedigreeNode node)
475484 UpdateUtility .updateEntity (node , entity );
476485 updateEntity (entity , node );
477486 if (node .getParents () != null ) {
487+
488+ List <String > edgeIdsToDelete = new ArrayList <>();
489+ edgeIdsToDelete .addAll (entity .getParentEdges ().stream ().map (e -> e .getId ()).collect (Collectors .toList ()));
490+ edgeIdsToDelete .addAll (entity .getParentNodes ().stream ().flatMap (parent -> parent .getProgenyEdges ().stream ())
491+ .filter (childEdge -> childEdge .getConncetedNode ().equals (entity ))
492+ .map (e -> e .getId ()).collect (Collectors .toList ()));
493+
494+ pedigreeEdgeRepository .deleteAllByIdInBatch (edgeIdsToDelete );
495+ pedigreeEdgeRepository .flush ();
496+
478497 for (PedigreeNodeParents parentNode : node .getParents ()) {
479498 PedigreeNodeEntity parentEntity = findOrCreatePedigreeNode (parentNode .getGermplasmDbId ());
480- if (!entity .getParentNodes ().contains (parentEntity )) {
481- entity .addParent (parentEntity , parentNode .getParentType ());
482- }
483- if (!parentEntity .getProgenyNodes ().contains (entity )) {
484- parentEntity .addProgeny (entity , parentNode .getParentType ());
485- }
499+ entity .addParent (parentEntity , parentNode .getParentType ());
500+ parentEntity .addProgeny (entity , parentNode .getParentType ());
486501 }
487502 }
488503 if (node .getProgeny () != null ) {
504+
505+ List <String > edgeIdsToDelete = new ArrayList <>();
506+ edgeIdsToDelete .addAll (entity .getProgenyEdges ().stream ().map (e -> e .getId ()).collect (Collectors .toList ()));
507+ edgeIdsToDelete .addAll (entity .getProgenyNodes ().stream ().flatMap (progeny -> progeny .getParentEdges ().stream ())
508+ .filter (parentEdge -> parentEdge .getConncetedNode ().equals (entity ))
509+ .map (e -> e .getId ()).collect (Collectors .toList ()));
510+
511+ pedigreeEdgeRepository .deleteAllByIdInBatch (edgeIdsToDelete );
512+ pedigreeEdgeRepository .flush ();
513+
489514 for (PedigreeNodeParents childNode : node .getProgeny ()) {
490515 PedigreeNodeEntity childEntity = findOrCreatePedigreeNode (childNode .getGermplasmDbId ());
491- if (!entity .getProgenyNodes ().contains (childEntity )) {
492- entity .addProgeny (childEntity , childNode .getParentType ());
493- }
494- if (!childEntity .getParentNodes ().contains (entity )) {
495- childEntity .addParent (entity , childNode .getParentType ());
496- }
516+ entity .addProgeny (childEntity , childNode .getParentType ());
517+ childEntity .addParent (entity , childNode .getParentType ());
497518 }
498519 }
499520 }
0 commit comments