diff --git a/src/caosadvancedtools/cfood.py b/src/caosadvancedtools/cfood.py index 89d879f80bf6c760b0e2c8437a70ec4b0d32bf91..3ec1b6ed7ef5263db8349419225ca3ebf20f52fa 100644 --- a/src/caosadvancedtools/cfood.py +++ b/src/caosadvancedtools/cfood.py @@ -51,6 +51,7 @@ ENTITIES = {} PROPERTIES = {} RECORDS = {} RECORDTYPES = {} +FILES = {} logger = logging.getLogger(__name__) @@ -244,11 +245,20 @@ class AbstractCFood(object, metaclass=ABCMeta): entity.add_property(prop, value) +def add_files(filemap): + """add to the file cache""" + FILES.update(filemap) + + def get_entity_for_path(path): + if path in FILES: + return FILES[path] try: q = "FIND FILE WHICH IS STORED AT '{}'".format(path) + logger.debug(q) + FILES[path] = db.execute_query(q, unique=True) - return db.execute_query(q, unique=True) + return FILES[path] except EntityDoesNotExistError: path_prefix = "**" @@ -257,7 +267,9 @@ def get_entity_for_path(path): q = "FIND FILE WHICH IS STORED AT '{}{}'".format(path_prefix, path) logger.debug(q) - return db.execute_query(q, unique=True) + FILES[path] = db.execute_query(q, unique=True) + + return FILES[path] class AbstractFileCFood(AbstractCFood): @@ -488,6 +500,7 @@ def assure_has_property(entity, name, value, to_be_updated=None, else: to_be_updated.append(entity) + return properties = entity.get_properties() diff --git a/src/caosadvancedtools/crawler.py b/src/caosadvancedtools/crawler.py index 84a635694723545be9470c7f5abfbee23d694d6c..df6750429d239d782daaaa2b80048e57af976fa6 100644 --- a/src/caosadvancedtools/crawler.py +++ b/src/caosadvancedtools/crawler.py @@ -50,7 +50,7 @@ import caosdb as db from caosdb.exceptions import TransactionError from .cache import Cache, UpdateCache, get_pretty_xml -from .cfood import RowCFood, get_ids_for_entities_with_names +from .cfood import RowCFood, add_files, get_ids_for_entities_with_names from .datainconsistency import DataInconsistencyError from .datamodel_problems import DataModelProblems from .guard import RETRIEVE, ProhibitedException @@ -611,6 +611,7 @@ class FileCrawler(Crawler): """ super().__init__(**kwargs) self.files = files + add_files({fi.path: fi for fi in files}) def iteritems(self): for idx, p in enumerate(sorted([f.path for f in self.files])): diff --git a/unittests/test_cfood.py b/unittests/test_cfood.py index f51d515a2bb8896d25acc139c89b921fab1d7d0b..802497a8ac750d3301109fd434891273e92e252c 100644 --- a/unittests/test_cfood.py +++ b/unittests/test_cfood.py @@ -25,10 +25,11 @@ import re import unittest import caosdb as db -from caosadvancedtools.cfood import (AbstractCFood, AbstractFileCFood, - CMeal, assure_has_parent, - assure_has_property, - assure_object_is_in_list) +from caosadvancedtools.cfood import (AbstractCFood, AbstractFileCFood, CMeal, + assure_has_parent, assure_has_property, + assure_object_is_in_list, + get_entity_for_path) +from caosadvancedtools.crawler import FileCrawler from caosadvancedtools.example_cfood import ExampleCFood PATTERN = "h.*" @@ -143,6 +144,7 @@ class InsertionTest(unittest.TestCase): "Test bool": ("BOOLEAN", True), "Test string": ("STRING", "bla") } + for name, ty_val in types_and_values.items(): entity.add_property(name=name, datatype=ty_val[0], value=ty_val[1]) @@ -183,3 +185,10 @@ class MealTest(unittest.TestCase): self.assertTrue(c.looking_for("/this/other")) # class should still match other prefixes self.assertTrue(ExampleCFoodMeal.match_item("/that/file")) + + +class FileCacheTest(unittest.TestCase): + def test(self): + self.assertRaises(Exception, get_entity_for_path, "/lol") + FileCrawler(cfood_types=[], files=[db.File(path="/lol")]) + get_entity_for_path("/lol")