Skip to content
Snippets Groups Projects

FIX: Resolve referneces to existing entities correctly

Merged Florian Spreckelsen requested to merge f-fix-resolve-references-with-cached into f-fix-merge
Files
2
@@ -20,6 +20,7 @@ from pytest import fixture, mark
import caosdb as db
from caosdb.cached import cache_clear
from caosadvancedtools.models.parser import parse_model_from_string
from caoscrawler.crawl import Crawler
from caoscrawler.identifiable_adapters import CaosDBIdentifiableAdapter
@@ -208,3 +209,60 @@ def test_issue_83(clear_database):
assert len(retrieved_referencing3.get_property(referenced_type.name).value) == 2
assert retrieved_target1.id in retrieved_referencing3.get_property(referenced_type.name).value
assert retrieved_target2.id in retrieved_referencing3.get_property(referenced_type.name).value
def test_indiscale_113(clear_database):
"""Somewhat mysterious failures to resolve references in
split_into_inserts_and_updates, see
https://gitlab.indiscale.com/caosdb/src/caosdb-crawler/-/issues/113
"""
# Create and insert minimal datamodel
datamodel_str = """
Event:
recommended_properties:
Basis:
Campaign:
Basis:
Campaign:
recommended_properties:
Basis:
"""
model = parse_model_from_string(datamodel_str)
model.sync_data_model(noquestion=True)
# Register identifiables, everything is identified by name
ident = CaosDBIdentifiableAdapter()
ident.register_identifiable("Event", db.RecordType().add_parent(
name="Event").add_property(name="name"))
ident.register_identifiable("Basis", db.RecordType().add_parent(
name="Basis").add_property(name="name"))
ident.register_identifiable("Campaign", db.RecordType().add_parent(
name="Campaign").add_property(name="name"))
crawler = Crawler(identifiableAdapter=ident)
# Add records: event references basis and campaign, campaign references
# basis.
basis = db.Record(name="Poseidon").add_parent(name="Basis")
campaign = db.Record(name="POS386").add_parent(
name="Campaign").add_property(name="Basis", value=basis)
event = db.Record(name="GeoB13952").add_parent(name="Event")
event.add_property(name="Basis", value=basis)
event.add_property(name="Campaign", value=campaign)
# basis and campaign already exist in the db
db.Container().extend([basis, campaign]).insert()
# redefine to trigger resolving
basis = db.Record(name="Poseidon").add_parent(name="Basis")
campaign = db.Record(name="POS386").add_parent(
name="Campaign").add_property(name="Basis", value=basis)
recs = [event, basis, campaign]
ins, ups = crawler.synchronize(crawled_data=recs, unique_names=False)
# There is only one event to be inserted
assert len(ins) == 1
# Nothing to do for the existing ents
assert len(ups) == 0
assert ins[0].name == event.name
Loading