hotdata 0.12.0__tar.gz → 0.13.0__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 (303) hide show
  1. {hotdata-0.12.0 → hotdata-0.13.0}/PKG-INFO +1 -1
  2. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/__init__.py +2 -0
  3. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api/connections_api.py +6 -3
  4. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api/databases_api.py +6 -3
  5. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api/query_api.py +3 -3
  6. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/__init__.py +1 -0
  7. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/add_managed_table_decl.py +4 -1
  8. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/add_managed_table_request.py +4 -1
  9. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/database_default_table_decl.py +4 -1
  10. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/job_type.py +1 -0
  11. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/query_request.py +1 -1
  12. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/table_info.py +4 -1
  13. hotdata-0.13.0/hotdata/models/table_layout.py +38 -0
  14. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata.egg-info/PKG-INFO +1 -1
  15. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata.egg-info/SOURCES.txt +2 -0
  16. {hotdata-0.12.0 → hotdata-0.13.0}/pyproject.toml +1 -1
  17. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_add_managed_schema_request.py +1 -0
  18. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_add_managed_table_decl.py +1 -0
  19. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_add_managed_table_request.py +1 -0
  20. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_bulk_create_databases_request.py +1 -0
  21. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_create_database_request.py +1 -0
  22. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_database_default_schema_decl.py +1 -0
  23. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_database_default_table_decl.py +1 -0
  24. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_information_schema_response.py +2 -0
  25. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_table_info.py +2 -0
  26. hotdata-0.13.0/test/test_table_layout.py +34 -0
  27. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_model_extra_forbid.py +5 -2
  28. {hotdata-0.12.0 → hotdata-0.13.0}/README.md +0 -0
  29. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/_retry.py +0 -0
  30. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/_upload_watchdog.py +0 -0
  31. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/_useragent.py +0 -0
  32. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/_workspace.py +0 -0
  33. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api/__init__.py +0 -0
  34. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api/database_context_api.py +0 -0
  35. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api/embedding_providers_api.py +0 -0
  36. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api/indexes_api.py +0 -0
  37. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api/information_schema_api.py +0 -0
  38. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api/jobs_api.py +0 -0
  39. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api/query_runs_api.py +0 -0
  40. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api/results_api.py +0 -0
  41. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api/saved_queries_api.py +0 -0
  42. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api/uploads_api.py +0 -0
  43. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api/usage_api.py +0 -0
  44. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api/workspaces_api.py +0 -0
  45. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api_client.py +0 -0
  46. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/api_response.py +0 -0
  47. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/arrow.py +0 -0
  48. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/configuration.py +0 -0
  49. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/exceptions.py +0 -0
  50. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/loads.py +0 -0
  51. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/add_managed_schema_request.py +0 -0
  52. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/api_error_detail.py +0 -0
  53. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/api_error_response.py +0 -0
  54. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/async_query_response.py +0 -0
  55. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/attach_database_catalog_request.py +0 -0
  56. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/batch_create_upload_request.py +0 -0
  57. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/batch_create_upload_response.py +0 -0
  58. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/boolean_profile_detail.py +0 -0
  59. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/bulk_create_databases_request.py +0 -0
  60. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/bulk_create_databases_result.py +0 -0
  61. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/categorical_profile_detail.py +0 -0
  62. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/category_value_info.py +0 -0
  63. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/column_definition.py +0 -0
  64. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/column_info.py +0 -0
  65. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/column_profile_detail.py +0 -0
  66. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/column_profile_detail_one_of.py +0 -0
  67. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/column_profile_detail_one_of1.py +0 -0
  68. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/column_profile_detail_one_of2.py +0 -0
  69. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/column_profile_detail_one_of3.py +0 -0
  70. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/column_profile_detail_one_of4.py +0 -0
  71. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/column_profile_info.py +0 -0
  72. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/column_type_spec.py +0 -0
  73. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/connection_info.py +0 -0
  74. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/create_connection_request.py +0 -0
  75. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/create_connection_response.py +0 -0
  76. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/create_database_request.py +0 -0
  77. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/create_database_response.py +0 -0
  78. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/create_embedding_provider_request.py +0 -0
  79. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/create_embedding_provider_response.py +0 -0
  80. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/create_index_request.py +0 -0
  81. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/create_saved_query_request.py +0 -0
  82. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/create_upload_request.py +0 -0
  83. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/create_workspace_request.py +0 -0
  84. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/create_workspace_response.py +0 -0
  85. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/database_attachment_info.py +0 -0
  86. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/database_batch_response.py +0 -0
  87. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/database_context_entry.py +0 -0
  88. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/database_count_response.py +0 -0
  89. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/database_default_schema_decl.py +0 -0
  90. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/database_detail_response.py +0 -0
  91. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/database_lineage_response.py +0 -0
  92. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/database_summary.py +0 -0
  93. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/delete_database_batch_response.py +0 -0
  94. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/discovery_status.py +0 -0
  95. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/embedding_provider_response.py +0 -0
  96. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/error.py +0 -0
  97. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/execute_saved_query_request.py +0 -0
  98. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/finalize_upload_part.py +0 -0
  99. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/finalize_upload_request.py +0 -0
  100. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/finalize_upload_response.py +0 -0
  101. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/fork_database_request.py +0 -0
  102. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/forked_from_info.py +0 -0
  103. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/get_connection_response.py +0 -0
  104. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/get_database_context_response.py +0 -0
  105. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/get_result_response.py +0 -0
  106. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/index_entry_response.py +0 -0
  107. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/index_info_response.py +0 -0
  108. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/index_status.py +0 -0
  109. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/information_schema_response.py +0 -0
  110. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/job_result.py +0 -0
  111. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/job_status.py +0 -0
  112. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/job_status_response.py +0 -0
  113. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/lineage_ancestor_info.py +0 -0
  114. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/lineage_fork_info.py +0 -0
  115. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/list_connections_response.py +0 -0
  116. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/list_database_contexts_response.py +0 -0
  117. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/list_databases_response.py +0 -0
  118. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/list_embedding_providers_response.py +0 -0
  119. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/list_indexes_page_response.py +0 -0
  120. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/list_indexes_response.py +0 -0
  121. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/list_jobs_response.py +0 -0
  122. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/list_query_runs_response.py +0 -0
  123. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/list_results_response.py +0 -0
  124. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/list_saved_queries_response.py +0 -0
  125. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/list_saved_query_versions_response.py +0 -0
  126. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/list_workspaces_response.py +0 -0
  127. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/load_managed_table_request.py +0 -0
  128. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/load_managed_table_response.py +0 -0
  129. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/managed_schema_response.py +0 -0
  130. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/managed_table_constant_per_key_response.py +0 -0
  131. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/managed_table_response.py +0 -0
  132. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/mint_upload_parts_request.py +0 -0
  133. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/mint_upload_parts_response.py +0 -0
  134. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/minted_upload_part_response.py +0 -0
  135. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/numeric_profile_detail.py +0 -0
  136. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/query_response.py +0 -0
  137. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/query_run_info.py +0 -0
  138. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/result_info.py +0 -0
  139. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/results_format_query.py +0 -0
  140. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/saved_query_detail.py +0 -0
  141. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/saved_query_summary.py +0 -0
  142. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/saved_query_version_info.py +0 -0
  143. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/submit_job_response.py +0 -0
  144. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/table_partition_key.py +0 -0
  145. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/table_profile_response.py +0 -0
  146. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/table_sort_key.py +0 -0
  147. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/temporal_profile_detail.py +0 -0
  148. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/text_profile_detail.py +0 -0
  149. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/update_embedding_provider_request.py +0 -0
  150. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/update_embedding_provider_response.py +0 -0
  151. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/update_managed_table_request.py +0 -0
  152. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/update_saved_query_request.py +0 -0
  153. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/upload_session_response.py +0 -0
  154. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/upsert_database_context_request.py +0 -0
  155. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/upsert_database_context_response.py +0 -0
  156. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/workspace_detail.py +0 -0
  157. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/workspace_list_item.py +0 -0
  158. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/models/workspace_usage_response.py +0 -0
  159. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/py.typed +0 -0
  160. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/query.py +0 -0
  161. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/rest.py +0 -0
  162. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata/uploads.py +0 -0
  163. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata.egg-info/dependency_links.txt +0 -0
  164. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata.egg-info/requires.txt +0 -0
  165. {hotdata-0.12.0 → hotdata-0.13.0}/hotdata.egg-info/top_level.txt +0 -0
  166. {hotdata-0.12.0 → hotdata-0.13.0}/setup.cfg +0 -0
  167. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_api_client_close.py +0 -0
  168. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_api_error_detail.py +0 -0
  169. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_api_error_response.py +0 -0
  170. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_async_query_response.py +0 -0
  171. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_attach_database_catalog_request.py +0 -0
  172. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_batch_create_upload_request.py +0 -0
  173. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_batch_create_upload_response.py +0 -0
  174. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_boolean_profile_detail.py +0 -0
  175. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_bulk_create_databases_result.py +0 -0
  176. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_categorical_profile_detail.py +0 -0
  177. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_category_value_info.py +0 -0
  178. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_column_definition.py +0 -0
  179. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_column_info.py +0 -0
  180. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_column_profile_detail.py +0 -0
  181. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_column_profile_detail_one_of.py +0 -0
  182. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_column_profile_detail_one_of1.py +0 -0
  183. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_column_profile_detail_one_of2.py +0 -0
  184. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_column_profile_detail_one_of3.py +0 -0
  185. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_column_profile_detail_one_of4.py +0 -0
  186. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_column_profile_info.py +0 -0
  187. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_column_type_spec.py +0 -0
  188. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_connection_info.py +0 -0
  189. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_connections_api.py +0 -0
  190. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_create_connection_request.py +0 -0
  191. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_create_connection_response.py +0 -0
  192. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_create_database_response.py +0 -0
  193. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_create_embedding_provider_request.py +0 -0
  194. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_create_embedding_provider_response.py +0 -0
  195. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_create_index_request.py +0 -0
  196. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_create_saved_query_request.py +0 -0
  197. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_create_upload_request.py +0 -0
  198. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_create_workspace_request.py +0 -0
  199. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_create_workspace_response.py +0 -0
  200. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_database_attachment_info.py +0 -0
  201. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_database_batch_response.py +0 -0
  202. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_database_context_api.py +0 -0
  203. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_database_context_entry.py +0 -0
  204. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_database_count_response.py +0 -0
  205. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_database_detail_response.py +0 -0
  206. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_database_lineage_response.py +0 -0
  207. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_database_summary.py +0 -0
  208. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_databases_api.py +0 -0
  209. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_delete_database_batch_response.py +0 -0
  210. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_discovery_status.py +0 -0
  211. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_embedding_provider_response.py +0 -0
  212. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_embedding_providers_api.py +0 -0
  213. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_error.py +0 -0
  214. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_execute_saved_query_request.py +0 -0
  215. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_finalize_upload_part.py +0 -0
  216. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_finalize_upload_request.py +0 -0
  217. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_finalize_upload_response.py +0 -0
  218. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_fork_database_request.py +0 -0
  219. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_forked_from_info.py +0 -0
  220. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_get_connection_response.py +0 -0
  221. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_get_database_context_response.py +0 -0
  222. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_get_result_response.py +0 -0
  223. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_index_entry_response.py +0 -0
  224. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_index_info_response.py +0 -0
  225. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_index_status.py +0 -0
  226. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_indexes_api.py +0 -0
  227. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_information_schema_api.py +0 -0
  228. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_job_result.py +0 -0
  229. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_job_status.py +0 -0
  230. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_job_status_response.py +0 -0
  231. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_job_type.py +0 -0
  232. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_jobs_api.py +0 -0
  233. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_lineage_ancestor_info.py +0 -0
  234. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_lineage_fork_info.py +0 -0
  235. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_list_connections_response.py +0 -0
  236. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_list_database_contexts_response.py +0 -0
  237. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_list_databases_response.py +0 -0
  238. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_list_embedding_providers_response.py +0 -0
  239. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_list_indexes_page_response.py +0 -0
  240. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_list_indexes_response.py +0 -0
  241. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_list_jobs_response.py +0 -0
  242. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_list_query_runs_response.py +0 -0
  243. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_list_results_response.py +0 -0
  244. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_list_saved_queries_response.py +0 -0
  245. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_list_saved_query_versions_response.py +0 -0
  246. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_list_workspaces_response.py +0 -0
  247. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_load_managed_table_request.py +0 -0
  248. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_load_managed_table_response.py +0 -0
  249. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_managed_schema_response.py +0 -0
  250. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_managed_table_constant_per_key_response.py +0 -0
  251. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_managed_table_response.py +0 -0
  252. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_mint_upload_parts_request.py +0 -0
  253. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_mint_upload_parts_response.py +0 -0
  254. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_minted_upload_part_response.py +0 -0
  255. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_numeric_profile_detail.py +0 -0
  256. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_query_api.py +0 -0
  257. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_query_request.py +0 -0
  258. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_query_response.py +0 -0
  259. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_query_run_info.py +0 -0
  260. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_query_runs_api.py +0 -0
  261. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_result_info.py +0 -0
  262. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_results_api.py +0 -0
  263. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_results_format_query.py +0 -0
  264. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_saved_queries_api.py +0 -0
  265. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_saved_query_detail.py +0 -0
  266. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_saved_query_summary.py +0 -0
  267. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_saved_query_version_info.py +0 -0
  268. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_submit_job_response.py +0 -0
  269. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_table_partition_key.py +0 -0
  270. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_table_profile_response.py +0 -0
  271. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_table_sort_key.py +0 -0
  272. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_temporal_profile_detail.py +0 -0
  273. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_text_profile_detail.py +0 -0
  274. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_update_embedding_provider_request.py +0 -0
  275. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_update_embedding_provider_response.py +0 -0
  276. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_update_managed_table_request.py +0 -0
  277. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_update_saved_query_request.py +0 -0
  278. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_upload_session_response.py +0 -0
  279. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_uploads_api.py +0 -0
  280. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_upsert_database_context_request.py +0 -0
  281. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_upsert_database_context_response.py +0 -0
  282. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_usage_api.py +0 -0
  283. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_workspace_detail.py +0 -0
  284. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_workspace_list_item.py +0 -0
  285. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_workspace_usage_response.py +0 -0
  286. {hotdata-0.12.0 → hotdata-0.13.0}/test/test_workspaces_api.py +0 -0
  287. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_api_token_auth.py +0 -0
  288. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_arrow.py +0 -0
  289. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_config_auth_surface.py +0 -0
  290. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_config_env.py +0 -0
  291. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_loads.py +0 -0
  292. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_query.py +0 -0
  293. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_request_defaults.py +0 -0
  294. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_retry.py +0 -0
  295. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_update_changelog.py +0 -0
  296. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_upload_codex_fixes.py +0 -0
  297. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_upload_multipart_resilient.py +0 -0
  298. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_upload_parity_fixes.py +0 -0
  299. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_upload_resilient.py +0 -0
  300. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_upload_retry_policy.py +0 -0
  301. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_upload_watchdog.py +0 -0
  302. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_uploads.py +0 -0
  303. {hotdata-0.12.0 → hotdata-0.13.0}/tests/test_workspace_guard.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hotdata
3
- Version: 0.12.0
3
+ Version: 0.13.0
4
4
  Summary: Hotdata API
5
5
  Author-email: Hotdata <developers@hotdata.dev>
6
6
  License: MIT
@@ -146,6 +146,7 @@ __all__ = [
146
146
  "SavedQueryVersionInfo",
147
147
  "SubmitJobResponse",
148
148
  "TableInfo",
149
+ "TableLayout",
149
150
  "TablePartitionKey",
150
151
  "TableProfileResponse",
151
152
  "TableSortKey",
@@ -290,6 +291,7 @@ from hotdata.models.saved_query_summary import SavedQuerySummary as SavedQuerySu
290
291
  from hotdata.models.saved_query_version_info import SavedQueryVersionInfo as SavedQueryVersionInfo
291
292
  from hotdata.models.submit_job_response import SubmitJobResponse as SubmitJobResponse
292
293
  from hotdata.models.table_info import TableInfo as TableInfo
294
+ from hotdata.models.table_layout import TableLayout as TableLayout
293
295
  from hotdata.models.table_partition_key import TablePartitionKey as TablePartitionKey
294
296
  from hotdata.models.table_profile_response import TableProfileResponse as TableProfileResponse
295
297
  from hotdata.models.table_sort_key import TableSortKey as TableSortKey
@@ -2339,7 +2339,7 @@ class ConnectionsApi:
2339
2339
  ) -> LoadManagedTableResponse:
2340
2340
  """Load managed table from inline data, upload, or query result
2341
2341
 
2342
- Publish data as the new contents of a managed table from one of three sources — provide exactly one. With `data`, CSV text is sent inline in this request, up to 2 MiB; column types are detected from the data unless `columns` declares them, and a larger payload is rejected with 413 and the error code `INLINE_DATA_TOO_LARGE`, at which point the data should be uploaded and loaded by `upload_id` instead. With `upload_id`, a previously-uploaded file is published: CSV, JSON, and Parquet are supported; the format is auto-detected from the upload's `Content-Type` and file contents, or set explicitly via the `format` field. With `result_id`, a persisted query result is copied into the table, so the table keeps its data even after the result expires; a result can be loaded into any number of tables. If the target table (or its schema) has not been declared yet, it is created automatically as part of the load — declaring tables up front is optional. `mode` selects how the data is applied and accepts five values: `replace` makes the uploaded rows the table's entire contents, `append` inserts them on top of the existing data, and `delete`, `update`, and `upsert` match rows by key — removing, replacing, or inserting-or-replacing the matched rows respectively. The three key-matching modes need a key: the one the table was created with, or one given in `key` on the request. Concurrent loads against the same upload return 409. For an upload or inline data, set `async` to run the load in the background and get back a job ID to poll; add `async_after_ms` to wait briefly for it to finish before falling back to a job ID. A `result_id` load runs synchronously.
2342
+ Publish data as the new contents of a managed table from one of three sources — provide exactly one. With `data`, CSV text is sent inline in this request, up to 2 MiB; column types are detected from the data unless `columns` declares them, and a larger payload is rejected with 413 and the error code `INLINE_DATA_TOO_LARGE`, at which point the data should be uploaded and loaded by `upload_id` instead. With `upload_id`, a previously-uploaded file is published: CSV, JSON, and Parquet are supported; the format is auto-detected from the upload's `Content-Type` and file contents, or set explicitly via the `format` field. With `result_id`, a persisted query result is copied into the table, so the table keeps its data even after the result expires; a result can be loaded into any number of tables. If the target table (or its schema) has not been declared yet, it is created automatically as part of the load — declaring tables up front is optional. `mode` selects how the data is applied and accepts five values: `replace` makes the uploaded rows the table's entire contents, `append` inserts them on top of the existing data, and `delete`, `update`, and `upsert` match rows by key — removing, replacing, or inserting-or-replacing the matched rows respectively. The three key-matching modes need a key: the one the table was created with, or one given in `key` on the request. Concurrent loads against the same upload return 409. For an upload or inline data, set `async` to run the load in the background and get back a job ID to poll; add `async_after_ms` to wait briefly for it to finish before falling back to a job ID. A `result_id` load runs synchronously. While background maintenance holds the table, a load waits for it to finish, for up to 60 seconds, before it starts, in every mode; with `async`, the 202 can arrive only after that wait. A load refused because another write to the table is running gets 409 with the error code `RESOURCE_LOCKED` and a `Retry-After` header.
2343
2343
 
2344
2344
  :param connection_id: Connection ID (required)
2345
2345
  :type connection_id: str
@@ -2389,6 +2389,7 @@ class ConnectionsApi:
2389
2389
  '404': "ApiErrorResponse",
2390
2390
  '409': "ApiErrorResponse",
2391
2391
  '413': "ApiErrorResponse",
2392
+ '503': "ApiErrorResponse",
2392
2393
  }
2393
2394
  response_data = self.api_client.call_api(
2394
2395
  *_param,
@@ -2423,7 +2424,7 @@ class ConnectionsApi:
2423
2424
  ) -> ApiResponse[LoadManagedTableResponse]:
2424
2425
  """Load managed table from inline data, upload, or query result
2425
2426
 
2426
- Publish data as the new contents of a managed table from one of three sources — provide exactly one. With `data`, CSV text is sent inline in this request, up to 2 MiB; column types are detected from the data unless `columns` declares them, and a larger payload is rejected with 413 and the error code `INLINE_DATA_TOO_LARGE`, at which point the data should be uploaded and loaded by `upload_id` instead. With `upload_id`, a previously-uploaded file is published: CSV, JSON, and Parquet are supported; the format is auto-detected from the upload's `Content-Type` and file contents, or set explicitly via the `format` field. With `result_id`, a persisted query result is copied into the table, so the table keeps its data even after the result expires; a result can be loaded into any number of tables. If the target table (or its schema) has not been declared yet, it is created automatically as part of the load — declaring tables up front is optional. `mode` selects how the data is applied and accepts five values: `replace` makes the uploaded rows the table's entire contents, `append` inserts them on top of the existing data, and `delete`, `update`, and `upsert` match rows by key — removing, replacing, or inserting-or-replacing the matched rows respectively. The three key-matching modes need a key: the one the table was created with, or one given in `key` on the request. Concurrent loads against the same upload return 409. For an upload or inline data, set `async` to run the load in the background and get back a job ID to poll; add `async_after_ms` to wait briefly for it to finish before falling back to a job ID. A `result_id` load runs synchronously.
2427
+ Publish data as the new contents of a managed table from one of three sources — provide exactly one. With `data`, CSV text is sent inline in this request, up to 2 MiB; column types are detected from the data unless `columns` declares them, and a larger payload is rejected with 413 and the error code `INLINE_DATA_TOO_LARGE`, at which point the data should be uploaded and loaded by `upload_id` instead. With `upload_id`, a previously-uploaded file is published: CSV, JSON, and Parquet are supported; the format is auto-detected from the upload's `Content-Type` and file contents, or set explicitly via the `format` field. With `result_id`, a persisted query result is copied into the table, so the table keeps its data even after the result expires; a result can be loaded into any number of tables. If the target table (or its schema) has not been declared yet, it is created automatically as part of the load — declaring tables up front is optional. `mode` selects how the data is applied and accepts five values: `replace` makes the uploaded rows the table's entire contents, `append` inserts them on top of the existing data, and `delete`, `update`, and `upsert` match rows by key — removing, replacing, or inserting-or-replacing the matched rows respectively. The three key-matching modes need a key: the one the table was created with, or one given in `key` on the request. Concurrent loads against the same upload return 409. For an upload or inline data, set `async` to run the load in the background and get back a job ID to poll; add `async_after_ms` to wait briefly for it to finish before falling back to a job ID. A `result_id` load runs synchronously. While background maintenance holds the table, a load waits for it to finish, for up to 60 seconds, before it starts, in every mode; with `async`, the 202 can arrive only after that wait. A load refused because another write to the table is running gets 409 with the error code `RESOURCE_LOCKED` and a `Retry-After` header.
2427
2428
 
2428
2429
  :param connection_id: Connection ID (required)
2429
2430
  :type connection_id: str
@@ -2473,6 +2474,7 @@ class ConnectionsApi:
2473
2474
  '404': "ApiErrorResponse",
2474
2475
  '409': "ApiErrorResponse",
2475
2476
  '413': "ApiErrorResponse",
2477
+ '503': "ApiErrorResponse",
2476
2478
  }
2477
2479
  response_data = self.api_client.call_api(
2478
2480
  *_param,
@@ -2507,7 +2509,7 @@ class ConnectionsApi:
2507
2509
  ) -> RESTResponseType:
2508
2510
  """Load managed table from inline data, upload, or query result
2509
2511
 
2510
- Publish data as the new contents of a managed table from one of three sources — provide exactly one. With `data`, CSV text is sent inline in this request, up to 2 MiB; column types are detected from the data unless `columns` declares them, and a larger payload is rejected with 413 and the error code `INLINE_DATA_TOO_LARGE`, at which point the data should be uploaded and loaded by `upload_id` instead. With `upload_id`, a previously-uploaded file is published: CSV, JSON, and Parquet are supported; the format is auto-detected from the upload's `Content-Type` and file contents, or set explicitly via the `format` field. With `result_id`, a persisted query result is copied into the table, so the table keeps its data even after the result expires; a result can be loaded into any number of tables. If the target table (or its schema) has not been declared yet, it is created automatically as part of the load — declaring tables up front is optional. `mode` selects how the data is applied and accepts five values: `replace` makes the uploaded rows the table's entire contents, `append` inserts them on top of the existing data, and `delete`, `update`, and `upsert` match rows by key — removing, replacing, or inserting-or-replacing the matched rows respectively. The three key-matching modes need a key: the one the table was created with, or one given in `key` on the request. Concurrent loads against the same upload return 409. For an upload or inline data, set `async` to run the load in the background and get back a job ID to poll; add `async_after_ms` to wait briefly for it to finish before falling back to a job ID. A `result_id` load runs synchronously.
2512
+ Publish data as the new contents of a managed table from one of three sources — provide exactly one. With `data`, CSV text is sent inline in this request, up to 2 MiB; column types are detected from the data unless `columns` declares them, and a larger payload is rejected with 413 and the error code `INLINE_DATA_TOO_LARGE`, at which point the data should be uploaded and loaded by `upload_id` instead. With `upload_id`, a previously-uploaded file is published: CSV, JSON, and Parquet are supported; the format is auto-detected from the upload's `Content-Type` and file contents, or set explicitly via the `format` field. With `result_id`, a persisted query result is copied into the table, so the table keeps its data even after the result expires; a result can be loaded into any number of tables. If the target table (or its schema) has not been declared yet, it is created automatically as part of the load — declaring tables up front is optional. `mode` selects how the data is applied and accepts five values: `replace` makes the uploaded rows the table's entire contents, `append` inserts them on top of the existing data, and `delete`, `update`, and `upsert` match rows by key — removing, replacing, or inserting-or-replacing the matched rows respectively. The three key-matching modes need a key: the one the table was created with, or one given in `key` on the request. Concurrent loads against the same upload return 409. For an upload or inline data, set `async` to run the load in the background and get back a job ID to poll; add `async_after_ms` to wait briefly for it to finish before falling back to a job ID. A `result_id` load runs synchronously. While background maintenance holds the table, a load waits for it to finish, for up to 60 seconds, before it starts, in every mode; with `async`, the 202 can arrive only after that wait. A load refused because another write to the table is running gets 409 with the error code `RESOURCE_LOCKED` and a `Retry-After` header.
2511
2513
 
2512
2514
  :param connection_id: Connection ID (required)
2513
2515
  :type connection_id: str
@@ -2557,6 +2559,7 @@ class ConnectionsApi:
2557
2559
  '404': "ApiErrorResponse",
2558
2560
  '409': "ApiErrorResponse",
2559
2561
  '413': "ApiErrorResponse",
2562
+ '503': "ApiErrorResponse",
2560
2563
  }
2561
2564
  response_data = self.api_client.call_api(
2562
2565
  *_param,
@@ -4082,7 +4082,7 @@ class DatabasesApi:
4082
4082
  ) -> LoadManagedTableResponse:
4083
4083
  """Load database table from inline data, upload, or query result
4084
4084
 
4085
- Publish data as the new contents of a table on the database's default catalog, from one of three sources — provide exactly one. The database-scoped equivalent of the connection-scoped managed-table load — addressed by `database_id`, so no `default_connection_id` is needed. With `data`, CSV text is sent inline in this request, up to 2 MiB; column types are detected from the data unless `columns` declares them, and a larger payload is rejected with 413 and the error code `INLINE_DATA_TOO_LARGE`, at which point the data should be uploaded and loaded by `upload_id` instead. With `upload_id`, a previously-uploaded file is published: CSV, JSON, and Parquet are supported; the format is auto-detected or set via `format`. With `result_id`, a persisted query result is copied into the table, so the table keeps its data even after the result expires. If the target table (or its schema) has not been declared yet, it is created automatically as part of the load — declaring tables up front is optional. `mode` selects how the data is applied: `replace` overwrites the table's contents, `append` inserts the new rows on top of the existing data. Concurrent loads against the same upload return 409. For an upload or inline data, set `async` to run the load in the background and get back a job ID to poll; add `async_after_ms` to wait briefly for it to finish before falling back to a job ID. A `result_id` load runs synchronously.
4085
+ Publish data as the new contents of a table on the database's default catalog, from one of three sources — provide exactly one. The database-scoped equivalent of the connection-scoped managed-table load — addressed by `database_id`, so no `default_connection_id` is needed. With `data`, CSV text is sent inline in this request, up to 2 MiB; column types are detected from the data unless `columns` declares them, and a larger payload is rejected with 413 and the error code `INLINE_DATA_TOO_LARGE`, at which point the data should be uploaded and loaded by `upload_id` instead. With `upload_id`, a previously-uploaded file is published: CSV, JSON, and Parquet are supported; the format is auto-detected or set via `format`. With `result_id`, a persisted query result is copied into the table, so the table keeps its data even after the result expires. If the target table (or its schema) has not been declared yet, it is created automatically as part of the load — declaring tables up front is optional. `mode` selects how the data is applied: `replace` overwrites the table's contents, `append` inserts the new rows on top of the existing data. Concurrent loads against the same upload return 409. For an upload or inline data, set `async` to run the load in the background and get back a job ID to poll; add `async_after_ms` to wait briefly for it to finish before falling back to a job ID. A `result_id` load runs synchronously. While background maintenance holds the table, a load waits for it to finish, for up to 60 seconds, before it starts, in every mode; with `async`, the 202 can arrive only after that wait. A load refused because another write to the table is running gets 409 with the error code `RESOURCE_LOCKED` and a `Retry-After` header.
4086
4086
 
4087
4087
  :param database_id: Database ID (required)
4088
4088
  :type database_id: str
@@ -4132,6 +4132,7 @@ class DatabasesApi:
4132
4132
  '404': "ApiErrorResponse",
4133
4133
  '409': "ApiErrorResponse",
4134
4134
  '413': "ApiErrorResponse",
4135
+ '503': "ApiErrorResponse",
4135
4136
  }
4136
4137
  response_data = self.api_client.call_api(
4137
4138
  *_param,
@@ -4166,7 +4167,7 @@ class DatabasesApi:
4166
4167
  ) -> ApiResponse[LoadManagedTableResponse]:
4167
4168
  """Load database table from inline data, upload, or query result
4168
4169
 
4169
- Publish data as the new contents of a table on the database's default catalog, from one of three sources — provide exactly one. The database-scoped equivalent of the connection-scoped managed-table load — addressed by `database_id`, so no `default_connection_id` is needed. With `data`, CSV text is sent inline in this request, up to 2 MiB; column types are detected from the data unless `columns` declares them, and a larger payload is rejected with 413 and the error code `INLINE_DATA_TOO_LARGE`, at which point the data should be uploaded and loaded by `upload_id` instead. With `upload_id`, a previously-uploaded file is published: CSV, JSON, and Parquet are supported; the format is auto-detected or set via `format`. With `result_id`, a persisted query result is copied into the table, so the table keeps its data even after the result expires. If the target table (or its schema) has not been declared yet, it is created automatically as part of the load — declaring tables up front is optional. `mode` selects how the data is applied: `replace` overwrites the table's contents, `append` inserts the new rows on top of the existing data. Concurrent loads against the same upload return 409. For an upload or inline data, set `async` to run the load in the background and get back a job ID to poll; add `async_after_ms` to wait briefly for it to finish before falling back to a job ID. A `result_id` load runs synchronously.
4170
+ Publish data as the new contents of a table on the database's default catalog, from one of three sources — provide exactly one. The database-scoped equivalent of the connection-scoped managed-table load — addressed by `database_id`, so no `default_connection_id` is needed. With `data`, CSV text is sent inline in this request, up to 2 MiB; column types are detected from the data unless `columns` declares them, and a larger payload is rejected with 413 and the error code `INLINE_DATA_TOO_LARGE`, at which point the data should be uploaded and loaded by `upload_id` instead. With `upload_id`, a previously-uploaded file is published: CSV, JSON, and Parquet are supported; the format is auto-detected or set via `format`. With `result_id`, a persisted query result is copied into the table, so the table keeps its data even after the result expires. If the target table (or its schema) has not been declared yet, it is created automatically as part of the load — declaring tables up front is optional. `mode` selects how the data is applied: `replace` overwrites the table's contents, `append` inserts the new rows on top of the existing data. Concurrent loads against the same upload return 409. For an upload or inline data, set `async` to run the load in the background and get back a job ID to poll; add `async_after_ms` to wait briefly for it to finish before falling back to a job ID. A `result_id` load runs synchronously. While background maintenance holds the table, a load waits for it to finish, for up to 60 seconds, before it starts, in every mode; with `async`, the 202 can arrive only after that wait. A load refused because another write to the table is running gets 409 with the error code `RESOURCE_LOCKED` and a `Retry-After` header.
4170
4171
 
4171
4172
  :param database_id: Database ID (required)
4172
4173
  :type database_id: str
@@ -4216,6 +4217,7 @@ class DatabasesApi:
4216
4217
  '404': "ApiErrorResponse",
4217
4218
  '409': "ApiErrorResponse",
4218
4219
  '413': "ApiErrorResponse",
4220
+ '503': "ApiErrorResponse",
4219
4221
  }
4220
4222
  response_data = self.api_client.call_api(
4221
4223
  *_param,
@@ -4250,7 +4252,7 @@ class DatabasesApi:
4250
4252
  ) -> RESTResponseType:
4251
4253
  """Load database table from inline data, upload, or query result
4252
4254
 
4253
- Publish data as the new contents of a table on the database's default catalog, from one of three sources — provide exactly one. The database-scoped equivalent of the connection-scoped managed-table load — addressed by `database_id`, so no `default_connection_id` is needed. With `data`, CSV text is sent inline in this request, up to 2 MiB; column types are detected from the data unless `columns` declares them, and a larger payload is rejected with 413 and the error code `INLINE_DATA_TOO_LARGE`, at which point the data should be uploaded and loaded by `upload_id` instead. With `upload_id`, a previously-uploaded file is published: CSV, JSON, and Parquet are supported; the format is auto-detected or set via `format`. With `result_id`, a persisted query result is copied into the table, so the table keeps its data even after the result expires. If the target table (or its schema) has not been declared yet, it is created automatically as part of the load — declaring tables up front is optional. `mode` selects how the data is applied: `replace` overwrites the table's contents, `append` inserts the new rows on top of the existing data. Concurrent loads against the same upload return 409. For an upload or inline data, set `async` to run the load in the background and get back a job ID to poll; add `async_after_ms` to wait briefly for it to finish before falling back to a job ID. A `result_id` load runs synchronously.
4255
+ Publish data as the new contents of a table on the database's default catalog, from one of three sources — provide exactly one. The database-scoped equivalent of the connection-scoped managed-table load — addressed by `database_id`, so no `default_connection_id` is needed. With `data`, CSV text is sent inline in this request, up to 2 MiB; column types are detected from the data unless `columns` declares them, and a larger payload is rejected with 413 and the error code `INLINE_DATA_TOO_LARGE`, at which point the data should be uploaded and loaded by `upload_id` instead. With `upload_id`, a previously-uploaded file is published: CSV, JSON, and Parquet are supported; the format is auto-detected or set via `format`. With `result_id`, a persisted query result is copied into the table, so the table keeps its data even after the result expires. If the target table (or its schema) has not been declared yet, it is created automatically as part of the load — declaring tables up front is optional. `mode` selects how the data is applied: `replace` overwrites the table's contents, `append` inserts the new rows on top of the existing data. Concurrent loads against the same upload return 409. For an upload or inline data, set `async` to run the load in the background and get back a job ID to poll; add `async_after_ms` to wait briefly for it to finish before falling back to a job ID. A `result_id` load runs synchronously. While background maintenance holds the table, a load waits for it to finish, for up to 60 seconds, before it starts, in every mode; with `async`, the 202 can arrive only after that wait. A load refused because another write to the table is running gets 409 with the error code `RESOURCE_LOCKED` and a `Retry-After` header.
4254
4256
 
4255
4257
  :param database_id: Database ID (required)
4256
4258
  :type database_id: str
@@ -4300,6 +4302,7 @@ class DatabasesApi:
4300
4302
  '404': "ApiErrorResponse",
4301
4303
  '409': "ApiErrorResponse",
4302
4304
  '413': "ApiErrorResponse",
4305
+ '503': "ApiErrorResponse",
4303
4306
  }
4304
4307
  response_data = self.api_client.call_api(
4305
4308
  *_param,
@@ -60,7 +60,7 @@ class QueryApi:
60
60
  ) -> QueryResponse:
61
61
  """Execute SQL query
62
62
 
63
- Execute a SQL query scoped to a database. A database is the only window into catalogs: the query sees only that database's auto `default` catalog plus any catalogs explicitly attached to it. Select the database with EITHER the `X-Database-Id` header OR the `database_id` body field (exactly one must be given; if both are sent and disagree, that's a 400). Use standard Postgres-compatible SQL; reference the default catalog as `default.<schema>.<table>` (or just `<schema>.<table>` / `<table>`) and attached catalogs by their alias. Results are returned inline and a `result_id` is provided for later retrieval via the Results API. Set `async: true` to execute asynchronously — returns a query run ID for polling. Optionally set `async_after_ms` to attempt synchronous execution first, falling back to async if the query exceeds the timeout. To receive the rows as an Arrow IPC stream instead of JSON, send `Accept: application/vnd.apache.arrow.stream` (without also listing `application/json`). A query that completes within the request then returns 200 with an Arrow IPC stream body (schema, record batches, end-of-stream), and the values the JSON body would carry are sent as response headers: `X-Query-Run-Id`, `X-Result-Id` (when the result was saved), `X-Total-Row-Count`, `X-Execution-Time-Ms`, and `X-Query-Warning` (when there is a warning). Arrow keeps `±Inf` and `NaN` float values as they are. An Arrow response always holds the whole result: if the result is larger than an inline response can hold, the request returns 202 with the query run ticket and an `X-Result-Id` header instead, and the full result is read from `GET /v1/results/{id}?format=arrow` once it is ready. A query that goes async, and every error, return the same JSON bodies as without the header.
63
+ Execute a SQL query scoped to a database. A database is the only window into catalogs: the query sees only that database's auto `default` catalog plus any catalogs explicitly attached to it. Select the database with EITHER the `X-Database-Id` header OR the `database_id` body field (exactly one must be given; if both are sent and disagree, that's a 400). Use standard Postgres-compatible SQL; reference the default catalog as `default.<schema>.<table>` (or just `<schema>.<table>` / `<table>`) and attached catalogs by their alias. Results are returned inline and a `result_id` is provided for later retrieval via the Results API. Set `async: true` to execute asynchronously — returns a query run ID for polling. Optionally set `async_after_ms` to attempt synchronous execution first, falling back to async if the query exceeds the timeout. To receive the rows as an Arrow IPC stream instead of JSON, send `Accept: application/vnd.apache.arrow.stream` (without also listing `application/json`). A query that completes within the request then returns 200 with an Arrow IPC stream body (schema, record batches, end-of-stream), and the values the JSON body would carry are sent as response headers: `X-Query-Run-Id`, `X-Result-Id` (when the result was saved), `X-Total-Row-Count`, `X-Execution-Time-Ms`, and `X-Query-Warning` (when there is a warning). Arrow keeps `±Inf` and `NaN` float values as they are. An Arrow response always holds the whole result: if the result is larger than an inline response can hold, the request returns 202 with the query run ticket and an `X-Result-Id` header instead, and the full result is read from `GET /v1/results/{id}?format=arrow` once it is ready. A query that goes async, and every error, return the same JSON bodies as without the header. The endpoint also runs write statements: `INSERT INTO … VALUES … / SELECT …` (append only), `UPDATE … SET … [WHERE …]`, `DELETE FROM … [WHERE …]`, `CREATE TABLE`, `CREATE TABLE … AS SELECT …` and `DROP TABLE`. A write runs once, inline, and answers with a one-row result holding a single `rows_affected` column. Writes need an API key holding both the `read` and `write` permissions, may only target the database's own `default` catalog (attached catalogs stay read-only), and are never run from a saved query. A `DELETE` reports the number of rows its `WHERE` matched and deleted; `DELETE … LIMIT`, `USING` and `RETURNING` are refused. An `UPDATE` reports the number of rows its `WHERE` matched. Each `SET` value is computed from the row as it was before the statement, so `SET a = b, b = a` swaps two values. An `UPDATE` cannot use a table alias, `FROM`, `RETURNING`, `LIMIT` or `ORDER BY`, cannot set one column twice, and cannot set a column that a vector index generates; that column is computed again from its source text. On a table that declares `constant_per_key`, an `UPDATE` cannot set a key column or a `constant_per_key` column. Every other mutation (`ALTER`, views, `COPY`, transactions, `EXPLAIN` of a write) is refused.
64
64
 
65
65
  :param query_request: (required)
66
66
  :type query_request: QueryRequest
@@ -137,7 +137,7 @@ class QueryApi:
137
137
  ) -> ApiResponse[QueryResponse]:
138
138
  """Execute SQL query
139
139
 
140
- Execute a SQL query scoped to a database. A database is the only window into catalogs: the query sees only that database's auto `default` catalog plus any catalogs explicitly attached to it. Select the database with EITHER the `X-Database-Id` header OR the `database_id` body field (exactly one must be given; if both are sent and disagree, that's a 400). Use standard Postgres-compatible SQL; reference the default catalog as `default.<schema>.<table>` (or just `<schema>.<table>` / `<table>`) and attached catalogs by their alias. Results are returned inline and a `result_id` is provided for later retrieval via the Results API. Set `async: true` to execute asynchronously — returns a query run ID for polling. Optionally set `async_after_ms` to attempt synchronous execution first, falling back to async if the query exceeds the timeout. To receive the rows as an Arrow IPC stream instead of JSON, send `Accept: application/vnd.apache.arrow.stream` (without also listing `application/json`). A query that completes within the request then returns 200 with an Arrow IPC stream body (schema, record batches, end-of-stream), and the values the JSON body would carry are sent as response headers: `X-Query-Run-Id`, `X-Result-Id` (when the result was saved), `X-Total-Row-Count`, `X-Execution-Time-Ms`, and `X-Query-Warning` (when there is a warning). Arrow keeps `±Inf` and `NaN` float values as they are. An Arrow response always holds the whole result: if the result is larger than an inline response can hold, the request returns 202 with the query run ticket and an `X-Result-Id` header instead, and the full result is read from `GET /v1/results/{id}?format=arrow` once it is ready. A query that goes async, and every error, return the same JSON bodies as without the header.
140
+ Execute a SQL query scoped to a database. A database is the only window into catalogs: the query sees only that database's auto `default` catalog plus any catalogs explicitly attached to it. Select the database with EITHER the `X-Database-Id` header OR the `database_id` body field (exactly one must be given; if both are sent and disagree, that's a 400). Use standard Postgres-compatible SQL; reference the default catalog as `default.<schema>.<table>` (or just `<schema>.<table>` / `<table>`) and attached catalogs by their alias. Results are returned inline and a `result_id` is provided for later retrieval via the Results API. Set `async: true` to execute asynchronously — returns a query run ID for polling. Optionally set `async_after_ms` to attempt synchronous execution first, falling back to async if the query exceeds the timeout. To receive the rows as an Arrow IPC stream instead of JSON, send `Accept: application/vnd.apache.arrow.stream` (without also listing `application/json`). A query that completes within the request then returns 200 with an Arrow IPC stream body (schema, record batches, end-of-stream), and the values the JSON body would carry are sent as response headers: `X-Query-Run-Id`, `X-Result-Id` (when the result was saved), `X-Total-Row-Count`, `X-Execution-Time-Ms`, and `X-Query-Warning` (when there is a warning). Arrow keeps `±Inf` and `NaN` float values as they are. An Arrow response always holds the whole result: if the result is larger than an inline response can hold, the request returns 202 with the query run ticket and an `X-Result-Id` header instead, and the full result is read from `GET /v1/results/{id}?format=arrow` once it is ready. A query that goes async, and every error, return the same JSON bodies as without the header. The endpoint also runs write statements: `INSERT INTO … VALUES … / SELECT …` (append only), `UPDATE … SET … [WHERE …]`, `DELETE FROM … [WHERE …]`, `CREATE TABLE`, `CREATE TABLE … AS SELECT …` and `DROP TABLE`. A write runs once, inline, and answers with a one-row result holding a single `rows_affected` column. Writes need an API key holding both the `read` and `write` permissions, may only target the database's own `default` catalog (attached catalogs stay read-only), and are never run from a saved query. A `DELETE` reports the number of rows its `WHERE` matched and deleted; `DELETE … LIMIT`, `USING` and `RETURNING` are refused. An `UPDATE` reports the number of rows its `WHERE` matched. Each `SET` value is computed from the row as it was before the statement, so `SET a = b, b = a` swaps two values. An `UPDATE` cannot use a table alias, `FROM`, `RETURNING`, `LIMIT` or `ORDER BY`, cannot set one column twice, and cannot set a column that a vector index generates; that column is computed again from its source text. On a table that declares `constant_per_key`, an `UPDATE` cannot set a key column or a `constant_per_key` column. Every other mutation (`ALTER`, views, `COPY`, transactions, `EXPLAIN` of a write) is refused.
141
141
 
142
142
  :param query_request: (required)
143
143
  :type query_request: QueryRequest
@@ -214,7 +214,7 @@ class QueryApi:
214
214
  ) -> RESTResponseType:
215
215
  """Execute SQL query
216
216
 
217
- Execute a SQL query scoped to a database. A database is the only window into catalogs: the query sees only that database's auto `default` catalog plus any catalogs explicitly attached to it. Select the database with EITHER the `X-Database-Id` header OR the `database_id` body field (exactly one must be given; if both are sent and disagree, that's a 400). Use standard Postgres-compatible SQL; reference the default catalog as `default.<schema>.<table>` (or just `<schema>.<table>` / `<table>`) and attached catalogs by their alias. Results are returned inline and a `result_id` is provided for later retrieval via the Results API. Set `async: true` to execute asynchronously — returns a query run ID for polling. Optionally set `async_after_ms` to attempt synchronous execution first, falling back to async if the query exceeds the timeout. To receive the rows as an Arrow IPC stream instead of JSON, send `Accept: application/vnd.apache.arrow.stream` (without also listing `application/json`). A query that completes within the request then returns 200 with an Arrow IPC stream body (schema, record batches, end-of-stream), and the values the JSON body would carry are sent as response headers: `X-Query-Run-Id`, `X-Result-Id` (when the result was saved), `X-Total-Row-Count`, `X-Execution-Time-Ms`, and `X-Query-Warning` (when there is a warning). Arrow keeps `±Inf` and `NaN` float values as they are. An Arrow response always holds the whole result: if the result is larger than an inline response can hold, the request returns 202 with the query run ticket and an `X-Result-Id` header instead, and the full result is read from `GET /v1/results/{id}?format=arrow` once it is ready. A query that goes async, and every error, return the same JSON bodies as without the header.
217
+ Execute a SQL query scoped to a database. A database is the only window into catalogs: the query sees only that database's auto `default` catalog plus any catalogs explicitly attached to it. Select the database with EITHER the `X-Database-Id` header OR the `database_id` body field (exactly one must be given; if both are sent and disagree, that's a 400). Use standard Postgres-compatible SQL; reference the default catalog as `default.<schema>.<table>` (or just `<schema>.<table>` / `<table>`) and attached catalogs by their alias. Results are returned inline and a `result_id` is provided for later retrieval via the Results API. Set `async: true` to execute asynchronously — returns a query run ID for polling. Optionally set `async_after_ms` to attempt synchronous execution first, falling back to async if the query exceeds the timeout. To receive the rows as an Arrow IPC stream instead of JSON, send `Accept: application/vnd.apache.arrow.stream` (without also listing `application/json`). A query that completes within the request then returns 200 with an Arrow IPC stream body (schema, record batches, end-of-stream), and the values the JSON body would carry are sent as response headers: `X-Query-Run-Id`, `X-Result-Id` (when the result was saved), `X-Total-Row-Count`, `X-Execution-Time-Ms`, and `X-Query-Warning` (when there is a warning). Arrow keeps `±Inf` and `NaN` float values as they are. An Arrow response always holds the whole result: if the result is larger than an inline response can hold, the request returns 202 with the query run ticket and an `X-Result-Id` header instead, and the full result is read from `GET /v1/results/{id}?format=arrow` once it is ready. A query that goes async, and every error, return the same JSON bodies as without the header. The endpoint also runs write statements: `INSERT INTO … VALUES … / SELECT …` (append only), `UPDATE … SET … [WHERE …]`, `DELETE FROM … [WHERE …]`, `CREATE TABLE`, `CREATE TABLE … AS SELECT …` and `DROP TABLE`. A write runs once, inline, and answers with a one-row result holding a single `rows_affected` column. Writes need an API key holding both the `read` and `write` permissions, may only target the database's own `default` catalog (attached catalogs stay read-only), and are never run from a saved query. A `DELETE` reports the number of rows its `WHERE` matched and deleted; `DELETE … LIMIT`, `USING` and `RETURNING` are refused. An `UPDATE` reports the number of rows its `WHERE` matched. Each `SET` value is computed from the row as it was before the statement, so `SET a = b, b = a` swaps two values. An `UPDATE` cannot use a table alias, `FROM`, `RETURNING`, `LIMIT` or `ORDER BY`, cannot set one column twice, and cannot set a column that a vector index generates; that column is computed again from its source text. On a table that declares `constant_per_key`, an `UPDATE` cannot set a key column or a `constant_per_key` column. Every other mutation (`ALTER`, views, `COPY`, transactions, `EXPLAIN` of a write) is refused.
218
218
 
219
219
  :param query_request: (required)
220
220
  :type query_request: QueryRequest
@@ -113,6 +113,7 @@ from hotdata.models.saved_query_summary import SavedQuerySummary
113
113
  from hotdata.models.saved_query_version_info import SavedQueryVersionInfo
114
114
  from hotdata.models.submit_job_response import SubmitJobResponse
115
115
  from hotdata.models.table_info import TableInfo
116
+ from hotdata.models.table_layout import TableLayout
116
117
  from hotdata.models.table_partition_key import TablePartitionKey
117
118
  from hotdata.models.table_profile_response import TableProfileResponse
118
119
  from hotdata.models.table_sort_key import TableSortKey
@@ -20,6 +20,7 @@ import json
20
20
 
21
21
  from pydantic import BaseModel, ConfigDict, Field, StrictStr
22
22
  from typing import Any, ClassVar, Dict, List, Optional
23
+ from hotdata.models.table_layout import TableLayout
23
24
  from hotdata.models.table_partition_key import TablePartitionKey
24
25
  from hotdata.models.table_sort_key import TableSortKey
25
26
  from typing import Optional, Set
@@ -31,10 +32,11 @@ class AddManagedTableDecl(BaseModel):
31
32
  """ # noqa: E501
32
33
  constant_per_key: Optional[List[StrictStr]] = Field(default=None, description="Columns whose value is determined by this table's `key`: for every uploaded row, every stored row sharing its key holds the same value of these columns. Declaring this lets a keyed mutation (`delete`, `update`, `upsert`) restrict its search for prior versions to the values the upload carries, which prunes far harder than the key alone when the key's own file statistics are weak. Omit (the default) for the unrestricted search. **Correctness-affecting, not a hint.** If the assertion is false, a mutation supersedes one version of a key and appends beside another, silently duplicating it. Declare it only where the invariant is established.")
33
34
  key: Optional[List[StrictStr]] = Field(default=None, description="Columns that uniquely identify a row, enabling the key-based load modes (`delete`, `update`, `upsert`) on this table: those loads match rows by these columns' values. Omit (the default) to declare no key; the table can still be loaded with `replace` and `append`, but key-based modes are then rejected.")
35
+ layout: Optional[TableLayout] = Field(default=None, description="Storage layout of the table: `analytical` (the default), or `point_lookup`, which writes small data pages so the table's rows can be fetched by id cheaply, which is what a vector index's answers do; analytical scans of it read more pages. Declared when the table is created and fixed thereafter.")
34
36
  name: StrictStr
35
37
  partition_by: Optional[List[TablePartitionKey]] = Field(default=None, description="Partition keys for this table, applied in order. Omit for no partitioning. Declared when the table is created and fixed thereafter.")
36
38
  sorted_by: Optional[List[TableSortKey]] = Field(default=None, description="Sort keys for this table, applied in order. Omit for no sort order. Declared when the table is created and fixed thereafter. A table with a sort order cannot be indexed: creating any index on it is refused, so leave this empty on a table you plan to search.")
37
- __properties: ClassVar[List[str]] = ["constant_per_key", "key", "name", "partition_by", "sorted_by"]
39
+ __properties: ClassVar[List[str]] = ["constant_per_key", "key", "layout", "name", "partition_by", "sorted_by"]
38
40
 
39
41
  model_config = ConfigDict(
40
42
  populate_by_name=True,
@@ -107,6 +109,7 @@ class AddManagedTableDecl(BaseModel):
107
109
  _obj = cls.model_validate({
108
110
  "constant_per_key": obj.get("constant_per_key"),
109
111
  "key": obj.get("key"),
112
+ "layout": obj.get("layout"),
110
113
  "name": obj.get("name"),
111
114
  "partition_by": [TablePartitionKey.from_dict(_item) for _item in obj["partition_by"]] if obj.get("partition_by") is not None else None,
112
115
  "sorted_by": [TableSortKey.from_dict(_item) for _item in obj["sorted_by"]] if obj.get("sorted_by") is not None else None
@@ -20,6 +20,7 @@ import json
20
20
 
21
21
  from pydantic import BaseModel, ConfigDict, Field, StrictStr
22
22
  from typing import Any, ClassVar, Dict, List, Optional
23
+ from hotdata.models.table_layout import TableLayout
23
24
  from hotdata.models.table_partition_key import TablePartitionKey
24
25
  from hotdata.models.table_sort_key import TableSortKey
25
26
  from typing import Optional, Set
@@ -31,10 +32,11 @@ class AddManagedTableRequest(BaseModel):
31
32
  """ # noqa: E501
32
33
  constant_per_key: Optional[List[StrictStr]] = Field(default=None, description="Columns whose value is determined by this table's `key`: for every uploaded row, every stored row sharing its key holds the same value of these columns. Declaring this lets a keyed mutation (`delete`, `update`, `upsert`) restrict its search for prior versions to the values the upload carries, which prunes far harder than the key alone when the key's own file statistics are weak. Omit (the default) for the unrestricted search. **Correctness-affecting, not a hint.** If the assertion is false, a mutation supersedes one version of a key and appends beside another, silently duplicating it. Declare it only where the invariant is established.")
33
34
  key: Optional[List[StrictStr]] = Field(default=None, description="Columns that uniquely identify a row, enabling the key-based load modes (`delete`, `update`, `upsert`) on this table: those loads match rows by these columns' values. Omit (the default) to declare no key; the table can still be loaded with `replace` and `append`, but key-based modes are then rejected.")
35
+ layout: Optional[TableLayout] = Field(default=None, description="Storage layout of the table: `analytical` (the default), or `point_lookup`, which writes small data pages so the table's rows can be fetched by id cheaply, which is what a vector index's answers do; analytical scans of it read more pages. Declared when the table is created and fixed thereafter.")
34
36
  name: StrictStr
35
37
  partition_by: Optional[List[TablePartitionKey]] = Field(default=None, description="Partition keys for this table, applied in order. Omit for no partitioning. Declared when the table is created and fixed thereafter.")
36
38
  sorted_by: Optional[List[TableSortKey]] = Field(default=None, description="Sort keys for this table, applied in order. Omit for no sort order. Declared when the table is created and fixed thereafter. A table with a sort order cannot be indexed: creating any index on it is refused, so leave this empty on a table you plan to search.")
37
- __properties: ClassVar[List[str]] = ["constant_per_key", "key", "name", "partition_by", "sorted_by"]
39
+ __properties: ClassVar[List[str]] = ["constant_per_key", "key", "layout", "name", "partition_by", "sorted_by"]
38
40
 
39
41
  model_config = ConfigDict(
40
42
  populate_by_name=True,
@@ -107,6 +109,7 @@ class AddManagedTableRequest(BaseModel):
107
109
  _obj = cls.model_validate({
108
110
  "constant_per_key": obj.get("constant_per_key"),
109
111
  "key": obj.get("key"),
112
+ "layout": obj.get("layout"),
110
113
  "name": obj.get("name"),
111
114
  "partition_by": [TablePartitionKey.from_dict(_item) for _item in obj["partition_by"]] if obj.get("partition_by") is not None else None,
112
115
  "sorted_by": [TableSortKey.from_dict(_item) for _item in obj["sorted_by"]] if obj.get("sorted_by") is not None else None
@@ -20,6 +20,7 @@ import json
20
20
 
21
21
  from pydantic import BaseModel, ConfigDict, Field, StrictStr
22
22
  from typing import Any, ClassVar, Dict, List, Optional
23
+ from hotdata.models.table_layout import TableLayout
23
24
  from hotdata.models.table_partition_key import TablePartitionKey
24
25
  from hotdata.models.table_sort_key import TableSortKey
25
26
  from typing import Optional, Set
@@ -31,10 +32,11 @@ class DatabaseDefaultTableDecl(BaseModel):
31
32
  """ # noqa: E501
32
33
  constant_per_key: Optional[List[StrictStr]] = Field(default=None, description="Columns whose value is determined by this table's `key`: for every uploaded row, every stored row sharing its key holds the same value of these columns. Declaring this lets a keyed mutation (`delete`, `update`, `upsert`) restrict its search for prior versions to the values the upload carries, which prunes far harder than the key alone when the key's own file statistics are weak. Omit (the default) for the unrestricted search. **Correctness-affecting, not a hint.** If the assertion is false, a mutation supersedes one version of a key and appends beside another, silently duplicating it. Declare it only where the invariant is established.")
33
34
  key: Optional[List[StrictStr]] = Field(default=None, description="Columns that uniquely identify a row, enabling the key-based load modes (`delete`, `update`, `upsert`) on this table: those loads match rows by these columns' values. Omit (the default) to declare no key; the table can still be loaded with `replace` and `append`, but key-based modes are then rejected.")
35
+ layout: Optional[TableLayout] = Field(default=None, description="Storage layout of the table: `analytical` (the default), or `point_lookup`, which writes small data pages so the table's rows can be fetched by id cheaply, which is what a vector index's answers do; analytical scans of it read more pages. Declared when the table is created and fixed thereafter.")
34
36
  name: StrictStr
35
37
  partition_by: Optional[List[TablePartitionKey]] = Field(default=None, description="Partition keys for this table, applied in order. Omit for no partitioning. Declared when the table is created and fixed thereafter.")
36
38
  sorted_by: Optional[List[TableSortKey]] = Field(default=None, description="Sort keys for this table, applied in order. Omit for no sort order. Declared when the table is created and fixed thereafter. A table with a sort order cannot be indexed: creating any index on it is refused, so leave this empty on a table you plan to search.")
37
- __properties: ClassVar[List[str]] = ["constant_per_key", "key", "name", "partition_by", "sorted_by"]
39
+ __properties: ClassVar[List[str]] = ["constant_per_key", "key", "layout", "name", "partition_by", "sorted_by"]
38
40
 
39
41
  model_config = ConfigDict(
40
42
  populate_by_name=True,
@@ -107,6 +109,7 @@ class DatabaseDefaultTableDecl(BaseModel):
107
109
  _obj = cls.model_validate({
108
110
  "constant_per_key": obj.get("constant_per_key"),
109
111
  "key": obj.get("key"),
112
+ "layout": obj.get("layout"),
110
113
  "name": obj.get("name"),
111
114
  "partition_by": [TablePartitionKey.from_dict(_item) for _item in obj["partition_by"]] if obj.get("partition_by") is not None else None,
112
115
  "sorted_by": [TableSortKey.from_dict(_item) for _item in obj["sorted_by"]] if obj.get("sorted_by") is not None else None
@@ -38,6 +38,7 @@ class JobType(str, Enum):
38
38
  RESULT_RETENTION = 'result_retention'
39
39
  DUCKLAKE_COMPACTION = 'ducklake_compaction'
40
40
  DUCKLAKE_TABLE_COMPACTION = 'ducklake_table_compaction'
41
+ IVF_REBALANCE_SWEEP = 'ivf_rebalance_sweep'
41
42
  TABLE_CONSTANTS_UPDATE = 'table_constants_update'
42
43
  DATABASE_FORK = 'database_fork'
43
44
 
@@ -33,7 +33,7 @@ class QueryRequest(BaseModel):
33
33
  database_id: Optional[StrictStr] = Field(default=None, description="Database to scope the query to (its id). Alternative to the `X-Database-Id` header — exactly one source must be provided. If both this field and the header are set and they disagree, the request is rejected with a 400.")
34
34
  default_catalog: Optional[StrictStr] = Field(default=None, description="Catalog that unqualified table references resolve against within the query's database scope. Must name a catalog visible in the database (`default`, an attached catalog alias, or a system catalog). Defaults to `default` when omitted.")
35
35
  default_schema: Optional[StrictStr] = Field(default=None, description="Schema that unqualified table references resolve against within the query's database scope. Omit it to use the database's own default schema — the `default_schema` chosen when the database was created, or the single schema it declares, and only `main` when it has neither. The database's `default_schema` field (see `GET /v1/databases/{id}`) reports the value in force. Setting this field overrides that per query, so sending `main` on a database whose data lives in another schema turns a query that works without the field into a \"table not found\" error. Existence is not validated up front — an unknown schema surfaces as a \"table not found\" error at planning time. Fully-qualified references (`<catalog>.<schema>.<table>`) are unaffected.")
36
- dialect: Optional[StrictStr] = Field(default=None, description="SQL dialect the `sql` field is written in. One of `hotsql` (the default), `duckdb`, `postgres`, or `snowflake`. When set to anything other than `hotsql`, the query is translated to HotSQL before it runs, so you can use idioms from that dialect (for example Snowflake `IFF(...)` or Postgres `MOD(a, b)`). Write statements are accepted on the same terms as in HotSQL: refused unless the instance accepts SQL writes. An unrecognized value is rejected with a 400.")
36
+ dialect: Optional[StrictStr] = Field(default=None, description="SQL dialect the `sql` field is written in. One of `hotsql` (the default), `duckdb`, `postgres`, or `snowflake`. When set to anything other than `hotsql`, the query is translated to HotSQL before it runs, so you can use idioms from that dialect (for example Snowflake `IFF(...)` or Postgres `MOD(a, b)`). Write statements are accepted on the same terms as in HotSQL. An unrecognized value is rejected with a 400.")
37
37
  sql: StrictStr
38
38
  __properties: ClassVar[List[str]] = ["async", "async_after_ms", "database_id", "default_catalog", "default_schema", "dialect", "sql"]
39
39
 
@@ -21,6 +21,7 @@ import json
21
21
  from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictStr
22
22
  from typing import Any, ClassVar, Dict, List, Optional
23
23
  from hotdata.models.column_info import ColumnInfo
24
+ from hotdata.models.table_layout import TableLayout
24
25
  from hotdata.models.table_partition_key import TablePartitionKey
25
26
  from hotdata.models.table_sort_key import TableSortKey
26
27
  from typing import Optional, Set
@@ -34,12 +35,13 @@ class TableInfo(BaseModel):
34
35
  connection: StrictStr
35
36
  constant_per_key: List[StrictStr] = Field(description="Columns the table declares constant for a given key: for every row, any other row sharing its key holds the same value of these columns. Declaring this lets a keyed mutation narrow its search for prior versions to the values the upload carries. Empty when none is declared, which is the unrestricted search. Unlike `partition_by` and `sorted_by` this is NOT fixed at creation — it changes only which files a mutation opens, never how rows are written — so read it here rather than assuming a declaration took effect.")
36
37
  last_sync: Optional[StrictStr] = None
38
+ layout: TableLayout = Field(description="The table's storage layout: `analytical`, or `point_lookup`, whose small data pages make fetching its rows by id cheap. Fixed at creation.")
37
39
  partition_by: List[TablePartitionKey] = Field(description="The table's partition keys, in the order they were declared when the table was created. Empty when the table is not partitioned. A table's storage layout is fixed when the table is created and cannot be changed afterwards, so this is how to confirm a table really was created with the layout that was asked for. The field is always present: an empty array means \"no partitioning declared\", which is not the same as a response that omits the field entirely. Reported for tables in a Hotdata instant database, which are the only ones whose layout is declared here. A table discovered from an external connection always reports an empty array — its layout belongs to the upstream system, so an empty array there means \"not known from here\", not \"confirmed unpartitioned\".")
38
40
  var_schema: StrictStr = Field(alias="schema")
39
41
  sorted_by: List[TableSortKey] = Field(description="The table's sort keys, in the order they were declared when the table was created. Empty when no sort order was declared. Always present, and limited to tables in a Hotdata instant database, for the same reasons as `partition_by`.")
40
42
  synced: StrictBool
41
43
  table: StrictStr
42
- __properties: ClassVar[List[str]] = ["columns", "connection", "constant_per_key", "last_sync", "partition_by", "schema", "sorted_by", "synced", "table"]
44
+ __properties: ClassVar[List[str]] = ["columns", "connection", "constant_per_key", "last_sync", "layout", "partition_by", "schema", "sorted_by", "synced", "table"]
43
45
 
44
46
  model_config = ConfigDict(
45
47
  populate_by_name=True,
@@ -127,6 +129,7 @@ class TableInfo(BaseModel):
127
129
  "connection": obj.get("connection"),
128
130
  "constant_per_key": obj.get("constant_per_key"),
129
131
  "last_sync": obj.get("last_sync"),
132
+ "layout": obj.get("layout"),
130
133
  "partition_by": [TablePartitionKey.from_dict(_item) for _item in obj["partition_by"]] if obj.get("partition_by") is not None else None,
131
134
  "schema": obj.get("schema"),
132
135
  "sorted_by": [TableSortKey.from_dict(_item) for _item in obj["sorted_by"]] if obj.get("sorted_by") is not None else None,
@@ -0,0 +1,38 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Hotdata API
5
+
6
+ Powerful data platform API for instant databases, queries, and analytics.
7
+
8
+ The version of the OpenAPI document: 1.0.0
9
+ Contact: developers@hotdata.dev
10
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
11
+
12
+ Do not edit the class manually.
13
+ """ # noqa: E501
14
+
15
+
16
+ from __future__ import annotations
17
+ import json
18
+ from enum import Enum
19
+ from typing_extensions import Self
20
+
21
+
22
+ class TableLayout(str, Enum):
23
+ """
24
+ Storage layout of a table.
25
+ """
26
+
27
+ """
28
+ allowed enum values
29
+ """
30
+ ANALYTICAL = 'analytical'
31
+ POINT_LOOKUP = 'point_lookup'
32
+
33
+ @classmethod
34
+ def from_json(cls, json_str: str) -> Self:
35
+ """Create an instance of TableLayout from a JSON string"""
36
+ return cls(json.loads(json_str))
37
+
38
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hotdata
3
- Version: 0.12.0
3
+ Version: 0.13.0
4
4
  Summary: Hotdata API
5
5
  Author-email: Hotdata <developers@hotdata.dev>
6
6
  License: MIT
@@ -136,6 +136,7 @@ hotdata/models/saved_query_summary.py
136
136
  hotdata/models/saved_query_version_info.py
137
137
  hotdata/models/submit_job_response.py
138
138
  hotdata/models/table_info.py
139
+ hotdata/models/table_layout.py
139
140
  hotdata/models/table_partition_key.py
140
141
  hotdata/models/table_profile_response.py
141
142
  hotdata/models/table_sort_key.py
@@ -262,6 +263,7 @@ test/test_saved_query_summary.py
262
263
  test/test_saved_query_version_info.py
263
264
  test/test_submit_job_response.py
264
265
  test/test_table_info.py
266
+ test/test_table_layout.py
265
267
  test/test_table_partition_key.py
266
268
  test/test_table_profile_response.py
267
269
  test/test_table_sort_key.py
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "hotdata"
3
- version = "0.12.0"
3
+ version = "0.13.0"
4
4
  description = "Hotdata API"
5
5
  authors = [
6
6
  {name = "Hotdata",email = "developers@hotdata.dev"},
@@ -41,6 +41,7 @@ class TestAddManagedSchemaRequest(unittest.TestCase):
41
41
  hotdata.models.add_managed_table_decl.AddManagedTableDecl(
42
42
  constant_per_key = [event_date],
43
43
  key = [order_id],
44
+ layout = null,
44
45
  name = 'orders',
45
46
  partition_by = [
46
47
  hotdata.models.table_partition_key.TablePartitionKey(
@@ -38,6 +38,7 @@ class TestAddManagedTableDecl(unittest.TestCase):
38
38
  return AddManagedTableDecl(
39
39
  constant_per_key = [event_date],
40
40
  key = [order_id],
41
+ layout = 'analytical',
41
42
  name = 'orders',
42
43
  partition_by = [
43
44
  hotdata.models.table_partition_key.TablePartitionKey(
@@ -38,6 +38,7 @@ class TestAddManagedTableRequest(unittest.TestCase):
38
38
  return AddManagedTableRequest(
39
39
  constant_per_key = [event_date],
40
40
  key = [order_id],
41
+ layout = 'analytical',
41
42
  name = 'orders',
42
43
  partition_by = [
43
44
  hotdata.models.table_partition_key.TablePartitionKey(
@@ -49,6 +49,7 @@ class TestBulkCreateDatabasesRequest(unittest.TestCase):
49
49
  hotdata.models.database_default_table_decl.DatabaseDefaultTableDecl(
50
50
  constant_per_key = [event_date],
51
51
  key = [order_id],
52
+ layout = null,
52
53
  name = 'orders',
53
54
  partition_by = [
54
55
  hotdata.models.table_partition_key.TablePartitionKey(
@@ -48,6 +48,7 @@ class TestCreateDatabaseRequest(unittest.TestCase):
48
48
  hotdata.models.database_default_table_decl.DatabaseDefaultTableDecl(
49
49
  constant_per_key = [event_date],
50
50
  key = [order_id],
51
+ layout = null,
51
52
  name = 'orders',
52
53
  partition_by = [
53
54
  hotdata.models.table_partition_key.TablePartitionKey(
@@ -41,6 +41,7 @@ class TestDatabaseDefaultSchemaDecl(unittest.TestCase):
41
41
  hotdata.models.database_default_table_decl.DatabaseDefaultTableDecl(
42
42
  constant_per_key = [event_date],
43
43
  key = [order_id],
44
+ layout = null,
44
45
  name = 'orders',
45
46
  partition_by = [
46
47
  hotdata.models.table_partition_key.TablePartitionKey(
@@ -38,6 +38,7 @@ class TestDatabaseDefaultTableDecl(unittest.TestCase):
38
38
  return DatabaseDefaultTableDecl(
39
39
  constant_per_key = [event_date],
40
40
  key = [order_id],
41
+ layout = 'analytical',
41
42
  name = 'orders',
42
43
  partition_by = [
43
44
  hotdata.models.table_partition_key.TablePartitionKey(
@@ -53,6 +53,7 @@ class TestInformationSchemaResponse(unittest.TestCase):
53
53
  ''
54
54
  ],
55
55
  last_sync = '',
56
+ layout = null,
56
57
  partition_by = [
57
58
  hotdata.models.table_partition_key.TablePartitionKey(
58
59
  column = 'created_at',
@@ -87,6 +88,7 @@ class TestInformationSchemaResponse(unittest.TestCase):
87
88
  ''
88
89
  ],
89
90
  last_sync = '',
91
+ layout = null,
90
92
  partition_by = [
91
93
  hotdata.models.table_partition_key.TablePartitionKey(
92
94
  column = 'created_at',
@@ -47,6 +47,7 @@ class TestTableInfo(unittest.TestCase):
47
47
  ''
48
48
  ],
49
49
  last_sync = '',
50
+ layout = 'analytical',
50
51
  partition_by = [
51
52
  hotdata.models.table_partition_key.TablePartitionKey(
52
53
  column = 'created_at',
@@ -68,6 +69,7 @@ class TestTableInfo(unittest.TestCase):
68
69
  constant_per_key = [
69
70
  ''
70
71
  ],
72
+ layout = 'analytical',
71
73
  partition_by = [
72
74
  hotdata.models.table_partition_key.TablePartitionKey(
73
75
  column = 'created_at',
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Hotdata API
5
+
6
+ Powerful data platform API for instant databases, queries, and analytics.
7
+
8
+ The version of the OpenAPI document: 1.0.0
9
+ Contact: developers@hotdata.dev
10
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
11
+
12
+ Do not edit the class manually.
13
+ """ # noqa: E501
14
+
15
+
16
+ import unittest
17
+
18
+ from hotdata.models.table_layout import TableLayout
19
+
20
+ class TestTableLayout(unittest.TestCase):
21
+ """TableLayout unit test stubs"""
22
+
23
+ def setUp(self):
24
+ pass
25
+
26
+ def tearDown(self):
27
+ pass
28
+
29
+ def testTableLayout(self):
30
+ """Test TableLayout"""
31
+ # inst = TableLayout()
32
+
33
+ if __name__ == '__main__':
34
+ unittest.main()
@@ -91,10 +91,13 @@ def test_every_request_body_model_forbids_extras() -> None:
91
91
  src = index[cls].read_text()
92
92
  if 'extra="forbid"' in src:
93
93
  continue
94
- # The oneOf/anyOf wrappers carry a different ConfigDict and have no
95
- # plain fields to forbid on; anything else must have been patched.
94
+ # The oneOf/anyOf wrappers carry a different ConfigDict and enums have
95
+ # no fields at all, so neither has anything to forbid on; anything
96
+ # else must have been patched.
96
97
  if re.search(r"^\s+(oneof|anyof)_schema_\d+_validator", src, re.M):
97
98
  continue
99
+ if re.search(r"^class \w+\(str, Enum\):", src, re.M):
100
+ continue
98
101
  missing.append(cls)
99
102
  assert missing == []
100
103
 
File without changes
File without changes
File without changes
File without changes