vastdb 1.3.9__tar.gz → 1.3.11__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 (229) hide show
  1. {vastdb-1.3.9 → vastdb-1.3.11}/CHANGELOG.md +25 -0
  2. {vastdb-1.3.9 → vastdb-1.3.11}/PKG-INFO +1 -1
  3. {vastdb-1.3.9 → vastdb-1.3.11}/README.md +9 -5
  4. {vastdb-1.3.9 → vastdb-1.3.11}/setup.py +1 -1
  5. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/_internal.py +50 -34
  6. vastdb-1.3.11/vastdb/bench/test_perf.py +87 -0
  7. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/conftest.py +9 -2
  8. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/errors.py +57 -3
  9. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/features.py +5 -1
  10. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/schema.py +7 -6
  11. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/table.py +51 -15
  12. vastdb-1.3.11/vastdb/tests/test_fixed_list.py +294 -0
  13. vastdb-1.3.11/vastdb/tests/test_imports.py +556 -0
  14. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/tests/test_nested.py +13 -8
  15. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/tests/test_tables.py +88 -4
  16. vastdb-1.3.11/vastdb/tests/util.py +38 -0
  17. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb.egg-info/PKG-INFO +1 -1
  18. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb.egg-info/SOURCES.txt +1 -0
  19. vastdb-1.3.9/vastdb/bench/test_perf.py +0 -28
  20. vastdb-1.3.9/vastdb/tests/test_imports.py +0 -204
  21. vastdb-1.3.9/vastdb/tests/util.py +0 -17
  22. {vastdb-1.3.9 → vastdb-1.3.11}/CONTRIBUTING.md +0 -0
  23. {vastdb-1.3.9 → vastdb-1.3.11}/LICENSE +0 -0
  24. {vastdb-1.3.9 → vastdb-1.3.11}/MANIFEST.in +0 -0
  25. {vastdb-1.3.9 → vastdb-1.3.11}/requirements.txt +0 -0
  26. {vastdb-1.3.9 → vastdb-1.3.11}/setup.cfg +0 -0
  27. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/__init__.py +0 -0
  28. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/__init__.py +0 -0
  29. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/__init__.py +0 -0
  30. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/bench_repo/__init__.py +0 -0
  31. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/bench_repo/mega_combo.py +0 -0
  32. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/cli.py +0 -0
  33. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/common/__init__.py +0 -0
  34. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/common/constants.py +0 -0
  35. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/common/log_utils.py +0 -0
  36. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/common/types.py +0 -0
  37. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/common/utils.py +0 -0
  38. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/dataset/__init__.py +0 -0
  39. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/dataset/generate_secmaster.py +0 -0
  40. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/dataset/generate_stocks_dataset.py +0 -0
  41. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/dataset/schemas.py +0 -0
  42. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/dataset/secmaster.py +0 -0
  43. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/orchestrate/__init__.py +0 -0
  44. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/orchestrate/bench_spec.py +0 -0
  45. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/orchestrate/results_helpers.py +0 -0
  46. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/orchestrate/scenario.py +0 -0
  47. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/orchestrate/scenario_generator.py +0 -0
  48. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/query/__init__.py +0 -0
  49. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/query/arrow_common.py +0 -0
  50. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/query/query.py +0 -0
  51. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/query/query_pyarrow.py +0 -0
  52. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/query/query_vastdb.py +0 -0
  53. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/perf_bench/run.py +0 -0
  54. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bench/test_sample.py +0 -0
  55. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/bucket.py +0 -0
  56. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/config.py +0 -0
  57. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/session.py +0 -0
  58. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/tests/__init__.py +0 -0
  59. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/tests/metrics.py +0 -0
  60. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/tests/test_duckdb.py +0 -0
  61. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/tests/test_projections.py +0 -0
  62. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/tests/test_sanity.py +0 -0
  63. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/tests/test_schemas.py +0 -0
  64. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/tests/test_util.py +0 -0
  65. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/transaction.py +0 -0
  66. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/util.py +0 -0
  67. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/__init__.py +0 -0
  68. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/__init__.py +0 -0
  69. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/__init__.py +0 -0
  70. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/__init__.py +0 -0
  71. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/__init__.py +0 -0
  72. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Aggregate.py +0 -0
  73. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ArraySlice.py +0 -0
  74. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ArraySubscript.py +0 -0
  75. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/BinaryLiteral.py +0 -0
  76. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/BooleanLiteral.py +0 -0
  77. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Bound.py +0 -0
  78. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Call.py +0 -0
  79. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/CaseFragment.py +0 -0
  80. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Cast.py +0 -0
  81. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ConcreteBoundImpl.py +0 -0
  82. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ConditionalCase.py +0 -0
  83. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/CurrentRow.py +0 -0
  84. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DateLiteral.py +0 -0
  85. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DecimalLiteral.py +0 -0
  86. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Deref.py +0 -0
  87. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DurationLiteral.py +0 -0
  88. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Expression.py +0 -0
  89. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ExpressionImpl.py +0 -0
  90. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FieldIndex.py +0 -0
  91. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FieldRef.py +0 -0
  92. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Filter.py +0 -0
  93. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FixedSizeBinaryLiteral.py +0 -0
  94. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float16Literal.py +0 -0
  95. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float32Literal.py +0 -0
  96. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float64Literal.py +0 -0
  97. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Following.py +0 -0
  98. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Frame.py +0 -0
  99. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Grouping.py +0 -0
  100. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int16Literal.py +0 -0
  101. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int32Literal.py +0 -0
  102. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int64Literal.py +0 -0
  103. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int8Literal.py +0 -0
  104. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteral.py +0 -0
  105. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralDaysMilliseconds.py +0 -0
  106. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralImpl.py +0 -0
  107. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralMonths.py +0 -0
  108. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Join.py +0 -0
  109. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/JoinKind.py +0 -0
  110. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/KeyValue.py +0 -0
  111. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Limit.py +0 -0
  112. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ListLiteral.py +0 -0
  113. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Literal.py +0 -0
  114. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralColumn.py +0 -0
  115. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralImpl.py +0 -0
  116. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralRelation.py +0 -0
  117. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/MapKey.py +0 -0
  118. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/MapLiteral.py +0 -0
  119. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/OrderBy.py +0 -0
  120. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Ordering.py +0 -0
  121. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Plan.py +0 -0
  122. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Preceding.py +0 -0
  123. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Project.py +0 -0
  124. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/RelId.py +0 -0
  125. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Relation.py +0 -0
  126. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/RelationImpl.py +0 -0
  127. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SetOpKind.py +0 -0
  128. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SetOperation.py +0 -0
  129. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SimpleCase.py +0 -0
  130. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SortKey.py +0 -0
  131. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Source.py +0 -0
  132. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StringLiteral.py +0 -0
  133. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StructField.py +0 -0
  134. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StructLiteral.py +0 -0
  135. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/TimeLiteral.py +0 -0
  136. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/TimestampLiteral.py +0 -0
  137. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt16Literal.py +0 -0
  138. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt32Literal.py +0 -0
  139. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt64Literal.py +0 -0
  140. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt8Literal.py +0 -0
  141. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Unbounded.py +0 -0
  142. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/WindowCall.py +0 -0
  143. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/__init__.py +0 -0
  144. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Binary.py +0 -0
  145. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Block.py +0 -0
  146. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/BodyCompression.py +0 -0
  147. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/BodyCompressionMethod.py +0 -0
  148. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Bool.py +0 -0
  149. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Buffer.py +0 -0
  150. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/CompressionType.py +0 -0
  151. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Date.py +0 -0
  152. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/DateUnit.py +0 -0
  153. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Decimal.py +0 -0
  154. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryBatch.py +0 -0
  155. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryEncoding.py +0 -0
  156. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryKind.py +0 -0
  157. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Duration.py +0 -0
  158. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Endianness.py +0 -0
  159. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Feature.py +0 -0
  160. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Field.py +0 -0
  161. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/FieldNode.py +0 -0
  162. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/FixedSizeBinary.py +0 -0
  163. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/FixedSizeList.py +0 -0
  164. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/FloatingPoint.py +0 -0
  165. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Footer.py +0 -0
  166. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Int.py +0 -0
  167. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Interval.py +0 -0
  168. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/IntervalUnit.py +0 -0
  169. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/KeyValue.py +0 -0
  170. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/LargeBinary.py +0 -0
  171. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/LargeList.py +0 -0
  172. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/LargeUtf8.py +0 -0
  173. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/List.py +0 -0
  174. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Map.py +0 -0
  175. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Message.py +0 -0
  176. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/MessageHeader.py +0 -0
  177. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/MetadataVersion.py +0 -0
  178. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Null.py +0 -0
  179. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Precision.py +0 -0
  180. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/RecordBatch.py +0 -0
  181. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Schema.py +0 -0
  182. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseMatrixCompressedAxis.py +0 -0
  183. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseMatrixIndexCSX.py +0 -0
  184. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensor.py +0 -0
  185. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndex.py +0 -0
  186. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndexCOO.py +0 -0
  187. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndexCSF.py +0 -0
  188. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Struct_.py +0 -0
  189. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Tensor.py +0 -0
  190. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/TensorDim.py +0 -0
  191. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Time.py +0 -0
  192. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/TimeUnit.py +0 -0
  193. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Timestamp.py +0 -0
  194. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Type.py +0 -0
  195. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Union.py +0 -0
  196. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/UnionMode.py +0 -0
  197. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Utf8.py +0 -0
  198. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/__init__.py +0 -0
  199. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/AlterColumnRequest.py +0 -0
  200. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/AlterProjectionTableRequest.py +0 -0
  201. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/AlterSchemaRequest.py +0 -0
  202. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/AlterTableRequest.py +0 -0
  203. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/Column.py +0 -0
  204. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/ColumnDetails.py +0 -0
  205. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/ColumnType.py +0 -0
  206. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/CreateProjectionRequest.py +0 -0
  207. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/CreateSchemaRequest.py +0 -0
  208. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/CreateViewRequest.py +0 -0
  209. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/FilterString.py +0 -0
  210. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/GetProjectionTableStatsResponse.py +0 -0
  211. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/GetRowColumnSecurityResponse.py +0 -0
  212. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/GetTableStatsResponse.py +0 -0
  213. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/ImportDataRequest.py +0 -0
  214. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/KeyName.py +0 -0
  215. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/ListProjectionsResponse.py +0 -0
  216. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/ListSchemasResponse.py +0 -0
  217. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/ListTablesResponse.py +0 -0
  218. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/ListViewsResponse.py +0 -0
  219. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/NameString.py +0 -0
  220. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/ObjectDetails.py +0 -0
  221. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/S3File.py +0 -0
  222. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/VipRange.py +0 -0
  223. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_flatbuf/tabular/__init__.py +0 -0
  224. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_tests/__init__.py +0 -0
  225. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_tests/test_ha.py +0 -0
  226. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb/vast_tests/test_scale.py +0 -0
  227. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb.egg-info/dependency_links.txt +0 -0
  228. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb.egg-info/requires.txt +0 -0
  229. {vastdb-1.3.9 → vastdb-1.3.11}/vastdb.egg-info/top_level.txt +0 -0
@@ -4,6 +4,31 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
6
6
 
7
+ ## [1.3.11] (2025-007-10)
8
+ [1.3.11]: https://github.com/vast-data/vastdb_sdk/compare/v1.3.10...v1.3.11
9
+
10
+ ### Added
11
+ - Support Tables with FixedSizeListArray of Numerics
12
+
13
+ ## Fixed
14
+ - Table insert with no rows
15
+ - Boolean predicates
16
+ - List tables with pagination
17
+ - Amount of threads used for parallel queries
18
+
19
+
20
+ ## [1.3.10] (2025-05-11)
21
+ [1.3.10]: https://github.com/vast-data/vastdb_sdk/compare/v1.3.9...v1.3.10
22
+
23
+ ### Added
24
+ - Support limit on query data
25
+ - Support for timestamp with timezone
26
+
27
+ ## Fixed
28
+ - Don't modify the user-passed config
29
+ - Name the feature logger
30
+
31
+
7
32
  ## [1.3.9] (2025-04-22)
8
33
  [1.3.9]: https://github.com/vast-data/vastdb_sdk/compare/v1.3.8...v1.3.9
9
34
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vastdb
3
- Version: 1.3.9
3
+ Version: 1.3.11
4
4
  Summary: VAST Data SDK
5
5
  Home-page: https://github.com/vast-data/vastdb_sdk
6
6
  Author: VAST DATA
@@ -2,14 +2,18 @@
2
2
 
3
3
  # VAST DB Python SDK
4
4
 
5
- ## Introduction
5
+ A Python SDK for seamless interaction with [VAST Database](https://vastdata.com/database) and [VAST Catalog](https://vastdata.com/blog/vast-catalog-treat-your-file-system-like-a-database). Enables powerful data operations including:
6
6
 
7
- `vastdb` is a Python-based SDK designed for interacting with a [VAST Database](https://vastdata.com/database) and the [VAST Catalog](https://vastdata.com/blog/vast-catalog-treat-your-file-system-like-a-database), enabling schema and table management, efficient ingest, query, and modification of columnar data.
8
-
9
- For more details about the VAST Database, see [this whitepaper](https://vastdata.com/whitepaper/#TheVASTDataBase).
7
+ - Schema and table management
8
+ - Efficient data ingest and querying
9
+ - Advanced filtering with predicate pushdown
10
+ - Direct integration with PyArrow and DuckDB
11
+ - File system querying through VAST Catalog
10
12
 
11
13
  [![vastdb](docs/vastdb.png)](https://vastdata.com/database)
12
14
 
15
+ For technical details about VAST Database architecture, see the [whitepaper](https://vastdata.com/whitepaper/#TheVASTDataBase).
16
+
13
17
  ## Getting Started
14
18
 
15
19
  ### Requirements
@@ -217,4 +221,4 @@ See these blog posts for more examples:
217
221
  - https://vastdata.com/blog/the-vast-catalog-in-action-part-1
218
222
  - https://vastdata.com/blog/the-vast-catalog-in-action-part-2
219
223
 
220
- See also the [full Vast DB Python SDK documentation](https://vastdb-sdk.readthedocs.io/en/v1.1.0/)
224
+ See also the [full Vast DB Python SDK documentation](https://vastdb-sdk.readthedocs.io/en/latest/)
@@ -29,7 +29,7 @@ setup(
29
29
  name='vastdb',
30
30
  python_requires='>=3.9.0',
31
31
  description='VAST Data SDK',
32
- version='1.3.9' + suffix,
32
+ version='1.3.11' + suffix,
33
33
  url='https://github.com/vast-data/vastdb_sdk',
34
34
  author='VAST DATA',
35
35
  author_email='hello@vastdata.com',
@@ -69,6 +69,7 @@ import vastdb.vast_flatbuf.org.apache.arrow.flatbuf.Date as fb_date
69
69
  import vastdb.vast_flatbuf.org.apache.arrow.flatbuf.Decimal as fb_decimal
70
70
  import vastdb.vast_flatbuf.org.apache.arrow.flatbuf.Field as fb_field
71
71
  import vastdb.vast_flatbuf.org.apache.arrow.flatbuf.FixedSizeBinary as fb_fixed_size_binary
72
+ import vastdb.vast_flatbuf.org.apache.arrow.flatbuf.FixedSizeList as fb_fixed_size_list
72
73
  import vastdb.vast_flatbuf.org.apache.arrow.flatbuf.FloatingPoint as fb_floating_point
73
74
  import vastdb.vast_flatbuf.org.apache.arrow.flatbuf.Int as fb_int
74
75
  import vastdb.vast_flatbuf.org.apache.arrow.flatbuf.List as fb_list
@@ -497,7 +498,13 @@ class Predicate:
497
498
  fb_bool.Start(self.builder)
498
499
  field_type = fb_bool.End(self.builder)
499
500
 
500
- value = True if value == 'true' else False # not cover all cases
501
+ # Handle both boolean values and string representations
502
+ if isinstance(value, bool):
503
+ value = value
504
+ elif isinstance(value, str):
505
+ value = value.lower() == 'true'
506
+ else:
507
+ value = bool(value)
501
508
  elif isinstance(field.type, pa.Decimal128Type):
502
509
  literal_type = fb_decimal_lit
503
510
  literal_impl = LiteralImpl.DecimalLiteral
@@ -608,7 +615,7 @@ class FieldNode:
608
615
  self.debug = debug
609
616
  if isinstance(self.type, pa.StructType):
610
617
  self.children = [FieldNode(field, index_iter, parent=self) for field in self.type]
611
- elif isinstance(self.type, pa.ListType):
618
+ elif pa.types.is_list(self.type) or pa.types.is_fixed_size_list(self.type):
612
619
  self.children = [FieldNode(self.type.value_field, index_iter, parent=self)]
613
620
  elif isinstance(self.type, pa.MapType):
614
621
  # Map is represented as List<Struct<K, V>> in Arrow
@@ -752,7 +759,7 @@ def _iter_nested_arrays(column: pa.Array) -> Iterator[pa.Array]:
752
759
  if not column.type.num_fields == 1: # Note: VAST serializes only a single struct field at a time
753
760
  raise ValueError(f'column.type.num_fields: {column.type.num_fields} not eq to 1')
754
761
  yield from _iter_nested_arrays(column.field(0))
755
- elif isinstance(column.type, pa.ListType):
762
+ elif pa.types.is_list(column.type) or pa.types.is_fixed_size_list(column.type):
756
763
  yield from _iter_nested_arrays(column.values) # Note: Map is serialized in VAST as a List<Struct<K, V>>
757
764
 
758
765
 
@@ -853,10 +860,11 @@ class VastdbApi:
853
860
  VAST_VERSION_REGEX = re.compile(r'^vast (\d+\.\d+\.\d+\.\d+)$')
854
861
 
855
862
  def __init__(self, endpoint, access_key, secret_key,
856
- *,
857
- ssl_verify=True,
858
- timeout=None,
859
- backoff_config: Optional[BackoffConfig] = None):
863
+ *,
864
+ ssl_verify=True,
865
+ timeout=None,
866
+ backoff_config: Optional[BackoffConfig] = None,
867
+ version_check=True):
860
868
 
861
869
  from . import version # import lazily here (to avoid circular dependencies)
862
870
  self.client_sdk_version = f"VAST Database Python SDK {version()} - 2024 (c)"
@@ -896,29 +904,30 @@ class VastdbApi:
896
904
  aws_region='',
897
905
  aws_service='s3')
898
906
 
899
- # probe the cluster for its version
900
- res = self._request(method="GET", url=self._url(command="transaction"), skip_status_check=True) # used only for the response headers
901
- _logger.debug("headers=%s code=%s content=%s", res.headers, res.status_code, res.content)
902
- server_header = res.headers.get("Server")
903
- if server_header is None:
904
- _logger.error("Response doesn't contain 'Server' header")
905
- else:
906
- if not server_header.startswith(self.VAST_SERVER_PREFIX):
907
- raise UnsupportedServer(f'{self.url} is not a VAST DB server endpoint ("{server_header}")')
908
-
909
- if m := self.VAST_VERSION_REGEX.match(server_header):
910
- self.vast_version: Tuple[int, ...] = tuple(int(v) for v in m.group(1).split("."))
911
- return
907
+ if version_check:
908
+ # probe the cluster for its version
909
+ res = self._request(method="GET", url=self._url(command="transaction"), skip_status_check=True) # used only for the response headers
910
+ _logger.debug("headers=%s code=%s content=%s", res.headers, res.status_code, res.content)
911
+ server_header = res.headers.get("Server")
912
+ if server_header is None:
913
+ _logger.error("Response doesn't contain 'Server' header")
912
914
  else:
913
- _logger.error("'Server' header '%s' doesn't match the expected pattern", server_header)
915
+ if not server_header.startswith(self.VAST_SERVER_PREFIX):
916
+ raise UnsupportedServer(f'{self.url} is not a VAST DB server endpoint ("{server_header}")')
914
917
 
915
- msg = (
916
- f'Please use `vastdb` <= 0.0.5.x with current VAST cluster version ("{server_header or "N/A"}"). '
917
- 'To use the latest SDK, please upgrade your cluster to the latest service pack. '
918
- 'Please contact customer.support@vastdata.com for more details.'
919
- )
920
- _logger.critical(msg)
921
- raise NotImplementedError(msg)
918
+ if m := self.VAST_VERSION_REGEX.match(server_header):
919
+ self.vast_version: Tuple[int, ...] = tuple(int(v) for v in m.group(1).split("."))
920
+ return
921
+ else:
922
+ _logger.error("'Server' header '%s' doesn't match the expected pattern", server_header)
923
+
924
+ msg = (
925
+ f'Please use `vastdb` <= 0.0.5.x with current VAST cluster version ("{server_header or "N/A"}"). '
926
+ 'To use the latest SDK, please upgrade your cluster to the latest service pack. '
927
+ 'Please contact customer.support@vastdata.com for more details.'
928
+ )
929
+ _logger.critical(msg)
930
+ raise NotImplementedError(msg)
922
931
 
923
932
  def __enter__(self):
924
933
  """Allow using this session as a context manager."""
@@ -935,7 +944,8 @@ class VastdbApi:
935
944
  secret_key=self.secret_key,
936
945
  ssl_verify=self._session.verify,
937
946
  timeout=self.timeout,
938
- backoff_config=self.backoff_config)
947
+ backoff_config=self.backoff_config,
948
+ version_check=False)
939
949
 
940
950
  def _single_request(self, *, method, url, skip_status_check=False, **kwargs):
941
951
  _logger.debug("Sending request: %s %s %s timeout=%s", method, url, kwargs, self.timeout)
@@ -1349,12 +1359,12 @@ class VastdbApi:
1349
1359
  lists = list_tables.GetRootAs(res.content)
1350
1360
  tables_length = lists.TablesLength()
1351
1361
  count = int(res_headers['tabular-list-count']) if 'tabular-list-count' in res_headers else tables_length
1352
- return lists, is_truncated, count
1362
+ return lists, next_key, is_truncated, count
1353
1363
 
1354
1364
  def _list_tables_internal(self, bucket, schema, parse_properties, txid=0, client_tags=[], max_keys=1000, next_key=0, name_prefix="",
1355
1365
  exact_match=False, expected_retvals=[], include_list_stats=False, count_only=False):
1356
1366
  tables = []
1357
- lists, is_truncated, count = self._list_tables_raw(bucket, schema, txid=txid, client_tags=client_tags, max_keys=max_keys,
1367
+ lists, next_key, is_truncated, count = self._list_tables_raw(bucket, schema, txid=txid, client_tags=client_tags, max_keys=max_keys,
1358
1368
  next_key=next_key, name_prefix=name_prefix, exact_match=exact_match, expected_retvals=expected_retvals,
1359
1369
  include_list_stats=include_list_stats, count_only=count_only)
1360
1370
  bucket_name = lists.BucketName().decode()
@@ -1368,7 +1378,7 @@ class VastdbApi:
1368
1378
  return bucket_name, schema_name, tables, next_key, is_truncated, count
1369
1379
 
1370
1380
  def raw_sorting_score(self, bucket, schema, txid, name):
1371
- lists, _, _ = self._list_tables_raw(bucket, schema, txid=txid, exact_match=True, name_prefix=name, include_list_stats=True)
1381
+ lists, _, _, _ = self._list_tables_raw(bucket, schema, txid=txid, exact_match=True, name_prefix=name, include_list_stats=True)
1372
1382
  bucket_name = lists.BucketName().decode()
1373
1383
  if not bucket.startswith(bucket_name): # ignore snapshot name
1374
1384
  raise ValueError(f'bucket: {bucket} did not start from {bucket_name}')
@@ -2267,11 +2277,17 @@ def get_field_type(builder: flatbuffers.Builder, field: pa.Field):
2267
2277
  fb_struct.Start(builder)
2268
2278
  field_type = fb_struct.End(builder)
2269
2279
 
2270
- elif isinstance(field.type, pa.ListType):
2280
+ elif pa.types.is_list(field.type):
2271
2281
  field_type_type = Type.List
2272
2282
  fb_list.Start(builder)
2273
2283
  field_type = fb_list.End(builder)
2274
2284
 
2285
+ elif pa.types.is_fixed_size_list(field.type):
2286
+ field_type_type = Type.FixedSizeList
2287
+ fb_fixed_size_list.Start(builder)
2288
+ fb_fixed_size_list.AddListSize(builder, field.type.list_size)
2289
+ field_type = fb_fixed_size_list.End(builder)
2290
+
2275
2291
  elif isinstance(field.type, pa.MapType):
2276
2292
  field_type_type = Type.Map
2277
2293
  fb_map.Start(builder)
@@ -2293,7 +2309,7 @@ def build_field(builder: flatbuffers.Builder, f: pa.Field, name: str):
2293
2309
  children = None
2294
2310
  if isinstance(f.type, pa.StructType):
2295
2311
  children = [build_field(builder, child, child.name) for child in list(f.type)]
2296
- if isinstance(f.type, pa.ListType):
2312
+ if pa.types.is_list(f.type) or pa.types.is_fixed_size_list(f.type):
2297
2313
  children = [build_field(builder, f.type.value_field, "item")]
2298
2314
  if isinstance(f.type, pa.MapType):
2299
2315
  children = [
@@ -0,0 +1,87 @@
1
+ import datetime as dt
2
+ import logging
3
+ import time
4
+
5
+ import pytest
6
+
7
+ from vastdb import util
8
+ from vastdb.table import ImportConfig, QueryConfig
9
+ from vastdb.tests.util import compare_pyarrow_tables
10
+
11
+ log = logging.getLogger(__name__)
12
+
13
+
14
+ @pytest.mark.benchmark
15
+ def test_bench(session, test_bucket_name, parquets_path, crater_path):
16
+ files = [str(parquets_path / f) for f in (parquets_path.glob('**/*.pq'))]
17
+ stats = None
18
+
19
+ with session.transaction() as tx:
20
+ b = tx.bucket(test_bucket_name)
21
+ s = b.create_schema('s1')
22
+ util.create_table_from_files(s, 't1', files, config=ImportConfig(import_concurrency=8))
23
+ t2 = util.create_table_from_files(s, 't2', files, config=ImportConfig(import_concurrency=8))
24
+ # Enabling Elysium with 4 sorting keys - ts, sid, ask_open, ask_close
25
+ t2.add_sorting_key([2, 0, 3, 4])
26
+ stats = t2.get_stats()
27
+ log.info("Added sorting keys")
28
+
29
+ assert stats
30
+ # Waiting up to 2 hours for sorting to complete.
31
+ start_time = time.time()
32
+ while not stats.sorting_done:
33
+ if time.time() - start_time > 7200:
34
+ raise TimeoutError("Sorting did not complete after waiting for 2 hours.")
35
+ time.sleep(30)
36
+ with session.transaction() as tx:
37
+ table = tx.bucket(test_bucket_name).schema('s1').table('t2')
38
+ stats = table.get_stats()
39
+ log.info("Sorting completed")
40
+
41
+ queries = [
42
+ {'query_str': "select sid from {t} where sid = 10033007".format, 'columns': ['sid'],
43
+ 'predicate': lambda t: t['sid'] == 10033007},
44
+ {'query_str': "select last_trade_price from {t} where ts between "
45
+ "TIMESTAMP'2018-01-04 20:30:00' AND TIMESTAMP'2018-01-05 20:30:00'".format,
46
+ 'columns': ['last_trade_price'], 'predicate': lambda t: (t['ts'].between(
47
+ dt.datetime(2018, 1, 4, 20, 30, 00, 00), dt.datetime(2018, 1, 5, 20, 30, 00, 00)))},
48
+ {'query_str': "select ts,ask_close,ask_open from {t} where bid_qty = 684000 and ask_close > 1".format,
49
+ 'columns': ['ts', 'ask_close', 'ask_open'],
50
+ 'predicate': lambda t: ((t['bid_qty'] == 684000) & (t['ask_close'] > 1))},
51
+ {'query_str': "select ts,ticker from {t} where "
52
+ "ask_open between 4374 and 4375 OR ask_open between 380 and 381".format,
53
+ 'columns': ['ts', 'ticker'],
54
+ 'predicate': lambda t: ((t['ask_open'].between(4374, 4375)) | (t['ask_open'].between(380, 381)))},
55
+ {
56
+ 'query_str': "select trade_close, trade_high, trade_low, trade_open from {t} where ticker in ('BANR', 'KELYB')".format,
57
+ 'columns': ['trade_close', 'trade_high', 'trade_low', 'trade_open'],
58
+ 'predicate': lambda t: (t['ticker'].isin(['BANR', 'KELYB']))}
59
+ ]
60
+
61
+ log.info("Starting to run queries")
62
+ with session.transaction() as tx:
63
+ schema = tx.bucket(test_bucket_name).schema('s1')
64
+ t1 = schema.table("t1")
65
+ t2 = schema.table("t2")
66
+
67
+ config = QueryConfig(num_splits=8, num_sub_splits=4)
68
+
69
+ for q in queries:
70
+ normal_table_res, els_table_res = None, None
71
+ for table in [t1, t2]:
72
+ log.info("Starting query: %s", q['query_str'](t=table.name))
73
+ s = time.time()
74
+ res = table.select(columns=q['columns'], predicate=q['predicate'](table), config=config).read_all()
75
+ e = time.time()
76
+ if table == t1:
77
+ normal_table_res = res
78
+ else:
79
+ els_table_res = res
80
+ log.info("Query %s returned in %s seconds.", q['query_str'](t=table.name), e - s)
81
+ if crater_path:
82
+ with open(f'{crater_path}/bench_results', 'a') as f:
83
+ f.write(f"Query '{q['query_str'](t=table)}' returned in {e - s} seconds")
84
+
85
+ assert normal_table_res, f"missing result for {t1} table"
86
+ assert els_table_res, f"missing result for {t2} table"
87
+ assert compare_pyarrow_tables(normal_table_res, els_table_res)
@@ -6,6 +6,7 @@ import boto3
6
6
  import pytest
7
7
 
8
8
  import vastdb
9
+ import vastdb.errors
9
10
 
10
11
 
11
12
  def pytest_addoption(parser):
@@ -65,8 +66,14 @@ def clean_bucket_name(request, test_bucket_name, session):
65
66
  b = tx.bucket(test_bucket_name)
66
67
  for top_schema in b.schemas():
67
68
  for s in iter_schemas(top_schema):
68
- for t in s.tables():
69
- t.drop()
69
+ for t_name in s.tablenames():
70
+ try:
71
+ t = s.table(t_name)
72
+ t.drop()
73
+ except vastdb.errors.NotSupportedSchema:
74
+ # Use internal API to drop the table in case unsupported schema prevents creating a table
75
+ # object.
76
+ tx._rpc.api.drop_table(b.name, s.name, t_name, txid=tx.txid)
70
77
  s.drop()
71
78
  return test_bucket_name
72
79
 
@@ -2,7 +2,9 @@ import logging
2
2
  import xml.etree.ElementTree
3
3
  from dataclasses import dataclass
4
4
  from enum import Enum
5
+ from typing import Optional
5
6
 
7
+ import pyarrow as pa
6
8
  import requests
7
9
 
8
10
 
@@ -89,6 +91,9 @@ class ImportFilesError(Exception):
89
91
  message: str
90
92
  error_dict: dict
91
93
 
94
+ def __post_init__(self):
95
+ self.args = [vars(self)]
96
+
92
97
 
93
98
  class InvalidArgument(Exception):
94
99
  pass
@@ -122,18 +127,27 @@ class NotSupported(Exception):
122
127
  class MissingBucket(Missing):
123
128
  bucket: str
124
129
 
130
+ def __post_init__(self):
131
+ self.args = [vars(self)]
132
+
125
133
 
126
134
  @dataclass
127
135
  class MissingSnapshot(Missing):
128
136
  bucket: str
129
137
  snapshot: str
130
138
 
139
+ def __post_init__(self):
140
+ self.args = [vars(self)]
141
+
131
142
 
132
143
  @dataclass
133
144
  class MissingSchema(Missing):
134
145
  bucket: str
135
146
  schema: str
136
147
 
148
+ def __post_init__(self):
149
+ self.args = [vars(self)]
150
+
137
151
 
138
152
  @dataclass
139
153
  class MissingTable(Missing):
@@ -141,6 +155,9 @@ class MissingTable(Missing):
141
155
  schema: str
142
156
  table: str
143
157
 
158
+ def __post_init__(self):
159
+ self.args = [vars(self)]
160
+
144
161
 
145
162
  @dataclass
146
163
  class MissingProjection(Missing):
@@ -149,6 +166,9 @@ class MissingProjection(Missing):
149
166
  table: str
150
167
  projection: str
151
168
 
169
+ def __post_init__(self):
170
+ self.args = [vars(self)]
171
+
152
172
 
153
173
  class Exists(Exception):
154
174
  pass
@@ -159,6 +179,9 @@ class SchemaExists(Exists):
159
179
  bucket: str
160
180
  schema: str
161
181
 
182
+ def __post_init__(self):
183
+ self.args = [vars(self)]
184
+
162
185
 
163
186
  @dataclass
164
187
  class TableExists(Exists):
@@ -166,6 +189,9 @@ class TableExists(Exists):
166
189
  schema: str
167
190
  table: str
168
191
 
192
+ def __post_init__(self):
193
+ self.args = [vars(self)]
194
+
169
195
 
170
196
  @dataclass
171
197
  class NotSupportedCommand(NotSupported):
@@ -173,18 +199,37 @@ class NotSupportedCommand(NotSupported):
173
199
  schema: str
174
200
  table: str
175
201
 
202
+ def __post_init__(self):
203
+ self.args = [vars(self)]
204
+
176
205
 
177
206
  @dataclass
178
207
  class NotSupportedVersion(NotSupported):
179
208
  err_msg: str
180
209
  version: str
181
210
 
211
+ def __post_init__(self):
212
+ self.args = [vars(self)]
213
+
214
+
215
+ @dataclass
216
+ class NotSupportedSchema(NotSupported):
217
+ message: Optional[str] = None
218
+ schema: Optional[pa.Schema] = None
219
+ cause: Optional[Exception] = None
220
+
221
+ def __post_init__(self):
222
+ self.args = [vars(self)]
223
+
182
224
 
183
225
  @dataclass
184
226
  class ConnectionError(Exception):
185
227
  cause: Exception
186
228
  may_retry: bool
187
229
 
230
+ def __post_init__(self):
231
+ self.args = [vars(self)]
232
+
188
233
 
189
234
  def handle_unavailable(**kwargs):
190
235
  if kwargs['code'] == 'SlowDown':
@@ -192,7 +237,7 @@ def handle_unavailable(**kwargs):
192
237
  raise ServiceUnavailable(**kwargs)
193
238
 
194
239
 
195
- ERROR_TYPES_MAP = {
240
+ HTTP_ERROR_TYPES_MAP = {
196
241
  HttpStatus.BAD_REQUEST: BadRequest,
197
242
  HttpStatus.FOBIDDEN: Forbidden,
198
243
  HttpStatus.NOT_FOUND: NotFound,
@@ -205,6 +250,10 @@ ERROR_TYPES_MAP = {
205
250
  HttpStatus.INSUFFICIENT_CAPACITY: InsufficientCapacity,
206
251
  }
207
252
 
253
+ SPECIFIC_ERROR_TYPES_MAP = {
254
+ 'TabularUnsupportedColumnType': NotSupportedSchema,
255
+ }
256
+
208
257
 
209
258
  def from_response(res: requests.Response):
210
259
  if res.status_code == HttpStatus.SUCCESS.value:
@@ -234,5 +283,10 @@ def from_response(res: requests.Response):
234
283
  )
235
284
  log.warning("RPC failed: %s", kwargs)
236
285
  status = HttpStatus(res.status_code)
237
- error_type = ERROR_TYPES_MAP.get(status, UnexpectedError)
238
- return error_type(**kwargs) # type: ignore
286
+ http_error_type = HTTP_ERROR_TYPES_MAP.get(status, UnexpectedError)
287
+ http_error = http_error_type(**kwargs) # type: ignore
288
+ # Wrap specific error types if applicable
289
+ if code_str in SPECIFIC_ERROR_TYPES_MAP:
290
+ error_type = SPECIFIC_ERROR_TYPES_MAP[code_str]
291
+ return error_type(message=message_str, cause=http_error)
292
+ return http_error
@@ -4,7 +4,7 @@ import logging
4
4
 
5
5
  from .errors import NotSupportedVersion
6
6
 
7
- log = logging.getLogger()
7
+ log = logging.getLogger(__name__)
8
8
 
9
9
 
10
10
  class Features:
@@ -39,6 +39,10 @@ class Features:
39
39
  "Zip import requires 5.3.1+ VAST release",
40
40
  vast_version >= (5, 3, 1))
41
41
 
42
+ self.check_timezone = self._check(
43
+ "Timezone support requires 5.4+ Vast release",
44
+ vast_version >= (5, 4))
45
+
42
46
  def _check(self, msg, supported):
43
47
  log.debug("%s (current version is %s): supported=%s", msg, self.vast_version, supported)
44
48
  if not supported:
@@ -91,6 +91,7 @@ class Schema:
91
91
  if use_external_row_ids_allocation:
92
92
  self.tx._rpc.features.check_external_row_ids_allocation()
93
93
 
94
+ table.Table.validate_ibis_support_schema(columns)
94
95
  self.tx._rpc.api.create_table(self.bucket.name, self.name, table_name, columns, txid=self.tx.txid,
95
96
  use_external_row_ids_allocation=use_external_row_ids_allocation,
96
97
  sorting_key=sorting_key)
@@ -109,14 +110,14 @@ class Schema:
109
110
  log.debug("Found table: %s", t[0])
110
111
  return t[0]
111
112
 
112
- def _iter_tables(self, table_name=None):
113
+ def _iter_tables(self, table_name=None, page_size=1000):
113
114
  next_key = 0
114
115
  name_prefix = table_name if table_name else ""
115
116
  exact_match = bool(table_name)
116
117
  while True:
117
118
  _bucket_name, _schema_name, curr_tables, next_key, is_truncated, _ = \
118
119
  self.tx._rpc.api.list_tables(
119
- bucket=self.bucket.name, schema=self.name, next_key=next_key, txid=self.tx.txid,
120
+ bucket=self.bucket.name, schema=self.name, next_key=next_key, max_keys=page_size, txid=self.tx.txid,
120
121
  exact_match=exact_match, name_prefix=name_prefix, include_list_stats=exact_match)
121
122
  if not curr_tables:
122
123
  break
@@ -124,19 +125,19 @@ class Schema:
124
125
  if not is_truncated:
125
126
  break
126
127
 
127
- def tables(self, table_name: str = "") -> List["Table"]:
128
+ def tables(self, table_name: str = "", page_size=1000) -> List["Table"]:
128
129
  """List all tables under this schema if `table_name` is empty.
129
130
 
130
131
  Otherwise, list only the specific table (if exists).
131
132
  """
132
133
  return [
133
134
  _parse_table_info(table_info, self)
134
- for table_info in self._iter_tables(table_name=table_name)
135
+ for table_info in self._iter_tables(table_name=table_name, page_size=page_size)
135
136
  ]
136
137
 
137
- def tablenames(self) -> List[str]:
138
+ def tablenames(self, page_size=1000) -> List[str]:
138
139
  """List all table names under this schema."""
139
- return [table_info.name for table_info in self._iter_tables()]
140
+ return [table_info.name for table_info in self._iter_tables(page_size=page_size)]
140
141
 
141
142
  def drop(self) -> None:
142
143
  """Delete this schema."""