singlestoredb 1.9.0__tar.gz → 1.11.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.
Potentially problematic release.
This version of singlestoredb might be problematic. Click here for more details.
- {singlestoredb-1.9.0/singlestoredb.egg-info → singlestoredb-1.11.0}/PKG-INFO +1 -1
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/setup.cfg +1 -1
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/__init__.py +1 -1
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/fusion/handler.py +0 -7
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/fusion/handlers/export.py +11 -7
- singlestoredb-1.11.0/singlestoredb/fusion/handlers/models.py +250 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/fusion/handlers/utils.py +5 -5
- singlestoredb-1.11.0/singlestoredb/magics/__init__.py +34 -0
- singlestoredb-1.11.0/singlestoredb/magics/run_personal.py +56 -0
- singlestoredb-1.11.0/singlestoredb/magics/run_shared.py +53 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/management/cluster.py +2 -1
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/management/files.py +92 -28
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/management/manager.py +3 -2
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/management/workspace.py +3 -2
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/connection.py +1 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/utils/events.py +16 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0/singlestoredb.egg-info}/PKG-INFO +1 -1
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb.egg-info/SOURCES.txt +4 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/LICENSE +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/README.md +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/accel.c +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/setup.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/ai/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/ai/embeddings.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/alchemy/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/apps/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/apps/_cloud_functions.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/apps/_config.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/apps/_connection_info.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/apps/_dashboards.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/apps/_process.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/apps/_stdout_supress.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/apps/_uvicorn_util.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/auth.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/config.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/connection.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/converters.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/exceptions.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/functions/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/functions/decorator.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/functions/dtypes.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/functions/ext/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/functions/ext/arrow.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/functions/ext/asgi.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/functions/ext/json.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/functions/ext/mmap.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/functions/ext/rowdat_1.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/functions/ext/utils.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/functions/signature.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/fusion/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/fusion/graphql.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/fusion/handlers/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/fusion/handlers/files.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/fusion/handlers/job.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/fusion/handlers/stage.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/fusion/handlers/workspace.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/fusion/registry.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/fusion/result.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/http/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/http/connection.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/management/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/management/billing_usage.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/management/export.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/management/job.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/management/organization.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/management/region.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/management/utils.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/_auth.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/charset.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/constants/CLIENT.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/constants/COMMAND.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/constants/CR.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/constants/ER.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/constants/EXTENDED_TYPE.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/constants/FIELD_TYPE.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/constants/FLAG.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/constants/SERVER_STATUS.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/constants/VECTOR_TYPE.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/constants/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/converters.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/cursors.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/err.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/optionfile.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/protocol.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/base.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/conftest.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/test_DictCursor.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/test_SSCursor.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/test_basic.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/test_connection.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/test_converters.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/test_cursor.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/test_err.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/test_issues.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/test_load_local.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/test_nextset.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/test_optionfile.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/thirdparty/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/capabilities.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/dbapi20.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/mysql/times.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/notebook/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/notebook/_objects.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/notebook/_portal.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/py.typed +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/pytest.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/empty.sql +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/ext_funcs/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/local_infile.csv +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test.ipynb +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test.sql +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test2.ipynb +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test2.sql +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test_basics.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test_config.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test_connection.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test_dbapi.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test_exceptions.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test_ext_func.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test_ext_func_data.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test_fusion.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test_http.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test_management.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test_plugin.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test_results.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test_types.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test_udf.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/test_xdict.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/tests/utils.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/types.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/utils/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/utils/config.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/utils/convert_rows.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/utils/debug.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/utils/dtypes.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/utils/mogrify.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/utils/results.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb/utils/xdict.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb.egg-info/dependency_links.txt +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb.egg-info/entry_points.txt +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb.egg-info/requires.txt +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/singlestoredb.egg-info/top_level.txt +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/sqlx/__init__.py +0 -0
- {singlestoredb-1.9.0 → singlestoredb-1.11.0}/sqlx/magic.py +0 -0
|
@@ -641,13 +641,6 @@ class SQLHandler(NodeVisitor):
|
|
|
641
641
|
DummySQLResult
|
|
642
642
|
|
|
643
643
|
"""
|
|
644
|
-
import warnings
|
|
645
|
-
warnings.warn(
|
|
646
|
-
'Fusion SQL is currently a preview feature. '
|
|
647
|
-
'Run `SHOW FUSION COMMANDS` to see all commands.',
|
|
648
|
-
RuntimeWarning,
|
|
649
|
-
)
|
|
650
|
-
|
|
651
644
|
type(self).compile()
|
|
652
645
|
self._handled = set()
|
|
653
646
|
try:
|
|
@@ -55,10 +55,10 @@ class CreateClusterIdentity(SQLHandler):
|
|
|
55
55
|
|
|
56
56
|
CREATE CLUSTER IDENTITY
|
|
57
57
|
CATALOG CONFIG '{
|
|
58
|
-
"
|
|
58
|
+
"catalog_type": "GLUE",
|
|
59
59
|
"table_format": "ICEBERG",
|
|
60
|
-
"
|
|
61
|
-
"
|
|
60
|
+
"catalog_id": "13983498723498",
|
|
61
|
+
"catalog_region": "us-east-1"
|
|
62
62
|
}'
|
|
63
63
|
LINK S3 CONFIG '{
|
|
64
64
|
"region": "us-east-1",
|
|
@@ -78,6 +78,8 @@ class CreateClusterIdentity(SQLHandler):
|
|
|
78
78
|
storage_config = json.loads(params['storage'].get('link_config', '{}') or '{}')
|
|
79
79
|
storage_creds = json.loads(params['storage'].get('link_creds', '{}') or '{}')
|
|
80
80
|
|
|
81
|
+
storage_config['provider'] = 'S3'
|
|
82
|
+
|
|
81
83
|
wsg = get_workspace_group({})
|
|
82
84
|
|
|
83
85
|
if wsg._manager is None:
|
|
@@ -145,12 +147,12 @@ class CreateExport(SQLHandler):
|
|
|
145
147
|
catalog and link configurations. The source table to export is
|
|
146
148
|
named "customer_data"::
|
|
147
149
|
|
|
148
|
-
START EXPORT FROM customer_data
|
|
150
|
+
START EXPORT FROM my_db.customer_data
|
|
149
151
|
CATALOG CONFIG '{
|
|
150
|
-
"
|
|
152
|
+
"catalog_type": "GLUE",
|
|
151
153
|
"table_format": "ICEBERG",
|
|
152
|
-
"
|
|
153
|
-
"
|
|
154
|
+
"catalog_id": "13983498723498",
|
|
155
|
+
"catalog_region": "us-east-1"
|
|
154
156
|
}'
|
|
155
157
|
LINK S3 CONFIG '{
|
|
156
158
|
"region": "us-east-1",
|
|
@@ -177,6 +179,8 @@ class CreateExport(SQLHandler):
|
|
|
177
179
|
storage_config = json.loads(params['storage'].get('link_config', '{}') or '{}')
|
|
178
180
|
storage_creds = json.loads(params['storage'].get('link_creds', '{}') or '{}')
|
|
179
181
|
|
|
182
|
+
storage_config['provider'] = 'S3'
|
|
183
|
+
|
|
180
184
|
wsg = get_workspace_group({})
|
|
181
185
|
|
|
182
186
|
if from_database is None:
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
import os
|
|
3
|
+
from typing import Any
|
|
4
|
+
from typing import Dict
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
7
|
+
from ..handler import SQLHandler
|
|
8
|
+
from ..result import FusionSQLResult
|
|
9
|
+
from .files import ShowFilesHandler
|
|
10
|
+
from .utils import get_file_space
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ShowModelsHandler(ShowFilesHandler):
|
|
14
|
+
"""
|
|
15
|
+
SHOW MODELS
|
|
16
|
+
[ at_path ] [ <like> ]
|
|
17
|
+
[ <order-by> ]
|
|
18
|
+
[ <limit> ] [ recursive ] [ extended ];
|
|
19
|
+
|
|
20
|
+
# File path to list
|
|
21
|
+
at_path = AT '<path>'
|
|
22
|
+
|
|
23
|
+
# Should the listing be recursive?
|
|
24
|
+
recursive = RECURSIVE
|
|
25
|
+
|
|
26
|
+
# Should extended attributes be shown?
|
|
27
|
+
extended = EXTENDED
|
|
28
|
+
|
|
29
|
+
Description
|
|
30
|
+
-----------
|
|
31
|
+
Displays the list of models in models space.
|
|
32
|
+
|
|
33
|
+
Arguments
|
|
34
|
+
---------
|
|
35
|
+
* ``<path>``: A path in the models space.
|
|
36
|
+
* ``<pattern>``: A pattern similar to SQL LIKE clause.
|
|
37
|
+
Uses ``%`` as the wildcard character.
|
|
38
|
+
|
|
39
|
+
Remarks
|
|
40
|
+
-------
|
|
41
|
+
* Use the ``LIKE`` clause to specify a pattern and return only the
|
|
42
|
+
files that match the specified pattern.
|
|
43
|
+
* The ``LIMIT`` clause limits the number of results to the
|
|
44
|
+
specified number.
|
|
45
|
+
* Use the ``ORDER BY`` clause to sort the results by the specified
|
|
46
|
+
key. By default, the results are sorted in the ascending order.
|
|
47
|
+
* The ``AT PATH`` clause specifies the path in the models
|
|
48
|
+
space to list the files from.
|
|
49
|
+
* To return more information about the files, use the ``EXTENDED``
|
|
50
|
+
clause.
|
|
51
|
+
|
|
52
|
+
Examples
|
|
53
|
+
--------
|
|
54
|
+
The following command lists the models::
|
|
55
|
+
|
|
56
|
+
SHOW MODELS;
|
|
57
|
+
|
|
58
|
+
The following command lists the models with additional information::
|
|
59
|
+
|
|
60
|
+
SHOW MODELS EXTENDED;
|
|
61
|
+
|
|
62
|
+
See Also
|
|
63
|
+
--------
|
|
64
|
+
* ``UPLOAD MODEL model_name FROM path``
|
|
65
|
+
* ``DOWNLOAD MODEL model_name``
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
""" # noqa: E501
|
|
69
|
+
|
|
70
|
+
def run(self, params: Dict[str, Any]) -> Optional[FusionSQLResult]:
|
|
71
|
+
params['file_location'] = 'MODELS'
|
|
72
|
+
|
|
73
|
+
return super().run(params)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
ShowModelsHandler.register(overwrite=True)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class UploadModelHandler(SQLHandler):
|
|
80
|
+
"""
|
|
81
|
+
UPLOAD MODEL model_name
|
|
82
|
+
FROM local_path [ overwrite ];
|
|
83
|
+
|
|
84
|
+
# Model Name
|
|
85
|
+
model_name = '<model-name>'
|
|
86
|
+
|
|
87
|
+
# Path to local file or directory
|
|
88
|
+
local_path = '<local-path>'
|
|
89
|
+
|
|
90
|
+
# Should an existing file be overwritten?
|
|
91
|
+
overwrite = OVERWRITE
|
|
92
|
+
|
|
93
|
+
Description
|
|
94
|
+
-----------
|
|
95
|
+
Uploads a file or folder to models space.
|
|
96
|
+
|
|
97
|
+
Arguments
|
|
98
|
+
---------
|
|
99
|
+
* ``<model-name>``: Model name.
|
|
100
|
+
* ``<local-path>``: The path to the file or folder to upload in the local
|
|
101
|
+
directory.
|
|
102
|
+
|
|
103
|
+
Remarks
|
|
104
|
+
-------
|
|
105
|
+
* If the ``OVERWRITE`` clause is specified, any existing file at the
|
|
106
|
+
specified path in the models space is overwritten.
|
|
107
|
+
|
|
108
|
+
Examples
|
|
109
|
+
--------
|
|
110
|
+
The following command uploads a file to models space and overwrite any
|
|
111
|
+
existing files at the specified path::
|
|
112
|
+
|
|
113
|
+
UPLOAD MODEL model_name
|
|
114
|
+
FROM 'llama3/' OVERWRITE;
|
|
115
|
+
|
|
116
|
+
See Also
|
|
117
|
+
--------
|
|
118
|
+
* ``DOWNLOAD MODEL model_name``
|
|
119
|
+
|
|
120
|
+
""" # noqa: E501
|
|
121
|
+
|
|
122
|
+
def run(self, params: Dict[str, Any]) -> Optional[FusionSQLResult]:
|
|
123
|
+
params['file_location'] = 'MODELS'
|
|
124
|
+
|
|
125
|
+
model_name = params['model_name']
|
|
126
|
+
local_path = params['local_path']
|
|
127
|
+
|
|
128
|
+
file_space = get_file_space(params)
|
|
129
|
+
|
|
130
|
+
if os.path.isdir(local_path):
|
|
131
|
+
file_space.upload_folder(
|
|
132
|
+
local_path=local_path,
|
|
133
|
+
path=os.path.join(model_name, ''),
|
|
134
|
+
overwrite=params['overwrite'],
|
|
135
|
+
)
|
|
136
|
+
else:
|
|
137
|
+
file_space.upload_file(
|
|
138
|
+
local_path=local_path,
|
|
139
|
+
path=os.path.join(model_name, local_path),
|
|
140
|
+
overwrite=params['overwrite'],
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
return None
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
UploadModelHandler.register(overwrite=True)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class DownloadModelHandler(SQLHandler):
|
|
150
|
+
"""
|
|
151
|
+
DOWNLOAD MODEL model_name
|
|
152
|
+
[ local_path ]
|
|
153
|
+
[ overwrite ];
|
|
154
|
+
|
|
155
|
+
# Model Name
|
|
156
|
+
model_name = '<model-name>'
|
|
157
|
+
|
|
158
|
+
# Path to local directory
|
|
159
|
+
local_path = TO '<local-path>'
|
|
160
|
+
|
|
161
|
+
# Should an existing directory be overwritten?
|
|
162
|
+
overwrite = OVERWRITE
|
|
163
|
+
|
|
164
|
+
Description
|
|
165
|
+
-----------
|
|
166
|
+
Download a model from models space.
|
|
167
|
+
|
|
168
|
+
Arguments
|
|
169
|
+
---------
|
|
170
|
+
* ``<model-name>``: Model name to download in models space.
|
|
171
|
+
* ``<local-path>``: Specifies the path in the local directory
|
|
172
|
+
where the model is downloaded.
|
|
173
|
+
|
|
174
|
+
Remarks
|
|
175
|
+
-------
|
|
176
|
+
* If the ``OVERWRITE`` clause is specified, any existing file or folder at
|
|
177
|
+
the download location is overwritten.
|
|
178
|
+
* If ``<local-path>`` is not specified, the model is downloaded to the current location.
|
|
179
|
+
|
|
180
|
+
Examples
|
|
181
|
+
--------
|
|
182
|
+
The following command displays the contents of the file on the
|
|
183
|
+
standard output::
|
|
184
|
+
|
|
185
|
+
DOWNLOAD MODEL llama3;
|
|
186
|
+
|
|
187
|
+
The following command downloads a model to a specific location and
|
|
188
|
+
overwrites any existing models folder with the name ``local_llama3`` on the local storage::
|
|
189
|
+
|
|
190
|
+
DOWNLOAD MODEL llama3
|
|
191
|
+
TO 'local_llama3' OVERWRITE;
|
|
192
|
+
|
|
193
|
+
See Also
|
|
194
|
+
--------
|
|
195
|
+
* ``UPLOAD MODEL model_name FROM local_path``
|
|
196
|
+
|
|
197
|
+
""" # noqa: E501
|
|
198
|
+
|
|
199
|
+
def run(self, params: Dict[str, Any]) -> Optional[FusionSQLResult]:
|
|
200
|
+
params['file_location'] = 'MODELS'
|
|
201
|
+
|
|
202
|
+
file_space = get_file_space(params)
|
|
203
|
+
|
|
204
|
+
model_name = params['model_name']
|
|
205
|
+
file_space.download_folder(
|
|
206
|
+
path=os.path.join(model_name, ''),
|
|
207
|
+
local_path=params['local_path'] or model_name,
|
|
208
|
+
overwrite=params['overwrite'],
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
return None
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
DownloadModelHandler.register(overwrite=True)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
class DropModelsHandler(SQLHandler):
|
|
218
|
+
"""
|
|
219
|
+
DROP MODEL model_name;
|
|
220
|
+
|
|
221
|
+
# Model Name
|
|
222
|
+
model_name = '<model-name>'
|
|
223
|
+
|
|
224
|
+
Description
|
|
225
|
+
-----------
|
|
226
|
+
Deletes a model from models space.
|
|
227
|
+
|
|
228
|
+
Arguments
|
|
229
|
+
---------
|
|
230
|
+
* ``<model-name>``: Model name to delete in models space.
|
|
231
|
+
|
|
232
|
+
Example
|
|
233
|
+
--------
|
|
234
|
+
The following commands deletes a model from a model space::
|
|
235
|
+
|
|
236
|
+
DROP MODEL llama3;
|
|
237
|
+
|
|
238
|
+
""" # noqa: E501
|
|
239
|
+
|
|
240
|
+
def run(self, params: Dict[str, Any]) -> Optional[FusionSQLResult]:
|
|
241
|
+
params['file_location'] = 'MODELS'
|
|
242
|
+
path = os.path.join(params['model_name'], '')
|
|
243
|
+
|
|
244
|
+
file_space = get_file_space(params)
|
|
245
|
+
file_space.removedirs(path=path)
|
|
246
|
+
|
|
247
|
+
return None
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
DropModelsHandler.register(overwrite=True)
|
|
@@ -11,6 +11,7 @@ from ...management import manage_workspaces
|
|
|
11
11
|
from ...management.files import FilesManager
|
|
12
12
|
from ...management.files import FileSpace
|
|
13
13
|
from ...management.files import manage_files
|
|
14
|
+
from ...management.files import MODELS_SPACE
|
|
14
15
|
from ...management.files import PERSONAL_SPACE
|
|
15
16
|
from ...management.files import SHARED_SPACE
|
|
16
17
|
from ...management.workspace import StarterWorkspace
|
|
@@ -296,15 +297,14 @@ def get_file_space(params: Dict[str, Any]) -> FileSpace:
|
|
|
296
297
|
file_location = params.get('file_location')
|
|
297
298
|
if file_location:
|
|
298
299
|
file_location_lower_case = file_location.lower()
|
|
299
|
-
if (
|
|
300
|
-
file_location_lower_case != PERSONAL_SPACE and
|
|
301
|
-
file_location_lower_case != SHARED_SPACE
|
|
302
|
-
):
|
|
303
|
-
raise ValueError(f'invalid file location: {file_location}')
|
|
304
300
|
|
|
305
301
|
if file_location_lower_case == PERSONAL_SPACE:
|
|
306
302
|
return manager.personal_space
|
|
307
303
|
elif file_location_lower_case == SHARED_SPACE:
|
|
308
304
|
return manager.shared_space
|
|
305
|
+
elif file_location_lower_case == MODELS_SPACE:
|
|
306
|
+
return manager.models_space
|
|
307
|
+
else:
|
|
308
|
+
raise ValueError(f'invalid file location: {file_location}')
|
|
309
309
|
|
|
310
310
|
raise KeyError('no file space was specified')
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from IPython.core.interactiveshell import InteractiveShell
|
|
2
|
+
|
|
3
|
+
from .run_personal import RunPersonalMagic
|
|
4
|
+
from .run_shared import RunSharedMagic
|
|
5
|
+
|
|
6
|
+
# In order to actually use these magics, we must register them with a
|
|
7
|
+
# running IPython.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def load_ipython_extension(ip: InteractiveShell) -> None:
|
|
11
|
+
"""
|
|
12
|
+
Any module file that define a function named `load_ipython_extension`
|
|
13
|
+
can be loaded via `%load_ext module.path` or be configured to be
|
|
14
|
+
autoloaded by IPython at startup time.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
# Load jupysql extension
|
|
18
|
+
# This is necessary for jupysql to initialize internal state
|
|
19
|
+
# required to render messages
|
|
20
|
+
assert ip.extension_manager is not None
|
|
21
|
+
result = ip.extension_manager.load_extension('sql')
|
|
22
|
+
if result == 'no load function':
|
|
23
|
+
raise RuntimeError('Could not load sql extension. Is jupysql installed?')
|
|
24
|
+
|
|
25
|
+
# Check if %run magic command is defined
|
|
26
|
+
if ip.find_line_magic('run') is None:
|
|
27
|
+
raise RuntimeError(
|
|
28
|
+
'%run magic command is not defined. '
|
|
29
|
+
'Is it available in your IPython environment?',
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# Register run_personal and run_shared
|
|
33
|
+
ip.register_magics(RunPersonalMagic(ip))
|
|
34
|
+
ip.register_magics(RunSharedMagic(ip))
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import tempfile
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from IPython.core.interactiveshell import InteractiveShell
|
|
6
|
+
from IPython.core.magic import line_magic
|
|
7
|
+
from IPython.core.magic import Magics
|
|
8
|
+
from IPython.core.magic import magics_class
|
|
9
|
+
from IPython.core.magic import needs_local_scope
|
|
10
|
+
from IPython.core.magic import no_var_expand
|
|
11
|
+
from jinja2 import Template
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@magics_class
|
|
15
|
+
class RunPersonalMagic(Magics):
|
|
16
|
+
def __init__(self, shell: InteractiveShell):
|
|
17
|
+
Magics.__init__(self, shell=shell)
|
|
18
|
+
|
|
19
|
+
@no_var_expand
|
|
20
|
+
@needs_local_scope
|
|
21
|
+
@line_magic('run_personal')
|
|
22
|
+
def run_personal(self, line: str, local_ns: Any = None) -> Any:
|
|
23
|
+
"""
|
|
24
|
+
Downloads a personal file using the %sql magic and then runs it using %run.
|
|
25
|
+
|
|
26
|
+
Examples::
|
|
27
|
+
|
|
28
|
+
# Line usage
|
|
29
|
+
|
|
30
|
+
%run_personal personal_file.ipynb
|
|
31
|
+
|
|
32
|
+
%run_personal {{ sample_notebook_name }}
|
|
33
|
+
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
template = Template(line.strip())
|
|
37
|
+
personal_file = template.render(local_ns)
|
|
38
|
+
if not personal_file:
|
|
39
|
+
raise ValueError('No personal file specified.')
|
|
40
|
+
if (personal_file.startswith("'") and personal_file.endswith("'")) or \
|
|
41
|
+
(personal_file.startswith('"') and personal_file.endswith('"')):
|
|
42
|
+
personal_file = personal_file[1:-1]
|
|
43
|
+
if not personal_file:
|
|
44
|
+
raise ValueError('No personal file specified.')
|
|
45
|
+
|
|
46
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
|
47
|
+
temp_file_path = os.path.join(temp_dir, personal_file)
|
|
48
|
+
sql_command = (
|
|
49
|
+
f"DOWNLOAD PERSONAL FILE '{personal_file}' "
|
|
50
|
+
f"TO '{temp_file_path}'"
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
# Execute the SQL command
|
|
54
|
+
self.shell.run_line_magic('sql', sql_command)
|
|
55
|
+
# Run the downloaded file
|
|
56
|
+
self.shell.run_line_magic('run', f'"{temp_file_path}"')
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import tempfile
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from IPython.core.interactiveshell import InteractiveShell
|
|
6
|
+
from IPython.core.magic import line_magic
|
|
7
|
+
from IPython.core.magic import Magics
|
|
8
|
+
from IPython.core.magic import magics_class
|
|
9
|
+
from IPython.core.magic import needs_local_scope
|
|
10
|
+
from IPython.core.magic import no_var_expand
|
|
11
|
+
from jinja2 import Template
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@magics_class
|
|
15
|
+
class RunSharedMagic(Magics):
|
|
16
|
+
def __init__(self, shell: InteractiveShell):
|
|
17
|
+
Magics.__init__(self, shell=shell)
|
|
18
|
+
|
|
19
|
+
@no_var_expand
|
|
20
|
+
@needs_local_scope
|
|
21
|
+
@line_magic('run_shared')
|
|
22
|
+
def run_shared(self, line: str, local_ns: Any = None) -> Any:
|
|
23
|
+
"""
|
|
24
|
+
Downloads a shared file using the %sql magic and then runs it using %run.
|
|
25
|
+
|
|
26
|
+
Examples::
|
|
27
|
+
|
|
28
|
+
# Line usage
|
|
29
|
+
|
|
30
|
+
%run_shared shared_file.ipynb
|
|
31
|
+
|
|
32
|
+
%run_shared {{ sample_notebook_name }}
|
|
33
|
+
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
template = Template(line.strip())
|
|
37
|
+
shared_file = template.render(local_ns)
|
|
38
|
+
if not shared_file:
|
|
39
|
+
raise ValueError('No shared file specified.')
|
|
40
|
+
if (shared_file.startswith("'") and shared_file.endswith("'")) or \
|
|
41
|
+
(shared_file.startswith('"') and shared_file.endswith('"')):
|
|
42
|
+
shared_file = shared_file[1:-1]
|
|
43
|
+
if not shared_file:
|
|
44
|
+
raise ValueError('No personal file specified.')
|
|
45
|
+
|
|
46
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
|
47
|
+
temp_file_path = os.path.join(temp_dir, shared_file)
|
|
48
|
+
sql_command = f"DOWNLOAD SHARED FILE '{shared_file}' TO '{temp_file_path}'"
|
|
49
|
+
|
|
50
|
+
# Execute the SQL command
|
|
51
|
+
self.shell.run_line_magic('sql', sql_command)
|
|
52
|
+
# Run the downloaded file
|
|
53
|
+
self.shell.run_line_magic('run', f'"{temp_file_path}"')
|
|
@@ -333,7 +333,8 @@ class ClusterManager(Manager):
|
|
|
333
333
|
default_version = 'v0beta'
|
|
334
334
|
|
|
335
335
|
#: Base URL if none is specified.
|
|
336
|
-
default_base_url = config.get_option('management.base_url')
|
|
336
|
+
default_base_url = config.get_option('management.base_url') \
|
|
337
|
+
or 'https://api.singlestore.com'
|
|
337
338
|
|
|
338
339
|
#: Object type
|
|
339
340
|
obj_type = 'cluster'
|