Unverified Commit f68163f4 authored by Nicola Soranzo's avatar Nicola Soranzo Committed by GitHub
Browse files

Merge pull request #12156 from mvdbeek/access_collection_elements_by_index_more_efficiently

parents e82cdcbd 6a609d20
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -4285,10 +4285,17 @@ class DatasetCollection(Dictifiable, UsesAnnotations, RepresentById):
            raise Exception("Each dataset collection must define a collection type.")

    def __getitem__(self, key):
        get_by_attribute = "element_index" if isinstance(key, int) else "element_identifier"
        if isinstance(key, int):
            try:
                return self.elements[key]
            except IndexError:
                pass
        else:
            # This might be a peformance issue for large collection, but we don't use this a lot
            for element in self.elements:
            if getattr(element, get_by_attribute) == key:
                if element.element_identifier == key:
                    return element
        get_by_attribute = "element_index" if isinstance(key, int) else "element_identifier"
        error_message = f"Dataset collection has no {get_by_attribute} with key {key}."
        raise KeyError(error_message)

+13 −0
Original line number Diff line number Diff line
@@ -275,6 +275,19 @@ class MappingTests(BaseModelTestCase):
        library_dataset_collection = model.LibraryDatasetCollectionAssociation(collection=dataset_collection)
        tag_and_test(library_dataset_collection, model.LibraryDatasetCollectionTagAssociation, "tagged_library_dataset_collections")

    def test_collection_get_interface(self):
        model = self.model
        u = model.User(email="mary@example.com", password="password")
        h1 = model.History(name="History 1", user=u)
        d1 = model.HistoryDatasetAssociation(extension="txt", history=h1, create_dataset=True, sa_session=model.session)
        c1 = model.DatasetCollection(collection_type="list")
        elements = 100
        dces = [model.DatasetCollectionElement(collection=c1, element=d1, element_identifier=f"{i}", element_index=i) for i in range(elements)]
        self.persist(u, h1, d1, c1, *dces, flush=False, expunge=False)
        model.session.flush()
        for i in range(elements):
            assert c1[i] == dces[i]

    def test_collections_in_histories(self):
        model = self.model