Skip to content
Snippets Groups Projects
Commit ca00cd75 authored by Florian Spreckelsen's avatar Florian Spreckelsen
Browse files

Merge branch 'f-fix-resolve-references-with-cached' into 'f-fix-merge'

FIX: Resolve referneces to existing entities correctly

See merge request !141
parents 977b4604 3cfaefe9
Branches
Tags
3 merge requests!160STY: styling,!141FIX: Resolve referneces to existing entities correctly,!140New f fix merge
Pipeline #46362 failed
......@@ -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
......@@ -21,7 +21,7 @@ python_requires = >=3.7
install_requires =
importlib-resources
caosadvancedtools >= 0.7.0
linkahead >= 0.13.1
linkahead > 0.13.2
yaml-header-tools >= 0.2.1
pyyaml
odfpy #make optional
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment