oracle-haystack 0.1.0__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. oracle_haystack-0.3.0/CHANGELOG.md +16 -0
  2. oracle_haystack-0.3.0/PKG-INFO +41 -0
  3. oracle_haystack-0.3.0/README.md +14 -0
  4. {oracle_haystack-0.1.0 → oracle_haystack-0.3.0}/pyproject.toml +1 -1
  5. {oracle_haystack-0.1.0 → oracle_haystack-0.3.0}/src/haystack_integrations/components/retrievers/oracle/__init__.py +2 -1
  6. oracle_haystack-0.3.0/src/haystack_integrations/components/retrievers/oracle/keyword_retriever.py +115 -0
  7. oracle_haystack-0.3.0/src/haystack_integrations/document_stores/oracle/document_store.py +1007 -0
  8. {oracle_haystack-0.1.0 → oracle_haystack-0.3.0}/src/haystack_integrations/document_stores/oracle/filters.py +11 -8
  9. {oracle_haystack-0.1.0 → oracle_haystack-0.3.0}/tests/conftest.py +2 -0
  10. {oracle_haystack-0.1.0 → oracle_haystack-0.3.0}/tests/test_document_store.py +36 -3
  11. {oracle_haystack-0.1.0 → oracle_haystack-0.3.0}/tests/test_filter_translator.py +24 -0
  12. oracle_haystack-0.3.0/tests/test_keyword_retriever.py +80 -0
  13. oracle_haystack-0.1.0/CHANGELOG.md +0 -18
  14. oracle_haystack-0.1.0/PKG-INFO +0 -144
  15. oracle_haystack-0.1.0/README.md +0 -117
  16. oracle_haystack-0.1.0/src/haystack_integrations/document_stores/oracle/document_store.py +0 -524
  17. {oracle_haystack-0.1.0 → oracle_haystack-0.3.0}/.gitignore +0 -0
  18. {oracle_haystack-0.1.0 → oracle_haystack-0.3.0}/docker-compose.yml +0 -0
  19. {oracle_haystack-0.1.0 → oracle_haystack-0.3.0}/init/01_vector_memory.sql +0 -0
  20. {oracle_haystack-0.1.0 → oracle_haystack-0.3.0}/pydoc/config_docusaurus.yml +0 -0
  21. {oracle_haystack-0.1.0 → oracle_haystack-0.3.0}/src/haystack_integrations/components/retrievers/oracle/embedding_retriever.py +0 -0
  22. {oracle_haystack-0.1.0/src/haystack_integrations/components/retrievers/oracle → oracle_haystack-0.3.0/src/haystack_integrations/components/retrievers}/py.typed +0 -0
  23. {oracle_haystack-0.1.0 → oracle_haystack-0.3.0}/src/haystack_integrations/document_stores/oracle/__about__.py +0 -0
  24. {oracle_haystack-0.1.0 → oracle_haystack-0.3.0}/src/haystack_integrations/document_stores/oracle/__init__.py +0 -0
  25. {oracle_haystack-0.1.0/src/haystack_integrations/document_stores/oracle → oracle_haystack-0.3.0/src/haystack_integrations/document_stores}/py.typed +0 -0
  26. {oracle_haystack-0.1.0 → oracle_haystack-0.3.0}/tests/__init__.py +0 -0
  27. {oracle_haystack-0.1.0 → oracle_haystack-0.3.0}/tests/test_embedding_retriever.py +0 -0
@@ -0,0 +1,16 @@
1
+ # Changelog
2
+
3
+ ## [integrations/oracle-v0.2.0] - 2026-04-23
4
+
5
+ ### 🚀 Features
6
+
7
+ - Complete `OracleDocumentStore` operations (#3179)
8
+
9
+
10
+ ## [integrations/oracle-v0.1.0] - 2026-04-16
11
+
12
+ ### 🚀 Features
13
+
14
+ - Add Oracle AI Vector Search DocumentStore (oracle-haystack) (#3096)
15
+
16
+ <!-- generated by git-cliff -->
@@ -0,0 +1,41 @@
1
+ Metadata-Version: 2.4
2
+ Name: oracle-haystack
3
+ Version: 0.3.0
4
+ Summary: Oracle AI Vector Search DocumentStore integration for Haystack
5
+ Project-URL: Source Code, https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/oracle
6
+ Project-URL: Bug Tracker, https://github.com/deepset-ai/haystack-core-integrations/issues
7
+ Author-email: deepset GmbH <info@deepset.ai>
8
+ License-Expression: Apache-2.0
9
+ Keywords: OCI,RAG,document store,haystack,oracle,vector search
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: License :: OSI Approved :: Apache Software License
12
+ Classifier: Programming Language :: Python
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Programming Language :: Python :: Implementation :: CPython
18
+ Requires-Python: >=3.10
19
+ Requires-Dist: haystack-ai>=2.28.0
20
+ Requires-Dist: oracledb<3.0.0,>=2.1.0
21
+ Provides-Extra: dev
22
+ Requires-Dist: mypy>=1.9.0; extra == 'dev'
23
+ Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
24
+ Requires-Dist: pytest>=8.0.0; extra == 'dev'
25
+ Requires-Dist: ruff>=0.4.0; extra == 'dev'
26
+ Description-Content-Type: text/markdown
27
+
28
+ # oracle-haystack
29
+
30
+ [![PyPI - Version](https://img.shields.io/pypi/v/oracle-haystack.svg)](https://pypi.org/project/oracle-haystack)
31
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/oracle-haystack.svg)](https://pypi.org/project/oracle-haystack)
32
+
33
+ Haystack DocumentStore backed by [Oracle AI Vector Search](https://www.oracle.com/database/ai-vector-search/), available in Oracle Database 23ai and later.
34
+
35
+ - [Changelog](https://github.com/deepset-ai/haystack-core-integrations/blob/main/integrations/oracle/CHANGELOG.md)
36
+
37
+ ---
38
+
39
+ ## Contributing
40
+
41
+ Refer to the general [Contribution Guidelines](https://github.com/deepset-ai/haystack-core-integrations/blob/main/CONTRIBUTING.md).
@@ -0,0 +1,14 @@
1
+ # oracle-haystack
2
+
3
+ [![PyPI - Version](https://img.shields.io/pypi/v/oracle-haystack.svg)](https://pypi.org/project/oracle-haystack)
4
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/oracle-haystack.svg)](https://pypi.org/project/oracle-haystack)
5
+
6
+ Haystack DocumentStore backed by [Oracle AI Vector Search](https://www.oracle.com/database/ai-vector-search/), available in Oracle Database 23ai and later.
7
+
8
+ - [Changelog](https://github.com/deepset-ai/haystack-core-integrations/blob/main/integrations/oracle/CHANGELOG.md)
9
+
10
+ ---
11
+
12
+ ## Contributing
13
+
14
+ Refer to the general [Contribution Guidelines](https://github.com/deepset-ai/haystack-core-integrations/blob/main/CONTRIBUTING.md).
@@ -22,7 +22,7 @@ classifiers = [
22
22
  "Programming Language :: Python :: Implementation :: CPython",
23
23
  ]
24
24
  dependencies = [
25
- "haystack-ai>=2.26.1",
25
+ "haystack-ai>=2.28.0",
26
26
  "oracledb>=2.1.0,<3.0.0",
27
27
  ]
28
28
 
@@ -3,5 +3,6 @@
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
 
5
5
  from haystack_integrations.components.retrievers.oracle.embedding_retriever import OracleEmbeddingRetriever
6
+ from haystack_integrations.components.retrievers.oracle.keyword_retriever import OracleKeywordRetriever
6
7
 
7
- __all__ = ["OracleEmbeddingRetriever"]
8
+ __all__ = ["OracleEmbeddingRetriever", "OracleKeywordRetriever"]
@@ -0,0 +1,115 @@
1
+ # SPDX-FileCopyrightText: 2023-present deepset GmbH <info@deepset.ai>
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from typing import Any
6
+
7
+ from haystack import component, default_from_dict, default_to_dict
8
+ from haystack.dataclasses import Document
9
+ from haystack.document_stores.types import FilterPolicy
10
+ from haystack.document_stores.types.filter_policy import apply_filter_policy
11
+
12
+ from haystack_integrations.document_stores.oracle import OracleDocumentStore
13
+
14
+
15
+ @component
16
+ class OracleKeywordRetriever:
17
+ """
18
+ Retrieves documents from an OracleDocumentStore using keyword-based (BM25) similarity.
19
+
20
+ Requires Oracle Database 23ai and an automatically created DBMS_SEARCH index.
21
+
22
+ Use inside a Haystack pipeline::
23
+
24
+ pipeline.add_component("retriever", OracleKeywordRetriever(document_store=store, top_k=5))
25
+ """
26
+
27
+ def __init__(
28
+ self,
29
+ *,
30
+ document_store: OracleDocumentStore,
31
+ filters: dict[str, Any] | None = None,
32
+ top_k: int = 10,
33
+ filter_policy: FilterPolicy = FilterPolicy.REPLACE,
34
+ ) -> None:
35
+ if not isinstance(document_store, OracleDocumentStore):
36
+ msg = "document_store must be an instance of OracleDocumentStore"
37
+ raise TypeError(msg)
38
+ self.document_store = document_store
39
+ self.filters = filters or {}
40
+ self.top_k = top_k
41
+ self.filter_policy = FilterPolicy.from_str(filter_policy) if isinstance(filter_policy, str) else filter_policy
42
+
43
+ @component.output_types(documents=list[Document])
44
+ def run(
45
+ self,
46
+ query: str,
47
+ filters: dict[str, Any] | None = None,
48
+ top_k: int | None = None,
49
+ ) -> dict[str, list[Document]]:
50
+ """
51
+ Retrieve documents by keyword search.
52
+
53
+ Args:
54
+ query: The keyword query string.
55
+ filters: Runtime filters, merged with constructor filters according to filter_policy.
56
+ top_k: Override the constructor top_k for this call.
57
+
58
+ Returns:
59
+ ``{"documents": [Document, ...]}``
60
+ """
61
+ filters = apply_filter_policy(self.filter_policy, self.filters, filters)
62
+ docs = self.document_store._keyword_retrieval(
63
+ query,
64
+ filters=filters,
65
+ top_k=top_k if top_k is not None else self.top_k,
66
+ )
67
+ return {"documents": docs}
68
+
69
+ @component.output_types(documents=list[Document])
70
+ async def run_async(
71
+ self,
72
+ query: str,
73
+ filters: dict[str, Any] | None = None,
74
+ top_k: int | None = None,
75
+ ) -> dict[str, list[Document]]:
76
+ """Async variant of :meth:`run`."""
77
+ filters = apply_filter_policy(self.filter_policy, self.filters, filters)
78
+ docs = await self.document_store._keyword_retrieval_async(
79
+ query,
80
+ filters=filters,
81
+ top_k=top_k if top_k is not None else self.top_k,
82
+ )
83
+ return {"documents": docs}
84
+
85
+ def to_dict(self) -> dict[str, Any]:
86
+ """
87
+ Serializes the component to a dictionary.
88
+
89
+ :returns:
90
+ Dictionary with serialized data.
91
+ """
92
+ return default_to_dict(
93
+ self,
94
+ document_store=self.document_store.to_dict(),
95
+ filters=self.filters,
96
+ top_k=self.top_k,
97
+ filter_policy=self.filter_policy.value,
98
+ )
99
+
100
+ @classmethod
101
+ def from_dict(cls, data: dict[str, Any]) -> "OracleKeywordRetriever":
102
+ """
103
+ Deserializes the component from a dictionary.
104
+
105
+ :param data:
106
+ Dictionary to deserialize from.
107
+ :returns:
108
+ Deserialized component.
109
+ """
110
+ params = data.get("init_parameters", {})
111
+ if "document_store" in params:
112
+ params["document_store"] = OracleDocumentStore.from_dict(params["document_store"])
113
+ if filter_policy := params.get("filter_policy"):
114
+ params["filter_policy"] = FilterPolicy.from_str(filter_policy)
115
+ return default_from_dict(cls, data)