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.
- {vastdb-1.3.8 → vastdb-1.3.10}/CHANGELOG.md +24 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/PKG-INFO +1 -1
- {vastdb-1.3.8 → vastdb-1.3.10}/README.md +9 -5
- {vastdb-1.3.8 → vastdb-1.3.10}/setup.py +1 -1
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/__init__.py +2 -2
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/_internal.py +41 -8
- vastdb-1.3.10/vastdb/bench/test_perf.py +87 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/features.py +6 -2
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/table.py +44 -10
- vastdb-1.3.10/vastdb/tests/test_imports.py +517 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/test_tables.py +25 -2
- vastdb-1.3.10/vastdb/tests/util.py +38 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb.egg-info/PKG-INFO +1 -1
- vastdb-1.3.8/vastdb/bench/test_perf.py +0 -28
- vastdb-1.3.8/vastdb/tests/test_imports.py +0 -204
- vastdb-1.3.8/vastdb/tests/util.py +0 -17
- {vastdb-1.3.8 → vastdb-1.3.10}/CONTRIBUTING.md +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/LICENSE +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/MANIFEST.in +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/requirements.txt +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/setup.cfg +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/bench_repo/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/bench_repo/mega_combo.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/cli.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/common/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/common/constants.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/common/log_utils.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/common/types.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/common/utils.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/dataset/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/dataset/generate_secmaster.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/dataset/generate_stocks_dataset.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/dataset/schemas.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/dataset/secmaster.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/orchestrate/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/orchestrate/bench_spec.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/orchestrate/results_helpers.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/orchestrate/scenario.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/orchestrate/scenario_generator.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/query/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/query/arrow_common.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/query/query.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/query/query_pyarrow.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/query/query_vastdb.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/perf_bench/run.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bench/test_sample.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/bucket.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/config.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/conftest.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/errors.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/schema.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/session.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/metrics.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/test_duckdb.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/test_nested.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/test_projections.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/test_sanity.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/test_schemas.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/tests/test_util.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/transaction.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/util.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Aggregate.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ArraySlice.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ArraySubscript.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/BinaryLiteral.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/BooleanLiteral.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Bound.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Call.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/CaseFragment.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Cast.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ConcreteBoundImpl.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ConditionalCase.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/CurrentRow.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DateLiteral.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DecimalLiteral.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Deref.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/DurationLiteral.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Expression.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ExpressionImpl.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FieldIndex.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FieldRef.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Filter.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/FixedSizeBinaryLiteral.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float16Literal.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float32Literal.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Float64Literal.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Following.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Frame.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Grouping.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int16Literal.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int32Literal.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int64Literal.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Int8Literal.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteral.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralDaysMilliseconds.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralImpl.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/IntervalLiteralMonths.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Join.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/JoinKind.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/KeyValue.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Limit.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/ListLiteral.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Literal.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralColumn.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralImpl.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/LiteralRelation.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/MapKey.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/MapLiteral.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/OrderBy.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Ordering.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Plan.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Preceding.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Project.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/RelId.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Relation.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/RelationImpl.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SetOpKind.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SetOperation.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SimpleCase.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/SortKey.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Source.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StringLiteral.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StructField.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/StructLiteral.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/TimeLiteral.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/TimestampLiteral.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt16Literal.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt32Literal.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt64Literal.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/UInt8Literal.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/Unbounded.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/WindowCall.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/computeir/flatbuf/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Binary.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Block.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/BodyCompression.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/BodyCompressionMethod.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Bool.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Buffer.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/CompressionType.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Date.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/DateUnit.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Decimal.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryBatch.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryEncoding.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/DictionaryKind.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Duration.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Endianness.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Feature.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Field.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/FieldNode.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/FixedSizeBinary.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/FixedSizeList.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/FloatingPoint.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Footer.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Int.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Interval.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/IntervalUnit.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/KeyValue.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/LargeBinary.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/LargeList.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/LargeUtf8.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/List.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Map.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Message.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/MessageHeader.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/MetadataVersion.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Null.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Precision.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/RecordBatch.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Schema.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseMatrixCompressedAxis.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseMatrixIndexCSX.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensor.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndex.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndexCOO.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/SparseTensorIndexCSF.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Struct_.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Tensor.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/TensorDim.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Time.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/TimeUnit.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Timestamp.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Type.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Union.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/UnionMode.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/Utf8.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/org/apache/arrow/flatbuf/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/AlterColumnRequest.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/AlterProjectionTableRequest.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/AlterSchemaRequest.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/AlterTableRequest.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/Column.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ColumnDetails.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ColumnType.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/CreateProjectionRequest.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/CreateSchemaRequest.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/CreateViewRequest.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/FilterString.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/GetProjectionTableStatsResponse.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/GetRowColumnSecurityResponse.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/GetTableStatsResponse.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ImportDataRequest.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/KeyName.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ListProjectionsResponse.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ListSchemasResponse.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ListTablesResponse.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ListViewsResponse.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/NameString.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/ObjectDetails.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/S3File.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/VipRange.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_flatbuf/tabular/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_tests/__init__.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_tests/test_ha.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb/vast_tests/test_scale.py +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb.egg-info/SOURCES.txt +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb.egg-info/dependency_links.txt +0 -0
- {vastdb-1.3.8 → vastdb-1.3.10}/vastdb.egg-info/requires.txt +0 -0
- {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
|
|
|
@@ -2,14 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
# VAST DB Python SDK
|
|
4
4
|
|
|
5
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
[](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/
|
|
224
|
+
See also the [full Vast DB Python SDK documentation](https://vastdb-sdk.readthedocs.io/en/latest/)
|
|
@@ -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
|
|
17
|
-
return
|
|
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
|
-
|
|
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",
|
|
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
|
|
1306
|
-
|
|
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
|
|
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.
|
|
281
|
-
log.
|
|
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
|
|
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
|
|
340
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
-
"""
|
|
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
|
|