Skip to content
Open
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
2 changes: 1 addition & 1 deletion .github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ env:
WEAVIATE_130: 1.30.12
WEAVIATE_131: 1.31.5
WEAVIATE_132: 1.32.0-rc.1-098c594
WEAVIATE_133: preview-remove-support-for-old-clients-a52a482.amd64
WEAVIATE_133: 1.33.0-dev-cb09e79.amd64

jobs:
lint-and-format:
Expand Down
4 changes: 2 additions & 2 deletions integration/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ def test_create_export_and_recreate(client: weaviate.WeaviateClient, request: Su
vectorizer_config=Configure.Vectorizer.text2vec_contextionary(
vectorize_collection_name=False
),
generative_config=Configure.Generative.cohere(model="something", k=10),
generative_config=Configure.Generative.cohere(model="command-medium-nightly", k=10),
properties=[
Property(
name="name",
Expand Down Expand Up @@ -270,7 +270,7 @@ def test_create_export_and_recreate(client: weaviate.WeaviateClient, request: Su

assert export.generative_config is not None
assert export.generative_config.generative == GenerativeSearches.COHERE
assert export.generative_config.model["model"] == "something"
assert export.generative_config.model["model"] == "command-medium-nightly"
assert export.generative_config.model["kProperty"] == 10

client.collections.delete([name1, name2])
Expand Down
32 changes: 29 additions & 3 deletions integration/test_iterator.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
)
from weaviate.collections.iterator import ITERATOR_CACHE_SIZE
from weaviate.exceptions import WeaviateInvalidInputError
import weaviate.classes as wvc


@pytest.fixture(scope="module")
Expand Down Expand Up @@ -220,8 +221,33 @@ def test_iterator_with_after(collection_factory: CollectionFactory) -> None:
collection.data.insert_many([DataObject(properties={"data": i}) for i in range(10)])

uuids = [obj.uuid for obj in collection.iterator()]
obj6 = collection.query.fetch_object_by_id(uuids[6])
iterator = collection.iterator(after=uuids[5])
assert (
next(iterator).properties["data"]
== collection.query.fetch_object_by_id(uuids[6]).properties["data"]
next_object = next(iterator)
assert next_object.properties["data"] == obj6.properties["data"]


def test_iterator_with_filter(collection_factory: CollectionFactory) -> None:
collection = collection_factory(
properties=[
Property(name="bool", data_type=DataType.BOOL),
Property(name="count", data_type=DataType.INT),
],
vectorizer_config=Configure.Vectorizer.none(),
data_model_properties=Dict[str, int],
)

if collection._connection._weaviate_version.is_lower_than(1, 33, 0):
pytest.skip("Iterator with filters requires Weaviate version 1.33 or higher")

num_objects = 1000
res = collection.data.insert_many(
[DataObject(properties={"bool": i % 2 == 0, "count": i}) for i in range(num_objects)]
)
assert not res.has_errors

count = 0
for obj in collection.iterator(filters=wvc.query.Filter.by_property("bool").equal(True)):
assert obj.properties["bool"] is True
count += 1
assert count == num_objects / 2
15 changes: 15 additions & 0 deletions weaviate/collections/collection/async_.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from weaviate.collections.backups import _CollectionBackupAsync
from weaviate.collections.classes.cluster import Shard
from weaviate.collections.classes.config import ConsistencyLevel
from weaviate.collections.classes.filters import _Filters
from weaviate.collections.classes.grpc import METADATA, PROPERTIES, REFERENCES
from weaviate.collections.classes.internal import (
CrossReferences,
Expand All @@ -24,6 +25,7 @@
from weaviate.collections.query import _QueryCollectionAsync
from weaviate.collections.tenants import _TenantsAsync
from weaviate.connect.v4 import ConnectionAsync
from weaviate.exceptions import WeaviateUnsupportedFeatureError
from weaviate.types import UUID

from .base import _CollectionBase
Expand Down Expand Up @@ -197,6 +199,7 @@ def iterator(
include_vector: bool = False,
return_metadata: Optional[METADATA] = None,
*,
filters: Optional[_Filters] = None,
return_properties: Optional[PROPERTIES] = None,
return_references: Literal[None] = None,
after: Optional[UUID] = None,
Expand All @@ -209,6 +212,7 @@ def iterator(
include_vector: bool = False,
return_metadata: Optional[METADATA] = None,
*,
filters: Optional[_Filters] = None,
return_properties: Optional[PROPERTIES] = None,
return_references: REFERENCES,
after: Optional[UUID] = None,
Expand All @@ -221,6 +225,7 @@ def iterator(
include_vector: bool = False,
return_metadata: Optional[METADATA] = None,
*,
filters: Optional[_Filters] = None,
return_properties: Optional[PROPERTIES] = None,
return_references: Type[TReferences],
after: Optional[UUID] = None,
Expand All @@ -233,6 +238,7 @@ def iterator(
include_vector: bool = False,
return_metadata: Optional[METADATA] = None,
*,
filters: Optional[_Filters] = None,
return_properties: Type[TProperties],
return_references: Literal[None] = None,
after: Optional[UUID] = None,
Expand All @@ -245,6 +251,7 @@ def iterator(
include_vector: bool = False,
return_metadata: Optional[METADATA] = None,
*,
filters: Optional[_Filters] = None,
return_properties: Type[TProperties],
return_references: REFERENCES,
after: Optional[UUID] = None,
Expand All @@ -257,6 +264,7 @@ def iterator(
include_vector: bool = False,
return_metadata: Optional[METADATA] = None,
*,
filters: Optional[_Filters] = None,
return_properties: Type[TProperties],
return_references: Type[TReferences],
after: Optional[UUID] = None,
Expand All @@ -268,6 +276,7 @@ def iterator(
include_vector: bool = False,
return_metadata: Optional[METADATA] = None,
*,
filters: Optional[_Filters] = None,
return_properties: Optional[ReturnProperties[TProperties]] = None,
return_references: Optional[ReturnReferences[TReferences]] = None,
after: Optional[UUID] = None,
Expand Down Expand Up @@ -301,6 +310,11 @@ def iterator(
Raises:
weaviate.exceptions.WeaviateGRPCQueryError: If the request to the Weaviate server fails.
"""
if filters is not None and self.query._connection._weaviate_version.is_lower_than(1, 33, 0):
raise WeaviateUnsupportedFeatureError(
"Iterator with filters", self._connection.server_version, "1.33.0"
)

return _ObjectAIterator(
self.query,
_IteratorInputs(
Expand All @@ -309,6 +323,7 @@ def iterator(
return_properties=return_properties,
return_references=return_references,
after=after,
filters=filters,
),
cache_size=cache_size,
)
16 changes: 16 additions & 0 deletions weaviate/collections/collection/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from weaviate.collections.batch.collection import _BatchCollectionWrapper
from weaviate.collections.classes.cluster import Shard
from weaviate.collections.classes.config import ConsistencyLevel
from weaviate.collections.classes.filters import _Filters
from weaviate.collections.classes.grpc import METADATA, PROPERTIES, REFERENCES
from weaviate.collections.classes.internal import (
CrossReferences,
Expand All @@ -25,6 +26,7 @@
from weaviate.collections.query import _QueryCollection
from weaviate.collections.tenants import _Tenants
from weaviate.connect.v4 import ConnectionSync
from weaviate.exceptions import WeaviateUnsupportedFeatureError
from weaviate.types import UUID

from .base import _CollectionBase
Expand Down Expand Up @@ -221,6 +223,7 @@ def iterator(
include_vector: bool = False,
return_metadata: Optional[METADATA] = None,
*,
filters: Optional[_Filters] = None,
return_properties: Optional[PROPERTIES] = None,
return_references: Literal[None] = None,
after: Optional[UUID] = None,
Expand All @@ -233,6 +236,7 @@ def iterator(
include_vector: bool = False,
return_metadata: Optional[METADATA] = None,
*,
filters: Optional[_Filters] = None,
return_properties: Optional[PROPERTIES] = None,
return_references: REFERENCES,
after: Optional[UUID] = None,
Expand All @@ -245,6 +249,7 @@ def iterator(
include_vector: bool = False,
return_metadata: Optional[METADATA] = None,
*,
filters: Optional[_Filters] = None,
return_properties: Optional[PROPERTIES] = None,
return_references: Type[TReferences],
after: Optional[UUID] = None,
Expand All @@ -257,6 +262,7 @@ def iterator(
include_vector: bool = False,
return_metadata: Optional[METADATA] = None,
*,
filters: Optional[_Filters] = None,
return_properties: Type[TProperties],
return_references: Literal[None] = None,
after: Optional[UUID] = None,
Expand All @@ -269,6 +275,7 @@ def iterator(
include_vector: bool = False,
return_metadata: Optional[METADATA] = None,
*,
filters: Optional[_Filters] = None,
return_properties: Type[TProperties],
return_references: REFERENCES,
after: Optional[UUID] = None,
Expand All @@ -281,6 +288,7 @@ def iterator(
include_vector: bool = False,
return_metadata: Optional[METADATA] = None,
*,
filters: Optional[_Filters] = None,
return_properties: Type[TProperties],
return_references: Type[TReferences],
after: Optional[UUID] = None,
Expand All @@ -292,6 +300,7 @@ def iterator(
include_vector: bool = False,
return_metadata: Optional[METADATA] = None,
*,
filters: Optional[_Filters] = None,
return_properties: Optional[ReturnProperties[TProperties]] = None,
return_references: Optional[ReturnReferences[TReferences]] = None,
after: Optional[UUID] = None,
Expand All @@ -315,6 +324,7 @@ def iterator(
are returned. Use `wvc.QueryReference` to specify which references to return.

Args:
filters: The filters to apply to the query.
include_vector: Whether to include the vector in the metadata of the returned objects.
return_metadata: The metadata to return with each object.
return_properties: The properties to return with each object.
Expand All @@ -325,9 +335,15 @@ def iterator(
Raises:
weaviate.exceptions.WeaviateGRPCQueryError: If the request to the Weaviate server fails.
"""
if filters is not None and self.query._connection._weaviate_version.is_lower_than(1, 33, 0):
raise WeaviateUnsupportedFeatureError(
"Iterator with filters", self._connection.server_version, "1.33.0"
)

return _ObjectIterator(
self.query,
_IteratorInputs(
filters=filters,
include_vector=include_vector,
return_metadata=return_metadata,
return_properties=return_properties,
Expand Down
15 changes: 11 additions & 4 deletions weaviate/collections/iterator.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
)
from uuid import UUID

from weaviate.collections.classes.filters import _Filters
from weaviate.collections.classes.grpc import METADATA
from weaviate.collections.classes.internal import (
Object,
Expand All @@ -30,15 +31,19 @@

@dataclass
class _IteratorInputs(Generic[TProperties, TReferences]):
filters: Optional[_Filters]
include_vector: bool
return_metadata: Optional[METADATA]
return_properties: Optional[ReturnProperties[TProperties]]
return_references: Optional[ReturnReferences[TReferences]]
after: Optional[UUIDorStr]


def _parse_after(after: Optional[UUIDorStr]) -> Optional[UUID]:
return after if after is None or isinstance(after, UUID) else UUID(after)
def _parse_after(after: Optional[UUIDorStr]) -> UUIDorStr:
if after is None:
return ""

return UUID(after) if not isinstance(after, UUID) else after


class _ObjectIterator(
Expand All @@ -55,7 +60,7 @@ def __init__(
self.__inputs = inputs

self.__iter_object_cache: List[Object[TProperties, TReferences]] = []
self.__iter_object_last_uuid: Optional[UUID] = _parse_after(self.__inputs.after)
self.__iter_object_last_uuid: Optional[UUIDorStr] = _parse_after(self.__inputs.after)
self.__iter_cache_size = cache_size or ITERATOR_CACHE_SIZE

def __iter__(
Expand All @@ -74,6 +79,7 @@ def __next__(self) -> Object[TProperties, TReferences]:
return_metadata=self.__inputs.return_metadata,
return_properties=self.__inputs.return_properties,
return_references=self.__inputs.return_references,
filters=self.__inputs.filters,
)
self.__iter_object_cache = res.objects # type: ignore
if len(self.__iter_object_cache) == 0:
Expand Down Expand Up @@ -101,7 +107,7 @@ def __init__(
self.__inputs = inputs

self.__iter_object_cache: List[Object[TProperties, TReferences]] = []
self.__iter_object_last_uuid: Optional[UUID] = _parse_after(self.__inputs.after)
self.__iter_object_last_uuid: UUIDorStr = _parse_after(self.__inputs.after)
self.__iter_cache_size = cache_size or ITERATOR_CACHE_SIZE

def __aiter__(
Expand All @@ -122,6 +128,7 @@ async def __anext__(
return_metadata=self.__inputs.return_metadata,
return_properties=self.__inputs.return_properties,
return_references=self.__inputs.return_references,
filters=self.__inputs.filters,
)
self.__iter_object_cache = res.objects # type: ignore
if len(self.__iter_object_cache) == 0:
Expand Down
Loading
Loading