vastdb 0.1.2__tar.gz → 0.1.3__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 (185) hide show
  1. {vastdb-0.1.2 → vastdb-0.1.3}/CHANGELOG.md +14 -0
  2. {vastdb-0.1.2/vastdb.egg-info → vastdb-0.1.3}/PKG-INFO +2 -2
  3. {vastdb-0.1.2 → vastdb-0.1.3}/README.md +5 -2
  4. {vastdb-0.1.2 → vastdb-0.1.3}/requirements.txt +1 -1
  5. {vastdb-0.1.2 → vastdb-0.1.3}/setup.py +1 -1
  6. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/bucket.py +20 -10
  7. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/errors.py +28 -1
  8. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/internal_commands.py +56 -89
  9. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/schema.py +1 -1
  10. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/session.py +16 -1
  11. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/table.py +134 -27
  12. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/test_imports.py +13 -1
  13. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/test_schemas.py +1 -2
  14. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/test_tables.py +26 -1
  15. vastdb-0.1.3/vastdb/tests/test_util.py +39 -0
  16. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/transaction.py +19 -3
  17. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/util.py +41 -6
  18. {vastdb-0.1.2 → vastdb-0.1.3/vastdb.egg-info}/PKG-INFO +2 -2
  19. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb.egg-info/SOURCES.txt +1 -0
  20. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb.egg-info/requires.txt +1 -1
  21. {vastdb-0.1.2 → vastdb-0.1.3}/LICENSE +0 -0
  22. {vastdb-0.1.2 → vastdb-0.1.3}/MANIFEST.in +0 -0
  23. {vastdb-0.1.2 → vastdb-0.1.3}/setup.cfg +0 -0
  24. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/__init__.py +0 -0
  25. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/__init__.py +0 -0
  26. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/__init__.py +0 -0
  27. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/__init__.py +0 -0
  28. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/__init__.py +0 -0
  29. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Aggregate.py +0 -0
  30. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ArraySlice.py +0 -0
  31. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ArraySubscript.py +0 -0
  32. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/BinaryLiteral.py +0 -0
  33. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/BooleanLiteral.py +0 -0
  34. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Bound.py +0 -0
  35. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Call.py +0 -0
  36. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/CaseFragment.py +0 -0
  37. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Cast.py +0 -0
  38. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ConcreteBoundImpl.py +0 -0
  39. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ConditionalCase.py +0 -0
  40. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/CurrentRow.py +0 -0
  41. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DateLiteral.py +0 -0
  42. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DecimalLiteral.py +0 -0
  43. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Deref.py +0 -0
  44. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DurationLiteral.py +0 -0
  45. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Expression.py +0 -0
  46. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ExpressionImpl.py +0 -0
  47. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FieldIndex.py +0 -0
  48. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FieldRef.py +0 -0
  49. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Filter.py +0 -0
  50. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FixedSizeBinaryLiteral.py +0 -0
  51. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float16Literal.py +0 -0
  52. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float32Literal.py +0 -0
  53. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float64Literal.py +0 -0
  54. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Following.py +0 -0
  55. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Frame.py +0 -0
  56. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Grouping.py +0 -0
  57. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int16Literal.py +0 -0
  58. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int32Literal.py +0 -0
  59. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int64Literal.py +0 -0
  60. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int8Literal.py +0 -0
  61. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteral.py +0 -0
  62. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralDaysMilliseconds.py +0 -0
  63. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralImpl.py +0 -0
  64. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralMonths.py +0 -0
  65. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Join.py +0 -0
  66. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/JoinKind.py +0 -0
  67. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/KeyValue.py +0 -0
  68. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Limit.py +0 -0
  69. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ListLiteral.py +0 -0
  70. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Literal.py +0 -0
  71. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralColumn.py +0 -0
  72. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralImpl.py +0 -0
  73. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralRelation.py +0 -0
  74. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/MapKey.py +0 -0
  75. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/MapLiteral.py +0 -0
  76. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/OrderBy.py +0 -0
  77. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Ordering.py +0 -0
  78. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Plan.py +0 -0
  79. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Preceding.py +0 -0
  80. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Project.py +0 -0
  81. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/RelId.py +0 -0
  82. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Relation.py +0 -0
  83. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/RelationImpl.py +0 -0
  84. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SetOpKind.py +0 -0
  85. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SetOperation.py +0 -0
  86. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SimpleCase.py +0 -0
  87. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SortKey.py +0 -0
  88. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Source.py +0 -0
  89. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StringLiteral.py +0 -0
  90. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StructField.py +0 -0
  91. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StructLiteral.py +0 -0
  92. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/TimeLiteral.py +0 -0
  93. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/TimestampLiteral.py +0 -0
  94. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt16Literal.py +0 -0
  95. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt32Literal.py +0 -0
  96. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt64Literal.py +0 -0
  97. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt8Literal.py +0 -0
  98. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Unbounded.py +0 -0
  99. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/WindowCall.py +0 -0
  100. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/__init__.py +0 -0
  101. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Binary.py +0 -0
  102. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Block.py +0 -0
  103. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/BodyCompression.py +0 -0
  104. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/BodyCompressionMethod.py +0 -0
  105. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Bool.py +0 -0
  106. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Buffer.py +0 -0
  107. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/CompressionType.py +0 -0
  108. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Date.py +0 -0
  109. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/DateUnit.py +0 -0
  110. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Decimal.py +0 -0
  111. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryBatch.py +0 -0
  112. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryEncoding.py +0 -0
  113. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryKind.py +0 -0
  114. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Duration.py +0 -0
  115. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Endianness.py +0 -0
  116. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Feature.py +0 -0
  117. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Field.py +0 -0
  118. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/FieldNode.py +0 -0
  119. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/FixedSizeBinary.py +0 -0
  120. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/FixedSizeList.py +0 -0
  121. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/FloatingPoint.py +0 -0
  122. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Footer.py +0 -0
  123. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Int.py +0 -0
  124. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Interval.py +0 -0
  125. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/IntervalUnit.py +0 -0
  126. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/KeyValue.py +0 -0
  127. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/LargeBinary.py +0 -0
  128. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/LargeList.py +0 -0
  129. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/LargeUtf8.py +0 -0
  130. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/List.py +0 -0
  131. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Map.py +0 -0
  132. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Message.py +0 -0
  133. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/MessageHeader.py +0 -0
  134. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/MetadataVersion.py +0 -0
  135. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Null.py +0 -0
  136. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Precision.py +0 -0
  137. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/RecordBatch.py +0 -0
  138. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Schema.py +0 -0
  139. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/SparseMatrixCompressedAxis.py +0 -0
  140. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/SparseMatrixIndexCSX.py +0 -0
  141. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensor.py +0 -0
  142. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndex.py +0 -0
  143. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndexCOO.py +0 -0
  144. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndexCSF.py +0 -0
  145. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Struct_.py +0 -0
  146. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Tensor.py +0 -0
  147. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/TensorDim.py +0 -0
  148. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Time.py +0 -0
  149. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/TimeUnit.py +0 -0
  150. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Timestamp.py +0 -0
  151. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Type.py +0 -0
  152. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Union.py +0 -0
  153. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/UnionMode.py +0 -0
  154. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Utf8.py +0 -0
  155. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/__init__.py +0 -0
  156. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/AlterColumnRequest.py +0 -0
  157. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/AlterProjectionTableRequest.py +0 -0
  158. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/AlterSchemaRequest.py +0 -0
  159. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/AlterTableRequest.py +0 -0
  160. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/Column.py +0 -0
  161. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/ColumnType.py +0 -0
  162. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/CreateProjectionRequest.py +0 -0
  163. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/CreateSchemaRequest.py +0 -0
  164. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/GetProjectionTableStatsResponse.py +0 -0
  165. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/GetTableStatsResponse.py +0 -0
  166. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/ImportDataRequest.py +0 -0
  167. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/ListProjectionsResponse.py +0 -0
  168. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/ListSchemasResponse.py +0 -0
  169. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/ListTablesResponse.py +0 -0
  170. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/ObjectDetails.py +0 -0
  171. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/S3File.py +0 -0
  172. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/VipRange.py +0 -0
  173. {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/__init__.py +0 -0
  174. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/__init__.py +0 -0
  175. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/bench/__init__.py +0 -0
  176. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/bench/test_perf.py +0 -0
  177. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/conftest.py +0 -0
  178. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/__init__.py +0 -0
  179. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/test_duckdb.py +0 -0
  180. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/test_nested.py +0 -0
  181. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/test_projections.py +0 -0
  182. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/test_sanity.py +0 -0
  183. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/util.py +0 -0
  184. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb.egg-info/dependency_links.txt +0 -0
  185. {vastdb-0.1.2 → vastdb-0.1.3}/vastdb.egg-info/top_level.txt +0 -0
@@ -4,6 +4,20 @@ 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
+ ## [0.1.3] (2024-05-05)
8
+ [0.1.3]: https://github.com/vast-data/vastdb_sdk/compare/v0.1.2...v0.1.3
9
+
10
+ ### Added
11
+ - Document predicate pushdown support
12
+ - Access imports' table (for VAST 5.2+)
13
+ - Support `is_in` predicate pushdown
14
+ - Document `table.py`
15
+
16
+ ### Fixed
17
+ - Freeze `ibis` dependency at 8.0.0
18
+ - Support snapshot-based access
19
+ - Optimize RecordBatch slicing
20
+
7
21
  ## [0.1.2] (2024-04-25)
8
22
  [0.1.2]: https://github.com/vast-data/vastdb_sdk/compare/v0.1.1...v0.1.2
9
23
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vastdb
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Summary: VAST Data SDK
5
5
  Home-page: https://github.com/vast-data/vastdb_sdk
6
6
  Author: VAST DATA
@@ -21,7 +21,7 @@ License-File: LICENSE
21
21
  Requires-Dist: aws-requests-auth
22
22
  Requires-Dist: boto3
23
23
  Requires-Dist: flatbuffers
24
- Requires-Dist: ibis-framework
24
+ Requires-Dist: ibis-framework==8.0.0
25
25
  Requires-Dist: pyarrow
26
26
  Requires-Dist: requests
27
27
  Requires-Dist: xmltodict
@@ -86,6 +86,8 @@ Our SDK supports predicate and projection pushdown:
86
86
  table.select(predicate=table['c3'].contains('substring'))
87
87
  ```
88
88
 
89
+ See [here for more details](docs/predicate.md).
90
+
89
91
  ## Import a single Parquet file via S3 protocol
90
92
 
91
93
  It is possible to efficiently create a table from a Parquet file (without copying it via the client):
@@ -150,10 +152,11 @@ p.drop()
150
152
 
151
153
  ## Snapshots
152
154
 
153
- It is possible to list [available snapshots](https://vastdata.com/blog/bringing-snapshots-to-vasts-element-store):
155
+ It is possible to use [snapshots](https://vastdata.com/blog/bringing-snapshots-to-vasts-element-store) for accessing the Database:
154
156
 
155
157
  ```python
156
- print(bucket.list_snapshots())
158
+ snaps = bucket.list_snapshots()
159
+ batches = snaps[0].schema('schema-name').table('table-name').select()
157
160
  ```
158
161
 
159
162
  ## VAST Catalog
@@ -1,7 +1,7 @@
1
1
  aws-requests-auth
2
2
  boto3
3
3
  flatbuffers
4
- ibis-framework
4
+ ibis-framework==8.0.0
5
5
  pyarrow
6
6
  requests
7
7
  xmltodict
@@ -28,7 +28,7 @@ setup(
28
28
  name='vastdb',
29
29
  python_requires='>=3.9.0',
30
30
  description='VAST Data SDK',
31
- version='0.1.2' + suffix,
31
+ version='0.1.3' + suffix,
32
32
  url='https://github.com/vast-data/vastdb_sdk',
33
33
  author='VAST DATA',
34
34
  author_email='hello@vastdata.com',
@@ -16,14 +16,6 @@ if TYPE_CHECKING:
16
16
  log = logging.getLogger(__name__)
17
17
 
18
18
 
19
- @dataclass
20
- class Snapshot:
21
- """VAST bucket-level snapshot."""
22
-
23
- name: str
24
- bucket: "Bucket"
25
-
26
-
27
19
  @dataclass
28
20
  class Bucket:
29
21
  """VAST bucket."""
@@ -73,7 +65,22 @@ class Bucket:
73
65
 
74
66
  return [schema.Schema(name=name, bucket=self) for name, *_ in schemas]
75
67
 
76
- def snapshots(self) -> List[Snapshot]:
68
+ def snapshot(self, name, fail_if_missing=True) -> Optional["Bucket"]:
69
+ """Get snapshot by name (if exists)."""
70
+ snapshots, _is_truncated, _next_key = \
71
+ self.tx._rpc.api.list_snapshots(bucket=self.name, name_prefix=name, max_keys=1)
72
+
73
+ expected_name = f".snapshot/{name}"
74
+ exists = snapshots and snapshots[0] == expected_name + "/"
75
+ if not exists:
76
+ if fail_if_missing:
77
+ raise errors.MissingSnapshot(self.name, expected_name)
78
+ else:
79
+ return None
80
+
81
+ return Bucket(name=f'{self.name}/{expected_name}', tx=self.tx)
82
+
83
+ def snapshots(self) -> List["Bucket"]:
77
84
  """List bucket's snapshots."""
78
85
  snapshots = []
79
86
  next_key = 0
@@ -86,4 +93,7 @@ class Bucket:
86
93
  if not is_truncated:
87
94
  break
88
95
 
89
- return [Snapshot(name=snapshot, bucket=self) for snapshot in snapshots]
96
+ return [
97
+ Bucket(name=f'{self.name}/{snapshot.strip("/")}', tx=self.tx)
98
+ for snapshot in snapshots
99
+ ]
@@ -85,6 +85,10 @@ class InvalidArgument(Exception):
85
85
  pass
86
86
 
87
87
 
88
+ class TooWideRow(InvalidArgument):
89
+ pass
90
+
91
+
88
92
  class Missing(Exception):
89
93
  pass
90
94
 
@@ -93,11 +97,21 @@ class MissingTransaction(Missing):
93
97
  pass
94
98
 
95
99
 
100
+ class NotSupported(Exception):
101
+ pass
102
+
103
+
96
104
  @dataclass
97
105
  class MissingBucket(Missing):
98
106
  bucket: str
99
107
 
100
108
 
109
+ @dataclass
110
+ class MissingSnapshot(Missing):
111
+ bucket: str
112
+ snapshot: str
113
+
114
+
101
115
  @dataclass
102
116
  class MissingSchema(Missing):
103
117
  bucket: str
@@ -136,6 +150,19 @@ class TableExists(Exists):
136
150
  table: str
137
151
 
138
152
 
153
+ @dataclass
154
+ class NotSupportedCommand(NotSupported):
155
+ bucket: str
156
+ schema: str
157
+ table: str
158
+
159
+
160
+ @dataclass
161
+ class NotSupportedVersion(NotSupported):
162
+ err_msg: str
163
+ version: str
164
+
165
+
139
166
  ERROR_TYPES_MAP = {
140
167
  HttpStatus.BAD_REQUEST: BadRequest,
141
168
  HttpStatus.FOBIDDEN: Forbidden,
@@ -178,4 +205,4 @@ def from_response(res: requests.Response):
178
205
  log.warning("RPC failed: %s", kwargs)
179
206
  status = HttpStatus(res.status_code)
180
207
  error_type = ERROR_TYPES_MAP.get(status, UnexpectedError)
181
- raise error_type(**kwargs)
208
+ return error_type(**kwargs)
@@ -1,7 +1,6 @@
1
1
  import itertools
2
2
  import json
3
3
  import logging
4
- import math
5
4
  import re
6
5
  import struct
7
6
  import urllib.parse
@@ -182,6 +181,7 @@ class Predicate:
182
181
  Equals,
183
182
  Greater,
184
183
  GreaterEqual,
184
+ InValues,
185
185
  Less,
186
186
  LessEqual,
187
187
  Not,
@@ -219,40 +219,54 @@ class Predicate:
219
219
  prev_field_name = None
220
220
  for inner_op in or_args:
221
221
  _logger.debug('inner_op %s', inner_op)
222
- builder_func: Any = builder_map.get(type(inner_op))
222
+ op_type = type(inner_op)
223
+ builder_func: Any = builder_map.get(op_type)
223
224
  if not builder_func:
224
- raise NotImplementedError(inner_op.name)
225
+ if op_type == InValues:
226
+ builder_func = self.build_equal
227
+ else:
228
+ raise NotImplementedError(self.expr)
225
229
 
226
230
  if builder_func == self.build_is_null:
227
231
  column, = inner_op.args
228
- literal = None
232
+ literals = (None,)
229
233
  elif builder_func == self.build_is_not_null:
230
234
  not_arg, = inner_op.args
231
235
  # currently we only support not is_null, checking we really got is_null under the not:
232
236
  if not builder_map.get(type(not_arg)) == self.build_is_null:
233
- raise NotImplementedError(not_arg.args[0].name)
237
+ raise NotImplementedError(self.expr)
234
238
  column, = not_arg.args
235
- literal = None
239
+ literals = (None,)
236
240
  else:
237
- column, literal = inner_op.args
238
- if not isinstance(literal, Literal):
239
- raise NotImplementedError(inner_op.name)
241
+ column, arg = inner_op.args
242
+ if isinstance(arg, tuple):
243
+ literals = arg
244
+ else:
245
+ literals = (arg,)
246
+ for literal in literals:
247
+ if not isinstance(literal, Literal):
248
+ raise NotImplementedError(self.expr)
240
249
 
241
250
  if not isinstance(column, TableColumn):
242
- raise NotImplementedError(inner_op.name)
251
+ raise NotImplementedError(self.expr)
243
252
 
244
253
  field_name = column.name
245
254
  if prev_field_name is None:
246
255
  prev_field_name = field_name
247
256
  elif prev_field_name != field_name:
248
- raise NotImplementedError(op.name)
257
+ raise NotImplementedError(self.expr)
249
258
 
250
- args_offsets = [self.build_column(position=positions_map[field_name])]
251
- if literal:
252
- field = self.schema.field(field_name)
253
- args_offsets.append(self.build_literal(field=field, value=literal.value))
259
+ column_offset = self.build_column(position=positions_map[field_name])
260
+ field = self.schema.field(field_name)
261
+ for literal in literals:
262
+ args_offsets = [column_offset]
263
+ if literal is not None:
264
+ args_offsets.append(self.build_literal(field=field, value=literal.value))
254
265
 
255
- inner_offsets.append(builder_func(*args_offsets))
266
+ inner_offsets.append(builder_func(*args_offsets))
267
+
268
+ if not inner_offsets:
269
+ raise NotImplementedError(self.expr) # an empty OR is equivalent to a 'FALSE' literal
256
270
 
257
271
  domain_offset = self.build_or(inner_offsets)
258
272
  offsets.append(domain_offset)
@@ -719,20 +733,6 @@ def _parse_table_info(obj):
719
733
  return TableInfo(name, properties, handle, num_rows, used_bytes)
720
734
 
721
735
 
722
- def build_record_batch(column_info, column_values):
723
- fields = [pa.field(column_name, column_type) for column_type, column_name in column_info]
724
- schema = pa.schema(fields)
725
- arrays = [pa.array(column_values[column_type], type=column_type) for column_type, _ in column_info]
726
- batch = pa.record_batch(arrays, schema)
727
- return serialize_record_batch(batch)
728
-
729
-
730
- def serialize_record_batch(batch):
731
- sink = pa.BufferOutputStream()
732
- with pa.ipc.new_stream(sink, batch.schema) as writer:
733
- writer.write(batch)
734
- return sink.getvalue()
735
-
736
736
  # Results that returns from tablestats
737
737
 
738
738
 
@@ -952,26 +952,27 @@ class VastdbApi:
952
952
 
953
953
  return bucket_name, schemas, next_key, is_truncated, count
954
954
 
955
- def list_snapshots(self, bucket, max_keys=1000, next_token=None, expected_retvals=None):
955
+ def list_snapshots(self, bucket, max_keys=1000, next_token=None, name_prefix=''):
956
956
  next_token = next_token or ''
957
- expected_retvals = expected_retvals or []
958
- url_params = {'list_type': '2', 'prefix': '.snapshot/', 'delimiter': '/', 'max_keys': str(max_keys)}
957
+ url_params = {'list_type': '2', 'prefix': '.snapshot/' + name_prefix, 'delimiter': '/', 'max_keys': str(max_keys)}
959
958
  if next_token:
960
959
  url_params['continuation-token'] = next_token
961
960
 
962
961
  res = self.session.get(self._api_prefix(bucket=bucket, command="list", url_params=url_params), headers={}, stream=True)
963
- self._check_res(res, "list_snapshots", expected_retvals)
964
- if res.status_code == 200:
965
- out = b''.join(res.iter_content(chunk_size=128))
966
- xml_str = out.decode()
967
- xml_dict = xmltodict.parse(xml_str)
968
- list_res = xml_dict['ListBucketResult']
969
- is_truncated = list_res['IsTruncated'] == 'true'
970
- marker = list_res['Marker']
971
- common_prefixes = list_res['CommonPrefixes'] if 'CommonPrefixes' in list_res else []
972
- snapshots = [v['Prefix'] for v in common_prefixes]
962
+ self._check_res(res, "list_snapshots")
963
+
964
+ out = b''.join(res.iter_content(chunk_size=128))
965
+ xml_str = out.decode()
966
+ xml_dict = xmltodict.parse(xml_str)
967
+ list_res = xml_dict['ListBucketResult']
968
+ is_truncated = list_res['IsTruncated'] == 'true'
969
+ marker = list_res['Marker']
970
+ common_prefixes = list_res.get('CommonPrefixes', [])
971
+ if isinstance(common_prefixes, dict): # in case there is a single snapshot
972
+ common_prefixes = [common_prefixes]
973
+ snapshots = [v['Prefix'] for v in common_prefixes]
973
974
 
974
- return snapshots, is_truncated, marker
975
+ return snapshots, is_truncated, marker
975
976
 
976
977
  def create_table(self, bucket, schema, name, arrow_schema, txid=0, client_tags=[], expected_retvals=[],
977
978
  topic_partitions=0, create_imports_table=False, use_external_row_ids_allocation=False):
@@ -1030,7 +1031,7 @@ class VastdbApi:
1030
1031
  # create the table
1031
1032
  return self.create_table(bucket, schema, name, arrow_schema, txid, client_tags, expected_retvals)
1032
1033
 
1033
- def get_table_stats(self, bucket, schema, name, txid=0, client_tags=[], expected_retvals=[]):
1034
+ def get_table_stats(self, bucket, schema, name, txid=0, client_tags=[], expected_retvals=[], imports_table_stats=False):
1034
1035
  """
1035
1036
  GET /mybucket/myschema/mytable?stats HTTP/1.1
1036
1037
  tabular-txid: TransactionId
@@ -1039,7 +1040,8 @@ class VastdbApi:
1039
1040
  The Command will return the statistics in flatbuf format
1040
1041
  """
1041
1042
  headers = self._fill_common_headers(txid=txid, client_tags=client_tags)
1042
- res = self.session.get(self._api_prefix(bucket=bucket, schema=schema, table=name, command="stats"), headers=headers)
1043
+ url_params = {'sub-table': IMPORTED_OBJECTS_TABLE_NAME} if imports_table_stats else {}
1044
+ res = self.session.get(self._api_prefix(bucket=bucket, schema=schema, table=name, command="stats", url_params=url_params), headers=headers)
1043
1045
  self._check_res(res, "get_table_stats", expected_retvals)
1044
1046
 
1045
1047
  flatbuf = b''.join(res.iter_content(chunk_size=128))
@@ -1527,11 +1529,18 @@ class VastdbApi:
1527
1529
  if response.status_code != 200:
1528
1530
  return response
1529
1531
 
1532
+ ALLOWED_IMPORT_STATES = {
1533
+ 'Success',
1534
+ 'TabularInProgress',
1535
+ 'TabularAlreadyImported',
1536
+ 'TabularImportNotStarted',
1537
+ }
1538
+
1530
1539
  chunk_size = 1024
1531
1540
  for chunk in response.iter_content(chunk_size=chunk_size):
1532
1541
  chunk_dict = json.loads(chunk)
1533
1542
  _logger.debug("import data chunk=%s, result: %s", chunk_dict, chunk_dict['res'])
1534
- if chunk_dict['res'] != 'Success' and chunk_dict['res'] != 'TabularInProgress' and chunk_dict['res'] != 'TabularAlreadyImported':
1543
+ if chunk_dict['res'] not in ALLOWED_IMPORT_STATES:
1535
1544
  raise errors.ImportFilesError(
1536
1545
  f"Encountered an error during import_data. status: {chunk_dict['res']}, "
1537
1546
  f"error message: {chunk_dict['err_msg'] or 'Unexpected error'} during import of "
@@ -1555,48 +1564,6 @@ class VastdbApi:
1555
1564
 
1556
1565
  return self._check_res(res, "import_data", expected_retvals)
1557
1566
 
1558
- def _record_batch_slices(self, batch, rows_per_slice=None):
1559
- max_slice_size_in_bytes = int(0.9 * 5 * 1024 * 1024) # 0.9 * 5MB
1560
- batch_len = len(batch)
1561
- serialized_batch = serialize_record_batch(batch)
1562
- batch_size_in_bytes = len(serialized_batch)
1563
- _logger.debug('max_slice_size_in_bytes=%d batch_len=%d batch_size_in_bytes=%d',
1564
- max_slice_size_in_bytes, batch_len, batch_size_in_bytes)
1565
-
1566
- if not rows_per_slice:
1567
- if batch_size_in_bytes < max_slice_size_in_bytes:
1568
- rows_per_slice = batch_len
1569
- else:
1570
- rows_per_slice = int(0.9 * batch_len * max_slice_size_in_bytes / batch_size_in_bytes)
1571
-
1572
- done_slicing = False
1573
- while not done_slicing:
1574
- # Attempt slicing according to the current rows_per_slice
1575
- offset = 0
1576
- serialized_slices = []
1577
- for i in range(math.ceil(batch_len / rows_per_slice)):
1578
- offset = rows_per_slice * i
1579
- if offset >= batch_len:
1580
- done_slicing = True
1581
- break
1582
- slice_batch = batch.slice(offset, rows_per_slice)
1583
- serialized_slice_batch = serialize_record_batch(slice_batch)
1584
- sizeof_serialized_slice_batch = len(serialized_slice_batch)
1585
-
1586
- if sizeof_serialized_slice_batch <= max_slice_size_in_bytes:
1587
- serialized_slices.append(serialized_slice_batch)
1588
- else:
1589
- _logger.info(f'Using rows_per_slice {rows_per_slice} slice {i} size {sizeof_serialized_slice_batch} exceeds {max_slice_size_in_bytes} bytes, trying smaller rows_per_slice')
1590
- # We have a slice that is too large
1591
- rows_per_slice = int(rows_per_slice / 2)
1592
- if rows_per_slice < 1:
1593
- raise ValueError('cannot decrease batch size below 1 row')
1594
- break
1595
- else:
1596
- done_slicing = True
1597
-
1598
- return serialized_slices
1599
-
1600
1567
  def insert_rows(self, bucket, schema, table, record_batch, txid=0, client_tags=[], expected_retvals=[]):
1601
1568
  """
1602
1569
  POST /mybucket/myschema/mytable?rows HTTP/1.1
@@ -87,4 +87,4 @@ class Schema:
87
87
 
88
88
  def _parse_table_info(table_info, schema: "schema.Schema"):
89
89
  stats = table.TableStats(num_rows=table_info.num_rows, size_in_bytes=table_info.size_in_bytes)
90
- return table.Table(name=table_info.name, schema=schema, handle=int(table_info.handle), stats=stats)
90
+ return table.Table(name=table_info.name, schema=schema, handle=int(table_info.handle), stats=stats, _imports_table=False)
@@ -11,7 +11,20 @@ import os
11
11
 
12
12
  import boto3
13
13
 
14
- from . import internal_commands, transaction
14
+ from . import errors, internal_commands, transaction
15
+
16
+
17
+ class Features:
18
+ """VAST database features - check if server is already support a feature."""
19
+
20
+ def __init__(self, vast_version):
21
+ """Save the server version."""
22
+ self.vast_version = vast_version
23
+
24
+ def check_imports_table(self):
25
+ """Check if the feature that support imports table is supported."""
26
+ if self.vast_version < (5, 2):
27
+ raise errors.NotSupportedVersion("import_table requires 5.2+", self.vast_version)
15
28
 
16
29
 
17
30
  class Session:
@@ -27,6 +40,8 @@ class Session:
27
40
  endpoint = os.environ['AWS_S3_ENDPOINT_URL']
28
41
 
29
42
  self.api = internal_commands.VastdbApi(endpoint, access, secret)
43
+ version_tuple = tuple(int(part) for part in self.api.vast_version.split('.'))
44
+ self.features = Features(version_tuple)
30
45
  self.s3 = boto3.client('s3',
31
46
  aws_access_key_id=access,
32
47
  aws_secret_access_key=secret,