Optimize 'get_artifact_type' from ArtifactRegistry

Now to get an artifact type object by its name we iterate
by all available classes and compare their names. It leads
to complexity O(n).

It's better to generate a dict of available types and get
them directly from there with complexity O(1).

Change-Id: Icc13cd6f844bc93c8d5a80ba963068cde3ef133e
(cherry picked from commit 7ac7bb092c)
This commit is contained in:
Mike Fedosin 2017-10-11 23:03:34 +03:00
parent d18cbc18ea
commit 1e31fe877f
1 changed files with 9 additions and 4 deletions

View File

@ -89,6 +89,8 @@ class ArtifactRegistry(vo_base.VersionedObjectRegistry):
returning appropriate artifact types based on artifact type name.
"""
enabled_types = {}
@classmethod
def register_all_artifacts(cls):
"""Register all artifacts in Glare."""
@ -116,6 +118,10 @@ class ArtifactRegistry(vo_base.VersionedObjectRegistry):
else:
raise exception.TypeNotFound(name=type_name)
# Fill enabled_types
for name, af_type in cls.obj_classes().items():
cls.enabled_types[af_type[0].get_type_name()] = af_type[0]
@classmethod
def get_artifact_type(cls, type_name):
"""Return artifact type based on artifact type name.
@ -123,10 +129,9 @@ class ArtifactRegistry(vo_base.VersionedObjectRegistry):
:param type_name: name of artifact type
:return: artifact class
"""
for name, af_type in cls.obj_classes().items():
if af_type[0].get_type_name() == type_name:
return af_type[0]
raise exception.TypeNotFound(name=type_name)
if type_name not in cls.enabled_types:
raise exception.TypeNotFound(name=type_name)
return cls.enabled_types[type_name]
@classmethod
def reset_registry(cls):