pixeltable 0.2.26__py3-none-any.whl → 0.5.7__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 (245) hide show
  1. pixeltable/__init__.py +83 -19
  2. pixeltable/_query.py +1444 -0
  3. pixeltable/_version.py +1 -0
  4. pixeltable/catalog/__init__.py +7 -4
  5. pixeltable/catalog/catalog.py +2394 -119
  6. pixeltable/catalog/column.py +225 -104
  7. pixeltable/catalog/dir.py +38 -9
  8. pixeltable/catalog/globals.py +53 -34
  9. pixeltable/catalog/insertable_table.py +265 -115
  10. pixeltable/catalog/path.py +80 -17
  11. pixeltable/catalog/schema_object.py +28 -43
  12. pixeltable/catalog/table.py +1270 -677
  13. pixeltable/catalog/table_metadata.py +103 -0
  14. pixeltable/catalog/table_version.py +1270 -751
  15. pixeltable/catalog/table_version_handle.py +109 -0
  16. pixeltable/catalog/table_version_path.py +137 -42
  17. pixeltable/catalog/tbl_ops.py +53 -0
  18. pixeltable/catalog/update_status.py +191 -0
  19. pixeltable/catalog/view.py +251 -134
  20. pixeltable/config.py +215 -0
  21. pixeltable/env.py +736 -285
  22. pixeltable/exceptions.py +26 -2
  23. pixeltable/exec/__init__.py +7 -2
  24. pixeltable/exec/aggregation_node.py +39 -21
  25. pixeltable/exec/cache_prefetch_node.py +87 -109
  26. pixeltable/exec/cell_materialization_node.py +268 -0
  27. pixeltable/exec/cell_reconstruction_node.py +168 -0
  28. pixeltable/exec/component_iteration_node.py +25 -28
  29. pixeltable/exec/data_row_batch.py +11 -46
  30. pixeltable/exec/exec_context.py +26 -11
  31. pixeltable/exec/exec_node.py +35 -27
  32. pixeltable/exec/expr_eval/__init__.py +3 -0
  33. pixeltable/exec/expr_eval/evaluators.py +365 -0
  34. pixeltable/exec/expr_eval/expr_eval_node.py +413 -0
  35. pixeltable/exec/expr_eval/globals.py +200 -0
  36. pixeltable/exec/expr_eval/row_buffer.py +74 -0
  37. pixeltable/exec/expr_eval/schedulers.py +413 -0
  38. pixeltable/exec/globals.py +35 -0
  39. pixeltable/exec/in_memory_data_node.py +35 -27
  40. pixeltable/exec/object_store_save_node.py +293 -0
  41. pixeltable/exec/row_update_node.py +44 -29
  42. pixeltable/exec/sql_node.py +414 -115
  43. pixeltable/exprs/__init__.py +8 -5
  44. pixeltable/exprs/arithmetic_expr.py +79 -45
  45. pixeltable/exprs/array_slice.py +5 -5
  46. pixeltable/exprs/column_property_ref.py +40 -26
  47. pixeltable/exprs/column_ref.py +254 -61
  48. pixeltable/exprs/comparison.py +14 -9
  49. pixeltable/exprs/compound_predicate.py +9 -10
  50. pixeltable/exprs/data_row.py +213 -72
  51. pixeltable/exprs/expr.py +270 -104
  52. pixeltable/exprs/expr_dict.py +6 -5
  53. pixeltable/exprs/expr_set.py +20 -11
  54. pixeltable/exprs/function_call.py +383 -284
  55. pixeltable/exprs/globals.py +18 -5
  56. pixeltable/exprs/in_predicate.py +7 -7
  57. pixeltable/exprs/inline_expr.py +37 -37
  58. pixeltable/exprs/is_null.py +8 -4
  59. pixeltable/exprs/json_mapper.py +120 -54
  60. pixeltable/exprs/json_path.py +90 -60
  61. pixeltable/exprs/literal.py +61 -16
  62. pixeltable/exprs/method_ref.py +7 -6
  63. pixeltable/exprs/object_ref.py +19 -8
  64. pixeltable/exprs/row_builder.py +238 -75
  65. pixeltable/exprs/rowid_ref.py +53 -15
  66. pixeltable/exprs/similarity_expr.py +65 -50
  67. pixeltable/exprs/sql_element_cache.py +5 -5
  68. pixeltable/exprs/string_op.py +107 -0
  69. pixeltable/exprs/type_cast.py +25 -13
  70. pixeltable/exprs/variable.py +2 -2
  71. pixeltable/func/__init__.py +9 -5
  72. pixeltable/func/aggregate_function.py +197 -92
  73. pixeltable/func/callable_function.py +119 -35
  74. pixeltable/func/expr_template_function.py +101 -48
  75. pixeltable/func/function.py +375 -62
  76. pixeltable/func/function_registry.py +20 -19
  77. pixeltable/func/globals.py +6 -5
  78. pixeltable/func/mcp.py +74 -0
  79. pixeltable/func/query_template_function.py +151 -35
  80. pixeltable/func/signature.py +178 -49
  81. pixeltable/func/tools.py +164 -0
  82. pixeltable/func/udf.py +176 -53
  83. pixeltable/functions/__init__.py +44 -4
  84. pixeltable/functions/anthropic.py +226 -47
  85. pixeltable/functions/audio.py +148 -11
  86. pixeltable/functions/bedrock.py +137 -0
  87. pixeltable/functions/date.py +188 -0
  88. pixeltable/functions/deepseek.py +113 -0
  89. pixeltable/functions/document.py +81 -0
  90. pixeltable/functions/fal.py +76 -0
  91. pixeltable/functions/fireworks.py +72 -20
  92. pixeltable/functions/gemini.py +249 -0
  93. pixeltable/functions/globals.py +208 -53
  94. pixeltable/functions/groq.py +108 -0
  95. pixeltable/functions/huggingface.py +1088 -95
  96. pixeltable/functions/image.py +155 -84
  97. pixeltable/functions/json.py +8 -11
  98. pixeltable/functions/llama_cpp.py +31 -19
  99. pixeltable/functions/math.py +169 -0
  100. pixeltable/functions/mistralai.py +50 -75
  101. pixeltable/functions/net.py +70 -0
  102. pixeltable/functions/ollama.py +29 -36
  103. pixeltable/functions/openai.py +548 -160
  104. pixeltable/functions/openrouter.py +143 -0
  105. pixeltable/functions/replicate.py +15 -14
  106. pixeltable/functions/reve.py +250 -0
  107. pixeltable/functions/string.py +310 -85
  108. pixeltable/functions/timestamp.py +37 -19
  109. pixeltable/functions/together.py +77 -120
  110. pixeltable/functions/twelvelabs.py +188 -0
  111. pixeltable/functions/util.py +7 -2
  112. pixeltable/functions/uuid.py +30 -0
  113. pixeltable/functions/video.py +1528 -117
  114. pixeltable/functions/vision.py +26 -26
  115. pixeltable/functions/voyageai.py +289 -0
  116. pixeltable/functions/whisper.py +19 -10
  117. pixeltable/functions/whisperx.py +179 -0
  118. pixeltable/functions/yolox.py +112 -0
  119. pixeltable/globals.py +716 -236
  120. pixeltable/index/__init__.py +3 -1
  121. pixeltable/index/base.py +17 -21
  122. pixeltable/index/btree.py +32 -22
  123. pixeltable/index/embedding_index.py +155 -92
  124. pixeltable/io/__init__.py +12 -7
  125. pixeltable/io/datarows.py +140 -0
  126. pixeltable/io/external_store.py +83 -125
  127. pixeltable/io/fiftyone.py +24 -33
  128. pixeltable/io/globals.py +47 -182
  129. pixeltable/io/hf_datasets.py +96 -127
  130. pixeltable/io/label_studio.py +171 -156
  131. pixeltable/io/lancedb.py +3 -0
  132. pixeltable/io/pandas.py +136 -115
  133. pixeltable/io/parquet.py +40 -153
  134. pixeltable/io/table_data_conduit.py +702 -0
  135. pixeltable/io/utils.py +100 -0
  136. pixeltable/iterators/__init__.py +8 -4
  137. pixeltable/iterators/audio.py +207 -0
  138. pixeltable/iterators/base.py +9 -3
  139. pixeltable/iterators/document.py +144 -87
  140. pixeltable/iterators/image.py +17 -38
  141. pixeltable/iterators/string.py +15 -12
  142. pixeltable/iterators/video.py +523 -127
  143. pixeltable/metadata/__init__.py +33 -8
  144. pixeltable/metadata/converters/convert_10.py +2 -3
  145. pixeltable/metadata/converters/convert_13.py +2 -2
  146. pixeltable/metadata/converters/convert_15.py +15 -11
  147. pixeltable/metadata/converters/convert_16.py +4 -5
  148. pixeltable/metadata/converters/convert_17.py +4 -5
  149. pixeltable/metadata/converters/convert_18.py +4 -6
  150. pixeltable/metadata/converters/convert_19.py +6 -9
  151. pixeltable/metadata/converters/convert_20.py +3 -6
  152. pixeltable/metadata/converters/convert_21.py +6 -8
  153. pixeltable/metadata/converters/convert_22.py +3 -2
  154. pixeltable/metadata/converters/convert_23.py +33 -0
  155. pixeltable/metadata/converters/convert_24.py +55 -0
  156. pixeltable/metadata/converters/convert_25.py +19 -0
  157. pixeltable/metadata/converters/convert_26.py +23 -0
  158. pixeltable/metadata/converters/convert_27.py +29 -0
  159. pixeltable/metadata/converters/convert_28.py +13 -0
  160. pixeltable/metadata/converters/convert_29.py +110 -0
  161. pixeltable/metadata/converters/convert_30.py +63 -0
  162. pixeltable/metadata/converters/convert_31.py +11 -0
  163. pixeltable/metadata/converters/convert_32.py +15 -0
  164. pixeltable/metadata/converters/convert_33.py +17 -0
  165. pixeltable/metadata/converters/convert_34.py +21 -0
  166. pixeltable/metadata/converters/convert_35.py +9 -0
  167. pixeltable/metadata/converters/convert_36.py +38 -0
  168. pixeltable/metadata/converters/convert_37.py +15 -0
  169. pixeltable/metadata/converters/convert_38.py +39 -0
  170. pixeltable/metadata/converters/convert_39.py +124 -0
  171. pixeltable/metadata/converters/convert_40.py +73 -0
  172. pixeltable/metadata/converters/convert_41.py +12 -0
  173. pixeltable/metadata/converters/convert_42.py +9 -0
  174. pixeltable/metadata/converters/convert_43.py +44 -0
  175. pixeltable/metadata/converters/util.py +44 -18
  176. pixeltable/metadata/notes.py +21 -0
  177. pixeltable/metadata/schema.py +185 -42
  178. pixeltable/metadata/utils.py +74 -0
  179. pixeltable/mypy/__init__.py +3 -0
  180. pixeltable/mypy/mypy_plugin.py +123 -0
  181. pixeltable/plan.py +616 -225
  182. pixeltable/share/__init__.py +3 -0
  183. pixeltable/share/packager.py +797 -0
  184. pixeltable/share/protocol/__init__.py +33 -0
  185. pixeltable/share/protocol/common.py +165 -0
  186. pixeltable/share/protocol/operation_types.py +33 -0
  187. pixeltable/share/protocol/replica.py +119 -0
  188. pixeltable/share/publish.py +349 -0
  189. pixeltable/store.py +398 -232
  190. pixeltable/type_system.py +730 -267
  191. pixeltable/utils/__init__.py +40 -0
  192. pixeltable/utils/arrow.py +201 -29
  193. pixeltable/utils/av.py +298 -0
  194. pixeltable/utils/azure_store.py +346 -0
  195. pixeltable/utils/coco.py +26 -27
  196. pixeltable/utils/code.py +4 -4
  197. pixeltable/utils/console_output.py +46 -0
  198. pixeltable/utils/coroutine.py +24 -0
  199. pixeltable/utils/dbms.py +92 -0
  200. pixeltable/utils/description_helper.py +11 -12
  201. pixeltable/utils/documents.py +60 -61
  202. pixeltable/utils/exception_handler.py +36 -0
  203. pixeltable/utils/filecache.py +38 -22
  204. pixeltable/utils/formatter.py +88 -51
  205. pixeltable/utils/gcs_store.py +295 -0
  206. pixeltable/utils/http.py +133 -0
  207. pixeltable/utils/http_server.py +14 -13
  208. pixeltable/utils/iceberg.py +13 -0
  209. pixeltable/utils/image.py +17 -0
  210. pixeltable/utils/lancedb.py +90 -0
  211. pixeltable/utils/local_store.py +322 -0
  212. pixeltable/utils/misc.py +5 -0
  213. pixeltable/utils/object_stores.py +573 -0
  214. pixeltable/utils/pydantic.py +60 -0
  215. pixeltable/utils/pytorch.py +20 -20
  216. pixeltable/utils/s3_store.py +527 -0
  217. pixeltable/utils/sql.py +32 -5
  218. pixeltable/utils/system.py +30 -0
  219. pixeltable/utils/transactional_directory.py +4 -3
  220. pixeltable-0.5.7.dist-info/METADATA +579 -0
  221. pixeltable-0.5.7.dist-info/RECORD +227 -0
  222. {pixeltable-0.2.26.dist-info → pixeltable-0.5.7.dist-info}/WHEEL +1 -1
  223. pixeltable-0.5.7.dist-info/entry_points.txt +2 -0
  224. pixeltable/__version__.py +0 -3
  225. pixeltable/catalog/named_function.py +0 -36
  226. pixeltable/catalog/path_dict.py +0 -141
  227. pixeltable/dataframe.py +0 -894
  228. pixeltable/exec/expr_eval_node.py +0 -232
  229. pixeltable/ext/__init__.py +0 -14
  230. pixeltable/ext/functions/__init__.py +0 -8
  231. pixeltable/ext/functions/whisperx.py +0 -77
  232. pixeltable/ext/functions/yolox.py +0 -157
  233. pixeltable/tool/create_test_db_dump.py +0 -311
  234. pixeltable/tool/create_test_video.py +0 -81
  235. pixeltable/tool/doc_plugins/griffe.py +0 -50
  236. pixeltable/tool/doc_plugins/mkdocstrings.py +0 -6
  237. pixeltable/tool/doc_plugins/templates/material/udf.html.jinja +0 -135
  238. pixeltable/tool/embed_udf.py +0 -9
  239. pixeltable/tool/mypy_plugin.py +0 -55
  240. pixeltable/utils/media_store.py +0 -76
  241. pixeltable/utils/s3.py +0 -16
  242. pixeltable-0.2.26.dist-info/METADATA +0 -400
  243. pixeltable-0.2.26.dist-info/RECORD +0 -156
  244. pixeltable-0.2.26.dist-info/entry_points.txt +0 -3
  245. {pixeltable-0.2.26.dist-info → pixeltable-0.5.7.dist-info/licenses}/LICENSE +0 -0
@@ -1,52 +1,75 @@
1
- import inspect
2
- from typing import Any, Optional
1
+ from typing import Any, Sequence
3
2
 
4
- import pixeltable
5
- import pixeltable.exceptions as excs
3
+ from pixeltable import exceptions as excs, exprs, type_system as ts
6
4
 
7
5
  from .function import Function
8
6
  from .signature import Signature
9
7
 
10
8
 
11
- class ExprTemplateFunction(Function):
12
- """A parameterized expression from which an executable Expr is created with a function call."""
9
+ class ExprTemplate:
10
+ """
11
+ Encapsulates a single signature of an `ExprTemplateFunction` and its associated parameterized expression,
12
+ along with various precomputed metadata. (This is analogous to a `Callable`-`Signature` pair in a
13
+ `CallableFunction`.)
14
+ """
15
+
16
+ expr: 'exprs.Expr'
17
+ signature: Signature
18
+ param_exprs: dict[str, 'exprs.Variable']
13
19
 
14
- def __init__(
15
- self, expr: 'pixeltable.exprs.Expr', signature: Signature, self_path: Optional[str] = None,
16
- name: Optional[str] = None):
17
- import pixeltable.exprs as exprs
20
+ def __init__(self, expr: 'exprs.Expr', signature: Signature):
18
21
  self.expr = expr
19
- self.self_name = name
20
- self.param_exprs = list(set(expr.subexprs(expr_class=exprs.Variable)))
21
- # make sure there are no duplicate names
22
- assert len(self.param_exprs) == len(set(p.name for p in self.param_exprs))
23
- self.param_exprs_by_name = {p.name: p for p in self.param_exprs}
22
+ self.signature = signature
23
+
24
+ self.param_exprs = {name: exprs.Variable(name, param.col_type) for name, param in signature.parameters.items()}
25
+
26
+ # validate that all variables in the expression are parameters
27
+ for var in expr.subexprs(expr_class=exprs.Variable):
28
+ assert var.name in self.param_exprs, f"Variable '{var.name}' in expression is not a parameter"
24
29
 
25
30
  # verify default values
26
- self.defaults: dict[str, exprs.Literal] = {} # key: param name, value: default value converted to a Literal
27
- for param in signature.parameters.values():
28
- if param.default is inspect.Parameter.empty:
31
+ self.defaults: dict[str, exprs.Literal] = {}
32
+ for param in self.signature.parameters.values():
33
+ if param.default is None:
29
34
  continue
30
- param_expr = self.param_exprs_by_name[param.name]
31
- try:
32
- literal_default = exprs.Literal(param.default, col_type=param_expr.col_type)
33
- self.defaults[param.name] = literal_default
34
- except TypeError as e:
35
- msg = str(e)
36
- raise excs.Error(f"Default value for parameter '{param.name}': {msg[0].lower() + msg[1:]}")
35
+ self.defaults[param.name] = param.default
36
+
37
+ # def __repr__(self) -> str:
38
+ # return f'ExprTemplate(expr={repr(self.expr)}, signature={self.signature})'
39
+
40
+
41
+ class ExprTemplateFunction(Function):
42
+ """A parameterized expression from which an executable Expr is created with a function call."""
37
43
 
38
- super().__init__(signature, self_path=self_path)
44
+ templates: list[ExprTemplate]
45
+ self_name: str
39
46
 
40
- def instantiate(self, *args: object, **kwargs: object) -> 'pixeltable.exprs.Expr':
47
+ def __init__(self, templates: list[ExprTemplate], self_path: str | None = None, name: str | None = None):
48
+ self.templates = templates
49
+ self.self_name = name
50
+
51
+ super().__init__([t.signature for t in templates], self_path=self_path)
52
+
53
+ def _update_as_overload_resolution(self, signature_idx: int) -> None:
54
+ self.templates = [self.templates[signature_idx]]
55
+
56
+ @property
57
+ def template(self) -> ExprTemplate:
58
+ assert not self.is_polymorphic
59
+ return self.templates[0]
60
+
61
+ def instantiate(self, args: Sequence[Any], kwargs: dict[str, Any]) -> 'exprs.Expr':
62
+ assert not self.is_polymorphic
63
+ template = self.template
41
64
  bound_args = self.signature.py_signature.bind(*args, **kwargs).arguments
42
- # apply defaults, otherwise we might have Parameters left over
65
+ # apply defaults; otherwise we might have Parameters left over
43
66
  bound_args.update(
44
- {param_name: default for param_name, default in self.defaults.items() if param_name not in bound_args})
45
- result = self.expr.copy()
46
- import pixeltable.exprs as exprs
67
+ {param_name: default for param_name, default in template.defaults.items() if param_name not in bound_args}
68
+ )
69
+ result = template.expr.copy()
47
70
  arg_exprs: dict[exprs.Expr, exprs.Expr] = {}
48
71
  for param_name, arg in bound_args.items():
49
- param_expr = self.param_exprs_by_name[param_name]
72
+ param_expr = template.param_exprs[param_name]
50
73
  if not isinstance(arg, exprs.Expr):
51
74
  # TODO: use the available param_expr.col_type
52
75
  arg_expr = exprs.Expr.from_object(arg)
@@ -56,44 +79,74 @@ class ExprTemplateFunction(Function):
56
79
  arg_expr = arg
57
80
  arg_exprs[param_expr] = arg_expr
58
81
  result = result.substitute(arg_exprs)
59
- import pixeltable.exprs as exprs
60
- assert not result._contains(exprs.Variable)
61
82
  return result
62
83
 
63
- def exec(self, *args: Any, **kwargs: Any) -> Any:
64
- expr = self.instantiate(*args, **kwargs)
65
- import pixeltable.exprs as exprs
84
+ def call_return_type(self, bound_args: dict[str, 'exprs.Expr']) -> ts.ColumnType:
85
+ """
86
+ The call_return_type of an ExprTemplateFunction is derived from the template expression's col_type after
87
+ substitution (unlike for UDFs, whose call_return_type is derived from an explicitly specified
88
+ conditional_return_type).
89
+ """
90
+ assert not self.is_polymorphic
91
+ with_defaults = bound_args.copy()
92
+ with_defaults.update(
93
+ {
94
+ param_name: default
95
+ for param_name, default in self.template.defaults.items()
96
+ if param_name not in bound_args
97
+ }
98
+ )
99
+ substituted_expr = self.template.expr.copy().substitute(
100
+ {self.template.param_exprs[name]: expr for name, expr in with_defaults.items()}
101
+ )
102
+ return substituted_expr.col_type
103
+
104
+ def comment(self) -> str | None:
105
+ if isinstance(self.templates[0].expr, exprs.FunctionCall):
106
+ return self.templates[0].expr.fn.comment()
107
+ return None
108
+
109
+ def exec(self, args: Sequence[Any], kwargs: dict[str, Any]) -> Any:
110
+ assert not self.is_polymorphic
111
+ expr = self.instantiate(args, kwargs)
66
112
  row_builder = exprs.RowBuilder(output_exprs=[expr], columns=[], input_exprs=[])
67
- import pixeltable.exec as exec
68
- row_batch = exec.DataRowBatch(tbl=None, row_builder=row_builder, len=1)
69
- row = row_batch[0]
113
+ row = row_builder.make_row()
70
114
  row_builder.eval(row, ctx=row_builder.default_eval_ctx)
71
115
  return row[row_builder.get_output_exprs()[0].slot_idx]
72
116
 
73
117
  @property
74
118
  def display_name(self) -> str:
119
+ if not self.self_name and isinstance(self.templates[0].expr, exprs.FunctionCall):
120
+ # In the common case where the templated expression is itself a FunctionCall,
121
+ # fall back on the display name of the underlying FunctionCall
122
+ return self.templates[0].expr.fn.display_name
75
123
  return self.self_name
76
124
 
77
125
  @property
78
126
  def name(self) -> str:
79
127
  return self.self_name
80
128
 
129
+ @property
130
+ def is_async(self) -> bool:
131
+ return False
132
+
81
133
  def __str__(self) -> str:
82
- return str(self.expr)
134
+ return str(self.templates[0].expr)
135
+
136
+ # def __repr__(self) -> str:
137
+ # return f'ExprTemplateFunction(name={self.name}, templates={self.templates})'
83
138
 
84
139
  def _as_dict(self) -> dict:
85
140
  if self.self_path is not None:
86
141
  return super()._as_dict()
87
- return {
88
- 'expr': self.expr.as_dict(),
89
- 'signature': self.signature.as_dict(),
90
- 'name': self.name,
91
- }
142
+ assert not self.is_polymorphic
143
+ assert len(self.templates) == 1
144
+ return {'expr': self.template.expr.as_dict(), 'signature': self.signature.as_dict(), 'name': self.name}
92
145
 
93
146
  @classmethod
94
147
  def _from_dict(cls, d: dict) -> Function:
95
148
  if 'expr' not in d:
96
149
  return super()._from_dict(d)
97
150
  assert 'signature' in d and 'name' in d
98
- import pixeltable.exprs as exprs
99
- return cls(exprs.Expr.from_dict(d['expr']), Signature.from_dict(d['signature']), name=d['name'])
151
+ template = ExprTemplate(exprs.Expr.from_dict(d['expr']), Signature.from_dict(d['signature']))
152
+ return cls([template], name=d['name'])