Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions integration/test_collection_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -1953,6 +1953,31 @@ def test_object_ttl_update(collection_factory: CollectionFactory) -> None:
assert conf.object_ttl_config is None


def test_object_ttl_roundtrip_from_dict(collection_factory: CollectionFactory) -> None:
dummy = collection_factory("dummy")
if dummy._connection._weaviate_version.is_lower_than(1, 35, 0):
pytest.skip("object ttl is not supported in Weaviate versions lower than 1.35.0")

collection = collection_factory(
object_ttl=Configure.ObjectTTL.delete_by_creation_time(
time_to_live=datetime.timedelta(seconds=60),
filter_expired_objects=True,
),
)
config = collection.config.get()
assert config.object_ttl_config is not None

name = f"TestObjectTTLRoundtrip{collection.name}"
config.name = name
with weaviate.connect_to_local() as client:
client.collections.delete(name)
client.collections.create_from_dict(config.to_dict())
new = client.collections.use(name).config.get()
assert config == new
assert config.to_dict() == new.to_dict()
client.collections.delete(name)


@pytest.mark.parametrize("index_name", ["filterable", "searchable", "rangeFilters"])
def test_delete_property_index(
index_name: IndexName, collection_factory: CollectionFactory
Expand Down
86 changes: 0 additions & 86 deletions test/collection/test_config.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from datetime import timedelta
from typing import List, Union

import pytest
Expand All @@ -14,7 +13,6 @@
Vectorizers,
_CollectionConfigCreate,
_GenerativeProvider,
_ObjectTTLConfig,
_RerankerProvider,
_VectorizerConfigCreate,
_ReplicationConfigCreate,
Expand Down Expand Up @@ -2614,90 +2612,6 @@ def test_config_with_vectors(vector_config: List[_VectorConfigCreate], expected:
}


TEST_OBJECT_TTL_CONFIG_TO_DICT_PARAMETERS = [
# delete_by_creation_time
(
_ObjectTTLConfig(
enabled=True,
time_to_live=timedelta(hours=24),
filter_expired_objects=True,
delete_on="creationTime",
),
{
"enabled": True,
"timeToLive": 86400,
"filterExpiredObjects": True,
"deleteOn": "creationTime",
},
),
# delete_by_update_time
(
_ObjectTTLConfig(
enabled=True,
time_to_live=timedelta(days=7),
filter_expired_objects=False,
delete_on="updateTime",
),
{
"enabled": True,
"timeToLive": 604800,
"filterExpiredObjects": False,
"deleteOn": "updateTime",
},
),
# delete_by_date_property
(
_ObjectTTLConfig(
enabled=True,
time_to_live=timedelta(hours=1, minutes=30),
filter_expired_objects=True,
delete_on="releaseDate",
),
{
"enabled": True,
"timeToLive": 5400,
"filterExpiredObjects": True,
"deleteOn": "releaseDate",
},
),
# None time_to_live
(
_ObjectTTLConfig(
enabled=True,
time_to_live=None,
filter_expired_objects=False,
delete_on="creationTime",
),
{
"enabled": True,
"filterExpiredObjects": False,
"deleteOn": "creationTime",
},
),
# negative offset (delete_by_date_property with offset before date)
(
_ObjectTTLConfig(
enabled=True,
time_to_live=timedelta(seconds=-3600),
filter_expired_objects=True,
delete_on="eventDate",
),
{
"enabled": True,
"timeToLive": -3600,
"filterExpiredObjects": True,
"deleteOn": "eventDate",
},
),
]


@pytest.mark.parametrize("ttl_config,expected", TEST_OBJECT_TTL_CONFIG_TO_DICT_PARAMETERS)
def test_object_ttl_config_to_dict(ttl_config: _ObjectTTLConfig, expected: dict) -> None:
"""Test that _ObjectTTLConfig.to_dict() properly converts timedelta to seconds."""
assert ttl_config.to_dict() == expected


TEST_CONFIGURE_WITH_REPLICATION_PARAMETERS = [
(Configure.replication(), {}),
(
Expand Down
16 changes: 16 additions & 0 deletions weaviate/collections/classes/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -2004,6 +2004,22 @@ class _ObjectTTLConfig(_ConfigBase):
filter_expired_objects: bool
delete_on: Union[str, Literal["updateTime"], Literal["creationTime"]]

def to_dict(self) -> dict:
delete_on = self.delete_on
if delete_on == "creationTime":
delete_on = "_creationTimeUnix"
elif delete_on == "updateTime":
delete_on = "_lastUpdateTimeUnix"

out: dict = {
"enabled": self.enabled,
"filterExpiredObjects": self.filter_expired_objects,
"deleteOn": delete_on,
}
if self.time_to_live is not None:
out["defaultTtl"] = int(self.time_to_live.total_seconds())
return out


ObjectTTLConfig = _ObjectTTLConfig

Expand Down
Loading