singlestoredb 1.16.1__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.
Files changed (183) hide show
  1. singlestoredb/__init__.py +75 -0
  2. singlestoredb/ai/__init__.py +2 -0
  3. singlestoredb/ai/chat.py +139 -0
  4. singlestoredb/ai/embeddings.py +128 -0
  5. singlestoredb/alchemy/__init__.py +90 -0
  6. singlestoredb/apps/__init__.py +3 -0
  7. singlestoredb/apps/_cloud_functions.py +90 -0
  8. singlestoredb/apps/_config.py +72 -0
  9. singlestoredb/apps/_connection_info.py +18 -0
  10. singlestoredb/apps/_dashboards.py +47 -0
  11. singlestoredb/apps/_process.py +32 -0
  12. singlestoredb/apps/_python_udfs.py +100 -0
  13. singlestoredb/apps/_stdout_supress.py +30 -0
  14. singlestoredb/apps/_uvicorn_util.py +36 -0
  15. singlestoredb/auth.py +245 -0
  16. singlestoredb/config.py +484 -0
  17. singlestoredb/connection.py +1487 -0
  18. singlestoredb/converters.py +950 -0
  19. singlestoredb/docstring/__init__.py +33 -0
  20. singlestoredb/docstring/attrdoc.py +126 -0
  21. singlestoredb/docstring/common.py +230 -0
  22. singlestoredb/docstring/epydoc.py +267 -0
  23. singlestoredb/docstring/google.py +412 -0
  24. singlestoredb/docstring/numpydoc.py +562 -0
  25. singlestoredb/docstring/parser.py +100 -0
  26. singlestoredb/docstring/py.typed +1 -0
  27. singlestoredb/docstring/rest.py +256 -0
  28. singlestoredb/docstring/tests/__init__.py +1 -0
  29. singlestoredb/docstring/tests/_pydoctor.py +21 -0
  30. singlestoredb/docstring/tests/test_epydoc.py +729 -0
  31. singlestoredb/docstring/tests/test_google.py +1007 -0
  32. singlestoredb/docstring/tests/test_numpydoc.py +1100 -0
  33. singlestoredb/docstring/tests/test_parse_from_object.py +109 -0
  34. singlestoredb/docstring/tests/test_parser.py +248 -0
  35. singlestoredb/docstring/tests/test_rest.py +547 -0
  36. singlestoredb/docstring/tests/test_util.py +70 -0
  37. singlestoredb/docstring/util.py +141 -0
  38. singlestoredb/exceptions.py +120 -0
  39. singlestoredb/functions/__init__.py +16 -0
  40. singlestoredb/functions/decorator.py +201 -0
  41. singlestoredb/functions/dtypes.py +1793 -0
  42. singlestoredb/functions/ext/__init__.py +1 -0
  43. singlestoredb/functions/ext/arrow.py +375 -0
  44. singlestoredb/functions/ext/asgi.py +2133 -0
  45. singlestoredb/functions/ext/json.py +420 -0
  46. singlestoredb/functions/ext/mmap.py +413 -0
  47. singlestoredb/functions/ext/rowdat_1.py +724 -0
  48. singlestoredb/functions/ext/timer.py +89 -0
  49. singlestoredb/functions/ext/utils.py +218 -0
  50. singlestoredb/functions/signature.py +1578 -0
  51. singlestoredb/functions/typing/__init__.py +41 -0
  52. singlestoredb/functions/typing/numpy.py +20 -0
  53. singlestoredb/functions/typing/pandas.py +2 -0
  54. singlestoredb/functions/typing/polars.py +2 -0
  55. singlestoredb/functions/typing/pyarrow.py +2 -0
  56. singlestoredb/functions/utils.py +421 -0
  57. singlestoredb/fusion/__init__.py +11 -0
  58. singlestoredb/fusion/graphql.py +213 -0
  59. singlestoredb/fusion/handler.py +916 -0
  60. singlestoredb/fusion/handlers/__init__.py +0 -0
  61. singlestoredb/fusion/handlers/export.py +525 -0
  62. singlestoredb/fusion/handlers/files.py +690 -0
  63. singlestoredb/fusion/handlers/job.py +660 -0
  64. singlestoredb/fusion/handlers/models.py +250 -0
  65. singlestoredb/fusion/handlers/stage.py +502 -0
  66. singlestoredb/fusion/handlers/utils.py +324 -0
  67. singlestoredb/fusion/handlers/workspace.py +956 -0
  68. singlestoredb/fusion/registry.py +249 -0
  69. singlestoredb/fusion/result.py +399 -0
  70. singlestoredb/http/__init__.py +27 -0
  71. singlestoredb/http/connection.py +1267 -0
  72. singlestoredb/magics/__init__.py +34 -0
  73. singlestoredb/magics/run_personal.py +137 -0
  74. singlestoredb/magics/run_shared.py +134 -0
  75. singlestoredb/management/__init__.py +9 -0
  76. singlestoredb/management/billing_usage.py +148 -0
  77. singlestoredb/management/cluster.py +462 -0
  78. singlestoredb/management/export.py +295 -0
  79. singlestoredb/management/files.py +1102 -0
  80. singlestoredb/management/inference_api.py +105 -0
  81. singlestoredb/management/job.py +887 -0
  82. singlestoredb/management/manager.py +373 -0
  83. singlestoredb/management/organization.py +226 -0
  84. singlestoredb/management/region.py +169 -0
  85. singlestoredb/management/utils.py +423 -0
  86. singlestoredb/management/workspace.py +1927 -0
  87. singlestoredb/mysql/__init__.py +177 -0
  88. singlestoredb/mysql/_auth.py +298 -0
  89. singlestoredb/mysql/charset.py +214 -0
  90. singlestoredb/mysql/connection.py +2032 -0
  91. singlestoredb/mysql/constants/CLIENT.py +38 -0
  92. singlestoredb/mysql/constants/COMMAND.py +32 -0
  93. singlestoredb/mysql/constants/CR.py +78 -0
  94. singlestoredb/mysql/constants/ER.py +474 -0
  95. singlestoredb/mysql/constants/EXTENDED_TYPE.py +3 -0
  96. singlestoredb/mysql/constants/FIELD_TYPE.py +48 -0
  97. singlestoredb/mysql/constants/FLAG.py +15 -0
  98. singlestoredb/mysql/constants/SERVER_STATUS.py +10 -0
  99. singlestoredb/mysql/constants/VECTOR_TYPE.py +6 -0
  100. singlestoredb/mysql/constants/__init__.py +0 -0
  101. singlestoredb/mysql/converters.py +271 -0
  102. singlestoredb/mysql/cursors.py +896 -0
  103. singlestoredb/mysql/err.py +92 -0
  104. singlestoredb/mysql/optionfile.py +20 -0
  105. singlestoredb/mysql/protocol.py +450 -0
  106. singlestoredb/mysql/tests/__init__.py +19 -0
  107. singlestoredb/mysql/tests/base.py +126 -0
  108. singlestoredb/mysql/tests/conftest.py +37 -0
  109. singlestoredb/mysql/tests/test_DictCursor.py +132 -0
  110. singlestoredb/mysql/tests/test_SSCursor.py +141 -0
  111. singlestoredb/mysql/tests/test_basic.py +452 -0
  112. singlestoredb/mysql/tests/test_connection.py +851 -0
  113. singlestoredb/mysql/tests/test_converters.py +58 -0
  114. singlestoredb/mysql/tests/test_cursor.py +141 -0
  115. singlestoredb/mysql/tests/test_err.py +16 -0
  116. singlestoredb/mysql/tests/test_issues.py +514 -0
  117. singlestoredb/mysql/tests/test_load_local.py +75 -0
  118. singlestoredb/mysql/tests/test_nextset.py +88 -0
  119. singlestoredb/mysql/tests/test_optionfile.py +27 -0
  120. singlestoredb/mysql/tests/thirdparty/__init__.py +6 -0
  121. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/__init__.py +9 -0
  122. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/capabilities.py +323 -0
  123. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/dbapi20.py +865 -0
  124. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py +110 -0
  125. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py +224 -0
  126. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py +101 -0
  127. singlestoredb/mysql/times.py +23 -0
  128. singlestoredb/notebook/__init__.py +16 -0
  129. singlestoredb/notebook/_objects.py +213 -0
  130. singlestoredb/notebook/_portal.py +352 -0
  131. singlestoredb/py.typed +0 -0
  132. singlestoredb/pytest.py +352 -0
  133. singlestoredb/server/__init__.py +0 -0
  134. singlestoredb/server/docker.py +452 -0
  135. singlestoredb/server/free_tier.py +267 -0
  136. singlestoredb/tests/__init__.py +0 -0
  137. singlestoredb/tests/alltypes.sql +307 -0
  138. singlestoredb/tests/alltypes_no_nulls.sql +208 -0
  139. singlestoredb/tests/empty.sql +0 -0
  140. singlestoredb/tests/ext_funcs/__init__.py +702 -0
  141. singlestoredb/tests/local_infile.csv +3 -0
  142. singlestoredb/tests/test.ipynb +18 -0
  143. singlestoredb/tests/test.sql +680 -0
  144. singlestoredb/tests/test2.ipynb +18 -0
  145. singlestoredb/tests/test2.sql +1 -0
  146. singlestoredb/tests/test_basics.py +1332 -0
  147. singlestoredb/tests/test_config.py +318 -0
  148. singlestoredb/tests/test_connection.py +3103 -0
  149. singlestoredb/tests/test_dbapi.py +27 -0
  150. singlestoredb/tests/test_exceptions.py +45 -0
  151. singlestoredb/tests/test_ext_func.py +1472 -0
  152. singlestoredb/tests/test_ext_func_data.py +1101 -0
  153. singlestoredb/tests/test_fusion.py +1527 -0
  154. singlestoredb/tests/test_http.py +288 -0
  155. singlestoredb/tests/test_management.py +1599 -0
  156. singlestoredb/tests/test_plugin.py +33 -0
  157. singlestoredb/tests/test_results.py +171 -0
  158. singlestoredb/tests/test_types.py +132 -0
  159. singlestoredb/tests/test_udf.py +737 -0
  160. singlestoredb/tests/test_udf_returns.py +459 -0
  161. singlestoredb/tests/test_vectorstore.py +51 -0
  162. singlestoredb/tests/test_xdict.py +333 -0
  163. singlestoredb/tests/utils.py +141 -0
  164. singlestoredb/types.py +373 -0
  165. singlestoredb/utils/__init__.py +0 -0
  166. singlestoredb/utils/config.py +950 -0
  167. singlestoredb/utils/convert_rows.py +69 -0
  168. singlestoredb/utils/debug.py +13 -0
  169. singlestoredb/utils/dtypes.py +205 -0
  170. singlestoredb/utils/events.py +65 -0
  171. singlestoredb/utils/mogrify.py +151 -0
  172. singlestoredb/utils/results.py +585 -0
  173. singlestoredb/utils/xdict.py +425 -0
  174. singlestoredb/vectorstore.py +192 -0
  175. singlestoredb/warnings.py +5 -0
  176. singlestoredb-1.16.1.dist-info/METADATA +165 -0
  177. singlestoredb-1.16.1.dist-info/RECORD +183 -0
  178. singlestoredb-1.16.1.dist-info/WHEEL +5 -0
  179. singlestoredb-1.16.1.dist-info/entry_points.txt +2 -0
  180. singlestoredb-1.16.1.dist-info/licenses/LICENSE +201 -0
  181. singlestoredb-1.16.1.dist-info/top_level.txt +3 -0
  182. sqlx/__init__.py +4 -0
  183. sqlx/magic.py +113 -0
@@ -0,0 +1,213 @@
1
+ import itertools
2
+ import os
3
+ from typing import Any
4
+ from typing import Callable
5
+ from typing import Dict
6
+ from typing import List
7
+ from typing import Optional
8
+ from typing import Tuple
9
+ from typing import Union
10
+
11
+ import requests
12
+
13
+ from . import result
14
+ from .result import FusionSQLResult
15
+
16
+
17
+ API_URL = 'https://backend.singlestore.com/public'
18
+
19
+
20
+ def pass_through(x: Any) -> Any:
21
+ """Pass a value through."""
22
+ return x
23
+
24
+
25
+ def find_path(d: Dict[str, Any], path: str) -> Tuple[bool, Any]:
26
+ """
27
+ Find key path in a dictionary.
28
+
29
+ Parameters
30
+ ----------
31
+ d : Dict[str, Any]
32
+ Dictionary to search
33
+ path : str
34
+ Period-delimited string indicating nested keys
35
+
36
+ Returns
37
+ -------
38
+ (bool, Any) - bool indicating whether or not the path was found
39
+ and the result itself
40
+
41
+ """
42
+ curr = d
43
+ keys = path.split('.')
44
+ for i, k in enumerate(keys):
45
+ if k in curr:
46
+ curr = curr[k]
47
+ if not isinstance(curr, dict):
48
+ break
49
+ else:
50
+ return False, None
51
+ if (i + 1) == len(keys):
52
+ return True, curr
53
+ return False, None
54
+
55
+
56
+ class GraphQueryField(object):
57
+ """
58
+ Field in a GraphQuery result.
59
+
60
+ Parameters
61
+ ----------
62
+ path : str
63
+ Period-delimited path to the result
64
+ dtype : int, optional
65
+ MySQL data type of the result, defaults to string
66
+ converter : function, optional
67
+ Convert for data value
68
+
69
+ """
70
+
71
+ _sort_index_count = itertools.count()
72
+
73
+ def __init__(
74
+ self,
75
+ path: str,
76
+ dtype: int = result.STRING,
77
+ include: Union[str, List[str]] = '',
78
+ converter: Optional[Callable[[Any], Any]] = pass_through,
79
+ ) -> None:
80
+ self.path = path
81
+ self.dtype = dtype
82
+ self.include = [include] if isinstance(include, str) else include
83
+ self.include = [x for x in self.include if x]
84
+ self.converter = converter
85
+ self._sort_index = next(type(self)._sort_index_count)
86
+
87
+ def get_path(self, value: Any) -> Tuple[bool, Any]:
88
+ """
89
+ Retrieve the field path in the given object.
90
+
91
+ Parameters
92
+ ----------
93
+ value : Any
94
+ Object parsed from nested dictionary object
95
+
96
+ Returns
97
+ -------
98
+ (bool, Any) - bool indicating whether the path was found and
99
+ the result itself
100
+
101
+ """
102
+ found, out = find_path(value, self.path)
103
+ if self.converter is not None:
104
+ return found, self.converter(out)
105
+ return found, out
106
+
107
+
108
+ class GraphQuery(object):
109
+ """
110
+ Base class for all GraphQL classes.
111
+
112
+ Parameters
113
+ ----------
114
+ api_token : str, optional
115
+ API token to access the GraphQL endpoint
116
+ api_url : str, optional
117
+ GraphQL endpoint
118
+
119
+ """
120
+
121
+ def __init__(
122
+ self,
123
+ api_token: str = '',
124
+ api_url: str = API_URL,
125
+ ) -> None:
126
+ self.api_token = api_token
127
+ self.api_url = api_url
128
+
129
+ @classmethod
130
+ def get_query(cls) -> str:
131
+ """Return the GraphQL for the class."""
132
+ return cls.__doc__ or ''
133
+
134
+ @classmethod
135
+ def get_fields(cls) -> List[Tuple[str, GraphQueryField]]:
136
+ """
137
+ Return fields for the query.
138
+
139
+ Parameters
140
+ ----------
141
+ groups : str
142
+ List of group characters to include
143
+
144
+ Returns
145
+ -------
146
+ List[Tuple[str, QueryField]] - tuple pairs of field name and definition
147
+
148
+ """
149
+ attrs = [(k, v) for k, v in vars(cls).items() if isinstance(v, GraphQueryField)]
150
+ attrs = list(sorted(attrs, key=lambda x: x[1]._sort_index))
151
+ return attrs
152
+
153
+ def run(
154
+ self,
155
+ variables: Optional[Dict[str, Any]] = None,
156
+ *,
157
+ filter_expr: str = '',
158
+ ) -> FusionSQLResult:
159
+ """
160
+ Run the query.
161
+
162
+ Parameters
163
+ ----------
164
+ variables : Dict[str, Any], optional
165
+ Dictionary of substitution parameters
166
+
167
+ Returns
168
+ -------
169
+ FusionSQLResult
170
+
171
+ """
172
+ api_token = self.api_token or os.environ.get('SINGLESTOREDB_BACKEND_TOKEN')
173
+ res = requests.post(
174
+ self.api_url,
175
+ headers={
176
+ 'Content-Type': 'application/json',
177
+ 'Authorization': f'Bearer {api_token}',
178
+ },
179
+ json={
180
+ 'query': type(self).get_query(),
181
+ 'variables': variables or {},
182
+ },
183
+ )
184
+
185
+ if res.status_code != 200:
186
+ raise ValueError(f'an error occurred: {res.text}')
187
+
188
+ json = res.json()
189
+
190
+ if json['data']:
191
+ data = json['data'].popitem()[-1]
192
+ if isinstance(data, Dict):
193
+ data = [data]
194
+ else:
195
+ data = []
196
+
197
+ fres = FusionSQLResult()
198
+
199
+ rows = []
200
+ fields = type(self).get_fields()
201
+ for i, obj in enumerate(data):
202
+ row = []
203
+ for name, field in fields:
204
+ found, value = field.get_path(obj)
205
+ if found:
206
+ if i == 0:
207
+ fres.add_field(name, field.dtype)
208
+ row.append(value)
209
+ rows.append(tuple(row))
210
+
211
+ fres.set_rows(rows)
212
+
213
+ return fres