oracle-haystack 0.1.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.
- oracle_haystack-0.1.0/.gitignore +146 -0
- oracle_haystack-0.1.0/CHANGELOG.md +18 -0
- oracle_haystack-0.1.0/PKG-INFO +144 -0
- oracle_haystack-0.1.0/README.md +117 -0
- oracle_haystack-0.1.0/docker-compose.yml +18 -0
- oracle_haystack-0.1.0/init/01_vector_memory.sql +7 -0
- oracle_haystack-0.1.0/pydoc/config_docusaurus.yml +14 -0
- oracle_haystack-0.1.0/pyproject.toml +173 -0
- oracle_haystack-0.1.0/src/haystack_integrations/components/retrievers/oracle/__init__.py +7 -0
- oracle_haystack-0.1.0/src/haystack_integrations/components/retrievers/oracle/embedding_retriever.py +119 -0
- oracle_haystack-0.1.0/src/haystack_integrations/components/retrievers/oracle/py.typed +0 -0
- oracle_haystack-0.1.0/src/haystack_integrations/document_stores/oracle/__about__.py +5 -0
- oracle_haystack-0.1.0/src/haystack_integrations/document_stores/oracle/__init__.py +10 -0
- oracle_haystack-0.1.0/src/haystack_integrations/document_stores/oracle/document_store.py +524 -0
- oracle_haystack-0.1.0/src/haystack_integrations/document_stores/oracle/filters.py +147 -0
- oracle_haystack-0.1.0/src/haystack_integrations/document_stores/oracle/py.typed +0 -0
- oracle_haystack-0.1.0/tests/__init__.py +3 -0
- oracle_haystack-0.1.0/tests/conftest.py +126 -0
- oracle_haystack-0.1.0/tests/test_document_store.py +323 -0
- oracle_haystack-0.1.0/tests/test_embedding_retriever.py +80 -0
- oracle_haystack-0.1.0/tests/test_filter_translator.py +136 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
pip-wheel-metadata/
|
|
24
|
+
share/python-wheels/
|
|
25
|
+
*.egg-info/
|
|
26
|
+
.installed.cfg
|
|
27
|
+
*.egg
|
|
28
|
+
MANIFEST
|
|
29
|
+
|
|
30
|
+
# PyInstaller
|
|
31
|
+
# Usually these files are written by a python script from a template
|
|
32
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
33
|
+
*.manifest
|
|
34
|
+
*.spec
|
|
35
|
+
|
|
36
|
+
# Installer logs
|
|
37
|
+
pip-log.txt
|
|
38
|
+
pip-delete-this-directory.txt
|
|
39
|
+
|
|
40
|
+
# Unit test / coverage reports
|
|
41
|
+
htmlcov/
|
|
42
|
+
.tox/
|
|
43
|
+
.nox/
|
|
44
|
+
.coverage
|
|
45
|
+
.coverage.*
|
|
46
|
+
.cache
|
|
47
|
+
nosetests.xml
|
|
48
|
+
coverage.xml
|
|
49
|
+
*.cover
|
|
50
|
+
*.py,cover
|
|
51
|
+
.hypothesis/
|
|
52
|
+
.pytest_cache/
|
|
53
|
+
volumes/
|
|
54
|
+
|
|
55
|
+
# Translations
|
|
56
|
+
*.mo
|
|
57
|
+
*.pot
|
|
58
|
+
|
|
59
|
+
# Django stuff:
|
|
60
|
+
*.log
|
|
61
|
+
local_settings.py
|
|
62
|
+
db.sqlite3
|
|
63
|
+
db.sqlite3-journal
|
|
64
|
+
|
|
65
|
+
# Flask stuff:
|
|
66
|
+
instance/
|
|
67
|
+
.webassets-cache
|
|
68
|
+
|
|
69
|
+
# Scrapy stuff:
|
|
70
|
+
.scrapy
|
|
71
|
+
|
|
72
|
+
# Sphinx documentation
|
|
73
|
+
docs/_build/
|
|
74
|
+
|
|
75
|
+
# PyBuilder
|
|
76
|
+
target/
|
|
77
|
+
|
|
78
|
+
# Jupyter Notebook
|
|
79
|
+
.ipynb_checkpoints
|
|
80
|
+
|
|
81
|
+
# IPython
|
|
82
|
+
profile_default/
|
|
83
|
+
ipython_config.py
|
|
84
|
+
|
|
85
|
+
# pyenv
|
|
86
|
+
.python-version
|
|
87
|
+
|
|
88
|
+
# pipenv
|
|
89
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
90
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
91
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
92
|
+
# install all needed dependencies.
|
|
93
|
+
#Pipfile.lock
|
|
94
|
+
|
|
95
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
|
96
|
+
__pypackages__/
|
|
97
|
+
|
|
98
|
+
# Celery stuff
|
|
99
|
+
celerybeat-schedule
|
|
100
|
+
celerybeat.pid
|
|
101
|
+
|
|
102
|
+
# SageMath parsed files
|
|
103
|
+
*.sage.py
|
|
104
|
+
|
|
105
|
+
# Environments
|
|
106
|
+
.env
|
|
107
|
+
.venv
|
|
108
|
+
env/
|
|
109
|
+
venv/
|
|
110
|
+
ENV/
|
|
111
|
+
env.bak/
|
|
112
|
+
venv.bak/
|
|
113
|
+
|
|
114
|
+
# Spyder project settings
|
|
115
|
+
.spyderproject
|
|
116
|
+
.spyproject
|
|
117
|
+
|
|
118
|
+
# Rope project settings
|
|
119
|
+
.ropeproject
|
|
120
|
+
|
|
121
|
+
# mkdocs documentation
|
|
122
|
+
/site
|
|
123
|
+
|
|
124
|
+
# mypy
|
|
125
|
+
.mypy_cache/
|
|
126
|
+
.dmypy.json
|
|
127
|
+
dmypy.json
|
|
128
|
+
|
|
129
|
+
# Pyre type checker
|
|
130
|
+
.pyre/
|
|
131
|
+
|
|
132
|
+
# IDEs
|
|
133
|
+
.vscode
|
|
134
|
+
|
|
135
|
+
# Docs generation artifacts
|
|
136
|
+
_readme_*.md
|
|
137
|
+
.idea
|
|
138
|
+
|
|
139
|
+
# macOS
|
|
140
|
+
.DS_Store
|
|
141
|
+
|
|
142
|
+
# http cache (requests-cache)
|
|
143
|
+
**/http_cache.sqlite
|
|
144
|
+
|
|
145
|
+
# ruff
|
|
146
|
+
.ruff_cache
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [integrations/oracle-v0.1.0] - 2026-04-15
|
|
4
|
+
|
|
5
|
+
### 🚀 Features
|
|
6
|
+
|
|
7
|
+
- Initial release of `oracle-haystack` — Haystack DocumentStore backed by Oracle AI Vector Search (Oracle Database 23ai+)
|
|
8
|
+
- `OracleDocumentStore`: write, filter, count, and delete documents; embedding retrieval with COSINE/DOT_PRODUCT/EUCLIDEAN distance metrics
|
|
9
|
+
- `OracleEmbeddingRetriever`: synchronous and asynchronous embedding-based retrieval with `FilterPolicy` support
|
|
10
|
+
- `OracleConnectionConfig`: thin-mode (direct TCP) and thick-mode (wallet / ADB-S) connection configuration
|
|
11
|
+
- Optional HNSW vector index creation (`create_index=True`) with configurable neighbours, ef-construction, accuracy, and parallelism
|
|
12
|
+
- Connection pool managed via `oracledb.create_pool`; async operations offloaded with `asyncio.run_in_executor`
|
|
13
|
+
|
|
14
|
+
### 🧪 Testing
|
|
15
|
+
|
|
16
|
+
- Unit tests for `OracleDocumentStore`, `OracleEmbeddingRetriever`, and `FilterTranslator`
|
|
17
|
+
- Integration test suite using a live Oracle 23ai Free instance (Docker-compose provided)
|
|
18
|
+
- CI workflow (`.github/workflows/oracle.yml`) covering lint, unit tests, integration tests, and nightly Haystack-main compatibility checks
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: oracle-haystack
|
|
3
|
+
Version: 0.1.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.26.1
|
|
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
|
+
[](https://pypi.org/project/oracle-haystack)
|
|
31
|
+
[](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
|
+
## Installation
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
pip install oracle-haystack
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Requires Python 3.10+ and Oracle Database 23ai (or later). No Oracle Instant Client is needed for direct TCP connections (thin mode).
|
|
46
|
+
|
|
47
|
+
## Usage
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
from haystack.utils import Secret
|
|
51
|
+
from haystack_integrations.document_stores.oracle import OracleConnectionConfig, OracleDocumentStore
|
|
52
|
+
from haystack_integrations.components.retrievers.oracle import OracleEmbeddingRetriever
|
|
53
|
+
|
|
54
|
+
# Configure the connection
|
|
55
|
+
config = OracleConnectionConfig(
|
|
56
|
+
user=Secret.from_env_var("ORACLE_USER"),
|
|
57
|
+
password=Secret.from_env_var("ORACLE_PASSWORD"),
|
|
58
|
+
dsn=Secret.from_env_var("ORACLE_DSN"),
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
# Create the document store
|
|
62
|
+
store = OracleDocumentStore(
|
|
63
|
+
connection_config=config,
|
|
64
|
+
table_name="my_documents",
|
|
65
|
+
embedding_dim=768,
|
|
66
|
+
distance_metric="COSINE",
|
|
67
|
+
create_table_if_not_exists=True,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
# Write documents
|
|
71
|
+
from haystack.dataclasses import Document
|
|
72
|
+
store.write_documents([
|
|
73
|
+
Document(content="Oracle 23ai supports native vector search."),
|
|
74
|
+
])
|
|
75
|
+
|
|
76
|
+
# Retrieve by embedding
|
|
77
|
+
retriever = OracleEmbeddingRetriever(document_store=store, top_k=5)
|
|
78
|
+
results = retriever.run(query_embedding=[0.1] * 768)
|
|
79
|
+
print(results["documents"])
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Connecting to Oracle Autonomous Database (ADB-S / wallet)
|
|
83
|
+
|
|
84
|
+
```python
|
|
85
|
+
config = OracleConnectionConfig(
|
|
86
|
+
user=Secret.from_env_var("ORACLE_USER"),
|
|
87
|
+
password=Secret.from_env_var("ORACLE_PASSWORD"),
|
|
88
|
+
dsn=Secret.from_env_var("ORACLE_DSN"),
|
|
89
|
+
wallet_location="/path/to/wallet",
|
|
90
|
+
wallet_password=Secret.from_env_var("WALLET_PASSWORD"),
|
|
91
|
+
)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Optional HNSW index
|
|
95
|
+
|
|
96
|
+
Pass `create_index=True` when constructing the store to build an HNSW vector index, which dramatically speeds up approximate nearest-neighbour search on large collections:
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
store = OracleDocumentStore(
|
|
100
|
+
connection_config=config,
|
|
101
|
+
table_name="my_documents",
|
|
102
|
+
embedding_dim=768,
|
|
103
|
+
create_index=True,
|
|
104
|
+
hnsw_neighbors=32,
|
|
105
|
+
hnsw_ef_construction=200,
|
|
106
|
+
hnsw_accuracy=95,
|
|
107
|
+
)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Contributing
|
|
111
|
+
|
|
112
|
+
Refer to the general [Contribution Guidelines](https://github.com/deepset-ai/haystack-core-integrations/blob/main/CONTRIBUTING.md).
|
|
113
|
+
|
|
114
|
+
### Running tests
|
|
115
|
+
|
|
116
|
+
#### Unit tests
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
PYTHONPATH=src hatch run test:unit -vvv
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
#### Integration tests against a live Oracle instance
|
|
123
|
+
|
|
124
|
+
Set `ORACLE_USER`, `ORACLE_PASSWORD`, and `ORACLE_DSN` environment variables to point at your Oracle 23ai instance, then:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
PYTHONPATH=src hatch run test:integration -vvv
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### Integration tests via Docker (local Oracle 23ai Free)
|
|
131
|
+
|
|
132
|
+
A `docker-compose.yml` is provided that runs [`gvenzl/oracle-free:23-slim`](https://hub.docker.com/r/gvenzl/oracle-free) (Oracle Database 23ai Free edition).
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
docker compose up -d --wait
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
`--wait` blocks until the Oracle healthcheck passes (the first boot takes 2–4 minutes while Oracle initialises its data files).
|
|
139
|
+
|
|
140
|
+
Run the full integration test suite:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
PYTHONPATH=src hatch run test:integration -vvv
|
|
144
|
+
```
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# oracle-haystack
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/oracle-haystack)
|
|
4
|
+
[](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
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
pip install oracle-haystack
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Requires Python 3.10+ and Oracle Database 23ai (or later). No Oracle Instant Client is needed for direct TCP connections (thin mode).
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
```python
|
|
23
|
+
from haystack.utils import Secret
|
|
24
|
+
from haystack_integrations.document_stores.oracle import OracleConnectionConfig, OracleDocumentStore
|
|
25
|
+
from haystack_integrations.components.retrievers.oracle import OracleEmbeddingRetriever
|
|
26
|
+
|
|
27
|
+
# Configure the connection
|
|
28
|
+
config = OracleConnectionConfig(
|
|
29
|
+
user=Secret.from_env_var("ORACLE_USER"),
|
|
30
|
+
password=Secret.from_env_var("ORACLE_PASSWORD"),
|
|
31
|
+
dsn=Secret.from_env_var("ORACLE_DSN"),
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# Create the document store
|
|
35
|
+
store = OracleDocumentStore(
|
|
36
|
+
connection_config=config,
|
|
37
|
+
table_name="my_documents",
|
|
38
|
+
embedding_dim=768,
|
|
39
|
+
distance_metric="COSINE",
|
|
40
|
+
create_table_if_not_exists=True,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# Write documents
|
|
44
|
+
from haystack.dataclasses import Document
|
|
45
|
+
store.write_documents([
|
|
46
|
+
Document(content="Oracle 23ai supports native vector search."),
|
|
47
|
+
])
|
|
48
|
+
|
|
49
|
+
# Retrieve by embedding
|
|
50
|
+
retriever = OracleEmbeddingRetriever(document_store=store, top_k=5)
|
|
51
|
+
results = retriever.run(query_embedding=[0.1] * 768)
|
|
52
|
+
print(results["documents"])
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Connecting to Oracle Autonomous Database (ADB-S / wallet)
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
config = OracleConnectionConfig(
|
|
59
|
+
user=Secret.from_env_var("ORACLE_USER"),
|
|
60
|
+
password=Secret.from_env_var("ORACLE_PASSWORD"),
|
|
61
|
+
dsn=Secret.from_env_var("ORACLE_DSN"),
|
|
62
|
+
wallet_location="/path/to/wallet",
|
|
63
|
+
wallet_password=Secret.from_env_var("WALLET_PASSWORD"),
|
|
64
|
+
)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Optional HNSW index
|
|
68
|
+
|
|
69
|
+
Pass `create_index=True` when constructing the store to build an HNSW vector index, which dramatically speeds up approximate nearest-neighbour search on large collections:
|
|
70
|
+
|
|
71
|
+
```python
|
|
72
|
+
store = OracleDocumentStore(
|
|
73
|
+
connection_config=config,
|
|
74
|
+
table_name="my_documents",
|
|
75
|
+
embedding_dim=768,
|
|
76
|
+
create_index=True,
|
|
77
|
+
hnsw_neighbors=32,
|
|
78
|
+
hnsw_ef_construction=200,
|
|
79
|
+
hnsw_accuracy=95,
|
|
80
|
+
)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Contributing
|
|
84
|
+
|
|
85
|
+
Refer to the general [Contribution Guidelines](https://github.com/deepset-ai/haystack-core-integrations/blob/main/CONTRIBUTING.md).
|
|
86
|
+
|
|
87
|
+
### Running tests
|
|
88
|
+
|
|
89
|
+
#### Unit tests
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
PYTHONPATH=src hatch run test:unit -vvv
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
#### Integration tests against a live Oracle instance
|
|
96
|
+
|
|
97
|
+
Set `ORACLE_USER`, `ORACLE_PASSWORD`, and `ORACLE_DSN` environment variables to point at your Oracle 23ai instance, then:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
PYTHONPATH=src hatch run test:integration -vvv
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
#### Integration tests via Docker (local Oracle 23ai Free)
|
|
104
|
+
|
|
105
|
+
A `docker-compose.yml` is provided that runs [`gvenzl/oracle-free:23-slim`](https://hub.docker.com/r/gvenzl/oracle-free) (Oracle Database 23ai Free edition).
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
docker compose up -d --wait
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
`--wait` blocks until the Oracle healthcheck passes (the first boot takes 2–4 minutes while Oracle initialises its data files).
|
|
112
|
+
|
|
113
|
+
Run the full integration test suite:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
PYTHONPATH=src hatch run test:integration -vvv
|
|
117
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
services:
|
|
2
|
+
oracle:
|
|
3
|
+
image: gvenzl/oracle-free:23-slim
|
|
4
|
+
ports:
|
|
5
|
+
- 1521:1521
|
|
6
|
+
environment:
|
|
7
|
+
- ORACLE_PASSWORD=haystack
|
|
8
|
+
- APP_USER=haystack
|
|
9
|
+
- APP_USER_PASSWORD=haystack
|
|
10
|
+
- ORACLE_INIT_PARAMS=vector_memory_size=512M
|
|
11
|
+
volumes:
|
|
12
|
+
- ./init:/container-entrypoint-initdb.d
|
|
13
|
+
healthcheck:
|
|
14
|
+
test: ["CMD", "healthcheck.sh"]
|
|
15
|
+
interval: 10s
|
|
16
|
+
timeout: 5s
|
|
17
|
+
retries: 20
|
|
18
|
+
start_period: 30s
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
-- Enable vector memory pool required for HNSW in-memory vector indexes.
|
|
2
|
+
-- This script runs at container startup via /container-entrypoint-initdb.d.
|
|
3
|
+
-- The primary mechanism is ORACLE_INIT_PARAMS=vector_memory_size=512M in
|
|
4
|
+
-- docker-compose.yml (writes to SPFILE at DB creation time). This ALTER
|
|
5
|
+
-- SYSTEM acts as a belt-and-suspenders dynamic setter for pre-existing
|
|
6
|
+
-- database volumes where the SPFILE value may not have been written yet.
|
|
7
|
+
ALTER SYSTEM SET vector_memory_size = 512M SCOPE=BOTH;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
loaders:
|
|
2
|
+
- modules:
|
|
3
|
+
- haystack_integrations.components.retrievers.oracle.embedding_retriever
|
|
4
|
+
- haystack_integrations.document_stores.oracle.document_store
|
|
5
|
+
search_path: [../src]
|
|
6
|
+
processors:
|
|
7
|
+
- type: filter
|
|
8
|
+
documented_only: true
|
|
9
|
+
skip_empty_modules: true
|
|
10
|
+
renderer:
|
|
11
|
+
description: Oracle AI Vector Search integration for Haystack
|
|
12
|
+
id: integrations-oracle
|
|
13
|
+
filename: oracle.md
|
|
14
|
+
title: Oracle AI Vector Search
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling", "hatch-vcs"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "oracle-haystack"
|
|
7
|
+
dynamic = ["version"]
|
|
8
|
+
description = "Oracle AI Vector Search DocumentStore integration for Haystack"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = "Apache-2.0"
|
|
12
|
+
keywords = ["haystack", "oracle", "vector search", "document store", "RAG", "OCI"]
|
|
13
|
+
authors = [{ name = "deepset GmbH", email = "info@deepset.ai" }]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"License :: OSI Approved :: Apache Software License",
|
|
16
|
+
"Development Status :: 3 - Alpha",
|
|
17
|
+
"Programming Language :: Python",
|
|
18
|
+
"Programming Language :: Python :: 3.10",
|
|
19
|
+
"Programming Language :: Python :: 3.11",
|
|
20
|
+
"Programming Language :: Python :: 3.12",
|
|
21
|
+
"Programming Language :: Python :: 3.13",
|
|
22
|
+
"Programming Language :: Python :: Implementation :: CPython",
|
|
23
|
+
]
|
|
24
|
+
dependencies = [
|
|
25
|
+
"haystack-ai>=2.26.1",
|
|
26
|
+
"oracledb>=2.1.0,<3.0.0",
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
[project.optional-dependencies]
|
|
30
|
+
dev = [
|
|
31
|
+
"pytest>=8.0.0",
|
|
32
|
+
"pytest-asyncio>=0.23.0",
|
|
33
|
+
"ruff>=0.4.0",
|
|
34
|
+
"mypy>=1.9.0",
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
[project.urls]
|
|
38
|
+
"Source Code" = "https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/oracle"
|
|
39
|
+
"Bug Tracker" = "https://github.com/deepset-ai/haystack-core-integrations/issues"
|
|
40
|
+
|
|
41
|
+
[tool.hatch.version]
|
|
42
|
+
source = "vcs"
|
|
43
|
+
tag-pattern = 'integrations\/oracle-v(?P<version>.*)'
|
|
44
|
+
fallback-version = "0.1.0"
|
|
45
|
+
|
|
46
|
+
[tool.hatch.version.raw-options]
|
|
47
|
+
root = "../.."
|
|
48
|
+
git_describe_command = 'git describe --tags --match="integrations/oracle-v[0-9]*"'
|
|
49
|
+
|
|
50
|
+
[tool.hatch.build.targets.wheel]
|
|
51
|
+
packages = ["src/haystack_integrations"]
|
|
52
|
+
|
|
53
|
+
[tool.hatch.envs.default]
|
|
54
|
+
installer = "uv"
|
|
55
|
+
dependencies = ["haystack-pydoc-tools", "ruff"]
|
|
56
|
+
|
|
57
|
+
[tool.hatch.envs.default.scripts]
|
|
58
|
+
docs = ["haystack-pydoc pydoc/config_docusaurus.yml"]
|
|
59
|
+
fmt = "ruff check --fix {args}; ruff format {args}"
|
|
60
|
+
fmt-check = "ruff check {args} && ruff format --check {args}"
|
|
61
|
+
|
|
62
|
+
[tool.hatch.envs.test]
|
|
63
|
+
dependencies = [
|
|
64
|
+
"pytest",
|
|
65
|
+
"pytest-asyncio",
|
|
66
|
+
"pytest-cov",
|
|
67
|
+
"pytest-rerunfailures",
|
|
68
|
+
"mypy",
|
|
69
|
+
"pip",
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
[tool.hatch.envs.test.scripts]
|
|
73
|
+
unit = 'pytest -m "not integration" {args:tests}'
|
|
74
|
+
integration = 'pytest -m "integration" {args:tests}'
|
|
75
|
+
all = 'pytest {args:tests}'
|
|
76
|
+
unit-cov-retry = 'pytest --cov=haystack_integrations --reruns 3 --reruns-delay 30 -x -m "not integration" {args:tests}'
|
|
77
|
+
integration-cov-append-retry = 'pytest --cov=haystack_integrations --cov-append --reruns 3 --reruns-delay 30 -x -m "integration" {args:tests}'
|
|
78
|
+
types = "mypy -p haystack_integrations.document_stores.oracle -p haystack_integrations.components.retrievers.oracle {args}"
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
[tool.pytest.ini_options]
|
|
82
|
+
minversion = "6.0"
|
|
83
|
+
markers = ["unit: unit tests", "integration: integration tests"]
|
|
84
|
+
asyncio_mode = "auto"
|
|
85
|
+
asyncio_default_fixture_loop_scope = "class"
|
|
86
|
+
|
|
87
|
+
[tool.ruff]
|
|
88
|
+
line-length = 120
|
|
89
|
+
|
|
90
|
+
[tool.ruff.lint]
|
|
91
|
+
select = [
|
|
92
|
+
"A",
|
|
93
|
+
"ANN",
|
|
94
|
+
"ARG",
|
|
95
|
+
"B",
|
|
96
|
+
"C",
|
|
97
|
+
"D102", # Missing docstring in public method
|
|
98
|
+
"D103", # Missing docstring in public function
|
|
99
|
+
"D205", # 1 blank line required between summary line and description
|
|
100
|
+
"D209", # Closing triple quotes go to new line
|
|
101
|
+
"D213", # summary lines must be positioned on the second physical line of the docstring
|
|
102
|
+
"D417", # Missing argument descriptions in the docstring
|
|
103
|
+
"D419", # Docstring is empty
|
|
104
|
+
"DTZ",
|
|
105
|
+
"E",
|
|
106
|
+
"EM",
|
|
107
|
+
"F",
|
|
108
|
+
"FBT",
|
|
109
|
+
"I",
|
|
110
|
+
"ICN",
|
|
111
|
+
"ISC",
|
|
112
|
+
"N",
|
|
113
|
+
"PLC",
|
|
114
|
+
"PLE",
|
|
115
|
+
"PLR",
|
|
116
|
+
"PLW",
|
|
117
|
+
"Q",
|
|
118
|
+
"RUF",
|
|
119
|
+
"S",
|
|
120
|
+
"T",
|
|
121
|
+
"TID",
|
|
122
|
+
"UP",
|
|
123
|
+
"W",
|
|
124
|
+
"YTT",
|
|
125
|
+
]
|
|
126
|
+
ignore = [
|
|
127
|
+
# Allow non-abstract empty methods in abstract base classes
|
|
128
|
+
"B027",
|
|
129
|
+
# Allow boolean positional values in function calls, like `dict.get(... True)`
|
|
130
|
+
"FBT003",
|
|
131
|
+
# Ignore checks for possible passwords
|
|
132
|
+
"S105",
|
|
133
|
+
"S106",
|
|
134
|
+
"S107",
|
|
135
|
+
# Ignore complexity
|
|
136
|
+
"C901",
|
|
137
|
+
"PLR0911",
|
|
138
|
+
"PLR0912",
|
|
139
|
+
"PLR0913",
|
|
140
|
+
"PLR0915",
|
|
141
|
+
# Allow `Any` - used legitimately for dynamic types and SDK boundaries
|
|
142
|
+
"ANN401",
|
|
143
|
+
# SQL is built from developer-supplied, regex-validated identifiers (table_name,
|
|
144
|
+
# distance_metric, embedding_dim); all user data is bound via named parameters.
|
|
145
|
+
"S608",
|
|
146
|
+
]
|
|
147
|
+
|
|
148
|
+
[tool.ruff.lint.isort]
|
|
149
|
+
known-first-party = ["haystack_integrations"]
|
|
150
|
+
|
|
151
|
+
[tool.ruff.lint.flake8-tidy-imports]
|
|
152
|
+
ban-relative-imports = "parents"
|
|
153
|
+
|
|
154
|
+
[tool.ruff.lint.per-file-ignores]
|
|
155
|
+
# Tests can use magic values, assertions, relative imports, and don't need type annotations
|
|
156
|
+
"tests/**/*" = ["D", "PLR2004", "S101", "TID252", "ANN"]
|
|
157
|
+
|
|
158
|
+
[tool.coverage.run]
|
|
159
|
+
source = ["haystack_integrations"]
|
|
160
|
+
branch = true
|
|
161
|
+
relative_files = true
|
|
162
|
+
parallel = false
|
|
163
|
+
|
|
164
|
+
[tool.coverage.report]
|
|
165
|
+
omit = ["*/tests/*", "*/__init__.py"]
|
|
166
|
+
show_missing = true
|
|
167
|
+
exclude_lines = ["no cov", "if __name__ == .__main__.:", "if TYPE_CHECKING:"]
|
|
168
|
+
|
|
169
|
+
[tool.mypy]
|
|
170
|
+
install_types = true
|
|
171
|
+
non_interactive = true
|
|
172
|
+
check_untyped_defs = true
|
|
173
|
+
disallow_incomplete_defs = true
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: 2023-present deepset GmbH <info@deepset.ai>
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
from haystack_integrations.components.retrievers.oracle.embedding_retriever import OracleEmbeddingRetriever
|
|
6
|
+
|
|
7
|
+
__all__ = ["OracleEmbeddingRetriever"]
|