Skip to content

Commit

Permalink
chore: alias archives, pt. II
Browse files Browse the repository at this point in the history
  • Loading branch information
makkus committed Feb 2, 2024
1 parent b4ac06b commit 3ddb2cc
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 19 deletions.
2 changes: 1 addition & 1 deletion src/kiara/interfaces/cli/data/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -633,7 +633,7 @@ def export_data_store(
persisted_data = kiara_api.store_values(
values=values_to_store,
alias_map=alias_map,
data_store_id=store_alias,
data_store=store_alias,
alias_store_id=alias_store_alias,
)

Expand Down
10 changes: 5 additions & 5 deletions src/kiara/interfaces/python_api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1640,7 +1640,7 @@ def store_value(
value: Union[str, uuid.UUID, Value],
alias: Union[str, Iterable[str], None],
allow_overwrite: bool = True,
data_store_id: Union[str, None] = None,
data_store: Union[str, None] = None,
) -> StoreValueResult:
"""
Store the specified value in the (default) value store.
Expand All @@ -1660,7 +1660,7 @@ def store_value(
persisted_data: Union[None, PersistedData] = None
try:
persisted_data = self.context.data_registry.store_value(
value=value_obj, store_id=data_store_id
value=value_obj, data_store=data_store
)
if alias:
self.context.alias_registry.register_aliases(
Expand Down Expand Up @@ -1692,7 +1692,7 @@ def store_values(
],
alias_map: Union[Mapping[str, Iterable[str]], bool, str] = False,
allow_overwrite: bool = True,
data_store_id: Union[str, None] = None,
data_store: Union[str, None] = None,
) -> StoreValuesResult:
"""
Store multiple values into the (default) kiara value store.
Expand Down Expand Up @@ -1729,7 +1729,7 @@ def store_values(
value=value_obj,
alias=None,
allow_overwrite=allow_overwrite,
store_id=data_store_id,
store_id=data_store,
)
result[f"value_{idx}"] = store_result
else:
Expand All @@ -1749,7 +1749,7 @@ def store_values(
value=value_obj,
alias=aliases,
allow_overwrite=allow_overwrite,
data_store_id=data_store_id,
data_store=data_store,
)
result[field_name] = store_result

Expand Down
59 changes: 49 additions & 10 deletions src/kiara/registries/aliases/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
Mapping,
NamedTuple,
Set,
Union,
Union, List,
)

import structlog
Expand Down Expand Up @@ -77,6 +77,18 @@ class AliasItem(NamedTuple):


class AliasRegistry(object):
"""The registry that handles all alias-related operations.
This registry is responsible for managing all alias archives and stores, and for providing a unified view of all
of them.
Aliase archives/stores can be 'mounted' at specific mountpoints, and aliases refering to them use the format
<mountpoint>#<actual_alias>
There is also a 'default' alias store, which is used when the alias provided does not contain a '#' indicating a
mountpoint.
"""
def __init__(self, kiara: "Kiara"):

self._kiara: Kiara = kiara
Expand All @@ -91,6 +103,8 @@ def __init__(self, kiara: "Kiara"):
self._default_alias_store: Union[str, None] = None
"""The alias of the store where new aliases are stored by default."""

self._dynamic_stores: Union[List[str], None] = None

self._cached_aliases: Union[Dict[str, AliasItem], None] = None
self._cached_aliases_by_id: Union[Dict[uuid.UUID, Set[AliasItem]], None] = None

Expand All @@ -106,19 +120,27 @@ def register_archive(
if not alias:
raise Exception("Invalid alias archive alias: can't be empty.")

if mount_point and "." in mount_point:
if not mount_point:
mount_point = archive.archive_alias

if "#" in mount_point:
raise Exception(
f"Can't register alias archive with mountpoint '{alias}': mountpoint is not allowed to contain a '#' character."
)

if ":" in mount_point:
raise Exception(
f"Can't register alias archive with mountpoint '{alias}': mountpoint is not allowed to contain a '.' character (yet, anyway)."
f"Can't register alias archive with mountpoint '{alias}': mountpoint is not allowed to contain a ':' character."
)

if alias in self._alias_archives.keys():
raise Exception(f"Can't add store, alias '{alias}' already registered.")

if mount_point:
if mount_point in self.aliases:
raise Exception(
f"Can't mount alias archive: mountpoint '{mount_point}' already in use as alias."
)
# if mount_point in self.aliases:
# raise Exception(
# f"Can't mount alias archive: mountpoint '{mount_point}' already in use as alias."
# )
if mount_point in self._mountpoints.keys():
raise Exception(f"Mountpoint '{mount_point}' already registered.")
self._mountpoints[mount_point] = alias
Expand All @@ -128,7 +150,7 @@ def register_archive(

is_store = False
is_default_store = False
if isinstance(archive, AliasStore):
if archive.is_writeable():
is_store = True
if set_as_default_store and self._default_alias_store is not None:
raise Exception(
Expand All @@ -139,6 +161,12 @@ def register_archive(
is_default_store = True
self._default_alias_store = alias

# TODO: add to cache if it already exists instead of invalidating, for performance reasons
self._cached_aliases = None
self._cached_aliases_by_id = None
self._dynamic_stores = None


event = AliasArchiveAddedEvent(
kiara_id=self._kiara.id,
alias_archive_id=archive.archive_id,
Expand Down Expand Up @@ -194,15 +222,17 @@ def aliases(self) -> Dict[str, AliasItem]:

all_aliases: Dict[str, AliasItem] = {}
all_aliases_by_id: Dict[uuid.UUID, Set[AliasItem]] = {}
dynamic_stores = []
for archive_alias, archive in self._alias_archives.items():
alias_map = archive.retrieve_all_aliases()
if alias_map is None:
dynamic_stores.append(archive_alias)
continue
for alias, v_id in alias_map.items():
if archive_alias == self.default_alias_store:
final_alias = alias
else:
final_alias = f"{archive_alias}.{alias}"
final_alias = f"{archive_alias}#{alias}"

if final_alias in all_aliases.keys():
raise Exception(
Expand All @@ -220,6 +250,8 @@ def aliases(self) -> Dict[str, AliasItem]:

self._cached_aliases = {k: all_aliases[k] for k in sorted(all_aliases.keys())}
self._cached_aliases_by_id = all_aliases_by_id
self._dynamic_stores = dynamic_stores

return self._cached_aliases

def find_value_id_for_alias(self, alias: str) -> Union[uuid.UUID, None]:
Expand All @@ -228,7 +260,13 @@ def find_value_id_for_alias(self, alias: str) -> Union[uuid.UUID, None]:
if alias_item is not None:
return alias_item.value_id

if "#" not in alias:
if "#" in alias:
mountpoint, rest = alias.split("#", maxsplit=1)
archive = self._mountpoints.get(mountpoint, None)
if archive is None:
return None
archive = self.get_archive(archive_id=archive)
archive.

Check failure on line 269 in src/kiara/registries/aliases/__init__.py

View workflow job for this annotation

GitHub Actions / linting-linux

Ruff (E999)

src/kiara/registries/aliases/__init__.py:269:22: E999 SyntaxError: invalid syntax. Got unexpected token Newline
return None

mountpoint, rest = alias.split(".", maxsplit=1)
Expand Down Expand Up @@ -292,6 +330,7 @@ def register_aliases(
value_id: Union[uuid.UUID, ValueLink, str],
*aliases: str,
allow_overwrite: bool = False,
alias_store: Union[str, None] = None,
):

for alias in aliases:
Expand Down
4 changes: 1 addition & 3 deletions src/kiara/registries/data/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,9 +149,7 @@ def resolve_alias(self, alias: str) -> uuid.UUID:
print("---")
print(data_archive)
dbg(data_archive.archive_metadata.model_dump())
self._kiara.data_registry.register_data_archive(
data_archive
)
self._kiara.data_registry.register_data_archive(data_archive)
default_value = data_archive.get_archive_metadata(
"default_value"
)
Expand Down
4 changes: 4 additions & 0 deletions src/kiara/registries/data/data_store/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,10 @@ def value_ids(self) -> Union[None, Iterable[uuid.UUID]]:
def _retrieve_all_value_ids(
self, data_type_name: Union[str, None] = None
) -> Union[None, Iterable[uuid.UUID]]:
"""Retrieve all value ids from the store.
In the case that _retrieve_all_value_ids returns 'None', the store does not support statically determined value ids and the 'find_values' method(s) needs to be used to retrieve values. Also, 'has_value' can be used to test whether a specific value_id is stored in the archive.
"""
pass

def has_value(self, value_id: uuid.UUID) -> bool:
Expand Down

0 comments on commit 3ddb2cc

Please sign in to comment.