diff --git a/src/newcrawler/identifiable_adapters.py b/src/newcrawler/identifiable_adapters.py index 3251b585e4d37cd984ffa1e10ca7b184c50b0796..0a02b8d35eac6abe239446edb850d9d2e1f01c0c 100644 --- a/src/newcrawler/identifiable_adapters.py +++ b/src/newcrawler/identifiable_adapters.py @@ -25,6 +25,7 @@ import caosdb as db from abc import abstractmethod +from utils import get_value class IdentifiableAdapter(object): """ @@ -43,6 +44,40 @@ class IdentifiableAdapter(object): from the database. """ + @staticmethod + def create_query_for_identifiable(ident: db.Record): + """ + This function is taken from the old crawler: + caosdb-advanced-user-tools/src/caosadvancedtools/crawler.py + + uses the properties of ident to create a query that can determine + whether the required record already exists. + """ + # TODO multiple parents are ignored! Sufficient? + if len(ident.get_parents()) == 0: + raise ValueError("The identifiable must have at least one parent.") + query_string = "FIND Record " + ident.get_parents()[0].name + query_string += " WITH " + if ident.name is None and len(ident.get_properties()) == 0: + raise ValueError( + "The identifiable must have features to identify it.") + + if ident.name is not None: + query_string += "name='{}' AND".format(ident.name) + + for p in ident.get_properties(): + if p.datatype is not None and p.datatype.startswith("LIST<"): + for v in p.value: + query_string += ("references " + + str(v.id if isinstance(v, db.Entity) + else v) + + " AND ") + else: + query_string += ("'" + p.name + "'='" + str(get_value(p)) + + "' AND ") + # remove the last AND + return query_string[:-4] + @abstractmethod def get_registered_identifiable(self, record: db.Record): """ diff --git a/src/newcrawler/utils.py b/src/newcrawler/utils.py index a04e896e85e749ba616c30cc450f15bb561dd6df..e0a44be3c3859823ba6cbd63e4cd694c2974cca0 100644 --- a/src/newcrawler/utils.py +++ b/src/newcrawler/utils.py @@ -24,6 +24,7 @@ # import caosdb as db +from datetime import datetime # Some utility functions, e.g. for extending pylib. @@ -38,3 +39,26 @@ def has_parent(entity: db.Entity, name: str): if parent.name == name: return True return False + +def get_value(prop): + """ Returns the value of a Property + + This function is taken from the old crawler: + caosdb-advanced-user-tools/src/caosadvancedtools/crawler.py + + Parameters + ---------- + prop : The property of which the value shall be returned. + + Returns + ------- + out : The value of the property; if the value is an entity, its ID. + + """ + + if isinstance(prop.value, db.Entity): + return prop.value.id + elif isinstance(prop.value, datetime): + return prop.value.isoformat() + else: + return prop.value