deltacat 2.0.0.post3__tar.gz → 2.0.0.post4__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.
Files changed (448) hide show
  1. {deltacat-2.0.0.post3/deltacat.egg-info → deltacat-2.0.0.post4}/PKG-INFO +4 -2
  2. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/README.md +3 -1
  3. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/__init__.py +1 -1
  4. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/catalog/main/impl.py +12 -6
  5. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/catalog/test_default_catalog_impl.py +306 -5
  6. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4/deltacat.egg-info}/PKG-INFO +4 -2
  7. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/LICENSE +0 -0
  8. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/MANIFEST.in +0 -0
  9. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/annotations.py +0 -0
  10. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/api.py +0 -0
  11. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/aws/__init__.py +0 -0
  12. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/aws/clients.py +0 -0
  13. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/aws/constants.py +0 -0
  14. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/aws/s3u.py +0 -0
  15. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/benchmarking/__init__.py +0 -0
  16. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/benchmarking/benchmark_engine.py +0 -0
  17. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/benchmarking/benchmark_parquet_reads.py +0 -0
  18. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/benchmarking/benchmark_report.py +0 -0
  19. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/benchmarking/benchmark_suite.py +0 -0
  20. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/benchmarking/conftest.py +0 -0
  21. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/benchmarking/data/__init__.py +0 -0
  22. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/benchmarking/data/random_row_generator.py +0 -0
  23. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/benchmarking/data/row_generator.py +0 -0
  24. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/benchmarking/test_benchmark_pipeline.py +0 -0
  25. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/catalog/__init__.py +0 -0
  26. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/catalog/delegate.py +0 -0
  27. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/catalog/interface.py +0 -0
  28. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/catalog/main/__init__.py +0 -0
  29. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/catalog/model/__init__.py +0 -0
  30. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/catalog/model/catalog.py +0 -0
  31. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/catalog/model/properties.py +0 -0
  32. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/catalog/model/table_definition.py +0 -0
  33. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/__init__.py +0 -0
  34. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/__init__.py +0 -0
  35. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/compaction_session.py +0 -0
  36. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/model/__init__.py +0 -0
  37. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/model/compact_partition_params.py +0 -0
  38. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/model/compaction_session_audit_info.py +0 -0
  39. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/model/compactor_version.py +0 -0
  40. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/model/dedupe_result.py +0 -0
  41. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/model/delta_annotated.py +0 -0
  42. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/model/delta_file_envelope.py +0 -0
  43. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/model/delta_file_locator.py +0 -0
  44. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/model/hash_bucket_result.py +0 -0
  45. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/model/materialize_result.py +0 -0
  46. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/model/primary_key_index.py +0 -0
  47. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/model/pyarrow_write_result.py +0 -0
  48. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/model/repartition_result.py +0 -0
  49. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/model/round_completion_info.py +0 -0
  50. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/model/table_object_store.py +0 -0
  51. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/repartition_session.py +0 -0
  52. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/steps/__init__.py +0 -0
  53. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/steps/dedupe.py +0 -0
  54. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/steps/hash_bucket.py +0 -0
  55. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/steps/materialize.py +0 -0
  56. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/steps/repartition.py +0 -0
  57. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/utils/__init__.py +0 -0
  58. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/utils/io.py +0 -0
  59. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/utils/primary_key_index.py +0 -0
  60. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/utils/round_completion_reader.py +0 -0
  61. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/utils/sort_key.py +0 -0
  62. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor/utils/system_columns.py +0 -0
  63. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/__init__.py +0 -0
  64. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/compaction_session.py +0 -0
  65. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/constants.py +0 -0
  66. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/deletes/__init__.py +0 -0
  67. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/deletes/delete_file_envelope.py +0 -0
  68. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/deletes/delete_strategy.py +0 -0
  69. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/deletes/delete_strategy_equality_delete.py +0 -0
  70. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/deletes/model.py +0 -0
  71. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/deletes/utils.py +0 -0
  72. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/model/__init__.py +0 -0
  73. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/model/evaluate_compaction_result.py +0 -0
  74. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/model/hash_bucket_input.py +0 -0
  75. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/model/hash_bucket_result.py +0 -0
  76. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/model/merge_file_group.py +0 -0
  77. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/model/merge_input.py +0 -0
  78. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/model/merge_result.py +0 -0
  79. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/private/__init__.py +0 -0
  80. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/private/compaction_utils.py +0 -0
  81. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/steps/__init__.py +0 -0
  82. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/steps/hash_bucket.py +0 -0
  83. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/steps/merge.py +0 -0
  84. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/utils/__init__.py +0 -0
  85. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/utils/content_type_params.py +0 -0
  86. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/utils/dedupe.py +0 -0
  87. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/utils/delta.py +0 -0
  88. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/utils/io.py +0 -0
  89. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/utils/merge.py +0 -0
  90. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/utils/primary_key_index.py +0 -0
  91. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/compactor_v2/utils/task_options.py +0 -0
  92. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/__init__.py +0 -0
  93. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/constants.py +0 -0
  94. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/converter_session.py +0 -0
  95. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/model/__init__.py +0 -0
  96. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/model/convert_input.py +0 -0
  97. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/model/convert_input_files.py +0 -0
  98. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/model/convert_result.py +0 -0
  99. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/model/converter_session_params.py +0 -0
  100. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/pyiceberg/__init__.py +0 -0
  101. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/pyiceberg/catalog.py +0 -0
  102. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/pyiceberg/overrides.py +0 -0
  103. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/pyiceberg/update_snapshot_overrides.py +0 -0
  104. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/steps/__init__.py +0 -0
  105. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/steps/convert.py +0 -0
  106. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/steps/dedupe.py +0 -0
  107. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/utils/__init__.py +0 -0
  108. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/utils/convert_task_options.py +0 -0
  109. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/utils/converter_session_utils.py +0 -0
  110. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/utils/iceberg_columns.py +0 -0
  111. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/utils/io.py +0 -0
  112. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/converter/utils/s3u.py +0 -0
  113. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/janitor.py +0 -0
  114. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/jobs/__init__.py +0 -0
  115. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/jobs/client.py +0 -0
  116. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/resource_estimation/__init__.py +0 -0
  117. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/resource_estimation/delta.py +0 -0
  118. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/resource_estimation/manifest.py +0 -0
  119. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/resource_estimation/model.py +0 -0
  120. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/resource_estimation/parquet.py +0 -0
  121. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/stats/__init__.py +0 -0
  122. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/stats/models/__init__.py +0 -0
  123. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/stats/models/delta_column_stats.py +0 -0
  124. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/stats/models/delta_stats.py +0 -0
  125. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/stats/models/delta_stats_cache_result.py +0 -0
  126. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/stats/models/manifest_entry_stats.py +0 -0
  127. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/stats/models/stats_result.py +0 -0
  128. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/compute/stats/types.py +0 -0
  129. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/constants.py +0 -0
  130. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/docs/__init__.py +0 -0
  131. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/docs/autogen/__init__.py +0 -0
  132. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/docs/autogen/schema/__init__.py +0 -0
  133. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/docs/autogen/schema/inference/__init__.py +0 -0
  134. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/docs/autogen/schema/inference/generate_type_mappings.py +0 -0
  135. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/docs/autogen/schema/inference/parse_json_type_mappings.py +0 -0
  136. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/env.py +0 -0
  137. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/__init__.py +0 -0
  138. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/basic_logging.py +0 -0
  139. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/compactor/__init__.py +0 -0
  140. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/compactor/aws/__init__.py +0 -0
  141. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/compactor/bootstrap.py +0 -0
  142. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/compactor/compactor.py +0 -0
  143. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/compactor/explorer.py +0 -0
  144. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/compactor/gcp/__init__.py +0 -0
  145. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/compactor/job_runner.py +0 -0
  146. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/compactor/utils/__init__.py +0 -0
  147. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/compactor/utils/common.py +0 -0
  148. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/experimental/__init__.py +0 -0
  149. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/experimental/iceberg/__init__.py +0 -0
  150. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/experimental/iceberg/converter/__init__.py +0 -0
  151. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/experimental/iceberg/converter/beam/__init__.py +0 -0
  152. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/experimental/iceberg/converter/beam/app.py +0 -0
  153. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/experimental/iceberg/converter/beam/main.py +0 -0
  154. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/experimental/iceberg/converter/beam/test_workflow.py +0 -0
  155. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/experimental/iceberg/converter/beam/utils/__init__.py +0 -0
  156. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/experimental/iceberg/converter/beam/utils/common.py +0 -0
  157. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/experimental/iceberg/converter/beam/utils/spark.py +0 -0
  158. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/experimental/iceberg/iceberg_bucket_writer.py +0 -0
  159. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/experimental/iceberg/iceberg_reader.py +0 -0
  160. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/hello_world.py +0 -0
  161. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/indexer/__init__.py +0 -0
  162. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/indexer/aws/__init__.py +0 -0
  163. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/indexer/gcp/__init__.py +0 -0
  164. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/indexer/indexer.py +0 -0
  165. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/examples/indexer/job_runner.py +0 -0
  166. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/exceptions.py +0 -0
  167. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/__init__.py +0 -0
  168. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/catalog/__init__.py +0 -0
  169. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/catalog/iceberg/__init__.py +0 -0
  170. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/catalog/iceberg/iceberg_catalog_config.py +0 -0
  171. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/catalog/iceberg/impl.py +0 -0
  172. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/catalog/iceberg/overrides.py +0 -0
  173. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/compatibility/__init__.py +0 -0
  174. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/compatibility/backfill_transaction_partitions.py +0 -0
  175. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/converter_agent/__init__.py +0 -0
  176. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/converter_agent/beam/__init__.py +0 -0
  177. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/converter_agent/beam/managed.py +0 -0
  178. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/converter_agent/table_monitor.py +0 -0
  179. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/daft/__init__.py +0 -0
  180. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/daft/daft_catalog.py +0 -0
  181. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/__init__.py +0 -0
  182. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/iceberg/__init__.py +0 -0
  183. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/iceberg/iceberg_scan_planner.py +0 -0
  184. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/iceberg/impl.py +0 -0
  185. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/iceberg/model.py +0 -0
  186. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/iceberg/visitor.py +0 -0
  187. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/__init__.py +0 -0
  188. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/arrow/__init__.py +0 -0
  189. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/arrow/serializer.py +0 -0
  190. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/dataset.py +0 -0
  191. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/dataset_executor.py +0 -0
  192. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/feather/__init__.py +0 -0
  193. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/feather/file_reader.py +0 -0
  194. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/feather/serializer.py +0 -0
  195. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/fs/__init__.py +0 -0
  196. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/fs/file_provider.py +0 -0
  197. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/fs/file_store.py +0 -0
  198. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/fs/input_file.py +0 -0
  199. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/fs/output_file.py +0 -0
  200. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/logical_plan.py +0 -0
  201. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/metastore/__init__.py +0 -0
  202. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/metastore/delta.py +0 -0
  203. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/metastore/json_sst.py +0 -0
  204. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/metastore/sst.py +0 -0
  205. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/metastore/sst_interval_tree.py +0 -0
  206. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/mvp/Table.py +0 -0
  207. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/mvp/__init__.py +0 -0
  208. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/parquet/__init__.py +0 -0
  209. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/parquet/data_reader.py +0 -0
  210. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/parquet/file_reader.py +0 -0
  211. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/parquet/serializer.py +0 -0
  212. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/reader/__init__.py +0 -0
  213. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/reader/block_scanner.py +0 -0
  214. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/reader/data_reader.py +0 -0
  215. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/reader/data_scan.py +0 -0
  216. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/reader/dataset_metastore.py +0 -0
  217. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/reader/dataset_reader.py +0 -0
  218. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/reader/pyarrow_data_reader.py +0 -0
  219. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/reader/query_expression.py +0 -0
  220. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/reader/reader_type_registrar.py +0 -0
  221. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/schema/__init__.py +0 -0
  222. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/schema/datatype.py +0 -0
  223. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/schema/schema.py +0 -0
  224. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/serializer.py +0 -0
  225. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/serializer_factory.py +0 -0
  226. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/shard/__init__.py +0 -0
  227. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/shard/range_shard.py +0 -0
  228. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/writer/__init__.py +0 -0
  229. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/writer/dataset_writer.py +0 -0
  230. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/experimental/storage/rivulet/writer/memtable_dataset_writer.py +0 -0
  231. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/io/__init__.py +0 -0
  232. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/io/dataset/__init__.py +0 -0
  233. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/io/dataset/deltacat_dataset.py +0 -0
  234. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/io/datasink/__init__.py +0 -0
  235. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/io/datasink/deltacat_datasink.py +0 -0
  236. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/io/datasource/__init__.py +0 -0
  237. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/io/datasource/deltacat_datasource.py +0 -0
  238. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/io/file_object_store.py +0 -0
  239. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/io/memcached_object_store.py +0 -0
  240. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/io/object_store.py +0 -0
  241. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/io/ray_plasma_object_store.py +0 -0
  242. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/io/reader/__init__.py +0 -0
  243. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/io/reader/deltacat_read_api.py +0 -0
  244. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/io/redis_object_store.py +0 -0
  245. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/io/s3_object_store.py +0 -0
  246. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/logs.py +0 -0
  247. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/__init__.py +0 -0
  248. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/interface.py +0 -0
  249. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/main/__init__.py +0 -0
  250. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/main/impl.py +0 -0
  251. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/__init__.py +0 -0
  252. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/delta.py +0 -0
  253. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/expression/__init__.py +0 -0
  254. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/expression/expression.py +0 -0
  255. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/expression/visitor.py +0 -0
  256. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/interop.py +0 -0
  257. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/list_result.py +0 -0
  258. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/locator.py +0 -0
  259. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/manifest.py +0 -0
  260. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/metafile.py +0 -0
  261. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/namespace.py +0 -0
  262. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/partition.py +0 -0
  263. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/scan/__init__.py +0 -0
  264. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/scan/push_down.py +0 -0
  265. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/scan/scan_plan.py +0 -0
  266. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/scan/scan_task.py +0 -0
  267. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/schema.py +0 -0
  268. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/shard.py +0 -0
  269. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/sort_key.py +0 -0
  270. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/stream.py +0 -0
  271. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/table.py +0 -0
  272. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/table_version.py +0 -0
  273. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/transaction.py +0 -0
  274. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/transform.py +0 -0
  275. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/model/types.py +0 -0
  276. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/util/__init__.py +0 -0
  277. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/storage/util/scan_planner.py +0 -0
  278. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/__init__.py +0 -0
  279. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/_io/__init__.py +0 -0
  280. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/_io/reader/__init__.py +0 -0
  281. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/_io/reader/test_deltacat_read_api.py +0 -0
  282. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/_io/test_cloudpickle_bug_fix.py +0 -0
  283. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/_io/test_file_object_store.py +0 -0
  284. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/_io/test_memcached_object_store.py +0 -0
  285. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/_io/test_ray_plasma_object_store.py +0 -0
  286. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/_io/test_redis_object_store.py +0 -0
  287. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/_io/test_s3_object_store.py +0 -0
  288. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/aws/__init__.py +0 -0
  289. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/aws/test_clients.py +0 -0
  290. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/aws/test_s3u.py +0 -0
  291. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/catalog/__init__.py +0 -0
  292. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/catalog/data/__init__.py +0 -0
  293. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/catalog/main/__init__.py +0 -0
  294. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/catalog/main/test_catalog_impl_namespace_operations.py +0 -0
  295. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/catalog/main/test_catalog_impl_table_operations.py +0 -0
  296. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/catalog/model/__init__.py +0 -0
  297. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/catalog/model/test_properties_transaction_migration.py +0 -0
  298. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/catalog/model/test_table_definition.py +0 -0
  299. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/catalog/test_catalogs.py +0 -0
  300. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/__init__.py +0 -0
  301. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compact_partition_multiple_rounds_test_cases.py +0 -0
  302. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compact_partition_rebase_test_cases.py +0 -0
  303. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compact_partition_rebase_then_incremental_test_cases.py +0 -0
  304. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compact_partition_test_cases.py +0 -0
  305. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compactor/__init__.py +0 -0
  306. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compactor/steps/__init__.py +0 -0
  307. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compactor/steps/test_repartition.py +0 -0
  308. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compactor/utils/__init__.py +0 -0
  309. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compactor/utils/test_io.py +0 -0
  310. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compactor/utils/test_round_completion_reader.py +0 -0
  311. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compactor_v2/__init__.py +0 -0
  312. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compactor_v2/test_compaction_session.py +0 -0
  313. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compactor_v2/test_hashlib.py +0 -0
  314. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compactor_v2/utils/__init__.py +0 -0
  315. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compactor_v2/utils/test_content_type_params.py +0 -0
  316. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compactor_v2/utils/test_primary_key_index.py +0 -0
  317. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/compactor_v2/utils/test_task_options.py +0 -0
  318. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/conftest.py +0 -0
  319. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/converter/__init__.py +0 -0
  320. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/converter/conftest.py +0 -0
  321. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/converter/test_convert_session.py +0 -0
  322. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/converter/test_converter_commit_conflict_resolution.py +0 -0
  323. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/converter/utils.py +0 -0
  324. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/resource_estimation/__init__.py +0 -0
  325. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/resource_estimation/data/__init__.py +0 -0
  326. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/resource_estimation/test_delta.py +0 -0
  327. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/resource_estimation/test_manifest.py +0 -0
  328. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/test_compact_partition_incremental.py +0 -0
  329. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/test_compact_partition_multiple_rounds.py +0 -0
  330. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/test_compact_partition_params.py +0 -0
  331. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/test_compact_partition_rebase.py +0 -0
  332. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/test_compact_partition_rebase_then_incremental.py +0 -0
  333. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/test_janitor.py +0 -0
  334. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/test_util_common.py +0 -0
  335. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/compute/test_util_constant.py +0 -0
  336. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/conftest.py +0 -0
  337. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/daft/__init__.py +0 -0
  338. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/daft/test_model.py +0 -0
  339. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/__init__.py +0 -0
  340. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/catalog/__init__.py +0 -0
  341. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/catalog/iceberg/__init__.py +0 -0
  342. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/catalog/iceberg/test_iceberg_catalog.py +0 -0
  343. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/compatibility/__init__.py +0 -0
  344. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/compatibility/test_backfill_transaction_partitions.py +0 -0
  345. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/daft/__init__.py +0 -0
  346. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/daft/test_deltacat_daft_integration.py +0 -0
  347. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/__init__.py +0 -0
  348. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/__init__.py +0 -0
  349. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/conftest.py +0 -0
  350. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/fs/__init__.py +0 -0
  351. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/fs/test_file_location_provider.py +0 -0
  352. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/reader/__init__.py +0 -0
  353. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/reader/query_expression.py +0 -0
  354. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/reader/test_data_scan.py +0 -0
  355. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/reader/test_dataset_metastore.py +0 -0
  356. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/schema/__init__.py +0 -0
  357. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/schema/test_schema.py +0 -0
  358. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/shard/__init__.py +0 -0
  359. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/shard/test_range_shard.py +0 -0
  360. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/test_dataset.py +0 -0
  361. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/test_manifest.py +0 -0
  362. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/test_sst_interval_tree.py +0 -0
  363. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/test_utils.py +0 -0
  364. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/writer/__init__.py +0 -0
  365. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/writer/test_dataset_write_then_read.py +0 -0
  366. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/writer/test_dataset_writer.py +0 -0
  367. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/experimental/storage/rivulet/writer/test_memtable_dataset_writer.py +0 -0
  368. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/__init__.py +0 -0
  369. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/main/__init__.py +0 -0
  370. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/main/test_main_storage.py +0 -0
  371. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/model/__init__.py +0 -0
  372. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/model/test_delete_parameters.py +0 -0
  373. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/model/test_expression.py +0 -0
  374. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/model/test_manifest.py +0 -0
  375. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/model/test_metafile_io.py +0 -0
  376. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/model/test_partition_scheme.py +0 -0
  377. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/model/test_schema.py +0 -0
  378. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/model/test_schema_update.py +0 -0
  379. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/model/test_shard.py +0 -0
  380. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/model/test_sort_scheme.py +0 -0
  381. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/model/test_table_version.py +0 -0
  382. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/model/test_transaction.py +0 -0
  383. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/storage/model/test_transaction_history.py +0 -0
  384. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/test_deltacat_api.py +0 -0
  385. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/test_exceptions.py +0 -0
  386. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/test_logs.py +0 -0
  387. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/test_utils/__init__.py +0 -0
  388. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/test_utils/constants.py +0 -0
  389. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/test_utils/filesystem.py +0 -0
  390. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/test_utils/message_pack_utils.py +0 -0
  391. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/test_utils/pyarrow.py +0 -0
  392. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/test_utils/storage.py +0 -0
  393. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/test_utils/utils.py +0 -0
  394. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/types/__init__.py +0 -0
  395. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/types/test_tables.py +0 -0
  396. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/__init__.py +0 -0
  397. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/data/__init__.py +0 -0
  398. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/exceptions.py +0 -0
  399. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/main_deltacat_storage_mock.py +0 -0
  400. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/ray_utils/__init__.py +0 -0
  401. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/ray_utils/test_concurrency.py +0 -0
  402. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/ray_utils/test_dataset.py +0 -0
  403. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/test_cloudpickle.py +0 -0
  404. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/test_daft.py +0 -0
  405. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/test_filesystem.py +0 -0
  406. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/test_metrics.py +0 -0
  407. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/test_numpy.py +0 -0
  408. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/test_pandas.py +0 -0
  409. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/test_placement.py +0 -0
  410. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/test_polars.py +0 -0
  411. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/test_pyarrow.py +0 -0
  412. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/test_record_batch_tables.py +0 -0
  413. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/tests/utils/test_resources.py +0 -0
  414. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/types/__init__.py +0 -0
  415. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/types/media.py +0 -0
  416. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/types/partial_download.py +0 -0
  417. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/types/tables.py +0 -0
  418. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/__init__.py +0 -0
  419. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/arguments.py +0 -0
  420. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/cloudpickle.py +0 -0
  421. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/common.py +0 -0
  422. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/daft.py +0 -0
  423. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/export.py +0 -0
  424. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/filesystem.py +0 -0
  425. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/metafile_locator.py +0 -0
  426. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/metrics.py +0 -0
  427. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/numpy.py +0 -0
  428. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/pandas.py +0 -0
  429. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/performance.py +0 -0
  430. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/placement.py +0 -0
  431. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/polars.py +0 -0
  432. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/pyarrow.py +0 -0
  433. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/ray_utils/__init__.py +0 -0
  434. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/ray_utils/collections.py +0 -0
  435. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/ray_utils/concurrency.py +0 -0
  436. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/ray_utils/dataset.py +0 -0
  437. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/ray_utils/performance.py +0 -0
  438. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/ray_utils/runtime.py +0 -0
  439. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/reader_compatibility_mapping.py +0 -0
  440. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/resources.py +0 -0
  441. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/schema.py +0 -0
  442. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat/utils/url.py +0 -0
  443. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat.egg-info/SOURCES.txt +0 -0
  444. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat.egg-info/dependency_links.txt +0 -0
  445. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat.egg-info/requires.txt +0 -0
  446. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/deltacat.egg-info/top_level.txt +0 -0
  447. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/setup.cfg +0 -0
  448. {deltacat-2.0.0.post3 → deltacat-2.0.0.post4}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deltacat
3
- Version: 2.0.0.post3
3
+ Version: 2.0.0.post4
4
4
  Summary: DeltaCAT is a portable Pythonic Data Lakehouse powered by Ray.
5
5
  Home-page: https://github.com/ray-project/deltacat
6
6
  Author: Ray Team
@@ -53,7 +53,7 @@ Dynamic: summary
53
53
  <img src="https://github.com/ray-project/deltacat/raw/2.0/media/deltacat-logo-alpha-750.png" alt="deltacat logo" style="width:55%; height:auto; text-align: center;">
54
54
  </p>
55
55
 
56
- DeltaCAT is a portable Multimodal Lakehouse powered by [Ray](https://github.com/ray-project/ray), [Apache Arrow](https://github.com/apache/arrow), and [Daft](https://github.com/Eventual-Inc/Daft). It lets you create ACID-compliant multimodal data lakes [that efficiently scale to manage exabytes of production data](https://aws.amazon.com/blogs/opensource/amazons-exabyte-scale-migration-from-apache-spark-to-ray-on-amazon-ec2/).
56
+ DeltaCAT is a portable Multimodal Lakehouse powered by [Ray](https://github.com/ray-project/ray), [Apache Arrow](https://github.com/apache/arrow), and [Daft](https://github.com/Eventual-Inc/Daft). It lets you create ACID-compliant multimodal data lakes [that efficiently scale to exabytes of production data](https://aws.amazon.com/blogs/opensource/amazons-exabyte-scale-migration-from-apache-spark-to-ray-on-amazon-ec2/).
57
57
 
58
58
  It provides data lake level transactions & time travel, zero-copy schema evolution, zero-copy multimodal file processing (image, audio, video, text, etc.), and transparent dataset optimization. It runs locally for rapid development or in the cloud for production workloads. It runs on any filesystem for easy setup and sharing - no external catalog services, lock managers, or key value stores required.
59
59
 
@@ -244,6 +244,7 @@ assert dc.dataset_length(daft_df) == 6
244
244
  <details>
245
245
 
246
246
  <summary><span style="font-size: 1.25em; font-weight: bold;">Ordered Writes</span></summary>
247
+
247
248
  DeltaCAT writes are unordered by default, which means that the order of data written to the table isn't guaranteed to match the order that it is read back. While this is useful for preventing conflicts between concurrent writers, you can also use the **APPEND** write mode to preserve write order and raise explicit concurrency conflicts between parallel writers:
248
249
 
249
250
  ```python
@@ -301,6 +302,7 @@ print(pandas_df)
301
302
  <details>
302
303
 
303
304
  <summary><span style="font-size: 1.25em; font-weight: bold;">Schemaless Tables</span></summary>
305
+
304
306
  Tables created automatically via `dc.write` have a schema inferred from the data written by default. However, if you create an empty table without providing a schema, it defaults to schemaless. Writes to schemaless tables are more efficient and flexible, since they simply track the location and basic metadata associated with the data files written to the table. However, if you know that a unified schema can be derived for your schemaless data, then you can you can still read it back as a structured dataset:
305
307
 
306
308
  ```python
@@ -2,7 +2,7 @@
2
2
  <img src="https://github.com/ray-project/deltacat/raw/2.0/media/deltacat-logo-alpha-750.png" alt="deltacat logo" style="width:55%; height:auto; text-align: center;">
3
3
  </p>
4
4
 
5
- DeltaCAT is a portable Multimodal Lakehouse powered by [Ray](https://github.com/ray-project/ray), [Apache Arrow](https://github.com/apache/arrow), and [Daft](https://github.com/Eventual-Inc/Daft). It lets you create ACID-compliant multimodal data lakes [that efficiently scale to manage exabytes of production data](https://aws.amazon.com/blogs/opensource/amazons-exabyte-scale-migration-from-apache-spark-to-ray-on-amazon-ec2/).
5
+ DeltaCAT is a portable Multimodal Lakehouse powered by [Ray](https://github.com/ray-project/ray), [Apache Arrow](https://github.com/apache/arrow), and [Daft](https://github.com/Eventual-Inc/Daft). It lets you create ACID-compliant multimodal data lakes [that efficiently scale to exabytes of production data](https://aws.amazon.com/blogs/opensource/amazons-exabyte-scale-migration-from-apache-spark-to-ray-on-amazon-ec2/).
6
6
 
7
7
  It provides data lake level transactions & time travel, zero-copy schema evolution, zero-copy multimodal file processing (image, audio, video, text, etc.), and transparent dataset optimization. It runs locally for rapid development or in the cloud for production workloads. It runs on any filesystem for easy setup and sharing - no external catalog services, lock managers, or key value stores required.
8
8
 
@@ -193,6 +193,7 @@ assert dc.dataset_length(daft_df) == 6
193
193
  <details>
194
194
 
195
195
  <summary><span style="font-size: 1.25em; font-weight: bold;">Ordered Writes</span></summary>
196
+
196
197
  DeltaCAT writes are unordered by default, which means that the order of data written to the table isn't guaranteed to match the order that it is read back. While this is useful for preventing conflicts between concurrent writers, you can also use the **APPEND** write mode to preserve write order and raise explicit concurrency conflicts between parallel writers:
197
198
 
198
199
  ```python
@@ -250,6 +251,7 @@ print(pandas_df)
250
251
  <details>
251
252
 
252
253
  <summary><span style="font-size: 1.25em; font-weight: bold;">Schemaless Tables</span></summary>
254
+
253
255
  Tables created automatically via `dc.write` have a schema inferred from the data written by default. However, if you create an empty table without providing a schema, it defaults to schemaless. Writes to schemaless tables are more efficient and flexible, since they simply track the location and basic metadata associated with the data files written to the table. However, if you know that a unified schema can be derived for your schemaless data, then you can you can still read it back as a structured dataset:
254
256
 
255
257
  ```python
@@ -126,7 +126,7 @@ if importlib.util.find_spec("pyiceberg") is not None:
126
126
 
127
127
  deltacat.logs.configure_deltacat_logger(logging.getLogger(__name__))
128
128
 
129
- __version__ = "2.0.0.post3"
129
+ __version__ = "2.0.0.post4"
130
130
 
131
131
 
132
132
  __all__ = [
@@ -1735,7 +1735,6 @@ def alter_table(
1735
1735
  resolved_table_properties = None
1736
1736
  if table_properties is not None:
1737
1737
  resolved_table_properties = _add_default_table_properties(table_properties)
1738
- _validate_table_properties(resolved_table_properties)
1739
1738
 
1740
1739
  namespace = namespace or default_namespace()
1741
1740
 
@@ -1784,7 +1783,6 @@ def alter_table(
1784
1783
  raise TableValidationError(
1785
1784
  "Schema evolution is disabled for this table. Please enable schema evolution or remove schema updates."
1786
1785
  )
1787
-
1788
1786
  # Only update table version properties if they are explicitly provided
1789
1787
  resolved_tv_properties = None
1790
1788
  if table_version_properties is not None:
@@ -1797,7 +1795,10 @@ def alter_table(
1797
1795
  table_version_properties,
1798
1796
  default_tv_properties,
1799
1797
  )
1800
- _validate_table_properties(resolved_tv_properties)
1798
+ # Ensure all existing or new table version properties are valid
1799
+ _validate_table_properties(
1800
+ resolved_tv_properties or table_version.properties, table_version.schema
1801
+ )
1801
1802
 
1802
1803
  # Apply schema updates if provided
1803
1804
  updated_schema = None
@@ -1849,14 +1850,19 @@ def _add_default_table_properties(
1849
1850
 
1850
1851
  def _validate_table_properties(
1851
1852
  table_properties: TableProperties,
1853
+ table_schema: Optional[Schema],
1852
1854
  ) -> None:
1853
1855
  read_optimization_level = table_properties.get(
1854
1856
  TableProperty.READ_OPTIMIZATION_LEVEL,
1855
1857
  TablePropertyDefaultValues[TableProperty.READ_OPTIMIZATION_LEVEL],
1856
1858
  )
1857
- if read_optimization_level != TableReadOptimizationLevel.MAX:
1859
+ allowed_read_optimization_levels = [TableReadOptimizationLevel.MAX]
1860
+ if not table_schema or not table_schema.merge_keys:
1861
+ # schemaless tables and tables without merge keys don't require copy-on-write compaction
1862
+ allowed_read_optimization_levels.append(TableReadOptimizationLevel.NONE)
1863
+ if read_optimization_level not in allowed_read_optimization_levels:
1858
1864
  raise NotImplementedError(
1859
- f"Table read optimization level `{read_optimization_level} is not yet supported. Please use {TableReadOptimizationLevel.MAX}"
1865
+ f"Table read optimization level `{read_optimization_level}` is not yet supported. Please use {allowed_read_optimization_levels}"
1860
1866
  )
1861
1867
 
1862
1868
 
@@ -1982,7 +1988,7 @@ def create_table(
1982
1988
  table_version_properties, default_tv_properties
1983
1989
  )
1984
1990
 
1985
- _validate_table_properties(resolved_tv_properties)
1991
+ _validate_table_properties(resolved_tv_properties, schema)
1986
1992
 
1987
1993
  (table, table_version, stream) = _get_storage(**kwargs).create_table_version(
1988
1994
  namespace=namespace,
@@ -2041,6 +2041,283 @@ class TestCopyOnWrite:
2041
2041
  actual_names == expected_names
2042
2042
  ), f"Expected names {expected_names}, but found {actual_names}"
2043
2043
 
2044
+ def test_append_delta_count_compaction_with_optimization_none(self):
2045
+ """Test that compaction is NOT triggered when READ_OPTIMIZATION_LEVEL is NONE, even with delta count trigger."""
2046
+ table_name = "test_append_delta_compaction_none"
2047
+
2048
+ # Create table with READ_OPTIMIZATION_LEVEL=NONE and delta count trigger=2
2049
+ table_properties = {
2050
+ TableProperty.READ_OPTIMIZATION_LEVEL: TableReadOptimizationLevel.NONE,
2051
+ TableProperty.APPENDED_DELTA_COUNT_COMPACTION_TRIGGER: 2,
2052
+ # Set other triggers high so only delta count would trigger compaction (if enabled)
2053
+ TableProperty.APPENDED_RECORD_COUNT_COMPACTION_TRIGGER: 1000,
2054
+ TableProperty.APPENDED_FILE_COUNT_COMPACTION_TRIGGER: 1000,
2055
+ # Set hash bucket count to 1 to get a single compacted file (if compaction occurred)
2056
+ TableProperty.DEFAULT_COMPACTION_HASH_BUCKET_COUNT: 1,
2057
+ }
2058
+
2059
+ # Create table without merge keys (required for APPEND mode)
2060
+ dc.create_table(
2061
+ table=table_name,
2062
+ namespace=self.test_namespace,
2063
+ schema=create_basic_schema(), # No merge keys
2064
+ catalog=self.catalog_name,
2065
+ table_properties=table_properties,
2066
+ auto_create_namespace=True,
2067
+ )
2068
+
2069
+ # First APPEND write - should not trigger compaction yet
2070
+ first_data = pd.DataFrame(
2071
+ {
2072
+ "id": [1, 2],
2073
+ "name": ["Alice", "Bob"],
2074
+ "age": [25, 30],
2075
+ "city": ["NYC", "LA"],
2076
+ }
2077
+ )
2078
+
2079
+ dc.write_to_table(
2080
+ data=first_data,
2081
+ table=table_name,
2082
+ namespace=self.test_namespace,
2083
+ mode=TableWriteMode.APPEND,
2084
+ content_type=ContentType.PARQUET,
2085
+ catalog=self.catalog_name,
2086
+ auto_create_namespace=True,
2087
+ )
2088
+
2089
+ # Verify we have 1 delta after first write (no compaction yet)
2090
+ table_url = dc.DeltaCatUrl(
2091
+ f"dc://{self.catalog_name}/{self.test_namespace}/{table_name}"
2092
+ )
2093
+ objects_after_first = dc.list(table_url, recursive=True)
2094
+
2095
+ from deltacat.storage import Metafile, Delta
2096
+
2097
+ first_deltas = [
2098
+ obj for obj in objects_after_first if Metafile.get_class(obj) == Delta
2099
+ ]
2100
+ assert (
2101
+ len(first_deltas) == 1
2102
+ ), f"Expected 1 delta after first write, but found {len(first_deltas)}"
2103
+
2104
+ # Second APPEND write - should NOT trigger compaction due to READ_OPTIMIZATION_LEVEL=NONE
2105
+ second_data = pd.DataFrame(
2106
+ {
2107
+ "id": [3, 4],
2108
+ "name": ["Charlie", "Dave"],
2109
+ "age": [35, 40],
2110
+ "city": ["Chicago", "Houston"],
2111
+ }
2112
+ )
2113
+
2114
+ dc.write_to_table(
2115
+ data=second_data,
2116
+ table=table_name,
2117
+ namespace=self.test_namespace,
2118
+ mode=TableWriteMode.APPEND,
2119
+ content_type=ContentType.PARQUET,
2120
+ catalog=self.catalog_name,
2121
+ auto_create_namespace=True,
2122
+ )
2123
+
2124
+ # Use dc.list() to verify compaction did NOT occur
2125
+ # Key difference from the regular compaction test: we should have 2 deltas, not 1
2126
+ all_objects = dc.list(table_url, recursive=True)
2127
+
2128
+ # Filter for Delta objects
2129
+ final_deltas = [obj for obj in all_objects if Metafile.get_class(obj) == Delta]
2130
+
2131
+ # Key assertion: Should have 2 deltas since compaction was NOT triggered
2132
+ # This proves that READ_OPTIMIZATION_LEVEL=NONE prevents compaction
2133
+ assert (
2134
+ len(final_deltas) == 2
2135
+ ), f"Expected 2 deltas (no compaction due to optimization level NONE), but found {len(final_deltas)}"
2136
+
2137
+ # Verify both deltas have sequential stream positions (APPEND mode)
2138
+ stream_positions = sorted([delta.stream_position for delta in final_deltas])
2139
+ assert stream_positions == [
2140
+ 1,
2141
+ 2,
2142
+ ], f"Expected stream positions [1, 2], but found {stream_positions}"
2143
+
2144
+ # Verify both deltas are APPEND type
2145
+ for delta in final_deltas:
2146
+ assert (
2147
+ "append" in str(delta.type).lower()
2148
+ ), f"Expected APPEND delta type, but found {delta.type}"
2149
+
2150
+ # Verify data integrity - should have all 4 records from both writes
2151
+ result = dc.read_table(
2152
+ table=table_name,
2153
+ namespace=self.test_namespace,
2154
+ catalog=self.catalog_name,
2155
+ )
2156
+
2157
+ # Should have all 4 records from both writes
2158
+ result_count = get_table_length(result)
2159
+ assert result_count == 4, f"Expected 4 records, but found {result_count}"
2160
+
2161
+ # Verify all records are present
2162
+ result_df = result.to_pandas() if hasattr(result, "to_pandas") else result
2163
+ expected_ids = {1, 2, 3, 4}
2164
+ actual_ids = set(result_df["id"].tolist())
2165
+ assert (
2166
+ actual_ids == expected_ids
2167
+ ), f"Expected IDs {expected_ids}, but found {actual_ids}"
2168
+
2169
+ def test_add_delta_count_compaction_with_optimization_none(self):
2170
+ """Test that compaction is NOT triggered when READ_OPTIMIZATION_LEVEL is NONE, even with delta count trigger."""
2171
+ table_name = "test_add_delta_compaction_none"
2172
+
2173
+ # Create table with READ_OPTIMIZATION_LEVEL=NONE and delta count trigger=2
2174
+ table_properties = {
2175
+ TableProperty.READ_OPTIMIZATION_LEVEL: TableReadOptimizationLevel.NONE,
2176
+ TableProperty.APPENDED_DELTA_COUNT_COMPACTION_TRIGGER: 2,
2177
+ # Set other triggers high so only delta count would trigger compaction (if enabled)
2178
+ TableProperty.APPENDED_RECORD_COUNT_COMPACTION_TRIGGER: 1000,
2179
+ TableProperty.APPENDED_FILE_COUNT_COMPACTION_TRIGGER: 1000,
2180
+ # Set hash bucket count to 1 to get a single compacted file (if compaction occurred)
2181
+ TableProperty.DEFAULT_COMPACTION_HASH_BUCKET_COUNT: 1,
2182
+ }
2183
+
2184
+ # Create table without merge keys (required for ADD mode)
2185
+ dc.create_table(
2186
+ table=table_name,
2187
+ namespace=self.test_namespace,
2188
+ schema=create_basic_schema(), # No merge keys
2189
+ catalog=self.catalog_name,
2190
+ table_properties=table_properties,
2191
+ auto_create_namespace=True,
2192
+ )
2193
+
2194
+ # First ADD write - should not trigger compaction yet
2195
+ first_data = pd.DataFrame(
2196
+ {
2197
+ "id": [1, 2],
2198
+ "name": ["Alice", "Bob"],
2199
+ "age": [25, 30],
2200
+ "city": ["NYC", "LA"],
2201
+ }
2202
+ )
2203
+
2204
+ dc.write_to_table(
2205
+ data=first_data,
2206
+ table=table_name,
2207
+ namespace=self.test_namespace,
2208
+ mode=TableWriteMode.ADD,
2209
+ content_type=ContentType.PARQUET,
2210
+ catalog=self.catalog_name,
2211
+ auto_create_namespace=True,
2212
+ )
2213
+
2214
+ # Verify we have 1 delta after first write (no compaction yet)
2215
+ table_url = dc.DeltaCatUrl(
2216
+ f"dc://{self.catalog_name}/{self.test_namespace}/{table_name}"
2217
+ )
2218
+ objects_after_first = dc.list(table_url, recursive=True)
2219
+
2220
+ from deltacat.storage import Metafile, Delta
2221
+
2222
+ first_deltas = [
2223
+ obj for obj in objects_after_first if Metafile.get_class(obj) == Delta
2224
+ ]
2225
+ assert (
2226
+ len(first_deltas) == 1
2227
+ ), f"Expected 1 delta after first write, but found {len(first_deltas)}"
2228
+
2229
+ # Verify that the first delta is ADD type
2230
+ first_delta = first_deltas[0]
2231
+ assert (
2232
+ "add" in str(first_delta.type).lower()
2233
+ ), f"Expected ADD delta type, but found {first_delta.type}"
2234
+
2235
+ # Verify that ADD deltas have random stream positions (not sequential)
2236
+ first_stream_position = first_delta.stream_position
2237
+ assert (
2238
+ first_stream_position > 10000
2239
+ ), f"Expected large random stream position for ADD delta, but found {first_stream_position}"
2240
+
2241
+ # Second ADD write - should NOT trigger compaction due to READ_OPTIMIZATION_LEVEL=NONE
2242
+ second_data = pd.DataFrame(
2243
+ {
2244
+ "id": [3, 4],
2245
+ "name": ["Charlie", "Dave"],
2246
+ "age": [35, 40],
2247
+ "city": ["Chicago", "Houston"],
2248
+ }
2249
+ )
2250
+
2251
+ dc.write_to_table(
2252
+ data=second_data,
2253
+ table=table_name,
2254
+ namespace=self.test_namespace,
2255
+ mode=TableWriteMode.ADD,
2256
+ content_type=ContentType.PARQUET,
2257
+ catalog=self.catalog_name,
2258
+ auto_create_namespace=True,
2259
+ )
2260
+
2261
+ # Use dc.list() to verify compaction did NOT occur
2262
+ # Key difference from the regular compaction test: we should have 2 deltas, not 1
2263
+ all_objects = dc.list(table_url, recursive=True)
2264
+
2265
+ # Filter for Delta objects
2266
+ final_deltas = [obj for obj in all_objects if Metafile.get_class(obj) == Delta]
2267
+
2268
+ # Key assertion: Should have 2 deltas since compaction was NOT triggered
2269
+ # This proves that READ_OPTIMIZATION_LEVEL=NONE prevents compaction
2270
+ assert (
2271
+ len(final_deltas) == 2
2272
+ ), f"Expected 2 deltas (no compaction due to optimization level NONE), but found {len(final_deltas)}"
2273
+
2274
+ # Sort deltas by stream position for consistent verification
2275
+ sorted_deltas = sorted(final_deltas, key=lambda d: d.stream_position)
2276
+
2277
+ # Verify both deltas are ADD type
2278
+ for delta in sorted_deltas:
2279
+ assert (
2280
+ "add" in str(delta.type).lower()
2281
+ ), f"Expected ADD delta type, but found {delta.type}"
2282
+
2283
+ # Verify both deltas have random stream positions (large numbers)
2284
+ for delta in sorted_deltas:
2285
+ assert (
2286
+ delta.stream_position > 10000
2287
+ ), f"Expected large random stream position for ADD delta, but found {delta.stream_position}"
2288
+
2289
+ # Verify stream positions are unique (no duplicates)
2290
+ stream_positions = [delta.stream_position for delta in sorted_deltas]
2291
+ assert len(set(stream_positions)) == len(
2292
+ stream_positions
2293
+ ), f"Expected unique random stream positions, but found duplicates: {stream_positions}"
2294
+
2295
+ # Verify data integrity - should have all 4 records from both writes
2296
+ result = dc.read_table(
2297
+ table=table_name,
2298
+ namespace=self.test_namespace,
2299
+ catalog=self.catalog_name,
2300
+ )
2301
+
2302
+ # Should have all 4 records from both writes
2303
+ result_count = get_table_length(result)
2304
+ assert result_count == 4, f"Expected 4 records, but found {result_count}"
2305
+
2306
+ # Verify all records are present (ADD mode preserves all records)
2307
+ result_df = result.to_pandas() if hasattr(result, "to_pandas") else result
2308
+ expected_ids = {1, 2, 3, 4}
2309
+ actual_ids = set(result_df["id"].tolist())
2310
+ assert (
2311
+ actual_ids == expected_ids
2312
+ ), f"Expected IDs {expected_ids}, but found {actual_ids}"
2313
+
2314
+ # Verify records can be read in any order (ADD mode doesn't guarantee order)
2315
+ expected_names = {"Alice", "Bob", "Charlie", "Dave"}
2316
+ actual_names = set(result_df["name"].tolist())
2317
+ assert (
2318
+ actual_names == expected_names
2319
+ ), f"Expected names {expected_names}, but found {actual_names}"
2320
+
2044
2321
  def test_add_compaction_with_schema_evolution(self):
2045
2322
  """Test that ADD compaction handles schema evolution correctly with past_default values."""
2046
2323
  table_name = "test_add_schema_evolution"
@@ -2456,6 +2733,30 @@ class TestCopyOnWrite:
2456
2733
  ), "Both tables should have same number of records"
2457
2734
  assert get_table_length(add_result) == 2, "Both tables should have 2 records"
2458
2735
 
2736
+ def test_verify_merge_keys_require_read_optimization(self):
2737
+ """Create a table with merge keys using the standard test schema."""
2738
+ table_name = "test_merge_keys_require_read_optimization"
2739
+ schema = create_schema_with_merge_keys()
2740
+
2741
+ # Create table properties with compaction disabled (currently required to merge updates/deletes)
2742
+ table_properties = {
2743
+ TableProperty.READ_OPTIMIZATION_LEVEL: TableReadOptimizationLevel.NONE,
2744
+ }
2745
+
2746
+ # Ensure that a NotImplementedError is raised since we can't currently merge updates w/o compaction
2747
+ with pytest.raises(NotImplementedError) as exc_info:
2748
+ dc.create_table(
2749
+ table=table_name,
2750
+ namespace=self.test_namespace,
2751
+ schema=schema,
2752
+ content_types=DEFAULT_CONTENT_TYPES,
2753
+ table_properties=table_properties,
2754
+ catalog=self.catalog_name,
2755
+ auto_create_namespace=True,
2756
+ )
2757
+ error_message = str(exc_info.value)
2758
+ assert "read optimization level `none` is not yet supported" in error_message
2759
+
2459
2760
  def test_verify_delta_types_created(self):
2460
2761
  """
2461
2762
  Verify that MERGE operations create UPSERT deltas as expected.
@@ -11082,7 +11383,7 @@ class TestTablePropertyInheritance:
11082
11383
 
11083
11384
  # Define initial table properties
11084
11385
  initial_table_properties: TableProperties = {
11085
- TableProperty.READ_OPTIMIZATION_LEVEL: TableReadOptimizationLevel.MAX,
11386
+ TableProperty.READ_OPTIMIZATION_LEVEL: TableReadOptimizationLevel.NONE,
11086
11387
  TableProperty.APPENDED_RECORD_COUNT_COMPACTION_TRIGGER: 1000,
11087
11388
  TableProperty.APPENDED_FILE_COUNT_COMPACTION_TRIGGER: 100,
11088
11389
  TableProperty.DEFAULT_COMPACTION_HASH_BUCKET_COUNT: 8,
@@ -11178,7 +11479,7 @@ class TestTablePropertyInheritance:
11178
11479
  table_version_2.table_version.properties[
11179
11480
  TableProperty.READ_OPTIMIZATION_LEVEL
11180
11481
  ]
11181
- == TableReadOptimizationLevel.MAX
11482
+ == TableReadOptimizationLevel.NONE
11182
11483
  )
11183
11484
  assert (
11184
11485
  table_version_2.table_version.properties[
@@ -11197,7 +11498,7 @@ class TestTablePropertyInheritance:
11197
11498
 
11198
11499
  # Define initial table properties
11199
11500
  initial_table_properties: TableProperties = {
11200
- TableProperty.READ_OPTIMIZATION_LEVEL: TableReadOptimizationLevel.MAX, # Only MAX is supported
11501
+ TableProperty.READ_OPTIMIZATION_LEVEL: TableReadOptimizationLevel.MAX,
11201
11502
  TableProperty.APPENDED_RECORD_COUNT_COMPACTION_TRIGGER: 500,
11202
11503
  TableProperty.DEFAULT_COMPACTION_HASH_BUCKET_COUNT: 4, # Different from default 8
11203
11504
  }
@@ -11245,7 +11546,7 @@ class TestTablePropertyInheritance:
11245
11546
 
11246
11547
  # Update table properties
11247
11548
  updated_table_properties: TableProperties = {
11248
- TableProperty.READ_OPTIMIZATION_LEVEL: TableReadOptimizationLevel.MAX, # Same as initial
11549
+ TableProperty.READ_OPTIMIZATION_LEVEL: TableReadOptimizationLevel.NONE, # Changed from MAX
11249
11550
  TableProperty.APPENDED_RECORD_COUNT_COMPACTION_TRIGGER: 1000, # Changed from 500
11250
11551
  TableProperty.APPENDED_FILE_COUNT_COMPACTION_TRIGGER: 200, # New property
11251
11552
  TableProperty.DEFAULT_COMPACTION_HASH_BUCKET_COUNT: 16, # Changed from 4
@@ -11375,7 +11676,7 @@ class TestTablePropertyInheritance:
11375
11676
 
11376
11677
  # Define different table version properties
11377
11678
  explicit_table_version_properties: TableVersionProperties = {
11378
- TableProperty.READ_OPTIMIZATION_LEVEL: TableReadOptimizationLevel.MAX, # Only MAX is supported
11679
+ TableProperty.READ_OPTIMIZATION_LEVEL: TableReadOptimizationLevel.NONE,
11379
11680
  TableProperty.APPENDED_RECORD_COUNT_COMPACTION_TRIGGER: 500, # Different from table (1000)
11380
11681
  TableProperty.DEFAULT_COMPACTION_HASH_BUCKET_COUNT: 16, # Different from table default
11381
11682
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deltacat
3
- Version: 2.0.0.post3
3
+ Version: 2.0.0.post4
4
4
  Summary: DeltaCAT is a portable Pythonic Data Lakehouse powered by Ray.
5
5
  Home-page: https://github.com/ray-project/deltacat
6
6
  Author: Ray Team
@@ -53,7 +53,7 @@ Dynamic: summary
53
53
  <img src="https://github.com/ray-project/deltacat/raw/2.0/media/deltacat-logo-alpha-750.png" alt="deltacat logo" style="width:55%; height:auto; text-align: center;">
54
54
  </p>
55
55
 
56
- DeltaCAT is a portable Multimodal Lakehouse powered by [Ray](https://github.com/ray-project/ray), [Apache Arrow](https://github.com/apache/arrow), and [Daft](https://github.com/Eventual-Inc/Daft). It lets you create ACID-compliant multimodal data lakes [that efficiently scale to manage exabytes of production data](https://aws.amazon.com/blogs/opensource/amazons-exabyte-scale-migration-from-apache-spark-to-ray-on-amazon-ec2/).
56
+ DeltaCAT is a portable Multimodal Lakehouse powered by [Ray](https://github.com/ray-project/ray), [Apache Arrow](https://github.com/apache/arrow), and [Daft](https://github.com/Eventual-Inc/Daft). It lets you create ACID-compliant multimodal data lakes [that efficiently scale to exabytes of production data](https://aws.amazon.com/blogs/opensource/amazons-exabyte-scale-migration-from-apache-spark-to-ray-on-amazon-ec2/).
57
57
 
58
58
  It provides data lake level transactions & time travel, zero-copy schema evolution, zero-copy multimodal file processing (image, audio, video, text, etc.), and transparent dataset optimization. It runs locally for rapid development or in the cloud for production workloads. It runs on any filesystem for easy setup and sharing - no external catalog services, lock managers, or key value stores required.
59
59
 
@@ -244,6 +244,7 @@ assert dc.dataset_length(daft_df) == 6
244
244
  <details>
245
245
 
246
246
  <summary><span style="font-size: 1.25em; font-weight: bold;">Ordered Writes</span></summary>
247
+
247
248
  DeltaCAT writes are unordered by default, which means that the order of data written to the table isn't guaranteed to match the order that it is read back. While this is useful for preventing conflicts between concurrent writers, you can also use the **APPEND** write mode to preserve write order and raise explicit concurrency conflicts between parallel writers:
248
249
 
249
250
  ```python
@@ -301,6 +302,7 @@ print(pandas_df)
301
302
  <details>
302
303
 
303
304
  <summary><span style="font-size: 1.25em; font-weight: bold;">Schemaless Tables</span></summary>
305
+
304
306
  Tables created automatically via `dc.write` have a schema inferred from the data written by default. However, if you create an empty table without providing a schema, it defaults to schemaless. Writes to schemaless tables are more efficient and flexible, since they simply track the location and basic metadata associated with the data files written to the table. However, if you know that a unified schema can be derived for your schemaless data, then you can you can still read it back as a structured dataset:
305
307
 
306
308
  ```python
File without changes