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.
- {vastdb-0.1.2 → vastdb-0.1.3}/CHANGELOG.md +14 -0
- {vastdb-0.1.2/vastdb.egg-info → vastdb-0.1.3}/PKG-INFO +2 -2
- {vastdb-0.1.2 → vastdb-0.1.3}/README.md +5 -2
- {vastdb-0.1.2 → vastdb-0.1.3}/requirements.txt +1 -1
- {vastdb-0.1.2 → vastdb-0.1.3}/setup.py +1 -1
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/bucket.py +20 -10
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/errors.py +28 -1
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/internal_commands.py +56 -89
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/schema.py +1 -1
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/session.py +16 -1
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/table.py +134 -27
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/test_imports.py +13 -1
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/test_schemas.py +1 -2
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/test_tables.py +26 -1
- vastdb-0.1.3/vastdb/tests/test_util.py +39 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/transaction.py +19 -3
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/util.py +41 -6
- {vastdb-0.1.2 → vastdb-0.1.3/vastdb.egg-info}/PKG-INFO +2 -2
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb.egg-info/SOURCES.txt +1 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb.egg-info/requires.txt +1 -1
- {vastdb-0.1.2 → vastdb-0.1.3}/LICENSE +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/MANIFEST.in +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/setup.cfg +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/__init__.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/__init__.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/__init__.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/__init__.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/__init__.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Aggregate.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ArraySlice.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ArraySubscript.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/BinaryLiteral.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/BooleanLiteral.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Bound.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Call.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/CaseFragment.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Cast.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ConcreteBoundImpl.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ConditionalCase.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/CurrentRow.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DateLiteral.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DecimalLiteral.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Deref.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DurationLiteral.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Expression.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ExpressionImpl.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FieldIndex.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FieldRef.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Filter.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FixedSizeBinaryLiteral.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float16Literal.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float32Literal.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float64Literal.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Following.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Frame.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Grouping.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int16Literal.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int32Literal.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int64Literal.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int8Literal.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteral.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralDaysMilliseconds.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralImpl.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralMonths.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Join.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/JoinKind.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/KeyValue.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Limit.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ListLiteral.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Literal.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralColumn.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralImpl.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralRelation.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/MapKey.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/MapLiteral.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/OrderBy.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Ordering.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Plan.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Preceding.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Project.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/RelId.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Relation.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/RelationImpl.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SetOpKind.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SetOperation.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SimpleCase.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SortKey.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Source.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StringLiteral.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StructField.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StructLiteral.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/TimeLiteral.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/TimestampLiteral.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt16Literal.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt32Literal.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt64Literal.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt8Literal.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Unbounded.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/WindowCall.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/computeir/flatbuf/__init__.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Binary.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Block.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/BodyCompression.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/BodyCompressionMethod.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Bool.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Buffer.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/CompressionType.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Date.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/DateUnit.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Decimal.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryBatch.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryEncoding.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryKind.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Duration.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Endianness.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Feature.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Field.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/FieldNode.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/FixedSizeBinary.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/FixedSizeList.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/FloatingPoint.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Footer.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Int.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Interval.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/IntervalUnit.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/KeyValue.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/LargeBinary.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/LargeList.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/LargeUtf8.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/List.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Map.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Message.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/MessageHeader.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/MetadataVersion.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Null.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Precision.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/RecordBatch.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Schema.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/SparseMatrixCompressedAxis.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/SparseMatrixIndexCSX.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensor.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndex.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndexCOO.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndexCSF.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Struct_.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Tensor.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/TensorDim.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Time.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/TimeUnit.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Timestamp.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Type.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Union.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/UnionMode.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/Utf8.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/org/apache/arrow/flatbuf/__init__.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/AlterColumnRequest.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/AlterProjectionTableRequest.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/AlterSchemaRequest.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/AlterTableRequest.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/Column.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/ColumnType.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/CreateProjectionRequest.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/CreateSchemaRequest.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/GetProjectionTableStatsResponse.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/GetTableStatsResponse.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/ImportDataRequest.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/ListProjectionsResponse.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/ListSchemasResponse.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/ListTablesResponse.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/ObjectDetails.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/S3File.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/VipRange.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vast_flatbuf/tabular/__init__.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/__init__.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/bench/__init__.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/bench/test_perf.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/conftest.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/__init__.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/test_duckdb.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/test_nested.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/test_projections.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/test_sanity.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb/tests/util.py +0 -0
- {vastdb-0.1.2 → vastdb-0.1.3}/vastdb.egg-info/dependency_links.txt +0 -0
- {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.
|
|
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
|
|
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
|
-
|
|
158
|
+
snaps = bucket.list_snapshots()
|
|
159
|
+
batches = snaps[0].schema('schema-name').table('table-name').select()
|
|
157
160
|
```
|
|
158
161
|
|
|
159
162
|
## VAST Catalog
|
|
@@ -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
|
|
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 [
|
|
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
|
-
|
|
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
|
-
|
|
222
|
+
op_type = type(inner_op)
|
|
223
|
+
builder_func: Any = builder_map.get(op_type)
|
|
223
224
|
if not builder_func:
|
|
224
|
-
|
|
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
|
-
|
|
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(
|
|
237
|
+
raise NotImplementedError(self.expr)
|
|
234
238
|
column, = not_arg.args
|
|
235
|
-
|
|
239
|
+
literals = (None,)
|
|
236
240
|
else:
|
|
237
|
-
column,
|
|
238
|
-
if
|
|
239
|
-
|
|
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(
|
|
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(
|
|
257
|
+
raise NotImplementedError(self.expr)
|
|
249
258
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
args_offsets
|
|
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
|
-
|
|
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,
|
|
955
|
+
def list_snapshots(self, bucket, max_keys=1000, next_token=None, name_prefix=''):
|
|
956
956
|
next_token = next_token or ''
|
|
957
|
-
|
|
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"
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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']
|
|
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,
|