@@ -898,25 +898,39 @@ def link_dataset_to_direct_ancestors(property_key, normalized_type, request, use
898898
899899 if 'direct_ancestor_uuids' not in new_data_dict :
900900 raise KeyError ("Missing 'direct_ancestor_uuids' key in 'new_data_dict' during calling 'link_dataset_to_direct_ancestors()' trigger method." )
901-
901+ create_activity = False
902+ activity_data_dict = {}
902903 dataset_uuid = existing_data_dict ['uuid' ]
903904 direct_ancestor_uuids = new_data_dict ['direct_ancestor_uuids' ]
904905
905- # Generate property values for Activity node
906- activity_data_dict = schema_manager .generate_activity_data (normalized_type , request , user_token , existing_data_dict )
906+ existing_dataset_ancestor_uuids = schema_neo4j_queries .get_dataset_direct_ancestors (schema_manager .get_neo4j_driver_instance (), dataset_uuid , "uuid" )
907+ new_ancestors = set (direct_ancestor_uuids )- set (existing_dataset_ancestor_uuids )
908+ ancestors_to_unlink = set (existing_dataset_ancestor_uuids )- set (direct_ancestor_uuids )
909+ activity_uuid = schema_neo4j_queries .get_parent_activity_uuid_from_entity (schema_manager .get_neo4j_driver_instance (), dataset_uuid )
907910
908- try :
909- # Create a linkage (via one Activity node) between the dataset node and its direct ancestors in neo4j
910- schema_neo4j_queries .link_entity_to_direct_ancestors (schema_manager .get_neo4j_driver_instance (), dataset_uuid , direct_ancestor_uuids , activity_data_dict )
911-
912- # Delete the cache of this dataset if any cache exists
913- # Because the `Dataset.direct_ancestors` field
914- schema_manager .delete_memcached_cache ([dataset_uuid ])
915- except TransactionError :
916- # No need to log
917- raise
911+ if not activity_uuid :
912+ activity_data_dict = schema_manager .generate_activity_data (normalized_type , request , user_token , existing_data_dict )
913+ activity_uuid = activity_data_dict ['uuid' ]
914+ create_activity = True
918915
916+ if new_ancestors :
917+ logger .info (f"Linking the following new ancestors: { ', ' .join (new_ancestors )} " )
918+ try :
919+ schema_neo4j_queries .add_new_ancestors_to_existing_activity (schema_manager .get_neo4j_driver_instance (), list (new_ancestors ), activity_uuid , create_activity , activity_data_dict , dataset_uuid )
920+ except TransactionError :
921+ raise
922+
923+ if ancestors_to_unlink :
924+ logger .info (f"Unlinking the following ancestors: { ', ' .join (ancestors_to_unlink )} " )
925+ try :
926+ schema_neo4j_queries .delete_ancestor_linkages_tx (schema_manager .get_neo4j_driver_instance (), dataset_uuid , list (ancestors_to_unlink ))
927+ except TransactionError :
928+ raise
929+
930+ if not (ancestors_to_unlink or new_ancestors ):
931+ logger .info ("No new ancestors linked, nor old ancestors unlinked" )
919932
933+
920934"""
921935TriggerTypeEnum.AFTER_CREATE and TriggerTypeEnum.AFTER_UPDATE
922936
@@ -1913,30 +1927,46 @@ def delete_metadata_files(property_key, normalized_type, request, user_token, ex
19131927def link_sample_to_direct_ancestor (property_key , normalized_type , request , user_token , existing_data_dict , new_data_dict ):
19141928 if 'uuid' not in existing_data_dict :
19151929 raise KeyError ("Missing 'uuid' key in 'existing_data_dict' during calling 'link_sample_to_direct_ancestor()' trigger method." )
1916-
19171930 if 'direct_ancestor_uuid' not in new_data_dict :
19181931 raise KeyError ("Missing 'direct_ancestor_uuid' key in 'new_data_dict' during calling 'link_sample_to_direct_ancestor()' trigger method." )
1919-
1932+
1933+ create_activity = False
1934+ activity_data_dict = {}
19201935 sample_uuid = existing_data_dict ['uuid' ]
1921-
1922- # Build a list of direct ancestor uuids
1923- # Only one uuid in the list in this case
1924- direct_ancestor_uuids = [new_data_dict ['direct_ancestor_uuid' ]]
1925-
1926- # Generate property values for Activity node
1927- activity_data_dict = schema_manager .generate_activity_data (normalized_type , request , user_token , existing_data_dict )
1928-
1929- try :
1930- # Create a linkage (via Activity node)
1931- # between the Sample node and the source entity node in neo4j
1932- schema_neo4j_queries .link_entity_to_direct_ancestors (schema_manager .get_neo4j_driver_instance (), sample_uuid , direct_ancestor_uuids , activity_data_dict )
1936+ new_ancestors = None
1937+ ancestors_to_unlink = None
1938+ direct_ancestor_uuids = new_data_dict ['direct_ancestor_uuid' ]
1939+ existing_sample_ancestor_uuids = schema_neo4j_queries .get_parents (schema_manager .get_neo4j_driver_instance (), sample_uuid , "uuid" )
1940+ if direct_ancestor_uuids not in existing_sample_ancestor_uuids :
1941+ new_ancestors = [direct_ancestor_uuids ]
1942+ if not existing_sample_ancestor_uuids :
1943+ new_ancestors = [direct_ancestor_uuids ]
19331944
1934- # Delete the cache of sample if any cache exists
1935- # Because the `Sample.direct_ancestor` field can be updated
1936- schema_manager .delete_memcached_cache ([sample_uuid ])
1937- except TransactionError :
1938- # No need to log
1939- raise
1945+ activity_uuid = schema_neo4j_queries .get_parent_activity_uuid_from_entity (schema_manager .get_neo4j_driver_instance (), sample_uuid )
1946+ if not activity_uuid :
1947+ activity_data_dict = schema_manager .generate_activity_data (normalized_type , request , user_token , existing_data_dict )
1948+ activity_uuid = activity_data_dict ['uuid' ]
1949+ create_activity = True
1950+ if new_ancestors :
1951+ logger .info (f"Linking the following new ancestors: { new_ancestors } " )
1952+ try :
1953+ schema_neo4j_queries .add_new_ancestors_to_existing_activity (schema_manager .get_neo4j_driver_instance (), new_ancestors , activity_uuid , create_activity , activity_data_dict , sample_uuid )
1954+ except TransactionError :
1955+ raise
1956+ ancestors_to_unlink = existing_sample_ancestor_uuids
1957+ else :
1958+ ancestors_to_unlink = existing_sample_ancestor_uuids
1959+ ancestors_to_unlink .remove (direct_ancestor_uuids )
1960+ if ancestors_to_unlink :
1961+ logger .info (f"Unlinking the following ancestor: { ancestors_to_unlink } " )
1962+ try :
1963+ schema_neo4j_queries .delete_ancestor_linkages_tx (schema_manager .get_neo4j_driver_instance (), sample_uuid , ancestors_to_unlink )
1964+ except TransactionError :
1965+ raise
1966+
1967+ if not (ancestors_to_unlink or new_ancestors ):
1968+ logger .info ("No new ancestors linked, nor old ancestors unlinked" )
1969+
19401970
19411971"""
19421972TriggerTypeEnum.BEFORE_CREATE and TriggerTypeEnum.BEFORE_UPDATE
0 commit comments