diff --git a/integration/test_collection_config.py b/integration/test_collection_config.py index b545b99cb..d0693ee33 100644 --- a/integration/test_collection_config.py +++ b/integration/test_collection_config.py @@ -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 diff --git a/test/collection/test_config.py b/test/collection/test_config.py index 81fb485b2..65af47504 100644 --- a/test/collection/test_config.py +++ b/test/collection/test_config.py @@ -1,4 +1,3 @@ -from datetime import timedelta from typing import List, Union import pytest @@ -14,7 +13,6 @@ Vectorizers, _CollectionConfigCreate, _GenerativeProvider, - _ObjectTTLConfig, _RerankerProvider, _VectorizerConfigCreate, _ReplicationConfigCreate, @@ -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(), {}), ( diff --git a/weaviate/collections/classes/config.py b/weaviate/collections/classes/config.py index 04d4ce535..699a3c2a8 100644 --- a/weaviate/collections/classes/config.py +++ b/weaviate/collections/classes/config.py @@ -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