vastdb 1.3.8__tar.gz → 1.3.10__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 (228) hide show
  1. {vastdb-1.3.8 → vastdb-1.3.10}/CHANGELOG.md +24 -0
  2. {vastdb-1.3.8 → vastdb-1.3.10}/PKG-INFO +1 -1
  3. {vastdb-1.3.8 → vastdb-1.3.10}/README.md +9 -5
  4. {vastdb-1.3.8 → vastdb-1.3.10}/setup.py +1 -1
  5. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/__init__.py +2 -2
  6. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/_internal.py +41 -8
  7. vastdb-1.3.10/vastdb/bench/test_perf.py +87 -0
  8. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/features.py +6 -2
  9. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/table.py +44 -10
  10. vastdb-1.3.10/vastdb/tests/test_imports.py +517 -0
  11. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/test_tables.py +25 -2
  12. vastdb-1.3.10/vastdb/tests/util.py +38 -0
  13. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb.egg-info/PKG-INFO +1 -1
  14. vastdb-1.3.8/vastdb/bench/test_perf.py +0 -28
  15. vastdb-1.3.8/vastdb/tests/test_imports.py +0 -204
  16. vastdb-1.3.8/vastdb/tests/util.py +0 -17
  17. {vastdb-1.3.8 → vastdb-1.3.10}/CONTRIBUTING.md +0 -0
  18. {vastdb-1.3.8 → vastdb-1.3.10}/LICENSE +0 -0
  19. {vastdb-1.3.8 → vastdb-1.3.10}/MANIFEST.in +0 -0
  20. {vastdb-1.3.8 → vastdb-1.3.10}/requirements.txt +0 -0
  21. {vastdb-1.3.8 → vastdb-1.3.10}/setup.cfg +0 -0
  22. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/__init__.py +0 -0
  23. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/__init__.py +0 -0
  24. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/bench_repo/__init__.py +0 -0
  25. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/bench_repo/mega_combo.py +0 -0
  26. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/cli.py +0 -0
  27. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/common/__init__.py +0 -0
  28. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/common/constants.py +0 -0
  29. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/common/log_utils.py +0 -0
  30. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/common/types.py +0 -0
  31. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/common/utils.py +0 -0
  32. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/dataset/__init__.py +0 -0
  33. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/dataset/generate_secmaster.py +0 -0
  34. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/dataset/generate_stocks_dataset.py +0 -0
  35. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/dataset/schemas.py +0 -0
  36. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/dataset/secmaster.py +0 -0
  37. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/orchestrate/__init__.py +0 -0
  38. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/orchestrate/bench_spec.py +0 -0
  39. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/orchestrate/results_helpers.py +0 -0
  40. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/orchestrate/scenario.py +0 -0
  41. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/orchestrate/scenario_generator.py +0 -0
  42. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/query/__init__.py +0 -0
  43. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/query/arrow_common.py +0 -0
  44. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/query/query.py +0 -0
  45. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/query/query_pyarrow.py +0 -0
  46. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/query/query_vastdb.py +0 -0
  47. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/run.py +0 -0
  48. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/test_sample.py +0 -0
  49. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bucket.py +0 -0
  50. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/config.py +0 -0
  51. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/conftest.py +0 -0
  52. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/errors.py +0 -0
  53. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/schema.py +0 -0
  54. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/session.py +0 -0
  55. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/__init__.py +0 -0
  56. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/metrics.py +0 -0
  57. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/test_duckdb.py +0 -0
  58. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/test_nested.py +0 -0
  59. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/test_projections.py +0 -0
  60. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/test_sanity.py +0 -0
  61. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/test_schemas.py +0 -0
  62. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/test_util.py +0 -0
  63. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/transaction.py +0 -0
  64. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/util.py +0 -0
  65. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/__init__.py +0 -0
  66. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/__init__.py +0 -0
  67. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/__init__.py +0 -0
  68. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/__init__.py +0 -0
  69. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/__init__.py +0 -0
  70. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Aggregate.py +0 -0
  71. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ArraySlice.py +0 -0
  72. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ArraySubscript.py +0 -0
  73. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/BinaryLiteral.py +0 -0
  74. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/BooleanLiteral.py +0 -0
  75. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Bound.py +0 -0
  76. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Call.py +0 -0
  77. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/CaseFragment.py +0 -0
  78. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Cast.py +0 -0
  79. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ConcreteBoundImpl.py +0 -0
  80. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ConditionalCase.py +0 -0
  81. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/CurrentRow.py +0 -0
  82. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DateLiteral.py +0 -0
  83. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DecimalLiteral.py +0 -0
  84. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Deref.py +0 -0
  85. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DurationLiteral.py +0 -0
  86. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Expression.py +0 -0
  87. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ExpressionImpl.py +0 -0
  88. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FieldIndex.py +0 -0
  89. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FieldRef.py +0 -0
  90. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Filter.py +0 -0
  91. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FixedSizeBinaryLiteral.py +0 -0
  92. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float16Literal.py +0 -0
  93. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float32Literal.py +0 -0
  94. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float64Literal.py +0 -0
  95. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Following.py +0 -0
  96. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Frame.py +0 -0
  97. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Grouping.py +0 -0
  98. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int16Literal.py +0 -0
  99. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int32Literal.py +0 -0
  100. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int64Literal.py +0 -0
  101. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int8Literal.py +0 -0
  102. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteral.py +0 -0
  103. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralDaysMilliseconds.py +0 -0
  104. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralImpl.py +0 -0
  105. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralMonths.py +0 -0
  106. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Join.py +0 -0
  107. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/JoinKind.py +0 -0
  108. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/KeyValue.py +0 -0
  109. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Limit.py +0 -0
  110. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ListLiteral.py +0 -0
  111. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Literal.py +0 -0
  112. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralColumn.py +0 -0
  113. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralImpl.py +0 -0
  114. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralRelation.py +0 -0
  115. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/MapKey.py +0 -0
  116. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/MapLiteral.py +0 -0
  117. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/OrderBy.py +0 -0
  118. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Ordering.py +0 -0
  119. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Plan.py +0 -0
  120. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Preceding.py +0 -0
  121. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Project.py +0 -0
  122. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/RelId.py +0 -0
  123. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Relation.py +0 -0
  124. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/RelationImpl.py +0 -0
  125. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SetOpKind.py +0 -0
  126. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SetOperation.py +0 -0
  127. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SimpleCase.py +0 -0
  128. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SortKey.py +0 -0
  129. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Source.py +0 -0
  130. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StringLiteral.py +0 -0
  131. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StructField.py +0 -0
  132. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StructLiteral.py +0 -0
  133. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/TimeLiteral.py +0 -0
  134. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/TimestampLiteral.py +0 -0
  135. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt16Literal.py +0 -0
  136. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt32Literal.py +0 -0
  137. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt64Literal.py +0 -0
  138. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt8Literal.py +0 -0
  139. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Unbounded.py +0 -0
  140. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/WindowCall.py +0 -0
  141. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/__init__.py +0 -0
  142. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Binary.py +0 -0
  143. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Block.py +0 -0
  144. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/BodyCompression.py +0 -0
  145. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/BodyCompressionMethod.py +0 -0
  146. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Bool.py +0 -0
  147. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Buffer.py +0 -0
  148. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/CompressionType.py +0 -0
  149. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Date.py +0 -0
  150. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/DateUnit.py +0 -0
  151. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Decimal.py +0 -0
  152. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryBatch.py +0 -0
  153. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryEncoding.py +0 -0
  154. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryKind.py +0 -0
  155. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Duration.py +0 -0
  156. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Endianness.py +0 -0
  157. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Feature.py +0 -0
  158. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Field.py +0 -0
  159. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/FieldNode.py +0 -0
  160. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/FixedSizeBinary.py +0 -0
  161. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/FixedSizeList.py +0 -0
  162. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/FloatingPoint.py +0 -0
  163. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Footer.py +0 -0
  164. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Int.py +0 -0
  165. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Interval.py +0 -0
  166. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/IntervalUnit.py +0 -0
  167. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/KeyValue.py +0 -0
  168. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/LargeBinary.py +0 -0
  169. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/LargeList.py +0 -0
  170. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/LargeUtf8.py +0 -0
  171. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/List.py +0 -0
  172. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Map.py +0 -0
  173. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Message.py +0 -0
  174. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/MessageHeader.py +0 -0
  175. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/MetadataVersion.py +0 -0
  176. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Null.py +0 -0
  177. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Precision.py +0 -0
  178. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/RecordBatch.py +0 -0
  179. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Schema.py +0 -0
  180. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseMatrixCompressedAxis.py +0 -0
  181. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseMatrixIndexCSX.py +0 -0
  182. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensor.py +0 -0
  183. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndex.py +0 -0
  184. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndexCOO.py +0 -0
  185. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndexCSF.py +0 -0
  186. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Struct_.py +0 -0
  187. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Tensor.py +0 -0
  188. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/TensorDim.py +0 -0
  189. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Time.py +0 -0
  190. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/TimeUnit.py +0 -0
  191. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Timestamp.py +0 -0
  192. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Type.py +0 -0
  193. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Union.py +0 -0
  194. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/UnionMode.py +0 -0
  195. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Utf8.py +0 -0
  196. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/__init__.py +0 -0
  197. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/AlterColumnRequest.py +0 -0
  198. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/AlterProjectionTableRequest.py +0 -0
  199. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/AlterSchemaRequest.py +0 -0
  200. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/AlterTableRequest.py +0 -0
  201. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/Column.py +0 -0
  202. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ColumnDetails.py +0 -0
  203. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ColumnType.py +0 -0
  204. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/CreateProjectionRequest.py +0 -0
  205. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/CreateSchemaRequest.py +0 -0
  206. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/CreateViewRequest.py +0 -0
  207. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/FilterString.py +0 -0
  208. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/GetProjectionTableStatsResponse.py +0 -0
  209. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/GetRowColumnSecurityResponse.py +0 -0
  210. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/GetTableStatsResponse.py +0 -0
  211. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ImportDataRequest.py +0 -0
  212. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/KeyName.py +0 -0
  213. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ListProjectionsResponse.py +0 -0
  214. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ListSchemasResponse.py +0 -0
  215. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ListTablesResponse.py +0 -0
  216. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ListViewsResponse.py +0 -0
  217. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/NameString.py +0 -0
  218. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ObjectDetails.py +0 -0
  219. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/S3File.py +0 -0
  220. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/VipRange.py +0 -0
  221. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/__init__.py +0 -0
  222. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_tests/__init__.py +0 -0
  223. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_tests/test_ha.py +0 -0
  224. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_tests/test_scale.py +0 -0
  225. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb.egg-info/SOURCES.txt +0 -0
  226. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb.egg-info/dependency_links.txt +0 -0
  227. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb.egg-info/requires.txt +0 -0
  228. {vastdb-1.3.8 → vastdb-1.3.10}/vastdb.egg-info/top_level.txt +0 -0
@@ -4,6 +4,30 @@ 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.10] (2025-05-11)
8
+ [1.3.10]: https://github.com/vast-data/vastdb_sdk/compare/v1.3.9...v1.3.10
9
+
10
+ ### Added
11
+ - Support limit on query data
12
+ - Support for timestamp with timezone
13
+
14
+ ## Fixed
15
+ - Don't modify the user-passed config
16
+ - Name the feature logger
17
+
18
+
19
+ ## [1.3.9] (2025-04-22)
20
+ [1.3.9]: https://github.com/vast-data/vastdb_sdk/compare/v1.3.8...v1.3.9
21
+
22
+ ### Fixed
23
+ - Elysium-check validation
24
+ - Fix logging level
25
+
26
+ ### Added
27
+ - Support elysium new stats
28
+ - Exposing `sorting_done` flag for Elysium tables (for other tables, `sorting_done()` will always return false)
29
+
30
+
7
31
  ## [1.3.8] (2025-03-31)
8
32
  [1.3.8]: https://github.com/vast-data/vastdb_sdk/compare/v1.3.7...v1.3.8
9
33
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vastdb
3
- Version: 1.3.8
3
+ Version: 1.3.10
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.8' + suffix,
32
+ version='1.3.10' + suffix,
33
33
  url='https://github.com/vast-data/vastdb_sdk',
34
34
  author='VAST DATA',
35
35
  author_email='hello@vastdata.com',
@@ -13,5 +13,5 @@ def connect(*args, **kwargs): # noqa: D103
13
13
 
14
14
  def version():
15
15
  """Return VAST DB SDK version."""
16
- import importlib
17
- return importlib.metadata.distribution(__package__).version
16
+ from importlib import metadata
17
+ return metadata.distribution(__package__).version
@@ -794,7 +794,7 @@ def _decode_table_props(s):
794
794
  return {y: _prop_coding[x][1](z) for x, y, z in triplets if z != ''}
795
795
 
796
796
 
797
- TableInfo = namedtuple('TableInfo', 'name properties handle num_rows size_in_bytes num_partitions sorting_key_enabled')
797
+ TableInfo = namedtuple('TableInfo', 'name properties handle num_rows size_in_bytes num_partitions sorting_key_enabled sorting_score write_amplification acummulative_row_insertion_count sorting_done')
798
798
 
799
799
 
800
800
  def _parse_table_info(obj, parse_properties):
@@ -806,13 +806,20 @@ def _parse_table_info(obj, parse_properties):
806
806
  num_partitions = obj.NumPartitions()
807
807
  properties = parse_properties(properties)
808
808
  sorting_key_enabled = obj.SortingKeyEnabled()
809
- return TableInfo(name, properties, handle, num_rows, used_bytes, num_partitions, sorting_key_enabled)
809
+ sorting_score_raw = obj.SortingScore()
810
+ write_amplification = obj.WriteAmplification()
811
+ acummulative_row_insertion_count = obj.AcummulativeRowInseritionCount()
812
+
813
+ sorting_score = sorting_score_raw & ((1 << 63) - 1)
814
+ sorting_done = bool(sorting_score_raw >> 63)
815
+ return TableInfo(name, properties, handle, num_rows, used_bytes, num_partitions, sorting_key_enabled,
816
+ sorting_score, write_amplification, acummulative_row_insertion_count, sorting_done)
810
817
 
811
818
 
812
819
  # Results that returns from tablestats
813
820
 
814
821
 
815
- TableStatsResult = namedtuple("TableStatsResult", ["num_rows", "size_in_bytes", "is_external_rowid_alloc", "endpoints"])
822
+ TableStatsResult = namedtuple("TableStatsResult", 'num_rows size_in_bytes is_external_rowid_alloc sorting_key_enabled sorting_score write_amplification acummulative_row_inserition_count sorting_done endpoints')
816
823
 
817
824
 
818
825
  _RETRIABLE_EXCEPTIONS = (
@@ -1213,8 +1220,16 @@ class VastdbApi:
1213
1220
  num_rows = stats.NumRows()
1214
1221
  size_in_bytes = stats.SizeInBytes()
1215
1222
  is_external_rowid_alloc = stats.IsExternalRowidAlloc()
1223
+ sorting_key_enabled = stats.SortingKeyEnabled()
1224
+ sorting_score_raw = stats.SortingScore()
1225
+ write_amplification = stats.WriteAmplification()
1226
+ acummulative_row_inserition_count = stats.AcummulativeRowInseritionCount()
1227
+
1228
+ sorting_score = sorting_score_raw & ((1 << 63) - 1)
1229
+ sorting_done = bool(sorting_score_raw >> 63)
1230
+
1216
1231
  endpoints = [self.url] # we cannot replace the host by a VIP address in HTTPS-based URLs
1217
- return TableStatsResult(num_rows, size_in_bytes, is_external_rowid_alloc, tuple(endpoints))
1232
+ return TableStatsResult(num_rows, size_in_bytes, is_external_rowid_alloc, sorting_key_enabled, sorting_score, write_amplification, acummulative_row_inserition_count, sorting_done, tuple(endpoints))
1218
1233
 
1219
1234
  def alter_topic(self, bucket, name,
1220
1235
  new_name="", expected_retvals=[],
@@ -1302,8 +1317,8 @@ class VastdbApi:
1302
1317
  expected_retvals=expected_retvals,
1303
1318
  include_list_stats=include_list_stats, count_only=count_only)
1304
1319
 
1305
- def _list_tables_internal(self, bucket, schema, parse_properties, txid=0, client_tags=[], max_keys=1000, next_key=0, name_prefix="",
1306
- exact_match=False, expected_retvals=[], include_list_stats=False, count_only=False):
1320
+ def _list_tables_raw(self, bucket, schema, txid=0, client_tags=[], max_keys=1000, next_key=0, name_prefix="",
1321
+ exact_match=False, expected_retvals=[], include_list_stats=False, count_only=False):
1307
1322
  """
1308
1323
  GET /mybucket/schema_path?table HTTP/1.1
1309
1324
  tabular-txid: TransactionId
@@ -1323,7 +1338,6 @@ class VastdbApi:
1323
1338
  headers['tabular-list-count-only'] = str(count_only)
1324
1339
  headers['tabular-include-list-stats'] = str(include_list_stats)
1325
1340
 
1326
- tables = []
1327
1341
  res = self._request(
1328
1342
  method="GET",
1329
1343
  url=self._url(bucket=bucket, schema=schema, command="table"),
@@ -1333,17 +1347,36 @@ class VastdbApi:
1333
1347
  next_key = int(res_headers['tabular-next-key'])
1334
1348
  is_truncated = res_headers['tabular-is-truncated'] == 'true'
1335
1349
  lists = list_tables.GetRootAs(res.content)
1350
+ tables_length = lists.TablesLength()
1351
+ count = int(res_headers['tabular-list-count']) if 'tabular-list-count' in res_headers else tables_length
1352
+ return lists, is_truncated, count
1353
+
1354
+ def _list_tables_internal(self, bucket, schema, parse_properties, txid=0, client_tags=[], max_keys=1000, next_key=0, name_prefix="",
1355
+ exact_match=False, expected_retvals=[], include_list_stats=False, count_only=False):
1356
+ tables = []
1357
+ lists, is_truncated, count = self._list_tables_raw(bucket, schema, txid=txid, client_tags=client_tags, max_keys=max_keys,
1358
+ next_key=next_key, name_prefix=name_prefix, exact_match=exact_match, expected_retvals=expected_retvals,
1359
+ include_list_stats=include_list_stats, count_only=count_only)
1336
1360
  bucket_name = lists.BucketName().decode()
1337
1361
  schema_name = lists.SchemaName().decode()
1338
1362
  if not bucket.startswith(bucket_name): # ignore snapshot name
1339
1363
  raise ValueError(f'bucket: {bucket} did not start from {bucket_name}')
1340
1364
  tables_length = lists.TablesLength()
1341
- count = int(res_headers['tabular-list-count']) if 'tabular-list-count' in res_headers else tables_length
1342
1365
  for i in range(tables_length):
1343
1366
  tables.append(_parse_table_info(lists.Tables(i), parse_properties))
1344
1367
 
1345
1368
  return bucket_name, schema_name, tables, next_key, is_truncated, count
1346
1369
 
1370
+ 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)
1372
+ bucket_name = lists.BucketName().decode()
1373
+ if not bucket.startswith(bucket_name): # ignore snapshot name
1374
+ raise ValueError(f'bucket: {bucket} did not start from {bucket_name}')
1375
+ tables_length = lists.TablesLength()
1376
+ if tables_length != 1:
1377
+ raise ValueError(f'table: {name} received {tables_length} response')
1378
+ return lists.Tables(0).SortingScore()
1379
+
1347
1380
  def add_columns(self, bucket, schema, name, arrow_schema, txid=0, client_tags=[], expected_retvals=[]):
1348
1381
  """
1349
1382
  Add a column to table, use the following request
@@ -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)
@@ -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:
@@ -33,12 +33,16 @@ class Features:
33
33
 
34
34
  self.check_elysium = self._check(
35
35
  "Elysium requires 5.3.5+ VAST release",
36
- vast_version >= (5, 3, 5))
36
+ vast_version >= (5, 3)) # TODO: make this validation stricter for v5.4 (beta/poc version is 5.3.0.x)
37
37
 
38
38
  self.check_zip_import = self._check(
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:
@@ -1,9 +1,11 @@
1
1
  """VAST Database table."""
2
2
 
3
3
  import concurrent.futures
4
+ import copy
4
5
  import logging
5
6
  import os
6
7
  import queue
8
+ import sys
7
9
  from dataclasses import dataclass, field
8
10
  from math import ceil
9
11
  from threading import Event
@@ -29,6 +31,7 @@ MAX_ROWS_PER_BATCH = 512 * 1024
29
31
  MAX_INSERT_ROWS_PER_PATCH = 512 * 1024
30
32
  # in case insert has TooWideRow - need to insert in smaller batches - each cell could contain up to 128K, and our wire is limited to 5MB
31
33
  MAX_COLUMN_IN_BATCH = int(5 * 1024 / 128)
34
+ SORTING_SCORE_BITS = 63
32
35
 
33
36
 
34
37
  @dataclass
@@ -37,7 +40,12 @@ class TableStats:
37
40
 
38
41
  num_rows: int
39
42
  size_in_bytes: int
43
+ sorting_score: int
44
+ write_amplification: int
45
+ acummulative_row_inserition_count: int
40
46
  is_external_rowid_alloc: bool = False
47
+ sorting_key_enabled: bool = False
48
+ sorting_done: bool = False
41
49
  endpoints: Tuple[str, ...] = ()
42
50
 
43
51
 
@@ -277,8 +285,8 @@ class Table:
277
285
  except queue.Empty:
278
286
  pass
279
287
  if files_batch:
280
- log.debug("Starting import batch of %s files", len(files_batch))
281
- log.info(f"starting import of {files_batch}")
288
+ log.info("Starting import batch of %s files", len(files_batch))
289
+ log.debug(f"starting import of {files_batch}")
282
290
  session.import_data(
283
291
  self.bucket.name, self.schema.name, self.name, files_batch, txid=self.tx.txid,
284
292
  key_names=key_names)
@@ -327,7 +335,8 @@ class Table:
327
335
  predicate: Union[ibis.expr.types.BooleanColumn, ibis.common.deferred.Deferred] = None,
328
336
  config: Optional[QueryConfig] = None,
329
337
  *,
330
- internal_row_id: bool = False) -> pa.RecordBatchReader:
338
+ internal_row_id: bool = False,
339
+ limit_rows: Optional[int] = None) -> pa.RecordBatchReader:
331
340
  """Execute a query over this table.
332
341
 
333
342
  To read a subset of the columns, specify their names via `columns` argument. Otherwise, all columns will be read.
@@ -336,8 +345,10 @@ class Table:
336
345
 
337
346
  Query-execution configuration options can be specified via the optional `config` argument.
338
347
  """
339
- if config is None:
340
- config = QueryConfig()
348
+ config = copy.deepcopy(config) if config else QueryConfig()
349
+
350
+ if limit_rows:
351
+ config.limit_rows_per_sub_split = limit_rows
341
352
 
342
353
  stats = None
343
354
  # Retrieve snapshots only if needed
@@ -372,7 +383,7 @@ class Table:
372
383
  num_rows = 0
373
384
  if self.sorted_table:
374
385
  num_rows = self._get_row_estimate(columns, predicate, query_schema)
375
- log.info(f'sorted estimate: {num_rows}')
386
+ log.debug(f'sorted estimate: {num_rows}')
376
387
  if num_rows == 0:
377
388
  if stats is None:
378
389
  stats = self.get_stats()
@@ -396,7 +407,7 @@ class Table:
396
407
  for split in range(config.num_splits):
397
408
  splits_queue.put(split)
398
409
 
399
- # this queue shouldn't be large it is marely a pipe through which the results
410
+ # this queue shouldn't be large it is merely a pipe through which the results
400
411
  # are sent to the main thread. Most of the pages actually held in the
401
412
  # threads that fetch the pages.
402
413
  record_batches_queue: queue.Queue[pa.RecordBatch] = queue.Queue(maxsize=2)
@@ -452,6 +463,7 @@ class Table:
452
463
  if config.query_id:
453
464
  threads_prefix = threads_prefix + "-" + config.query_id
454
465
 
466
+ total_num_rows = limit_rows if limit_rows else sys.maxsize
455
467
  with concurrent.futures.ThreadPoolExecutor(max_workers=len(endpoints), thread_name_prefix=threads_prefix) as tp: # TODO: concurrency == enpoints is just a heuristic
456
468
  futures = [tp.submit(single_endpoint_worker, endpoint) for endpoint in endpoints]
457
469
  tasks_running = len(futures)
@@ -461,7 +473,14 @@ class Table:
461
473
 
462
474
  batch = record_batches_queue.get()
463
475
  if batch is not None:
464
- yield batch
476
+ if batch.num_rows < total_num_rows:
477
+ yield batch
478
+ total_num_rows -= batch.num_rows
479
+ else:
480
+ yield batch.slice(length=total_num_rows)
481
+ log.info("reached limit rows per query: %d - stop query", limit_rows)
482
+ stop_event.set()
483
+ break
465
484
  else:
466
485
  tasks_running -= 1
467
486
  log.debug("one worker thread finished, remaining: %d", tasks_running)
@@ -590,7 +609,7 @@ class Table:
590
609
  self.name = new_name
591
610
 
592
611
  def add_sorting_key(self, sorting_key: list) -> None:
593
- """Ads a sorting key to a table that doesn't have any."""
612
+ """Add a sorting key to a table that doesn't have any."""
594
613
  self.tx._rpc.features.check_elysium()
595
614
  self.tx._rpc.api.alter_table(
596
615
  self.bucket.name, self.schema.name, self.name, txid=self.tx.txid, sorting_key=sorting_key)
@@ -653,6 +672,20 @@ class Table:
653
672
  """
654
673
  return self._ibis_table[col_name]
655
674
 
675
+ def sorting_done(self) -> int:
676
+ """Sorting done indicator for the table. Always False for unsorted tables."""
677
+ if not self.sorted_table:
678
+ return False
679
+ raw_sorting_score = self.tx._rpc.api.raw_sorting_score(self.schema.bucket.name, self.schema.name, self.schema.tx.txid, self.name)
680
+ return bool(raw_sorting_score >> SORTING_SCORE_BITS)
681
+
682
+ def sorting_score(self) -> int:
683
+ """Sorting score for the table. Always 0 for unsorted tables."""
684
+ if not self.sorted_table:
685
+ return 0
686
+ raw_sorting_score = self.tx._rpc.api.raw_sorting_score(self.schema.bucket.name, self.schema.name, self.schema.tx.txid, self.name)
687
+ return raw_sorting_score & ((1 << SORTING_SCORE_BITS) - 1)
688
+
656
689
 
657
690
  @dataclass
658
691
  class Projection:
@@ -710,7 +743,8 @@ class Projection:
710
743
 
711
744
  def _parse_projection_info(projection_info, table: "Table"):
712
745
  log.info("Projection info %s", str(projection_info))
713
- stats = TableStats(num_rows=projection_info.num_rows, size_in_bytes=projection_info.size_in_bytes)
746
+ stats = TableStats(num_rows=projection_info.num_rows, size_in_bytes=projection_info.size_in_bytes,
747
+ sorting_score=0, write_amplification=0, acummulative_row_inserition_count=0)
714
748
  return Projection(name=projection_info.name, table=table, stats=stats, handle=int(projection_info.handle))
715
749
 
716
750