datachain 0.2.13__py3-none-any.whl → 0.2.15__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 datachain might be problematic. Click here for more details.

@@ -25,6 +25,7 @@ from typing import (
25
25
 
26
26
  import attrs
27
27
  import sqlalchemy
28
+ import sqlalchemy as sa
28
29
  from attrs import frozen
29
30
  from fsspec.callbacks import DEFAULT_CALLBACK, Callback, TqdmCallback
30
31
  from sqlalchemy import Column
@@ -250,7 +251,7 @@ class DatasetDiffOperation(Step):
250
251
  self,
251
252
  source_query: Select,
252
253
  target_query: Select,
253
- ) -> Select:
254
+ ) -> sa.Selectable:
254
255
  """
255
256
  Should return select query that calculates desired diff between dataset queries
256
257
  """
@@ -261,14 +262,12 @@ class DatasetDiffOperation(Step):
261
262
  temp_tables.extend(self.dq.temp_table_names)
262
263
 
263
264
  # creating temp table that will hold subtract results
264
- temp_table_name = self.catalog.warehouse.TMP_TABLE_NAME_PREFIX + _random_string(
265
- 6
266
- )
265
+ temp_table_name = self.catalog.warehouse.temp_table_name()
267
266
  temp_tables.append(temp_table_name)
268
267
 
269
268
  columns = [
270
269
  c if isinstance(c, Column) else Column(c.name, c.type)
271
- for c in source_query.columns
270
+ for c in source_query.selected_columns
272
271
  ]
273
272
  temp_table = self.catalog.warehouse.create_dataset_rows_table(
274
273
  temp_table_name,
@@ -292,23 +291,16 @@ class DatasetDiffOperation(Step):
292
291
 
293
292
  @frozen
294
293
  class Subtract(DatasetDiffOperation):
295
- """
296
- Calculates rows that are in a source query but are not in target query (diff)
297
- This can be used to do delta updates (calculate UDF only on newly added rows)
298
- Example:
299
- >>> ds = DatasetQuery(name="dogs_cats") # some older dataset with embeddings
300
- >>> ds_updated = (
301
- DatasetQuery("gs://dvcx-datalakes/dogs-and-cats")
302
- .filter(C.size > 1000) # we can also filter out source query
303
- .subtract(ds)
304
- .add_signals(calc_embeddings) # calculae embeddings only on new rows
305
- .union(ds) # union with old dataset that's missing new rows
306
- .save("dogs_cats_updated")
307
- )
308
- """
294
+ on: Sequence[str]
309
295
 
310
- def query(self, source_query: Select, target_query: Select) -> Select:
311
- return self.catalog.warehouse.subtract_query(source_query, target_query)
296
+ def query(self, source_query: Select, target_query: Select) -> sa.Selectable:
297
+ sq = source_query.alias("source_query")
298
+ tq = target_query.alias("target_query")
299
+ where_clause = sa.and_(
300
+ getattr(sq.c, col_name).is_not_distinct_from(getattr(tq.c, col_name))
301
+ for col_name in self.on
302
+ ) # type: ignore[arg-type]
303
+ return sq.select().except_(sq.select().where(where_clause))
312
304
 
313
305
 
314
306
  @frozen
@@ -454,9 +446,6 @@ class UDFStep(Step, ABC):
454
446
  to select
455
447
  """
456
448
 
457
- def udf_table_name(self) -> str:
458
- return self.catalog.warehouse.UDF_TABLE_NAME_PREFIX + _random_string(6)
459
-
460
449
  def populate_udf_table(self, udf_table: "Table", query: Select) -> None:
461
450
  use_partitioning = self.partition_by is not None
462
451
  batching = self.udf.properties.get_batching(use_partitioning)
@@ -580,9 +569,7 @@ class UDFStep(Step, ABC):
580
569
  list_partition_by = [self.partition_by]
581
570
 
582
571
  # create table with partitions
583
- tbl = self.catalog.warehouse.create_udf_table(
584
- self.udf_table_name(), partition_columns()
585
- )
572
+ tbl = self.catalog.warehouse.create_udf_table(partition_columns())
586
573
 
587
574
  # fill table with partitions
588
575
  cols = [
@@ -644,37 +631,12 @@ class UDFSignal(UDFStep):
644
631
  for (col_name, col_type) in self.udf.output.items()
645
632
  ]
646
633
 
647
- return self.catalog.warehouse.create_udf_table(
648
- self.udf_table_name(), udf_output_columns
649
- )
650
-
651
- def create_pre_udf_table(self, query: Select) -> "Table":
652
- columns = [
653
- sqlalchemy.Column(c.name, c.type)
654
- for c in query.selected_columns
655
- if c.name != "sys__id"
656
- ]
657
- table = self.catalog.warehouse.create_udf_table(self.udf_table_name(), columns)
658
- select_q = query.with_only_columns(
659
- *[c for c in query.selected_columns if c.name != "sys__id"]
660
- )
661
-
662
- # if there is order by clause we need row_number to preserve order
663
- # if there is no order by clause we still need row_number to generate
664
- # unique ids as uniqueness is important for this table
665
- select_q = select_q.add_columns(
666
- f.row_number().over(order_by=select_q._order_by_clauses).label("sys__id")
667
- )
668
-
669
- self.catalog.warehouse.db.execute(
670
- table.insert().from_select(list(select_q.selected_columns), select_q)
671
- )
672
- return table
634
+ return self.catalog.warehouse.create_udf_table(udf_output_columns)
673
635
 
674
636
  def process_input_query(self, query: Select) -> tuple[Select, list["Table"]]:
675
637
  if os.getenv("DATACHAIN_DISABLE_QUERY_CACHE", "") not in ("", "0"):
676
638
  return query, []
677
- table = self.create_pre_udf_table(query)
639
+ table = self.catalog.warehouse.create_pre_udf_table(query)
678
640
  q: Select = sqlalchemy.select(*table.c)
679
641
  if query._order_by_clauses:
680
642
  # we are adding ordering only if it's explicitly added by user in
@@ -738,7 +700,7 @@ class RowGenerator(UDFStep):
738
700
  def create_udf_table(self, query: Select) -> "Table":
739
701
  warehouse = self.catalog.warehouse
740
702
 
741
- table_name = self.udf_table_name()
703
+ table_name = self.catalog.warehouse.udf_table_name()
742
704
  columns: tuple[Column, ...] = tuple(
743
705
  Column(name, typ) for name, typ in self.udf.output.items()
744
706
  )
@@ -1260,7 +1222,7 @@ class DatasetQuery:
1260
1222
  def as_iterable(self, **kwargs) -> Iterator[ResultIter]:
1261
1223
  try:
1262
1224
  query = self.apply_steps().select()
1263
- selected_columns = [c.name for c in query.columns]
1225
+ selected_columns = [c.name for c in query.selected_columns]
1264
1226
  yield ResultIter(
1265
1227
  self.catalog.warehouse.dataset_rows_select(query, **kwargs),
1266
1228
  selected_columns,
@@ -1564,8 +1526,12 @@ class DatasetQuery:
1564
1526
 
1565
1527
  @detach
1566
1528
  def subtract(self, dq: "DatasetQuery") -> "Self":
1529
+ return self._subtract(dq, on=["source", "parent", "name"])
1530
+
1531
+ @detach
1532
+ def _subtract(self, dq: "DatasetQuery", on: Sequence[str]) -> "Self":
1567
1533
  query = self.clone()
1568
- query.steps.append(Subtract(dq, self.catalog))
1534
+ query.steps.append(Subtract(dq, self.catalog, on=on))
1569
1535
  return query
1570
1536
 
1571
1537
  @detach
@@ -1684,7 +1650,7 @@ class DatasetQuery:
1684
1650
  f.row_number().over(order_by=q._order_by_clauses).label("sys__id")
1685
1651
  )
1686
1652
 
1687
- cols = tuple(c.name for c in q.columns)
1653
+ cols = tuple(c.name for c in q.selected_columns)
1688
1654
  insert_q = sqlalchemy.insert(dr.get_table()).from_select(cols, q)
1689
1655
  self.catalog.warehouse.db.execute(insert_q, **kwargs)
1690
1656
  self.catalog.metastore.update_dataset_status(
@@ -1804,10 +1770,3 @@ def query_wrapper(dataset_query: DatasetQuery) -> DatasetQuery:
1804
1770
 
1805
1771
  _send_result(dataset_query)
1806
1772
  return dataset_query
1807
-
1808
-
1809
- def _random_string(length: int) -> str:
1810
- return "".join(
1811
- random.choice(string.ascii_letters + string.digits) # noqa: S311
1812
- for i in range(length)
1813
- )
@@ -5,8 +5,8 @@ from datetime import MAXYEAR, MINYEAR, datetime, timezone
5
5
  from types import MappingProxyType
6
6
  from typing import Callable, Optional
7
7
 
8
+ import orjson
8
9
  import sqlalchemy as sa
9
- import ujson
10
10
  from sqlalchemy.dialects import sqlite
11
11
  from sqlalchemy.ext.compiler import compiles
12
12
  from sqlalchemy.sql.elements import literal
@@ -149,7 +149,7 @@ def missing_vector_function(name, exc):
149
149
 
150
150
 
151
151
  def sqlite_string_split(string: str, sep: str, maxsplit: int = -1) -> str:
152
- return ujson.dumps(string.split(sep, maxsplit))
152
+ return orjson.dumps(string.split(sep, maxsplit)).decode("utf-8")
153
153
 
154
154
 
155
155
  def register_user_defined_sql_functions() -> None:
@@ -274,7 +274,7 @@ def compile_euclidean_distance(element, compiler, **kwargs):
274
274
 
275
275
 
276
276
  def py_json_array_length(arr):
277
- return len(ujson.loads(arr))
277
+ return len(orjson.loads(arr))
278
278
 
279
279
 
280
280
  def compile_array_length(element, compiler, **kwargs):
@@ -1,7 +1,6 @@
1
- import json
2
1
  import sqlite3
3
2
 
4
- import ujson
3
+ import orjson
5
4
  from sqlalchemy import types
6
5
 
7
6
  from datachain.sql.types import TypeConverter, TypeReadConverter
@@ -29,22 +28,15 @@ class Array(types.UserDefinedType):
29
28
 
30
29
 
31
30
  def adapt_array(arr):
32
- return ujson.dumps(arr)
31
+ return orjson.dumps(arr).decode("utf-8")
33
32
 
34
33
 
35
34
  def convert_array(arr):
36
- return ujson.loads(arr)
35
+ return orjson.loads(arr)
37
36
 
38
37
 
39
38
  def adapt_np_array(arr):
40
- def _json_serialize(obj):
41
- if isinstance(obj, np.ndarray):
42
- return obj.tolist()
43
- return obj
44
-
45
- if np.issubdtype(arr.dtype, np.object_):
46
- return json.dumps(arr.tolist(), default=_json_serialize)
47
- return ujson.dumps(arr.tolist())
39
+ return orjson.dumps(arr, option=orjson.OPT_SERIALIZE_NUMPY).decode("utf-8")
48
40
 
49
41
 
50
42
  def adapt_np_generic(val):
@@ -70,5 +62,5 @@ class SQLiteTypeConverter(TypeConverter):
70
62
  class SQLiteTypeReadConverter(TypeReadConverter):
71
63
  def array(self, value, item_type, dialect):
72
64
  if isinstance(value, str):
73
- value = ujson.loads(value)
65
+ value = orjson.loads(value)
74
66
  return super().array(value, item_type, dialect)
datachain/sql/types.py CHANGED
@@ -12,6 +12,7 @@ for sqlite we can use `sqlite.register_converter`
12
12
  ( https://docs.python.org/3/library/sqlite3.html#sqlite3.register_converter )
13
13
  """
14
14
 
15
+ import json
15
16
  from datetime import datetime
16
17
  from types import MappingProxyType
17
18
  from typing import Any, Union
@@ -247,7 +248,10 @@ class Array(SQLType):
247
248
  return type_defaults(dialect).array()
248
249
 
249
250
  def on_read_convert(self, value, dialect):
250
- return read_converter(dialect).array(value, self.item_type, dialect)
251
+ r = read_converter(dialect).array(value, self.item_type, dialect)
252
+ if isinstance(self.item_type, JSON):
253
+ r = [json.loads(item) if isinstance(item, str) else item for item in r]
254
+ return r
251
255
 
252
256
 
253
257
  class JSON(SQLType):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: datachain
3
- Version: 0.2.13
3
+ Version: 0.2.15
4
4
  Summary: Wrangle unstructured AI data at scale
5
5
  Author-email: Dmitry Petrov <support@dvc.org>
6
6
  License: Apache-2.0
@@ -35,7 +35,7 @@ Requires-Dist: sqlalchemy >=2
35
35
  Requires-Dist: multiprocess ==0.70.16
36
36
  Requires-Dist: dill ==0.3.8
37
37
  Requires-Dist: cloudpickle
38
- Requires-Dist: ujson >=5.9.0
38
+ Requires-Dist: orjson >=3.10.5
39
39
  Requires-Dist: pydantic <3,>=2
40
40
  Requires-Dist: jmespath >=1.0
41
41
  Requires-Dist: datamodel-code-generator >=0.25
@@ -48,7 +48,6 @@ Requires-Dist: types-python-dateutil ; extra == 'dev'
48
48
  Requires-Dist: types-pytz ; extra == 'dev'
49
49
  Requires-Dist: types-PyYAML ; extra == 'dev'
50
50
  Requires-Dist: types-requests ; extra == 'dev'
51
- Requires-Dist: types-ujson ; extra == 'dev'
52
51
  Provides-Extra: docs
53
52
  Requires-Dist: mkdocs >=1.5.2 ; extra == 'docs'
54
53
  Requires-Dist: mkdocs-gen-files >=0.5.0 ; extra == 'docs'
@@ -32,41 +32,41 @@ datachain/data_storage/__init__.py,sha256=cEOJpyu1JDZtfUupYucCDNFI6e5Wmp_Oyzq6rZ
32
32
  datachain/data_storage/db_engine.py,sha256=rgBuqJ-M1j5QyqiUQuJRewctuvRRj8LBDL54-aPEFxE,3287
33
33
  datachain/data_storage/id_generator.py,sha256=VlDALKijggegAnNMJwuMETJgnLoPYxpkrkld5DNTPQw,3839
34
34
  datachain/data_storage/job.py,sha256=w-7spowjkOa1P5fUVtJou3OltT0L48P0RYWZ9rSJ9-s,383
35
- datachain/data_storage/metastore.py,sha256=R1Jj8dOTAex8fjehewV2vUO4VhBSjj8JQI5mM3YhVEQ,54989
36
- datachain/data_storage/schema.py,sha256=hUykqT-As-__WffMdWTrSZwv9k5EYYowRke3OENQ3aY,8102
35
+ datachain/data_storage/metastore.py,sha256=wVcT8MiSH_paWEXN6eZ8Z3msrHY6vWtVFTH5kwHteRE,54852
36
+ datachain/data_storage/schema.py,sha256=FQvt5MUMSnI5ZAE7Nthae4aaJpt8JC4nH8KiWDuhJkk,8135
37
37
  datachain/data_storage/serializer.py,sha256=6G2YtOFqqDzJf1KbvZraKGXl2XHZyVml2krunWUum5o,927
38
- datachain/data_storage/sqlite.py,sha256=cIYobczfH72c4l-iMkxpkgcTuuvvT8Xi64iP7Zr3Skw,25084
39
- datachain/data_storage/warehouse.py,sha256=FedcsvkAphpi2tUnlcrxO4mYumiCQAcrB5XRAK9tfXQ,33288
38
+ datachain/data_storage/sqlite.py,sha256=w0d_cZ2u9LpQYFFXll22mnxHaxPOoJdHlsKAZmONQpA,25605
39
+ datachain/data_storage/warehouse.py,sha256=WGHWBuBmNmK-qHwhvMfAwtXZ-fQKwk8w1dadN_4dugA,33293
40
40
  datachain/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- datachain/lib/arrow.py,sha256=WBZ4iVU0CcmCgog1wS-Nrtqhzvf2I4_QqDJtzhaECeA,3641
41
+ datachain/lib/arrow.py,sha256=9C5AVH6tLo9hwzav-1tLLnmWP-3_SReYCOfcOC54pu0,4437
42
42
  datachain/lib/clip.py,sha256=16u4b_y2Y15nUS2UN_8ximMo6r_-_4IQpmct2ol-e-g,5730
43
- datachain/lib/data_model.py,sha256=jPYDmTYbixy4LhdToOyvldYGYZxblhp6Tn4MF-VAd-o,1495
43
+ datachain/lib/data_model.py,sha256=qfTtQNncS5pt9SvXdMEa5kClniaT6XBGBfO7onEz2TI,1632
44
44
  datachain/lib/dataset_info.py,sha256=lONGr71ozo1DS4CQEhnpKORaU4qFb6Ketv8Xm8CVm2U,2188
45
- datachain/lib/dc.py,sha256=KboCSSyjZ69hIpyjgza4HindFwO7L1Usxa0769N57NA,50561
46
- datachain/lib/file.py,sha256=Y1QQ1pBSESjlA9n6_ukc3YtugeiTeF12xcncyfdCL2k,12128
45
+ datachain/lib/dc.py,sha256=alJwK7z5JoUmGc1Kj74dGtlH2MJ0jeSyS2dnInemnnA,56386
46
+ datachain/lib/file.py,sha256=n9GBmZ1CjzDjHkbUBsUrs8JOJrAoh3MV2Cc8hBkex20,11957
47
47
  datachain/lib/image.py,sha256=TgYhRhzd4nkytfFMeykQkPyzqb5Le_-tU81unVMPn4Q,2328
48
- datachain/lib/meta_formats.py,sha256=Z2NVH5X4N2rrj5kFxKsHKq3zD4kaRHbDCx3oiUEKYUk,6920
48
+ datachain/lib/meta_formats.py,sha256=jlSYWRUeDMjun_YCsQ2JxyaDJpEpokzHDPmKUAoCXnU,7034
49
49
  datachain/lib/model_store.py,sha256=c4USXsBBjrGH8VOh4seIgOiav-qHOwdoixtxfLgU63c,2409
50
50
  datachain/lib/pytorch.py,sha256=9PsypKseyKfIimTmTQOgb-pbNXgeeAHLdlWx0qRPULY,5660
51
- datachain/lib/settings.py,sha256=6Nkoh8riETrftYwDp3aniK53Dsjc07MdztL8N0cW1D8,2849
51
+ datachain/lib/settings.py,sha256=39thOpYJw-zPirzeNO6pmRC2vPrQvt4eBsw1xLWDFsw,2344
52
52
  datachain/lib/signal_schema.py,sha256=lKGlpRRUHOUFLcpk-pLQd9kGAJ8FPy0Q2bk--UlVemU,14559
53
53
  datachain/lib/text.py,sha256=dVe2Ilc_gW2EV0kun0UwegiCkapWcd20cef7CgINWHU,1083
54
- datachain/lib/udf.py,sha256=mo3NoyYy7fY2UZtZOtAN_jR1e5a803b1dlnD5ztduzk,11454
54
+ datachain/lib/udf.py,sha256=IjuDt2B8E3xEHhcJnaK_ZhmivdrOYPXz5uf7ylpktws,11815
55
55
  datachain/lib/udf_signature.py,sha256=gMStcEeYJka5M6cg50Z9orC6y6HzCAJ3MkFqqn1fjZg,7137
56
56
  datachain/lib/utils.py,sha256=5-kJlAZE0D9nXXweAjo7-SP_AWGo28feaDByONYaooQ,463
57
57
  datachain/lib/vfile.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
58
  datachain/lib/webdataset.py,sha256=nIa6ubv94CwnATeeSdE7f_F9Zkz9LuBTfbXvFg3_-Ak,8295
59
59
  datachain/lib/webdataset_laion.py,sha256=PQP6tQmUP7Xu9fPuAGK1JDBYA6T5UufYMUTGaxgspJA,2118
60
60
  datachain/lib/convert/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
- datachain/lib/convert/flatten.py,sha256=XdAj0f9W32ABjOo8UyYm0y0H_yHDn3qEHERTyXuhJxk,1592
62
- datachain/lib/convert/python_to_sql.py,sha256=54G6dsMhxo1GKCzPziOqCKo2d4VRWmsJhJYRJxt1Thw,2615
61
+ datachain/lib/convert/flatten.py,sha256=YMoC00BqEy3zSpvCp6Q0DfxihuPmgjUJj1g2cesWGPs,1790
62
+ datachain/lib/convert/python_to_sql.py,sha256=4gplGlr_Kg-Z40OpJUzJiarDWj7pwbUOk-dPOYYCJ9Q,2629
63
63
  datachain/lib/convert/sql_to_python.py,sha256=HK414fexSQ4Ur-OY7_pKvDKEGdtos1CeeAFa4RxH4nU,532
64
64
  datachain/lib/convert/unflatten.py,sha256=Ogvh_5wg2f38_At_1lN0D_e2uZOOpYEvwvB2xdq56Tw,2012
65
- datachain/lib/convert/values_to_tuples.py,sha256=Bh8L4zA66XRhQxmONvLvn94_i8MBMYgfJ6A2i7l_6Jo,3592
65
+ datachain/lib/convert/values_to_tuples.py,sha256=aVoHWMOUGLAiS6_BBwKJqVIne91VffOW6-dWyNE7oHg,3715
66
66
  datachain/query/__init__.py,sha256=tv-spkjUCYamMN9ys_90scYrZ8kJ7C7d1MTYVmxGtk4,325
67
67
  datachain/query/batch.py,sha256=j-_ZcuQra2Ro3Wj4crtqQCg-7xuv-p84hr4QHdvT7as,3479
68
68
  datachain/query/builtins.py,sha256=ZKNs49t8Oa_OaboCBIEqtXZt7c1Qe9OR_C_HpoDriIU,2781
69
- datachain/query/dataset.py,sha256=jOMdvsQIMZq1hYPfqR_iKzGSlJ8m-7Wz75QxdFHdfwY,61567
69
+ datachain/query/dataset.py,sha256=PJFVasYhCU0XvF7OrbxlAHLdm_PnhIQBp3TUDVHNHVY,60054
70
70
  datachain/query/dispatch.py,sha256=oGX9ZuoKWPB_EyqAZD_eULcO3OejY44_keSmFS6SHT0,13315
71
71
  datachain/query/metrics.py,sha256=vsECqbZfoSDBnvC3GQlziKXmISVYDLgHP1fMPEOtKyo,640
72
72
  datachain/query/params.py,sha256=O_j89mjYRLOwWNhYZl-z7mi-rkdP7WyFmaDufsdTryE,863
@@ -77,7 +77,7 @@ datachain/remote/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
77
77
  datachain/remote/studio.py,sha256=f5s6qSZ9uB4URGUoU_8_W1KZRRQQVSm6cgEBkBUEfuE,7226
78
78
  datachain/sql/__init__.py,sha256=A2djrbQwSMUZZEIKGnm-mnRA-NDSbiDJNpAmmwGNyIo,303
79
79
  datachain/sql/selectable.py,sha256=fBM-wS1TUA42kVEAAiwqGtibIevyZAEritwt8PZGyLQ,1589
80
- datachain/sql/types.py,sha256=BzUm0nCcMPASvdqpQouX5bdVcK3G3DBfeeNhau7X_hA,10234
80
+ datachain/sql/types.py,sha256=SShudhdIpdfTKDxWDDqOajYRkTCkIgQbilA94g4i-4E,10389
81
81
  datachain/sql/utils.py,sha256=rzlJw08etivdrcuQPqNVvVWhuVSyUPUQEEc6DOhu258,818
82
82
  datachain/sql/default/__init__.py,sha256=XQ2cEZpzWiABqjV-6yYHUBGI9vN_UHxbxZENESmVAWw,45
83
83
  datachain/sql/default/base.py,sha256=h44005q3qtMc9cjWmRufWwcBr5CfK_dnvG4IrcSQs_8,536
@@ -88,13 +88,13 @@ datachain/sql/functions/path.py,sha256=zixpERotTFP6LZ7I4TiGtyRA8kXOoZmH1yzH9oRW0
88
88
  datachain/sql/functions/random.py,sha256=vBwEEj98VH4LjWixUCygQ5Bz1mv1nohsCG0-ZTELlVg,271
89
89
  datachain/sql/functions/string.py,sha256=hIrF1fTvlPamDtm8UMnWDcnGfbbjCsHxZXS30U2Rzxo,651
90
90
  datachain/sql/sqlite/__init__.py,sha256=TAdJX0Bg28XdqPO-QwUVKy8rg78cgMileHvMNot7d04,166
91
- datachain/sql/sqlite/base.py,sha256=nPMF6_FF04hclDNZev_YfxMgbJAsWEdF-rU2pUhqBtc,12048
92
- datachain/sql/sqlite/types.py,sha256=oP93nLfTBaYnN0z_4Dsv-HZm8j9rrUf1esMM-z3JLbg,1754
91
+ datachain/sql/sqlite/base.py,sha256=Jb1csbIARjEvwbylnvgNA7ChozSyoL3CQzOGBUf8QAw,12067
92
+ datachain/sql/sqlite/types.py,sha256=yzvp0sXSEoEYXs6zaYC_2YubarQoZH-MiUNXcpuEP4s,1573
93
93
  datachain/sql/sqlite/vector.py,sha256=ncW4eu2FlJhrP_CIpsvtkUabZlQdl2D5Lgwy_cbfqR0,469
94
94
  datachain/torch/__init__.py,sha256=gIS74PoEPy4TB3X6vx9nLO0Y3sLJzsA8ckn8pRWihJM,579
95
- datachain-0.2.13.dist-info/LICENSE,sha256=8DnqK5yoPI_E50bEg_zsHKZHY2HqPy4rYN338BHQaRA,11344
96
- datachain-0.2.13.dist-info/METADATA,sha256=jiEob-wl7pePOekp9tVY6h00czklAsktsmw910EvZbo,14619
97
- datachain-0.2.13.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
98
- datachain-0.2.13.dist-info/entry_points.txt,sha256=0GMJS6B_KWq0m3VT98vQI2YZodAMkn4uReZ_okga9R4,49
99
- datachain-0.2.13.dist-info/top_level.txt,sha256=lZPpdU_2jJABLNIg2kvEOBi8PtsYikbN1OdMLHk8bTg,10
100
- datachain-0.2.13.dist-info/RECORD,,
95
+ datachain-0.2.15.dist-info/LICENSE,sha256=8DnqK5yoPI_E50bEg_zsHKZHY2HqPy4rYN338BHQaRA,11344
96
+ datachain-0.2.15.dist-info/METADATA,sha256=kKdEsDFle6KQ55q9RlWsAd6DUTgAg40A8L5YWE9fbMg,14577
97
+ datachain-0.2.15.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
98
+ datachain-0.2.15.dist-info/entry_points.txt,sha256=0GMJS6B_KWq0m3VT98vQI2YZodAMkn4uReZ_okga9R4,49
99
+ datachain-0.2.15.dist-info/top_level.txt,sha256=lZPpdU_2jJABLNIg2kvEOBi8PtsYikbN1OdMLHk8bTg,10
100
+ datachain-0.2.15.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (71.1.0)
2
+ Generator: setuptools (72.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5