diff --git a/src/aiida/orm/implementation/storage_backend.py b/src/aiida/orm/implementation/storage_backend.py index 7e19a25ca3..3c3b00eb18 100644 --- a/src/aiida/orm/implementation/storage_backend.py +++ b/src/aiida/orm/implementation/storage_backend.py @@ -471,6 +471,22 @@ def get_orm_entities(self, detailed: bool = False) -> dict: count = QueryBuilder(self).append(Node).count() data['Nodes'] = {'count': count} if detailed: + first_time = ( + QueryBuilder(self) + .append(Node, project=['ctime'], tag='node') + .order_by({'node': {'ctime': 'asc'}}) + .first(flat=True) + ) + last_time = ( + QueryBuilder(self) + .append(Node, project=['ctime'], tag='node') + .order_by({'node': {'ctime': 'desc'}}) + .first(flat=True) + ) + + data['Nodes']['first_created'] = str(first_time) if first_time else None + data['Nodes']['last_created'] = str(last_time) if last_time else None + node_types = sorted( {typ for (typ,) in QueryBuilder(self).append(Node, project=['node_type']).iterall() if typ is not None} ) diff --git a/tests/storage/psql_dos/test_backend.py b/tests/storage/psql_dos/test_backend.py index fd55e38a14..63a5fd47c3 100644 --- a/tests/storage/psql_dos/test_backend.py +++ b/tests/storage/psql_dos/test_backend.py @@ -108,6 +108,8 @@ def mock_maintain(self, live=True, dry_run=False, compress=False, **kwargs): def test_get_info(monkeypatch): """Test the ``get_info`` method.""" + from aiida import orm + storage_backend = get_manager().get_profile_storage() def mock_get_info(self, detailed=False, **kwargs): @@ -128,13 +130,24 @@ def mock_get_info(self, detailed=False, **kwargs): assert 'extra_value' not in repository_info_out assert repository_info_out['value'] == 42 - storage_info_out = storage_backend.get_info(detailed=True) - repository_info_out = storage_info_out['repository'] + node1 = orm.Data().store() + node2 = orm.Data().store() + + detailed_storage_info_out = storage_backend.get_info(detailed=True) + repository_info_out = detailed_storage_info_out['repository'] assert 'value' in repository_info_out assert 'extra_value' in repository_info_out assert repository_info_out['value'] == 42 assert repository_info_out['extra_value'] == 0 + # Test first_created and last_created timestamps + nodes_info = detailed_storage_info_out['entities']['Nodes'] + + assert 'first_created' in nodes_info + assert 'last_created' in nodes_info + assert nodes_info['first_created'] == str(node1.ctime) + assert nodes_info['last_created'] == str(node2.ctime) + def test_unload_profile(): """Test that unloading the profile closes all sqla sessions.