Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix potential inefficiency in
aiida.tools.data.cif
converters (#3098)
Recently, the `BackendNode` interface and implementation was changed significantly with respect to attributes and extras. As a result, the values on unstored nodes are not cleaned *until* the node is stored. That means that unstored nodes can contain attributes and extras with uncleaned values. For example an unstored `Dict` node can contained stored `Float` nodes. This change becomes problematic in the implementation of `_get_aiida_structure_pymatgen_inline` and `_get_aiida_structure_ase_inline` of `aiida.tools.data.cif`. The `parameters` keyword argument can be an unstored `Dict` node, if the functions are run with `store_provenance=False`. Since it is unstored, it can contain *stored* nodes for the values within them. For example, the `site_tolerance` can be a stored `Float`. Since they are overloaded native float objects, they can be passed to pymatgens `CifParser` without it complaining. However, now whenever that class references the value, since it is a stored node, the `ModelWrapper` will cause the model instance to be refreshed from the database, which becomes prohibitively expensive. Simply calling `clean_value` on the `parameters` beforehand, will cause these nodes to be dereferenced into their base values, which solves the issue.
- Loading branch information