Skip to content

Commit e0fa645

Browse files
authored
Merge pull request #1899 from weaviate/object_ttl
Add support for Object TTL
2 parents db9d4c2 + 75a5885 commit e0fa645

File tree

13 files changed

+380
-67
lines changed

13 files changed

+380
-67
lines changed

.github/workflows/main.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ env:
2626
WEAVIATE_132: 1.32.16
2727
WEAVIATE_133: 1.33.4
2828
WEAVIATE_134: 1.34.1
29+
WEAVIATE_135: 1.35.0-dev-0b0bd3d
2930

3031
jobs:
3132
lint-and-format:
@@ -305,6 +306,7 @@ jobs:
305306
$WEAVIATE_132,
306307
$WEAVIATE_133,
307308
$WEAVIATE_134
309+
$WEAVIATE_135
308310
]
309311
steps:
310312
- name: Checkout

integration/conftest.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import os
2+
import time
23
from typing import (
34
Any,
45
AsyncGenerator,
@@ -11,16 +12,16 @@
1112
Type,
1213
Union,
1314
)
15+
from typing import Callable, TypeVar
1416

1517
import pytest
1618
import pytest_asyncio
1719
from _pytest.fixtures import SubRequest
18-
import time
19-
from typing import Callable, TypeVar
2020

2121
import weaviate
2222
from weaviate.collections import Collection, CollectionAsync
2323
from weaviate.collections.classes.config import (
24+
_ObjectTTLConfigCreate,
2425
Configure,
2526
DataType,
2627
Property,
@@ -37,7 +38,6 @@
3738
from weaviate.collections.classes.config_named_vectors import _NamedVectorConfigCreate
3839
from weaviate.collections.classes.types import Properties
3940
from weaviate.config import AdditionalConfig
40-
4141
from weaviate.exceptions import UnexpectedStatusCodeError
4242

4343

@@ -66,6 +66,7 @@ def __call__(
6666
vector_config: Optional[
6767
Optional[Union[_VectorConfigCreate, List[_VectorConfigCreate]]]
6868
] = None,
69+
object_ttl: Optional[_ObjectTTLConfigCreate] = None,
6970
) -> Collection[Any, Any]:
7071
"""Typing for fixture."""
7172
...
@@ -140,6 +141,7 @@ def _factory(
140141
vector_config: Optional[
141142
Optional[Union[_VectorConfigCreate, List[_VectorConfigCreate]]]
142143
] = None,
144+
object_ttl: Optional[_ObjectTTLConfigCreate] = None,
143145
) -> Collection[Any, Any]:
144146
try:
145147
nonlocal client_fixture, name_fixtures, call_counter # noqa: F824
@@ -172,6 +174,7 @@ def _factory(
172174
vector_index_config=vector_index_config,
173175
reranker_config=reranker_config,
174176
vector_config=vector_config,
177+
object_ttl_config=object_ttl,
175178
)
176179
return collection
177180
except Exception as e:

integration/test_collection_config.py

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import datetime
12
from typing import Generator, List, Optional, Union
23

34
import pytest as pytest
@@ -1831,3 +1832,119 @@ def test_uncompressed_quantitizer(collection_factory: CollectionFactory) -> None
18311832
assert config.vector_index_config is not None
18321833
assert isinstance(config.vector_index_config, _VectorIndexConfigHNSW)
18331834
assert config.vector_index_config.quantizer is None
1835+
1836+
1837+
def test_object_ttl_creation(collection_factory: CollectionFactory) -> None:
1838+
dummy = collection_factory("dummy")
1839+
if dummy._connection._weaviate_version.is_lower_than(1, 35, 0):
1840+
pytest.skip("object ttl is not supported in Weaviate versions lower than 1.35.0")
1841+
1842+
collection = collection_factory(
1843+
object_ttl=Configure.ObjectTTL.delete_by_creation_time(
1844+
time_to_live=datetime.timedelta(days=30),
1845+
filter_expired_objects=True,
1846+
),
1847+
inverted_index_config=Configure.inverted_index(index_timestamps=True),
1848+
)
1849+
1850+
config = collection.config.get()
1851+
assert config.object_ttl_config is not None
1852+
assert config.object_ttl_config.delete_on == "creationTime"
1853+
assert config.object_ttl_config.time_to_live == datetime.timedelta(days=30)
1854+
1855+
1856+
def test_object_ttl_update_time(collection_factory: CollectionFactory) -> None:
1857+
dummy = collection_factory("dummy")
1858+
if dummy._connection._weaviate_version.is_lower_than(1, 35, 0):
1859+
pytest.skip("object ttl is not supported in Weaviate versions lower than 1.35.0")
1860+
1861+
collection = collection_factory(
1862+
object_ttl=Configure.ObjectTTL.delete_by_update_time(
1863+
time_to_live=datetime.timedelta(days=30),
1864+
filter_expired_objects=True,
1865+
),
1866+
inverted_index_config=Configure.inverted_index(index_timestamps=True),
1867+
)
1868+
1869+
config = collection.config.get()
1870+
assert config.object_ttl_config is not None
1871+
assert config.object_ttl_config.delete_on == "updateTime"
1872+
assert config.object_ttl_config.filter_expired_objects
1873+
assert config.object_ttl_config.time_to_live == datetime.timedelta(days=30)
1874+
1875+
1876+
def test_object_ttl_custom(collection_factory: CollectionFactory) -> None:
1877+
dummy = collection_factory("dummy")
1878+
if dummy._connection._weaviate_version.is_lower_than(1, 35, 0):
1879+
pytest.skip("object ttl is not supported in Weaviate versions lower than 1.35.0")
1880+
1881+
collection = collection_factory(
1882+
properties=[wvc.config.Property(name="customDate", data_type=DataType.DATE)],
1883+
object_ttl=Configure.ObjectTTL.delete_by_date_property(
1884+
property_name="customDate", filter_expired_objects=False, ttl_offset=-1
1885+
),
1886+
inverted_index_config=Configure.inverted_index(index_timestamps=True),
1887+
)
1888+
1889+
config = collection.config.get()
1890+
assert config.object_ttl_config is not None
1891+
assert config.object_ttl_config.delete_on == "customDate"
1892+
assert config.object_ttl_config.time_to_live == datetime.timedelta(seconds=-1)
1893+
assert not config.object_ttl_config.filter_expired_objects
1894+
1895+
1896+
def test_object_ttl_update(collection_factory: CollectionFactory) -> None:
1897+
dummy = collection_factory("dummy")
1898+
if dummy._connection._weaviate_version.is_lower_than(1, 35, 0):
1899+
pytest.skip("object ttl is not supported in Weaviate versions lower than 1.35.0")
1900+
1901+
collection = collection_factory(
1902+
properties=[
1903+
wvc.config.Property(name="customDate", data_type=DataType.DATE),
1904+
wvc.config.Property(name="customDate2", data_type=DataType.DATE),
1905+
],
1906+
inverted_index_config=Configure.inverted_index(index_timestamps=True),
1907+
)
1908+
1909+
conf = collection.config.get()
1910+
assert conf.object_ttl_config is None
1911+
1912+
collection.config.update(
1913+
object_ttl_config=Reconfigure.ObjectTTL.delete_by_date_property(
1914+
property_name="customDate", filter_expired_objects=True, ttl_offset=3600
1915+
),
1916+
)
1917+
1918+
conf = collection.config.get()
1919+
assert conf.object_ttl_config is not None
1920+
assert conf.object_ttl_config.delete_on == "customDate"
1921+
assert conf.object_ttl_config.time_to_live == datetime.timedelta(seconds=3600)
1922+
assert conf.object_ttl_config.filter_expired_objects
1923+
1924+
collection.config.update(
1925+
object_ttl_config=Reconfigure.ObjectTTL.delete_by_update_time(filter_expired_objects=False),
1926+
)
1927+
1928+
conf = collection.config.get()
1929+
assert conf.object_ttl_config is not None
1930+
assert conf.object_ttl_config.delete_on == "updateTime"
1931+
assert conf.object_ttl_config.time_to_live == datetime.timedelta(seconds=3600)
1932+
assert not conf.object_ttl_config.filter_expired_objects
1933+
1934+
collection.config.update(
1935+
object_ttl_config=Reconfigure.ObjectTTL.delete_by_creation_time(
1936+
time_to_live=datetime.timedelta(seconds=600),
1937+
),
1938+
)
1939+
1940+
conf = collection.config.get()
1941+
assert conf.object_ttl_config is not None
1942+
assert conf.object_ttl_config.delete_on == "creationTime"
1943+
assert conf.object_ttl_config.time_to_live == datetime.timedelta(seconds=600)
1944+
assert not conf.object_ttl_config.filter_expired_objects
1945+
1946+
collection.config.update(
1947+
object_ttl_config=Reconfigure.ObjectTTL.disable(),
1948+
)
1949+
conf = collection.config.get()
1950+
assert conf.object_ttl_config is None

mock_tests/test_collection.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ def test_missing_multi_tenancy_config(
106106
reranker_config=None,
107107
vectorizer_config=None,
108108
vector_config=None,
109+
object_ttl_config=None,
109110
inverted_index_config=InvertedIndexConfig(
110111
bm25=BM25Config(b=0, k1=0),
111112
cleanup_interval_seconds=0,

0 commit comments

Comments
 (0)