Skip to content
Snippets Groups Projects
Commit 75531f1c authored by Henrik tom Wörden's avatar Henrik tom Wörden
Browse files

Merge branch 'f-filter-container' into 'dev'

ENH: add new member function filter to Container class

See merge request !172
parents c7e4fa23 cea96eee
No related branches found
No related tags found
2 merge requests!175BUG: Request responses without the "Set-Cookie" header no longer overwrite the...,!172ENH: add new member function filter to Container class
Pipeline #59695 passed with warnings
......@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added ###
* New setup extra `test` which installs the dependencies for testing.
* The Container class has a new member function `filter` which is based o `_filter_entity_list`.
### Changed ###
......
......@@ -78,7 +78,7 @@ Examples
Finding parents and properties
--------
------------------------------
To find a specific parent or property of an Entity, its
ParentList or PropertyList can be filtered using names, ids, or
entities. A short example:
......@@ -126,3 +126,19 @@ entities. A short example:
# Result: [p2_1]
The filter function of ParentList works analogously.
Finding entities in a Container
-------------------------------
In the same way as described above, Container can be filtered.
A short example:
.. code-block:: python3
import linkahead as db
# Setup a record with six properties
p1 = db.Property(id=101, name="Property 1")
p2 = db.Property(name="Property 2")
c = db.Container().extend([p1,p2])
c.filter(name="Property 1")
# Result: [p1]
......@@ -2575,8 +2575,6 @@ class PropertyList(list):
Params
------
listobject : Iterable(Property)
List to be filtered
prop : Property
Property to match name and ID with. Cannot be set
simultaneously with ID or name.
......@@ -3093,12 +3091,12 @@ def _basic_sync(e_local, e_remote):
if e_local.role is None:
e_local.role = e_remote.role
elif e_remote.role is not None and not e_local.role.lower() == e_remote.role.lower():
raise ValueError("The resulting entity had a different role ({0}) "
"than the local one ({1}). This probably means, that "
raise ValueError(f"The resulting entity had a different role ({e_remote.role}) "
f"than the local one ({e_local.role}). This probably means, that "
"the entity was intialized with a wrong class "
"by this client or it has changed in the past and "
"this client did't know about it yet.".format(
e_remote.role, e_local.role))
"this client did't know about it yet.\nThis is the local version of the"
f" Entity:\n{e_local}\nThis is the remote one:\n{e_remote}")
e_local.id = e_remote.id
e_local.name = e_remote.name
......@@ -3730,6 +3728,36 @@ class Container(list):
return sync_dict
def filter(self, entity: Optional[Entity] = None,
pid: Union[None, str, int] = None,
name: Optional[str] = None,
conjunction: bool = False) -> list:
"""
Return all Entities from this Container that match the selection criteria.
Please refer to the documentation of _filter_entity_list for a detailed
description of behaviour.
Params
------
entity : Entity
Entity to match name and ID with
pid : str, int
Parent ID to match
name : str
Parent name to match
simultaneously with ID or name.
conjunction : bool, defaults to False
Set to return only entities that match both id and name
if both are given.
Returns
-------
matches : list
List containing all matching Entities
"""
return _filter_entity_list(self, pid=pid, name=name, entity=entity,
conjunction=conjunction)
@staticmethod
def _find_dependencies_in_container(container: Container):
"""Find elements in a container that are a dependency of another element of the same.
......
......@@ -199,3 +199,12 @@ def test_container_slicing():
with pytest.raises(TypeError):
cont[[0, 2, 3]]
def test_container_filter():
# this is a very rudimentary test since filter is based on _filter_entity_list which is tested
# separately
cont = db.Container()
cont.extend([db.Record(name=f"TestRec{ii+1}") for ii in range(5)])
recs = cont.filter(name="TestRec2")
assert len(recs)==1
recs[0].name =="TestRec2"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment