thoth-dbmanager 0.4.2__py3-none-any.whl → 0.4.3__py3-none-any.whl
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.
- thoth_dbmanager/__init__.py +1 -7
- thoth_dbmanager/dynamic_imports.py +36 -44
- {thoth_dbmanager-0.4.2.dist-info → thoth_dbmanager-0.4.3.dist-info}/METADATA +13 -11
- {thoth_dbmanager-0.4.2.dist-info → thoth_dbmanager-0.4.3.dist-info}/RECORD +7 -9
- thoth_dbmanager/adapters/qdrant.py +0 -189
- thoth_dbmanager/plugins/qdrant.py +0 -41
- {thoth_dbmanager-0.4.2.dist-info → thoth_dbmanager-0.4.3.dist-info}/WHEEL +0 -0
- {thoth_dbmanager-0.4.2.dist-info → thoth_dbmanager-0.4.3.dist-info}/licenses/LICENSE +0 -0
- {thoth_dbmanager-0.4.2.dist-info → thoth_dbmanager-0.4.3.dist-info}/top_level.txt +0 -0
thoth_dbmanager/__init__.py
CHANGED
@@ -43,7 +43,6 @@ from .dynamic_imports import (
|
|
43
43
|
import_sqlserver,
|
44
44
|
import_oracle,
|
45
45
|
import_mariadb,
|
46
|
-
import_informix,
|
47
46
|
import_supabase,
|
48
47
|
)
|
49
48
|
|
@@ -62,8 +61,6 @@ def __getattr__(name: str):
|
|
62
61
|
return import_manager('sqlserver')
|
63
62
|
elif name == 'ThothOracleManager':
|
64
63
|
return import_manager('oracle')
|
65
|
-
elif name == 'ThothInformixManager':
|
66
|
-
return import_manager('informix')
|
67
64
|
elif name == 'ThothSupabaseManager':
|
68
65
|
return import_manager('supabase')
|
69
66
|
|
@@ -79,7 +76,6 @@ __all__ = [
|
|
79
76
|
"ThothMariaDbManager",
|
80
77
|
"ThothSqlServerManager",
|
81
78
|
"ThothOracleManager",
|
82
|
-
"ThothInformixManager",
|
83
79
|
"ThothSupabaseManager",
|
84
80
|
|
85
81
|
# New architecture
|
@@ -106,7 +102,6 @@ __all__ = [
|
|
106
102
|
"MariaDBPlugin",
|
107
103
|
"SQLServerPlugin",
|
108
104
|
"OraclePlugin",
|
109
|
-
"InformixPlugin",
|
110
105
|
"SupabasePlugin",
|
111
106
|
|
112
107
|
# Adapters
|
@@ -116,7 +111,6 @@ __all__ = [
|
|
116
111
|
"MariaDBAdapter",
|
117
112
|
"SQLServerAdapter",
|
118
113
|
"OracleAdapter",
|
119
|
-
"InformixAdapter",
|
120
114
|
"SupabaseAdapter",
|
121
115
|
|
122
116
|
# LSH functionality
|
@@ -133,4 +127,4 @@ __all__ = [
|
|
133
127
|
"DatabaseImportError",
|
134
128
|
]
|
135
129
|
|
136
|
-
__version__ = "0.4.
|
130
|
+
__version__ = "0.4.3"
|
@@ -14,45 +14,32 @@ DATABASE_DEPENDENCIES = {
|
|
14
14
|
'mariadb': ['mariadb'],
|
15
15
|
'sqlserver': ['pyodbc'],
|
16
16
|
'oracle': ['cx_Oracle'],
|
17
|
-
'informix': ['informixdb'],
|
18
17
|
'supabase': ['supabase', 'postgrest', 'gotrue'],
|
19
18
|
'sqlite': [], # Built into Python
|
20
19
|
}
|
21
20
|
|
22
|
-
#
|
23
|
-
DATABASE_MANAGERS = {
|
24
|
-
'postgresql': 'dbmanager.impl.ThothPgManager.ThothPgManager',
|
25
|
-
'mysql': 'dbmanager.impl.ThothMySqlManager.ThothMySqlManager',
|
26
|
-
'mariadb': 'dbmanager.impl.ThothMariaDbManager.ThothMariaDbManager',
|
27
|
-
'sqlserver': 'dbmanager.impl.ThothSqlServerManager.ThothSqlServerManager',
|
28
|
-
'oracle': 'dbmanager.impl.ThothOracleManager.ThothOracleManager',
|
29
|
-
'informix': 'dbmanager.impl.ThothInformixManager.ThothInformixManager',
|
30
|
-
'supabase': 'dbmanager.impl.ThothSupabaseManager.ThothSupabaseManager',
|
31
|
-
'sqlite': 'dbmanager.impl.ThothSqliteManager.ThothSqliteManager',
|
32
|
-
}
|
21
|
+
# Note: DATABASE_MANAGERS is no longer used - managers are created via factory pattern
|
33
22
|
|
34
23
|
# Mapping of database names to their adapter classes
|
35
24
|
DATABASE_ADAPTERS = {
|
36
|
-
'postgresql': '
|
37
|
-
'mysql': '
|
38
|
-
'mariadb': '
|
39
|
-
'sqlserver': '
|
40
|
-
'oracle': '
|
41
|
-
'
|
42
|
-
'
|
43
|
-
'sqlite': 'dbmanager.adapters.sqlite.SQLiteAdapter',
|
25
|
+
'postgresql': 'thoth_dbmanager.adapters.postgresql.PostgreSQLAdapter',
|
26
|
+
'mysql': 'thoth_dbmanager.adapters.mysql.MySQLAdapter',
|
27
|
+
'mariadb': 'thoth_dbmanager.adapters.mariadb.MariaDBAdapter',
|
28
|
+
'sqlserver': 'thoth_dbmanager.adapters.sqlserver.SQLServerAdapter',
|
29
|
+
'oracle': 'thoth_dbmanager.adapters.oracle.OracleAdapter',
|
30
|
+
'supabase': 'thoth_dbmanager.adapters.supabase.SupabaseAdapter',
|
31
|
+
'sqlite': 'thoth_dbmanager.adapters.sqlite.SQLiteAdapter',
|
44
32
|
}
|
45
33
|
|
46
34
|
# Mapping of database names to their plugin classes
|
47
35
|
DATABASE_PLUGINS = {
|
48
|
-
'postgresql': '
|
49
|
-
'mysql': '
|
50
|
-
'mariadb': '
|
51
|
-
'sqlserver': '
|
52
|
-
'oracle': '
|
53
|
-
'
|
54
|
-
'
|
55
|
-
'sqlite': 'dbmanager.plugins.sqlite.SQLitePlugin',
|
36
|
+
'postgresql': 'thoth_dbmanager.plugins.postgresql.PostgreSQLPlugin',
|
37
|
+
'mysql': 'thoth_dbmanager.plugins.mysql.MySQLPlugin',
|
38
|
+
'mariadb': 'thoth_dbmanager.plugins.mariadb.MariaDBPlugin',
|
39
|
+
'sqlserver': 'thoth_dbmanager.plugins.sqlserver.SQLServerPlugin',
|
40
|
+
'oracle': 'thoth_dbmanager.plugins.oracle.OraclePlugin',
|
41
|
+
'supabase': 'thoth_dbmanager.plugins.supabase.SupabasePlugin',
|
42
|
+
'sqlite': 'thoth_dbmanager.plugins.sqlite.SQLitePlugin',
|
56
43
|
}
|
57
44
|
|
58
45
|
|
@@ -93,30 +80,39 @@ def check_dependencies(database: str) -> List[str]:
|
|
93
80
|
|
94
81
|
def import_manager(database: str) -> Any:
|
95
82
|
"""
|
96
|
-
Dynamically import a database manager
|
97
|
-
|
83
|
+
Dynamically import a database manager using the factory pattern.
|
84
|
+
|
98
85
|
Args:
|
99
86
|
database: Name of the database
|
100
|
-
|
87
|
+
|
101
88
|
Returns:
|
102
|
-
The database manager class
|
103
|
-
|
89
|
+
The database manager class (factory-created)
|
90
|
+
|
104
91
|
Raises:
|
105
92
|
DatabaseImportError: If dependencies are missing
|
106
93
|
ImportError: If the manager class cannot be imported
|
107
94
|
"""
|
108
|
-
if database not in
|
95
|
+
if database not in DATABASE_PLUGINS:
|
109
96
|
raise ValueError(f"Unknown database: {database}")
|
110
|
-
|
97
|
+
|
111
98
|
# Check dependencies
|
112
99
|
missing_deps = check_dependencies(database)
|
113
100
|
if missing_deps:
|
114
101
|
raise DatabaseImportError(database, missing_deps)
|
115
|
-
|
116
|
-
# Import the manager class
|
117
|
-
|
118
|
-
|
119
|
-
|
102
|
+
|
103
|
+
# Import the factory and create a manager class
|
104
|
+
from thoth_dbmanager.core.factory import ThothDbFactory
|
105
|
+
|
106
|
+
# Create a wrapper class that can be instantiated like the old managers
|
107
|
+
class DatabaseManagerWrapper:
|
108
|
+
def __init__(self, *args, **kwargs):
|
109
|
+
# Create manager using factory
|
110
|
+
self._manager = ThothDbFactory.create_manager(database, *args, **kwargs)
|
111
|
+
|
112
|
+
def __getattr__(self, name):
|
113
|
+
return getattr(self._manager, name)
|
114
|
+
|
115
|
+
return DatabaseManagerWrapper
|
120
116
|
|
121
117
|
|
122
118
|
def import_adapter(database: str) -> Any:
|
@@ -241,10 +237,6 @@ def import_mariadb():
|
|
241
237
|
"""Import MariaDB components."""
|
242
238
|
return import_database_components(['mariadb'])['mariadb']
|
243
239
|
|
244
|
-
def import_informix():
|
245
|
-
"""Import Informix components."""
|
246
|
-
return import_database_components(['informix'])['informix']
|
247
|
-
|
248
240
|
def import_supabase():
|
249
241
|
"""Import Supabase components."""
|
250
242
|
return import_database_components(['supabase'])['supabase']
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: thoth_dbmanager
|
3
|
-
Version: 0.4.
|
3
|
+
Version: 0.4.3
|
4
4
|
Summary: A Python library for managing SQL databases with support for multiple database types, LSH-based similarity search, and a modern plugin architecture.
|
5
5
|
Author-email: Marco Pancotti <mp@tylconsulting.it>
|
6
6
|
License: MIT
|
@@ -28,6 +28,8 @@ Requires-Dist: datasketch>=1.5.0
|
|
28
28
|
Requires-Dist: tqdm>=4.60.0
|
29
29
|
Requires-Dist: SQLAlchemy>=1.4.0
|
30
30
|
Requires-Dist: pydantic>=2.0.0
|
31
|
+
Requires-Dist: pandas>=1.3.0
|
32
|
+
Requires-Dist: requests>=2.25.0
|
31
33
|
Provides-Extra: postgresql
|
32
34
|
Requires-Dist: psycopg2-binary>=2.9.0; extra == "postgresql"
|
33
35
|
Provides-Extra: mysql
|
@@ -36,28 +38,24 @@ Provides-Extra: mariadb
|
|
36
38
|
Requires-Dist: mariadb>=1.1.0; extra == "mariadb"
|
37
39
|
Provides-Extra: sqlserver
|
38
40
|
Requires-Dist: pyodbc>=4.0.0; extra == "sqlserver"
|
41
|
+
Requires-Dist: pymssql>=2.3.0; extra == "sqlserver"
|
39
42
|
Provides-Extra: oracle
|
40
43
|
Requires-Dist: cx_Oracle>=8.3.0; extra == "oracle"
|
41
|
-
|
42
|
-
Requires-Dist: informixdb>=2.2.0; extra == "informix"
|
44
|
+
Requires-Dist: oracledb>=3.0.0; extra == "oracle"
|
43
45
|
Provides-Extra: supabase
|
44
46
|
Requires-Dist: supabase>=2.0.0; extra == "supabase"
|
45
|
-
Requires-Dist: postgrest-py>=0.
|
46
|
-
Requires-Dist: gotrue-py>=
|
47
|
+
Requires-Dist: postgrest-py>=0.10.0; extra == "supabase"
|
48
|
+
Requires-Dist: gotrue-py>=1.0.0; extra == "supabase"
|
47
49
|
Provides-Extra: sqlite
|
48
|
-
Provides-Extra: qdrant
|
49
|
-
Requires-Dist: qdrant-client>=1.7.0; extra == "qdrant"
|
50
50
|
Provides-Extra: all
|
51
51
|
Requires-Dist: psycopg2-binary>=2.9.0; extra == "all"
|
52
52
|
Requires-Dist: mysql-connector-python>=8.0.0; extra == "all"
|
53
53
|
Requires-Dist: mariadb>=1.1.0; extra == "all"
|
54
54
|
Requires-Dist: pyodbc>=4.0.0; extra == "all"
|
55
|
+
Requires-Dist: pymssql>=2.3.0; extra == "all"
|
55
56
|
Requires-Dist: cx_Oracle>=8.3.0; extra == "all"
|
56
|
-
Requires-Dist:
|
57
|
+
Requires-Dist: oracledb>=3.0.0; extra == "all"
|
57
58
|
Requires-Dist: supabase>=2.0.0; extra == "all"
|
58
|
-
Requires-Dist: postgrest-py>=0.16.0; extra == "all"
|
59
|
-
Requires-Dist: gotrue-py>=2.0.0; extra == "all"
|
60
|
-
Requires-Dist: qdrant-client>=1.7.0; extra == "all"
|
61
59
|
Provides-Extra: dev
|
62
60
|
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
63
61
|
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
@@ -65,6 +63,10 @@ Requires-Dist: black>=22.0.0; extra == "dev"
|
|
65
63
|
Requires-Dist: flake8>=5.0.0; extra == "dev"
|
66
64
|
Requires-Dist: mypy>=1.0.0; extra == "dev"
|
67
65
|
Requires-Dist: pre-commit>=3.0.0; extra == "dev"
|
66
|
+
Requires-Dist: build>=1.0.0; extra == "dev"
|
67
|
+
Requires-Dist: twine>=4.0.0; extra == "dev"
|
68
|
+
Requires-Dist: psutil>=5.8.0; extra == "dev"
|
69
|
+
Requires-Dist: docker>=6.0.0; extra == "dev"
|
68
70
|
Provides-Extra: test-postgresql
|
69
71
|
Requires-Dist: pytest>=7.0.0; extra == "test-postgresql"
|
70
72
|
Requires-Dist: psycopg2-binary>=2.9.0; extra == "test-postgresql"
|
@@ -1,13 +1,12 @@
|
|
1
1
|
thoth_dbmanager/ThothDbManager.py,sha256=xyPhB6_3Ao3fGb4LjgCe-MvVI_C-9UXxeazra2dhmkI,17846
|
2
|
-
thoth_dbmanager/__init__.py,sha256=
|
2
|
+
thoth_dbmanager/__init__.py,sha256=zvs3kqKA99s9RJN6JVWTm-8asMeLc1NG5mnEpJTfzNg,3190
|
3
3
|
thoth_dbmanager/documents.py,sha256=z-f7zo_CZHqoGM0qHT8-lSUx4NhnMNZTSajpoFtRxn4,5051
|
4
|
-
thoth_dbmanager/dynamic_imports.py,sha256=
|
4
|
+
thoth_dbmanager/dynamic_imports.py,sha256=nqMmxl2KeczAK-Bi5Fq92f3rPpPsTay-Bq553iHFbWI,7507
|
5
5
|
thoth_dbmanager/adapters/__init__.py,sha256=tKIMlo9-gbH_cqnqZJ9yw1zQZKUzsV4hljDUNzcoZXg,486
|
6
6
|
thoth_dbmanager/adapters/mariadb.py,sha256=LTsf0gORiwqZkd6WtKcOsYLHyDgysxdqNesBscbJwNs,5709
|
7
7
|
thoth_dbmanager/adapters/mysql.py,sha256=TrFbxoMMNWbmUcgkKQYOIfsstmMUmuLlGB7R4ZFEIYI,5698
|
8
8
|
thoth_dbmanager/adapters/oracle.py,sha256=JSrsgohjz5PbVc8nI188MZ4QGBQls4ieNmwWfAKA7II,21468
|
9
9
|
thoth_dbmanager/adapters/postgresql.py,sha256=qxdlxOV7Nvn8U4Lhat50w87Z2S8AzBfmLfEwKfz7dis,17299
|
10
|
-
thoth_dbmanager/adapters/qdrant.py,sha256=sL8ldUbAczENb01MmcrkJBKw0dieWPAG2aj97jznj3k,6557
|
11
10
|
thoth_dbmanager/adapters/sqlite.py,sha256=RTDszgnAtkE14LKFeoe9lBHgsqXqkmDk6jDCTmVpnoM,14659
|
12
11
|
thoth_dbmanager/adapters/sqlserver.py,sha256=V555kUH54Fb1Atow0BfvbSHmoSwGnrB_RJGn718VQSI,23880
|
13
12
|
thoth_dbmanager/adapters/supabase.py,sha256=bl2C6LpOpykPF3vIbdNRDk43aXLADzSk0wQuwTcEHZA,10348
|
@@ -30,12 +29,11 @@ thoth_dbmanager/plugins/mariadb.py,sha256=ElYa4Rexwrofcjcs0UQKan8fZpbU6-n9zghYR9
|
|
30
29
|
thoth_dbmanager/plugins/mysql.py,sha256=mbDsIDV2H_BWYANU4JHMsUkxLQICuGtjKTTPbig2Ngs,16546
|
31
30
|
thoth_dbmanager/plugins/oracle.py,sha256=k4Yxvz5MdsH3Sfty9lxbhr8igSnHvGbGujz3bLpNcHo,5230
|
32
31
|
thoth_dbmanager/plugins/postgresql.py,sha256=GF6k4K0t7-Y08THWJzS0eWJkrQ1e4GfoKIcanC0Z5Ng,5401
|
33
|
-
thoth_dbmanager/plugins/qdrant.py,sha256=XWmc4K6ILiwvB1BhyJBBtA7ohRzQmk1MiZ1N7S-YF78,1199
|
34
32
|
thoth_dbmanager/plugins/sqlite.py,sha256=esgJqDp2aSu4a32WnmynfFyY9JfW5W8VjNTkaA-hZhM,6402
|
35
33
|
thoth_dbmanager/plugins/sqlserver.py,sha256=mMb3F5FmSWV02FZwj-Ult-2TjuyeVA4Fl1iME1dbgLU,5289
|
36
34
|
thoth_dbmanager/plugins/supabase.py,sha256=mWlaGAdpywx4-pU4Ffpmn24ze8sg0sM5kc6bFDoeYRg,8645
|
37
|
-
thoth_dbmanager-0.4.
|
38
|
-
thoth_dbmanager-0.4.
|
39
|
-
thoth_dbmanager-0.4.
|
40
|
-
thoth_dbmanager-0.4.
|
41
|
-
thoth_dbmanager-0.4.
|
35
|
+
thoth_dbmanager-0.4.3.dist-info/licenses/LICENSE,sha256=81-BOzGgwtY1XdYfkwMQB87AkOGXI9OMq0kjNcZA4UE,1071
|
36
|
+
thoth_dbmanager-0.4.3.dist-info/METADATA,sha256=5cjJw_2qjHE_Ke7gukqF0WrRQLOJGT9PSSn9SegJOoQ,12259
|
37
|
+
thoth_dbmanager-0.4.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
38
|
+
thoth_dbmanager-0.4.3.dist-info/top_level.txt,sha256=b9ttxm9RUc0KUCASEKRx6FqoREYJ1-KZWSpNuaM0uQ4,16
|
39
|
+
thoth_dbmanager-0.4.3.dist-info/RECORD,,
|
@@ -1,189 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Qdrant adapter for Thoth SQL Database Manager.
|
3
|
-
"""
|
4
|
-
|
5
|
-
from typing import Any, Dict, List, Optional, Union
|
6
|
-
from ..core.interfaces import DbAdapter
|
7
|
-
|
8
|
-
|
9
|
-
class QdrantAdapter(DbAdapter):
|
10
|
-
"""
|
11
|
-
Qdrant vector database adapter implementation.
|
12
|
-
"""
|
13
|
-
|
14
|
-
def __init__(self, **kwargs):
|
15
|
-
"""Initialize Qdrant adapter with connection parameters."""
|
16
|
-
super().__init__()
|
17
|
-
self.host = kwargs.get('host', 'localhost')
|
18
|
-
self.port = kwargs.get('port', 6333)
|
19
|
-
self.api_key = kwargs.get('api_key')
|
20
|
-
self.collection_name = kwargs.get('collection_name', 'thoth_documents')
|
21
|
-
self._client = None
|
22
|
-
|
23
|
-
def connect(self) -> bool:
|
24
|
-
"""Establish connection to Qdrant."""
|
25
|
-
try:
|
26
|
-
# Import qdrant_client here to avoid dependency issues
|
27
|
-
from qdrant_client import QdrantClient
|
28
|
-
|
29
|
-
if self.api_key:
|
30
|
-
self._client = QdrantClient(
|
31
|
-
host=self.host,
|
32
|
-
port=self.port,
|
33
|
-
api_key=self.api_key
|
34
|
-
)
|
35
|
-
else:
|
36
|
-
self._client = QdrantClient(
|
37
|
-
host=self.host,
|
38
|
-
port=self.port
|
39
|
-
)
|
40
|
-
|
41
|
-
# Test connection
|
42
|
-
self._client.get_collections()
|
43
|
-
return True
|
44
|
-
except Exception as e:
|
45
|
-
print(f"Failed to connect to Qdrant: {e}")
|
46
|
-
return False
|
47
|
-
|
48
|
-
def disconnect(self) -> None:
|
49
|
-
"""Disconnect from Qdrant."""
|
50
|
-
if self._client:
|
51
|
-
self._client.close()
|
52
|
-
self._client = None
|
53
|
-
|
54
|
-
def execute_query(self, query: str, params: Optional[Dict] = None,
|
55
|
-
fetch: Union[str, int] = "all", timeout: int = 60) -> Any:
|
56
|
-
"""
|
57
|
-
Execute a query against Qdrant.
|
58
|
-
Note: Qdrant doesn't use SQL, so this adapts the interface.
|
59
|
-
"""
|
60
|
-
if not self._client:
|
61
|
-
raise RuntimeError("Not connected to Qdrant")
|
62
|
-
|
63
|
-
# This is a placeholder - adapt based on your specific needs
|
64
|
-
# Qdrant uses vector search, not SQL queries
|
65
|
-
return {"message": "Qdrant uses vector search, not SQL queries"}
|
66
|
-
|
67
|
-
def get_tables(self) -> List[Dict[str, str]]:
|
68
|
-
"""Get collections (equivalent to tables in Qdrant)."""
|
69
|
-
if not self._client:
|
70
|
-
raise RuntimeError("Not connected to Qdrant")
|
71
|
-
|
72
|
-
try:
|
73
|
-
collections = self._client.get_collections()
|
74
|
-
return [
|
75
|
-
{
|
76
|
-
"table_name": collection.name,
|
77
|
-
"table_type": "COLLECTION"
|
78
|
-
}
|
79
|
-
for collection in collections.collections
|
80
|
-
]
|
81
|
-
except Exception as e:
|
82
|
-
print(f"Error getting collections: {e}")
|
83
|
-
return []
|
84
|
-
|
85
|
-
def get_columns(self, table_name: str) -> List[Dict[str, Any]]:
|
86
|
-
"""Get collection info (equivalent to columns in Qdrant)."""
|
87
|
-
if not self._client:
|
88
|
-
raise RuntimeError("Not connected to Qdrant")
|
89
|
-
|
90
|
-
try:
|
91
|
-
collection_info = self._client.get_collection(table_name)
|
92
|
-
return [
|
93
|
-
{
|
94
|
-
"column_name": "id",
|
95
|
-
"data_type": "UUID",
|
96
|
-
"is_nullable": False
|
97
|
-
},
|
98
|
-
{
|
99
|
-
"column_name": "vector",
|
100
|
-
"data_type": f"VECTOR({collection_info.config.params.vectors.size})",
|
101
|
-
"is_nullable": False
|
102
|
-
},
|
103
|
-
{
|
104
|
-
"column_name": "payload",
|
105
|
-
"data_type": "JSON",
|
106
|
-
"is_nullable": True
|
107
|
-
}
|
108
|
-
]
|
109
|
-
except Exception as e:
|
110
|
-
print(f"Error getting collection info: {e}")
|
111
|
-
return []
|
112
|
-
|
113
|
-
def get_foreign_keys(self) -> List[Dict[str, str]]:
|
114
|
-
"""Get foreign keys (not applicable for Qdrant)."""
|
115
|
-
return []
|
116
|
-
|
117
|
-
def get_unique_values(self) -> Dict[str, Dict[str, List[str]]]:
|
118
|
-
"""Get unique values from collections."""
|
119
|
-
if not self._client:
|
120
|
-
raise RuntimeError("Not connected to Qdrant")
|
121
|
-
|
122
|
-
# This is a simplified implementation
|
123
|
-
# In practice, you'd need to scroll through points and extract unique payload values
|
124
|
-
return {}
|
125
|
-
|
126
|
-
def add_documentation(self, doc_type: str, content: Dict[str, Any]) -> str:
|
127
|
-
"""Add documentation to Qdrant collection."""
|
128
|
-
if not self._client:
|
129
|
-
raise RuntimeError("Not connected to Qdrant")
|
130
|
-
|
131
|
-
try:
|
132
|
-
from qdrant_client.models import PointStruct
|
133
|
-
import uuid
|
134
|
-
|
135
|
-
# Generate a unique ID for the document
|
136
|
-
doc_id = str(uuid.uuid4())
|
137
|
-
|
138
|
-
# Create a point with the documentation content
|
139
|
-
point = PointStruct(
|
140
|
-
id=doc_id,
|
141
|
-
vector=content.get('vector', [0.0] * 384), # Default vector size
|
142
|
-
payload={
|
143
|
-
"doc_type": doc_type,
|
144
|
-
"content": content
|
145
|
-
}
|
146
|
-
)
|
147
|
-
|
148
|
-
# Upsert the point
|
149
|
-
self._client.upsert(
|
150
|
-
collection_name=self.collection_name,
|
151
|
-
points=[point]
|
152
|
-
)
|
153
|
-
|
154
|
-
return doc_id
|
155
|
-
except Exception as e:
|
156
|
-
print(f"Error adding documentation: {e}")
|
157
|
-
raise
|
158
|
-
|
159
|
-
def delete_collection(self, collection_name: str) -> bool:
|
160
|
-
"""Delete a collection from Qdrant."""
|
161
|
-
if not self._client:
|
162
|
-
raise RuntimeError("Not connected to Qdrant")
|
163
|
-
|
164
|
-
try:
|
165
|
-
self._client.delete_collection(collection_name)
|
166
|
-
return True
|
167
|
-
except Exception as e:
|
168
|
-
print(f"Error deleting collection: {e}")
|
169
|
-
return False
|
170
|
-
|
171
|
-
def create_collection(self, collection_name: str, vector_size: int = 384) -> bool:
|
172
|
-
"""Create a new collection in Qdrant."""
|
173
|
-
if not self._client:
|
174
|
-
raise RuntimeError("Not connected to Qdrant")
|
175
|
-
|
176
|
-
try:
|
177
|
-
from qdrant_client.models import VectorParams, Distance
|
178
|
-
|
179
|
-
self._client.create_collection(
|
180
|
-
collection_name=collection_name,
|
181
|
-
vectors_config=VectorParams(
|
182
|
-
size=vector_size,
|
183
|
-
distance=Distance.COSINE
|
184
|
-
)
|
185
|
-
)
|
186
|
-
return True
|
187
|
-
except Exception as e:
|
188
|
-
print(f"Error creating collection: {e}")
|
189
|
-
return False
|
@@ -1,41 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Qdrant plugin for Thoth SQL Database Manager.
|
3
|
-
"""
|
4
|
-
|
5
|
-
from typing import List
|
6
|
-
from ..core.interfaces import DbPlugin
|
7
|
-
from ..adapters.qdrant import QdrantAdapter
|
8
|
-
|
9
|
-
|
10
|
-
class QdrantPlugin(DbPlugin):
|
11
|
-
"""Plugin for Qdrant vector database."""
|
12
|
-
|
13
|
-
plugin_name = "qdrant"
|
14
|
-
plugin_version = "1.0.0"
|
15
|
-
supported_db_types = ["qdrant"]
|
16
|
-
required_dependencies = ["qdrant-client"]
|
17
|
-
|
18
|
-
def create_adapter(self, **kwargs) -> QdrantAdapter:
|
19
|
-
"""Create and return a QdrantAdapter instance."""
|
20
|
-
return QdrantAdapter(**kwargs)
|
21
|
-
|
22
|
-
def validate_connection_params(self, **kwargs) -> bool:
|
23
|
-
"""Validate Qdrant connection parameters."""
|
24
|
-
required_params = ['host']
|
25
|
-
|
26
|
-
for param in required_params:
|
27
|
-
if param not in kwargs:
|
28
|
-
return False
|
29
|
-
|
30
|
-
# Validate host format
|
31
|
-
host = kwargs.get('host')
|
32
|
-
if not isinstance(host, str) or not host.strip():
|
33
|
-
return False
|
34
|
-
|
35
|
-
# Validate port if provided
|
36
|
-
port = kwargs.get('port')
|
37
|
-
if port is not None:
|
38
|
-
if not isinstance(port, int) or port <= 0 or port > 65535:
|
39
|
-
return False
|
40
|
-
|
41
|
-
return True
|
File without changes
|
File without changes
|
File without changes
|