pixeltable 0.2.5__tar.gz → 0.2.6__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 pixeltable might be problematic. Click here for more details.

Files changed (153) hide show
  1. {pixeltable-0.2.5 → pixeltable-0.2.6}/PKG-INFO +10 -7
  2. {pixeltable-0.2.5 → pixeltable-0.2.6}/README.md +3 -3
  3. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/__init__.py +18 -9
  4. pixeltable-0.2.6/pixeltable/__version__.py +3 -0
  5. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/catalog/column.py +9 -5
  6. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/catalog/insertable_table.py +0 -2
  7. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/catalog/table.py +16 -8
  8. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/catalog/table_version.py +3 -2
  9. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/dataframe.py +184 -110
  10. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/env.py +69 -18
  11. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exec/__init__.py +2 -1
  12. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exec/data_row_batch.py +6 -7
  13. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exec/expr_eval_node.py +28 -28
  14. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exec/sql_scan_node.py +7 -6
  15. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/__init__.py +4 -3
  16. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/column_ref.py +9 -0
  17. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/expr.py +15 -7
  18. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/function_call.py +17 -15
  19. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/image_member_access.py +9 -28
  20. pixeltable-0.2.6/pixeltable/exprs/in_predicate.py +96 -0
  21. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/inline_array.py +13 -11
  22. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/inline_dict.py +15 -13
  23. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/row_builder.py +7 -1
  24. pixeltable-0.2.6/pixeltable/exprs/similarity_expr.py +65 -0
  25. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/func/__init__.py +0 -2
  26. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/func/aggregate_function.py +3 -0
  27. pixeltable-0.2.6/pixeltable/func/callable_function.py +113 -0
  28. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/func/expr_template_function.py +11 -2
  29. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/func/function.py +35 -4
  30. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/func/signature.py +5 -15
  31. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/func/udf.py +6 -10
  32. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/functions/huggingface.py +23 -4
  33. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/functions/openai.py +34 -1
  34. pixeltable-0.2.6/pixeltable/functions/pil/image.py +147 -0
  35. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/functions/together.py +21 -0
  36. pixeltable-0.2.6/pixeltable/globals.py +425 -0
  37. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/index/base.py +3 -1
  38. pixeltable-0.2.6/pixeltable/index/embedding_index.py +168 -0
  39. pixeltable-0.2.6/pixeltable/io/__init__.py +3 -0
  40. {pixeltable-0.2.5/pixeltable/utils → pixeltable-0.2.6/pixeltable/io}/hf_datasets.py +48 -17
  41. pixeltable-0.2.6/pixeltable/io/pandas.py +148 -0
  42. {pixeltable-0.2.5/pixeltable/utils → pixeltable-0.2.6/pixeltable/io}/parquet.py +58 -33
  43. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/iterators/__init__.py +1 -1
  44. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/iterators/base.py +4 -0
  45. pixeltable-0.2.6/pixeltable/iterators/document.py +432 -0
  46. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/iterators/video.py +8 -9
  47. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/metadata/__init__.py +7 -3
  48. pixeltable-0.2.6/pixeltable/metadata/converters/convert_12.py +3 -0
  49. pixeltable-0.2.6/pixeltable/metadata/converters/convert_13.py +41 -0
  50. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/plan.py +2 -19
  51. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/store.py +2 -2
  52. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/tool/create_test_db_dump.py +32 -13
  53. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/type_system.py +13 -54
  54. pixeltable-0.2.6/pixeltable/utils/documents.py +69 -0
  55. pixeltable-0.2.6/pixeltable/utils/http_server.py +70 -0
  56. {pixeltable-0.2.5 → pixeltable-0.2.6}/pyproject.toml +27 -11
  57. pixeltable-0.2.5/pixeltable/client.py +0 -600
  58. pixeltable-0.2.5/pixeltable/exprs/image_similarity_predicate.py +0 -58
  59. pixeltable-0.2.5/pixeltable/func/batched_function.py +0 -53
  60. pixeltable-0.2.5/pixeltable/func/callable_function.py +0 -69
  61. pixeltable-0.2.5/pixeltable/functions/pil/image.py +0 -150
  62. pixeltable-0.2.5/pixeltable/index/embedding_index.py +0 -95
  63. pixeltable-0.2.5/pixeltable/iterators/document.py +0 -311
  64. pixeltable-0.2.5/pixeltable/tests/conftest.py +0 -171
  65. pixeltable-0.2.5/pixeltable/tests/ext/test_yolox.py +0 -21
  66. pixeltable-0.2.5/pixeltable/tests/functions/test_fireworks.py +0 -43
  67. pixeltable-0.2.5/pixeltable/tests/functions/test_functions.py +0 -60
  68. pixeltable-0.2.5/pixeltable/tests/functions/test_huggingface.py +0 -158
  69. pixeltable-0.2.5/pixeltable/tests/functions/test_openai.py +0 -162
  70. pixeltable-0.2.5/pixeltable/tests/functions/test_together.py +0 -112
  71. pixeltable-0.2.5/pixeltable/tests/test_audio.py +0 -65
  72. pixeltable-0.2.5/pixeltable/tests/test_catalog.py +0 -27
  73. pixeltable-0.2.5/pixeltable/tests/test_client.py +0 -21
  74. pixeltable-0.2.5/pixeltable/tests/test_component_view.py +0 -379
  75. pixeltable-0.2.5/pixeltable/tests/test_dataframe.py +0 -440
  76. pixeltable-0.2.5/pixeltable/tests/test_dirs.py +0 -107
  77. pixeltable-0.2.5/pixeltable/tests/test_document.py +0 -120
  78. pixeltable-0.2.5/pixeltable/tests/test_exprs.py +0 -802
  79. pixeltable-0.2.5/pixeltable/tests/test_function.py +0 -332
  80. pixeltable-0.2.5/pixeltable/tests/test_index.py +0 -138
  81. pixeltable-0.2.5/pixeltable/tests/test_migration.py +0 -44
  82. pixeltable-0.2.5/pixeltable/tests/test_nos.py +0 -54
  83. pixeltable-0.2.5/pixeltable/tests/test_snapshot.py +0 -231
  84. pixeltable-0.2.5/pixeltable/tests/test_table.py +0 -1343
  85. pixeltable-0.2.5/pixeltable/tests/test_transactional_directory.py +0 -42
  86. pixeltable-0.2.5/pixeltable/tests/test_types.py +0 -52
  87. pixeltable-0.2.5/pixeltable/tests/test_video.py +0 -159
  88. pixeltable-0.2.5/pixeltable/tests/test_view.py +0 -535
  89. pixeltable-0.2.5/pixeltable/tests/utils.py +0 -442
  90. pixeltable-0.2.5/pixeltable/utils/documents.py +0 -39
  91. {pixeltable-0.2.5 → pixeltable-0.2.6}/LICENSE +0 -0
  92. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/catalog/__init__.py +0 -0
  93. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/catalog/catalog.py +0 -0
  94. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/catalog/dir.py +0 -0
  95. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/catalog/globals.py +0 -0
  96. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/catalog/named_function.py +0 -0
  97. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/catalog/path.py +0 -0
  98. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/catalog/path_dict.py +0 -0
  99. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/catalog/schema_object.py +0 -0
  100. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/catalog/table_version_path.py +0 -0
  101. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/catalog/view.py +0 -0
  102. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exceptions.py +0 -0
  103. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exec/aggregation_node.py +0 -0
  104. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exec/cache_prefetch_node.py +0 -0
  105. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exec/component_iteration_node.py +0 -0
  106. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exec/exec_context.py +0 -0
  107. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exec/exec_node.py +0 -0
  108. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exec/in_memory_data_node.py +0 -0
  109. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exec/media_validation_node.py +0 -0
  110. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/arithmetic_expr.py +0 -0
  111. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/array_slice.py +0 -0
  112. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/column_property_ref.py +0 -0
  113. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/comparison.py +0 -0
  114. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/compound_predicate.py +0 -0
  115. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/data_row.py +0 -0
  116. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/expr_set.py +0 -0
  117. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/globals.py +0 -0
  118. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/is_null.py +0 -0
  119. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/json_mapper.py +0 -0
  120. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/json_path.py +0 -0
  121. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/literal.py +0 -0
  122. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/object_ref.py +0 -0
  123. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/predicate.py +0 -0
  124. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/rowid_ref.py +0 -0
  125. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/type_cast.py +0 -0
  126. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/exprs/variable.py +0 -0
  127. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/ext/__init__.py +0 -0
  128. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/ext/functions/yolox.py +0 -0
  129. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/func/function_registry.py +0 -0
  130. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/func/globals.py +0 -0
  131. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/func/nos_function.py +0 -0
  132. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/functions/__init__.py +0 -0
  133. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/functions/eval.py +0 -0
  134. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/functions/fireworks.py +0 -0
  135. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/functions/image.py +0 -0
  136. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/functions/string.py +0 -0
  137. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/functions/util.py +0 -0
  138. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/functions/video.py +0 -0
  139. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/index/__init__.py +0 -0
  140. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/metadata/converters/convert_10.py +0 -0
  141. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/metadata/schema.py +0 -0
  142. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/tool/create_test_video.py +0 -0
  143. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/utils/__init__.py +0 -0
  144. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/utils/arrow.py +0 -0
  145. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/utils/clip.py +0 -0
  146. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/utils/coco.py +0 -0
  147. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/utils/filecache.py +0 -0
  148. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/utils/help.py +0 -0
  149. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/utils/media_store.py +0 -0
  150. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/utils/pytorch.py +0 -0
  151. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/utils/s3.py +0 -0
  152. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/utils/sql.py +0 -0
  153. {pixeltable-0.2.5 → pixeltable-0.2.6}/pixeltable/utils/transactional_directory.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pixeltable
3
- Version: 0.2.5
3
+ Version: 0.2.6
4
4
  Summary: Pixeltable: The Multimodal AI Data Plane
5
5
  Author: Marcel Kornacker
6
6
  Author-email: marcelk@gmail.com
@@ -13,19 +13,22 @@ Classifier: Programming Language :: Python :: 3.12
13
13
  Requires-Dist: av (>=10.0.0)
14
14
  Requires-Dist: beautifulsoup4 (>=4.0.0,<5.0.0)
15
15
  Requires-Dist: cloudpickle (>=2.2.1,<3.0.0)
16
+ Requires-Dist: ftfy (>=6.2.0,<7.0.0)
16
17
  Requires-Dist: jinja2 (>=3.1.3,<4.0.0)
17
18
  Requires-Dist: jmespath (>=1.0.1,<2.0.0)
18
- Requires-Dist: numpy (>=1.26)
19
+ Requires-Dist: mistune (>=3.0.2,<4.0.0)
20
+ Requires-Dist: numpy (>=1.25)
19
21
  Requires-Dist: opencv-python-headless (>=4.7.0.68,<5.0.0.0)
20
22
  Requires-Dist: pandas (>=2.0,<3.0)
21
23
  Requires-Dist: pgserver (==0.1.2)
22
24
  Requires-Dist: pgvector (>=0.2.1,<0.3.0)
23
- Requires-Dist: pillow (>=10.0)
25
+ Requires-Dist: pillow (>=9.3.0)
24
26
  Requires-Dist: psutil (>=5.9.5,<6.0.0)
25
27
  Requires-Dist: psycopg2-binary (>=2.9.5,<3.0.0)
28
+ Requires-Dist: pymupdf (>=1.24.1,<2.0.0)
26
29
  Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
27
- Requires-Dist: regex (>=2022.10.31,<2023.0.0)
28
30
  Requires-Dist: requests (>=2.31.0,<3.0.0)
31
+ Requires-Dist: setuptools (==69.1.1)
29
32
  Requires-Dist: sqlalchemy-utils (>=0.41.1,<0.42.0)
30
33
  Requires-Dist: sqlalchemy[mypy] (>=2.0.23,<3.0.0)
31
34
  Requires-Dist: tenacity (>=8.2,<9.0)
@@ -33,13 +36,13 @@ Requires-Dist: tqdm (>=4.64.1,<5.0.0)
33
36
  Description-Content-Type: text/markdown
34
37
 
35
38
  <div align="center">
36
- <img src="docs/pixeltable-banner.png" width="45%"/>
39
+ <img src="https://raw.githubusercontent.com/pixeltable/pixeltable/master/docs/pixeltable-banner.png" alt="Pixeltable" width="45%" />
37
40
 
38
41
  # Unifying Data, Models, and Orchestration for AI Products
39
42
 
40
43
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
41
44
  &nbsp;&nbsp;
42
- ![pytest status](https://github.com/pixeltable/pixeltable/actions/workflows/pytest.yml/badge.svg)
45
+ [![pytest status](https://github.com/pixeltable/pixeltable/actions/workflows/pytest.yml/badge.svg)](https://github.com/pixeltable/pixeltable/actions)
43
46
 
44
47
  [Installation](https://pixeltable.github.io/pixeltable/getting-started/) | [Documentation](https://pixeltable.github.io/pixeltable/)
45
48
  </div>
@@ -75,7 +78,7 @@ To verify that it's working:
75
78
 
76
79
  ```
77
80
  import pixeltable as pxt
78
- cl = pxt.Client()
81
+ pxt.init()
79
82
  ```
80
83
 
81
84
  For more detailed installation instructions, see the
@@ -1,11 +1,11 @@
1
1
  <div align="center">
2
- <img src="docs/pixeltable-banner.png" width="45%"/>
2
+ <img src="https://raw.githubusercontent.com/pixeltable/pixeltable/master/docs/pixeltable-banner.png" alt="Pixeltable" width="45%" />
3
3
 
4
4
  # Unifying Data, Models, and Orchestration for AI Products
5
5
 
6
6
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
7
7
  &nbsp;&nbsp;
8
- ![pytest status](https://github.com/pixeltable/pixeltable/actions/workflows/pytest.yml/badge.svg)
8
+ [![pytest status](https://github.com/pixeltable/pixeltable/actions/workflows/pytest.yml/badge.svg)](https://github.com/pixeltable/pixeltable/actions)
9
9
 
10
10
  [Installation](https://pixeltable.github.io/pixeltable/getting-started/) | [Documentation](https://pixeltable.github.io/pixeltable/)
11
11
  </div>
@@ -41,7 +41,7 @@ To verify that it's working:
41
41
 
42
42
  ```
43
43
  import pixeltable as pxt
44
- cl = pxt.Client()
44
+ pxt.init()
45
45
  ```
46
46
 
47
47
  For more detailed installation instructions, see the
@@ -1,18 +1,30 @@
1
1
  from .catalog import Column, Table, InsertableTable, View
2
- from .client import Client
3
2
  from .dataframe import DataFrame
4
3
  from .exceptions import Error, Error
5
4
  from .exprs import RELATIVE_PATH_ROOT
6
5
  from .func import Function, udf, uda, Aggregator, expr_udf
7
- from .type_system import \
8
- ColumnType, StringType, IntType, FloatType, BoolType, TimestampType, JsonType, ArrayType, ImageType, VideoType, \
9
- AudioType, DocumentType
6
+ from .globals import *
7
+ from .type_system import (
8
+ ColumnType,
9
+ StringType,
10
+ IntType,
11
+ FloatType,
12
+ BoolType,
13
+ TimestampType,
14
+ JsonType,
15
+ ArrayType,
16
+ ImageType,
17
+ VideoType,
18
+ AudioType,
19
+ DocumentType,
20
+ )
10
21
  from .utils.help import help
22
+
11
23
  # noinspection PyUnresolvedReferences
12
- from . import functions
24
+ from . import functions, io
25
+ from .__version__ import __version__, __version_tuple__
13
26
 
14
27
  __all__ = [
15
- 'Client',
16
28
  'DataFrame',
17
29
  'Column',
18
30
  'Table',
@@ -39,6 +51,3 @@ __all__ = [
39
51
  'uda',
40
52
  'expr_udf',
41
53
  ]
42
-
43
-
44
-
@@ -0,0 +1,3 @@
1
+ # These version placeholders will be replaced during build.
2
+ __version__ = "0.2.6"
3
+ __version_tuple__ = (0, 2, 6)
@@ -5,8 +5,8 @@ from typing import Optional, Union, Callable, Set
5
5
 
6
6
  import sqlalchemy as sql
7
7
 
8
- from pixeltable import exceptions as excs
9
- from pixeltable.type_system import ColumnType, StringType
8
+ import pixeltable.exceptions as excs
9
+ import pixeltable.type_system as ts
10
10
  from .globals import is_valid_identifier
11
11
 
12
12
  _logger = logging.getLogger('pixeltable')
@@ -18,7 +18,7 @@ class Column:
18
18
  table/view.
19
19
  """
20
20
  def __init__(
21
- self, name: Optional[str], col_type: Optional[ColumnType] = None,
21
+ self, name: Optional[str], col_type: Optional[ts.ColumnType] = None,
22
22
  computed_with: Optional[Union['Expr', Callable]] = None,
23
23
  is_pk: bool = False, stored: Optional[bool] = None,
24
24
  col_id: Optional[int] = None, schema_version_add: Optional[int] = None,
@@ -114,6 +114,10 @@ class Column:
114
114
  l = list(self.value_expr.subexprs(filter=lambda e: isinstance(e, exprs.FunctionCall) and e.is_window_fn_call))
115
115
  return len(l) > 0
116
116
 
117
+ def get_idx_info(self) -> dict[str, 'pixeltable.catalog.TableVersion.IndexInfo']:
118
+ assert self.tbl is not None
119
+ return {name: info for name, info in self.tbl.idxs_by_name.items() if info.col == self}
120
+
117
121
  @property
118
122
  def is_computed(self) -> bool:
119
123
  return self.compute_func is not None or self.value_expr is not None
@@ -148,8 +152,8 @@ class Column:
148
152
  self.store_name(), self.col_type.to_sa_type() if self.sa_col_type is None else self.sa_col_type,
149
153
  nullable=True)
150
154
  if self.is_computed or self.col_type.is_media_type():
151
- self.sa_errormsg_col = sql.Column(self.errormsg_store_name(), StringType().to_sa_type(), nullable=True)
152
- self.sa_errortype_col = sql.Column(self.errortype_store_name(), StringType().to_sa_type(), nullable=True)
155
+ self.sa_errormsg_col = sql.Column(self.errormsg_store_name(), ts.StringType().to_sa_type(), nullable=True)
156
+ self.sa_errortype_col = sql.Column(self.errortype_store_name(), ts.StringType().to_sa_type(), nullable=True)
153
157
 
154
158
  def get_sa_col_type(self) -> sql.sqltypes.TypeEngine:
155
159
  return self.col_type.to_sa_type() if self.sa_col_type is None else self.sa_col_type
@@ -185,8 +185,6 @@ class InsertableTable(Table):
185
185
  if not isinstance(where, Predicate):
186
186
  raise excs.Error(f"'where' argument must be a Predicate, got {type(where)}")
187
187
  analysis_info = Planner.analyze(self.tbl_version_path, where)
188
- if analysis_info.similarity_clause is not None:
189
- raise excs.Error('nearest() cannot be used with delete()')
190
188
  # for now we require that the updated rows can be identified via SQL, rather than via a Python filter
191
189
  if analysis_info.filter is not None:
192
190
  raise excs.Error(f'Filter {analysis_info.filter} not expressible in SQL')
@@ -97,6 +97,11 @@ class Table(SchemaObject):
97
97
  from pixeltable.dataframe import DataFrame
98
98
  return DataFrame(self.tbl_version_path).order_by(*items, asc=asc)
99
99
 
100
+ def group_by(self, *items: 'exprs.Expr') -> 'pixeltable.dataframe.DataFrame':
101
+ """Return a DataFrame for this table."""
102
+ from pixeltable.dataframe import DataFrame
103
+ return DataFrame(self.tbl_version_path).group_by(*items)
104
+
100
105
  def collect(self) -> 'pixeltable.dataframe.DataFrameResultSet': # type: ignore[name-defined, no-untyped-def]
101
106
  """Return rows from this table.
102
107
  """
@@ -470,13 +475,16 @@ class Table(SchemaObject):
470
475
 
471
476
  def add_embedding_index(
472
477
  self, col_name: str, *, idx_name: Optional[str] = None,
473
- text_embed: Optional[pixeltable.Function] = None, img_embed: Optional[pixeltable.Function] = None
478
+ text_embed: Optional[pixeltable.Function] = None, img_embed: Optional[pixeltable.Function] = None,
479
+ metric: str = 'cosine'
474
480
  ) -> None:
475
481
  """Add an index to the table.
476
482
  Args:
477
483
  col_name: name of column to index
478
484
  idx_name: name of index, which needs to be unique for the table; if not provided, a name will be generated
479
- idx_type: type of index (one of 'embedding')
485
+ text_embed: function to embed text; required if the column is a text column
486
+ img_embed: function to embed images; required if the column is an image column
487
+ metric: distance metric to use for the index; one of 'cosine', 'ip', 'l2'; default is 'cosine'
480
488
 
481
489
  Raises:
482
490
  Error: If an index with that name already exists for the table or if the column does not exist.
@@ -484,11 +492,13 @@ class Table(SchemaObject):
484
492
  Examples:
485
493
  Add an index to the ``img`` column:
486
494
 
487
- >>> tbl.add_embedding_index('img', text_embed=...)
495
+ >>> tbl.add_embedding_index('img', img_embed=...)
488
496
 
489
- Add another index to the ``img`` column, with a specific name:
497
+ Add another index to the ``img`` column, using the inner product as the distance metric,
498
+ and with a specific name; ``text_embed`` is also specified in order to search with text:
490
499
 
491
- >>> tbl.add_embedding_index('img', idx_name='clip_idx', text_embed=...)
500
+ >>> tbl.add_embedding_index(
501
+ 'img', idx_name='clip_idx', img_embed=..., text_embed=...text_embed..., metric='ip')
492
502
  """
493
503
  if self.tbl_version_path.is_snapshot():
494
504
  raise excs.Error('Cannot add an index to a snapshot')
@@ -500,7 +510,7 @@ class Table(SchemaObject):
500
510
  raise excs.Error(f'Duplicate index name: {idx_name}')
501
511
  from pixeltable.index import EmbeddingIndex
502
512
  # create the EmbeddingIndex instance to verify args
503
- idx = EmbeddingIndex(col, text_embed=text_embed, img_embed=img_embed)
513
+ idx = EmbeddingIndex(col, metric=metric, text_embed=text_embed, img_embed=img_embed)
504
514
  status = self.tbl_version_path.tbl_version.add_index(col, idx_name=idx_name, idx=idx)
505
515
  # TODO: how to deal with exceptions here? drop the index and raise?
506
516
 
@@ -582,8 +592,6 @@ class Table(SchemaObject):
582
592
  if not isinstance(where, exprs.Predicate):
583
593
  raise excs.Error(f"'where' argument must be a Predicate, got {type(where)}")
584
594
  analysis_info = Planner.analyze(self.tbl_version_path, where)
585
- if analysis_info.similarity_clause is not None:
586
- raise excs.Error('nearest() cannot be used with update()')
587
595
  # for now we require that the updated rows can be identified via SQL, rather than via a Python filter
588
596
  if analysis_info.filter is not None:
589
597
  raise excs.Error(f'Filter {analysis_info.filter} not expressible in SQL')
@@ -43,6 +43,7 @@ class TableVersion:
43
43
  @dataclasses.dataclass
44
44
  class IndexInfo:
45
45
  id: int
46
+ name: str
46
47
  idx: index.IndexBase
47
48
  col: Column
48
49
  val_col: Column
@@ -272,7 +273,7 @@ class TableVersion:
272
273
  val_col.sa_col_type = idx.index_sa_type()
273
274
  undo_col = self.cols_by_id[md.index_val_undo_col_id]
274
275
  undo_col.sa_col_type = idx.index_sa_type()
275
- idx_info = self.IndexInfo(id=md.id, idx=idx, col=idx_col, val_col=val_col, undo_col=undo_col)
276
+ idx_info = self.IndexInfo(id=md.id, name=md.name, idx=idx, col=idx_col, val_col=val_col, undo_col=undo_col)
276
277
  self.idxs_by_name[md.name] = idx_info
277
278
 
278
279
  def _init_sa_schema(self) -> None:
@@ -353,7 +354,7 @@ class TableVersion:
353
354
  indexed_col_id=col.id, index_val_col_id=val_col.id, index_val_undo_col_id=undo_col.id,
354
355
  schema_version_add=self.schema_version, schema_version_drop=None,
355
356
  class_fqn=idx_cls.__module__ + '.' + idx_cls.__name__, init_args=idx.as_dict())
356
- idx_info = self.IndexInfo(id=idx_id, idx=idx, col=col, val_col=val_col, undo_col=undo_col)
357
+ idx_info = self.IndexInfo(id=idx_id, name=idx_name, idx=idx, col=col, val_col=val_col, undo_col=undo_col)
357
358
  self.idx_md[idx_id] = idx_md
358
359
  self.idxs_by_name[idx_name] = idx_info
359
360