@@ -168,14 +168,32 @@ public Optional<PedigreeNodeEntity> getPedigreeNode(String germplasmDbId) {
168168 return node ;
169169 }
170170
171+ public PedigreeNodeEntity findOrCreatePedigreeNode (String germplasmDbId ) throws BrAPIServerException {
172+ Optional <PedigreeNodeEntity > nodeOpt = getPedigreeNode (germplasmDbId );
173+ PedigreeNodeEntity node ;
174+ if (nodeOpt .isPresent ()) {
175+ node = nodeOpt .get ();
176+ } else {
177+ GermplasmEntity germplasm = germplasmService .getGermplasmEntity (germplasmDbId );
178+ if (germplasm .getPedigree () != null ) {
179+ node = germplasm .getPedigree ();
180+ } else {
181+ PedigreeNodeEntity newNode = new PedigreeNodeEntity ();
182+ newNode .setGermplasm (germplasm );
183+ node = pedigreeRepository .saveAndFlush (newNode );
184+ }
185+ }
186+ return node ;
187+ }
188+
171189 public PedigreeNode getGermplasmPedigree (String germplasmDbId , Boolean includeSiblings )
172190 throws BrAPIServerException {
173- if (includeSiblings == null )
191+ if (includeSiblings == null )
174192 includeSiblings = false ;
175-
193+
176194 Optional <PedigreeNodeEntity > pedigreeEntityOpt = getPedigreeNode (germplasmDbId );
177195 PedigreeNode result = null ;
178- if (pedigreeEntityOpt .isPresent ()) {
196+ if (pedigreeEntityOpt .isPresent ()) {
179197 PedigreeSearchRequest psr = new PedigreeSearchRequest ();
180198 psr .setIncludeParents (true );
181199 psr .setIncludeProgeny (false );
@@ -366,17 +384,7 @@ private PedigreeNode convertFromEntity(PedigreeNodeEntity entity, PedigreeSearch
366384 }
367385 node .setCrossingYear (entity .getCrossingYear ());
368386 node .setFamilyCode (entity .getFamilyCode ());
369- if (entity .getPedigreeString () == null && entity .getParentEdges () != null
370- && !entity .getParentEdges ().isEmpty ()) {
371- List <PedigreeNodeEntity > parents = entity .getParentNodes ();
372- String pedStr = parents .get (0 ).getGermplasm ().getGermplasmName ();
373- for (int i = 1 ; i < parents .size (); i ++) {
374- pedStr += "/" + parents .get (i ).getGermplasm ().getGermplasmName ();
375- }
376- node .setPedigreeString (pedStr );
377- } else {
378- node .setPedigreeString (entity .getPedigreeString ());
379- }
387+ node .setPedigreeString (getPedigreeString (entity ));
380388 if (entity .getParentEdges () != null && request .isIncludeParents ()) {
381389 node .setParents (entity .getParentEdges ().stream ().map (edge -> {
382390 PedigreeNodeParents parent = new PedigreeNodeParents ();
@@ -407,6 +415,20 @@ private PedigreeNode convertFromEntity(PedigreeNodeEntity entity, PedigreeSearch
407415 }
408416 return node ;
409417 }
418+
419+ static public String getPedigreeString (PedigreeNodeEntity entity ) {
420+ if (entity .getPedigreeString () == null && entity .getParentEdges () != null
421+ && !entity .getParentEdges ().isEmpty ()) {
422+ List <PedigreeNodeEntity > parents = entity .getParentNodes ();
423+ String pedStr = parents .get (0 ).getGermplasm ().getGermplasmName ();
424+ for (int i = 1 ; i < parents .size (); i ++) {
425+ pedStr += "/" + parents .get (i ).getGermplasm ().getGermplasmName ();
426+ }
427+ return pedStr ;
428+ } else {
429+ return entity .getPedigreeString ();
430+ }
431+ }
410432
411433 private void updateEntity (PedigreeNodeEntity entity , PedigreeNode node ) throws BrAPIServerException {
412434 UpdateUtility .updateEntity (node , entity );
@@ -416,7 +438,7 @@ private void updateEntity(PedigreeNodeEntity entity, PedigreeNode node) throws B
416438 if (node .getFamilyCode () != null )
417439 entity .setFamilyCode (node .getFamilyCode ());
418440 if (node .getPedigreeString () != null )
419- entity .setPedigreeString (null );
441+ entity .setPedigreeString (node . getPedigreeString () );
420442
421443 if (node .getCrossingProjectDbId () != null ) {
422444 CrossingProjectEntity crossingProject = crossingProjectService
@@ -434,29 +456,23 @@ private void updateEntityWithEdges(PedigreeNodeEntity entity, PedigreeNode node)
434456 updateEntity (entity , node );
435457 if (node .getParents () != null ) {
436458 for (PedigreeNodeParents parentNode : node .getParents ()) {
437- Optional <PedigreeNodeEntity > parentEntityOpt = getPedigreeNode (parentNode .getGermplasmDbId ());
438- if (parentEntityOpt .isPresent ()) {
439- PedigreeNodeEntity parentEntity = parentEntityOpt .get ();
440- if (!entity .getParentNodes ().contains (parentEntity )) {
441- entity .addParent (parentEntity , parentNode .getParentType ());
442- }
443- if (!parentEntity .getProgenyNodes ().contains (entity )) {
444- parentEntity .addProgeny (entity , parentNode .getParentType ());
445- }
459+ PedigreeNodeEntity parentEntity = findOrCreatePedigreeNode (parentNode .getGermplasmDbId ());
460+ if (!entity .getParentNodes ().contains (parentEntity )) {
461+ entity .addParent (parentEntity , parentNode .getParentType ());
462+ }
463+ if (!parentEntity .getProgenyNodes ().contains (entity )) {
464+ parentEntity .addProgeny (entity , parentNode .getParentType ());
446465 }
447466 }
448467 }
449468 if (node .getProgeny () != null ) {
450469 for (PedigreeNodeParents childNode : node .getProgeny ()) {
451- Optional <PedigreeNodeEntity > childEntityOpt = getPedigreeNode (childNode .getGermplasmDbId ());
452- if (childEntityOpt .isPresent ()) {
453- PedigreeNodeEntity childEntity = childEntityOpt .get ();
454- if (!entity .getProgenyNodes ().contains (childEntity )) {
455- entity .addProgeny (childEntity , childNode .getParentType ());
456- }
457- if (!childEntity .getParentNodes ().contains (entity )) {
458- childEntity .addParent (entity , childNode .getParentType ());
459- }
470+ PedigreeNodeEntity childEntity = findOrCreatePedigreeNode (childNode .getGermplasmDbId ());
471+ if (!entity .getProgenyNodes ().contains (childEntity )) {
472+ entity .addProgeny (childEntity , childNode .getParentType ());
473+ }
474+ if (!childEntity .getParentNodes ().contains (entity )) {
475+ childEntity .addParent (entity , childNode .getParentType ());
460476 }
461477 }
462478 }
0 commit comments