pixeltable 0.4.0rc3__py3-none-any.whl → 0.4.2__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.

Potentially problematic release.


This version of pixeltable might be problematic. Click here for more details.

Files changed (58) hide show
  1. pixeltable/__init__.py +1 -1
  2. pixeltable/__version__.py +2 -2
  3. pixeltable/catalog/__init__.py +11 -2
  4. pixeltable/catalog/catalog.py +407 -119
  5. pixeltable/catalog/column.py +38 -26
  6. pixeltable/catalog/globals.py +130 -15
  7. pixeltable/catalog/insertable_table.py +10 -9
  8. pixeltable/catalog/schema_object.py +6 -0
  9. pixeltable/catalog/table.py +245 -119
  10. pixeltable/catalog/table_version.py +142 -116
  11. pixeltable/catalog/table_version_handle.py +30 -2
  12. pixeltable/catalog/table_version_path.py +28 -4
  13. pixeltable/catalog/view.py +14 -20
  14. pixeltable/config.py +4 -0
  15. pixeltable/dataframe.py +10 -9
  16. pixeltable/env.py +5 -11
  17. pixeltable/exceptions.py +6 -0
  18. pixeltable/exec/exec_node.py +2 -0
  19. pixeltable/exec/expr_eval/expr_eval_node.py +4 -4
  20. pixeltable/exec/sql_node.py +47 -30
  21. pixeltable/exprs/column_property_ref.py +2 -10
  22. pixeltable/exprs/column_ref.py +24 -21
  23. pixeltable/exprs/data_row.py +9 -0
  24. pixeltable/exprs/expr.py +4 -4
  25. pixeltable/exprs/row_builder.py +44 -13
  26. pixeltable/func/__init__.py +1 -0
  27. pixeltable/func/mcp.py +74 -0
  28. pixeltable/func/query_template_function.py +4 -2
  29. pixeltable/func/tools.py +12 -2
  30. pixeltable/func/udf.py +2 -2
  31. pixeltable/functions/__init__.py +1 -0
  32. pixeltable/functions/groq.py +108 -0
  33. pixeltable/functions/huggingface.py +8 -6
  34. pixeltable/functions/mistralai.py +2 -13
  35. pixeltable/functions/openai.py +1 -6
  36. pixeltable/functions/replicate.py +2 -2
  37. pixeltable/functions/util.py +6 -1
  38. pixeltable/globals.py +0 -2
  39. pixeltable/io/external_store.py +81 -54
  40. pixeltable/io/globals.py +1 -1
  41. pixeltable/io/label_studio.py +49 -45
  42. pixeltable/io/table_data_conduit.py +1 -1
  43. pixeltable/metadata/__init__.py +1 -1
  44. pixeltable/metadata/converters/convert_37.py +15 -0
  45. pixeltable/metadata/converters/convert_38.py +39 -0
  46. pixeltable/metadata/notes.py +2 -0
  47. pixeltable/metadata/schema.py +5 -0
  48. pixeltable/metadata/utils.py +78 -0
  49. pixeltable/plan.py +59 -139
  50. pixeltable/share/packager.py +2 -2
  51. pixeltable/store.py +114 -103
  52. pixeltable/type_system.py +30 -0
  53. {pixeltable-0.4.0rc3.dist-info → pixeltable-0.4.2.dist-info}/METADATA +1 -1
  54. {pixeltable-0.4.0rc3.dist-info → pixeltable-0.4.2.dist-info}/RECORD +57 -53
  55. pixeltable/utils/sample.py +0 -25
  56. {pixeltable-0.4.0rc3.dist-info → pixeltable-0.4.2.dist-info}/LICENSE +0 -0
  57. {pixeltable-0.4.0rc3.dist-info → pixeltable-0.4.2.dist-info}/WHEEL +0 -0
  58. {pixeltable-0.4.0rc3.dist-info → pixeltable-0.4.2.dist-info}/entry_points.txt +0 -0
pixeltable/store.py CHANGED
@@ -7,13 +7,14 @@ import sys
7
7
  import urllib.parse
8
8
  import urllib.request
9
9
  import warnings
10
- from typing import Any, Iterable, Iterator, Literal, Optional, Union
10
+ from typing import Any, Iterable, Iterator, Optional, Union
11
11
 
12
12
  import more_itertools
13
13
  import sqlalchemy as sql
14
14
  from tqdm import TqdmWarning, tqdm
15
15
 
16
- from pixeltable import catalog, exceptions as excs, exprs
16
+ from pixeltable import catalog, exceptions as excs
17
+ from pixeltable.catalog import RowCountStats, UpdateStatus
17
18
  from pixeltable.env import Env
18
19
  from pixeltable.exec import ExecNode
19
20
  from pixeltable.metadata import schema
@@ -41,7 +42,10 @@ class StoreBase:
41
42
  v_max_col: sql.Column
42
43
  base: Optional[StoreBase]
43
44
 
44
- __INSERT_BATCH_SIZE = 1000
45
+ # In my cursory experiments this was the optimal batch size: it was an improvement over 5_000 and there was no real
46
+ # benefit to going higher.
47
+ # TODO: Perform more rigorous experiments with different table structures and OS environments to refine this.
48
+ __INSERT_BATCH_SIZE = 10_000
45
49
 
46
50
  def __init__(self, tbl_version: catalog.TableVersion):
47
51
  self.tbl_version = catalog.TableVersionHandle(
@@ -124,13 +128,14 @@ class StoreBase:
124
128
 
125
129
  def _move_tmp_media_file(self, file_url: Optional[str], col: catalog.Column, v_min: int) -> str:
126
130
  """Move tmp media file with given url to Env.media_dir and return new url, or given url if not a tmp_dir file"""
127
- pxt_tmp_dir = str(Env.get().tmp_dir)
128
131
  if file_url is None:
129
132
  return None
133
+ assert isinstance(file_url, str), type(file_url)
134
+ pxt_tmp_dir = str(Env.get().tmp_dir)
130
135
  parsed = urllib.parse.urlparse(file_url)
131
136
  # We should never be passed a local file path here. The "len > 1" ensures that Windows
132
137
  # file paths aren't mistaken for URLs with a single-character scheme.
133
- assert len(parsed.scheme) > 1
138
+ assert len(parsed.scheme) > 1, file_url
134
139
  if parsed.scheme != 'file':
135
140
  # remote url
136
141
  return file_url
@@ -145,27 +150,11 @@ class StoreBase:
145
150
  return new_file_url
146
151
 
147
152
  def _move_tmp_media_files(
148
- self, table_rows: list[dict[str, Any]], media_cols: list[catalog.Column], v_min: int
153
+ self, table_row: list[Any], media_cols_by_sql_idx: dict[int, catalog.Column], v_min: int
149
154
  ) -> None:
150
155
  """Move tmp media files that we generated to a permanent location"""
151
- for c in media_cols:
152
- for table_row in table_rows:
153
- file_url = table_row[c.store_name()]
154
- table_row[c.store_name()] = self._move_tmp_media_file(file_url, c, v_min)
155
-
156
- def _create_table_row(
157
- self, input_row: exprs.DataRow, row_builder: exprs.RowBuilder, exc_col_ids: set[int], pk: tuple[int, ...]
158
- ) -> tuple[dict[str, Any], int]:
159
- """Return Tuple[complete table row, # of exceptions] for insert()
160
- Creates a row that includes the PK columns, with the values from input_row.pk.
161
- Returns:
162
- Tuple[complete table row, # of exceptions]
163
- """
164
- table_row, num_excs = row_builder.create_table_row(input_row, exc_col_ids)
165
- assert len(pk) == len(self._pk_cols)
166
- for pk_col, pk_val in zip(self._pk_cols, pk):
167
- table_row[pk_col.name] = pk_val
168
- return table_row, num_excs
156
+ for n, col in media_cols_by_sql_idx.items():
157
+ table_row[n] = self._move_tmp_media_file(table_row[n], col, v_min)
169
158
 
170
159
  def count(self) -> int:
171
160
  """Return the number of rows visible in self.tbl_version"""
@@ -231,9 +220,7 @@ class StoreBase:
231
220
  if col.store_name() not in existing_cols:
232
221
  self.add_column(col)
233
222
 
234
- def load_column(
235
- self, col: catalog.Column, exec_plan: ExecNode, value_expr_slot_idx: int, on_error: Literal['abort', 'ignore']
236
- ) -> int:
223
+ def load_column(self, col: catalog.Column, exec_plan: ExecNode, abort_on_exc: bool) -> int:
237
224
  """Update store column of a computed column with values produced by an execution plan
238
225
 
239
226
  Returns:
@@ -247,60 +234,51 @@ class StoreBase:
247
234
  num_rows = 0
248
235
  # create temp table to store output of exec_plan, with the same primary key as the store table
249
236
  tmp_name = f'temp_{self._storage_name()}'
250
- tmp_pk_cols = [sql.Column(col.name, col.type, primary_key=True) for col in self.pk_columns()]
251
- tmp_cols = tmp_pk_cols.copy()
237
+ tmp_pk_cols = tuple(sql.Column(col.name, col.type, primary_key=True) for col in self.pk_columns())
238
+ tmp_val_col_sql_idx = len(tmp_pk_cols)
252
239
  tmp_val_col = sql.Column(col.sa_col.name, col.sa_col.type)
253
- tmp_cols.append(tmp_val_col)
240
+ tmp_cols = [*tmp_pk_cols, tmp_val_col]
254
241
  # add error columns if the store column records errors
255
242
  if col.records_errors:
256
243
  tmp_errortype_col = sql.Column(col.sa_errortype_col.name, col.sa_errortype_col.type)
257
- tmp_cols.append(tmp_errortype_col)
258
244
  tmp_errormsg_col = sql.Column(col.sa_errormsg_col.name, col.sa_errormsg_col.type)
259
- tmp_cols.append(tmp_errormsg_col)
245
+ tmp_cols.extend((tmp_errortype_col, tmp_errormsg_col))
246
+ tmp_col_names = [col.name for col in tmp_cols]
247
+
260
248
  tmp_tbl = sql.Table(tmp_name, self.sa_md, *tmp_cols, prefixes=['TEMPORARY'])
261
249
  conn = Env.get().conn
262
250
  tmp_tbl.create(bind=conn)
263
251
 
252
+ row_builder = exec_plan.row_builder
253
+
264
254
  try:
255
+ table_rows: list[tuple[Any]] = []
256
+
265
257
  # insert rows from exec_plan into temp table
266
- # TODO: unify the table row construction logic with RowBuilder.create_table_row()
267
258
  for row_batch in exec_plan:
268
259
  num_rows += len(row_batch)
269
- tbl_rows: list[dict[str, Any]] = []
270
- for result_row in row_batch:
271
- tbl_row: dict[str, Any] = {}
272
- for pk_col, pk_val in zip(self.pk_columns(), result_row.pk):
273
- tbl_row[pk_col.name] = pk_val
274
-
275
- if col.is_computed:
276
- if result_row.has_exc(value_expr_slot_idx):
277
- num_excs += 1
278
- value_exc = result_row.get_exc(value_expr_slot_idx)
279
- if on_error == 'abort':
280
- raise excs.Error(
281
- f'Error while evaluating computed column `{col.name}`:\n{value_exc}'
282
- ) from value_exc
283
- # we store a NULL value and record the exception/exc type
284
- error_type = type(value_exc).__name__
285
- error_msg = str(value_exc)
286
- tbl_row[col.sa_col.name] = None
287
- tbl_row[col.sa_errortype_col.name] = error_type
288
- tbl_row[col.sa_errormsg_col.name] = error_msg
289
- else:
290
- if col.col_type.is_image_type() and result_row.file_urls[value_expr_slot_idx] is None:
291
- # we have yet to store this image
292
- filepath = str(MediaStore.prepare_media_path(col.tbl.id, col.id, col.tbl.version))
293
- result_row.flush_img(value_expr_slot_idx, filepath)
294
- val = result_row.get_stored_val(value_expr_slot_idx, col.sa_col.type)
295
- if col.col_type.is_media_type():
296
- val = self._move_tmp_media_file(val, col, result_row.pk[-1])
297
- tbl_row[col.sa_col.name] = val
298
- if col.records_errors:
299
- tbl_row[col.sa_errortype_col.name] = None
300
- tbl_row[col.sa_errormsg_col.name] = None
301
-
302
- tbl_rows.append(tbl_row)
303
- conn.execute(sql.insert(tmp_tbl), tbl_rows)
260
+ batch_table_rows: list[tuple[Any]] = []
261
+
262
+ for row in row_batch:
263
+ if abort_on_exc and row.has_exc():
264
+ exc = row.get_first_exc()
265
+ raise excs.Error(f'Error while evaluating computed column {col.name!r}:\n{exc}') from exc
266
+ table_row, num_row_exc = row_builder.create_table_row(row, None, row.pk)
267
+ if col.col_type.is_media_type():
268
+ table_row[tmp_val_col_sql_idx] = self._move_tmp_media_file(
269
+ table_row[tmp_val_col_sql_idx], col, row.pk[-1]
270
+ )
271
+ num_excs += num_row_exc
272
+ batch_table_rows.append(tuple(table_row))
273
+
274
+ table_rows.extend(batch_table_rows)
275
+
276
+ if len(table_rows) >= self.__INSERT_BATCH_SIZE:
277
+ self.sql_insert(tmp_tbl, tmp_col_names, table_rows)
278
+ table_rows.clear()
279
+
280
+ if len(table_rows) > 0:
281
+ self.sql_insert(tmp_tbl, tmp_col_names, table_rows)
304
282
 
305
283
  # update store table with values from temp table
306
284
  update_stmt = sql.update(self.sa_tbl)
@@ -313,6 +291,7 @@ class StoreBase:
313
291
  )
314
292
  log_explain(_logger, update_stmt, conn)
315
293
  conn.execute(update_stmt)
294
+
316
295
  finally:
317
296
 
318
297
  def remove_tmp_tbl() -> None:
@@ -320,6 +299,7 @@ class StoreBase:
320
299
  tmp_tbl.drop(bind=conn)
321
300
 
322
301
  run_cleanup(remove_tmp_tbl, raise_error=True)
302
+
323
303
  return num_excs
324
304
 
325
305
  def insert_rows(
@@ -329,7 +309,7 @@ class StoreBase:
329
309
  show_progress: bool = True,
330
310
  rowids: Optional[Iterator[int]] = None,
331
311
  abort_on_exc: bool = False,
332
- ) -> tuple[int, int, set[int]]:
312
+ ) -> tuple[set[int], UpdateStatus]:
333
313
  """Insert rows into the store table and update the catalog table's md
334
314
  Returns:
335
315
  number of inserted rows, number of exceptions, set of column ids that have exceptions
@@ -341,50 +321,81 @@ class StoreBase:
341
321
  cols_with_excs: set[int] = set()
342
322
  progress_bar: Optional[tqdm] = None # create this only after we started executing
343
323
  row_builder = exec_plan.row_builder
344
- media_cols = [info.col for info in row_builder.table_columns if info.col.col_type.is_media_type()]
345
- conn = Env.get().conn
324
+
325
+ store_col_names, media_cols_by_idx = row_builder.store_column_names()
346
326
 
347
327
  try:
328
+ table_rows: list[tuple[Any]] = []
348
329
  exec_plan.open()
330
+
349
331
  for row_batch in exec_plan:
350
332
  num_rows += len(row_batch)
351
- for batch_start_idx in range(0, len(row_batch), self.__INSERT_BATCH_SIZE):
352
- # compute batch of rows and convert them into table rows
353
- table_rows: list[dict[str, Any]] = []
354
- batch_stop_idx = min(batch_start_idx + self.__INSERT_BATCH_SIZE, len(row_batch))
355
- for row_idx in range(batch_start_idx, batch_stop_idx):
356
- row = row_batch[row_idx]
357
- # if abort_on_exc == True, we need to check for media validation exceptions
358
- if abort_on_exc and row.has_exc():
359
- exc = row.get_first_exc()
360
- raise exc
361
-
362
- rowid = (next(rowids),) if rowids is not None else row.pk[:-1]
363
- pk = (*rowid, v_min)
364
- table_row, num_row_exc = self._create_table_row(row, row_builder, cols_with_excs, pk=pk)
365
- num_excs += num_row_exc
366
- table_rows.append(table_row)
367
-
368
- if show_progress:
369
- if progress_bar is None:
370
- warnings.simplefilter('ignore', category=TqdmWarning)
371
- progress_bar = tqdm(
372
- desc=f'Inserting rows into `{self.tbl_version.get().name}`',
373
- unit=' rows',
374
- ncols=100,
375
- file=sys.stdout,
376
- )
377
- progress_bar.update(1)
378
-
379
- # insert batch of rows
380
- self._move_tmp_media_files(table_rows, media_cols, v_min)
381
- conn.execute(sql.insert(self.sa_tbl), table_rows)
333
+ batch_table_rows: list[tuple[Any]] = []
334
+
335
+ # compute batch of rows and convert them into table rows
336
+ for row in row_batch:
337
+ # if abort_on_exc == True, we need to check for media validation exceptions
338
+ if abort_on_exc and row.has_exc():
339
+ exc = row.get_first_exc()
340
+ raise exc
341
+
342
+ rowid = (next(rowids),) if rowids is not None else row.pk[:-1]
343
+ pk = (*rowid, v_min)
344
+ assert len(pk) == len(self._pk_cols)
345
+ table_row, num_row_exc = row_builder.create_table_row(row, cols_with_excs, pk)
346
+ num_excs += num_row_exc
347
+
348
+ if show_progress:
349
+ if progress_bar is None:
350
+ warnings.simplefilter('ignore', category=TqdmWarning)
351
+ progress_bar = tqdm(
352
+ desc=f'Inserting rows into `{self.tbl_version.get().name}`',
353
+ unit=' rows',
354
+ ncols=100,
355
+ file=sys.stdout,
356
+ )
357
+ progress_bar.update(1)
358
+
359
+ self._move_tmp_media_files(table_row, media_cols_by_idx, v_min)
360
+ batch_table_rows.append(tuple(table_row))
361
+
362
+ table_rows.extend(batch_table_rows)
363
+
364
+ # if a batch is ready for insertion into the database, insert it
365
+ if len(table_rows) >= self.__INSERT_BATCH_SIZE:
366
+ self.sql_insert(self.sa_tbl, store_col_names, table_rows)
367
+ table_rows.clear()
368
+
369
+ # insert any remaining rows
370
+ if len(table_rows) > 0:
371
+ self.sql_insert(self.sa_tbl, store_col_names, table_rows)
372
+
382
373
  if progress_bar is not None:
383
374
  progress_bar.close()
384
- return num_rows, num_excs, cols_with_excs
375
+ computed_values = exec_plan.ctx.num_computed_exprs * num_rows
376
+ row_counts = RowCountStats(
377
+ ins_rows=num_rows, num_excs=num_excs, computed_values=computed_values
378
+ ) # insert (StoreBase)
379
+
380
+ return cols_with_excs, UpdateStatus(row_count_stats=row_counts)
381
+
385
382
  finally:
386
383
  exec_plan.close()
387
384
 
385
+ @classmethod
386
+ def sql_insert(cls, sa_tbl: sql.Table, store_col_names: list[str], table_rows: list[tuple[Any]]) -> None:
387
+ assert len(table_rows) > 0
388
+ conn = Env.get().conn
389
+ conn.execute(sql.insert(sa_tbl), [dict(zip(store_col_names, table_row)) for table_row in table_rows])
390
+
391
+ # TODO: Inserting directly via psycopg delivers a small performance benefit, but is somewhat fraught due to
392
+ # differences in the data representation that SQLAlchemy/psycopg expect. The below code will do the
393
+ # insertion in psycopg and can be used if/when we decide to pursue that optimization.
394
+ # col_names_str = ", ".join(store_col_names)
395
+ # placeholders_str = ", ".join('%s' for _ in store_col_names)
396
+ # stmt_text = f'INSERT INTO {self.sa_tbl.name} ({col_names_str}) VALUES ({placeholders_str})'
397
+ # conn.exec_driver_sql(stmt_text, table_rows)
398
+
388
399
  def _versions_clause(self, versions: list[Optional[int]], match_on_vmin: bool) -> sql.ColumnElement[bool]:
389
400
  """Return filter for base versions"""
390
401
  v = versions[0]
pixeltable/type_system.py CHANGED
@@ -395,6 +395,36 @@ class ColumnType:
395
395
  raise excs.Error(f'Standard Python type `{name}` cannot be used here; use `{suggestion}` instead')
396
396
  raise excs.Error(f'Unknown type: {t}')
397
397
 
398
+ @classmethod
399
+ def from_json_schema(cls, schema: dict[str, Any]) -> Optional[ColumnType]:
400
+ # We first express the JSON schema as a Python type, and then convert it to a Pixeltable type.
401
+ # TODO: Is there a meaningful fallback if one of these operations fails? (Maybe another use case for a pxt Any
402
+ # type?)
403
+ py_type = cls.__json_schema_to_py_type(schema)
404
+ return cls.from_python_type(py_type) if py_type is not None else None
405
+
406
+ @classmethod
407
+ def __json_schema_to_py_type(cls, schema: dict[str, Any]) -> Union[type, _GenericAlias, None]:
408
+ if 'type' in schema:
409
+ if schema['type'] == 'null':
410
+ return type(None)
411
+ if schema['type'] == 'string':
412
+ return str
413
+ if schema['type'] == 'integer':
414
+ return int
415
+ if schema['type'] == 'number':
416
+ return float
417
+ if schema['type'] == 'boolean':
418
+ return bool
419
+ if schema['type'] in ('array', 'object'):
420
+ return list
421
+ elif 'anyOf' in schema:
422
+ subscripts = tuple(cls.__json_schema_to_py_type(subschema) for subschema in schema['anyOf'])
423
+ if all(subscript is not None for subscript in subscripts):
424
+ return Union[subscripts]
425
+
426
+ return None
427
+
398
428
  def validate_literal(self, val: Any) -> None:
399
429
  """Raise TypeError if val is not a valid literal for this type"""
400
430
  if val is None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pixeltable
3
- Version: 0.4.0rc3
3
+ Version: 0.4.2
4
4
  Summary: AI Data Infrastructure: Declarative, Multimodal, and Incremental
5
5
  License: Apache-2.0
6
6
  Keywords: data-science,machine-learning,database,ai,computer-vision,chatbot,ml,artificial-intelligence,feature-engineering,multimodal,mlops,feature-store,vector-database,llm,genai
@@ -1,48 +1,48 @@
1
- pixeltable/__init__.py,sha256=-uXHuiXH98kAlCupUTPbkBh4ToZgxcYUOk7-c9hqCC8,1439
2
- pixeltable/__version__.py,sha256=l1gVhW4YjeNouBt4ti5Rxsd1ETc8Ls5nKRC8aMceXrM,120
3
- pixeltable/catalog/__init__.py,sha256=rQmjveID4bk6NI4Ql09lGsZ0K0HVE2l1yqKAveipHzc,558
4
- pixeltable/catalog/catalog.py,sha256=ExHm2bbAs_4-T6zq3ow2fQ5a9Zja6G3WzHoo3Qk0X40,59399
5
- pixeltable/catalog/column.py,sha256=v3SE6CQs_ZXTDkBeiJ7gu9sxBJD-6EbkjsB1TZvLSJI,11280
1
+ pixeltable/__init__.py,sha256=WHZxJNz7vYcx_z3ebEg-RF22lJmlkfeqF2gv6mnrM1A,1449
2
+ pixeltable/__version__.py,sha256=Tmdd4CrKsWN9gJkcXq-VR-egqtuKLYkyRkraXpi-2Kk,112
3
+ pixeltable/catalog/__init__.py,sha256=pI6ncW9nJadW9ht_Mt1BYiY9kNMOwGxAb6n4q1oV61w,635
4
+ pixeltable/catalog/catalog.py,sha256=pcZMrz9THSzjYusTlB0jTtrxOQzFT_xanONYTTpvhaU,73943
5
+ pixeltable/catalog/column.py,sha256=ujoVR8gxuJwqYfIVsRT14TJ9nUxuczKJBJ-q-2klHUw,11571
6
6
  pixeltable/catalog/dir.py,sha256=HFemOf67Nfw13EOpQsR_UgzP2L1w4LDfw2009DrSK0Y,2063
7
- pixeltable/catalog/globals.py,sha256=7fNUs67D18PZ1ZajcGz7KQOV6tuXEcYLSrePzgmDkRw,4036
8
- pixeltable/catalog/insertable_table.py,sha256=tl3tvMVPzi9A_SRARV6660NQnt8w09hNbOYZwMsSJw8,9195
7
+ pixeltable/catalog/globals.py,sha256=_qAs5g0Uxtw8oUjCdnRlZ9-_F6E2bm4OmLYb2Fg6YiU,8470
8
+ pixeltable/catalog/insertable_table.py,sha256=inBrPkcu08DAsYzFkq3I53eU-j7pqmlscoTZzEdaI54,9377
9
9
  pixeltable/catalog/named_function.py,sha256=vZ-j7P4HugWh9OmUzBMwyRYvO3tQn9jWyJz_1stPavU,1210
10
10
  pixeltable/catalog/path.py,sha256=gk8TIlO_7Jpji5mAN0dUNvHmvU0uneTHeB_qCTWnszQ,2529
11
- pixeltable/catalog/schema_object.py,sha256=B9Am6W1bWnAMFZ4qFTfYw6g8F0-q_2aezBB1bUHL_RY,1812
12
- pixeltable/catalog/table.py,sha256=JUiQPQP33486KiPVio8aBTibNGUYwulDgU1UfGDaprU,68609
13
- pixeltable/catalog/table_version.py,sha256=1dq2uq-I2E4d2SkBMA5MQFqkutPQCi-7HlNo24Trrjw,66775
14
- pixeltable/catalog/table_version_handle.py,sha256=E0iPIp2PUbE7r3WZzerBJ7fgKX3vaTWPnn6cOwKLF-A,2581
15
- pixeltable/catalog/table_version_path.py,sha256=2JEprCdDzCfr9dPxlMhsQ80jYqJ0-8uBNgNXt3D-bao,9042
16
- pixeltable/catalog/view.py,sha256=1UN-k0Ck0IWyy2Ae5b520L08GAfQ17L4FaZtS2bQ-TA,14786
17
- pixeltable/config.py,sha256=gnRI4G9GE7mQJDcMcn8JsEzYk8oKVfHB-BwoLRWnRDo,3971
18
- pixeltable/dataframe.py,sha256=L1lNcfHtxxRw_b8kgkmvcuYXQyniAzwLnI4ww79P5B4,60393
19
- pixeltable/env.py,sha256=BtBxkKgU3wi6_0rfor3k3Kx6SF660JH24sWprbBzB8w,36132
20
- pixeltable/exceptions.py,sha256=eI2f4oXqv678_fDOxeYOTPE_EF1CMX3pwCqtJvN8i7s,926
11
+ pixeltable/catalog/schema_object.py,sha256=jqOhZcI9QbT_EseDRQsVrp4pZ7jKB1wy4Sa-6aAvUCI,2004
12
+ pixeltable/catalog/table.py,sha256=SZohsmgrjcdOCS_xTvkZXzFPTSfHuXE3bQBsDhyFHSU,75618
13
+ pixeltable/catalog/table_version.py,sha256=EWB-49ce8Sm9DNaSGTxZohr2IecyzAhf9c6Bm4zQtOc,67018
14
+ pixeltable/catalog/table_version_handle.py,sha256=FTPRqcGY-h-POcWyZbd9b8P2D5zIw5OSUvwF_dbyCGo,3608
15
+ pixeltable/catalog/table_version_path.py,sha256=uRATYbAN0OXEkW1GZEC4hZulzvh8IJRwaN66ifUTJfw,9787
16
+ pixeltable/catalog/view.py,sha256=oo1JU5dtz3tasXZm3FkbfZqwyCc9xgdIE9hOqh5tRy4,14677
17
+ pixeltable/config.py,sha256=HIAyV3UGlcuQnHofKsid7wup518q_WfN6G-KB4yu_3g,4280
18
+ pixeltable/dataframe.py,sha256=dTpjM72Cj2cYMo0_HH2BJ6P3s9rQAF4suuL413BDyJw,60673
19
+ pixeltable/env.py,sha256=I8rvQQjvHB68rYCoSurR4pjn5qm6EvSwRL1CblUVPWs,35625
20
+ pixeltable/exceptions.py,sha256=Gm8d3TL2iiv6Pj2DLd29wp_j41qNBhxXL9iTQnL4Nk4,1116
21
21
  pixeltable/exec/__init__.py,sha256=hQvj4ra4ubxu94qyuCBTHKsuYGzundkTTluOTIb5Bx8,524
22
22
  pixeltable/exec/aggregation_node.py,sha256=HqzISO1nv7_DFyqjZLRkjtbDJl9fIEto1i6Kh5ru8vA,4498
23
23
  pixeltable/exec/cache_prefetch_node.py,sha256=GOa70eJDFY3FQV3VvJOrUVI8LFvro-r-V6sh3w-eJAc,12130
24
24
  pixeltable/exec/component_iteration_node.py,sha256=FZszWHrzsjHxCbUTwXtJIlgQqgYtvKZB6QWiDGkfIbs,4757
25
25
  pixeltable/exec/data_row_batch.py,sha256=EAB15JRhXbWIe91x1J5N5lFiMXzjB8NGTFjZsBDSbf8,3393
26
26
  pixeltable/exec/exec_context.py,sha256=jKeLStfkjwCKKAooC-7a7qZUnZU5O0_JQhanhVerV9c,984
27
- pixeltable/exec/exec_node.py,sha256=WIN1sBEBNS7TlBk5QpHsDUCZUUdcvs6Os_Bxq2HoWdo,4077
27
+ pixeltable/exec/exec_node.py,sha256=MsuCO7nCpmqfuNxTNKsz36sJVDrR-o-0-3S2FcXLwvM,4237
28
28
  pixeltable/exec/expr_eval/__init__.py,sha256=sQThSEByK_DLfB-_-18RFhpARx49cSXYEkpCDyi0vQI,61
29
29
  pixeltable/exec/expr_eval/evaluators.py,sha256=-6s_y29Wh8p35SVKkXtnA0NkzcHVw1Z8PgHGiFrMsqs,17135
30
- pixeltable/exec/expr_eval/expr_eval_node.py,sha256=ABkC2yAcMSCtQ7AvNAn6rfj3AMscVzezttKSs1ExNhw,18972
30
+ pixeltable/exec/expr_eval/expr_eval_node.py,sha256=klPhvsug91GiPIHkwcTj1ympxsoj8nbNHzkzkC-NR88,18953
31
31
  pixeltable/exec/expr_eval/globals.py,sha256=fFrj2O53TgHDfVF8dgnyn1fPLi4ZHQuylewf5aHMwYk,7752
32
32
  pixeltable/exec/expr_eval/row_buffer.py,sha256=YY0thdlMNNReEOTyPp36xKPeMeXSZ0VrI9bJsXgo7sU,2744
33
33
  pixeltable/exec/expr_eval/schedulers.py,sha256=tAvCQKa1q0x7y7cdnGcTGbeku8QcoKH1GkgSm8ktOnM,17000
34
34
  pixeltable/exec/in_memory_data_node.py,sha256=vmxD2Jwn15Wjkf_3wufr35SPjb60H_I4zpUKaO1Zo_s,3592
35
35
  pixeltable/exec/row_update_node.py,sha256=zU0eSyn81-vRrjAMOadRqU8luTshnPUtIbS7npyLBKY,2798
36
- pixeltable/exec/sql_node.py,sha256=MM9wD0AMXh11qJayhMgieCJ36hww-ym1p7kfS2y9-wM,26540
36
+ pixeltable/exec/sql_node.py,sha256=cMoBGPOFVmvL3UFjCKxhU3huJu_ko0PRr55-XhbF1i0,27572
37
37
  pixeltable/exprs/__init__.py,sha256=AxSMjKNavCT9F6vBaNR-nwX2iupAI5hbMb5hEj65Tfk,1096
38
38
  pixeltable/exprs/arithmetic_expr.py,sha256=sZPao0qdFWbrDx0eiAVxw1wGHJXZ5ZoCpQaScysBldE,7333
39
39
  pixeltable/exprs/array_slice.py,sha256=8Zv0E2RghdJi1Mbk0kKtOz2ccGQuXwLLb6R9v1jk7hA,2180
40
- pixeltable/exprs/column_property_ref.py,sha256=28UcsrMIoXmMy6DAgJ0GP6Vw4sYwXcspVySmKSvejaE,4178
41
- pixeltable/exprs/column_ref.py,sha256=LljuQiNYh6dQa_EV57ylPfNkQD-lfHBFTGDY8WlnnfY,14942
40
+ pixeltable/exprs/column_property_ref.py,sha256=zcp0tuW0m1czslIAo_ucGkmGAIWxeeCvWzXy1NyetgQ,3760
41
+ pixeltable/exprs/column_ref.py,sha256=0n6jcHeWd3dOaqrLPHQ6VjYDwgS0OMLqX3H0k60_-lE,15216
42
42
  pixeltable/exprs/comparison.py,sha256=lgaRx000ZaNH10A4hrtsi5XoZKE-CNEONGMi7jxJfcM,5133
43
43
  pixeltable/exprs/compound_predicate.py,sha256=vJVRVueAmaKnjiHCLWyh8wHgktzzK0DVqbOIQJgTjF8,3801
44
- pixeltable/exprs/data_row.py,sha256=8p0eWunvg_2ZH-e7Gtz_woxBAoizaCV2QtN87Is8_ys,11484
45
- pixeltable/exprs/expr.py,sha256=YFPL81s9N1_Obl15zpk_yYUvKqVoBT8fpAXhkYqgHLs,36000
44
+ pixeltable/exprs/data_row.py,sha256=4mW5Q56L53gLAX7xI0uBRW7a5Ax66Q0W9Bi-k_ZBoe8,11800
45
+ pixeltable/exprs/expr.py,sha256=uLEMuJzHwPW3hBIcsASnhjcPyGBkY8_8sFCqgRetKP0,36013
46
46
  pixeltable/exprs/expr_dict.py,sha256=2ZeZ0eACx3VrRNEOjipuT5WxOIzjXQ_DSip8NTH0KRo,1584
47
47
  pixeltable/exprs/expr_set.py,sha256=OlRTbHAAYH2fOEs1HE-8DIu7Z247xVfoT_9Y58GZoOQ,2559
48
48
  pixeltable/exprs/function_call.py,sha256=_PxrEACVyiihdQdmTiiSv5WkZfOXSQFcGO18wPueM_Y,21989
@@ -55,7 +55,7 @@ pixeltable/exprs/json_path.py,sha256=sFuDjfz8_rlea4TKd68CS4pQTUiLDi68YwsgcQRHffI
55
55
  pixeltable/exprs/literal.py,sha256=OCJL_pw_WKqx3bXMEwL6yNaKVAKDtGRzSZUFwucRxZI,4860
56
56
  pixeltable/exprs/method_ref.py,sha256=NNhJTGo7luZLh8EJdFIZAax9LiiqqDCEK1AwPmHip0w,2642
57
57
  pixeltable/exprs/object_ref.py,sha256=idYFcT27jv0BjtJT3paL37xDrZZc35_3eCJyQOIqdZU,1999
58
- pixeltable/exprs/row_builder.py,sha256=LL8q_8AthTqH8duWqKwdaS8DlvUsC8chclzQRR4MJAE,21150
58
+ pixeltable/exprs/row_builder.py,sha256=90pYDuHd1fbaqbriYwl9iz3ciilbUAg_dq7M3lRq1j4,22334
59
59
  pixeltable/exprs/rowid_ref.py,sha256=SCPsDx3R55wtK-ND2xQQdV823RdeTF5HTcQ76e40NOE,5186
60
60
  pixeltable/exprs/similarity_expr.py,sha256=i0UUnMSKKGXd3Uksu6FU2NvkfG0qzfzfi-GPy-LdutM,3688
61
61
  pixeltable/exprs/sql_element_cache.py,sha256=c7Q6vFK4xnf9vmcRYnXiAcwPBBwmw0dolftM4BwDO8c,1359
@@ -66,18 +66,19 @@ pixeltable/ext/__init__.py,sha256=UgDXWzGWiQIrwOuEvWTePLBcR2kecllPAE7gp-42Awg,45
66
66
  pixeltable/ext/functions/__init__.py,sha256=Ox3kUHn5IslVEmEKsjrHfkHDrUkmLl9RCO2YkrPJkgc,193
67
67
  pixeltable/ext/functions/whisperx.py,sha256=qda6kFQSvZTY2asfrYPwHb1cvSa03LbhJ-Wf9b7qPhw,2355
68
68
  pixeltable/ext/functions/yolox.py,sha256=dX22nMb-0n2hZi7WhZ1Y4LIpFk5loyeXXuSUcc2Fgrg,3724
69
- pixeltable/func/__init__.py,sha256=2BtyvXvFrLF0S5Qnmtg9S7dDSEVoBh5GDX6XFC25d7o,509
69
+ pixeltable/func/__init__.py,sha256=SQPtGr_9dZNyXzxaZQcP3oVLKnbbs4UqV6sg8XUQHxQ,535
70
70
  pixeltable/func/aggregate_function.py,sha256=5_MgqHAlMaacX2sPIHv_auTvYXtqR5MIZy_WqYQSdho,13264
71
71
  pixeltable/func/callable_function.py,sha256=g_pA-g631YcFGLix9PpHYfgjOeS2qF0Csm1VxX8fah0,9278
72
72
  pixeltable/func/expr_template_function.py,sha256=wEidKrOBTZkA3U1PAtG6-6RlDFiiRJszIG4zNOuPcNY,5940
73
73
  pixeltable/func/function.py,sha256=w1U3j8XNeE4ZZ-rKuG13aTa8YGFkWAXjalh4j29_-e4,23136
74
74
  pixeltable/func/function_registry.py,sha256=7AQ1bdF2DJbTRn9xx6s5cC_VHtCBXGt_GyJJEjJHcMw,12308
75
75
  pixeltable/func/globals.py,sha256=5Wo4GPxYgHRRk5nvV0h_lAthKSalxKvj5n1p-uMPR0U,1501
76
- pixeltable/func/query_template_function.py,sha256=25nvgadWgk16BU7X5uI7PvKfkoluJSuOqsAcY5AN-Yw,7915
76
+ pixeltable/func/mcp.py,sha256=P9M2w8cm7ad-XmAcf2ZThfWmD8W46De1spwX98bZL4Y,2861
77
+ pixeltable/func/query_template_function.py,sha256=0wCcU06bv9KKJRlOsoLg8-vVNSLIYpKDCdYkUV7WShY,8040
77
78
  pixeltable/func/signature.py,sha256=0PI6xdhLgwy9-GMkzkm7GlsBnsNMiS9aoNI9LWXwvN0,13700
78
- pixeltable/func/tools.py,sha256=bmHnnd9lXkQ8sYHp5RSMF56NimSTE3uhG2xbIxs4Np4,5726
79
- pixeltable/func/udf.py,sha256=qQfaX1O3ZhUvSgiNnitW7nRKnZFJ5yu_Fj9ioqQgjqg,13219
80
- pixeltable/functions/__init__.py,sha256=x_ZodeEtayD2XDjlDZE4L_QTzajF6riftIc5P4ZjEiY,578
79
+ pixeltable/func/tools.py,sha256=hKmQFvfpBvtLcItPRpqAmqt_tDg6latwyfv5FXBofBc,6074
80
+ pixeltable/func/udf.py,sha256=6tKpMt37t3BmXwRyA5fFAd6OM4D5EPEd2KuAr7DQhr0,13231
81
+ pixeltable/functions/__init__.py,sha256=Akk6Nk-rpz2D_V4kJTfyP56xnNbCz3EtxVAuwLoiysA,588
81
82
  pixeltable/functions/anthropic.py,sha256=G2E0sH5vP933eZZxhz1tOByy5cg6N2XPvhSqIBzqufo,8782
82
83
  pixeltable/functions/audio.py,sha256=7bsm4igQEW7RYSrSevwqaUOqyEnvBbPbJ8c-VknDl1E,657
83
84
  pixeltable/functions/bedrock.py,sha256=lTCFHjYunF3minBGWcjXR90yJ8resFjXr4niyKhfxms,4217
@@ -86,37 +87,38 @@ pixeltable/functions/deepseek.py,sha256=IAo2e_DhkM0A5NrskxuPQUGYzIYAl4do_mdO1Qc3
86
87
  pixeltable/functions/fireworks.py,sha256=q7eWlYfiWbA0d9r3CB_NAe1fw3q-Z7qsw2gyGJNgWLQ,4786
87
88
  pixeltable/functions/gemini.py,sha256=ZsbySkoMdOgZEUfFUccDbIdrbLb6DGRxzD88fHW-cRI,8317
88
89
  pixeltable/functions/globals.py,sha256=ZXBV2LPXT2-yQYHHE7q8N1WdAr0WxiIO1ax0qwxhmK8,5118
89
- pixeltable/functions/huggingface.py,sha256=KM1OH0Jt6XWF2jfpHb6rGhi1mV-AQNYAsHAyQfzW4qw,20560
90
+ pixeltable/functions/groq.py,sha256=FpR_LJpfZfzyhEvoBMMbQpQ-VQSRzBsS9U21qaINwww,3593
91
+ pixeltable/functions/huggingface.py,sha256=cJyf86qMcvivkGGNduNHAvh_idI-e4wJm0Zje1KJ2vQ,20611
90
92
  pixeltable/functions/image.py,sha256=IKXljMma-uU88efptC3F4aywau7DYcD-Nqd3YpmRNRw,13971
91
93
  pixeltable/functions/json.py,sha256=d7-AvwytUQtQYF_JnWJkptT_Yq0NgMpWfVk-m3U6qTY,807
92
94
  pixeltable/functions/llama_cpp.py,sha256=1QB4vQ7J4Za1mL93bRIBXgokNtpzzYr_QU6KF27i9xo,3919
93
95
  pixeltable/functions/math.py,sha256=eZEFjXxNHDHjcCsOMhzfNbJthTsmtNxtSFV8AEeRIfM,4979
94
- pixeltable/functions/mistralai.py,sha256=PTXQegC2LO5Pw0zXBO_SVV7I2c5qBvqVVgfm_mK1ir0,5845
96
+ pixeltable/functions/mistralai.py,sha256=Fk52mfWUfxVy-yCxhH6wrGS7nLLSiOOrWxbTkkiQ-O8,5542
95
97
  pixeltable/functions/ollama.py,sha256=4-6h9Foq_7Ut7JtEHGkeg1KbuKaFywSuMrKiw0xAyCA,4231
96
- pixeltable/functions/openai.py,sha256=kzi8HApD971O54Xl82G0jI7n0E2ui476kV1wAKObx88,27768
97
- pixeltable/functions/replicate.py,sha256=SLMPNi44QMa16TVTImZRkNMXXyRZ0mmpnK6P5uXQE0k,2467
98
+ pixeltable/functions/openai.py,sha256=SxhYrL3vgIfjzwCPnjR6yoaNr7BbFwpGy7Su1FSY7G4,27713
99
+ pixeltable/functions/replicate.py,sha256=sPvRGr0j0kCDc6Vz3mPUioFflApijukvZWJJUO2bqIQ,2429
98
100
  pixeltable/functions/string.py,sha256=LdBNOna5PUSPmM5VlJ_qhmwzyFhumW0k6Dvx2rXSZtc,25356
99
101
  pixeltable/functions/timestamp.py,sha256=0zp4urJagCcNLfJE0ltTCft-J9qs2C716TmRngKYaa0,9171
100
102
  pixeltable/functions/together.py,sha256=A8J19BXywyWQ6a2_n05-8uIG5jquOBGqPmW3mb-NrIc,8842
101
- pixeltable/functions/util.py,sha256=lVya13gcao8T34OGX7zy1cglQPNwaBbSBw57bVPyHNs,745
103
+ pixeltable/functions/util.py,sha256=uQNkyBSkTVMe1wbUI2Q0nz-mM3qPVTF86yK8c9OFIcE,954
102
104
  pixeltable/functions/video.py,sha256=jS4YhMofD448YhGtI6ZXBAkeGw_AYYQTN0AbgHh_hok,6933
103
105
  pixeltable/functions/vision.py,sha256=_a0wY3akkVhWnnxlq__1VzSLylytlNadpNOOPOwSfLk,15393
104
106
  pixeltable/functions/whisper.py,sha256=c9E6trhc2UcShVaGaEBCUEpArke1ql3MV5We0qSgmuU,2960
105
- pixeltable/globals.py,sha256=cM3uKvDJWIs1I9A8rzXaZsKCDSaLBh7KVb1lakQqGzk,32377
107
+ pixeltable/globals.py,sha256=cQUzDiYzDftRhX1jwi1hi6OYx0zlDAMr04nShq75Knk,32226
106
108
  pixeltable/index/__init__.py,sha256=97aFuxiP_oz1ldn5iq8IWApkOV8XG6ZIBW5-9rkS0vM,122
107
109
  pixeltable/index/base.py,sha256=200s7v3Zy810bRlbSAYzxxaEjVssl6r8esTHiSvWRwQ,1704
108
110
  pixeltable/index/btree.py,sha256=8B06D67ay0DFUtEBC5q4bLjxMq7ILpKyyoLAiSaamzA,2503
109
111
  pixeltable/index/embedding_index.py,sha256=B_k_3UJmSv7t2ljUg8GC_D4t1jc03PVsTAvxqiTmHBA,11754
110
112
  pixeltable/io/__init__.py,sha256=Yjq13pBCBoaZv-OkIY2XSusVOC5b6cB5C6NbgJq5H1g,620
111
113
  pixeltable/io/datarows.py,sha256=p1UGxQOTjqI6kgQNAa3aj8TkylcNDtaGBTorOg_Pk84,6088
112
- pixeltable/io/external_store.py,sha256=0ayZybxKRc600n-W7-3kEo0n_6LjAkIz-B4kLoPyukc,15554
114
+ pixeltable/io/external_store.py,sha256=cs-_pbRpINTpVMoMRmaoHdYjrjoW--6MyYAG7aF_Efc,16515
113
115
  pixeltable/io/fiftyone.py,sha256=v0r28bIk2I0TRP5DfVHtBIUa4DpIJDK5sgExxOmHZ_w,6882
114
- pixeltable/io/globals.py,sha256=Z8ww-Pcm59ql1tvame8z0Mu1thIy5BPbW-TswGRXt4s,11368
116
+ pixeltable/io/globals.py,sha256=hxiwdCrRMGZ0IMPtleVkiqnthwHG-oemDV10Kf1Lbnk,11362
115
117
  pixeltable/io/hf_datasets.py,sha256=gWyBH_0iFvxcrrxMY9_W399ZRcNDCmWFOAMmb1apnY0,5246
116
- pixeltable/io/label_studio.py,sha256=rEJCN4hmONRMXVGkj1Cq_E-wowcvg6d7KToXxheOh2w,31242
118
+ pixeltable/io/label_studio.py,sha256=rcsOp45c5CyY5ArkKJz_jyE40edpFPgU_8ZDaV2UrgQ,31423
117
119
  pixeltable/io/pandas.py,sha256=AbOeRDlA4MvUvianSKixsU-x-64nasPWw4HCHD6emz4,8981
118
120
  pixeltable/io/parquet.py,sha256=-cxyy9wMRzGFDJWhUIjACfQMyAmajyoFcTXSkB8qESE,7818
119
- pixeltable/io/table_data_conduit.py,sha256=oag9BDAjz6CZCCvZWuk3FnBNWb_m01bUzvbM0BW8tPI,21997
121
+ pixeltable/io/table_data_conduit.py,sha256=8SEcOPTgPiKHqlDp0rvGcPOF4v8jRX5TwHwfi5MHYt4,22003
120
122
  pixeltable/io/utils.py,sha256=YMfhpqMitWz1PhXJGkCNOgNtEM1AZ55S0zXVhljC5kY,4260
121
123
  pixeltable/iterators/__init__.py,sha256=bU4EmbX85J1URmRw6G71f2I77b1ctqngEOwDmRB3T0w,455
122
124
  pixeltable/iterators/audio.py,sha256=wSVGdL5GeO3uY_lU-pNlY49E5dExIaJWY6oaXm-MnSU,9150
@@ -125,7 +127,7 @@ pixeltable/iterators/document.py,sha256=wJYSnzusJFaxipv5y0uQw-surN9fFz0Aq-s7w_l_
125
127
  pixeltable/iterators/image.py,sha256=nWm-03CxNvHRdTr8U6PvWEnEiquqIQNG5rB-3Y44Mm4,3440
126
128
  pixeltable/iterators/string.py,sha256=URj5edWp-CsorjN_8nnfWGvtIFs_Zh4VPm6htlJbFkU,1257
127
129
  pixeltable/iterators/video.py,sha256=L5S1YPmT_zM11vW9fK6d5nQpUvHVewQWmfDmy4BD45E,9134
128
- pixeltable/metadata/__init__.py,sha256=fZ3HaB-L8lHJdrtmKqfIJJlvYG0CqzzxKFRrh9IWoa0,3154
130
+ pixeltable/metadata/__init__.py,sha256=iDL2NJXvrJoc6pJ7xWLaQLZnzXt58UfnPRZw0U3Ci2Q,3154
129
131
  pixeltable/metadata/converters/convert_10.py,sha256=myYIo1DyccnsQUxDKG6mafnU5ge_EhZpHg_pesKBoK4,708
130
132
  pixeltable/metadata/converters/convert_12.py,sha256=Ci-qyZW1gqci-8wnjeOB5afdq7KTuN-hVSV9OqSPx8g,162
131
133
  pixeltable/metadata/converters/convert_13.py,sha256=B-_EkL0pSl1mAiv6DymeUAyBQUcYcV1qDdNz3Q359kc,1369
@@ -152,16 +154,19 @@ pixeltable/metadata/converters/convert_33.py,sha256=ZZV3FTyyouBM1eNymXxfHV-Oqmgu
152
154
  pixeltable/metadata/converters/convert_34.py,sha256=1hi7m49CMzHRD25rrePS-SMCsZ-4opzDhY0JqU8Jzw4,690
153
155
  pixeltable/metadata/converters/convert_35.py,sha256=c88qft0RFQbdFIE_PZRHMjeku1r5HCLN7wrvndQSXdI,266
154
156
  pixeltable/metadata/converters/convert_36.py,sha256=g1rhZhAYfZpAwUgE3D1aipIR4RNvikhbKcrnBJzm0wM,1215
157
+ pixeltable/metadata/converters/convert_37.py,sha256=IVZGtKFaaYMGBs39V_H_okWvpxxadTUWqxoln0cNeQI,392
158
+ pixeltable/metadata/converters/convert_38.py,sha256=YyNyocwzzdJRcI0YSCo_70Q4hSk63235iE4IxhwSEzs,1169
155
159
  pixeltable/metadata/converters/util.py,sha256=95pfg9amEOmhho32PIbNYnqagVIN9adIcLXxB6zSYDY,7527
156
- pixeltable/metadata/notes.py,sha256=7HKk4yQLh8zaTVgv4pGXvpn3PoF5x7OFO8YSog5TLHI,1408
157
- pixeltable/metadata/schema.py,sha256=5r-loBIyYiZdkbszrLdn0XktOgDh96UVp_GScmm-14g,11489
158
- pixeltable/plan.py,sha256=bL6B32J63P1QtGjLhwwcfbh2SrSEeuyb1Zh6txdKQ6Q,52136
160
+ pixeltable/metadata/notes.py,sha256=HXskIW7HqbVXqhzZm0VTZn2q1RW6Qk0P5mpifmBS_9w,1485
161
+ pixeltable/metadata/schema.py,sha256=l8ZGcASiTrtaMW9jPDMtZmoT2BamGIDhujNUVgdag5E,11720
162
+ pixeltable/metadata/utils.py,sha256=NJQXWhhK1hdOZ4H3hh9N0mqbl-I9JqMUqrfA6OWLflE,2682
163
+ pixeltable/plan.py,sha256=K_qO-BnSZOShGr9uGRsiCLPXJOeOzh5eGeODrqviMlQ,49053
159
164
  pixeltable/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
165
  pixeltable/share/__init__.py,sha256=AtR4nS6YkfkFRkXA-zZXFTK5pSQjHry8MnxdVLUk5SA,68
161
- pixeltable/share/packager.py,sha256=udwsorQDWX0N9eHcPHlT5xyAeUxGvT7DBnsFuq8PALM,32149
166
+ pixeltable/share/packager.py,sha256=wqOuuUXOor6YLzR9oZSYuJmdbkfBetZB3NkndsqbX3I,32172
162
167
  pixeltable/share/publish.py,sha256=U6PzOUYiZaPu-sVNjh2nN8qzY2-uMsYeTwQCCuGk7Jg,6537
163
- pixeltable/store.py,sha256=2tfMgJNVVbGShgAKghGAIFMZ-ViJHE7N9kWd2ugbi2A,24691
164
- pixeltable/type_system.py,sha256=DSrof2NgKhBzvt7pbDNrGlZ3rkkDJ7MQsQ9rqk9N9pA,53988
168
+ pixeltable/store.py,sha256=v0TI_w8NemhV-njrsj7IH8PXE4gz4mjjHesWoFNIQf4,24402
169
+ pixeltable/type_system.py,sha256=P-ykQDPKbMZHtkozdrcBBpuX60Zc1nzwjwzSwlxIzPg,55319
165
170
  pixeltable/utils/__init__.py,sha256=Pwgu-Sg1XkxzdCZ4ZhWP77UgLP3tnQsyCKaUJLF4ajo,1741
166
171
  pixeltable/utils/arrow.py,sha256=74wIy58rDYZJBVQ1g85NqzFyiQBvEQhnJ0Gi82iZ0dw,6421
167
172
  pixeltable/utils/coco.py,sha256=Y1DWVYguZD4VhKyf7JruYfHWvhkJLq39fzbiSm5cdyY,7304
@@ -179,11 +184,10 @@ pixeltable/utils/iceberg.py,sha256=L_s9G9NMIGMQdRHtNkks6ntTVW4DKKAw97R9gRmtw5s,5
179
184
  pixeltable/utils/media_store.py,sha256=Dhsnj1ZPRSX0iyGOu4JU4pC3fvSBd7sQpruVHqzKm7A,3089
180
185
  pixeltable/utils/pytorch.py,sha256=564VHRdDHwD9h0v5lBHEDTJ8c6zx8wuzWYx8ZYjBxlI,3621
181
186
  pixeltable/utils/s3.py,sha256=pxip2MlCqd2Qon2dzJXzfxvwtZyc-BAsjAnLL4J_OXY,587
182
- pixeltable/utils/sample.py,sha256=Pj8oSZw0WsdASD1BpTtKiWP4cwef7KQqVAfIFKlJNxA,643
183
187
  pixeltable/utils/sql.py,sha256=Sa4Lh-VGe8GToU5W7DRiWf2lMl9B6saPqemiT0ZdHEc,806
184
188
  pixeltable/utils/transactional_directory.py,sha256=OFKmu90oP7KwBAljwjnzP_w8euGdAXob3y4Nx9SCNHA,1357
185
- pixeltable-0.4.0rc3.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
186
- pixeltable-0.4.0rc3.dist-info/METADATA,sha256=iRhLy9JQXIsjwIOKQnvJBQCJuGfh_Xc56W3dcgWGs-A,20580
187
- pixeltable-0.4.0rc3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
188
- pixeltable-0.4.0rc3.dist-info/entry_points.txt,sha256=ToOd-pRgG7AitEBgYoBCRRB4-KVDQ0pj_9T4a1LgwA4,97
189
- pixeltable-0.4.0rc3.dist-info/RECORD,,
189
+ pixeltable-0.4.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
190
+ pixeltable-0.4.2.dist-info/METADATA,sha256=RFiialgbsCHPt69fJ4aRgUpLcL1XGo47icfCrzJiMCo,20577
191
+ pixeltable-0.4.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
192
+ pixeltable-0.4.2.dist-info/entry_points.txt,sha256=ToOd-pRgG7AitEBgYoBCRRB4-KVDQ0pj_9T4a1LgwA4,97
193
+ pixeltable-0.4.2.dist-info/RECORD,,
@@ -1,25 +0,0 @@
1
- import sqlalchemy as sql
2
-
3
- from pixeltable.func.udf import udf
4
-
5
-
6
- @udf
7
- def sample_key(seed: int, *key_fields: int) -> str:
8
- """
9
- Create a sample key from the given seed and key fields.
10
-
11
- Args:
12
- seed: The seed value.
13
- rowids: The rowids to include in the sample key.
14
-
15
- Returns:
16
- A string key for each row
17
- """
18
- raise NotImplementedError('SampleKey creation is not implemented in python.')
19
-
20
-
21
- @sample_key.to_sql
22
- def _(seed: sql.ColumnElement, *key_fields: sql.ColumnElement) -> sql.ColumnElement:
23
- from pixeltable.exec.sql_node import SqlSampleNode
24
-
25
- return SqlSampleNode.key_sql_expr(seed, key_fields)