From 0303335ff133704b70df6b5437f72d6f39c47c67 Mon Sep 17 00:00:00 2001 From: Allison Portis Date: Tue, 2 Dec 2025 17:54:16 -0800 Subject: [PATCH 1/3] Remove connectors --- .github/workflows/connectors_test.yaml | 38 - build.sbt | 271 +- connectors/README.md | 25 +- .../api/java/allclasses-frame.html | 46 - .../api/java/allclasses-noframe.html | 46 - .../api/java/constant-values.html | 122 - .../api/java/deprecated-list.html | 122 - .../delta-standalone/api/java/help-doc.html | 223 -- .../delta-standalone/api/java/index-all.html | 677 ----- .../delta-standalone/api/java/index.html | 75 - .../java/io/delta/standalone/DeltaLog.html | 366 --- .../java/io/delta/standalone/Snapshot.html | 267 -- .../io/delta/standalone/actions/AddFile.html | 406 --- .../delta/standalone/actions/CommitInfo.html | 505 ---- .../io/delta/standalone/actions/Format.html | 323 --- .../io/delta/standalone/actions/JobInfo.html | 364 --- .../io/delta/standalone/actions/Metadata.html | 418 --- .../standalone/actions/NotebookInfo.html | 304 --- .../standalone/actions/package-frame.html | 25 - .../standalone/actions/package-summary.html | 172 -- .../standalone/actions/package-tree.html | 140 - .../standalone/data/CloseableIterator.html | 200 -- .../io/delta/standalone/data/RowRecord.html | 634 ----- .../delta/standalone/data/package-frame.html | 21 - .../standalone/data/package-summary.html | 148 -- .../delta/standalone/data/package-tree.html | 145 -- .../io/delta/standalone/package-frame.html | 21 - .../io/delta/standalone/package-summary.html | 149 -- .../io/delta/standalone/package-tree.html | 132 - .../io/delta/standalone/types/ArrayType.html | 336 --- .../io/delta/standalone/types/BinaryType.html | 248 -- .../delta/standalone/types/BooleanType.html | 248 -- .../io/delta/standalone/types/ByteType.html | 286 --- .../io/delta/standalone/types/DataType.html | 337 --- .../io/delta/standalone/types/DateType.html | 249 -- .../delta/standalone/types/DecimalType.html | 373 --- .../io/delta/standalone/types/DoubleType.html | 248 -- .../io/delta/standalone/types/FloatType.html | 248 -- .../delta/standalone/types/IntegerType.html | 286 --- .../io/delta/standalone/types/LongType.html | 286 --- .../io/delta/standalone/types/MapType.html | 352 --- .../io/delta/standalone/types/NullType.html | 248 -- .../io/delta/standalone/types/ShortType.html | 286 --- .../io/delta/standalone/types/StringType.html | 248 -- .../delta/standalone/types/StructField.html | 362 --- .../io/delta/standalone/types/StructType.html | 366 --- .../delta/standalone/types/TimestampType.html | 248 -- .../delta/standalone/types/package-frame.html | 37 - .../standalone/types/package-summary.html | 245 -- .../delta/standalone/types/package-tree.html | 155 -- .../api/java/overview-frame.html | 24 - .../api/java/overview-summary.html | 145 -- .../api/java/overview-tree.html | 184 -- .../delta-standalone/api/java/package-list | 4 - .../0.2.0/delta-standalone/api/java/script.js | 30 - .../delta-standalone/api/java/stylesheet.css | 574 ----- .../api/java/allclasses-frame.html | 96 - .../api/java/allclasses-noframe.html | 96 - .../api/java/constant-values.html | 277 -- .../api/java/deprecated-list.html | 146 -- .../delta-standalone/api/java/help-doc.html | 223 -- .../delta-standalone/api/java/index-all.html | 1531 ----------- .../delta-standalone/api/java/index.html | 75 - .../io/delta/standalone/CommitResult.html | 274 -- .../java/io/delta/standalone/DeltaLog.html | 472 ---- .../java/io/delta/standalone/DeltaScan.html | 294 --- .../delta/standalone/Operation.Metrics.html | 683 ----- .../io/delta/standalone/Operation.Name.html | 589 ----- .../java/io/delta/standalone/Operation.html | 442 ---- .../standalone/OptimisticTransaction.html | 388 --- .../java/io/delta/standalone/Snapshot.html | 320 --- .../java/io/delta/standalone/VersionLog.html | 296 --- .../io/delta/standalone/actions/Action.html | 189 -- .../delta/standalone/actions/AddCDCFile.html | 371 --- .../standalone/actions/AddFile.Builder.html | 317 --- .../io/delta/standalone/actions/AddFile.html | 581 ----- .../actions/CommitInfo.Builder.html | 481 ---- .../delta/standalone/actions/CommitInfo.html | 706 ------ .../delta/standalone/actions/FileAction.html | 252 -- .../io/delta/standalone/actions/Format.html | 344 --- .../standalone/actions/JobInfo.Builder.html | 335 --- .../io/delta/standalone/actions/JobInfo.html | 402 --- .../standalone/actions/Metadata.Builder.html | 408 --- .../io/delta/standalone/actions/Metadata.html | 530 ---- .../standalone/actions/NotebookInfo.html | 304 --- .../io/delta/standalone/actions/Protocol.html | 345 --- .../delta/standalone/actions/RemoveFile.html | 471 ---- .../standalone/actions/SetTransaction.html | 327 --- .../standalone/actions/package-frame.html | 38 - .../standalone/actions/package-summary.html | 244 -- .../standalone/actions/package-tree.html | 156 -- .../standalone/data/CloseableIterator.html | 200 -- .../io/delta/standalone/data/RowRecord.html | 682 ----- .../delta/standalone/data/package-frame.html | 21 - .../standalone/data/package-summary.html | 148 -- .../delta/standalone/data/package-tree.html | 145 -- .../exceptions/ConcurrentAppendException.html | 276 -- .../ConcurrentDeleteDeleteException.html | 276 -- .../ConcurrentDeleteReadException.html | 276 -- .../ConcurrentTransactionException.html | 276 -- .../DeltaConcurrentModificationException.html | 275 -- .../exceptions/DeltaStandaloneException.html | 292 --- .../exceptions/MetadataChangedException.html | 277 -- .../exceptions/ProtocolChangedException.html | 276 -- .../standalone/exceptions/package-frame.html | 27 - .../exceptions/package-summary.html | 185 -- .../standalone/exceptions/package-tree.html | 161 -- .../io/delta/standalone/expressions/And.html | 319 --- .../expressions/BinaryComparison.html | 244 -- .../expressions/BinaryExpression.html | 340 --- .../expressions/BinaryOperator.html | 274 -- .../delta/standalone/expressions/Column.html | 406 --- .../delta/standalone/expressions/EqualTo.html | 286 --- .../standalone/expressions/Expression.html | 304 --- .../standalone/expressions/GreaterThan.html | 286 --- .../expressions/GreaterThanOrEqual.html | 286 --- .../io/delta/standalone/expressions/In.html | 360 --- .../standalone/expressions/IsNotNull.html | 332 --- .../delta/standalone/expressions/IsNull.html | 332 --- .../expressions/LeafExpression.html | 311 --- .../standalone/expressions/LessThan.html | 286 --- .../expressions/LessThanOrEqual.html | 286 --- .../delta/standalone/expressions/Literal.html | 617 ----- .../io/delta/standalone/expressions/Not.html | 324 --- .../io/delta/standalone/expressions/Or.html | 319 --- .../standalone/expressions/Predicate.html | 242 -- .../expressions/UnaryExpression.html | 327 --- .../standalone/expressions/package-frame.html | 42 - .../expressions/package-summary.html | 269 -- .../standalone/expressions/package-tree.html | 175 -- .../io/delta/standalone/package-frame.html | 34 - .../io/delta/standalone/package-summary.html | 215 -- .../io/delta/standalone/package-tree.html | 157 -- .../io/delta/standalone/storage/LogStore.html | 478 ---- .../standalone/storage/package-frame.html | 20 - .../standalone/storage/package-summary.html | 142 -- .../standalone/storage/package-tree.html | 135 - .../io/delta/standalone/types/ArrayType.html | 344 --- .../io/delta/standalone/types/BinaryType.html | 248 -- .../delta/standalone/types/BooleanType.html | 248 -- .../io/delta/standalone/types/ByteType.html | 288 --- .../io/delta/standalone/types/DataType.html | 383 --- .../io/delta/standalone/types/DateType.html | 249 -- .../delta/standalone/types/DecimalType.html | 381 --- .../io/delta/standalone/types/DoubleType.html | 248 -- .../types/FieldMetadata.Builder.html | 441 ---- .../delta/standalone/types/FieldMetadata.html | 368 --- .../io/delta/standalone/types/FloatType.html | 248 -- .../delta/standalone/types/IntegerType.html | 288 --- .../io/delta/standalone/types/LongType.html | 288 --- .../io/delta/standalone/types/MapType.html | 364 --- .../io/delta/standalone/types/NullType.html | 248 -- .../io/delta/standalone/types/ShortType.html | 288 --- .../io/delta/standalone/types/StringType.html | 248 -- .../delta/standalone/types/StructField.html | 416 --- .../io/delta/standalone/types/StructType.html | 559 ---- .../delta/standalone/types/TimestampType.html | 248 -- .../delta/standalone/types/package-frame.html | 39 - .../standalone/types/package-summary.html | 257 -- .../delta/standalone/types/package-tree.html | 157 -- ...aConverter.ParquetOutputTimestampType.html | 365 --- .../util/ParquetSchemaConverter.html | 417 --- .../delta/standalone/util/package-frame.html | 24 - .../standalone/util/package-summary.html | 159 -- .../delta/standalone/util/package-tree.html | 147 -- .../api/java/overview-frame.html | 28 - .../api/java/overview-summary.html | 161 -- .../api/java/overview-tree.html | 289 --- .../delta-standalone/api/java/package-list | 8 - .../0.3.0/delta-standalone/api/java/script.js | 30 - .../api/java/serialized-form.html | 170 -- .../delta-standalone/api/java/stylesheet.css | 574 ----- .../api/java/allclasses-frame.html | 20 - .../api/java/allclasses-noframe.html | 20 - .../delta-flink/api/java/constant-values.html | 120 - .../delta-flink/api/java/deprecated-list.html | 120 - .../0.4.0/delta-flink/api/java/help-doc.html | 217 -- .../0.4.0/delta-flink/api/java/index-all.html | 187 -- .../0.4.0/delta-flink/api/java/index.html | 72 - .../java/io/delta/flink/sink/DeltaSink.html | 307 --- .../flink/sink/RowDataDeltaSinkBuilder.html | 356 --- .../io/delta/flink/sink/package-frame.html | 21 - .../io/delta/flink/sink/package-summary.html | 147 -- .../io/delta/flink/sink/package-tree.html | 134 - .../delta-flink/api/java/overview-tree.html | 138 - .../0.4.0/delta-flink/api/java/package-list | 1 - .../docs/0.4.0/delta-flink/api/java/script.js | 30 - .../0.4.0/delta-flink/api/java/stylesheet.css | 574 ----- .../api/java/allclasses-frame.html | 96 - .../api/java/allclasses-noframe.html | 96 - .../api/java/constant-values.html | 277 -- .../api/java/deprecated-list.html | 146 -- .../delta-standalone/api/java/help-doc.html | 223 -- .../delta-standalone/api/java/index-all.html | 1531 ----------- .../delta-standalone/api/java/index.html | 75 - .../io/delta/standalone/CommitResult.html | 274 -- .../java/io/delta/standalone/DeltaLog.html | 472 ---- .../java/io/delta/standalone/DeltaScan.html | 294 --- .../delta/standalone/Operation.Metrics.html | 683 ----- .../io/delta/standalone/Operation.Name.html | 589 ----- .../java/io/delta/standalone/Operation.html | 442 ---- .../standalone/OptimisticTransaction.html | 388 --- .../java/io/delta/standalone/Snapshot.html | 320 --- .../java/io/delta/standalone/VersionLog.html | 296 --- .../io/delta/standalone/actions/Action.html | 189 -- .../delta/standalone/actions/AddCDCFile.html | 371 --- .../standalone/actions/AddFile.Builder.html | 317 --- .../io/delta/standalone/actions/AddFile.html | 581 ----- .../actions/CommitInfo.Builder.html | 481 ---- .../delta/standalone/actions/CommitInfo.html | 706 ------ .../delta/standalone/actions/FileAction.html | 252 -- .../io/delta/standalone/actions/Format.html | 344 --- .../standalone/actions/JobInfo.Builder.html | 335 --- .../io/delta/standalone/actions/JobInfo.html | 402 --- .../standalone/actions/Metadata.Builder.html | 408 --- .../io/delta/standalone/actions/Metadata.html | 530 ---- .../standalone/actions/NotebookInfo.html | 304 --- .../io/delta/standalone/actions/Protocol.html | 345 --- .../delta/standalone/actions/RemoveFile.html | 471 ---- .../standalone/actions/SetTransaction.html | 327 --- .../standalone/actions/package-frame.html | 38 - .../standalone/actions/package-summary.html | 244 -- .../standalone/actions/package-tree.html | 156 -- .../standalone/data/CloseableIterator.html | 200 -- .../io/delta/standalone/data/RowRecord.html | 682 ----- .../delta/standalone/data/package-frame.html | 21 - .../standalone/data/package-summary.html | 148 -- .../delta/standalone/data/package-tree.html | 145 -- .../exceptions/ConcurrentAppendException.html | 276 -- .../ConcurrentDeleteDeleteException.html | 276 -- .../ConcurrentDeleteReadException.html | 276 -- .../ConcurrentTransactionException.html | 276 -- .../DeltaConcurrentModificationException.html | 275 -- .../exceptions/DeltaStandaloneException.html | 292 --- .../exceptions/MetadataChangedException.html | 277 -- .../exceptions/ProtocolChangedException.html | 276 -- .../standalone/exceptions/package-frame.html | 27 - .../exceptions/package-summary.html | 185 -- .../standalone/exceptions/package-tree.html | 161 -- .../io/delta/standalone/expressions/And.html | 319 --- .../expressions/BinaryComparison.html | 244 -- .../expressions/BinaryExpression.html | 340 --- .../expressions/BinaryOperator.html | 274 -- .../delta/standalone/expressions/Column.html | 406 --- .../delta/standalone/expressions/EqualTo.html | 286 --- .../standalone/expressions/Expression.html | 304 --- .../standalone/expressions/GreaterThan.html | 286 --- .../expressions/GreaterThanOrEqual.html | 286 --- .../io/delta/standalone/expressions/In.html | 360 --- .../standalone/expressions/IsNotNull.html | 332 --- .../delta/standalone/expressions/IsNull.html | 332 --- .../expressions/LeafExpression.html | 311 --- .../standalone/expressions/LessThan.html | 286 --- .../expressions/LessThanOrEqual.html | 286 --- .../delta/standalone/expressions/Literal.html | 617 ----- .../io/delta/standalone/expressions/Not.html | 324 --- .../io/delta/standalone/expressions/Or.html | 319 --- .../standalone/expressions/Predicate.html | 242 -- .../expressions/UnaryExpression.html | 327 --- .../standalone/expressions/package-frame.html | 42 - .../expressions/package-summary.html | 269 -- .../standalone/expressions/package-tree.html | 175 -- .../io/delta/standalone/package-frame.html | 34 - .../io/delta/standalone/package-summary.html | 215 -- .../io/delta/standalone/package-tree.html | 157 -- .../io/delta/standalone/storage/LogStore.html | 478 ---- .../standalone/storage/package-frame.html | 20 - .../standalone/storage/package-summary.html | 142 -- .../standalone/storage/package-tree.html | 135 - .../io/delta/standalone/types/ArrayType.html | 344 --- .../io/delta/standalone/types/BinaryType.html | 248 -- .../delta/standalone/types/BooleanType.html | 248 -- .../io/delta/standalone/types/ByteType.html | 288 --- .../io/delta/standalone/types/DataType.html | 383 --- .../io/delta/standalone/types/DateType.html | 249 -- .../delta/standalone/types/DecimalType.html | 381 --- .../io/delta/standalone/types/DoubleType.html | 248 -- .../types/FieldMetadata.Builder.html | 441 ---- .../delta/standalone/types/FieldMetadata.html | 368 --- .../io/delta/standalone/types/FloatType.html | 248 -- .../delta/standalone/types/IntegerType.html | 288 --- .../io/delta/standalone/types/LongType.html | 288 --- .../io/delta/standalone/types/MapType.html | 364 --- .../io/delta/standalone/types/NullType.html | 248 -- .../io/delta/standalone/types/ShortType.html | 288 --- .../io/delta/standalone/types/StringType.html | 248 -- .../delta/standalone/types/StructField.html | 416 --- .../io/delta/standalone/types/StructType.html | 559 ---- .../delta/standalone/types/TimestampType.html | 248 -- .../delta/standalone/types/package-frame.html | 39 - .../standalone/types/package-summary.html | 257 -- .../delta/standalone/types/package-tree.html | 157 -- ...aConverter.ParquetOutputTimestampType.html | 365 --- .../util/ParquetSchemaConverter.html | 417 --- .../delta/standalone/util/package-frame.html | 24 - .../standalone/util/package-summary.html | 159 -- .../delta/standalone/util/package-tree.html | 147 -- .../api/java/overview-frame.html | 28 - .../api/java/overview-summary.html | 161 -- .../api/java/overview-tree.html | 289 --- .../delta-standalone/api/java/package-list | 8 - .../0.4.0/delta-standalone/api/java/script.js | 30 - .../api/java/serialized-form.html | 170 -- .../delta-standalone/api/java/stylesheet.css | 574 ----- .../api/java/allclasses-frame.html | 20 - .../api/java/allclasses-noframe.html | 20 - .../delta-flink/api/java/constant-values.html | 120 - .../delta-flink/api/java/deprecated-list.html | 120 - .../0.4.1/delta-flink/api/java/help-doc.html | 217 -- .../0.4.1/delta-flink/api/java/index-all.html | 187 -- .../0.4.1/delta-flink/api/java/index.html | 72 - .../java/io/delta/flink/sink/DeltaSink.html | 307 --- .../flink/sink/RowDataDeltaSinkBuilder.html | 358 --- .../io/delta/flink/sink/package-frame.html | 21 - .../io/delta/flink/sink/package-summary.html | 147 -- .../io/delta/flink/sink/package-tree.html | 134 - .../delta-flink/api/java/overview-tree.html | 138 - .../0.4.1/delta-flink/api/java/package-list | 1 - .../docs/0.4.1/delta-flink/api/java/script.js | 30 - .../0.4.1/delta-flink/api/java/stylesheet.css | 574 ----- .../api/java/allclasses-frame.html | 96 - .../api/java/allclasses-noframe.html | 96 - .../api/java/constant-values.html | 277 -- .../api/java/deprecated-list.html | 146 -- .../delta-standalone/api/java/help-doc.html | 223 -- .../delta-standalone/api/java/index-all.html | 1531 ----------- .../delta-standalone/api/java/index.html | 75 - .../io/delta/standalone/CommitResult.html | 274 -- .../java/io/delta/standalone/DeltaLog.html | 472 ---- .../java/io/delta/standalone/DeltaScan.html | 294 --- .../delta/standalone/Operation.Metrics.html | 683 ----- .../io/delta/standalone/Operation.Name.html | 589 ----- .../java/io/delta/standalone/Operation.html | 442 ---- .../standalone/OptimisticTransaction.html | 388 --- .../java/io/delta/standalone/Snapshot.html | 320 --- .../java/io/delta/standalone/VersionLog.html | 296 --- .../io/delta/standalone/actions/Action.html | 189 -- .../delta/standalone/actions/AddCDCFile.html | 371 --- .../standalone/actions/AddFile.Builder.html | 317 --- .../io/delta/standalone/actions/AddFile.html | 581 ----- .../actions/CommitInfo.Builder.html | 481 ---- .../delta/standalone/actions/CommitInfo.html | 706 ------ .../delta/standalone/actions/FileAction.html | 252 -- .../io/delta/standalone/actions/Format.html | 344 --- .../standalone/actions/JobInfo.Builder.html | 335 --- .../io/delta/standalone/actions/JobInfo.html | 402 --- .../standalone/actions/Metadata.Builder.html | 408 --- .../io/delta/standalone/actions/Metadata.html | 530 ---- .../standalone/actions/NotebookInfo.html | 304 --- .../io/delta/standalone/actions/Protocol.html | 345 --- .../delta/standalone/actions/RemoveFile.html | 471 ---- .../standalone/actions/SetTransaction.html | 327 --- .../standalone/actions/package-frame.html | 38 - .../standalone/actions/package-summary.html | 244 -- .../standalone/actions/package-tree.html | 156 -- .../standalone/data/CloseableIterator.html | 200 -- .../io/delta/standalone/data/RowRecord.html | 682 ----- .../delta/standalone/data/package-frame.html | 21 - .../standalone/data/package-summary.html | 148 -- .../delta/standalone/data/package-tree.html | 145 -- .../exceptions/ConcurrentAppendException.html | 276 -- .../ConcurrentDeleteDeleteException.html | 276 -- .../ConcurrentDeleteReadException.html | 276 -- .../ConcurrentTransactionException.html | 276 -- .../DeltaConcurrentModificationException.html | 275 -- .../exceptions/DeltaStandaloneException.html | 292 --- .../exceptions/MetadataChangedException.html | 277 -- .../exceptions/ProtocolChangedException.html | 276 -- .../standalone/exceptions/package-frame.html | 27 - .../exceptions/package-summary.html | 185 -- .../standalone/exceptions/package-tree.html | 161 -- .../io/delta/standalone/expressions/And.html | 319 --- .../expressions/BinaryComparison.html | 244 -- .../expressions/BinaryExpression.html | 340 --- .../expressions/BinaryOperator.html | 274 -- .../delta/standalone/expressions/Column.html | 406 --- .../delta/standalone/expressions/EqualTo.html | 286 --- .../standalone/expressions/Expression.html | 304 --- .../standalone/expressions/GreaterThan.html | 286 --- .../expressions/GreaterThanOrEqual.html | 286 --- .../io/delta/standalone/expressions/In.html | 360 --- .../standalone/expressions/IsNotNull.html | 332 --- .../delta/standalone/expressions/IsNull.html | 332 --- .../expressions/LeafExpression.html | 311 --- .../standalone/expressions/LessThan.html | 286 --- .../expressions/LessThanOrEqual.html | 286 --- .../delta/standalone/expressions/Literal.html | 617 ----- .../io/delta/standalone/expressions/Not.html | 324 --- .../io/delta/standalone/expressions/Or.html | 319 --- .../standalone/expressions/Predicate.html | 242 -- .../expressions/UnaryExpression.html | 327 --- .../standalone/expressions/package-frame.html | 42 - .../expressions/package-summary.html | 269 -- .../standalone/expressions/package-tree.html | 175 -- .../io/delta/standalone/package-frame.html | 34 - .../io/delta/standalone/package-summary.html | 215 -- .../io/delta/standalone/package-tree.html | 157 -- .../io/delta/standalone/storage/LogStore.html | 478 ---- .../standalone/storage/package-frame.html | 20 - .../standalone/storage/package-summary.html | 142 -- .../standalone/storage/package-tree.html | 135 - .../io/delta/standalone/types/ArrayType.html | 344 --- .../io/delta/standalone/types/BinaryType.html | 248 -- .../delta/standalone/types/BooleanType.html | 248 -- .../io/delta/standalone/types/ByteType.html | 288 --- .../io/delta/standalone/types/DataType.html | 383 --- .../io/delta/standalone/types/DateType.html | 249 -- .../delta/standalone/types/DecimalType.html | 381 --- .../io/delta/standalone/types/DoubleType.html | 248 -- .../types/FieldMetadata.Builder.html | 441 ---- .../delta/standalone/types/FieldMetadata.html | 368 --- .../io/delta/standalone/types/FloatType.html | 248 -- .../delta/standalone/types/IntegerType.html | 288 --- .../io/delta/standalone/types/LongType.html | 288 --- .../io/delta/standalone/types/MapType.html | 364 --- .../io/delta/standalone/types/NullType.html | 248 -- .../io/delta/standalone/types/ShortType.html | 288 --- .../io/delta/standalone/types/StringType.html | 248 -- .../delta/standalone/types/StructField.html | 416 --- .../io/delta/standalone/types/StructType.html | 559 ---- .../delta/standalone/types/TimestampType.html | 248 -- .../delta/standalone/types/package-frame.html | 39 - .../standalone/types/package-summary.html | 257 -- .../delta/standalone/types/package-tree.html | 157 -- ...aConverter.ParquetOutputTimestampType.html | 365 --- .../util/ParquetSchemaConverter.html | 417 --- .../delta/standalone/util/package-frame.html | 24 - .../standalone/util/package-summary.html | 159 -- .../delta/standalone/util/package-tree.html | 147 -- .../api/java/overview-frame.html | 28 - .../api/java/overview-summary.html | 161 -- .../api/java/overview-tree.html | 289 --- .../delta-standalone/api/java/package-list | 8 - .../0.4.1/delta-standalone/api/java/script.js | 30 - .../api/java/serialized-form.html | 170 -- .../delta-standalone/api/java/stylesheet.css | 574 ----- .../api/java/allclasses-frame.html | 23 - .../api/java/allclasses-noframe.html | 23 - .../delta-flink/api/java/constant-values.html | 122 - .../delta-flink/api/java/deprecated-list.html | 122 - .../0.5.0/delta-flink/api/java/help-doc.html | 223 -- .../0.5.0/delta-flink/api/java/index-all.html | 339 --- .../0.5.0/delta-flink/api/java/index.html | 75 - .../java/io/delta/flink/sink/DeltaSink.html | 309 --- .../flink/sink/RowDataDeltaSinkBuilder.html | 358 --- .../io/delta/flink/sink/package-frame.html | 21 - .../io/delta/flink/sink/package-summary.html | 149 -- .../io/delta/flink/sink/package-tree.html | 140 - .../io/delta/flink/source/DeltaSource.html | 366 --- .../RowDataBoundedDeltaSourceBuilder.html | 454 ---- .../RowDataContinuousDeltaSourceBuilder.html | 557 ---- .../io/delta/flink/source/package-frame.html | 22 - .../delta/flink/source/package-summary.html | 156 -- .../io/delta/flink/source/package-tree.html | 141 -- .../delta-flink/api/java/overview-frame.html | 22 - .../api/java/overview-summary.html | 137 - .../delta-flink/api/java/overview-tree.html | 144 -- .../0.5.0/delta-flink/api/java/package-list | 2 - .../docs/0.5.0/delta-flink/api/java/script.js | 30 - .../0.5.0/delta-flink/api/java/stylesheet.css | 574 ----- .../api/java/allclasses-frame.html | 95 - .../api/java/allclasses-noframe.html | 95 - .../api/java/constant-values.html | 277 -- .../api/java/deprecated-list.html | 146 -- .../delta-standalone/api/java/help-doc.html | 223 -- .../delta-standalone/api/java/index-all.html | 1513 ----------- .../delta-standalone/api/java/index.html | 75 - .../io/delta/standalone/CommitResult.html | 274 -- .../java/io/delta/standalone/DeltaLog.html | 542 ---- .../java/io/delta/standalone/DeltaScan.html | 294 --- .../delta/standalone/Operation.Metrics.html | 683 ----- .../io/delta/standalone/Operation.Name.html | 589 ----- .../java/io/delta/standalone/Operation.html | 442 ---- .../standalone/OptimisticTransaction.html | 388 --- .../java/io/delta/standalone/Snapshot.html | 320 --- .../java/io/delta/standalone/VersionLog.html | 315 --- .../io/delta/standalone/actions/Action.html | 189 -- .../delta/standalone/actions/AddCDCFile.html | 371 --- .../standalone/actions/AddFile.Builder.html | 317 --- .../io/delta/standalone/actions/AddFile.html | 581 ----- .../actions/CommitInfo.Builder.html | 481 ---- .../delta/standalone/actions/CommitInfo.html | 706 ------ .../delta/standalone/actions/FileAction.html | 252 -- .../io/delta/standalone/actions/Format.html | 344 --- .../standalone/actions/JobInfo.Builder.html | 335 --- .../io/delta/standalone/actions/JobInfo.html | 402 --- .../standalone/actions/Metadata.Builder.html | 408 --- .../io/delta/standalone/actions/Metadata.html | 530 ---- .../standalone/actions/NotebookInfo.html | 304 --- .../io/delta/standalone/actions/Protocol.html | 345 --- .../delta/standalone/actions/RemoveFile.html | 471 ---- .../standalone/actions/SetTransaction.html | 327 --- .../standalone/actions/package-frame.html | 38 - .../standalone/actions/package-summary.html | 244 -- .../standalone/actions/package-tree.html | 156 -- .../standalone/data/CloseableIterator.html | 200 -- .../io/delta/standalone/data/RowRecord.html | 682 ----- .../delta/standalone/data/package-frame.html | 21 - .../standalone/data/package-summary.html | 148 -- .../delta/standalone/data/package-tree.html | 145 -- .../exceptions/ConcurrentAppendException.html | 276 -- .../ConcurrentDeleteDeleteException.html | 276 -- .../ConcurrentDeleteReadException.html | 276 -- .../ConcurrentTransactionException.html | 276 -- .../DeltaConcurrentModificationException.html | 275 -- .../exceptions/DeltaStandaloneException.html | 292 --- .../exceptions/MetadataChangedException.html | 277 -- .../exceptions/ProtocolChangedException.html | 276 -- .../standalone/exceptions/package-frame.html | 27 - .../exceptions/package-summary.html | 185 -- .../standalone/exceptions/package-tree.html | 161 -- .../io/delta/standalone/expressions/And.html | 319 --- .../expressions/BinaryComparison.html | 244 -- .../expressions/BinaryExpression.html | 340 --- .../expressions/BinaryOperator.html | 274 -- .../delta/standalone/expressions/Column.html | 406 --- .../delta/standalone/expressions/EqualTo.html | 286 --- .../standalone/expressions/Expression.html | 304 --- .../standalone/expressions/GreaterThan.html | 286 --- .../expressions/GreaterThanOrEqual.html | 286 --- .../io/delta/standalone/expressions/In.html | 360 --- .../standalone/expressions/IsNotNull.html | 332 --- .../delta/standalone/expressions/IsNull.html | 332 --- .../expressions/LeafExpression.html | 311 --- .../standalone/expressions/LessThan.html | 286 --- .../expressions/LessThanOrEqual.html | 286 --- .../delta/standalone/expressions/Literal.html | 617 ----- .../io/delta/standalone/expressions/Not.html | 324 --- .../io/delta/standalone/expressions/Or.html | 319 --- .../standalone/expressions/Predicate.html | 242 -- .../expressions/UnaryExpression.html | 327 --- .../standalone/expressions/package-frame.html | 42 - .../expressions/package-summary.html | 269 -- .../standalone/expressions/package-tree.html | 175 -- .../io/delta/standalone/package-frame.html | 34 - .../io/delta/standalone/package-summary.html | 215 -- .../io/delta/standalone/package-tree.html | 157 -- .../io/delta/standalone/types/ArrayType.html | 344 --- .../io/delta/standalone/types/BinaryType.html | 248 -- .../delta/standalone/types/BooleanType.html | 248 -- .../io/delta/standalone/types/ByteType.html | 288 --- .../io/delta/standalone/types/DataType.html | 405 --- .../io/delta/standalone/types/DateType.html | 249 -- .../delta/standalone/types/DecimalType.html | 381 --- .../io/delta/standalone/types/DoubleType.html | 248 -- .../types/FieldMetadata.Builder.html | 441 ---- .../delta/standalone/types/FieldMetadata.html | 368 --- .../io/delta/standalone/types/FloatType.html | 248 -- .../delta/standalone/types/IntegerType.html | 288 --- .../io/delta/standalone/types/LongType.html | 288 --- .../io/delta/standalone/types/MapType.html | 364 --- .../io/delta/standalone/types/NullType.html | 248 -- .../io/delta/standalone/types/ShortType.html | 288 --- .../io/delta/standalone/types/StringType.html | 248 -- .../delta/standalone/types/StructField.html | 416 --- .../io/delta/standalone/types/StructType.html | 559 ---- .../delta/standalone/types/TimestampType.html | 248 -- .../delta/standalone/types/package-frame.html | 39 - .../standalone/types/package-summary.html | 257 -- .../delta/standalone/types/package-tree.html | 157 -- ...aConverter.ParquetOutputTimestampType.html | 365 --- .../util/ParquetSchemaConverter.html | 417 --- .../delta/standalone/util/package-frame.html | 24 - .../standalone/util/package-summary.html | 159 -- .../delta/standalone/util/package-tree.html | 147 -- .../api/java/overview-frame.html | 27 - .../api/java/overview-summary.html | 157 -- .../api/java/overview-tree.html | 287 --- .../delta-standalone/api/java/package-list | 7 - .../0.5.0/delta-standalone/api/java/script.js | 30 - .../api/java/serialized-form.html | 170 -- .../delta-standalone/api/java/stylesheet.css | 574 ----- .../api/java/allclasses-frame.html | 23 - .../api/java/allclasses-noframe.html | 23 - .../delta-flink/api/java/constant-values.html | 122 - .../delta-flink/api/java/deprecated-list.html | 122 - .../0.6.0/delta-flink/api/java/help-doc.html | 223 -- .../0.6.0/delta-flink/api/java/index-all.html | 355 --- .../0.6.0/delta-flink/api/java/index.html | 75 - .../java/io/delta/flink/sink/DeltaSink.html | 309 --- .../flink/sink/RowDataDeltaSinkBuilder.html | 430 ---- .../io/delta/flink/sink/package-frame.html | 21 - .../io/delta/flink/sink/package-summary.html | 149 -- .../io/delta/flink/sink/package-tree.html | 140 - .../io/delta/flink/source/DeltaSource.html | 366 --- .../RowDataBoundedDeltaSourceBuilder.html | 454 ---- .../RowDataContinuousDeltaSourceBuilder.html | 557 ---- .../io/delta/flink/source/package-frame.html | 22 - .../delta/flink/source/package-summary.html | 156 -- .../io/delta/flink/source/package-tree.html | 141 -- .../delta-flink/api/java/overview-frame.html | 22 - .../api/java/overview-summary.html | 137 - .../delta-flink/api/java/overview-tree.html | 144 -- .../0.6.0/delta-flink/api/java/package-list | 2 - .../docs/0.6.0/delta-flink/api/java/script.js | 30 - .../0.6.0/delta-flink/api/java/stylesheet.css | 574 ----- .../api/java/allclasses-frame.html | 95 - .../api/java/allclasses-noframe.html | 95 - .../api/java/constant-values.html | 277 -- .../api/java/deprecated-list.html | 146 -- .../delta-standalone/api/java/help-doc.html | 223 -- .../delta-standalone/api/java/index-all.html | 1519 ----------- .../delta-standalone/api/java/index.html | 75 - .../io/delta/standalone/CommitResult.html | 274 -- .../java/io/delta/standalone/DeltaLog.html | 542 ---- .../java/io/delta/standalone/DeltaScan.html | 294 --- .../delta/standalone/Operation.Metrics.html | 683 ----- .../io/delta/standalone/Operation.Name.html | 589 ----- .../java/io/delta/standalone/Operation.html | 442 ---- .../standalone/OptimisticTransaction.html | 405 --- .../java/io/delta/standalone/Snapshot.html | 320 --- .../java/io/delta/standalone/VersionLog.html | 315 --- .../io/delta/standalone/actions/Action.html | 189 -- .../delta/standalone/actions/AddCDCFile.html | 371 --- .../standalone/actions/AddFile.Builder.html | 317 --- .../io/delta/standalone/actions/AddFile.html | 581 ----- .../actions/CommitInfo.Builder.html | 481 ---- .../delta/standalone/actions/CommitInfo.html | 706 ------ .../delta/standalone/actions/FileAction.html | 252 -- .../io/delta/standalone/actions/Format.html | 344 --- .../standalone/actions/JobInfo.Builder.html | 335 --- .../io/delta/standalone/actions/JobInfo.html | 402 --- .../standalone/actions/Metadata.Builder.html | 408 --- .../io/delta/standalone/actions/Metadata.html | 530 ---- .../standalone/actions/NotebookInfo.html | 304 --- .../io/delta/standalone/actions/Protocol.html | 345 --- .../delta/standalone/actions/RemoveFile.html | 471 ---- .../standalone/actions/SetTransaction.html | 327 --- .../standalone/actions/package-frame.html | 38 - .../standalone/actions/package-summary.html | 244 -- .../standalone/actions/package-tree.html | 156 -- .../standalone/data/CloseableIterator.html | 200 -- .../io/delta/standalone/data/RowRecord.html | 682 ----- .../delta/standalone/data/package-frame.html | 21 - .../standalone/data/package-summary.html | 148 -- .../delta/standalone/data/package-tree.html | 145 -- .../exceptions/ConcurrentAppendException.html | 276 -- .../ConcurrentDeleteDeleteException.html | 276 -- .../ConcurrentDeleteReadException.html | 276 -- .../ConcurrentTransactionException.html | 276 -- .../DeltaConcurrentModificationException.html | 275 -- .../exceptions/DeltaStandaloneException.html | 292 --- .../exceptions/MetadataChangedException.html | 277 -- .../exceptions/ProtocolChangedException.html | 276 -- .../standalone/exceptions/package-frame.html | 27 - .../exceptions/package-summary.html | 185 -- .../standalone/exceptions/package-tree.html | 161 -- .../io/delta/standalone/expressions/And.html | 319 --- .../expressions/BinaryComparison.html | 244 -- .../expressions/BinaryExpression.html | 340 --- .../expressions/BinaryOperator.html | 274 -- .../delta/standalone/expressions/Column.html | 406 --- .../delta/standalone/expressions/EqualTo.html | 286 --- .../standalone/expressions/Expression.html | 304 --- .../standalone/expressions/GreaterThan.html | 286 --- .../expressions/GreaterThanOrEqual.html | 286 --- .../io/delta/standalone/expressions/In.html | 360 --- .../standalone/expressions/IsNotNull.html | 332 --- .../delta/standalone/expressions/IsNull.html | 332 --- .../expressions/LeafExpression.html | 311 --- .../standalone/expressions/LessThan.html | 286 --- .../expressions/LessThanOrEqual.html | 286 --- .../delta/standalone/expressions/Literal.html | 617 ----- .../io/delta/standalone/expressions/Not.html | 324 --- .../io/delta/standalone/expressions/Or.html | 319 --- .../standalone/expressions/Predicate.html | 242 -- .../expressions/UnaryExpression.html | 327 --- .../standalone/expressions/package-frame.html | 42 - .../expressions/package-summary.html | 269 -- .../standalone/expressions/package-tree.html | 175 -- .../io/delta/standalone/package-frame.html | 34 - .../io/delta/standalone/package-summary.html | 215 -- .../io/delta/standalone/package-tree.html | 157 -- .../io/delta/standalone/types/ArrayType.html | 344 --- .../io/delta/standalone/types/BinaryType.html | 248 -- .../delta/standalone/types/BooleanType.html | 248 -- .../io/delta/standalone/types/ByteType.html | 288 --- .../io/delta/standalone/types/DataType.html | 418 --- .../io/delta/standalone/types/DateType.html | 249 -- .../delta/standalone/types/DecimalType.html | 398 --- .../io/delta/standalone/types/DoubleType.html | 248 -- .../types/FieldMetadata.Builder.html | 441 ---- .../delta/standalone/types/FieldMetadata.html | 368 --- .../io/delta/standalone/types/FloatType.html | 248 -- .../delta/standalone/types/IntegerType.html | 288 --- .../io/delta/standalone/types/LongType.html | 288 --- .../io/delta/standalone/types/MapType.html | 364 --- .../io/delta/standalone/types/NullType.html | 248 -- .../io/delta/standalone/types/ShortType.html | 288 --- .../io/delta/standalone/types/StringType.html | 248 -- .../delta/standalone/types/StructField.html | 416 --- .../io/delta/standalone/types/StructType.html | 559 ---- .../delta/standalone/types/TimestampType.html | 248 -- .../delta/standalone/types/package-frame.html | 39 - .../standalone/types/package-summary.html | 257 -- .../delta/standalone/types/package-tree.html | 157 -- ...aConverter.ParquetOutputTimestampType.html | 365 --- .../util/ParquetSchemaConverter.html | 417 --- .../delta/standalone/util/package-frame.html | 24 - .../standalone/util/package-summary.html | 159 -- .../delta/standalone/util/package-tree.html | 147 -- .../api/java/overview-frame.html | 27 - .../api/java/overview-summary.html | 157 -- .../api/java/overview-tree.html | 287 --- .../delta-standalone/api/java/package-list | 7 - .../0.6.0/delta-standalone/api/java/script.js | 30 - .../api/java/serialized-form.html | 170 -- .../delta-standalone/api/java/stylesheet.css | 574 ----- .../api/java/allclasses-frame.html | 23 - .../api/java/allclasses-noframe.html | 23 - .../delta-flink/api/java/constant-values.html | 122 - .../delta-flink/api/java/deprecated-list.html | 122 - .../latest/delta-flink/api/java/help-doc.html | 223 -- .../delta-flink/api/java/index-all.html | 355 --- .../latest/delta-flink/api/java/index.html | 75 - .../java/io/delta/flink/sink/DeltaSink.html | 309 --- .../flink/sink/RowDataDeltaSinkBuilder.html | 430 ---- .../io/delta/flink/sink/package-frame.html | 21 - .../io/delta/flink/sink/package-summary.html | 149 -- .../io/delta/flink/sink/package-tree.html | 140 - .../io/delta/flink/source/DeltaSource.html | 366 --- .../RowDataBoundedDeltaSourceBuilder.html | 454 ---- .../RowDataContinuousDeltaSourceBuilder.html | 557 ---- .../io/delta/flink/source/package-frame.html | 22 - .../delta/flink/source/package-summary.html | 156 -- .../io/delta/flink/source/package-tree.html | 141 -- .../delta-flink/api/java/overview-frame.html | 22 - .../api/java/overview-summary.html | 137 - .../delta-flink/api/java/overview-tree.html | 144 -- .../latest/delta-flink/api/java/package-list | 2 - .../latest/delta-flink/api/java/script.js | 30 - .../delta-flink/api/java/stylesheet.css | 574 ----- .../api/java/allclasses-frame.html | 95 - .../api/java/allclasses-noframe.html | 95 - .../api/java/constant-values.html | 277 -- .../api/java/deprecated-list.html | 146 -- .../delta-standalone/api/java/help-doc.html | 223 -- .../delta-standalone/api/java/index-all.html | 1519 ----------- .../delta-standalone/api/java/index.html | 75 - .../io/delta/standalone/CommitResult.html | 274 -- .../java/io/delta/standalone/DeltaLog.html | 542 ---- .../java/io/delta/standalone/DeltaScan.html | 294 --- .../delta/standalone/Operation.Metrics.html | 683 ----- .../io/delta/standalone/Operation.Name.html | 589 ----- .../java/io/delta/standalone/Operation.html | 442 ---- .../standalone/OptimisticTransaction.html | 405 --- .../java/io/delta/standalone/Snapshot.html | 320 --- .../java/io/delta/standalone/VersionLog.html | 315 --- .../io/delta/standalone/actions/Action.html | 189 -- .../delta/standalone/actions/AddCDCFile.html | 371 --- .../standalone/actions/AddFile.Builder.html | 317 --- .../io/delta/standalone/actions/AddFile.html | 581 ----- .../actions/CommitInfo.Builder.html | 481 ---- .../delta/standalone/actions/CommitInfo.html | 706 ------ .../delta/standalone/actions/FileAction.html | 252 -- .../io/delta/standalone/actions/Format.html | 344 --- .../standalone/actions/JobInfo.Builder.html | 335 --- .../io/delta/standalone/actions/JobInfo.html | 402 --- .../standalone/actions/Metadata.Builder.html | 408 --- .../io/delta/standalone/actions/Metadata.html | 530 ---- .../standalone/actions/NotebookInfo.html | 304 --- .../io/delta/standalone/actions/Protocol.html | 345 --- .../delta/standalone/actions/RemoveFile.html | 471 ---- .../standalone/actions/SetTransaction.html | 327 --- .../standalone/actions/package-frame.html | 38 - .../standalone/actions/package-summary.html | 244 -- .../standalone/actions/package-tree.html | 156 -- .../standalone/data/CloseableIterator.html | 200 -- .../io/delta/standalone/data/RowRecord.html | 682 ----- .../delta/standalone/data/package-frame.html | 21 - .../standalone/data/package-summary.html | 148 -- .../delta/standalone/data/package-tree.html | 145 -- .../exceptions/ConcurrentAppendException.html | 276 -- .../ConcurrentDeleteDeleteException.html | 276 -- .../ConcurrentDeleteReadException.html | 276 -- .../ConcurrentTransactionException.html | 276 -- .../DeltaConcurrentModificationException.html | 275 -- .../exceptions/DeltaStandaloneException.html | 292 --- .../exceptions/MetadataChangedException.html | 277 -- .../exceptions/ProtocolChangedException.html | 276 -- .../standalone/exceptions/package-frame.html | 27 - .../exceptions/package-summary.html | 185 -- .../standalone/exceptions/package-tree.html | 161 -- .../io/delta/standalone/expressions/And.html | 319 --- .../expressions/BinaryComparison.html | 244 -- .../expressions/BinaryExpression.html | 340 --- .../expressions/BinaryOperator.html | 274 -- .../delta/standalone/expressions/Column.html | 406 --- .../delta/standalone/expressions/EqualTo.html | 286 --- .../standalone/expressions/Expression.html | 304 --- .../standalone/expressions/GreaterThan.html | 286 --- .../expressions/GreaterThanOrEqual.html | 286 --- .../io/delta/standalone/expressions/In.html | 360 --- .../standalone/expressions/IsNotNull.html | 332 --- .../delta/standalone/expressions/IsNull.html | 332 --- .../expressions/LeafExpression.html | 311 --- .../standalone/expressions/LessThan.html | 286 --- .../expressions/LessThanOrEqual.html | 286 --- .../delta/standalone/expressions/Literal.html | 617 ----- .../io/delta/standalone/expressions/Not.html | 324 --- .../io/delta/standalone/expressions/Or.html | 319 --- .../standalone/expressions/Predicate.html | 242 -- .../expressions/UnaryExpression.html | 327 --- .../standalone/expressions/package-frame.html | 42 - .../expressions/package-summary.html | 269 -- .../standalone/expressions/package-tree.html | 175 -- .../io/delta/standalone/package-frame.html | 34 - .../io/delta/standalone/package-summary.html | 215 -- .../io/delta/standalone/package-tree.html | 157 -- .../io/delta/standalone/types/ArrayType.html | 344 --- .../io/delta/standalone/types/BinaryType.html | 248 -- .../delta/standalone/types/BooleanType.html | 248 -- .../io/delta/standalone/types/ByteType.html | 288 --- .../io/delta/standalone/types/DataType.html | 418 --- .../io/delta/standalone/types/DateType.html | 249 -- .../delta/standalone/types/DecimalType.html | 398 --- .../io/delta/standalone/types/DoubleType.html | 248 -- .../types/FieldMetadata.Builder.html | 441 ---- .../delta/standalone/types/FieldMetadata.html | 368 --- .../io/delta/standalone/types/FloatType.html | 248 -- .../delta/standalone/types/IntegerType.html | 288 --- .../io/delta/standalone/types/LongType.html | 288 --- .../io/delta/standalone/types/MapType.html | 364 --- .../io/delta/standalone/types/NullType.html | 248 -- .../io/delta/standalone/types/ShortType.html | 288 --- .../io/delta/standalone/types/StringType.html | 248 -- .../delta/standalone/types/StructField.html | 416 --- .../io/delta/standalone/types/StructType.html | 559 ---- .../delta/standalone/types/TimestampType.html | 248 -- .../delta/standalone/types/package-frame.html | 39 - .../standalone/types/package-summary.html | 257 -- .../delta/standalone/types/package-tree.html | 157 -- ...aConverter.ParquetOutputTimestampType.html | 365 --- .../util/ParquetSchemaConverter.html | 417 --- .../delta/standalone/util/package-frame.html | 24 - .../standalone/util/package-summary.html | 159 -- .../delta/standalone/util/package-tree.html | 147 -- .../api/java/overview-frame.html | 27 - .../api/java/overview-summary.html | 157 -- .../api/java/overview-tree.html | 287 --- .../delta-standalone/api/java/package-list | 7 - .../delta-standalone/api/java/script.js | 30 - .../api/java/serialized-form.html | 170 -- .../delta-standalone/api/java/stylesheet.css | 574 ----- connectors/examples/build.sbt | 87 - connectors/examples/build/sbt | 183 -- connectors/examples/build/sbt-launch-lib.bash | 189 -- connectors/examples/convert-to-delta/pom.xml | 60 - .../src/main/java/example/ConvertToDelta.java | 199 -- .../resources/external/sales/._SUCCESS.crc | Bin 8 -> 0 bytes ...-86a4-d1f07a3570c1-c000.snappy.parquet.crc | Bin 2504 -> 0 bytes ...-8e20-41dc771a1b47-c000.snappy.parquet.crc | Bin 2500 -> 0 bytes ...-bdb6-9f8bd1a9d154-c000.snappy.parquet.crc | Bin 2500 -> 0 bytes .../main/resources/external/sales/_SUCCESS | 0 ...44c9-86a4-d1f07a3570c1-c000.snappy.parquet | Bin 319296 -> 0 bytes ...425f-8e20-41dc771a1b47-c000.snappy.parquet | Bin 318646 -> 0 bytes ...4c35-bdb6-9f8bd1a9d154-c000.snappy.parquet | Bin 318922 -> 0 bytes .../src/main/resources/generateParquet.py | 24 - connectors/examples/flink-example/README.md | 173 -- connectors/examples/flink-example/pom.xml | 186 -- .../org/example/sink/DeltaSinkExample.java | 78 - .../example/sink/DeltaSinkExampleCluster.java | 79 - .../DeltaSinkPartitionedTableExample.java | 79 - .../DeltaBoundedSourceClusterExample.java | 65 - .../bounded/DeltaBoundedSourceExample.java | 64 - .../DeltaBoundedSourceUserColumnsExample.java | 79 - .../DeltaBoundedSourceVersionAsOfExample.java | 69 - .../DeltaContinuousSourceClusterExample.java | 68 - .../DeltaContinuousSourceExample.java | 66 - ...ontinuousSourceStartingVersionExample.java | 72 - ...ltaContinuousSourceUserColumnsExample.java | 81 - ...mingApiDeltaSourceToTableDeltaSinkJob.java | 83 - .../sql/insert/InsertTableExample.java | 52 - .../bounded/SelectBoundedTableExample.java | 44 - .../SelectBoundedTableVersionAsOfExample.java | 45 - .../SelectContinuousTableExample.java | 44 - ...ContinuousTableStartingVersionExample.java | 48 - .../src/main/java/org/utils/ConsoleSink.java | 38 - .../org/utils/DeltaExampleSourceFunction.java | 66 - .../java/org/utils/DeltaTableUpdater.java | 108 - .../src/main/java/org/utils/Descriptor.java | 51 - .../src/main/java/org/utils/Utils.java | 128 - .../src/main/java/org/utils/ValueVisitor.java | 199 -- .../org/utils/job/DeltaExampleJobRunner.java | 23 - .../utils/job/DeltaExampleLocalJobRunner.java | 52 - .../job/DeltaSinkClusterJobExampleBase.java | 20 - .../job/DeltaSinkLocalJobExampleBase.java | 36 - ...ltaBoundedSourceClusterJobExampleBase.java | 22 - ...DeltaBoundedSourceLocalJobExampleBase.java | 23 - ...ContinuousSourceClusterJobExampleBase.java | 27 - ...taContinuousSourceLocalJobExampleBase.java | 25 - .../job/sql/BoundedSqlSourceExampleBase.java | 36 - .../sql/ContinuousSqlSourceExampleBase.java | 37 - .../org/utils/job/sql/RowMapperFunction.java | 28 - .../org/utils/job/sql/SqlExampleBase.java | 43 - .../org/utils/job/sql/SqlSinkExampleBase.java | 16 - .../assets/images/flink-cluster-job.png | Bin 148337 -> 0 bytes .../assets/images/source-pipeline-logs.png | Bin 283306 -> 0 bytes .../assets/images/source-pipeline.png | Bin 51010 -> 0 bytes .../data/source_table_no_partitions/README.md | 11 - ...0000000000000000010.checkpoint.parquet.crc | Bin 116 -> 0 bytes ...0000000000000000020.checkpoint.parquet.crc | Bin 120 -> 0 bytes .../_delta_log/00000000000000000000.json | 4 - .../_delta_log/00000000000000000001.json | 2 - .../_delta_log/00000000000000000002.json | 2 - .../_delta_log/00000000000000000003.json | 2 - .../_delta_log/00000000000000000004.json | 2 - .../_delta_log/00000000000000000005.json | 2 - .../_delta_log/00000000000000000006.json | 2 - .../_delta_log/00000000000000000007.json | 2 - .../_delta_log/00000000000000000008.json | 2 - .../_delta_log/00000000000000000009.json | 2 - .../00000000000000000010.checkpoint.parquet | Bin 13705 -> 0 bytes .../_delta_log/00000000000000000010.json | 2 - .../_delta_log/00000000000000000011.json | 2 - .../_delta_log/00000000000000000012.json | 2 - .../_delta_log/00000000000000000013.json | 2 - .../_delta_log/00000000000000000014.json | 2 - .../_delta_log/00000000000000000015.json | 2 - .../_delta_log/00000000000000000016.json | 2 - .../_delta_log/00000000000000000017.json | 2 - .../_delta_log/00000000000000000018.json | 2 - .../_delta_log/00000000000000000019.json | 2 - .../00000000000000000020.checkpoint.parquet | Bin 14153 -> 0 bytes .../_delta_log/00000000000000000020.json | 2 - .../_delta_log/00000000000000000021.json | 2 - .../_delta_log/00000000000000000022.json | 2 - .../_delta_log/00000000000000000023.json | 2 - .../_delta_log/00000000000000000024.json | 2 - .../_delta_log/_last_checkpoint | 1 - ...4adf-91e2-fd32bfead83d-c000.snappy.parquet | Bin 889 -> 0 bytes ...42ad-918c-f567e937ebf2-c000.snappy.parquet | Bin 907 -> 0 bytes ...4cec-913e-703038cfe308-c000.snappy.parquet | Bin 889 -> 0 bytes ...4683-bae0-eb6e6d066e5a-c000.snappy.parquet | Bin 907 -> 0 bytes ...4236-8a14-c8233059a51e-c000.snappy.parquet | Bin 889 -> 0 bytes ...4c4c-8a77-9d8984c7b0b0-c000.snappy.parquet | Bin 907 -> 0 bytes ...4cb3-ae85-563eef3e7cab-c000.snappy.parquet | Bin 907 -> 0 bytes ...4e02-a945-ab0ed0c7de5c-c000.snappy.parquet | Bin 889 -> 0 bytes ...4f61-854d-3f31eb753dad-c000.snappy.parquet | Bin 907 -> 0 bytes ...4387-b4f5-78b953787ec5-c000.snappy.parquet | Bin 889 -> 0 bytes ...4c39-95b0-c0d4ee6a9b2a-c000.snappy.parquet | Bin 889 -> 0 bytes ...4dbe-aea5-3c0614b6a8db-c000.snappy.parquet | Bin 907 -> 0 bytes ...4c4d-a740-e162ccbf1a16-c000.snappy.parquet | Bin 907 -> 0 bytes ...4709-a3bb-27aaf276111e-c000.snappy.parquet | Bin 889 -> 0 bytes ...4ffd-9cd7-c7c224a2846a-c000.snappy.parquet | Bin 907 -> 0 bytes ...402d-90ae-7e3e4e1541b8-c000.snappy.parquet | Bin 907 -> 0 bytes ...4acb-85b6-3c2c2976e1c2-c000.snappy.parquet | Bin 907 -> 0 bytes ...40be-950b-190c9ac38dd0-c000.snappy.parquet | Bin 907 -> 0 bytes ...4446-8b32-5786af31b659-c000.snappy.parquet | Bin 907 -> 0 bytes ...41bc-b6ff-a69043e0439f-c000.snappy.parquet | Bin 907 -> 0 bytes ...49ec-bbe5-e601ad50990b-c000.snappy.parquet | Bin 907 -> 0 bytes ...4871-8dcf-7fc92bceef90-c000.snappy.parquet | Bin 889 -> 0 bytes ...429d-8ce5-b8e556b1a2cf-c000.snappy.parquet | Bin 907 -> 0 bytes ...4237-92ec-4131dba27fa2-c000.snappy.parquet | Bin 889 -> 0 bytes ...4714-8525-8a7df5b1a2f4-c000.snappy.parquet | Bin 889 -> 0 bytes .../src/main/resources/log4j2.properties | 37 - connectors/examples/hello-world/pom.xml | 60 - .../src/main/java/example/HelloWorld.java | 126 - connectors/examples/project/build.properties | 36 - connectors/examples/run_examples.py | 153 -- connectors/examples/run_flink_examples.sh | 80 - .../tests/OSSCompatibilitySuite.scala | 450 ---- .../tests/OssCompatibilitySuiteBase.scala | 202 -- .../internal/util/ComparisonUtil.scala | 171 -- .../standalone/internal/util/OSSUtil.scala | 110 - .../internal/util/StandaloneUtil.scala | 83 - connectors/powerbi/.gitignore | 2 - .../powerbi/CustomConnector/DeltaLake.mez | Bin 29785 -> 0 bytes .../powerbi/CustomConnector/DeltaLake.sln | 25 - .../CustomConnector/DeltaLake/DeltaLake.mproj | 118 - .../CustomConnector/DeltaLake/DeltaLake.pq | 705 ------ .../DeltaLake/DeltaLake.query.pq | 5 - .../CustomConnector/DeltaLake/DeltaLake16.png | Bin 767 -> 0 bytes .../CustomConnector/DeltaLake/DeltaLake20.png | Bin 947 -> 0 bytes .../CustomConnector/DeltaLake/DeltaLake24.png | Bin 1219 -> 0 bytes .../CustomConnector/DeltaLake/DeltaLake32.png | Bin 1582 -> 0 bytes .../CustomConnector/DeltaLake/DeltaLake40.png | Bin 2058 -> 0 bytes .../CustomConnector/DeltaLake/DeltaLake48.png | Bin 2539 -> 0 bytes .../CustomConnector/DeltaLake/DeltaLake64.png | Bin 3594 -> 0 bytes .../CustomConnector/DeltaLake/DeltaLake80.png | Bin 4899 -> 0 bytes .../CustomConnector/DeltaLake/resources.resx | 129 - .../.pbi/editorSettings.json | 4 - .../definition.pbidataset | 4 - .../PowerBI_Delta.Dataset/diagramLayout.json | 59 - .../PowerBI_Delta.Dataset/item.config.json | 4 - .../PowerBI_Delta.Dataset/item.metadata.json | 4 - .../powerbi/PowerBI_Delta.Dataset/model.bim | 2243 ----------------- .../SharedResources/BaseThemes/CY20SU09.json | 522 ---- .../datasetDiagramLayout.json | 287 --- .../PowerBI_Delta.Report/definition.pbir | 9 - .../PowerBI_Delta.Report/item.config.json | 4 - .../PowerBI_Delta.Report/item.metadata.json | 4 - .../powerbi/PowerBI_Delta.Report/report.json | 60 - connectors/powerbi/PowerBI_Delta.pbip | 13 - connectors/powerbi/README.md | 209 -- connectors/powerbi/fn_ReadDeltaTable.pq | 376 --- connectors/scalastyle-config.xml | 423 ---- connectors/sql-delta-import/readme.md | 89 - .../src/main/scala/DataTransforms.scala | 33 - .../src/main/scala/ImportRunner.scala | 70 - .../src/main/scala/JDBCImport.scala | 126 - .../src/test/scala/ImportTest.scala | 152 -- .../util/ParquetSchemaConverter.java | 130 - .../util/ParquetSchemaConverter.scala | 340 --- .../io/delta/standalone/CommitResult.java | 35 - .../java/io/delta/standalone/DeltaLog.java | 178 -- .../java/io/delta/standalone/DeltaScan.java | 67 - .../java/io/delta/standalone/Operation.java | 338 --- .../standalone/OptimisticTransaction.java | 130 - .../java/io/delta/standalone/Snapshot.java | 70 - .../java/io/delta/standalone/VersionLog.java | 85 - .../io/delta/standalone/actions/Action.java | 38 - .../delta/standalone/actions/AddCDCFile.java | 93 - .../io/delta/standalone/actions/AddFile.java | 246 -- .../delta/standalone/actions/CommitInfo.java | 385 --- .../delta/standalone/actions/FileAction.java | 35 - .../io/delta/standalone/actions/Format.java | 71 - .../io/delta/standalone/actions/JobInfo.java | 135 - .../io/delta/standalone/actions/Metadata.java | 272 -- .../standalone/actions/NotebookInfo.java | 45 - .../io/delta/standalone/actions/Protocol.java | 72 - .../delta/standalone/actions/RemoveFile.java | 168 -- .../standalone/actions/SetTransaction.java | 69 - .../standalone/data/CloseableIterator.java | 26 - .../io/delta/standalone/data/RowRecord.java | 239 -- .../exceptions/ConcurrentAppendException.java | 26 - .../ConcurrentDeleteDeleteException.java | 26 - .../ConcurrentDeleteReadException.java | 26 - .../ConcurrentTransactionException.java | 26 - .../DeltaConcurrentModificationException.java | 28 - .../exceptions/DeltaStandaloneException.java | 34 - .../exceptions/MetadataChangedException.java | 27 - .../exceptions/ProtocolChangedException.java | 26 - .../io/delta/standalone/expressions/And.java | 29 - .../expressions/BinaryComparison.java | 25 - .../expressions/BinaryExpression.java | 77 - .../expressions/BinaryOperator.java | 27 - .../delta/standalone/expressions/Column.java | 100 - .../delta/standalone/expressions/EqualTo.java | 16 - .../standalone/expressions/Expression.java | 60 - .../standalone/expressions/GreaterThan.java | 31 - .../expressions/GreaterThanOrEqual.java | 15 - .../io/delta/standalone/expressions/In.java | 113 - .../standalone/expressions/IsNotNull.java | 22 - .../delta/standalone/expressions/IsNull.java | 20 - .../expressions/LeafExpression.java | 27 - .../standalone/expressions/LessThan.java | 15 - .../expressions/LessThanOrEqual.java | 15 - .../delta/standalone/expressions/Literal.java | 159 -- .../io/delta/standalone/expressions/Not.java | 31 - .../io/delta/standalone/expressions/Or.java | 29 - .../standalone/expressions/Predicate.java | 14 - .../expressions/UnaryExpression.java | 71 - .../expressions/CastingComparator.java | 17 - .../standalone/internal/expressions/Util.java | 75 - .../io/delta/standalone/types/ArrayType.java | 101 - .../io/delta/standalone/types/BinaryType.java | 44 - .../delta/standalone/types/BooleanType.java | 44 - .../io/delta/standalone/types/ByteType.java | 49 - .../io/delta/standalone/types/DataType.java | 140 - .../io/delta/standalone/types/DateType.java | 45 - .../delta/standalone/types/DecimalType.java | 95 - .../io/delta/standalone/types/DoubleType.java | 44 - .../delta/standalone/types/FieldMetadata.java | 193 -- .../io/delta/standalone/types/FloatType.java | 44 - .../delta/standalone/types/IntegerType.java | 49 - .../io/delta/standalone/types/LongType.java | 49 - .../io/delta/standalone/types/MapType.java | 113 - .../io/delta/standalone/types/NullType.java | 44 - .../io/delta/standalone/types/ShortType.java | 49 - .../io/delta/standalone/types/StringType.java | 44 - .../delta/standalone/types/StructField.java | 135 - .../io/delta/standalone/types/StructType.java | 224 -- .../delta/standalone/types/TimestampType.java | 44 - .../internal/util/CaseInsensitiveMap.scala | 63 - .../internal/util/CaseInsensitiveMap.scala | 63 - .../internal/util/CaseInsensitiveMap.scala | 66 - .../BufferingLogDeletionIterator.scala | 166 -- .../standalone/internal/Checkpoints.scala | 343 --- .../standalone/internal/ConflictChecker.scala | 268 -- .../standalone/internal/DeltaConfig.scala | 253 -- .../internal/DeltaHistoryManager.scala | 252 -- .../standalone/internal/DeltaLogImpl.scala | 265 -- .../internal/MemoryOptimizedVersionLog.scala | 79 - .../standalone/internal/MetadataCleanup.scala | 97 - .../internal/OptimisticTransactionImpl.scala | 574 ----- .../standalone/internal/SnapshotImpl.scala | 436 ---- .../internal/SnapshotManagement.scala | 328 --- .../internal/actions/InMemoryLogReplay.scala | 94 - .../actions/MemoryOptimizedLogReplay.scala | 143 -- .../standalone/internal/actions/actions.scala | 459 ---- .../data/CloseableParquetDataIterator.scala | 180 -- .../internal/data/PartitionRowRecord.scala | 176 -- .../internal/data/RowParquetRecordImpl.scala | 340 --- .../internal/exception/DeltaErrors.scala | 360 --- .../standalone/internal/isolationLevels.scala | 25 - .../standalone/internal/logging/Logging.scala | 71 - .../internal/scan/DeltaScanImpl.scala | 167 -- .../internal/scan/FilteredDeltaScanImpl.scala | 81 - .../sources/StandaloneHadoopConf.scala | 55 - .../internal/storage/AzureLogStore.scala | 51 - .../internal/storage/DelegatingLogStore.scala | 135 - .../internal/storage/HDFSLogStore.scala | 136 - .../storage/HadoopFileSystemLogStore.scala | 120 - .../storage/LineCloseableIterator.scala | 74 - .../internal/storage/LocalLogStore.scala | 61 - .../internal/storage/LogStoreProvider.scala | 131 - .../storage/S3SingleDriverLogStore.scala | 246 -- .../internal/util/CalendarInterval.scala | 40 - .../standalone/internal/util/Clock.scala | 100 - .../internal/util/ConversionUtils.scala | 330 --- .../internal/util/DataTypeParser.scala | 230 -- .../internal/util/DateTimeConstants.scala | 48 - .../internal/util/DeltaFileOperations.scala | 77 - .../standalone/internal/util/FileNames.scala | 108 - .../standalone/internal/util/Implicits.scala | 61 - .../internal/util/IntervalUtils.scala | 302 --- .../standalone/internal/util/JsonUtils.scala | 51 - .../internal/util/ManualClock.scala | 70 - .../internal/util/PartitionUtils.scala | 101 - .../internal/util/SchemaMergingUtils.scala | 91 - .../internal/util/SchemaUtils.scala | 203 -- .../src/test/resources/log4j.properties | 48 - .../internal/ActionBuildersSuite.scala | 224 -- ...arkPartitionFilterRecordCachingSuite.scala | 130 - .../BufferingLogDeletionIteratorSuite.scala | 239 -- .../internal/ConversionUtilsSuite.scala | 74 - .../internal/DelegatingLogStoreSuite.scala | 89 - .../internal/DeltaConfigSuite.scala | 108 - .../internal/DeltaDataReaderSuite.scala | 470 ---- .../standalone/internal/DeltaLogSuite.scala | 849 ------- .../internal/DeltaRetentionSuite.scala | 240 -- .../internal/DeltaRetentionSuiteBase.scala | 70 - .../standalone/internal/DeltaScanSuite.scala | 205 -- .../internal/DeltaTimeTravelSuite.scala | 228 -- .../standalone/internal/ExpressionSuite.scala | 597 ----- .../internal/LogStoreProviderSuite.scala | 198 -- .../standalone/internal/LogStoreSuite.scala | 277 -- .../OptimisticTransactionLegacySuite.scala | 775 ------ .../internal/OptimisticTransactionSuite.scala | 353 --- .../OptimisticTransactionSuiteBase.scala | 151 -- .../OptimisticTransactionSuiteTestVals.scala | 53 - .../internal/SchemaUtilsSuite.scala | 399 --- .../standalone/internal/VersionLogSuite.scala | 148 -- .../internal/util/FakeFileSystem.scala | 54 - .../internal/util/GoldenTableUtils.scala | 103 - .../standalone/internal/util/TestUtils.scala | 50 - .../ParquetSchemaConverterSuite.scala | 305 --- .../standalone/internal/ShadedJarSuite.scala | 91 - 1149 files changed, 6 insertions(+), 265835 deletions(-) delete mode 100644 .github/workflows/connectors_test.yaml delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/allclasses-frame.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/allclasses-noframe.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/constant-values.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/deprecated-list.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/help-doc.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/index-all.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/index.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/package-frame.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/package-summary.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/package-tree.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/overview-frame.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/overview-summary.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/overview-tree.html delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/package-list delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/script.js delete mode 100644 connectors/docs/0.2.0/delta-standalone/api/java/stylesheet.css delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/allclasses-frame.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/allclasses-noframe.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/constant-values.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/deprecated-list.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/help-doc.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/index-all.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/index.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Operation.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/package-frame.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/package-summary.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/package-tree.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/LogStore.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/package-frame.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/package-summary.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/package-tree.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/overview-frame.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/overview-summary.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/overview-tree.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/package-list delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/script.js delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/serialized-form.html delete mode 100644 connectors/docs/0.3.0/delta-standalone/api/java/stylesheet.css delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/allclasses-frame.html delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/allclasses-noframe.html delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/constant-values.html delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/deprecated-list.html delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/help-doc.html delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/index-all.html delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/index.html delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/package-frame.html delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/package-summary.html delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/package-tree.html delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/overview-tree.html delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/package-list delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/script.js delete mode 100644 connectors/docs/0.4.0/delta-flink/api/java/stylesheet.css delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/allclasses-frame.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/allclasses-noframe.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/constant-values.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/deprecated-list.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/help-doc.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/index-all.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/index.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Operation.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/package-frame.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/package-summary.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/package-tree.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/LogStore.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/package-frame.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/package-summary.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/package-tree.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/overview-frame.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/overview-summary.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/overview-tree.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/package-list delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/script.js delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/serialized-form.html delete mode 100644 connectors/docs/0.4.0/delta-standalone/api/java/stylesheet.css delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/allclasses-frame.html delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/allclasses-noframe.html delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/constant-values.html delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/deprecated-list.html delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/help-doc.html delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/index-all.html delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/index.html delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/package-frame.html delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/package-summary.html delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/package-tree.html delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/overview-tree.html delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/package-list delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/script.js delete mode 100644 connectors/docs/0.4.1/delta-flink/api/java/stylesheet.css delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/allclasses-frame.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/allclasses-noframe.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/constant-values.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/deprecated-list.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/help-doc.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/index-all.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/index.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/CommitResult.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/DeltaLog.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/DeltaScan.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Operation.Name.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Operation.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Snapshot.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/VersionLog.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Action.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Format.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/package-frame.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/package-summary.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/package-tree.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/And.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Column.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/In.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Not.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Or.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/package-frame.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/package-summary.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/package-tree.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/LogStore.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/package-frame.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/package-summary.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/package-tree.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/ByteType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DataType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DateType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/FloatType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/LongType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/MapType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/NullType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/ShortType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/StringType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/StructField.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/StructType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/package-frame.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/package-summary.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/package-tree.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/package-frame.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/package-summary.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/package-tree.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/overview-frame.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/overview-summary.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/overview-tree.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/package-list delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/script.js delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/serialized-form.html delete mode 100644 connectors/docs/0.4.1/delta-standalone/api/java/stylesheet.css delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/allclasses-frame.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/allclasses-noframe.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/constant-values.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/deprecated-list.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/help-doc.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/index-all.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/index.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/package-frame.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/package-summary.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/package-tree.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/DeltaSource.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/RowDataBoundedDeltaSourceBuilder.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/RowDataContinuousDeltaSourceBuilder.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/package-frame.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/package-summary.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/package-tree.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/overview-frame.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/overview-summary.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/overview-tree.html delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/package-list delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/script.js delete mode 100644 connectors/docs/0.5.0/delta-flink/api/java/stylesheet.css delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/allclasses-frame.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/allclasses-noframe.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/constant-values.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/deprecated-list.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/help-doc.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/index-all.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/index.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Operation.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/package-frame.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/package-summary.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/package-tree.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/overview-frame.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/overview-summary.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/overview-tree.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/package-list delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/script.js delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/serialized-form.html delete mode 100644 connectors/docs/0.5.0/delta-standalone/api/java/stylesheet.css delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/allclasses-frame.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/allclasses-noframe.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/constant-values.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/deprecated-list.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/help-doc.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/index-all.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/index.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/package-frame.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/package-summary.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/package-tree.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/DeltaSource.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/RowDataBoundedDeltaSourceBuilder.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/RowDataContinuousDeltaSourceBuilder.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/package-frame.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/package-summary.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/package-tree.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/overview-frame.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/overview-summary.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/overview-tree.html delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/package-list delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/script.js delete mode 100644 connectors/docs/0.6.0/delta-flink/api/java/stylesheet.css delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/allclasses-frame.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/allclasses-noframe.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/constant-values.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/deprecated-list.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/help-doc.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/index-all.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/index.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Operation.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/package-frame.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/package-summary.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/package-tree.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/overview-frame.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/overview-summary.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/overview-tree.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/package-list delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/script.js delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/serialized-form.html delete mode 100644 connectors/docs/0.6.0/delta-standalone/api/java/stylesheet.css delete mode 100644 connectors/docs/latest/delta-flink/api/java/allclasses-frame.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/allclasses-noframe.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/constant-values.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/deprecated-list.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/help-doc.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/index-all.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/index.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/package-frame.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/package-summary.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/package-tree.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/DeltaSource.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/RowDataBoundedDeltaSourceBuilder.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/RowDataContinuousDeltaSourceBuilder.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/package-frame.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/package-summary.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/package-tree.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/overview-frame.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/overview-summary.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/overview-tree.html delete mode 100644 connectors/docs/latest/delta-flink/api/java/package-list delete mode 100644 connectors/docs/latest/delta-flink/api/java/script.js delete mode 100644 connectors/docs/latest/delta-flink/api/java/stylesheet.css delete mode 100644 connectors/docs/latest/delta-standalone/api/java/allclasses-frame.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/allclasses-noframe.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/constant-values.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/deprecated-list.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/help-doc.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/index-all.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/index.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/CommitResult.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/DeltaLog.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/DeltaScan.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Operation.Name.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Operation.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Snapshot.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/VersionLog.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Action.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Format.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/package-frame.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/package-summary.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/package-tree.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/And.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Column.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/In.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Not.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Or.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/package-frame.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/package-summary.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/package-tree.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/ByteType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DataType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DateType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/FloatType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/LongType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/MapType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/NullType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/ShortType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/StringType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/StructField.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/StructType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/package-frame.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/package-summary.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/package-tree.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/package-frame.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/package-summary.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/package-tree.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/overview-frame.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/overview-summary.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/overview-tree.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/package-list delete mode 100644 connectors/docs/latest/delta-standalone/api/java/script.js delete mode 100644 connectors/docs/latest/delta-standalone/api/java/serialized-form.html delete mode 100644 connectors/docs/latest/delta-standalone/api/java/stylesheet.css delete mode 100644 connectors/examples/build.sbt delete mode 100755 connectors/examples/build/sbt delete mode 100755 connectors/examples/build/sbt-launch-lib.bash delete mode 100644 connectors/examples/convert-to-delta/pom.xml delete mode 100644 connectors/examples/convert-to-delta/src/main/java/example/ConvertToDelta.java delete mode 100644 connectors/examples/convert-to-delta/src/main/resources/external/sales/._SUCCESS.crc delete mode 100644 connectors/examples/convert-to-delta/src/main/resources/external/sales/.part-00000-64c688b3-46cc-44c9-86a4-d1f07a3570c1-c000.snappy.parquet.crc delete mode 100644 connectors/examples/convert-to-delta/src/main/resources/external/sales/.part-00000-71b51e51-8746-425f-8e20-41dc771a1b47-c000.snappy.parquet.crc delete mode 100644 connectors/examples/convert-to-delta/src/main/resources/external/sales/.part-00000-c4f4550a-83d5-4c35-bdb6-9f8bd1a9d154-c000.snappy.parquet.crc delete mode 100644 connectors/examples/convert-to-delta/src/main/resources/external/sales/_SUCCESS delete mode 100644 connectors/examples/convert-to-delta/src/main/resources/external/sales/part-00000-64c688b3-46cc-44c9-86a4-d1f07a3570c1-c000.snappy.parquet delete mode 100644 connectors/examples/convert-to-delta/src/main/resources/external/sales/part-00000-71b51e51-8746-425f-8e20-41dc771a1b47-c000.snappy.parquet delete mode 100644 connectors/examples/convert-to-delta/src/main/resources/external/sales/part-00000-c4f4550a-83d5-4c35-bdb6-9f8bd1a9d154-c000.snappy.parquet delete mode 100644 connectors/examples/convert-to-delta/src/main/resources/generateParquet.py delete mode 100644 connectors/examples/flink-example/README.md delete mode 100644 connectors/examples/flink-example/pom.xml delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/sink/DeltaSinkExample.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/sink/DeltaSinkExampleCluster.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/sink/DeltaSinkPartitionedTableExample.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceClusterExample.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceExample.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceUserColumnsExample.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceVersionAsOfExample.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceClusterExample.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceExample.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceStartingVersionExample.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceUserColumnsExample.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/sql/StreamingApiDeltaSourceToTableDeltaSinkJob.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/sql/insert/InsertTableExample.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/sql/select/bounded/SelectBoundedTableExample.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/sql/select/bounded/SelectBoundedTableVersionAsOfExample.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/sql/select/continuous/SelectContinuousTableExample.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/example/sql/select/continuous/SelectContinuousTableStartingVersionExample.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/ConsoleSink.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/DeltaExampleSourceFunction.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/DeltaTableUpdater.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/Descriptor.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/Utils.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/ValueVisitor.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/job/DeltaExampleJobRunner.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/job/DeltaExampleLocalJobRunner.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/job/DeltaSinkClusterJobExampleBase.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/job/DeltaSinkLocalJobExampleBase.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/job/bounded/DeltaBoundedSourceClusterJobExampleBase.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/job/bounded/DeltaBoundedSourceLocalJobExampleBase.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/job/continuous/DeltaContinuousSourceClusterJobExampleBase.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/job/continuous/DeltaContinuousSourceLocalJobExampleBase.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/job/sql/BoundedSqlSourceExampleBase.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/job/sql/ContinuousSqlSourceExampleBase.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/job/sql/RowMapperFunction.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/job/sql/SqlExampleBase.java delete mode 100644 connectors/examples/flink-example/src/main/java/org/utils/job/sql/SqlSinkExampleBase.java delete mode 100644 connectors/examples/flink-example/src/main/resources/assets/images/flink-cluster-job.png delete mode 100644 connectors/examples/flink-example/src/main/resources/assets/images/source-pipeline-logs.png delete mode 100644 connectors/examples/flink-example/src/main/resources/assets/images/source-pipeline.png delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/README.md delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/.00000000000000000010.checkpoint.parquet.crc delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/.00000000000000000020.checkpoint.parquet.crc delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000000.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000001.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000002.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000003.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000004.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000005.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000006.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000007.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000008.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000009.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000010.checkpoint.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000010.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000011.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000012.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000013.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000014.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000015.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000016.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000017.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000018.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000019.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000020.checkpoint.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000020.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000021.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000022.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000023.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000024.json delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/_last_checkpoint delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-04b07fe8-2e54-4adf-91e2-fd32bfead83d-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-1570eb1f-9e65-42ad-918c-f567e937ebf2-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-344c52be-d840-4cec-913e-703038cfe308-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-35403e15-bee5-4683-bae0-eb6e6d066e5a-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-412be677-a969-4236-8a14-c8233059a51e-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-460c4961-a5dc-4c4c-8a77-9d8984c7b0b0-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-4827706e-23f3-4cb3-ae85-563eef3e7cab-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-492b2978-4c5b-4e02-a945-ab0ed0c7de5c-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-4c690e4c-8e1b-4f61-854d-3f31eb753dad-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-501a544d-7549-4387-b4f5-78b953787ec5-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-70706ffb-aad6-4c39-95b0-c0d4ee6a9b2a-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-761b69af-b2b2-4dbe-aea5-3c0614b6a8db-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-761fc8e9-f2f8-4c4d-a740-e162ccbf1a16-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-8edb4e23-7c7e-4709-a3bb-27aaf276111e-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-9247e529-6180-4ffd-9cd7-c7c224a2846a-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-93fd1f92-a8e8-402d-90ae-7e3e4e1541b8-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-ac4b4595-f8d0-4acb-85b6-3c2c2976e1c2-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-c3bfc572-0904-40be-950b-190c9ac38dd0-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-c7a6b364-7b33-4446-8b32-5786af31b659-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-d3a6e587-1a5a-41bc-b6ff-a69043e0439f-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-dd103f91-a5b8-49ec-bbe5-e601ad50990b-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-dedb3701-e58e-4871-8dcf-7fc92bceef90-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-e4e4db35-0dcc-429d-8ce5-b8e556b1a2cf-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-fe14f78d-2af5-4237-92ec-4131dba27fa2-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-ff24642e-224c-4714-8525-8a7df5b1a2f4-c000.snappy.parquet delete mode 100644 connectors/examples/flink-example/src/main/resources/log4j2.properties delete mode 100644 connectors/examples/hello-world/pom.xml delete mode 100644 connectors/examples/hello-world/src/main/java/example/HelloWorld.java delete mode 100644 connectors/examples/project/build.properties delete mode 100644 connectors/examples/run_examples.py delete mode 100644 connectors/examples/run_flink_examples.sh delete mode 100644 connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/compatibility/tests/OSSCompatibilitySuite.scala delete mode 100644 connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/compatibility/tests/OssCompatibilitySuiteBase.scala delete mode 100644 connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/util/ComparisonUtil.scala delete mode 100644 connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/util/OSSUtil.scala delete mode 100644 connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/util/StandaloneUtil.scala delete mode 100644 connectors/powerbi/.gitignore delete mode 100644 connectors/powerbi/CustomConnector/DeltaLake.mez delete mode 100644 connectors/powerbi/CustomConnector/DeltaLake.sln delete mode 100644 connectors/powerbi/CustomConnector/DeltaLake/DeltaLake.mproj delete mode 100644 connectors/powerbi/CustomConnector/DeltaLake/DeltaLake.pq delete mode 100644 connectors/powerbi/CustomConnector/DeltaLake/DeltaLake.query.pq delete mode 100644 connectors/powerbi/CustomConnector/DeltaLake/DeltaLake16.png delete mode 100644 connectors/powerbi/CustomConnector/DeltaLake/DeltaLake20.png delete mode 100644 connectors/powerbi/CustomConnector/DeltaLake/DeltaLake24.png delete mode 100644 connectors/powerbi/CustomConnector/DeltaLake/DeltaLake32.png delete mode 100644 connectors/powerbi/CustomConnector/DeltaLake/DeltaLake40.png delete mode 100644 connectors/powerbi/CustomConnector/DeltaLake/DeltaLake48.png delete mode 100644 connectors/powerbi/CustomConnector/DeltaLake/DeltaLake64.png delete mode 100644 connectors/powerbi/CustomConnector/DeltaLake/DeltaLake80.png delete mode 100644 connectors/powerbi/CustomConnector/DeltaLake/resources.resx delete mode 100644 connectors/powerbi/PowerBI_Delta.Dataset/.pbi/editorSettings.json delete mode 100644 connectors/powerbi/PowerBI_Delta.Dataset/definition.pbidataset delete mode 100644 connectors/powerbi/PowerBI_Delta.Dataset/diagramLayout.json delete mode 100644 connectors/powerbi/PowerBI_Delta.Dataset/item.config.json delete mode 100644 connectors/powerbi/PowerBI_Delta.Dataset/item.metadata.json delete mode 100644 connectors/powerbi/PowerBI_Delta.Dataset/model.bim delete mode 100644 connectors/powerbi/PowerBI_Delta.Report/StaticResources/SharedResources/BaseThemes/CY20SU09.json delete mode 100644 connectors/powerbi/PowerBI_Delta.Report/datasetDiagramLayout.json delete mode 100644 connectors/powerbi/PowerBI_Delta.Report/definition.pbir delete mode 100644 connectors/powerbi/PowerBI_Delta.Report/item.config.json delete mode 100644 connectors/powerbi/PowerBI_Delta.Report/item.metadata.json delete mode 100644 connectors/powerbi/PowerBI_Delta.Report/report.json delete mode 100644 connectors/powerbi/PowerBI_Delta.pbip delete mode 100644 connectors/powerbi/README.md delete mode 100644 connectors/powerbi/fn_ReadDeltaTable.pq delete mode 100644 connectors/scalastyle-config.xml delete mode 100644 connectors/sql-delta-import/readme.md delete mode 100644 connectors/sql-delta-import/src/main/scala/DataTransforms.scala delete mode 100644 connectors/sql-delta-import/src/main/scala/ImportRunner.scala delete mode 100644 connectors/sql-delta-import/src/main/scala/JDBCImport.scala delete mode 100644 connectors/sql-delta-import/src/test/scala/ImportTest.scala delete mode 100644 connectors/standalone-parquet/src/main/java/io/delta/standalone/util/ParquetSchemaConverter.java delete mode 100644 connectors/standalone-parquet/src/main/scala/io/delta/standalone/internal/util/ParquetSchemaConverter.scala delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/CommitResult.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/DeltaLog.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/DeltaScan.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/Operation.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/OptimisticTransaction.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/Snapshot.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/VersionLog.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/actions/Action.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/actions/AddCDCFile.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/actions/AddFile.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/actions/CommitInfo.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/actions/FileAction.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/actions/Format.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/actions/JobInfo.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/actions/Metadata.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/actions/NotebookInfo.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/actions/Protocol.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/actions/RemoveFile.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/actions/SetTransaction.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/data/CloseableIterator.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/data/RowRecord.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentAppendException.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentTransactionException.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/exceptions/DeltaStandaloneException.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/exceptions/MetadataChangedException.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/exceptions/ProtocolChangedException.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/And.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/BinaryComparison.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/BinaryExpression.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/BinaryOperator.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/Column.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/EqualTo.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/Expression.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/GreaterThan.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/GreaterThanOrEqual.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/In.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/IsNotNull.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/IsNull.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/LeafExpression.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/LessThan.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/LessThanOrEqual.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/Literal.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/Not.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/Or.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/Predicate.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/expressions/UnaryExpression.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/internal/expressions/CastingComparator.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/internal/expressions/Util.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/ArrayType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/BinaryType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/BooleanType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/ByteType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/DataType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/DateType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/DecimalType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/DoubleType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/FieldMetadata.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/FloatType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/IntegerType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/LongType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/MapType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/NullType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/ShortType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/StringType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/StructField.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/StructType.java delete mode 100644 connectors/standalone/src/main/java/io/delta/standalone/types/TimestampType.java delete mode 100644 connectors/standalone/src/main/scala-2.11/io/delta/standalone/internal/util/CaseInsensitiveMap.scala delete mode 100644 connectors/standalone/src/main/scala-2.12/io/delta/standalone/internal/util/CaseInsensitiveMap.scala delete mode 100644 connectors/standalone/src/main/scala-2.13/io/delta/standalone/internal/util/CaseInsensitiveMap.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/BufferingLogDeletionIterator.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/Checkpoints.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/ConflictChecker.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/DeltaConfig.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/DeltaHistoryManager.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/DeltaLogImpl.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/MemoryOptimizedVersionLog.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/MetadataCleanup.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/OptimisticTransactionImpl.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/SnapshotImpl.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/SnapshotManagement.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/actions/InMemoryLogReplay.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/actions/MemoryOptimizedLogReplay.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/actions/actions.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/data/CloseableParquetDataIterator.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/data/PartitionRowRecord.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/data/RowParquetRecordImpl.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/exception/DeltaErrors.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/isolationLevels.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/logging/Logging.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/scan/DeltaScanImpl.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/scan/FilteredDeltaScanImpl.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/sources/StandaloneHadoopConf.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/AzureLogStore.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/DelegatingLogStore.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/HDFSLogStore.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/HadoopFileSystemLogStore.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/LineCloseableIterator.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/LocalLogStore.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/LogStoreProvider.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/S3SingleDriverLogStore.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/util/CalendarInterval.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/util/Clock.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/util/ConversionUtils.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/util/DataTypeParser.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/util/DateTimeConstants.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/util/DeltaFileOperations.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/util/FileNames.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/util/Implicits.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/util/IntervalUtils.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/util/JsonUtils.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/util/ManualClock.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/util/PartitionUtils.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/util/SchemaMergingUtils.scala delete mode 100644 connectors/standalone/src/main/scala/io/delta/standalone/internal/util/SchemaUtils.scala delete mode 100644 connectors/standalone/src/test/resources/log4j.properties delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/ActionBuildersSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/BenchmarkPartitionFilterRecordCachingSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/BufferingLogDeletionIteratorSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/ConversionUtilsSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/DelegatingLogStoreSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaConfigSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaDataReaderSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaLogSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaRetentionSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaRetentionSuiteBase.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaScanSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaTimeTravelSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/ExpressionSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/LogStoreProviderSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/LogStoreSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionLegacySuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionSuiteBase.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionSuiteTestVals.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/SchemaUtilsSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/VersionLogSuite.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/util/FakeFileSystem.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/util/GoldenTableUtils.scala delete mode 100644 connectors/standalone/src/test/scala/io/delta/standalone/internal/util/TestUtils.scala delete mode 100644 connectors/testParquetUtilsWithStandaloneCosmetic/src/test/scala/io/delta/standalone/ParquetSchemaConverterSuite.scala delete mode 100644 connectors/testStandaloneCosmetic/src/test/scala/io/delta/standalone/internal/ShadedJarSuite.scala diff --git a/.github/workflows/connectors_test.yaml b/.github/workflows/connectors_test.yaml deleted file mode 100644 index 4f8a0568a5e..00000000000 --- a/.github/workflows/connectors_test.yaml +++ /dev/null @@ -1,38 +0,0 @@ -name: "Delta Connectors" -on: [push, pull_request] -jobs: - build: - name: "DC: Scala ${{ matrix.scala }}" - runs-on: ubuntu-24.04 - strategy: - matrix: - # These Scala versions must match those in the build.sbt - scala: [2.13.16] - steps: - - uses: actions/checkout@v2 - - name: install java - uses: actions/setup-java@v2 - with: - distribution: 'zulu' - java-version: '11' - - name: Cache Scala, SBT - uses: actions/cache@v4 - with: - path: | - ~/.sbt - ~/.ivy2 - ~/.cache/coursier - ~/.m2 - key: build-cache-3-with-scala_${{ matrix.scala }} - - name: Run Scala Style tests on test sources (Scala 2.13 only) - run: build/sbt "++ ${{ matrix.scala }}" testScalastyle - if: startsWith(matrix.scala, '2.13.') - - name: Run sqlDeltaImport tests (Scala 2.12 and 2.13 only) - run: build/sbt "++ ${{ matrix.scala }}" sqlDeltaImport/test - if: ${{ !startsWith(matrix.scala, '2.11.') }} - # These tests are not working yet - # - name: Run Delta Standalone Compatibility tests (Scala 2.12 only) - # run: build/sbt "++ ${{ matrix.scala }}" compatibility/test - # if: startsWith(matrix.scala, '2.12.') - - name: Run Delta Standalone tests - run: build/sbt "++ ${{ matrix.scala }}" standalone/test testStandaloneCosmetic/test standaloneParquet/test testParquetUtilsWithStandaloneCosmetic/test diff --git a/build.sbt b/build.sbt index f5381b19344..71d933af0a4 100644 --- a/build.sbt +++ b/build.sbt @@ -1010,6 +1010,8 @@ lazy val storageS3DynamoDB = (project in file("storage-s3-dynamodb")) ) ).configureUnidoc() +/* +TODO: re-add iceberg on Spark 4.0+ val icebergSparkRuntimeArtifactName = { val (expMaj, expMin, _) = getMajorMinorPatch(defaultSparkVersion) s"iceberg-spark-runtime-$expMaj.$expMin" @@ -1165,6 +1167,7 @@ lazy val icebergShaded = (project in file("icebergShaded")) assembly / assemblyMergeStrategy := updateMergeStrategy((assembly / assemblyMergeStrategy).value), assemblyPackageScala / assembleArtifact := false, ) + */ lazy val hudi = (project in file("hudi")) .dependsOn(spark % "compile->compile;test->test;provided->provided") @@ -1218,240 +1221,6 @@ lazy val hudi = (project in file("hudi")) Compile / packageBin := assembly.value ) -/** - * We want to publish the `standalone` project's shaded JAR (created from the - * build/sbt standalone/assembly command). - * - * However, build/sbt standalone/publish and build/sbt standalone/publishLocal will use the - * non-shaded JAR from the build/sbt standalone/package command. - * - * So, we create an impostor, cosmetic project used only for publishing. - * - * build/sbt standalone/package - * - creates connectors/standalone/target/scala-2.12/delta-standalone-original-shaded_2.12-0.2.1-SNAPSHOT.jar - * (this is the shaded JAR we want) - * - * build/sbt standaloneCosmetic/publishM2 - * - packages the shaded JAR (above) and then produces: - * -- .m2/repository/io/delta/delta-standalone_2.12/0.2.1-SNAPSHOT/delta-standalone_2.12-0.2.1-SNAPSHOT.pom - * -- .m2/repository/io/delta/delta-standalone_2.12/0.2.1-SNAPSHOT/delta-standalone_2.12-0.2.1-SNAPSHOT.jar - * -- .m2/repository/io/delta/delta-standalone_2.12/0.2.1-SNAPSHOT/delta-standalone_2.12-0.2.1-SNAPSHOT-sources.jar - * -- .m2/repository/io/delta/delta-standalone_2.12/0.2.1-SNAPSHOT/delta-standalone_2.12-0.2.1-SNAPSHOT-javadoc.jar - */ -lazy val standaloneCosmetic = project - .dependsOn(storage) // this doesn't impact the output artifact (jar), only the pom.xml dependencies - .disablePlugins(JavaFormatterPlugin, ScalafmtPlugin) - .settings( - name := "delta-standalone", - commonSettings, - releaseSettings, - exportJars := true, - Compile / packageBin := (standaloneParquet / assembly).value, - Compile / packageSrc := (standalone / Compile / packageSrc).value, - libraryDependencies ++= scalaCollectionPar(scalaVersion.value) ++ Seq( - "org.apache.hadoop" % "hadoop-client" % hadoopVersion % "provided", - "org.apache.parquet" % "parquet-hadoop" % "1.12.3" % "provided", - // parquet4s-core dependencies that are not shaded are added with compile scope. - "com.chuusai" %% "shapeless" % "2.3.4", - "org.scala-lang.modules" %% "scala-collection-compat" % "2.4.3" - ) - ) - -lazy val testStandaloneCosmetic = (project in file("connectors/testStandaloneCosmetic")) - .dependsOn(standaloneCosmetic) - .dependsOn(goldenTables % "test") - .disablePlugins(JavaFormatterPlugin, ScalafmtPlugin) - .settings( - name := "test-standalone-cosmetic", - commonSettings, - skipReleaseSettings, - libraryDependencies ++= Seq( - "org.apache.hadoop" % "hadoop-client" % hadoopVersion, - "org.scalatest" %% "scalatest" % scalaTestVersionForConnectors % "test", - ) - ) - -/** - * A test project to verify `ParquetSchemaConverter` APIs are working after the user provides - * `parquet-hadoop`. We use a separate project because we want to test whether Delta Standlone APIs - * except `ParquetSchemaConverter` are working without `parquet-hadoop` in testStandaloneCosmetic`. - */ -lazy val testParquetUtilsWithStandaloneCosmetic = project.dependsOn(standaloneCosmetic) - .disablePlugins(JavaFormatterPlugin, ScalafmtPlugin) - .settings( - name := "test-parquet-utils-with-standalone-cosmetic", - commonSettings, - skipReleaseSettings, - libraryDependencies ++= Seq( - "org.apache.hadoop" % "hadoop-client" % hadoopVersion, - "org.apache.parquet" % "parquet-hadoop" % "1.12.3" % "provided", - "org.scalatest" %% "scalatest" % scalaTestVersionForConnectors % "test", - ) - ) - -def scalaCollectionPar(version: String) = version match { - case v if v.startsWith("2.13.") => - Seq("org.scala-lang.modules" %% "scala-parallel-collections" % "1.0.4") - case _ => Seq() -} - -/** - * The public API ParquetSchemaConverter exposes Parquet classes in its methods so we cannot apply - * shading rules on it. However, sbt-assembly doesn't allow excluding a single file. Hence, we - * create a separate project to skip the shading. - */ -lazy val standaloneParquet = (project in file("connectors/standalone-parquet")) - .disablePlugins(JavaFormatterPlugin, ScalafmtPlugin) - .dependsOn(standaloneWithoutParquetUtils) - .settings( - name := "delta-standalone-parquet", - commonSettings, - skipReleaseSettings, - libraryDependencies ++= Seq( - "org.apache.parquet" % "parquet-hadoop" % "1.12.3" % "provided", - "org.scalatest" %% "scalatest" % scalaTestVersionForConnectors % "test" - ), - assemblyPackageScala / assembleArtifact := false - ) - -/** A dummy project to allow `standaloneParquet` depending on the shaded standalone jar. */ -lazy val standaloneWithoutParquetUtils = project - .disablePlugins(JavaFormatterPlugin, ScalafmtPlugin) - .settings( - name := "delta-standalone-without-parquet-utils", - commonSettings, - skipReleaseSettings, - exportJars := true, - Compile / packageBin := (standalone / assembly).value - ) - -// TODO scalastyle settings -lazy val standalone = (project in file("connectors/standalone")) - .dependsOn(storage % "compile->compile;provided->provided") - .dependsOn(goldenTables % "test") - .disablePlugins(JavaFormatterPlugin, ScalafmtPlugin) - .settings( - name := "delta-standalone-original", - commonSettings, - skipReleaseSettings, - standaloneMimaSettings, - // When updating any dependency here, we should also review `pomPostProcess` in project - // `standaloneCosmetic` and update it accordingly. - libraryDependencies ++= scalaCollectionPar(scalaVersion.value) ++ Seq( - "org.apache.hadoop" % "hadoop-client" % hadoopVersion % "provided", - "com.github.mjakubowski84" %% "parquet4s-core" % parquet4sVersion excludeAll ( - ExclusionRule("org.slf4j", "slf4j-api") - ), - "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.12.3", - "org.json4s" %% "json4s-jackson" % "3.7.0-M11" excludeAll ( - ExclusionRule("com.fasterxml.jackson.core"), - ExclusionRule("com.fasterxml.jackson.module") - ), - "org.scalatest" %% "scalatest" % scalaTestVersionForConnectors % "test", - ), - Compile / sourceGenerators += Def.task { - val file = (Compile / sourceManaged).value / "io" / "delta" / "standalone" / "package.scala" - IO.write(file, - s"""package io.delta - | - |package object standalone { - | val VERSION = "${version.value}" - | val NAME = "Delta Standalone" - |} - |""".stripMargin) - Seq(file) - }, - - /** - * Standalone packaged (unshaded) jar. - * - * Build with `build/sbt standalone/package` command. - * e.g. connectors/standalone/target/scala-2.12/delta-standalone-original-unshaded_2.12-0.2.1-SNAPSHOT.jar - */ - artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) => - artifact.name + "-unshaded" + "_" + sv.binary + "-" + module.revision + "." + artifact.extension - }, - - /** - * Standalone assembly (shaded) jar. This is what we want to release. - * - * Build with `build/sbt standalone/assembly` command. - * e.g. connectors/standalone/target/scala-2.12/delta-standalone-original-shaded_2.12-0.2.1-SNAPSHOT.jar - */ - assembly / logLevel := Level.Info, - assembly / test := {}, - assembly / assemblyJarName := s"${name.value}-shaded_${scalaBinaryVersion.value}-${version.value}.jar", - // We exclude jars first, and then we shade what is remaining. Note: the input here is only - // `libraryDependencies` jars, not `.dependsOn(_)` jars. - assembly / assemblyExcludedJars := { - val cp = (assembly / fullClasspath).value - val allowedPrefixes = Set("META_INF", "io", "json4s", "jackson", "paranamer", - "parquet4s", "parquet-", "audience-annotations", "commons-pool") - cp.filter { f => - !allowedPrefixes.exists(prefix => f.data.getName.startsWith(prefix)) - } - }, - assembly / assemblyShadeRules := Seq( - ShadeRule.rename("com.fasterxml.jackson.**" -> "shadedelta.@0").inAll, - ShadeRule.rename("com.thoughtworks.paranamer.**" -> "shadedelta.@0").inAll, - ShadeRule.rename("org.json4s.**" -> "shadedelta.@0").inAll, - ShadeRule.rename("com.github.mjakubowski84.parquet4s.**" -> "shadedelta.@0").inAll, - ShadeRule.rename("org.apache.commons.pool.**" -> "shadedelta.@0").inAll, - ShadeRule.rename("org.apache.parquet.**" -> "shadedelta.@0").inAll, - ShadeRule.rename("shaded.parquet.**" -> "shadedelta.@0").inAll, - ShadeRule.rename("org.apache.yetus.audience.**" -> "shadedelta.@0").inAll - ), - assembly / assemblyMergeStrategy := { - // Discard `module-info.class` to fix the `different file contents found` error. - // TODO Upgrade SBT to 1.5 which will do this automatically - case "module-info.class" => MergeStrategy.discard - // Discard unused `parquet.thrift` so that we don't conflict the file used by the user - case "parquet.thrift" => MergeStrategy.discard - // Discard the jackson service configs that we don't need. These files are not shaded so - // adding them may conflict with other jackson version used by the user. - case PathList("META-INF", "services", xs @ _*) => MergeStrategy.discard - // This project `.dependsOn` delta-storage, and its classes will be included by default - // in this assembly jar. Manually discard them since it is already a compile-time dependency. - case PathList("io", "delta", "storage", xs @ _*) => MergeStrategy.discard - case x => - val oldStrategy = (assembly / assemblyMergeStrategy).value - oldStrategy(x) - }, - assembly / artifact := { - val art = (assembly / artifact).value - art.withClassifier(Some("assembly")) - }, - addArtifact(assembly / artifact, assembly), - - // Unidoc setting - unidocSourceFilePatterns += SourceFilePattern("io/delta/standalone/"), - javaCheckstyleSettings("dev/connectors-checkstyle.xml") - ).configureUnidoc() - - -/* -TODO (TD): Tests are failing for some reason -lazy val compatibility = (project in file("connectors/oss-compatibility-tests")) - // depend on standalone test codes as well - .dependsOn(standalone % "compile->compile;test->test") - .dependsOn(spark % "test -> compile") - .settings( - name := "compatibility", - commonSettings, - skipReleaseSettings, - libraryDependencies ++= Seq( - // Test Dependencies - "io.netty" % "netty-buffer" % "4.1.63.Final" % "test", - "org.scalatest" %% "scalatest" % "3.1.0" % "test", - "commons-io" % "commons-io" % "2.8.0" % "test", - "org.apache.spark" %% "spark-sql" % defaultSparkVersion % "test", - "org.apache.spark" %% "spark-catalyst" % defaultSparkVersion % "test" classifier "tests", - "org.apache.spark" %% "spark-core" % defaultSparkVersion % "test" classifier "tests", - "org.apache.spark" %% "spark-sql" % defaultSparkVersion % "test" classifier "tests", - ) - ) - */ - lazy val goldenTables = (project in file("connectors/golden-tables")) .disablePlugins(JavaFormatterPlugin, ScalafmtPlugin) .settings( @@ -1471,38 +1240,6 @@ lazy val goldenTables = (project in file("connectors/golden-tables")) ) ) -def sqlDeltaImportScalaVersion(scalaBinaryVersion: String): String = { - scalaBinaryVersion match { - // sqlDeltaImport doesn't support 2.11. We return 2.12 so that we can resolve the dependencies - // but we will not publish sqlDeltaImport with Scala 2.11. - case "2.11" => "2.12" - case _ => scalaBinaryVersion - } -} - -lazy val sqlDeltaImport = (project in file("connectors/sql-delta-import")) - .disablePlugins(JavaFormatterPlugin, ScalafmtPlugin) - .settings ( - name := "sql-delta-import", - commonSettings, - skipReleaseSettings, - publishArtifact := scalaBinaryVersion.value != "2.11", - Test / publishArtifact := false, - libraryDependencies ++= Seq( - // Using released delta-spark JAR instead of module dependency to break circular dependency - "io.delta" %% "delta-spark" % "3.3.2", - - "io.netty" % "netty-buffer" % "4.1.63.Final" % "test", - "org.apache.spark" % ("spark-sql_" + sqlDeltaImportScalaVersion(scalaBinaryVersion.value)) % defaultSparkVersion % "provided", - "org.rogach" %% "scallop" % "3.5.1", - "org.scalatest" %% "scalatest" % scalaTestVersionForConnectors % "test", - "com.h2database" % "h2" % "1.4.200" % "test", - "org.apache.spark" % ("spark-catalyst_" + sqlDeltaImportScalaVersion(scalaBinaryVersion.value)) % defaultSparkVersion % "test", - "org.apache.spark" % ("spark-core_" + sqlDeltaImportScalaVersion(scalaBinaryVersion.value)) % defaultSparkVersion % "test", - "org.apache.spark" % ("spark-sql_" + sqlDeltaImportScalaVersion(scalaBinaryVersion.value)) % defaultSparkVersion % "test" - ) - ) - /** * Get list of python files and return the mapping between source files and target paths * in the generated package JAR. @@ -1539,6 +1276,7 @@ lazy val sparkGroup = project publish / skip := false, ) +/* lazy val icebergGroup = project .aggregate(iceberg, testDeltaIcebergJar) .settings( @@ -1547,6 +1285,7 @@ lazy val icebergGroup = project publishArtifact := false, publish / skip := false, ) +*/ lazy val kernelGroup = project .aggregate(kernelApi, kernelDefaults, kernelBenchmarks) diff --git a/connectors/README.md b/connectors/README.md index 77c1156ade2..dd74b877ae1 100644 --- a/connectors/README.md +++ b/connectors/README.md @@ -1,24 +1 @@ -## Delta Standalone - -Delta Standalone, formerly known as the Delta Standalone Reader (DSR), is a JVM library to read **and write** Delta tables. Unlike https://github.com/delta-io/delta, this project doesn't use Spark to read or write tables and it has only a few transitive dependencies. It can be used by any application that cannot use a Spark cluster. -- To compile the project, run `build/sbt standalone/compile` -- To test the project, run `build/sbt standalone/test` -- To publish the JAR, run `build/sbt standaloneCosmetic/publishM2` - -See [Delta Standalone](https://docs.delta.io/latest/delta-standalone.html) for detailed documentation. - -## Hive Connector - -Read Delta tables directly from Apache Hive using the [Hive Connector](/hive/README.md). See the dedicated [README.md](/hive/README.md) for more details. - -## Flink/Delta Connector - -Use the [Flink/Delta Connector](flink/README.md) to read and write Delta tables from Apache Flink applications. The connector includes a sink for writing to Delta tables from Apache Flink, and a source for reading Delta tables using Apache Flink (still in progress.) See the dedicated [README.md](/flink/README.md) for more details. - -## sql-delta-import - -[sql-delta-import](/sql-delta-import/readme.md) allows for importing data from a JDBC source into a Delta table. - -## Power BI connector -The connector for [Microsoft Power BI](https://powerbi.microsoft.com/) is basically just a custom Power Query function that allows you to read a Delta table from any file-based [data source supported by Microsoft Power BI](https://docs.microsoft.com/en-us/power-bi/connect-data/desktop-data-sources). Details can be found in the dedicated [README.md](/powerbi/README.md). - +Connectors projects are no longer maintained in the `master` branch and new releases due to migration to the Delta Kernel project. Projects will continue to be supported in maintanence mode from the `spark-3.5-support` branch. diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/allclasses-frame.html b/connectors/docs/0.2.0/delta-standalone/api/java/allclasses-frame.html deleted file mode 100644 index c65c68fba35..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/allclasses-frame.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - -All Classes (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/allclasses-noframe.html b/connectors/docs/0.2.0/delta-standalone/api/java/allclasses-noframe.html deleted file mode 100644 index 5558c8da999..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/allclasses-noframe.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - -All Classes (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/constant-values.html b/connectors/docs/0.2.0/delta-standalone/api/java/constant-values.html deleted file mode 100644 index 84691b5a5ae..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/constant-values.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - -Constant Field Values (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Constant Field Values

-

Contents

-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/deprecated-list.html b/connectors/docs/0.2.0/delta-standalone/api/java/deprecated-list.html deleted file mode 100644 index a5b8fd4d9a4..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/deprecated-list.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - -Deprecated List (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Deprecated API

-

Contents

-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/help-doc.html b/connectors/docs/0.2.0/delta-standalone/api/java/help-doc.html deleted file mode 100644 index 5472a288ff1..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/help-doc.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - -API Help (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

How This API Document Is Organized

-
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
-
-
- -This help file applies to API documentation generated using the standard doclet.
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/index-all.html b/connectors/docs/0.2.0/delta-standalone/api/java/index-all.html deleted file mode 100644 index b9e778b127b..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/index-all.html +++ /dev/null @@ -1,677 +0,0 @@ - - - - - -Index (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
A B C D E F G H I J L M N O R S T U V  - - -

A

-
-
AddFile - Class in io.delta.standalone.actions
-
-
Represents an action that adds a new file to the table.
-
-
AddFile(String, Map<String, String>, long, long, boolean, String, Map<String, String>) - Constructor for class io.delta.standalone.actions.AddFile
-
 
-
ArrayType - Class in io.delta.standalone.types
-
-
The data type for collections of multiple values.
-
-
ArrayType(DataType, boolean) - Constructor for class io.delta.standalone.types.ArrayType
-
 
-
- - - -

B

-
-
BinaryType - Class in io.delta.standalone.types
-
-
The data type representing byte[] values.
-
-
BinaryType() - Constructor for class io.delta.standalone.types.BinaryType
-
 
-
BooleanType - Class in io.delta.standalone.types
-
-
The data type representing boolean values.
-
-
BooleanType() - Constructor for class io.delta.standalone.types.BooleanType
-
 
-
ByteType - Class in io.delta.standalone.types
-
-
The data type representing byte values.
-
-
ByteType() - Constructor for class io.delta.standalone.types.ByteType
-
 
-
- - - -

C

-
-
CloseableIterator<T> - Interface in io.delta.standalone.data
-
-
An Iterator that also need to implement the Closeable interface.
-
-
CommitInfo - Class in io.delta.standalone.actions
-
-
Holds provenance information about changes to the table.
-
-
CommitInfo(Optional<Long>, Timestamp, Optional<String>, Optional<String>, String, Map<String, String>, Optional<JobInfo>, Optional<NotebookInfo>, Optional<String>, Optional<Long>, Optional<String>, Optional<Boolean>, Optional<Map<String, String>>, Optional<String>) - Constructor for class io.delta.standalone.actions.CommitInfo
-
 
-
containsNull() - Method in class io.delta.standalone.types.ArrayType
-
 
-
- - - -

D

-
-
DataType - Class in io.delta.standalone.types
-
-
The base type of all io.delta.standalone data types.
-
-
DataType() - Constructor for class io.delta.standalone.types.DataType
-
 
-
DateType - Class in io.delta.standalone.types
-
-
A date type, supporting "0001-01-01" through "9999-12-31".
-
-
DateType() - Constructor for class io.delta.standalone.types.DateType
-
 
-
DecimalType - Class in io.delta.standalone.types
-
-
The data type representing java.math.BigDecimal values.
-
-
DecimalType(int, int) - Constructor for class io.delta.standalone.types.DecimalType
-
 
-
DeltaLog - Interface in io.delta.standalone
-
-
DeltaLog is the representation of the transaction logs of a Delta table.
-
-
DoubleType - Class in io.delta.standalone.types
-
-
The data type representing double values.
-
-
DoubleType() - Constructor for class io.delta.standalone.types.DoubleType
-
 
-
- - - -

E

-
-
equals(Object) - Method in class io.delta.standalone.actions.AddFile
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Format
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.JobInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Metadata
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.types.ArrayType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.DataType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.DecimalType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.MapType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.StructField
-
 
-
equals(Object) - Method in class io.delta.standalone.types.StructType
-
 
-
- - - -

F

-
-
FloatType - Class in io.delta.standalone.types
-
-
The data type representing float values.
-
-
FloatType() - Constructor for class io.delta.standalone.types.FloatType
-
 
-
Format - Class in io.delta.standalone.actions
-
-
A specification of the encoding for the files stored in a table.
-
-
Format(String, Map<String, String>) - Constructor for class io.delta.standalone.actions.Format
-
 
-
forTable(Configuration, String) - Static method in interface io.delta.standalone.DeltaLog
-
-
Create a DeltaLog instance representing the table located at the provided path.
-
-
forTable(Configuration, Path) - Static method in interface io.delta.standalone.DeltaLog
-
-
Create a DeltaLog instance representing the table located at the provide path.
-
-
- - - -

G

-
-
get(String) - Method in class io.delta.standalone.types.StructType
-
 
-
getAllFiles() - Method in interface io.delta.standalone.Snapshot
-
 
-
getBigDecimal(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.math.BigDecimal.
-
-
getBinary(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as binary (byte array).
-
-
getBoolean(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive boolean.
-
-
getByte(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive byte.
-
-
getCatalogString() - Method in class io.delta.standalone.types.DataType
-
 
-
getClusterId() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getCommitInfoAt(long) - Method in interface io.delta.standalone.DeltaLog
-
 
-
getConfiguration() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getCreatedTime() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getDataType() - Method in class io.delta.standalone.types.StructField
-
 
-
getDate(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.sql.Date.
-
-
getDescription() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getDouble(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive double.
-
-
getElementType() - Method in class io.delta.standalone.types.ArrayType
-
 
-
getFieldNames() - Method in class io.delta.standalone.types.StructType
-
 
-
getFields() - Method in class io.delta.standalone.types.StructType
-
 
-
getFloat(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive float.
-
-
getFormat() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getId() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getInt(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive int.
-
-
getIsBlindAppend() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getIsolationLevel() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getJobId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getJobInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getJobName() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getJobOwnerId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getKeyType() - Method in class io.delta.standalone.types.MapType
-
 
-
getLength() - Method in interface io.delta.standalone.data.RowRecord
-
 
-
getList(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.util.List<T> object.
-
-
getLong(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive long.
-
-
getMap(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
-
-
getMetadata() - Method in interface io.delta.standalone.Snapshot
-
 
-
getModificationTime() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getName() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getName() - Method in class io.delta.standalone.types.StructField
-
 
-
getNotebookId() - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
getNotebookInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperation() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperationMetrics() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperationParameters() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOptions() - Method in class io.delta.standalone.actions.Format
-
 
-
getPartitionColumns() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getPath() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getPath() - Method in interface io.delta.standalone.DeltaLog
-
 
-
getPrecision() - Method in class io.delta.standalone.types.DecimalType
-
 
-
getProvider() - Method in class io.delta.standalone.actions.Format
-
 
-
getReadVersion() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getRecord(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a RowRecord object.
-
-
getRunId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getScale() - Method in class io.delta.standalone.types.DecimalType
-
 
-
getSchema() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getSchema() - Method in interface io.delta.standalone.data.RowRecord
-
 
-
getShort(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive short.
-
-
getSimpleString() - Method in class io.delta.standalone.types.ByteType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.DataType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.IntegerType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.LongType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.ShortType
-
 
-
getSize() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getSnapshotForTimestampAsOf(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Travel back in time to the latest Snapshot that was generated at or before timestamp.
-
-
getSnapshotForVersionAsOf(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Travel back in time to the Snapshot with the provided version number.
-
-
getStats() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getString(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a String object.
-
-
getTags() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getTimestamp() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getTimestamp(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.sql.Timestamp.
-
-
getTreeString() - Method in class io.delta.standalone.types.StructType
-
 
-
getTriggerType() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getTypeName() - Method in class io.delta.standalone.types.DataType
-
 
-
getUserId() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getUserMetadata() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getUserName() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getValueType() - Method in class io.delta.standalone.types.MapType
-
 
-
getVersion() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getVersion() - Method in interface io.delta.standalone.Snapshot
-
 
-
- - - -

H

-
-
hashCode() - Method in class io.delta.standalone.actions.AddFile
-
 
-
hashCode() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Format
-
 
-
hashCode() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Metadata
-
 
-
hashCode() - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
hashCode() - Method in class io.delta.standalone.types.ArrayType
-
 
-
hashCode() - Method in class io.delta.standalone.types.DataType
-
 
-
hashCode() - Method in class io.delta.standalone.types.DecimalType
-
 
-
hashCode() - Method in class io.delta.standalone.types.MapType
-
 
-
hashCode() - Method in class io.delta.standalone.types.StructField
-
 
-
hashCode() - Method in class io.delta.standalone.types.StructType
-
 
-
- - - -

I

-
-
IntegerType - Class in io.delta.standalone.types
-
-
The data type representing int values.
-
-
IntegerType() - Constructor for class io.delta.standalone.types.IntegerType
-
 
-
io.delta.standalone - package io.delta.standalone
-
 
-
io.delta.standalone.actions - package io.delta.standalone.actions
-
 
-
io.delta.standalone.data - package io.delta.standalone.data
-
 
-
io.delta.standalone.types - package io.delta.standalone.types
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.AddFile
-
 
-
isNullable() - Method in class io.delta.standalone.types.StructField
-
 
-
isNullAt(String) - Method in interface io.delta.standalone.data.RowRecord
-
 
-
- - - -

J

-
-
JobInfo - Class in io.delta.standalone.actions
-
-
Represents the Databricks Job information that committed to the Delta table.
-
-
JobInfo(String, String, String, String, String) - Constructor for class io.delta.standalone.actions.JobInfo
-
 
-
- - - -

L

-
-
LongType - Class in io.delta.standalone.types
-
-
The data type representing long values.
-
-
LongType() - Constructor for class io.delta.standalone.types.LongType
-
 
-
- - - -

M

-
-
MapType - Class in io.delta.standalone.types
-
-
The data type for Maps.
-
-
MapType(DataType, DataType, boolean) - Constructor for class io.delta.standalone.types.MapType
-
 
-
Metadata - Class in io.delta.standalone.actions
-
-
Updates the metadata of the table.
-
-
Metadata(String, String, String, Format, List<String>, Map<String, String>, Optional<Long>, StructType) - Constructor for class io.delta.standalone.actions.Metadata
-
 
-
- - - -

N

-
-
NotebookInfo - Class in io.delta.standalone.actions
-
-
Represents the Databricks Notebook information that committed to the Delta table.
-
-
NotebookInfo(String) - Constructor for class io.delta.standalone.actions.NotebookInfo
-
 
-
NullType - Class in io.delta.standalone.types
-
-
The data type representing null values.
-
-
NullType() - Constructor for class io.delta.standalone.types.NullType
-
 
-
- - - -

O

-
-
open() - Method in interface io.delta.standalone.Snapshot
-
-
Creates a CloseableIterator which can iterate over data belonging to this snapshot.
-
-
- - - -

R

-
-
RowRecord - Interface in io.delta.standalone.data
-
-
Represents one row of data containing a non-empty collection of fieldName - value pairs.
-
-
- - - -

S

-
-
ShortType - Class in io.delta.standalone.types
-
-
The data type representing short values.
-
-
ShortType() - Constructor for class io.delta.standalone.types.ShortType
-
 
-
snapshot() - Method in interface io.delta.standalone.DeltaLog
-
 
-
Snapshot - Interface in io.delta.standalone
-
-
Snapshot provides APIs to access the Delta table state (such as table metadata, active - files) at some version.
-
-
StringType - Class in io.delta.standalone.types
-
-
The data type representing String values.
-
-
StringType() - Constructor for class io.delta.standalone.types.StringType
-
 
-
StructField - Class in io.delta.standalone.types
-
-
A field inside a StructType.
-
-
StructField(String, DataType, boolean) - Constructor for class io.delta.standalone.types.StructField
-
 
-
StructField(String, DataType) - Constructor for class io.delta.standalone.types.StructField
-
-
Constructor with default nullable = true.
-
-
StructType - Class in io.delta.standalone.types
-
-
The data type representing a table's schema, consisting of a collection of - fields (that is, fieldName to dataType pairs).
-
-
StructType(StructField[]) - Constructor for class io.delta.standalone.types.StructType
-
 
-
- - - -

T

-
-
TimestampType - Class in io.delta.standalone.types
-
-
The data type representing java.sql.Timestamp values.
-
-
TimestampType() - Constructor for class io.delta.standalone.types.TimestampType
-
 
-
- - - -

U

-
-
update() - Method in interface io.delta.standalone.DeltaLog
-
-
Bring DeltaLog's current Snapshot to the latest state if there are any new - transaction logs.
-
-
USER_DEFAULT - Static variable in class io.delta.standalone.types.DecimalType
-
 
-
- - - -

V

-
-
valueContainsNull() - Method in class io.delta.standalone.types.MapType
-
 
-
-A B C D E F G H I J L M N O R S T U V 
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/index.html b/connectors/docs/0.2.0/delta-standalone/api/java/index.html deleted file mode 100644 index ac45cef6309..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - -Delta Standalone Reader 0.2.1 JavaDoc - - - - - - - - - -<noscript> -<div>JavaScript is disabled on your browser.</div> -</noscript> -<h2>Frame Alert</h2> -<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html deleted file mode 100644 index 16f2bf1ab33..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html +++ /dev/null @@ -1,366 +0,0 @@ - - - - - -DeltaLog (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface DeltaLog

-
-
-
-
    -
  • -
    -
    -
    public interface DeltaLog
    -
    DeltaLog is the representation of the transaction logs of a Delta table. It provides APIs - to access the states of a Delta table. - - You can use the following codes to create a DeltaLog instance. -
    
    -   Configuration conf = ... // Create your own Hadoop Configuration instance
    -   DeltaLog deltaLog = DeltaLog.forTable(conf, "/the/delta/table/path");
    - 
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        update

        -
        Snapshot update()
        -
        Bring DeltaLog's current Snapshot to the latest state if there are any new - transaction logs.
        -
      • -
      - - - -
        -
      • -

        getSnapshotForVersionAsOf

        -
        Snapshot getSnapshotForVersionAsOf(long version)
        -
        Travel back in time to the Snapshot with the provided version number.
        -
        -
        Parameters:
        -
        version - the snapshot version to generate
        -
        Throws:
        -
        IllegalArgumentException - if the version is outside the range of available versions
        -
        -
      • -
      - - - -
        -
      • -

        getSnapshotForTimestampAsOf

        -
        Snapshot getSnapshotForTimestampAsOf(long timestamp)
        -
        Travel back in time to the latest Snapshot that was generated at or before timestamp.
        -
        -
        Parameters:
        -
        timestamp - the number of milliseconds since midnight, January 1, 1970 UTC
        -
        Throws:
        -
        RuntimeException - if the snapshot is unable to be recreated
        -
        IllegalArgumentException - if the timestamp is before the earliest possible snapshot or after the latest possible snapshot
        -
        -
      • -
      - - - -
        -
      • -

        getCommitInfoAt

        -
        CommitInfo getCommitInfoAt(long version)
        -
        -
        Parameters:
        -
        version - the commit version to retrieve CommitInfo
        -
        -
      • -
      - - - -
        -
      • -

        getPath

        -
        org.apache.hadoop.fs.Path getPath()
        -
      • -
      - - - -
        -
      • -

        forTable

        -
        static DeltaLog forTable(org.apache.hadoop.conf.Configuration hadoopConf,
        -                         String path)
        -
        Create a DeltaLog instance representing the table located at the provided path.
        -
        -
        Parameters:
        -
        hadoopConf - Hadoop Configuration to use when accessing the Delta table
        -
        path - the path to the Delta table
        -
        -
      • -
      - - - -
        -
      • -

        forTable

        -
        static DeltaLog forTable(org.apache.hadoop.conf.Configuration hadoopConf,
        -                         org.apache.hadoop.fs.Path path)
        -
        Create a DeltaLog instance representing the table located at the provide path.
        -
        -
        Parameters:
        -
        hadoopConf - Hadoop Configuration to use when accessing the Delta table
        -
        path - the path to the Delta table
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html deleted file mode 100644 index 60696ccc426..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html +++ /dev/null @@ -1,267 +0,0 @@ - - - - - -Snapshot (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface Snapshot

-
-
-
-
    -
  • -
    -
    -
    public interface Snapshot
    -
    Snapshot provides APIs to access the Delta table state (such as table metadata, active - files) at some version. - - See Delta Transaction Log Protocol - for more details about the transaction logs.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getAllFiles

        -
        java.util.List<AddFile> getAllFiles()
        -
      • -
      - - - -
        -
      • -

        getMetadata

        -
        Metadata getMetadata()
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        long getVersion()
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html deleted file mode 100644 index 6eefa24e5a3..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - -AddFile (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddFile

-
-
- -
-
    -
  • -
    -
    -
    public final class AddFile
    -extends Object
    -
    Represents an action that adds a new file to the table. The path of a file acts as the primary - key for the entry in the set of files. - - Note: since actions within a given Delta file are not guaranteed to be applied in order, it is - not valid for multiple file operations with the same path to exist in a single version.
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      AddFile(String path, - java.util.Map<String,String> partitionValues, - long size, - long modificationTime, - boolean dataChange, - String stats, - java.util.Map<String,String> tags) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AddFile

        -
        public AddFile(String path,
        -               java.util.Map<String,String> partitionValues,
        -               long size,
        -               long modificationTime,
        -               boolean dataChange,
        -               String stats,
        -               java.util.Map<String,String> tags)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        public String getPath()
        -
      • -
      - - - - - - - -
        -
      • -

        getSize

        -
        public long getSize()
        -
      • -
      - - - -
        -
      • -

        getModificationTime

        -
        public long getModificationTime()
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
      • -
      - - - -
        -
      • -

        getStats

        -
        public String getStats()
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        public java.util.Map<String,String> getTags()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html deleted file mode 100644 index e89ac395090..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html +++ /dev/null @@ -1,505 +0,0 @@ - - - - - -CommitInfo (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class CommitInfo

-
-
- -
-
    -
  • -
    -
    -
    public class CommitInfo
    -extends Object
    -
    Holds provenance information about changes to the table. This CommitInfo - is not stored in the checkpoint and has reduced compatibility guarantees. - Information stored in it is best effort (i.e. can be falsified by a writer).
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      CommitInfo(java.util.Optional<Long> version, - java.sql.Timestamp timestamp, - java.util.Optional<String> userId, - java.util.Optional<String> userName, - String operation, - java.util.Map<String,String> operationParameters, - java.util.Optional<JobInfo> jobInfo, - java.util.Optional<NotebookInfo> notebookInfo, - java.util.Optional<String> clusterId, - java.util.Optional<Long> readVersion, - java.util.Optional<String> isolationLevel, - java.util.Optional<Boolean> isBlindAppend, - java.util.Optional<java.util.Map<String,String>> operationMetrics, - java.util.Optional<String> userMetadata) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CommitInfo

        -
        public CommitInfo(java.util.Optional<Long> version,
        -                  java.sql.Timestamp timestamp,
        -                  java.util.Optional<String> userId,
        -                  java.util.Optional<String> userName,
        -                  String operation,
        -                  java.util.Map<String,String> operationParameters,
        -                  java.util.Optional<JobInfo> jobInfo,
        -                  java.util.Optional<NotebookInfo> notebookInfo,
        -                  java.util.Optional<String> clusterId,
        -                  java.util.Optional<Long> readVersion,
        -                  java.util.Optional<String> isolationLevel,
        -                  java.util.Optional<Boolean> isBlindAppend,
        -                  java.util.Optional<java.util.Map<String,String>> operationMetrics,
        -                  java.util.Optional<String> userMetadata)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        public java.util.Optional<Long> getVersion()
        -
      • -
      - - - -
        -
      • -

        getTimestamp

        -
        public java.sql.Timestamp getTimestamp()
        -
      • -
      - - - -
        -
      • -

        getUserId

        -
        public java.util.Optional<String> getUserId()
        -
      • -
      - - - -
        -
      • -

        getUserName

        -
        public java.util.Optional<String> getUserName()
        -
      • -
      - - - -
        -
      • -

        getOperation

        -
        public String getOperation()
        -
      • -
      - - - -
        -
      • -

        getOperationParameters

        -
        public java.util.Map<String,String> getOperationParameters()
        -
      • -
      - - - -
        -
      • -

        getJobInfo

        -
        public java.util.Optional<JobInfo> getJobInfo()
        -
      • -
      - - - -
        -
      • -

        getNotebookInfo

        -
        public java.util.Optional<NotebookInfo> getNotebookInfo()
        -
      • -
      - - - -
        -
      • -

        getClusterId

        -
        public java.util.Optional<String> getClusterId()
        -
      • -
      - - - -
        -
      • -

        getReadVersion

        -
        public java.util.Optional<Long> getReadVersion()
        -
      • -
      - - - -
        -
      • -

        getIsolationLevel

        -
        public java.util.Optional<String> getIsolationLevel()
        -
      • -
      - - - -
        -
      • -

        getIsBlindAppend

        -
        public java.util.Optional<Boolean> getIsBlindAppend()
        -
      • -
      - - - -
        -
      • -

        getOperationMetrics

        -
        public java.util.Optional<java.util.Map<String,String>> getOperationMetrics()
        -
      • -
      - - - -
        -
      • -

        getUserMetadata

        -
        public java.util.Optional<String> getUserMetadata()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html deleted file mode 100644 index 218bd9d1949..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html +++ /dev/null @@ -1,323 +0,0 @@ - - - - - -Format (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Format

-
-
- -
-
    -
  • -
    -
    -
    public final class Format
    -extends Object
    -
    A specification of the encoding for the files stored in a table.
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Format(String provider, - java.util.Map<String,String> options) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Format

        -
        public Format(String provider,
        -              java.util.Map<String,String> options)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getProvider

        -
        public String getProvider()
        -
      • -
      - - - -
        -
      • -

        getOptions

        -
        public java.util.Map<String,String> getOptions()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html deleted file mode 100644 index d909febb3ff..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html +++ /dev/null @@ -1,364 +0,0 @@ - - - - - -JobInfo (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class JobInfo

-
-
- -
-
    -
  • -
    -
    -
    public class JobInfo
    -extends Object
    -
    Represents the Databricks Job information that committed to the Delta table.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      JobInfo(String jobId, - String jobName, - String runId, - String jobOwnerId, - String triggerType) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        JobInfo

        -
        public JobInfo(String jobId,
        -               String jobName,
        -               String runId,
        -               String jobOwnerId,
        -               String triggerType)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getJobId

        -
        public String getJobId()
        -
      • -
      - - - -
        -
      • -

        getJobName

        -
        public String getJobName()
        -
      • -
      - - - -
        -
      • -

        getRunId

        -
        public String getRunId()
        -
      • -
      - - - -
        -
      • -

        getJobOwnerId

        -
        public String getJobOwnerId()
        -
      • -
      - - - -
        -
      • -

        getTriggerType

        -
        public String getTriggerType()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html deleted file mode 100644 index b3c0521fc7b..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html +++ /dev/null @@ -1,418 +0,0 @@ - - - - - -Metadata (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Metadata

-
-
- -
-
    -
  • -
    -
    -
    public final class Metadata
    -extends Object
    -
    Updates the metadata of the table. The first version of a table must contain - a Metadata action. Subsequent Metadata actions completely - overwrite the current metadata of the table. It is the responsibility of the - writer to ensure that any data already present in the table is still valid - after any change. There can be at most one Metadata action in a - given version of the table.
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Metadata

        -
        public Metadata(String id,
        -                String name,
        -                String description,
        -                Format format,
        -                java.util.List<String> partitionColumns,
        -                java.util.Map<String,String> configuration,
        -                java.util.Optional<Long> createdTime,
        -                StructType schema)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getId

        -
        public String getId()
        -
      • -
      - - - -
        -
      • -

        getName

        -
        public String getName()
        -
      • -
      - - - -
        -
      • -

        getDescription

        -
        public String getDescription()
        -
      • -
      - - - -
        -
      • -

        getFormat

        -
        public Format getFormat()
        -
      • -
      - - - -
        -
      • -

        getPartitionColumns

        -
        public java.util.List<String> getPartitionColumns()
        -
      • -
      - - - -
        -
      • -

        getConfiguration

        -
        public java.util.Map<String,String> getConfiguration()
        -
      • -
      - - - -
        -
      • -

        getCreatedTime

        -
        public java.util.Optional<Long> getCreatedTime()
        -
      • -
      - - - -
        -
      • -

        getSchema

        -
        public StructType getSchema()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html deleted file mode 100644 index 63d70d13a71..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - -NotebookInfo (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class NotebookInfo

-
-
- -
-
    -
  • -
    -
    -
    public class NotebookInfo
    -extends Object
    -
    Represents the Databricks Notebook information that committed to the Delta table.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      NotebookInfo(String notebookId) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        NotebookInfo

        -
        public NotebookInfo(String notebookId)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getNotebookId

        -
        public String getNotebookId()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html deleted file mode 100644 index 6ddc8240a59..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -io.delta.standalone.actions (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - -

io.delta.standalone.actions

-
-

Classes

- -
- - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html deleted file mode 100644 index 4d51d96d560..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - -io.delta.standalone.actions (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.actions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html deleted file mode 100644 index 8ae14c76b1e..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - -io.delta.standalone.actions Class Hierarchy (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.actions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html deleted file mode 100644 index 42f203a8c33..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - -CloseableIterator (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.data
-

Interface CloseableIterator<T>

-
-
-
-
    -
  • -
    -
    All Superinterfaces:
    -
    AutoCloseable, java.io.Closeable, java.util.Iterator<T>
    -
    -
    -
    -
    public interface CloseableIterator<T>
    -extends java.util.Iterator<T>, java.io.Closeable
    -
    An Iterator that also need to implement the Closeable interface. The caller - should call Closeable.close() method to free all resources properly after using the iterator.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from interface java.util.Iterator

        -forEachRemaining, hasNext, next, remove
      • -
      -
        -
      • - - -

        Methods inherited from interface java.io.Closeable

        -close
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html deleted file mode 100644 index 1c6f2ea001e..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html +++ /dev/null @@ -1,634 +0,0 @@ - - - - - -RowRecord (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.data
-

Interface RowRecord

-
-
-
-
    -
  • -
    -
    -
    public interface RowRecord
    -
    Represents one row of data containing a non-empty collection of fieldName - value pairs. - It provides APIs to allow retrieval of values through fieldName lookup. For example, - -
    
    -   if (row.isNullAt("int_field")) {
    -     // handle the null value.
    -   } else {
    -     int x = getInt("int_field");
    -   }
    - 
    -
    -
    See Also:
    -
    StructType, -StructField
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Abstract Methods 
      Modifier and TypeMethod and Description
      java.math.BigDecimalgetBigDecimal(String fieldName) -
      Retrieves value from data record and returns the value as a java.math.BigDecimal.
      -
      byte[]getBinary(String fieldName) -
      Retrieves value from data record and returns the value as binary (byte array).
      -
      booleangetBoolean(String fieldName) -
      Retrieves value from data record and returns the value as a primitive boolean.
      -
      bytegetByte(String fieldName) -
      Retrieves value from data record and returns the value as a primitive byte.
      -
      java.sql.DategetDate(String fieldName) -
      Retrieves value from data record and returns the value as a java.sql.Date.
      -
      doublegetDouble(String fieldName) -
      Retrieves value from data record and returns the value as a primitive double.
      -
      floatgetFloat(String fieldName) -
      Retrieves value from data record and returns the value as a primitive float.
      -
      intgetInt(String fieldName) -
      Retrieves value from data record and returns the value as a primitive int.
      -
      intgetLength() 
      <T> java.util.List<T>getList(String fieldName) -
      Retrieves value from data record and returns the value as a java.util.List<T> object.
      -
      longgetLong(String fieldName) -
      Retrieves value from data record and returns the value as a primitive long.
      -
      <K,V> java.util.Map<K,V>getMap(String fieldName) -
      Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
      -
      RowRecordgetRecord(String fieldName) -
      Retrieves value from data record and returns the value as a RowRecord object.
      -
      StructTypegetSchema() 
      shortgetShort(String fieldName) -
      Retrieves value from data record and returns the value as a primitive short.
      -
      StringgetString(String fieldName) -
      Retrieves value from data record and returns the value as a String object.
      -
      java.sql.TimestampgetTimestamp(String fieldName) -
      Retrieves value from data record and returns the value as a java.sql.Timestamp.
      -
      booleanisNullAt(String fieldName) 
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        getLength

        -
        int getLength()
        -
      • -
      - - - -
        -
      • -

        isNullAt

        -
        boolean isNullAt(String fieldName)
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        -
      • -
      - - - -
        -
      • -

        getInt

        -
        int getInt(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive int.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getLong

        -
        long getLong(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive long.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getByte

        -
        byte getByte(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive byte.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getShort

        -
        short getShort(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive short.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBoolean

        -
        boolean getBoolean(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive boolean.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getFloat

        -
        float getFloat(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive float.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getDouble

        -
        double getDouble(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive double.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getString

        -
        String getString(String fieldName)
        -
        Retrieves value from data record and returns the value as a String object.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBinary

        -
        byte[] getBinary(String fieldName)
        -
        Retrieves value from data record and returns the value as binary (byte array).
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBigDecimal

        -
        java.math.BigDecimal getBigDecimal(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.math.BigDecimal.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getTimestamp

        -
        java.sql.Timestamp getTimestamp(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.sql.Timestamp.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getDate

        -
        java.sql.Date getDate(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.sql.Date.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getRecord

        -
        RowRecord getRecord(String fieldName)
        -
        Retrieves value from data record and returns the value as a RowRecord object.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any nested field, if that field is not - nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getList

        -
        <T> java.util.List<T> getList(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.util.List<T> object.
        -
        -
        Type Parameters:
        -
        T - element type
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any element field, if that field is not - nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getMap

        -
        <K,V> java.util.Map<K,V> getMap(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
        -
        -
        Type Parameters:
        -
        K - key type
        -
        V - value type
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any key/value field, if that field is not - nullable and null data value read
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html deleted file mode 100644 index 044cd9dfddb..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -io.delta.standalone.data (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - -

io.delta.standalone.data

-
-

Interfaces

- -
- - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html deleted file mode 100644 index e32652d82ea..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - -io.delta.standalone.data (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.data

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html deleted file mode 100644 index 16daf1856a5..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - -io.delta.standalone.data Class Hierarchy (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.data

-Package Hierarchies: - -
-
-

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/package-frame.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/package-frame.html deleted file mode 100644 index 71246a3e2e5..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -io.delta.standalone (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - -

io.delta.standalone

-
-

Interfaces

- -
- - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/package-summary.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/package-summary.html deleted file mode 100644 index 947354b4a3a..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/package-summary.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - -io.delta.standalone (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/package-tree.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/package-tree.html deleted file mode 100644 index 5a1a8050147..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/package-tree.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - -io.delta.standalone Class Hierarchy (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone

-Package Hierarchies: - -
-
-

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html deleted file mode 100644 index 63779f3deb8..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html +++ /dev/null @@ -1,336 +0,0 @@ - - - - - -ArrayType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ArrayType

-
-
- -
-
    -
  • -
    -
    -
    public final class ArrayType
    -extends DataType
    -
    The data type for collections of multiple values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ArrayType

        -
        public ArrayType(DataType elementType,
        -                 boolean containsNull)
        -
        -
        Parameters:
        -
        elementType - the data type of values
        -
        containsNull - indicates if values have null value
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getElementType

        -
        public DataType getElementType()
        -
      • -
      - - - -
        -
      • -

        containsNull

        -
        public boolean containsNull()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html deleted file mode 100644 index 866608eb730..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -BinaryType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class BinaryType

-
-
- -
-
    -
  • -
    -
    -
    public final class BinaryType
    -extends DataType
    -
    The data type representing byte[] values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BinaryType

        -
        public BinaryType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html deleted file mode 100644 index edf7af06335..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -BooleanType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class BooleanType

-
-
- -
-
    -
  • -
    -
    -
    public final class BooleanType
    -extends DataType
    -
    The data type representing boolean values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BooleanType

        -
        public BooleanType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html deleted file mode 100644 index 5ad1ab2673e..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -ByteType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ByteType

-
-
- -
-
    -
  • -
    -
    -
    public final class ByteType
    -extends DataType
    -
    The data type representing byte values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ByteType

        -
        public ByteType()
        -
      • -
      -
    • -
    - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html deleted file mode 100644 index 69e6f370e1d..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html +++ /dev/null @@ -1,337 +0,0 @@ - - - - - -DataType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DataType

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DataType

        -
        public DataType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getTypeName

        -
        public String getTypeName()
        -
      • -
      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
      • -
      - - - -
        -
      • -

        getCatalogString

        -
        public String getCatalogString()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html deleted file mode 100644 index 2e5e0c2a1b5..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - -DateType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DateType

-
-
- -
-
    -
  • -
    -
    -
    public final class DateType
    -extends DataType
    -
    A date type, supporting "0001-01-01" through "9999-12-31". - Internally, this is represented as the number of days from 1970-01-01.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DateType

        -
        public DateType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html deleted file mode 100644 index 84eabab6941..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html +++ /dev/null @@ -1,373 +0,0 @@ - - - - - -DecimalType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DecimalType

-
-
- -
-
    -
  • -
    -
    -
    public final class DecimalType
    -extends DataType
    -
    The data type representing java.math.BigDecimal values. - A Decimal that must have fixed precision (the maximum number of digits) and scale (the number - of digits on right side of dot). - - The precision can be up to 38, scale can also be up to 38 (less or equal to precision). - - The default precision and scale is (10, 0).
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        USER_DEFAULT

        -
        public static final DecimalType USER_DEFAULT
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DecimalType

        -
        public DecimalType(int precision,
        -                   int scale)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPrecision

        -
        public int getPrecision()
        -
      • -
      - - - -
        -
      • -

        getScale

        -
        public int getScale()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html deleted file mode 100644 index 437c2acae2e..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -DoubleType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DoubleType

-
-
- -
-
    -
  • -
    -
    -
    public final class DoubleType
    -extends DataType
    -
    The data type representing double values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DoubleType

        -
        public DoubleType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html deleted file mode 100644 index e35b4d7b127..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -FloatType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FloatType

-
-
- -
-
    -
  • -
    -
    -
    public final class FloatType
    -extends DataType
    -
    The data type representing float values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        FloatType

        -
        public FloatType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html deleted file mode 100644 index 31a88fc17d4..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -IntegerType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class IntegerType

-
-
- -
-
    -
  • -
    -
    -
    public final class IntegerType
    -extends DataType
    -
    The data type representing int values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        IntegerType

        -
        public IntegerType()
        -
      • -
      -
    • -
    - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html deleted file mode 100644 index 75d8dcd0590..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -LongType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class LongType

-
-
- -
-
    -
  • -
    -
    -
    public final class LongType
    -extends DataType
    -
    The data type representing long values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        LongType

        -
        public LongType()
        -
      • -
      -
    • -
    - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html deleted file mode 100644 index c814ae9f046..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html +++ /dev/null @@ -1,352 +0,0 @@ - - - - - -MapType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class MapType

-
-
- -
-
    -
  • -
    -
    -
    public final class MapType
    -extends DataType
    -
    The data type for Maps. Keys in a map are not allowed to have null values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MapType

        -
        public MapType(DataType keyType,
        -               DataType valueType,
        -               boolean valueContainsNull)
        -
        -
        Parameters:
        -
        keyType - the data type of map keys
        -
        valueType - the data type of map values
        -
        valueContainsNull - indicates if map values have null values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getKeyType

        -
        public DataType getKeyType()
        -
      • -
      - - - -
        -
      • -

        getValueType

        -
        public DataType getValueType()
        -
      • -
      - - - -
        -
      • -

        valueContainsNull

        -
        public boolean valueContainsNull()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html deleted file mode 100644 index f8e8a8fae62..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -NullType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class NullType

-
-
- -
-
    -
  • -
    -
    -
    public final class NullType
    -extends DataType
    -
    The data type representing null values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        NullType

        -
        public NullType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html deleted file mode 100644 index aa995b02759..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -ShortType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ShortType

-
-
- -
-
    -
  • -
    -
    -
    public final class ShortType
    -extends DataType
    -
    The data type representing short values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ShortType

        -
        public ShortType()
        -
      • -
      -
    • -
    - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html deleted file mode 100644 index eab20c6cadd..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -StringType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StringType

-
-
- -
-
    -
  • -
    -
    -
    public final class StringType
    -extends DataType
    -
    The data type representing String values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StringType

        -
        public StringType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html deleted file mode 100644 index 38b613fe61c..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html +++ /dev/null @@ -1,362 +0,0 @@ - - - - - -StructField (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StructField

-
-
- -
-
    -
  • -
    -
    -
    public final class StructField
    -extends Object
    -
    A field inside a StructType.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType,
        -                   boolean nullable)
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        nullable - indicates if values of this field can be null values
        -
        -
      • -
      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType)
        -
        Constructor with default nullable = true.
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getName

        -
        public String getName()
        -
      • -
      - - - -
        -
      • -

        getDataType

        -
        public DataType getDataType()
        -
      • -
      - - - -
        -
      • -

        isNullable

        -
        public boolean isNullable()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html deleted file mode 100644 index 861ffdd605b..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html +++ /dev/null @@ -1,366 +0,0 @@ - - - - - -StructType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StructType

-
-
- -
-
    -
  • -
    -
    -
    public final class StructType
    -extends DataType
    -
    The data type representing a table's schema, consisting of a collection of - fields (that is, fieldName to dataType pairs).
    -
    -
    See Also:
    -
    StructField
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StructType

        -
        public StructType(StructField[] fields)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        getFieldNames

        -
        public String[] getFieldNames()
        -
      • -
      - - - -
        -
      • -

        get

        -
        public StructField get(String fieldName)
        -
        -
        Parameters:
        -
        fieldName - the name of the desired StructField, not null
        -
        Throws:
        -
        IllegalArgumentException - if a field with the given name does not exist
        -
        -
      • -
      - - - -
        -
      • -

        getTreeString

        -
        public String getTreeString()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html deleted file mode 100644 index 49cb01e0ce7..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -TimestampType (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class TimestampType

-
-
- -
-
    -
  • -
    -
    -
    public final class TimestampType
    -extends DataType
    -
    The data type representing java.sql.Timestamp values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        TimestampType

        -
        public TimestampType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html deleted file mode 100644 index e081f233f13..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - -io.delta.standalone.types (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - -

io.delta.standalone.types

-
-

Classes

- -
- - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html deleted file mode 100644 index aead501f7f3..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - -io.delta.standalone.types (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.types

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html b/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html deleted file mode 100644 index 4e52a7f4997..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - -io.delta.standalone.types Class Hierarchy (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.types

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/overview-frame.html b/connectors/docs/0.2.0/delta-standalone/api/java/overview-frame.html deleted file mode 100644 index 0187b771272..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/overview-frame.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Overview List (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - -
All Classes
-
-

Packages

- -
-

 

- - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/overview-summary.html b/connectors/docs/0.2.0/delta-standalone/api/java/overview-summary.html deleted file mode 100644 index 69ddb947786..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/overview-summary.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - -Overview (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - -
Packages 
PackageDescription
io.delta.standalone 
io.delta.standalone.actions 
io.delta.standalone.data 
io.delta.standalone.types 
-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/overview-tree.html b/connectors/docs/0.2.0/delta-standalone/api/java/overview-tree.html deleted file mode 100644 index 1461dd63ed0..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/overview-tree.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - -Class Hierarchy (Delta Standalone Reader 0.2.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For All Packages

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/package-list b/connectors/docs/0.2.0/delta-standalone/api/java/package-list deleted file mode 100644 index 5dab2c7aadd..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/package-list +++ /dev/null @@ -1,4 +0,0 @@ -io.delta.standalone -io.delta.standalone.actions -io.delta.standalone.data -io.delta.standalone.types diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/script.js b/connectors/docs/0.2.0/delta-standalone/api/java/script.js deleted file mode 100644 index b3463569314..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/script.js +++ /dev/null @@ -1,30 +0,0 @@ -function show(type) -{ - count = 0; - for (var key in methods) { - var row = document.getElementById(key); - if ((methods[key] & type) != 0) { - row.style.display = ''; - row.className = (count++ % 2) ? rowColor : altColor; - } - else - row.style.display = 'none'; - } - updateTabs(type); -} - -function updateTabs(type) -{ - for (var value in tabs) { - var sNode = document.getElementById(tabs[value][0]); - var spanNode = sNode.firstChild; - if (value == type) { - sNode.className = activeTableTab; - spanNode.innerHTML = tabs[value][1]; - } - else { - sNode.className = tableTab; - spanNode.innerHTML = "" + tabs[value][1] + ""; - } - } -} diff --git a/connectors/docs/0.2.0/delta-standalone/api/java/stylesheet.css b/connectors/docs/0.2.0/delta-standalone/api/java/stylesheet.css deleted file mode 100644 index 98055b22d6d..00000000000 --- a/connectors/docs/0.2.0/delta-standalone/api/java/stylesheet.css +++ /dev/null @@ -1,574 +0,0 @@ -/* Javadoc style sheet */ -/* -Overall document style -*/ - -@import url('resources/fonts/dejavu.css'); - -body { - background-color:#ffffff; - color:#353833; - font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; - font-size:14px; - margin:0; -} -a:link, a:visited { - text-decoration:none; - color:#4A6782; -} -a:hover, a:focus { - text-decoration:none; - color:#bb7a2a; -} -a:active { - text-decoration:none; - color:#4A6782; -} -a[name] { - color:#353833; -} -a[name]:hover { - text-decoration:none; - color:#353833; -} -pre { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; -} -h1 { - font-size:20px; -} -h2 { - font-size:18px; -} -h3 { - font-size:16px; - font-style:italic; -} -h4 { - font-size:13px; -} -h5 { - font-size:12px; -} -h6 { - font-size:11px; -} -ul { - list-style-type:disc; -} -code, tt { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; - margin-top:8px; - line-height:1.4em; -} -dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; -} -table tr td dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - vertical-align:top; - padding-top:4px; -} -sup { - font-size:8px; -} -/* -Document title and Copyright styles -*/ -.clear { - clear:both; - height:0px; - overflow:hidden; -} -.aboutLanguage { - float:right; - padding:0px 21px; - font-size:11px; - z-index:200; - margin-top:-9px; -} -.legalCopy { - margin-left:.5em; -} -.bar a, .bar a:link, .bar a:visited, .bar a:active { - color:#FFFFFF; - text-decoration:none; -} -.bar a:hover, .bar a:focus { - color:#bb7a2a; -} -.tab { - background-color:#0066FF; - color:#ffffff; - padding:8px; - width:5em; - font-weight:bold; -} -/* -Navigation bar styles -*/ -.bar { - background-color:#4D7A97; - color:#FFFFFF; - padding:.8em .5em .4em .8em; - height:auto;/*height:1.8em;*/ - font-size:11px; - margin:0; -} -.topNav { - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.bottomNav { - margin-top:10px; - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.subNav { - background-color:#dee3e9; - float:left; - width:100%; - overflow:hidden; - font-size:12px; -} -.subNav div { - clear:left; - float:left; - padding:0 0 5px 6px; - text-transform:uppercase; -} -ul.navList, ul.subNavList { - float:left; - margin:0 25px 0 0; - padding:0; -} -ul.navList li{ - list-style:none; - float:left; - padding: 5px 6px; - text-transform:uppercase; -} -ul.subNavList li{ - list-style:none; - float:left; -} -.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { - color:#FFFFFF; - text-decoration:none; - text-transform:uppercase; -} -.topNav a:hover, .bottomNav a:hover { - text-decoration:none; - color:#bb7a2a; - text-transform:uppercase; -} -.navBarCell1Rev { - background-color:#F8981D; - color:#253441; - margin: auto 5px; -} -.skipNav { - position:absolute; - top:auto; - left:-9999px; - overflow:hidden; -} -/* -Page header and footer styles -*/ -.header, .footer { - clear:both; - margin:0 20px; - padding:5px 0 0 0; -} -.indexHeader { - margin:10px; - position:relative; -} -.indexHeader span{ - margin-right:15px; -} -.indexHeader h1 { - font-size:13px; -} -.title { - color:#2c4557; - margin:10px 0; -} -.subTitle { - margin:5px 0 0 0; -} -.header ul { - margin:0 0 15px 0; - padding:0; -} -.footer ul { - margin:20px 0 5px 0; -} -.header ul li, .footer ul li { - list-style:none; - font-size:13px; -} -/* -Heading styles -*/ -div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList ul.blockList li.blockList h3 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList li.blockList h3 { - padding:0; - margin:15px 0; -} -ul.blockList li.blockList h2 { - padding:0px 0 20px 0; -} -/* -Page layout container styles -*/ -.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { - clear:both; - padding:10px 20px; - position:relative; -} -.indexContainer { - margin:10px; - position:relative; - font-size:12px; -} -.indexContainer h2 { - font-size:13px; - padding:0 0 3px 0; -} -.indexContainer ul { - margin:0; - padding:0; -} -.indexContainer ul li { - list-style:none; - padding-top:2px; -} -.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { - font-size:12px; - font-weight:bold; - margin:10px 0 0 0; - color:#4E4E4E; -} -.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { - margin:5px 0 10px 0px; - font-size:14px; - font-family:'DejaVu Sans Mono',monospace; -} -.serializedFormContainer dl.nameValue dt { - margin-left:1px; - font-size:1.1em; - display:inline; - font-weight:bold; -} -.serializedFormContainer dl.nameValue dd { - margin:0 0 0 1px; - font-size:1.1em; - display:inline; -} -/* -List styles -*/ -ul.horizontal li { - display:inline; - font-size:0.9em; -} -ul.inheritance { - margin:0; - padding:0; -} -ul.inheritance li { - display:inline; - list-style:none; -} -ul.inheritance li ul.inheritance { - margin-left:15px; - padding-left:15px; - padding-top:1px; -} -ul.blockList, ul.blockListLast { - margin:10px 0 10px 0; - padding:0; -} -ul.blockList li.blockList, ul.blockListLast li.blockList { - list-style:none; - margin-bottom:15px; - line-height:1.4; -} -ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { - padding:0px 20px 5px 10px; - border:1px solid #ededed; - background-color:#f8f8f8; -} -ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { - padding:0 0 5px 8px; - background-color:#ffffff; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { - margin-left:0; - padding-left:0; - padding-bottom:15px; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { - list-style:none; - border-bottom:none; - padding-bottom:0; -} -table tr td dl, table tr td dl dt, table tr td dl dd { - margin-top:0; - margin-bottom:1px; -} -/* -Table styles -*/ -.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { - width:100%; - border-left:1px solid #EEE; - border-right:1px solid #EEE; - border-bottom:1px solid #EEE; -} -.overviewSummary, .memberSummary { - padding:0px; -} -.overviewSummary caption, .memberSummary caption, .typeSummary caption, -.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { - position:relative; - text-align:left; - background-repeat:no-repeat; - color:#253441; - font-weight:bold; - clear:none; - overflow:hidden; - padding:0px; - padding-top:10px; - padding-left:1px; - margin:0px; - white-space:pre; -} -.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, -.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, -.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, -.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, -.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, -.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, -.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, -.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { - color:#FFFFFF; -} -.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, -.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - padding-bottom:7px; - display:inline-block; - float:left; - background-color:#F8981D; - border: none; - height:16px; -} -.memberSummary caption span.activeTableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#F8981D; - height:16px; -} -.memberSummary caption span.tableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#4D7A97; - height:16px; -} -.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { - padding-top:0px; - padding-left:0px; - padding-right:0px; - background-image:none; - float:none; - display:inline; -} -.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, -.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { - display:none; - width:5px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .activeTableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .tableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - background-color:#4D7A97; - float:left; - -} -.overviewSummary td, .memberSummary td, .typeSummary td, -.useSummary td, .constantsSummary td, .deprecatedSummary td { - text-align:left; - padding:0px 0px 12px 10px; -} -th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, -td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ - vertical-align:top; - padding-right:0px; - padding-top:8px; - padding-bottom:3px; -} -th.colFirst, th.colLast, th.colOne, .constantsSummary th { - background:#dee3e9; - text-align:left; - padding:8px 3px 3px 7px; -} -td.colFirst, th.colFirst { - white-space:nowrap; - font-size:13px; -} -td.colLast, th.colLast { - font-size:13px; -} -td.colOne, th.colOne { - font-size:13px; -} -.overviewSummary td.colFirst, .overviewSummary th.colFirst, -.useSummary td.colFirst, .useSummary th.colFirst, -.overviewSummary td.colOne, .overviewSummary th.colOne, -.memberSummary td.colFirst, .memberSummary th.colFirst, -.memberSummary td.colOne, .memberSummary th.colOne, -.typeSummary td.colFirst{ - width:25%; - vertical-align:top; -} -td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { - font-weight:bold; -} -.tableSubHeadingColor { - background-color:#EEEEFF; -} -.altColor { - background-color:#FFFFFF; -} -.rowColor { - background-color:#EEEEEF; -} -/* -Content styles -*/ -.description pre { - margin-top:0; -} -.deprecatedContent { - margin:0; - padding:10px 0; -} -.docSummary { - padding:0; -} - -ul.blockList ul.blockList ul.blockList li.blockList h3 { - font-style:normal; -} - -div.block { - font-size:14px; - font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; -} - -td.colLast div { - padding-top:0px; -} - - -td.colLast a { - padding-bottom:3px; -} -/* -Formatting effect styles -*/ -.sourceLineNo { - color:green; - padding:0 30px 0 0; -} -h1.hidden { - visibility:hidden; - overflow:hidden; - font-size:10px; -} -.block { - display:block; - margin:3px 10px 2px 0px; - color:#474747; -} -.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, -.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, -.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { - font-weight:bold; -} -.deprecationComment, .emphasizedPhrase, .interfaceName { - font-style:italic; -} - -div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, -div.block div.block span.interfaceName { - font-style:normal; -} - -div.contentContainer ul.blockList li.blockList h2{ - padding-bottom:0px; -} diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/allclasses-frame.html b/connectors/docs/0.3.0/delta-standalone/api/java/allclasses-frame.html deleted file mode 100644 index 4d73cce423d..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/allclasses-frame.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - -All Classes (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/allclasses-noframe.html b/connectors/docs/0.3.0/delta-standalone/api/java/allclasses-noframe.html deleted file mode 100644 index f149047b02a..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/allclasses-noframe.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - -All Classes (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/constant-values.html b/connectors/docs/0.3.0/delta-standalone/api/java/constant-values.html deleted file mode 100644 index 6da3796d249..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/constant-values.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - -Constant Field Values (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Constant Field Values

-

Contents

- -
-
- - -

io.delta.*

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/deprecated-list.html b/connectors/docs/0.3.0/delta-standalone/api/java/deprecated-list.html deleted file mode 100644 index 92472530815..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/deprecated-list.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - -Deprecated List (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Deprecated API

-

Contents

- -
-
- - - -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/help-doc.html b/connectors/docs/0.3.0/delta-standalone/api/java/help-doc.html deleted file mode 100644 index b7d64550e6f..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/help-doc.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - -API Help (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

How This API Document Is Organized

-
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
-
-
- -This help file applies to API documentation generated using the standard doclet.
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/index-all.html b/connectors/docs/0.3.0/delta-standalone/api/java/index-all.html deleted file mode 100644 index 05cc781c3ca..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/index-all.html +++ /dev/null @@ -1,1531 +0,0 @@ - - - - - -Index (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
A B C D E F G H I J L M N O P R S T U V W  - - -

A

-
-
Action - Interface in io.delta.standalone.actions
-
-
A marker interface for all actions that can be applied to a Delta table.
-
-
add(StructField) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new field.
-
-
add(String, DataType) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new nullable field with no metadata.
-
-
add(String, DataType, boolean) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new field with no metadata.
-
-
AddCDCFile - Class in io.delta.standalone.actions
-
-
A change file containing CDC data for the Delta version it's within.
-
-
AddCDCFile(String, Map<String, String>, long, Map<String, String>) - Constructor for class io.delta.standalone.actions.AddCDCFile
-
 
-
AddFile - Class in io.delta.standalone.actions
-
-
Represents an action that adds a new file to the table.
-
-
AddFile(String, Map<String, String>, long, long, boolean, String, Map<String, String>) - Constructor for class io.delta.standalone.actions.AddFile
-
 
-
AddFile.Builder - Class in io.delta.standalone.actions
-
-
Builder class for AddFile.
-
-
And - Class in io.delta.standalone.expressions
-
-
Evaluates logical expr1 AND expr2 for new And(expr1, expr2).
-
-
And(Expression, Expression) - Constructor for class io.delta.standalone.expressions.And
-
 
-
ArrayType - Class in io.delta.standalone.types
-
-
The data type for collections of multiple values.
-
-
ArrayType(DataType, boolean) - Constructor for class io.delta.standalone.types.ArrayType
-
 
-
- - - -

B

-
-
BinaryComparison - Class in io.delta.standalone.expressions
-
-
A BinaryOperator that compares the left and right Expressions and evaluates to a - boolean value.
-
-
BinaryExpression - Class in io.delta.standalone.expressions
-
-
An Expression with two inputs and one output.
-
-
BinaryOperator - Class in io.delta.standalone.expressions
-
-
A BinaryExpression that is an operator, meaning the string representation is - x symbol y, rather than funcName(x, y).
-
-
BinaryType - Class in io.delta.standalone.types
-
-
The data type representing byte[] values.
-
-
BinaryType() - Constructor for class io.delta.standalone.types.BinaryType
-
 
-
BooleanType - Class in io.delta.standalone.types
-
-
The data type representing boolean values.
-
-
BooleanType() - Constructor for class io.delta.standalone.types.BooleanType
-
 
-
build() - Method in class io.delta.standalone.actions.AddFile.Builder
-
-
Builds an AddFile using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
-
Builds a CommitInfo using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.JobInfo.Builder
-
-
Builds a JobInfo using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.Metadata.Builder
-
-
Builds a Metadata using the provided parameters.
-
-
build() - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
builder(String, Map<String, String>, long, long, boolean) - Static method in class io.delta.standalone.actions.AddFile
-
 
-
Builder(String, Map<String, String>, long, long, boolean) - Constructor for class io.delta.standalone.actions.AddFile.Builder
-
 
-
builder() - Static method in class io.delta.standalone.actions.CommitInfo
-
 
-
Builder() - Constructor for class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
builder(String) - Static method in class io.delta.standalone.actions.JobInfo
-
 
-
Builder(String) - Constructor for class io.delta.standalone.actions.JobInfo.Builder
-
 
-
builder() - Static method in class io.delta.standalone.actions.Metadata
-
 
-
Builder() - Constructor for class io.delta.standalone.actions.Metadata.Builder
-
 
-
builder() - Static method in class io.delta.standalone.types.FieldMetadata
-
 
-
Builder() - Constructor for class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
ByteType - Class in io.delta.standalone.types
-
-
The data type representing byte values.
-
-
ByteType() - Constructor for class io.delta.standalone.types.ByteType
-
 
-
- - - -

C

-
-
children() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
children() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
children() - Method in class io.delta.standalone.expressions.In
-
 
-
children() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
children() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
CloseableIterator<T> - Interface in io.delta.standalone.data
-
-
An Iterator that also implements the Closeable interface.
-
-
clusterId(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
Column - Class in io.delta.standalone.expressions
-
-
A column whose row-value will be computed based on the data in a RowRecord.
-
-
Column(String, DataType) - Constructor for class io.delta.standalone.expressions.Column
-
 
-
column(String) - Method in class io.delta.standalone.types.StructType
-
-
Creates a Column expression for the field with the given fieldName.
-
-
commit(Iterable<T>, Operation, String) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Modifies the state of the log by adding a new commit that is based on a read at the table's - latest version as of this transaction's instantiation.
-
-
CommitInfo - Class in io.delta.standalone.actions
-
-
Holds provenance information about changes to the table.
-
-
CommitInfo(Optional<Long>, Timestamp, Optional<String>, Optional<String>, String, Map<String, String>, Optional<JobInfo>, Optional<NotebookInfo>, Optional<String>, Optional<Long>, Optional<String>, Optional<Boolean>, Optional<Map<String, String>>, Optional<String>) - Constructor for class io.delta.standalone.actions.CommitInfo
-
 
-
CommitInfo(Optional<Long>, Timestamp, Optional<String>, Optional<String>, String, Map<String, String>, Optional<JobInfo>, Optional<NotebookInfo>, Optional<String>, Optional<Long>, Optional<String>, Optional<Boolean>, Optional<Map<String, String>>, Optional<String>, Optional<String>) - Constructor for class io.delta.standalone.actions.CommitInfo
-
 
-
CommitInfo.Builder - Class in io.delta.standalone.actions
-
-
Builder class for CommitInfo.
-
-
CommitResult - Class in io.delta.standalone
-
- -
-
CommitResult(long) - Constructor for class io.delta.standalone.CommitResult
-
 
-
ConcurrentAppendException - Exception in io.delta.standalone.exceptions
-
-
Thrown when files are added that would have been read by the current transaction.
-
-
ConcurrentAppendException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentAppendException
-
 
-
ConcurrentDeleteDeleteException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the current transaction deletes data that was deleted by a concurrent transaction.
-
-
ConcurrentDeleteDeleteException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentDeleteDeleteException
-
 
-
ConcurrentDeleteReadException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the current transaction reads data that was deleted by a concurrent transaction.
-
-
ConcurrentDeleteReadException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentDeleteReadException
-
 
-
ConcurrentTransactionException - Exception in io.delta.standalone.exceptions
-
-
Thrown when concurrent transaction both attempt to update the same idempotent transaction.
-
-
ConcurrentTransactionException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentTransactionException
-
 
-
configuration(Map<String, String>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
contains(String) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
containsNull() - Method in class io.delta.standalone.types.ArrayType
-
 
-
copyBuilder() - Method in class io.delta.standalone.actions.Metadata
-
 
-
createdTime(Long) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
createdTime(Optional<Long>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
- - - -

D

-
-
dataType() - Method in class io.delta.standalone.expressions.Column
-
 
-
dataType() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
dataType() - Method in class io.delta.standalone.expressions.Literal
-
 
-
dataType() - Method in interface io.delta.standalone.expressions.Predicate
-
 
-
DataType - Class in io.delta.standalone.types
-
-
The base type of all io.delta.standalone data types.
-
-
DataType() - Constructor for class io.delta.standalone.types.DataType
-
 
-
DateType - Class in io.delta.standalone.types
-
-
A date type, supporting "0001-01-01" through "9999-12-31".
-
-
DateType() - Constructor for class io.delta.standalone.types.DateType
-
 
-
DecimalType - Class in io.delta.standalone.types
-
-
The data type representing java.math.BigDecimal values.
-
-
DecimalType(int, int) - Constructor for class io.delta.standalone.types.DecimalType
-
 
-
DeltaConcurrentModificationException - Exception in io.delta.standalone.exceptions
-
-
The basic class for all Delta Standalone commit conflict exceptions.
-
-
DeltaConcurrentModificationException(String) - Constructor for exception io.delta.standalone.exceptions.DeltaConcurrentModificationException
-
 
-
DeltaLog - Interface in io.delta.standalone
-
-
Represents the transaction logs of a Delta table.
-
-
DeltaScan - Interface in io.delta.standalone
-
-
Provides access to an iterator over the files in this snapshot.
-
-
DeltaStandaloneException - Exception in io.delta.standalone.exceptions
-
-
Thrown when a query fails, usually because the query itself is invalid.
-
-
DeltaStandaloneException() - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
DeltaStandaloneException(String) - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
DeltaStandaloneException(String, Throwable) - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
deltaToParquet(StructType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, Boolean) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, ParquetSchemaConverter.ParquetOutputTimestampType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, Boolean, ParquetSchemaConverter.ParquetOutputTimestampType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
description(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
DoubleType - Class in io.delta.standalone.types
-
-
The data type representing double values.
-
-
DoubleType() - Constructor for class io.delta.standalone.types.DoubleType
-
 
-
- - - -

E

-
-
engineInfo(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.AddFile
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Format
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.JobInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Metadata
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Protocol
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.Column
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.Literal
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.types.ArrayType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.DataType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.DecimalType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
equals(Object) - Method in class io.delta.standalone.types.MapType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.StructField
-
 
-
equals(Object) - Method in class io.delta.standalone.types.StructType
-
 
-
EqualTo - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 = expr2 for new EqualTo(expr1, expr2).
-
-
EqualTo(Expression, Expression) - Constructor for class io.delta.standalone.expressions.EqualTo
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.Column
-
 
-
eval(RowRecord) - Method in interface io.delta.standalone.expressions.Expression
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.In
-
-
This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide.
-
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.IsNotNull
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.IsNull
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.Literal
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
executionTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to execute the entire operation.
-
-
Expression - Interface in io.delta.standalone.expressions
-
-
An expression in Delta Standalone.
-
-
- - - -

F

-
-
False - Static variable in class io.delta.standalone.expressions.Literal
-
 
-
FieldMetadata - Class in io.delta.standalone.types
-
-
The metadata for a given StructField.
-
-
FieldMetadata.Builder - Class in io.delta.standalone.types
-
-
Builder class for FieldMetadata.
-
-
FileAction - Interface in io.delta.standalone.actions
-
-
Generic interface for Actions pertaining to the addition and removal of files.
-
-
FloatType - Class in io.delta.standalone.types
-
-
The data type representing float values.
-
-
FloatType() - Constructor for class io.delta.standalone.types.FloatType
-
 
-
Format - Class in io.delta.standalone.actions
-
-
A specification of the encoding for the files stored in a table.
-
-
Format(String, Map<String, String>) - Constructor for class io.delta.standalone.actions.Format
-
 
-
Format() - Constructor for class io.delta.standalone.actions.Format
-
 
-
format(Format) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
forTable(Configuration, String) - Static method in interface io.delta.standalone.DeltaLog
-
-
Create a DeltaLog instance representing the table located at the provided - path.
-
-
forTable(Configuration, Path) - Static method in interface io.delta.standalone.DeltaLog
-
-
Create a DeltaLog instance representing the table located at the provided - path.
-
-
- - - -

G

-
-
get(String) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
get(String) - Method in class io.delta.standalone.types.StructType
-
 
-
getActions() - Method in class io.delta.standalone.VersionLog
-
 
-
getAllFiles() - Method in interface io.delta.standalone.Snapshot
-
 
-
getAppId() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getBigDecimal(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.math.BigDecimal.
-
-
getBinary(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as binary (byte array).
-
-
getBoolean(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive boolean.
-
-
getByte(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive byte.
-
-
getCatalogString() - Method in class io.delta.standalone.types.DataType
-
 
-
getChanges(long, boolean) - Method in interface io.delta.standalone.DeltaLog
-
-
Get all actions starting from startVersion (inclusive) in increasing order of - committed version.
-
-
getChild() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
getClusterId() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getCommitInfoAt(long) - Method in interface io.delta.standalone.DeltaLog
-
 
-
getConfiguration() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getCreatedTime() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getDataType() - Method in class io.delta.standalone.types.StructField
-
 
-
getDate(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.sql.Date.
-
-
getDeletionTimestamp() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getDescription() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getDouble(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive double.
-
-
getElementType() - Method in class io.delta.standalone.types.ArrayType
-
 
-
getEngineInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getEntries() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
getFieldNames() - Method in class io.delta.standalone.types.StructType
-
 
-
getFields() - Method in class io.delta.standalone.types.StructType
-
 
-
getFiles() - Method in interface io.delta.standalone.DeltaScan
-
-
Creates a CloseableIterator over files belonging to this snapshot.
-
-
getFloat(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive float.
-
-
getFormat() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getId() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getInputPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getInt(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive int.
-
-
getIsBlindAppend() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getIsolationLevel() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getJobId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getJobInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getJobName() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getJobOwnerId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getKeyType() - Method in class io.delta.standalone.types.MapType
-
 
-
getLastUpdated() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getLeft() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
getLength() - Method in interface io.delta.standalone.data.RowRecord
-
 
-
getList(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.util.List<T> object.
-
-
getLong(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive long.
-
-
getMap(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
-
-
getMetadata() - Method in interface io.delta.standalone.Snapshot
-
 
-
getMetadata() - Method in class io.delta.standalone.types.StructField
-
 
-
getMetrics() - Method in class io.delta.standalone.Operation
-
 
-
getMinReaderVersion() - Method in class io.delta.standalone.actions.Protocol
-
 
-
getMinWriterVersion() - Method in class io.delta.standalone.actions.Protocol
-
 
-
getModificationTime() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getName() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getName() - Method in class io.delta.standalone.Operation
-
 
-
getName() - Method in class io.delta.standalone.types.StructField
-
 
-
getNotebookId() - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
getNotebookInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperation() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperationMetrics() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperationParameters() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOptions() - Method in class io.delta.standalone.actions.Format
-
 
-
getParameters() - Method in class io.delta.standalone.Operation
-
 
-
getPartitionColumns() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getPath() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getPath() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getPath() - Method in interface io.delta.standalone.actions.FileAction
-
 
-
getPath() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getPath() - Method in interface io.delta.standalone.DeltaLog
-
 
-
getPrecision() - Method in class io.delta.standalone.types.DecimalType
-
 
-
getProvider() - Method in class io.delta.standalone.actions.Format
-
 
-
getPushedPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getReadVersion() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getRecord(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a RowRecord object.
-
-
getResidualPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getRight() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
getRunId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getScale() - Method in class io.delta.standalone.types.DecimalType
-
 
-
getSchema() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getSchema() - Method in interface io.delta.standalone.data.RowRecord
-
 
-
getShort(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive short.
-
-
getSimpleString() - Method in class io.delta.standalone.types.ByteType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.DataType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.IntegerType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.LongType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.ShortType
-
 
-
getSize() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getSize() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getSize() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getSnapshotForTimestampAsOf(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Travel back in time to the latest Snapshot that was generated at or before - timestamp.
-
-
getSnapshotForVersionAsOf(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Travel back in time to the Snapshot with the provided version number.
-
-
getStats() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getString(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a String object.
-
-
getTags() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getTags() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getTags() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getTimestamp() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getTimestamp(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.sql.Timestamp.
-
-
getTreeString() - Method in class io.delta.standalone.types.StructType
-
 
-
getTriggerType() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getTypeName() - Method in class io.delta.standalone.types.DataType
-
 
-
getUserId() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getUserMetadata() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getUserMetadata() - Method in class io.delta.standalone.Operation
-
 
-
getUserName() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getValueType() - Method in class io.delta.standalone.types.MapType
-
 
-
getVersion() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getVersion() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getVersion() - Method in class io.delta.standalone.CommitResult
-
 
-
getVersion() - Method in interface io.delta.standalone.Snapshot
-
 
-
getVersion() - Method in class io.delta.standalone.VersionLog
-
 
-
GreaterThan - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 > expr2 for new GreaterThan(expr1, expr2).
-
-
GreaterThan(Expression, Expression) - Constructor for class io.delta.standalone.expressions.GreaterThan
-
 
-
GreaterThanOrEqual - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 >= expr2 for new GreaterThanOrEqual(expr1, expr2).
-
-
GreaterThanOrEqual(Expression, Expression) - Constructor for class io.delta.standalone.expressions.GreaterThanOrEqual
-
 
-
- - - -

H

-
-
hashCode() - Method in class io.delta.standalone.actions.AddFile
-
 
-
hashCode() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Format
-
 
-
hashCode() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Metadata
-
 
-
hashCode() - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Protocol
-
 
-
hashCode() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.Column
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.Literal
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
hashCode() - Method in class io.delta.standalone.types.ArrayType
-
 
-
hashCode() - Method in class io.delta.standalone.types.DataType
-
 
-
hashCode() - Method in class io.delta.standalone.types.DecimalType
-
 
-
hashCode() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
hashCode() - Method in class io.delta.standalone.types.MapType
-
 
-
hashCode() - Method in class io.delta.standalone.types.StructField
-
 
-
hashCode() - Method in class io.delta.standalone.types.StructType
-
 
-
- - - -

I

-
-
id(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
In - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is in exprList for new In(expr, exprList).
-
-
In(Expression, List<? extends Expression>) - Constructor for class io.delta.standalone.expressions.In
-
 
-
initHadoopConf() - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
IntegerType - Class in io.delta.standalone.types
-
-
The data type representing int values.
-
-
IntegerType() - Constructor for class io.delta.standalone.types.IntegerType
-
 
-
io.delta.standalone - package io.delta.standalone
-
 
-
io.delta.standalone.actions - package io.delta.standalone.actions
-
 
-
io.delta.standalone.data - package io.delta.standalone.data
-
 
-
io.delta.standalone.exceptions - package io.delta.standalone.exceptions
-
 
-
io.delta.standalone.expressions - package io.delta.standalone.expressions
-
 
-
io.delta.standalone.storage - package io.delta.standalone.storage
-
 
-
io.delta.standalone.types - package io.delta.standalone.types
-
 
-
io.delta.standalone.util - package io.delta.standalone.util
-
 
-
isBlindAppend(Boolean) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.AddFile
-
 
-
isDataChange() - Method in interface io.delta.standalone.actions.FileAction
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
isExtendedFileMetadata() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
IsNotNull - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is not null for new IsNotNull(expr).
-
-
IsNotNull(Expression) - Constructor for class io.delta.standalone.expressions.IsNotNull
-
 
-
IsNull - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is null for new IsNull(expr).
-
-
IsNull(Expression) - Constructor for class io.delta.standalone.expressions.IsNull
-
 
-
isNullable() - Method in class io.delta.standalone.types.StructField
-
 
-
isNullAt(String) - Method in interface io.delta.standalone.data.RowRecord
-
 
-
isolationLevel(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
isPartialWriteVisible(Path, Configuration) - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
isWriteCompatible(StructType) - Method in class io.delta.standalone.types.StructType
-
-
Whether a new schema can replace this existing schema in a Delta table without rewriting data - files in the table.
-
-
- - - -

J

-
-
jobInfo(JobInfo) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
JobInfo - Class in io.delta.standalone.actions
-
-
Represents the Databricks Job information that committed to the Delta table.
-
-
JobInfo(String, String, String, String, String) - Constructor for class io.delta.standalone.actions.JobInfo
-
 
-
JobInfo.Builder - Class in io.delta.standalone.actions
-
-
Builder class for JobInfo.
-
-
jobName(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
jobOwnerId(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
- - - -

L

-
-
LeafExpression - Class in io.delta.standalone.expressions
-
-
An Expression with no children.
-
-
length() - Method in class io.delta.standalone.types.StructType
-
 
-
LessThan - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 < expr2 for new LessThan(expr1, expr2).
-
-
LessThan(Expression, Expression) - Constructor for class io.delta.standalone.expressions.LessThan
-
 
-
LessThanOrEqual - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 <= expr2 for new LessThanOrEqual(expr1, expr2).
-
-
LessThanOrEqual(Expression, Expression) - Constructor for class io.delta.standalone.expressions.LessThanOrEqual
-
 
-
listFrom(Path, Configuration) - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
Literal - Class in io.delta.standalone.expressions
-
-
A literal value.
-
-
LogStore - Class in io.delta.standalone.storage
-
-
:: DeveloperApi ::
-
-
LogStore(Configuration) - Constructor for class io.delta.standalone.storage.LogStore
-
 
-
LongType - Class in io.delta.standalone.types
-
-
The data type representing long values.
-
-
LongType() - Constructor for class io.delta.standalone.types.LongType
-
 
-
- - - -

M

-
-
MapType - Class in io.delta.standalone.types
-
-
The data type for Maps.
-
-
MapType(DataType, DataType, boolean) - Constructor for class io.delta.standalone.types.MapType
-
 
-
markFilesAsRead(Expression) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Mark files matched by the readPredicate as read by this transaction.
-
-
Metadata - Class in io.delta.standalone.actions
-
-
Updates the metadata of the table.
-
-
Metadata(String, String, String, Format, List<String>, Map<String, String>, Optional<Long>, StructType) - Constructor for class io.delta.standalone.actions.Metadata
-
 
-
metadata() - Method in interface io.delta.standalone.OptimisticTransaction
-
 
-
Metadata.Builder - Class in io.delta.standalone.actions
-
-
Builder class for Metadata.
-
-
MetadataChangedException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the metadata of the Delta table has changed between the time of read - and the time of commit.
-
-
MetadataChangedException(String) - Constructor for exception io.delta.standalone.exceptions.MetadataChangedException
-
 
-
Metrics() - Constructor for class io.delta.standalone.Operation.Metrics
-
 
-
- - - -

N

-
-
name(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
name() - Method in class io.delta.standalone.expressions.Column
-
 
-
Not - Class in io.delta.standalone.expressions
-
-
Evaluates logical NOT expr for new Not(expr).
-
-
Not(Expression) - Constructor for class io.delta.standalone.expressions.Not
-
 
-
notebookInfo(NotebookInfo) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
NotebookInfo - Class in io.delta.standalone.actions
-
-
Represents the Databricks Notebook information that committed to the Delta table.
-
-
NotebookInfo(String) - Constructor for class io.delta.standalone.actions.NotebookInfo
-
 
-
nullSafeEval(Object, Object) - Method in class io.delta.standalone.expressions.And
-
 
-
nullSafeEval(Object) - Method in class io.delta.standalone.expressions.Not
-
 
-
nullSafeEval(Object, Object) - Method in class io.delta.standalone.expressions.Or
-
 
-
NullType - Class in io.delta.standalone.types
-
-
The data type representing null values.
-
-
NullType() - Constructor for class io.delta.standalone.types.NullType
-
 
-
numAddedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files added.
-
-
numConvertedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of parquet files that have been converted.
-
-
numCopiedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows copied in the process of deleting files.
-
-
numDeletedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows removed.
-
-
numFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files written.
-
-
numOutputBytes - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Size in bytes of the written contents.
-
-
numOutputRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows written.
-
-
numRemovedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files removed.
-
-
numSourceRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows in the source table.
-
-
numTargetFilesAdded - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number files added to the sink(target).
-
-
numTargetFilesRemoved - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files removed from the sink(target).
-
-
numTargetRowsCopied - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of target rows copied.
-
-
numTargetRowsDeleted - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows deleted in the target table.
-
-
numTargetRowsInserted - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows inserted into the target table.
-
-
numTargetRowsUpdated - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows updated in the target table.
-
-
numUpdatedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows updated.
-
-
- - - -

O

-
-
of(int) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(boolean) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(byte[]) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(Date) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(BigDecimal) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(double) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(float) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(long) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(short) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(String) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(Timestamp) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(byte) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
ofNull(DataType) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
open() - Method in interface io.delta.standalone.Snapshot
-
-
Creates a CloseableIterator which can iterate over data belonging to this snapshot.
-
-
operation(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
Operation - Class in io.delta.standalone
-
-
An operation that can be performed on a Delta table.
-
-
Operation(Operation.Name) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>, Map<String, String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>, Map<String, String>, Optional<String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation.Metrics - Class in io.delta.standalone
-
-
Some possible operation metrics and their suggested corresponding operation types.
-
-
Operation.Name - Enum in io.delta.standalone
-
-
Supported operation types.
-
-
operationMetrics(Map<String, String>) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
operationParameters(Map<String, String>) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
OptimisticTransaction - Interface in io.delta.standalone
-
-
Used to perform a set of reads in a transaction and then commit a set of updates to the - state of the log.
-
-
Or - Class in io.delta.standalone.expressions
-
-
Evaluates logical expr1 OR expr2 for new Or(expr1, expr2).
-
-
Or(Expression, Expression) - Constructor for class io.delta.standalone.expressions.Or
-
 
-
outputTimestampTypeDefault - Static variable in class io.delta.standalone.util.ParquetSchemaConverter
-
 
-
- - - -

P

-
-
ParquetSchemaConverter - Class in io.delta.standalone.util
-
-
:: DeveloperApi ::
-
-
ParquetSchemaConverter.ParquetOutputTimestampType - Enum in io.delta.standalone.util
-
-
:: DeveloperApi ::
-
-
partitionColumns(List<String>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
Predicate - Interface in io.delta.standalone.expressions
-
-
An Expression that defines a relation on inputs.
-
-
Protocol - Class in io.delta.standalone.actions
-
-
Used to block older clients from reading or writing the log when backwards - incompatible changes are made to the protocol.
-
-
Protocol(int, int) - Constructor for class io.delta.standalone.actions.Protocol
-
 
-
ProtocolChangedException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the protocol version has changed between the time of read and the time of commit.
-
-
ProtocolChangedException(String) - Constructor for exception io.delta.standalone.exceptions.ProtocolChangedException
-
 
-
putBoolean(String, boolean) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putBooleanArray(String, Boolean[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putDouble(String, double) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putDoubleArray(String, Double[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putLong(String, long) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putLongArray(String, Long[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putMetadata(String, FieldMetadata) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putMetadataArray(String, FieldMetadata[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putNull(String) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putString(String, String) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putStringArray(String, String[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
- - - -

R

-
-
read(Path, Configuration) - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
readVersion(Long) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
readWholeTable() - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Mark the entire table as tainted (i.e.
-
-
references() - Method in class io.delta.standalone.expressions.Column
-
 
-
references() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
references() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
remove() - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(long) - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(boolean) - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(long, boolean) - Method in class io.delta.standalone.actions.AddFile
-
 
-
RemoveFile - Class in io.delta.standalone.actions
-
-
Logical removal of a given file from the reservoir.
-
-
RemoveFile(String, Optional<Long>, boolean, boolean, Map<String, String>, Optional<Long>, Map<String, String>) - Constructor for class io.delta.standalone.actions.RemoveFile
-
-
Deprecated. -
RemoveFile should be created from AddFile.remove() instead.
-
-
-
resolvePathOnPhysicalStorage(Path, Configuration) - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
rewriteTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to rewrite the matched files.
-
-
RowRecord - Interface in io.delta.standalone.data
-
-
Represents one row of data containing a non-empty collection of fieldName - value pairs.
-
-
runId(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
- - - -

S

-
-
scan() - Method in interface io.delta.standalone.Snapshot
-
 
-
scan(Expression) - Method in interface io.delta.standalone.Snapshot
-
 
-
scanTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to scan the files for matches.
-
-
schema(StructType) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
SetTransaction - Class in io.delta.standalone.actions
-
-
Sets the committed version for a given application.
-
-
SetTransaction(String, long, Optional<Long>) - Constructor for class io.delta.standalone.actions.SetTransaction
-
 
-
ShortType - Class in io.delta.standalone.types
-
-
The data type representing short values.
-
-
ShortType() - Constructor for class io.delta.standalone.types.ShortType
-
 
-
snapshot() - Method in interface io.delta.standalone.DeltaLog
-
 
-
Snapshot - Interface in io.delta.standalone
-
-
Snapshot provides APIs to access the Delta table state (such as table metadata, active - files) at some version.
-
-
startTransaction() - Method in interface io.delta.standalone.DeltaLog
-
-
Returns a new OptimisticTransaction that can be used to read the current state of the - log and then commit updates.
-
-
stats(String) - Method in class io.delta.standalone.actions.AddFile.Builder
-
 
-
StringType - Class in io.delta.standalone.types
-
-
The data type representing String values.
-
-
StringType() - Constructor for class io.delta.standalone.types.StringType
-
 
-
StructField - Class in io.delta.standalone.types
-
-
A field inside a StructType.
-
-
StructField(String, DataType) - Constructor for class io.delta.standalone.types.StructField
-
-
Constructor with default nullable = true.
-
-
StructField(String, DataType, boolean) - Constructor for class io.delta.standalone.types.StructField
-
 
-
StructField(String, DataType, boolean, FieldMetadata) - Constructor for class io.delta.standalone.types.StructField
-
 
-
StructType - Class in io.delta.standalone.types
-
-
The data type representing a table's schema, consisting of a collection of - fields (that is, fieldName to dataType pairs).
-
-
StructType() - Constructor for class io.delta.standalone.types.StructType
-
 
-
StructType(StructField[]) - Constructor for class io.delta.standalone.types.StructType
-
 
-
- - - -

T

-
-
tableExists() - Method in interface io.delta.standalone.DeltaLog
-
 
-
tags(Map<String, String>) - Method in class io.delta.standalone.actions.AddFile.Builder
-
 
-
timestamp(Timestamp) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
TimestampType - Class in io.delta.standalone.types
-
-
The data type representing java.sql.Timestamp values.
-
-
TimestampType() - Constructor for class io.delta.standalone.types.TimestampType
-
 
-
toJson() - Method in class io.delta.standalone.types.DataType
-
 
-
toPrettyJson() - Method in class io.delta.standalone.types.DataType
-
 
-
toString() - Method in class io.delta.standalone.expressions.BinaryOperator
-
 
-
toString() - Method in class io.delta.standalone.expressions.Column
-
 
-
toString() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
toString() - Method in class io.delta.standalone.expressions.In
-
 
-
toString() - Method in class io.delta.standalone.expressions.IsNotNull
-
 
-
toString() - Method in class io.delta.standalone.expressions.IsNull
-
 
-
toString() - Method in class io.delta.standalone.expressions.Literal
-
 
-
toString() - Method in class io.delta.standalone.expressions.Not
-
 
-
toString() - Method in enum io.delta.standalone.Operation.Name
-
 
-
toString() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
triggerType(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
True - Static variable in class io.delta.standalone.expressions.Literal
-
 
-
txnVersion(String) - Method in interface io.delta.standalone.OptimisticTransaction
-
 
-
- - - -

U

-
-
UnaryExpression - Class in io.delta.standalone.expressions
-
-
An Expression with one input and one output.
-
-
update() - Method in interface io.delta.standalone.DeltaLog
-
-
Bring DeltaLog's current Snapshot to the latest state if there are any new - transaction logs.
-
-
updateMetadata(Metadata) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Records an update to the metadata that should be committed with this transaction.
-
-
USER_DEFAULT - Static variable in class io.delta.standalone.types.DecimalType
-
 
-
userId(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
userMetadata(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
userName(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
- - - -

V

-
-
value() - Method in class io.delta.standalone.expressions.Literal
-
 
-
valueContainsNull() - Method in class io.delta.standalone.types.MapType
-
 
-
valueOf(String) - Static method in enum io.delta.standalone.Operation.Name
-
-
Returns the enum constant of this type with the specified name.
-
-
valueOf(String) - Static method in enum io.delta.standalone.util.ParquetSchemaConverter.ParquetOutputTimestampType
-
-
Returns the enum constant of this type with the specified name.
-
-
values() - Static method in enum io.delta.standalone.Operation.Name
-
-
Returns an array containing the constants of this enum type, in -the order they are declared.
-
-
values() - Static method in enum io.delta.standalone.util.ParquetSchemaConverter.ParquetOutputTimestampType
-
-
Returns an array containing the constants of this enum type, in -the order they are declared.
-
-
version(Long) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
VersionLog - Class in io.delta.standalone
-
-
VersionLog is the representation of all actions (changes) to the Delta Table - at a specific table version.
-
-
VersionLog(long, List<Action>) - Constructor for class io.delta.standalone.VersionLog
-
 
-
- - - -

W

-
-
write(Path, Iterator<String>, Boolean, Configuration) - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
writeLegacyParquetFormatDefault - Static variable in class io.delta.standalone.util.ParquetSchemaConverter
-
 
-
-A B C D E F G H I J L M N O P R S T U V W 
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/index.html b/connectors/docs/0.3.0/delta-standalone/api/java/index.html deleted file mode 100644 index 9eef0e2465d..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - -Delta Standalone Reader 0.3.0 JavaDoc - - - - - - - - - -<noscript> -<div>JavaScript is disabled on your browser.</div> -</noscript> -<h2>Frame Alert</h2> -<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html deleted file mode 100644 index f45e5e62438..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - -CommitResult (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class CommitResult

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      CommitResult(long version) 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - -
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      longgetVersion() 
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CommitResult

        -
        public CommitResult(long version)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the table version that was committed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html deleted file mode 100644 index efd55c2ef3e..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html +++ /dev/null @@ -1,472 +0,0 @@ - - - - - -DeltaLog (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface DeltaLog

-
-
-
-
    -
  • -
    -
    -
    public interface DeltaLog
    -
    Represents the transaction logs of a Delta table. It provides APIs to access the states of a - Delta table. -

    - You can use the following code to create a DeltaLog instance. -

    
    -   Configuration conf = ... // Create your own Hadoop Configuration instance
    -   DeltaLog deltaLog = DeltaLog.forTable(conf, "/the/delta/table/path");
    - 
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        snapshot

        -
        Snapshot snapshot()
        -
        -
        Returns:
        -
        the current Snapshot of the Delta table. You may need to call - update() to access the latest snapshot if the current snapshot is stale.
        -
        -
      • -
      - - - -
        -
      • -

        update

        -
        Snapshot update()
        -
        Bring DeltaLog's current Snapshot to the latest state if there are any new - transaction logs.
        -
        -
        Returns:
        -
        the latest snapshot after applying the new transaction logs.
        -
        -
      • -
      - - - -
        -
      • -

        getSnapshotForVersionAsOf

        -
        Snapshot getSnapshotForVersionAsOf(long version)
        -
        Travel back in time to the Snapshot with the provided version number.
        -
        -
        Parameters:
        -
        version - the snapshot version to generate
        -
        Returns:
        -
        the snapshot at the provided version
        -
        Throws:
        -
        IllegalArgumentException - if the version is outside the range of available - versions
        -
        -
      • -
      - - - -
        -
      • -

        getSnapshotForTimestampAsOf

        -
        Snapshot getSnapshotForTimestampAsOf(long timestamp)
        -
        Travel back in time to the latest Snapshot that was generated at or before - timestamp.
        -
        -
        Parameters:
        -
        timestamp - the number of milliseconds since midnight, January 1, 1970 UTC
        -
        Returns:
        -
        the snapshot nearest to, but not after, the provided timestamp
        -
        Throws:
        -
        RuntimeException - if the snapshot is unable to be recreated
        -
        IllegalArgumentException - if the timestamp is before the earliest possible - snapshot or after the latest possible snapshot
        -
        -
      • -
      - - - -
        -
      • -

        startTransaction

        -
        OptimisticTransaction startTransaction()
        -
        Returns a new OptimisticTransaction that can be used to read the current state of the - log and then commit updates. The reads and updates will be checked for logical conflicts - with any concurrent writes to the log. -

        - Note that all reads in a transaction must go through the returned transaction object, and not - directly to the DeltaLog otherwise they will not be checked for conflicts.

        -
        -
        Returns:
        -
        a new OptimisticTransaction.
        -
        -
      • -
      - - - -
        -
      • -

        getCommitInfoAt

        -
        CommitInfo getCommitInfoAt(long version)
        -
        -
        Parameters:
        -
        version - the commit version to retrieve CommitInfo
        -
        Returns:
        -
        the CommitInfo of the commit at the provided version.
        -
        -
      • -
      - - - -
        -
      • -

        getPath

        -
        org.apache.hadoop.fs.Path getPath()
        -
        -
        Returns:
        -
        the path of the Delta table.
        -
        -
      • -
      - - - -
        -
      • -

        getChanges

        -
        java.util.Iterator<VersionLog> getChanges(long startVersion,
        -                                          boolean failOnDataLoss)
        -
        Get all actions starting from startVersion (inclusive) in increasing order of - committed version. -

        - If startVersion doesn't exist, return an empty Iterator.

        -
        -
        Parameters:
        -
        startVersion - the table version to begin retrieving actions from (inclusive)
        -
        failOnDataLoss - whether to throw when data loss detected
        -
        Returns:
        -
        an Iterator of VersionLogs starting from startVersion
        -
        Throws:
        -
        IllegalArgumentException - if startVersion is negative
        -
        IllegalStateException - if data loss detected and failOnDataLoss is true
        -
        -
      • -
      - - - -
        -
      • -

        tableExists

        -
        boolean tableExists()
        -
        -
        Returns:
        -
        Whether a Delta table exists at this directory.
        -
        -
      • -
      - - - -
        -
      • -

        forTable

        -
        static DeltaLog forTable(org.apache.hadoop.conf.Configuration hadoopConf,
        -                         String path)
        -
        Create a DeltaLog instance representing the table located at the provided - path.
        -
        -
        Parameters:
        -
        hadoopConf - Hadoop Configuration to use when accessing the Delta table
        -
        path - the path to the Delta table
        -
        Returns:
        -
        the DeltaLog for the provided path
        -
        -
      • -
      - - - -
        -
      • -

        forTable

        -
        static DeltaLog forTable(org.apache.hadoop.conf.Configuration hadoopConf,
        -                         org.apache.hadoop.fs.Path path)
        -
        Create a DeltaLog instance representing the table located at the provided - path.
        -
        -
        Parameters:
        -
        hadoopConf - Hadoop Configuration to use when accessing the Delta table
        -
        path - the path to the Delta table
        -
        Returns:
        -
        the DeltaLog for the provided path
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html deleted file mode 100644 index 1c7c9e75797..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - -DeltaScan (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface DeltaScan

-
-
-
-
    -
  • -
    -
    -
    public interface DeltaScan
    -
    Provides access to an iterator over the files in this snapshot. -

    - Typically created with a read predicate Expression to let users filter files. Please note - filtering is only supported on partition columns and users should use - getResidualPredicate() to check for any unapplied portion of the input - predicate.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        getInputPredicate

        -
        java.util.Optional<Expression> getInputPredicate()
        -
        -
        Returns:
        -
        the input predicate passed in by the user
        -
        -
      • -
      - - - -
        -
      • -

        getPushedPredicate

        -
        java.util.Optional<Expression> getPushedPredicate()
        -
        -
        Returns:
        -
        portion of the input predicate that can be evaluated by Delta Standalone using only - metadata (filters on partition columns). Files returned by getFiles() are - guaranteed to satisfy the pushed predicate, and the caller doesn’t need to apply them - again on the returned files.
        -
        -
      • -
      - - - -
        -
      • -

        getResidualPredicate

        -
        java.util.Optional<Expression> getResidualPredicate()
        -
        -
        Returns:
        -
        portion of the input predicate that may not be fully applied. Files returned by - getFiles() are not guaranteed to satisfy the residual predicate, and the - caller should still apply them on the returned files.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html deleted file mode 100644 index dee91387e16..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html +++ /dev/null @@ -1,683 +0,0 @@ - - - - - -Operation.Metrics (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class Operation.Metrics

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    Operation
    -
    -
    -
    -
    public static class Operation.Metrics
    -extends Object
    -
    Some possible operation metrics and their suggested corresponding operation types. - These are purely exemplary, and users may use whichever metrics best fit their application.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Field Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Fields 
      Modifier and TypeField and Description
      static StringexecutionTimeMs -
      Time taken to execute the entire operation.
      -
      static StringnumAddedFiles -
      Number of files added.
      -
      static StringnumConvertedFiles -
      Number of parquet files that have been converted.
      -
      static StringnumCopiedRows -
      Number of rows copied in the process of deleting files.
      -
      static StringnumDeletedRows -
      Number of rows removed.
      -
      static StringnumFiles -
      Number of files written.
      -
      static StringnumOutputBytes -
      Size in bytes of the written contents.
      -
      static StringnumOutputRows -
      Number of rows written.
      -
      static StringnumRemovedFiles -
      Number of files removed.
      -
      static StringnumSourceRows -
      Number of rows in the source table.
      -
      static StringnumTargetFilesAdded -
      Number files added to the sink(target).
      -
      static StringnumTargetFilesRemoved -
      Number of files removed from the sink(target).
      -
      static StringnumTargetRowsCopied -
      Number of target rows copied.
      -
      static StringnumTargetRowsDeleted -
      Number of rows deleted in the target table.
      -
      static StringnumTargetRowsInserted -
      Number of rows inserted into the target table.
      -
      static StringnumTargetRowsUpdated -
      Number of rows updated in the target table.
      -
      static StringnumUpdatedRows -
      Number of rows updated.
      -
      static StringrewriteTimeMs -
      Time taken to rewrite the matched files.
      -
      static StringscanTimeMs -
      Time taken to scan the files for matches.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Metrics() 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        numFiles

        -
        public static final String numFiles
        -
        Number of files written. - - Usually used with the WRITE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numOutputBytes

        -
        public static final String numOutputBytes
        -
        Size in bytes of the written contents. - - Usually used with WRITE, STREAMING_UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numOutputRows

        -
        public static final String numOutputRows
        -
        Number of rows written. - - Usually used with WRITE, STREAMING_UPDATE, MERGE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numAddedFiles

        -
        public static final String numAddedFiles
        -
        Number of files added. - - Usually used with STREAMING_UPDATE, DELETE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numRemovedFiles

        -
        public static final String numRemovedFiles
        -
        Number of files removed. - - Usually used with STREAMING_UPDATE, DELETE, DELETE_PARTITIONS, TRUNCATE, - UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numDeletedRows

        -
        public static final String numDeletedRows
        -
        Number of rows removed. - - Usually used with the DELETE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numCopiedRows

        -
        public static final String numCopiedRows
        -
        Number of rows copied in the process of deleting files. - - Usually used with DELETE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        executionTimeMs

        -
        public static final String executionTimeMs
        -
        Time taken to execute the entire operation. - - Usually used with DELETE, DELETE_PARTITIONS, TRUNCATE, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        scanTimeMs

        -
        public static final String scanTimeMs
        -
        Time taken to scan the files for matches. - - Usually used with DELETE, DELETE_PARTITIONS, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        rewriteTimeMs

        -
        public static final String rewriteTimeMs
        -
        Time taken to rewrite the matched files. - - Usually used with DELETE, DELETE_PARTITIONS, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numConvertedFiles

        -
        public static final String numConvertedFiles
        -
        Number of parquet files that have been converted. - - Usually used with the CONVERT operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numSourceRows

        -
        public static final String numSourceRows
        -
        Number of rows in the source table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsInserted

        -
        public static final String numTargetRowsInserted
        -
        Number of rows inserted into the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsUpdated

        -
        public static final String numTargetRowsUpdated
        -
        Number of rows updated in the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsDeleted

        -
        public static final String numTargetRowsDeleted
        -
        Number of rows deleted in the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsCopied

        -
        public static final String numTargetRowsCopied
        -
        Number of target rows copied. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetFilesAdded

        -
        public static final String numTargetFilesAdded
        -
        Number files added to the sink(target). - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetFilesRemoved

        -
        public static final String numTargetFilesRemoved
        -
        Number of files removed from the sink(target). - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numUpdatedRows

        -
        public static final String numUpdatedRows
        -
        Number of rows updated. - - Usually used with the UPDATE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Metrics

        -
        public Metrics()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html deleted file mode 100644 index 60a860c1205..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html +++ /dev/null @@ -1,589 +0,0 @@ - - - - - -Operation.Name (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Enum Operation.Name

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable, Comparable<Operation.Name>
    -
    -
    -
    Enclosing class:
    -
    Operation
    -
    -
    -
    -
    public static enum Operation.Name
    -extends Enum<Operation.Name>
    -
    Supported operation types.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Enum Constant Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Enum Constants 
      Enum Constant and Description
      ADD_COLUMNS -
      Recorded when columns are added.
      -
      CHANGE_COLUMN -
      Recorded when columns are changed.
      -
      CONVERT -
      Recorded when converting a table into a Delta table.
      -
      CREATE_TABLE -
      Recorded when the table is created.
      -
      DELETE -
      Recorded while deleting certain partitions.
      -
      MANUAL_UPDATE 
      MERGE -
      Recorded when a merge operation is committed to the table.
      -
      REPLACE_COLUMNS -
      Recorded when columns are replaced.
      -
      REPLACE_TABLE -
      Recorded when the table is replaced.
      -
      SET_TABLE_PROPERTIES -
      Recorded when the table properties are set.
      -
      STREAMING_UPDATE -
      Recorded during streaming inserts.
      -
      TRUNCATE -
      Recorded when truncating the table.
      -
      UNSET_TABLE_PROPERTIES -
      Recorded when the table properties are unset.
      -
      UPDATE -
      Recorded when an update operation is committed to the table.
      -
      UPGRADE_PROTOCOL -
      Recorded when the table protocol is upgraded.
      -
      UPGRADE_SCHEMA -
      Recorded when the table schema is upgraded.
      -
      WRITE -
      Recorded during batch inserts.
      -
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - -
      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      StringtoString() 
      static Operation.NamevalueOf(String name) -
      Returns the enum constant of this type with the specified name.
      -
      static Operation.Name[]values() -
      Returns an array containing the constants of this enum type, in -the order they are declared.
      -
      -
        -
      • - - -

        Methods inherited from class Enum

        -compareTo, equals, getDeclaringClass, hashCode, name, ordinal, valueOf
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -getClass, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Enum Constant Detail

      - - - -
        -
      • -

        WRITE

        -
        public static final Operation.Name WRITE
        -
        Recorded during batch inserts.
        -
      • -
      - - - -
        -
      • -

        STREAMING_UPDATE

        -
        public static final Operation.Name STREAMING_UPDATE
        -
        Recorded during streaming inserts.
        -
      • -
      - - - -
        -
      • -

        DELETE

        -
        public static final Operation.Name DELETE
        -
        Recorded while deleting certain partitions.
        -
      • -
      - - - -
        -
      • -

        TRUNCATE

        -
        public static final Operation.Name TRUNCATE
        -
        Recorded when truncating the table.
        -
      • -
      - - - -
        -
      • -

        CONVERT

        -
        public static final Operation.Name CONVERT
        -
        Recorded when converting a table into a Delta table.
        -
      • -
      - - - -
        -
      • -

        MERGE

        -
        public static final Operation.Name MERGE
        -
        Recorded when a merge operation is committed to the table.
        -
      • -
      - - - -
        -
      • -

        UPDATE

        -
        public static final Operation.Name UPDATE
        -
        Recorded when an update operation is committed to the table.
        -
      • -
      - - - -
        -
      • -

        CREATE_TABLE

        -
        public static final Operation.Name CREATE_TABLE
        -
        Recorded when the table is created.
        -
      • -
      - - - -
        -
      • -

        REPLACE_TABLE

        -
        public static final Operation.Name REPLACE_TABLE
        -
        Recorded when the table is replaced.
        -
      • -
      - - - -
        -
      • -

        SET_TABLE_PROPERTIES

        -
        public static final Operation.Name SET_TABLE_PROPERTIES
        -
        Recorded when the table properties are set.
        -
      • -
      - - - -
        -
      • -

        UNSET_TABLE_PROPERTIES

        -
        public static final Operation.Name UNSET_TABLE_PROPERTIES
        -
        Recorded when the table properties are unset.
        -
      • -
      - - - -
        -
      • -

        ADD_COLUMNS

        -
        public static final Operation.Name ADD_COLUMNS
        -
        Recorded when columns are added.
        -
      • -
      - - - -
        -
      • -

        CHANGE_COLUMN

        -
        public static final Operation.Name CHANGE_COLUMN
        -
        Recorded when columns are changed.
        -
      • -
      - - - -
        -
      • -

        REPLACE_COLUMNS

        -
        public static final Operation.Name REPLACE_COLUMNS
        -
        Recorded when columns are replaced.
        -
      • -
      - - - -
        -
      • -

        UPGRADE_PROTOCOL

        -
        public static final Operation.Name UPGRADE_PROTOCOL
        -
        Recorded when the table protocol is upgraded.
        -
      • -
      - - - -
        -
      • -

        UPGRADE_SCHEMA

        -
        public static final Operation.Name UPGRADE_SCHEMA
        -
        Recorded when the table schema is upgraded.
        -
      • -
      - - - -
        -
      • -

        MANUAL_UPDATE

        -
        public static final Operation.Name MANUAL_UPDATE
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        values

        -
        public static Operation.Name[] values()
        -
        Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
        -for (Operation.Name c : Operation.Name.values())
        -    System.out.println(c);
        -
        -
        -
        Returns:
        -
        an array containing the constants of this enum type, in the order they are declared
        -
        -
      • -
      - - - -
        -
      • -

        valueOf

        -
        public static Operation.Name valueOf(String name)
        -
        Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.)
        -
        -
        Parameters:
        -
        name - the name of the enum constant to be returned.
        -
        Returns:
        -
        the enum constant with the specified name
        -
        Throws:
        -
        IllegalArgumentException - if this enum type has no constant with the specified name
        -
        NullPointerException - if the argument is null
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Overrides:
        -
        toString in class Enum<Operation.Name>
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Operation.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Operation.html deleted file mode 100644 index 5881cf76ea8..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Operation.html +++ /dev/null @@ -1,442 +0,0 @@ - - - - - -Operation (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class Operation

-
-
- -
-
    -
  • -
    -
    -
    public final class Operation
    -extends Object
    -
    An operation that can be performed on a Delta table. -

    - An operation is tracked as the first line in delta logs, and powers DESCRIBE HISTORY for - Delta tables. -

    - Operations must be constructed using one of the Operation.Name types below. - As well, optional Operation.Metrics values are given below.

    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class Operation.Metrics -
      Some possible operation metrics and their suggested corresponding operation types.
      -
      static class Operation.Name -
      Supported operation types.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      Operation(Operation.Name name) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters, - java.util.Map<String,String> metrics) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters, - java.util.Map<String,String> metrics, - java.util.Optional<String> userMetadata) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - - - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        -
      • -
      - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters,
        -                 @Nullable
        -                 java.util.Map<String,String> metrics)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        metrics - Any relevant operation metrics. See Operation.Metrics for suggested keys.
        -
        -
      • -
      - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters,
        -                 @Nullable
        -                 java.util.Map<String,String> metrics,
        -                 @Nonnull
        -                 java.util.Optional<String> userMetadata)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        metrics - Any relevant operation metrics. See Operation.Metrics for suggested keys.
        -
        userMetadata - Optional additional user metadata.
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getName

        -
        @Nonnull
        -public Operation.Name getName()
        -
        -
        Returns:
        -
        operation name
        -
        -
      • -
      - - - -
        -
      • -

        getParameters

        -
        @Nullable
        -public java.util.Map<String,String> getParameters()
        -
        -
        Returns:
        -
        operation parameters
        -
        -
      • -
      - - - -
        -
      • -

        getMetrics

        -
        @Nullable
        -public java.util.Map<String,String> getMetrics()
        -
        -
        Returns:
        -
        operation metrics
        -
        -
      • -
      - - - -
        -
      • -

        getUserMetadata

        -
        @Nonnull
        -public java.util.Optional<String> getUserMetadata()
        -
        -
        Returns:
        -
        user metadata for this operation
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html deleted file mode 100644 index c5189159902..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html +++ /dev/null @@ -1,388 +0,0 @@ - - - - - -OptimisticTransaction (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface OptimisticTransaction

-
-
-
-
    -
  • -
    -
    -
    public interface OptimisticTransaction
    -
    Used to perform a set of reads in a transaction and then commit a set of updates to the - state of the log. All reads from the DeltaLog MUST go through this instance rather - than directly to the DeltaLog otherwise they will not be checked for logical conflicts - with concurrent updates. -

    - This class is not thread-safe.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        commit

        -
        <T extends ActionCommitResult commit(Iterable<T> actions,
        -                                       Operation op,
        -                                       String engineInfo)
        -
        Modifies the state of the log by adding a new commit that is based on a read at the table's - latest version as of this transaction's instantiation. In the case of a conflict with a - concurrent writer this method will throw an exception. -

        - Note: any AddFile with an absolute path within the table - path will be updated to have a relative path (based off of the table path). Because of this, - be sure to generate all RemoveFiles using - AddFiles read from the Delta Log (do not use the - AddFiles created pre-commit.)

        -
        -
        Type Parameters:
        -
        T - A derived class of Action. This allows, for example, both a - List<Action> and a List<AddFile> to be accepted.
        -
        Parameters:
        -
        actions - Set of actions to commit.
        -
        op - Details of operation that is performing this transactional commit.
        -
        engineInfo - String used to identify the writer engine. It should resemble - "{engineName}/{engineVersion}", with dashes in place of whitespace. - For example, "Flink-Connector/1.1.0".
        -
        Returns:
        -
        a CommitResult, wrapping the table version that was committed.
        -
        -
      • -
      - - - -
        -
      • -

        markFilesAsRead

        -
        DeltaScan markFilesAsRead(Expression readPredicate)
        -
        Mark files matched by the readPredicate as read by this transaction. -

        - Please note filtering is only supported on partition columns, thus the files matched - may be a superset of the files in the Delta table that satisfy readPredicate. Users - should use DeltaScan.getResidualPredicate() to check for any unapplied portion of the - input predicate. -

        - Internally, readPredicate and the matched readFiles will be used to determine - if logical conflicts between this transaction and previously-committed transactions can be - resolved (i.e. no error thrown). -

        - For example: -

          -
        • This transaction TXN1 reads partition 'date=2021-09-08' to perform an UPDATE and tries - to commit at the next table version N.
        • -
        • After TXN1 starts, another transaction TXN2 reads partition 'date=2021-09-07' and - commits first at table version N (with no other metadata changes).
        • -
        • TXN1 sees that another commit won, and needs to know whether to commit at version N+1 - or fail. Using the readPredicates and resultant readFiles, TXN1 can see - that none of its read files were changed by TXN2. Thus there are no logical conflicts and - TXN1 can commit at table version N+1.
        • -
        -
        -
        Parameters:
        -
        readPredicate - Predicate used to determine which files were read.
        -
        Returns:
        -
        a DeltaScan containing the list of files matching the pushed portion of the - readPredicate.
        -
        -
      • -
      - - - -
        -
      • -

        updateMetadata

        -
        void updateMetadata(Metadata metadata)
        -
        Records an update to the metadata that should be committed with this transaction. - -

        - Use Metadata.copyBuilder() to build a new Metadata instance based on the - current table metadata. For example: - -

        
        - Metadata newMetadata = optimisticTransaction.metadata().copyBuilder()
        -     .schema(newSchema)
        -     .build();
        - optimisticTransaction.updateMetadata(newMetadata);
        - 
        - -

        - IMPORTANT: It is the responsibility of the caller to ensure that files currently - present in the table are still valid under the new metadata.

        -
        -
        Parameters:
        -
        metadata - The new metadata for the delta table.
        -
        -
      • -
      - - - -
        -
      • -

        readWholeTable

        -
        void readWholeTable()
        -
        Mark the entire table as tainted (i.e. read) by this transaction.
        -
      • -
      - - - -
        -
      • -

        txnVersion

        -
        long txnVersion(String id)
        -
        -
        Parameters:
        -
        id - transaction id
        -
        Returns:
        -
        the latest version that has committed for the idempotent transaction with given - id.
        -
        -
      • -
      - - - -
        -
      • -

        metadata

        -
        Metadata metadata()
        -
        -
        Returns:
        -
        the metadata for this transaction. The metadata refers to the metadata of the table's - latest version as of this transaction's instantiation unless updated during the - transaction.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html deleted file mode 100644 index 5451820ab59..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html +++ /dev/null @@ -1,320 +0,0 @@ - - - - - -Snapshot (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface Snapshot

-
-
-
-
    -
  • -
    -
    -
    public interface Snapshot
    -
    Snapshot provides APIs to access the Delta table state (such as table metadata, active - files) at some version. -

    - See Delta Transaction Log Protocol - for more details about the transaction logs.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        scan

        -
        DeltaScan scan(Expression predicate)
        -
        -
        Parameters:
        -
        predicate - the predicate to be used to filter the files in this snapshot.
        -
        Returns:
        -
        a DeltaScan of the files in this snapshot matching the pushed portion of - predicate
        -
        -
      • -
      - - - -
        -
      • -

        getAllFiles

        -
        java.util.List<AddFile> getAllFiles()
        -
        -
        Returns:
        -
        all of the files present in this snapshot
        -
        -
      • -
      - - - -
        -
      • -

        getMetadata

        -
        Metadata getMetadata()
        -
        -
        Returns:
        -
        the table metadata for this snapshot
        -
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        long getVersion()
        -
        -
        Returns:
        -
        the version for this snapshot
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html deleted file mode 100644 index 61bde9a14b9..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html +++ /dev/null @@ -1,296 +0,0 @@ - - - - - -VersionLog (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class VersionLog

-
-
- -
-
    -
  • -
    -
    -
    public final class VersionLog
    -extends Object
    -
    VersionLog is the representation of all actions (changes) to the Delta Table - at a specific table version.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      VersionLog(long version, - java.util.List<Action> actions) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        VersionLog

        -
        public VersionLog(long version,
        -                  @Nonnull
        -                  java.util.List<Action> actions)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the table version at which these actions occurred
        -
        -
      • -
      - - - -
        -
      • -

        getActions

        -
        @Nonnull
        -public java.util.List<Action> getActions()
        -
        -
        Returns:
        -
        an unmodifiable List of the actions for this table version
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html deleted file mode 100644 index c02429ca2b1..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - -Action (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Interface Action

-
-
-
-
    -
  • -
    -
    All Known Subinterfaces:
    -
    FileAction
    -
    -
    -
    All Known Implementing Classes:
    -
    AddCDCFile, AddFile, CommitInfo, Metadata, Protocol, RemoveFile, SetTransaction
    -
    -
    -
    -
    public interface Action
    -
    A marker interface for all actions that can be applied to a Delta table. - Each action represents a single change to the state of a Delta table. -

    - You can use the following code to extract the concrete type of an Action. -

    
    -   List<Action> actions = ...
    -   actions.forEach(x -> {
    -       if (x instanceof AddFile) {
    -          AddFile addFile = (AddFile) x;
    -          ...
    -       } else if (x instanceof AddCDCFile) {
    -          AddCDCFile addCDCFile = (AddCDCFile)x;
    -          ...
    -       } else if ...
    -   });
    - 
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html deleted file mode 100644 index 8bd21998e8d..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html +++ /dev/null @@ -1,371 +0,0 @@ - - - - - -AddCDCFile (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddCDCFile

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action, FileAction
    -
    -
    -
    -
    public final class AddCDCFile
    -extends Object
    -implements FileAction
    -
    A change file containing CDC data for the Delta version it's within. Non-CDC readers should - ignore this, CDC readers should scan all ChangeFiles in a version rather than computing - changes from AddFile and RemoveFile actions.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      AddCDCFile(String path, - java.util.Map<String,String> partitionValues, - long size, - java.util.Map<String,String> tags) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AddCDCFile

        -
        public AddCDCFile(@Nonnull
        -                  String path,
        -                  @Nonnull
        -                  java.util.Map<String,String> partitionValues,
        -                  long size,
        -                  @Nullable
        -                  java.util.Map<String,String> tags)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        @Nonnull
        -public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be added to the table. If it's a - relative path, it's relative to the root of the table. Note: the path is encoded and - should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nonnull
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public long getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being added or removed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html deleted file mode 100644 index ef690daab09..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html +++ /dev/null @@ -1,317 +0,0 @@ - - - - - -AddFile.Builder (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddFile.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    AddFile
    -
    -
    -
    -
    public static final class AddFile.Builder
    -extends Object
    -
    Builder class for AddFile. Enables construction of AddFiles with default - values.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Builder(String path, - java.util.Map<String,String> partitionValues, - long size, - long modificationTime, - boolean dataChange) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder(String path,
        -               java.util.Map<String,String> partitionValues,
        -               long size,
        -               long modificationTime,
        -               boolean dataChange)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        tags

        -
        public AddFile.Builder tags(java.util.Map<String,String> tags)
        -
      • -
      - - - -
        -
      • -

        build

        -
        public AddFile build()
        -
        Builds an AddFile using the provided parameters. If a parameter is not provided - its default values is used.
        -
        -
        Returns:
        -
        a new AddFile with the properties added to the builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html deleted file mode 100644 index 64c9cb335e5..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html +++ /dev/null @@ -1,581 +0,0 @@ - - - - - -AddFile (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddFile

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action, FileAction
    -
    -
    -
    -
    public final class AddFile
    -extends Object
    -implements FileAction
    -
    Represents an action that adds a new file to the table. The path of a file acts as the primary - key for the entry in the set of files. -

    - Note: since actions within a given Delta file are not guaranteed to be applied in order, it is - not valid for multiple file operations with the same path to exist in a single version.

    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Add File and Remove File
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class AddFile.Builder -
      Builder class for AddFile.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      AddFile(String path, - java.util.Map<String,String> partitionValues, - long size, - long modificationTime, - boolean dataChange, - String stats, - java.util.Map<String,String> tags) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AddFile

        -
        public AddFile(@Nonnull
        -               String path,
        -               @Nonnull
        -               java.util.Map<String,String> partitionValues,
        -               long size,
        -               long modificationTime,
        -               boolean dataChange,
        -               @Nullable
        -               String stats,
        -               @Nullable
        -               java.util.Map<String,String> tags)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove()
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with - deletionTimestamp = System.currentTimeMillis()
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(long deletionTimestamp)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - deletionTimestamp
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(boolean dataChange)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - dataChange flag
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(long deletionTimestamp,
        -                                  boolean dataChange)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - deletionTimestamp value and dataChange flag
        -
        -
      • -
      - - - -
        -
      • -

        getPath

        -
        @Nonnull
        -public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be added to the table. If it's a - relative path, it's relative to the root of the table. Note: the path is encoded and - should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nonnull
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public long getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getModificationTime

        -
        public long getModificationTime()
        -
        -
        Returns:
        -
        the time that this file was last modified or created, as - milliseconds since the epoch
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being created. When - false the file must already be present in the table or the records in the - added file must be contained in one or more remove actions in the same version
        -
        -
      • -
      - - - -
        -
      • -

        getStats

        -
        @Nullable
        -public String getStats()
        -
        -
        Returns:
        -
        statistics (for example: count, min/max values for columns) - about the data in this file as serialized JSON
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - -
        -
      • -

        builder

        -
        public static AddFile.Builder builder(String path,
        -                                      java.util.Map<String,String> partitionValues,
        -                                      long size,
        -                                      long modificationTime,
        -                                      boolean dataChange)
        -
        -
        Returns:
        -
        a new AddFile.Builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html deleted file mode 100644 index ba93ee2607d..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html +++ /dev/null @@ -1,481 +0,0 @@ - - - - - -CommitInfo.Builder (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class CommitInfo.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    CommitInfo
    -
    -
    -
    -
    public static final class CommitInfo.Builder
    -extends Object
    -
    Builder class for CommitInfo. Enables construction of CommitInfos with - default values.
    -
  • -
-
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html deleted file mode 100644 index 00467f7cb9e..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html +++ /dev/null @@ -1,706 +0,0 @@ - - - - - -CommitInfo (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class CommitInfo

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public class CommitInfo
    -extends Object
    -implements Action
    -
    Holds provenance information about changes to the table. This CommitInfo - is not stored in the checkpoint and has reduced compatibility guarantees. - Information stored in it is best effort (i.e. can be falsified by a writer).
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Commit Provenance Information
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class CommitInfo.Builder -
      Builder class for CommitInfo.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      CommitInfo(java.util.Optional<Long> version, - java.sql.Timestamp timestamp, - java.util.Optional<String> userId, - java.util.Optional<String> userName, - String operation, - java.util.Map<String,String> operationParameters, - java.util.Optional<JobInfo> jobInfo, - java.util.Optional<NotebookInfo> notebookInfo, - java.util.Optional<String> clusterId, - java.util.Optional<Long> readVersion, - java.util.Optional<String> isolationLevel, - java.util.Optional<Boolean> isBlindAppend, - java.util.Optional<java.util.Map<String,String>> operationMetrics, - java.util.Optional<String> userMetadata) 
      CommitInfo(java.util.Optional<Long> version, - java.sql.Timestamp timestamp, - java.util.Optional<String> userId, - java.util.Optional<String> userName, - String operation, - java.util.Map<String,String> operationParameters, - java.util.Optional<JobInfo> jobInfo, - java.util.Optional<NotebookInfo> notebookInfo, - java.util.Optional<String> clusterId, - java.util.Optional<Long> readVersion, - java.util.Optional<String> isolationLevel, - java.util.Optional<Boolean> isBlindAppend, - java.util.Optional<java.util.Map<String,String>> operationMetrics, - java.util.Optional<String> userMetadata, - java.util.Optional<String> engineInfo) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CommitInfo

        -
        public CommitInfo(@Nonnull
        -                  java.util.Optional<Long> version,
        -                  @Nullable
        -                  java.sql.Timestamp timestamp,
        -                  @Nonnull
        -                  java.util.Optional<String> userId,
        -                  @Nonnull
        -                  java.util.Optional<String> userName,
        -                  @Nullable
        -                  String operation,
        -                  @Nullable
        -                  java.util.Map<String,String> operationParameters,
        -                  @Nonnull
        -                  java.util.Optional<JobInfo> jobInfo,
        -                  @Nonnull
        -                  java.util.Optional<NotebookInfo> notebookInfo,
        -                  @Nonnull
        -                  java.util.Optional<String> clusterId,
        -                  @Nonnull
        -                  java.util.Optional<Long> readVersion,
        -                  @Nonnull
        -                  java.util.Optional<String> isolationLevel,
        -                  @Nonnull
        -                  java.util.Optional<Boolean> isBlindAppend,
        -                  @Nonnull
        -                  java.util.Optional<java.util.Map<String,String>> operationMetrics,
        -                  @Nonnull
        -                  java.util.Optional<String> userMetadata)
        -
      • -
      - - - -
        -
      • -

        CommitInfo

        -
        public CommitInfo(@Nonnull
        -                  java.util.Optional<Long> version,
        -                  @Nullable
        -                  java.sql.Timestamp timestamp,
        -                  @Nonnull
        -                  java.util.Optional<String> userId,
        -                  @Nonnull
        -                  java.util.Optional<String> userName,
        -                  @Nullable
        -                  String operation,
        -                  @Nullable
        -                  java.util.Map<String,String> operationParameters,
        -                  @Nonnull
        -                  java.util.Optional<JobInfo> jobInfo,
        -                  @Nonnull
        -                  java.util.Optional<NotebookInfo> notebookInfo,
        -                  @Nonnull
        -                  java.util.Optional<String> clusterId,
        -                  @Nonnull
        -                  java.util.Optional<Long> readVersion,
        -                  @Nonnull
        -                  java.util.Optional<String> isolationLevel,
        -                  @Nonnull
        -                  java.util.Optional<Boolean> isBlindAppend,
        -                  @Nonnull
        -                  java.util.Optional<java.util.Map<String,String>> operationMetrics,
        -                  @Nonnull
        -                  java.util.Optional<String> userMetadata,
        -                  @Nonnull
        -                  java.util.Optional<String> engineInfo)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        @Nonnull
        -public java.util.Optional<Long> getVersion()
        -
        -
        Returns:
        -
        the log version for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getTimestamp

        -
        @Nullable
        -public java.sql.Timestamp getTimestamp()
        -
        -
        Returns:
        -
        the time the files in this commit were committed
        -
        -
      • -
      - - - -
        -
      • -

        getUserId

        -
        @Nonnull
        -public java.util.Optional<String> getUserId()
        -
        -
        Returns:
        -
        the userId of the user who committed this file
        -
        -
      • -
      - - - -
        -
      • -

        getUserName

        -
        @Nonnull
        -public java.util.Optional<String> getUserName()
        -
        -
        Returns:
        -
        the userName of the user who committed this file
        -
        -
      • -
      - - - -
        -
      • -

        getOperation

        -
        @Nullable
        -public String getOperation()
        -
        -
        Returns:
        -
        the type of operation for this commit. e.g. "WRITE"
        -
        -
      • -
      - - - -
        -
      • -

        getOperationParameters

        -
        @Nullable
        -public java.util.Map<String,String> getOperationParameters()
        -
        -
        Returns:
        -
        any relevant operation parameters. e.g. "mode", "partitionBy"
        -
        -
      • -
      - - - -
        -
      • -

        getJobInfo

        -
        @Nonnull
        -public java.util.Optional<JobInfo> getJobInfo()
        -
        -
        Returns:
        -
        the JobInfo for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getNotebookInfo

        -
        @Nonnull
        -public java.util.Optional<NotebookInfo> getNotebookInfo()
        -
        -
        Returns:
        -
        the NotebookInfo for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getClusterId

        -
        @Nonnull
        -public java.util.Optional<String> getClusterId()
        -
        -
        Returns:
        -
        the ID of the cluster used to generate this commit
        -
        -
      • -
      - - - -
        -
      • -

        getReadVersion

        -
        @Nonnull
        -public java.util.Optional<Long> getReadVersion()
        -
        -
        Returns:
        -
        the version that the transaction used to generate this commit is reading from
        -
        -
      • -
      - - - -
        -
      • -

        getIsolationLevel

        -
        @Nonnull
        -public java.util.Optional<String> getIsolationLevel()
        -
        -
        Returns:
        -
        the isolation level at which this commit was generated
        -
        -
      • -
      - - - -
        -
      • -

        getIsBlindAppend

        -
        @Nonnull
        -public java.util.Optional<Boolean> getIsBlindAppend()
        -
        -
        Returns:
        -
        whether this commit has blindly appended without caring about existing files
        -
        -
      • -
      - - - -
        -
      • -

        getOperationMetrics

        -
        @Nonnull
        -public java.util.Optional<java.util.Map<String,String>> getOperationMetrics()
        -
        -
        Returns:
        -
        any operation metrics calculated
        -
        -
      • -
      - - - -
        -
      • -

        getUserMetadata

        -
        @Nonnull
        -public java.util.Optional<String> getUserMetadata()
        -
        -
        Returns:
        -
        any additional user metadata
        -
        -
      • -
      - - - -
        -
      • -

        getEngineInfo

        -
        @Nonnull
        -public java.util.Optional<String> getEngineInfo()
        -
        -
        Returns:
        -
        the engineInfo of the engine that performed this commit. It should be of the form - "{engineName}/{engineVersion} Delta-Standalone/{deltaStandaloneVersion}"
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html deleted file mode 100644 index d06a7687f20..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - -FileAction (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Interface FileAction

-
-
-
-
    -
  • -
    -
    All Superinterfaces:
    -
    Action
    -
    -
    -
    All Known Implementing Classes:
    -
    AddCDCFile, AddFile, RemoveFile
    -
    -
    -
    -
    public interface FileAction
    -extends Action
    -
    Generic interface for Actions pertaining to the addition and removal of files.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        String getPath()
        -
        -
        Returns:
        -
        the relative path or the absolute path of the file being added or removed by this - action. If it's a relative path, it's relative to the root of the table. Note: the path - is encoded and should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        boolean isDataChange()
        -
        -
        Returns:
        -
        whether any data was changed as a result of this file being added or removed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html deleted file mode 100644 index 82878ee3115..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - -Format (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Format

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      Format() 
      Format(String provider, - java.util.Map<String,String> options) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Format

        -
        public Format(String provider,
        -              java.util.Map<String,String> options)
        -
      • -
      - - - -
        -
      • -

        Format

        -
        public Format()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getProvider

        -
        public String getProvider()
        -
        -
        Returns:
        -
        the name of the encoding for files in this table
        -
        -
      • -
      - - - -
        -
      • -

        getOptions

        -
        public java.util.Map<String,String> getOptions()
        -
        -
        Returns:
        -
        an unmodifiable Map containing configuration options for - the format
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html deleted file mode 100644 index 78946475fe4..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - -JobInfo.Builder (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class JobInfo.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    JobInfo
    -
    -
    -
    -
    public static class JobInfo.Builder
    -extends Object
    -
    Builder class for JobInfo. Enables construction of JobInfos with default - values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder(String jobId)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - - - - - -
        -
      • -

        jobOwnerId

        -
        public JobInfo.Builder jobOwnerId(String jobOwnerId)
        -
      • -
      - - - -
        -
      • -

        triggerType

        -
        public JobInfo.Builder triggerType(String triggerType)
        -
      • -
      - - - -
        -
      • -

        build

        -
        public JobInfo build()
        -
        Builds a JobInfo using the provided parameters. If a parameter is not provided - its default values is used.
        -
        -
        Returns:
        -
        a new JobInfo with the properties added to the builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html deleted file mode 100644 index d0165cd8b3e..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html +++ /dev/null @@ -1,402 +0,0 @@ - - - - - -JobInfo (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class JobInfo

-
-
- -
-
    -
  • -
    -
    -
    public class JobInfo
    -extends Object
    -
    Represents the Databricks Job information that committed to the Delta table.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        JobInfo

        -
        public JobInfo(String jobId,
        -               String jobName,
        -               String runId,
        -               String jobOwnerId,
        -               String triggerType)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getJobId

        -
        public String getJobId()
        -
      • -
      - - - -
        -
      • -

        getJobName

        -
        public String getJobName()
        -
      • -
      - - - -
        -
      • -

        getRunId

        -
        public String getRunId()
        -
      • -
      - - - -
        -
      • -

        getJobOwnerId

        -
        public String getJobOwnerId()
        -
      • -
      - - - -
        -
      • -

        getTriggerType

        -
        public String getTriggerType()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html deleted file mode 100644 index 0b1c2a897c3..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html +++ /dev/null @@ -1,408 +0,0 @@ - - - - - -Metadata.Builder (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Metadata.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    Metadata
    -
    -
    -
    -
    public static final class Metadata.Builder
    -extends Object
    -
    Builder class for Metadata. Enables construction of Metadatas with default - values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder()
        -
      • -
      -
    • -
    - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html deleted file mode 100644 index f3729c53f35..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html +++ /dev/null @@ -1,530 +0,0 @@ - - - - - -Metadata (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Metadata

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public final class Metadata
    -extends Object
    -implements Action
    -
    Updates the metadata of the table. The first version of a table must contain - a Metadata action. Subsequent Metadata actions completely - overwrite the current metadata of the table. It is the responsibility of the - writer to ensure that any data already present in the table is still valid - after any change. There can be at most one Metadata action in a - given version of the table.
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Change Metadata
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Metadata

        -
        public Metadata(@Nonnull
        -                String id,
        -                @Nullable
        -                String name,
        -                @Nullable
        -                String description,
        -                @Nonnull
        -                Format format,
        -                @Nonnull
        -                java.util.List<String> partitionColumns,
        -                @Nonnull
        -                java.util.Map<String,String> configuration,
        -                @Nonnull
        -                java.util.Optional<Long> createdTime,
        -                @Nullable
        -                StructType schema)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getId

        -
        @Nonnull
        -public String getId()
        -
        -
        Returns:
        -
        the unique identifier for this table
        -
        -
      • -
      - - - -
        -
      • -

        getName

        -
        @Nullable
        -public String getName()
        -
        -
        Returns:
        -
        the user-provided identifier for this table
        -
        -
      • -
      - - - -
        -
      • -

        getDescription

        -
        @Nullable
        -public String getDescription()
        -
        -
        Returns:
        -
        the user-provided description for this table
        -
        -
      • -
      - - - -
        -
      • -

        getFormat

        -
        @Nonnull
        -public Format getFormat()
        -
        -
        Returns:
        -
        the Format for this table
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionColumns

        -
        @Nonnull
        -public java.util.List<String> getPartitionColumns()
        -
        -
        Returns:
        -
        an unmodifiable java.util.List containing the names of - columns by which the data should be partitioned
        -
        -
      • -
      - - - -
        -
      • -

        getConfiguration

        -
        @Nonnull
        -public java.util.Map<String,String> getConfiguration()
        -
        -
        Returns:
        -
        an unmodifiable java.util.Map containing configuration - options for this metadata
        -
        -
      • -
      - - - -
        -
      • -

        getCreatedTime

        -
        @Nonnull
        -public java.util.Optional<Long> getCreatedTime()
        -
        -
        Returns:
        -
        the time when this metadata action was created, in milliseconds - since the Unix epoch
        -
        -
      • -
      - - - -
        -
      • -

        getSchema

        -
        @Nullable
        -public StructType getSchema()
        -
        -
        Returns:
        -
        the schema of the table as a StructType
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html deleted file mode 100644 index 1854142a322..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - -NotebookInfo (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class NotebookInfo

-
-
- -
-
    -
  • -
    -
    -
    public class NotebookInfo
    -extends Object
    -
    Represents the Databricks Notebook information that committed to the Delta table.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      NotebookInfo(String notebookId) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        NotebookInfo

        -
        public NotebookInfo(String notebookId)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getNotebookId

        -
        public String getNotebookId()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html deleted file mode 100644 index e51ac430ae8..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html +++ /dev/null @@ -1,345 +0,0 @@ - - - - - -Protocol (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Protocol

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public final class Protocol
    -extends Object
    -implements Action
    -
    Used to block older clients from reading or writing the log when backwards - incompatible changes are made to the protocol. Readers and writers are - responsible for checking that they meet the minimum versions before performing - any other operations. -

    - Since this action allows us to explicitly block older clients in the case of a - breaking change to the protocol, clients should be tolerant of messages and - fields that they do not understand.

    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Protocol Evolution
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Protocol(int minReaderVersion, - int minWriterVersion) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Protocol

        -
        public Protocol(int minReaderVersion,
        -                int minWriterVersion)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getMinReaderVersion

        -
        public int getMinReaderVersion()
        -
        -
        Returns:
        -
        the minimum version of the Delta read protocol that a client must implement in order - to correctly read this table
        -
        -
      • -
      - - - -
        -
      • -

        getMinWriterVersion

        -
        public int getMinWriterVersion()
        -
        -
        Returns:
        -
        the minimum version of the Delta write protocol that a client must implement in order - to correctly write this table
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html deleted file mode 100644 index 0d75e5f1fad..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html +++ /dev/null @@ -1,471 +0,0 @@ - - - - - -RemoveFile (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class RemoveFile

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      RemoveFile(String path, - java.util.Optional<Long> deletionTimestamp, - boolean dataChange, - boolean extendedFileMetadata, - java.util.Map<String,String> partitionValues, - java.util.Optional<Long> size, - java.util.Map<String,String> tags) -
      Deprecated.  -
      RemoveFile should be created from AddFile.remove() instead.
      -
      -
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        RemoveFile

        -
        @Deprecated
        -public RemoveFile(@Nonnull
        -                              String path,
        -                              @Nonnull
        -                              java.util.Optional<Long> deletionTimestamp,
        -                              boolean dataChange,
        -                              boolean extendedFileMetadata,
        -                              @Nullable
        -                              java.util.Map<String,String> partitionValues,
        -                              @Nonnull
        -                              java.util.Optional<Long> size,
        -                              @Nullable
        -                              java.util.Map<String,String> tags)
        -
        Deprecated. RemoveFile should be created from AddFile.remove() instead.
        -
        Users should not construct RemoveFiles themselves, and should instead use one - of the various AddFile.remove() methods to instantiate the correct RemoveFile - for a given AddFile instance.
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be removed from the table. If it's - a relative path, it's relative to the root of the table. Note: the path is encoded - and should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getDeletionTimestamp

        -
        public java.util.Optional<Long> getDeletionTimestamp()
        -
        -
        Returns:
        -
        the time that this file was deleted as milliseconds since the epoch
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being removed. When - false the records in the removed file must be contained in one or more add - actions in the same version
        -
        -
      • -
      - - - -
        -
      • -

        isExtendedFileMetadata

        -
        public boolean isExtendedFileMetadata()
        -
        -
        Returns:
        -
        true if the fields partitionValues, size, and tags are - present
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nullable
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public java.util.Optional<Long> getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html deleted file mode 100644 index 71b1ec5657b..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - -SetTransaction (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class SetTransaction

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      SetTransaction(String appId, - long version, - java.util.Optional<Long> lastUpdated) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        SetTransaction

        -
        public SetTransaction(@Nonnull
        -                      String appId,
        -                      long version,
        -                      @Nonnull
        -                      java.util.Optional<Long> lastUpdated)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getAppId

        -
        @Nonnull
        -public String getAppId()
        -
        -
        Returns:
        -
        the unique identifier for the application performing the transaction
        -
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the application-specific numeric identifier for this transaction
        -
        -
      • -
      - - - -
        -
      • -

        getLastUpdated

        -
        @Nonnull
        -public java.util.Optional<Long> getLastUpdated()
        -
        -
        Returns:
        -
        the time when this transaction action was created, in milliseconds since the Unix - epoch
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html deleted file mode 100644 index 35586692214..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -io.delta.standalone.actions (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - -

io.delta.standalone.actions

-
-

Interfaces

- -

Classes

- -
- - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html deleted file mode 100644 index 6700c60b06f..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - -io.delta.standalone.actions (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.actions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html deleted file mode 100644 index 9ef1a174491..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - -io.delta.standalone.actions Class Hierarchy (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.actions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html deleted file mode 100644 index 46dd7b14f2c..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - -CloseableIterator (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.data
-

Interface CloseableIterator<T>

-
-
-
-
    -
  • -
    -
    All Superinterfaces:
    -
    AutoCloseable, java.io.Closeable, java.util.Iterator<T>
    -
    -
    -
    -
    public interface CloseableIterator<T>
    -extends java.util.Iterator<T>, java.io.Closeable
    -
    An Iterator that also implements the Closeable interface. The caller - should call Closeable.close() method to free all resources properly after using the iterator.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from interface java.util.Iterator

        -forEachRemaining, hasNext, next, remove
      • -
      -
        -
      • - - -

        Methods inherited from interface java.io.Closeable

        -close
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html deleted file mode 100644 index a3fbdc37e4f..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html +++ /dev/null @@ -1,682 +0,0 @@ - - - - - -RowRecord (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.data
-

Interface RowRecord

-
-
-
-
    -
  • -
    -
    -
    public interface RowRecord
    -
    Represents one row of data containing a non-empty collection of fieldName - value pairs. - It provides APIs to allow retrieval of values through fieldName lookup. For example, - -
    
    -   if (row.isNullAt("int_field")) {
    -     // handle the null value.
    -   } else {
    -     int x = getInt("int_field");
    -   }
    - 
    -
    -
    See Also:
    -
    StructType, -StructField
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Abstract Methods 
      Modifier and TypeMethod and Description
      java.math.BigDecimalgetBigDecimal(String fieldName) -
      Retrieves value from data record and returns the value as a java.math.BigDecimal.
      -
      byte[]getBinary(String fieldName) -
      Retrieves value from data record and returns the value as binary (byte array).
      -
      booleangetBoolean(String fieldName) -
      Retrieves value from data record and returns the value as a primitive boolean.
      -
      bytegetByte(String fieldName) -
      Retrieves value from data record and returns the value as a primitive byte.
      -
      java.sql.DategetDate(String fieldName) -
      Retrieves value from data record and returns the value as a java.sql.Date.
      -
      doublegetDouble(String fieldName) -
      Retrieves value from data record and returns the value as a primitive double.
      -
      floatgetFloat(String fieldName) -
      Retrieves value from data record and returns the value as a primitive float.
      -
      intgetInt(String fieldName) -
      Retrieves value from data record and returns the value as a primitive int.
      -
      intgetLength() 
      <T> java.util.List<T>getList(String fieldName) -
      Retrieves value from data record and returns the value as a java.util.List<T> object.
      -
      longgetLong(String fieldName) -
      Retrieves value from data record and returns the value as a primitive long.
      -
      <K,V> java.util.Map<K,V>getMap(String fieldName) -
      Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
      -
      RowRecordgetRecord(String fieldName) -
      Retrieves value from data record and returns the value as a RowRecord object.
      -
      StructTypegetSchema() 
      shortgetShort(String fieldName) -
      Retrieves value from data record and returns the value as a primitive short.
      -
      StringgetString(String fieldName) -
      Retrieves value from data record and returns the value as a String object.
      -
      java.sql.TimestampgetTimestamp(String fieldName) -
      Retrieves value from data record and returns the value as a java.sql.Timestamp.
      -
      booleanisNullAt(String fieldName) 
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        getLength

        -
        int getLength()
        -
        -
        Returns:
        -
        the number of elements in this RowRecord
        -
        -
      • -
      - - - -
        -
      • -

        isNullAt

        -
        boolean isNullAt(String fieldName)
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        whether the value of field fieldName is null
        -
        -
      • -
      - - - -
        -
      • -

        getInt

        -
        int getInt(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive int.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive int
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getLong

        -
        long getLong(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive long.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive long
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getByte

        -
        byte getByte(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive byte.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive byte
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getShort

        -
        short getShort(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive short.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive short
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBoolean

        -
        boolean getBoolean(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive boolean.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive boolean
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getFloat

        -
        float getFloat(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive float.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive float
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getDouble

        -
        double getDouble(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive double.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive double
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getString

        -
        String getString(String fieldName)
        -
        Retrieves value from data record and returns the value as a String object.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a String object. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBinary

        -
        byte[] getBinary(String fieldName)
        -
        Retrieves value from data record and returns the value as binary (byte array).
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as binary (byte array). null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBigDecimal

        -
        java.math.BigDecimal getBigDecimal(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.math.BigDecimal.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.math.BigDecimal. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getTimestamp

        -
        java.sql.Timestamp getTimestamp(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.sql.Timestamp.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.sql.Timestamp. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getDate

        -
        java.sql.Date getDate(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.sql.Date.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.sql.Date. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getRecord

        -
        RowRecord getRecord(String fieldName)
        -
        Retrieves value from data record and returns the value as a RowRecord object.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a RowRecord object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any nested field, if that field is not - nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getList

        -
        <T> java.util.List<T> getList(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.util.List<T> object.
        -
        -
        Type Parameters:
        -
        T - element type
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a java.util.List<T> object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any element field, if that field is not - nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getMap

        -
        <K,V> java.util.Map<K,V> getMap(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
        -
        -
        Type Parameters:
        -
        K - key type
        -
        V - value type
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a java.util.Map<K, V> object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any key/value field, if that field is not - nullable and null data value read
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html deleted file mode 100644 index 626ece76d53..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -io.delta.standalone.data (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - -

io.delta.standalone.data

-
-

Interfaces

- -
- - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html deleted file mode 100644 index d36b23509f4..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - -io.delta.standalone.data (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.data

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html deleted file mode 100644 index 8befbea9b63..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - -io.delta.standalone.data Class Hierarchy (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.data

-Package Hierarchies: - -
-
-

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html deleted file mode 100644 index 74f9ed8abb2..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentAppendException (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentAppendException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentAppendException
    -extends DeltaConcurrentModificationException
    -
    Thrown when files are added that would have been read by the current transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentAppendException

        -
        public ConcurrentAppendException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html deleted file mode 100644 index d0826b9ccdf..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentDeleteDeleteException (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentDeleteDeleteException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentDeleteDeleteException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the current transaction deletes data that was deleted by a concurrent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentDeleteDeleteException

        -
        public ConcurrentDeleteDeleteException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html deleted file mode 100644 index da67d4fed8a..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentDeleteReadException (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentDeleteReadException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentDeleteReadException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the current transaction reads data that was deleted by a concurrent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentDeleteReadException

        -
        public ConcurrentDeleteReadException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html deleted file mode 100644 index cfe4fd3d6d7..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentTransactionException (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentTransactionException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentTransactionException
    -extends DeltaConcurrentModificationException
    -
    Thrown when concurrent transaction both attempt to update the same idempotent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentTransactionException

        -
        public ConcurrentTransactionException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html deleted file mode 100644 index 42ed9ba91d0..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html +++ /dev/null @@ -1,275 +0,0 @@ - - - - - -DeltaConcurrentModificationException (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class DeltaConcurrentModificationException

-
-
- -
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DeltaConcurrentModificationException

        -
        public DeltaConcurrentModificationException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html deleted file mode 100644 index 80d7b5f1bdd..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - -DeltaStandaloneException (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class DeltaStandaloneException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class DeltaStandaloneException
    -extends RuntimeException
    -
    Thrown when a query fails, usually because the query itself is invalid.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException()
        -
      • -
      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException(String message)
        -
      • -
      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException(String message,
        -                                Throwable cause)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html deleted file mode 100644 index 9fd755e0844..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - -MetadataChangedException (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class MetadataChangedException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class MetadataChangedException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the metadata of the Delta table has changed between the time of read - and the time of commit.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MetadataChangedException

        -
        public MetadataChangedException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html deleted file mode 100644 index dc3f6bd1837..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ProtocolChangedException (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ProtocolChangedException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ProtocolChangedException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the protocol version has changed between the time of read and the time of commit.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ProtocolChangedException

        -
        public ProtocolChangedException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html deleted file mode 100644 index 88f9f0c2fe4..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -io.delta.standalone.exceptions (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - -

io.delta.standalone.exceptions

-
-

Exceptions

- -
- - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html deleted file mode 100644 index 4355d09a56f..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - -io.delta.standalone.exceptions (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.exceptions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html deleted file mode 100644 index 53e0bb7a7ea..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - -io.delta.standalone.exceptions Class Hierarchy (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.exceptions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html deleted file mode 100644 index aa598f9ba7d..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - -And (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class And

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class And
    -extends BinaryOperator
    -implements Predicate
    -
    Evaluates logical expr1 AND expr2 for new And(expr1, expr2). -

    - Requires both left and right input expressions evaluate to booleans.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object leftResult,
        -                           Object rightResult)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html deleted file mode 100644 index 6d0eb81ff28..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - -BinaryComparison (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryComparison

-
-
- -
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html deleted file mode 100644 index 3b34ec0ca56..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html +++ /dev/null @@ -1,340 +0,0 @@ - - - - - -BinaryExpression (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryExpression

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    BinaryOperator
    -
    -
    -
    -
    public abstract class BinaryExpression
    -extends Object
    -implements Expression
    -
    An Expression with two inputs and one output. The output is by default evaluated to null - if either input is evaluated to null.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - - - - - -
        -
      • -

        eval

        -
        public final Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html deleted file mode 100644 index 64668a51b2a..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - -BinaryOperator (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryOperator

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    And, BinaryComparison, Or
    -
    -
    -
    -
    public abstract class BinaryOperator
    -extends BinaryExpression
    -
    A BinaryExpression that is an operator, meaning the string representation is - x symbol y, rather than funcName(x, y). -

    - Requires both inputs to be of the same data type.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html deleted file mode 100644 index 5d62ef9187f..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - -Column (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Column

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Column

        -
        public Column(String name,
        -              DataType dataType)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        name

        -
        public String name()
        -
      • -
      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        dataType

        -
        public DataType dataType()
        -
        -
        Returns:
        -
        the DataType of the result of evaluating this expression.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        public java.util.Set<String> references()
        -
        -
        Specified by:
        -
        references in interface Expression
        -
        Overrides:
        -
        references in class LeafExpression
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Specified by:
        -
        equals in class LeafExpression
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html deleted file mode 100644 index 59d8d3a57fb..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -EqualTo (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class EqualTo

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html deleted file mode 100644 index 504cd9274a1..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - -Expression (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Interface Expression

-
-
-
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        Object eval(RowRecord record)
        -
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        dataType

        -
        DataType dataType()
        -
        -
        Returns:
        -
        the DataType of the result of evaluating this expression.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        String toString()
        -
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        default java.util.Set<String> references()
        -
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        java.util.List<Expression> children()
        -
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html deleted file mode 100644 index 29038e2684a..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -GreaterThan (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class GreaterThan

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html deleted file mode 100644 index 5f150378d22..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -GreaterThanOrEqual (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class GreaterThanOrEqual

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class GreaterThanOrEqual
    -extends BinaryComparison
    -implements Predicate
    -
    Evaluates expr1 >= expr2 for new GreaterThanOrEqual(expr1, expr2).
    -
  • -
-
-
- -
-
-
    -
  • - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html deleted file mode 100644 index e3eba7a9435..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - -In (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class In

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class In
    -extends Object
    -implements Predicate
    -
    Evaluates if expr is in exprList for new In(expr, exprList). True if - expr is equal to any expression in exprList, else false.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      In(Expression value, - java.util.List<? extends Expression> elems) 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      java.util.List<Expression>children() 
      Booleaneval(RowRecord record) -
      This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide.
      -
      StringtoString() 
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      - - -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        In

        -
        public In(Expression value,
        -          java.util.List<? extends Expression> elems)
        -
        -
        Parameters:
        -
        value - a nonnull expression
        -
        elems - a nonnull, nonempty list of expressions with the same data type as - value
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Boolean eval(RowRecord record)
        -
        This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide. The logic is as follows: -
          -
        • TRUE if the non-NULL value is found in the list
        • -
        • FALSE if the non-NULL value is not found in the list and the list does not contain - NULL values
        • -
        • NULL if the value is NULL, or the non-NULL value is not found in the list and the - list contains at least one NULL value
        • -
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        See Also:
        -
        NULL Semantics
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html deleted file mode 100644 index 99bf654a9ad..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - -IsNotNull (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class IsNotNull

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        IsNotNull

        -
        public IsNotNull(Expression child)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Overrides:
        -
        eval in class UnaryExpression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html deleted file mode 100644 index f52a63f6da7..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - -IsNull (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class IsNull

-
-
- -
- -
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Overrides:
        -
        eval in class UnaryExpression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html deleted file mode 100644 index 5b6302c1fd0..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - -LeafExpression (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LeafExpression

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        public java.util.Set<String> references()
        -
        -
        Specified by:
        -
        references in interface Expression
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public abstract boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public abstract int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html deleted file mode 100644 index b3d7d8fc198..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -LessThan (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LessThan

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html deleted file mode 100644 index f0bf47e2b94..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -LessThanOrEqual (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LessThanOrEqual

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html deleted file mode 100644 index 7f68b4fd3d1..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html +++ /dev/null @@ -1,617 +0,0 @@ - - - - - -Literal (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Literal

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html deleted file mode 100644 index a301ecd2f91..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html +++ /dev/null @@ -1,324 +0,0 @@ - - - - - -Not (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Not

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class Not
    -extends UnaryExpression
    -implements Predicate
    -
    Evaluates logical NOT expr for new Not(expr). -

    - Requires the child expression evaluates to a boolean.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object childResult)
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html deleted file mode 100644 index 671690497f1..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - -Or (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Or

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class Or
    -extends BinaryOperator
    -implements Predicate
    -
    Evaluates logical expr1 OR expr2 for new Or(expr1, expr2). -

    - Requires both left and right input expressions evaluate to booleans.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object leftResult,
        -                           Object rightResult)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html deleted file mode 100644 index 57e24aa3c02..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - -Predicate (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Interface Predicate

-
-
-
- -
-
- -
-
-
    -
  • - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html deleted file mode 100644 index 42dae5c3716..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - -UnaryExpression (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class UnaryExpression

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    IsNotNull, IsNull, Not
    -
    -
    -
    -
    public abstract class UnaryExpression
    -extends Object
    -implements Expression
    -
    An Expression with one input and one output. The output is by default evaluated to null - if the input is evaluated to null.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html deleted file mode 100644 index 2f533e9be0c..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - -io.delta.standalone.expressions (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - -

io.delta.standalone.expressions

-
-

Interfaces

- -

Classes

- -
- - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html deleted file mode 100644 index 9ef3a5f7573..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - -io.delta.standalone.expressions (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.expressions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html deleted file mode 100644 index 98d1984ecb8..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - -io.delta.standalone.expressions Class Hierarchy (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.expressions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/package-frame.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/package-frame.html deleted file mode 100644 index 8353e08f8d1..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/package-frame.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -io.delta.standalone (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - -

io.delta.standalone

-
-

Interfaces

- -

Classes

- -

Enums

- -
- - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/package-summary.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/package-summary.html deleted file mode 100644 index 1783600cb67..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/package-summary.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - -io.delta.standalone (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/package-tree.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/package-tree.html deleted file mode 100644 index c6a43135760..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/package-tree.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - -io.delta.standalone Class Hierarchy (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/LogStore.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/LogStore.html deleted file mode 100644 index 43f041d89c6..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/LogStore.html +++ /dev/null @@ -1,478 +0,0 @@ - - - - - -LogStore (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.storage
-

Class LogStore

-
-
- -
-
    -
  • -
    -
    -
    public abstract class LogStore
    -extends Object
    -
    :: DeveloperApi :: -

    - General interface for all critical file system operations required to read and write the - Delta logs. The correctness is predicated on the atomicity and durability guarantees of - the implementation of this interface. Specifically, -

      -
    1. - Atomic visibility of files: If isPartialWriteVisible is false, any file written through - this store must be made visible atomically. In other words, this should not generate - partial files. -
    2. -
    3. - Mutual exclusion: Only one writer must be able to create (or rename) a file at the final - destination. -
    4. -
    5. - Consistent listing: Once a file has been written in a directory, all future listings for - that directory must return that file. -
    6. -
    -

    - All subclasses of this interface are required to have a constructor that takes - Configuration as a single parameter. This constructor is used to dynamically create the - LogStore. -

    - LogStore and its implementations are not meant for direct access but for configuration based - on storage system.

    -
    -
    Since:
    -
    0.3.0
    -
    See Also:
    -
    Delta Storage
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      LogStore(org.apache.hadoop.conf.Configuration initHadoopConf) 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Abstract Methods Concrete Methods 
      Modifier and TypeMethod and Description
      org.apache.hadoop.conf.ConfigurationinitHadoopConf() -
      :: DeveloperApi ::
      -
      abstract BooleanisPartialWriteVisible(org.apache.hadoop.fs.Path path, - org.apache.hadoop.conf.Configuration hadoopConf) -
      :: DeveloperApi ::
      -
      abstract java.util.Iterator<org.apache.hadoop.fs.FileStatus>listFrom(org.apache.hadoop.fs.Path path, - org.apache.hadoop.conf.Configuration hadoopConf) -
      :: DeveloperApi ::
      -
      abstract CloseableIterator<String>read(org.apache.hadoop.fs.Path path, - org.apache.hadoop.conf.Configuration hadoopConf) -
      :: DeveloperApi ::
      -
      abstract org.apache.hadoop.fs.PathresolvePathOnPhysicalStorage(org.apache.hadoop.fs.Path path, - org.apache.hadoop.conf.Configuration hadoopConf) -
      :: DeveloperApi ::
      -
      abstract voidwrite(org.apache.hadoop.fs.Path path, - java.util.Iterator<String> actions, - Boolean overwrite, - org.apache.hadoop.conf.Configuration hadoopConf) -
      :: DeveloperApi ::
      -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        LogStore

        -
        public LogStore(org.apache.hadoop.conf.Configuration initHadoopConf)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        initHadoopConf

        -
        public org.apache.hadoop.conf.Configuration initHadoopConf()
        -
        :: DeveloperApi :: -

        - Hadoop configuration that should only be used during initialization of LogStore. Each method - should use their hadoopConf parameter rather than this (potentially outdated) hadoop - configuration.

        -
        -
        Returns:
        -
        the initial hadoop configuration.
        -
        -
      • -
      - - - -
        -
      • -

        read

        -
        public abstract CloseableIterator<String> read(org.apache.hadoop.fs.Path path,
        -                                               org.apache.hadoop.conf.Configuration hadoopConf)
        -
        :: DeveloperApi :: -

        - Load the given file and return an Iterator of lines, with line breaks removed from - each line. Callers of this function are responsible to close the iterator if they are done - with it.

        -
        -
        Parameters:
        -
        path - the path to load
        -
        hadoopConf - the latest hadoopConf
        -
        Returns:
        -
        the CloseableIterator of lines in the given file.
        -
        Since:
        -
        0.3.0
        -
        -
      • -
      - - - -
        -
      • -

        write

        -
        public abstract void write(org.apache.hadoop.fs.Path path,
        -                           java.util.Iterator<String> actions,
        -                           Boolean overwrite,
        -                           org.apache.hadoop.conf.Configuration hadoopConf)
        -                    throws java.nio.file.FileAlreadyExistsException
        -
        :: DeveloperApi :: -

        - Write the given actions to the given Path with or without overwrite as indicated. -

        - Implementation must throw FileAlreadyExistsException exception if the - file already exists and overwrite = false. Furthermore, if - isPartialWriteVisible(org.apache.hadoop.fs.Path, org.apache.hadoop.conf.Configuration) returns false, implementation must ensure that the - entire file is made visible atomically, that is, it should not generate partial files.

        -
        -
        Parameters:
        -
        path - the path to write to
        -
        actions - actions to be written
        -
        overwrite - if true, overwrites the file if it already exists
        -
        hadoopConf - the latest hadoopConf
        -
        Throws:
        -
        java.nio.file.FileAlreadyExistsException - if the file already exists and overwrite is - false
        -
        Since:
        -
        0.3.0
        -
        -
      • -
      - - - -
        -
      • -

        listFrom

        -
        public abstract java.util.Iterator<org.apache.hadoop.fs.FileStatus> listFrom(org.apache.hadoop.fs.Path path,
        -                                                                             org.apache.hadoop.conf.Configuration hadoopConf)
        -                                                                      throws java.io.FileNotFoundException
        -
        :: DeveloperApi :: -

        - List the paths in the same directory that are lexicographically greater or equal to - (UTF-8 sorting) the given Path. The result should also be sorted by the file name.

        -
        -
        Parameters:
        -
        path - the path to load
        -
        hadoopConf - the latest hadoopConf
        -
        Returns:
        -
        an Iterator of the paths lexicographically greater or equal to (UTF-8 sorting) the - given Path
        -
        Throws:
        -
        java.io.FileNotFoundException - if the file does not exist
        -
        Since:
        -
        0.3.0
        -
        -
      • -
      - - - -
        -
      • -

        resolvePathOnPhysicalStorage

        -
        public abstract org.apache.hadoop.fs.Path resolvePathOnPhysicalStorage(org.apache.hadoop.fs.Path path,
        -                                                                       org.apache.hadoop.conf.Configuration hadoopConf)
        -
        :: DeveloperApi :: -

        - Resolve the fully qualified path for the given Path.

        -
        -
        Parameters:
        -
        path - the path to resolve
        -
        hadoopConf - the latest hadoopConf
        -
        Returns:
        -
        the resolved path
        -
        Since:
        -
        0.3.0
        -
        -
      • -
      - - - -
        -
      • -

        isPartialWriteVisible

        -
        public abstract Boolean isPartialWriteVisible(org.apache.hadoop.fs.Path path,
        -                                              org.apache.hadoop.conf.Configuration hadoopConf)
        -
        :: DeveloperApi :: -

        - Whether a partial write is visible for the underlying file system of the given Path.

        -
        -
        Parameters:
        -
        path - the path in question
        -
        hadoopConf - the latest hadoopConf
        -
        Returns:
        -
        true if partial writes are visible for the given Path, else false
        -
        Since:
        -
        0.3.0
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/package-frame.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/package-frame.html deleted file mode 100644 index a7d72fc0fc0..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/package-frame.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - -io.delta.standalone.storage (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - -

io.delta.standalone.storage

-
-

Classes

- -
- - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/package-summary.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/package-summary.html deleted file mode 100644 index bddd96d8fbc..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/package-summary.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - -io.delta.standalone.storage (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.storage

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/package-tree.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/package-tree.html deleted file mode 100644 index 18fa5f7b930..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/storage/package-tree.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - -io.delta.standalone.storage Class Hierarchy (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.storage

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html deleted file mode 100644 index a5b724476c7..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - -ArrayType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ArrayType

-
-
- -
-
    -
  • -
    -
    -
    public final class ArrayType
    -extends DataType
    -
    The data type for collections of multiple values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ArrayType

        -
        public ArrayType(DataType elementType,
        -                 boolean containsNull)
        -
        -
        Parameters:
        -
        elementType - the data type of values
        -
        containsNull - indicates if values have null value
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getElementType

        -
        public DataType getElementType()
        -
        -
        Returns:
        -
        the type of array elements
        -
        -
      • -
      - - - -
        -
      • -

        containsNull

        -
        public boolean containsNull()
        -
        -
        Returns:
        -
        true if the array has null values, else false
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html deleted file mode 100644 index 31cc926232d..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -BinaryType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class BinaryType

-
-
- -
-
    -
  • -
    -
    -
    public final class BinaryType
    -extends DataType
    -
    The data type representing byte[] values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BinaryType

        -
        public BinaryType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html deleted file mode 100644 index d3ba0e12721..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -BooleanType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class BooleanType

-
-
- -
-
    -
  • -
    -
    -
    public final class BooleanType
    -extends DataType
    -
    The data type representing boolean values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BooleanType

        -
        public BooleanType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html deleted file mode 100644 index 916fd20a1df..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -ByteType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ByteType

-
-
- -
-
    -
  • -
    -
    -
    public final class ByteType
    -extends DataType
    -
    The data type representing byte values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ByteType

        -
        public ByteType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html deleted file mode 100644 index bac1e2e26fd..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html +++ /dev/null @@ -1,383 +0,0 @@ - - - - - -DataType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DataType

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DataType

        -
        public DataType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getTypeName

        -
        public String getTypeName()
        -
        -
        Returns:
        -
        the name of the type used in JSON serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      - - - -
        -
      • -

        getCatalogString

        -
        public String getCatalogString()
        -
        -
        Returns:
        -
        a String representation for the type saved in external catalogs
        -
        -
      • -
      - - - -
        -
      • -

        toJson

        -
        public String toJson()
        -
        -
        Returns:
        -
        a JSON String representation of the type
        -
        -
      • -
      - - - -
        -
      • -

        toPrettyJson

        -
        public String toPrettyJson()
        -
        -
        Returns:
        -
        a pretty (i.e. indented) JSON String representation of the type
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html deleted file mode 100644 index 5062aab8013..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - -DateType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DateType

-
-
- -
-
    -
  • -
    -
    -
    public final class DateType
    -extends DataType
    -
    A date type, supporting "0001-01-01" through "9999-12-31". - Internally, this is represented as the number of days from 1970-01-01.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DateType

        -
        public DateType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html deleted file mode 100644 index 2483aa1e36d..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html +++ /dev/null @@ -1,381 +0,0 @@ - - - - - -DecimalType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DecimalType

-
-
- -
-
    -
  • -
    -
    -
    public final class DecimalType
    -extends DataType
    -
    The data type representing java.math.BigDecimal values. - A Decimal that must have fixed precision (the maximum number of digits) and scale (the number - of digits on right side of dot). - - The precision can be up to 38, scale can also be up to 38 (less or equal to precision). - - The default precision and scale is (10, 0).
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        USER_DEFAULT

        -
        public static final DecimalType USER_DEFAULT
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DecimalType

        -
        public DecimalType(int precision,
        -                   int scale)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPrecision

        -
        public int getPrecision()
        -
        -
        Returns:
        -
        the maximum number of digits of the decimal
        -
        -
      • -
      - - - -
        -
      • -

        getScale

        -
        public int getScale()
        -
        -
        Returns:
        -
        the number of digits on the right side of the decimal point (dot)
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html deleted file mode 100644 index ca5ba0f51eb..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -DoubleType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DoubleType

-
-
- -
-
    -
  • -
    -
    -
    public final class DoubleType
    -extends DataType
    -
    The data type representing double values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DoubleType

        -
        public DoubleType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html deleted file mode 100644 index e43751f6573..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html +++ /dev/null @@ -1,441 +0,0 @@ - - - - - -FieldMetadata.Builder (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FieldMetadata.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    FieldMetadata
    -
    -
    -
    -
    public static class FieldMetadata.Builder
    -extends Object
    -
    Builder class for FieldMetadata.
    -
  • -
-
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html deleted file mode 100644 index d01449b9732..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html +++ /dev/null @@ -1,368 +0,0 @@ - - - - - -FieldMetadata (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FieldMetadata

-
-
- -
-
    -
  • -
    -
    -
    public final class FieldMetadata
    -extends Object
    -
    The metadata for a given StructField.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getEntries

        -
        public java.util.Map<String,Object> getEntries()
        -
        -
        Returns:
        -
        list of the key-value pairs in this FieldMetadata
        -
        -
      • -
      - - - -
        -
      • -

        contains

        -
        public boolean contains(String key)
        -
        -
        Parameters:
        -
        key - the key to check for
        -
        Returns:
        -
        True if this contains a mapping for the given key, False otherwise
        -
        -
      • -
      - - - -
        -
      • -

        get

        -
        public Object get(String key)
        -
        -
        Parameters:
        -
        key - the key to check for
        -
        Returns:
        -
        the value to which the specified key is mapped, or null if there is no mapping for - the given key
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Overrides:
        -
        toString in class Object
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html deleted file mode 100644 index 1e2cf05b060..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -FloatType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FloatType

-
-
- -
-
    -
  • -
    -
    -
    public final class FloatType
    -extends DataType
    -
    The data type representing float values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        FloatType

        -
        public FloatType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html deleted file mode 100644 index b74d4b6613a..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -IntegerType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class IntegerType

-
-
- -
-
    -
  • -
    -
    -
    public final class IntegerType
    -extends DataType
    -
    The data type representing int values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        IntegerType

        -
        public IntegerType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html deleted file mode 100644 index cf6413577e0..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -LongType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class LongType

-
-
- -
-
    -
  • -
    -
    -
    public final class LongType
    -extends DataType
    -
    The data type representing long values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        LongType

        -
        public LongType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html deleted file mode 100644 index 3458d6c921a..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html +++ /dev/null @@ -1,364 +0,0 @@ - - - - - -MapType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class MapType

-
-
- -
-
    -
  • -
    -
    -
    public final class MapType
    -extends DataType
    -
    The data type for Maps. Keys in a map are not allowed to have null values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MapType

        -
        public MapType(DataType keyType,
        -               DataType valueType,
        -               boolean valueContainsNull)
        -
        -
        Parameters:
        -
        keyType - the data type of map keys
        -
        valueType - the data type of map values
        -
        valueContainsNull - indicates if map values have null values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getKeyType

        -
        public DataType getKeyType()
        -
        -
        Returns:
        -
        the data type of map keys
        -
        -
      • -
      - - - -
        -
      • -

        getValueType

        -
        public DataType getValueType()
        -
        -
        Returns:
        -
        the data type of map values
        -
        -
      • -
      - - - -
        -
      • -

        valueContainsNull

        -
        public boolean valueContainsNull()
        -
        -
        Returns:
        -
        true if this map has null values, else false
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html deleted file mode 100644 index 2d7ec06509c..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -NullType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class NullType

-
-
- -
-
    -
  • -
    -
    -
    public final class NullType
    -extends DataType
    -
    The data type representing null values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        NullType

        -
        public NullType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html deleted file mode 100644 index 99c48f417cb..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -ShortType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ShortType

-
-
- -
-
    -
  • -
    -
    -
    public final class ShortType
    -extends DataType
    -
    The data type representing short values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ShortType

        -
        public ShortType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html deleted file mode 100644 index 33856ca575f..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -StringType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StringType

-
-
- -
-
    -
  • -
    -
    -
    public final class StringType
    -extends DataType
    -
    The data type representing String values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StringType

        -
        public StringType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html deleted file mode 100644 index 0ae4e039a0d..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html +++ /dev/null @@ -1,416 +0,0 @@ - - - - - -StructField (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StructField

-
-
- -
-
    -
  • -
    -
    -
    public final class StructField
    -extends Object
    -
    A field inside a StructType.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType)
        -
        Constructor with default nullable = true.
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        -
      • -
      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType,
        -                   boolean nullable)
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        nullable - indicates if values of this field can be null values
        -
        -
      • -
      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType,
        -                   boolean nullable,
        -                   FieldMetadata metadata)
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        nullable - indicates if values of this field can be null values
        -
        metadata - metadata for this field
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getName

        -
        public String getName()
        -
        -
        Returns:
        -
        the name of this field
        -
        -
      • -
      - - - -
        -
      • -

        getDataType

        -
        public DataType getDataType()
        -
        -
        Returns:
        -
        the data type of this field
        -
        -
      • -
      - - - -
        -
      • -

        isNullable

        -
        public boolean isNullable()
        -
        -
        Returns:
        -
        whether this field allows to have a null value.
        -
        -
      • -
      - - - -
        -
      • -

        getMetadata

        -
        public FieldMetadata getMetadata()
        -
        -
        Returns:
        -
        the metadata for this field
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html deleted file mode 100644 index fdf7c32bced..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html +++ /dev/null @@ -1,559 +0,0 @@ - - - - - -StructType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StructType

-
-
- -
-
    -
  • -
    -
    -
    public final class StructType
    -extends DataType
    -
    The data type representing a table's schema, consisting of a collection of - fields (that is, fieldName to dataType pairs).
    -
    -
    See Also:
    -
    StructField
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StructType

        -
        public StructType()
        -
      • -
      - - - -
        -
      • -

        StructType

        -
        public StructType(StructField[] fields)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        add

        -
        public StructType add(StructField field)
        -
        Creates a new StructType by adding a new field. - -
        
        - StructType schema = new StructType()
        -     .add(new StructField("a", new IntegerType(), true))
        -     .add(new StructField("b", new LongType(), false))
        -     .add(new StructField("c", new StringType(), true))
        - 
        -
        -
        Parameters:
        -
        field - The new field to add.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        add

        -
        public StructType add(String fieldName,
        -                      DataType dataType)
        -
        Creates a new StructType by adding a new nullable field with no metadata. - -
        
        - StructType schema = new StructType()
        -     .add("a", new IntegerType())
        -     .add("b", new LongType())
        -     .add("c", new StringType())
        - 
        -
        -
        Parameters:
        -
        fieldName - The name of the new field.
        -
        dataType - The datatype for the new field.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        add

        -
        public StructType add(String fieldName,
        -                      DataType dataType,
        -                      boolean nullable)
        -
        Creates a new StructType by adding a new field with no metadata. - -
        
        - StructType schema = new StructType()
        -     .add("a", new IntegerType(), true)
        -     .add("b", new LongType(), false)
        -     .add("c", new StringType(), true)
        - 
        -
        -
        Parameters:
        -
        fieldName - The name of the new field.
        -
        dataType - The datatype for the new field.
        -
        nullable - Whether or not the new field is nullable.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        getFields

        -
        public StructField[] getFields()
        -
        -
        Returns:
        -
        array of fields
        -
        -
      • -
      - - - -
        -
      • -

        getFieldNames

        -
        public String[] getFieldNames()
        -
        -
        Returns:
        -
        array of field names
        -
        -
      • -
      - - - -
        -
      • -

        length

        -
        public int length()
        -
        -
        Returns:
        -
        the number of fields
        -
        -
      • -
      - - - -
        -
      • -

        get

        -
        public StructField get(String fieldName)
        -
        -
        Parameters:
        -
        fieldName - the name of the desired StructField, not null
        -
        Returns:
        -
        the link with the given name, not null
        -
        Throws:
        -
        IllegalArgumentException - if a field with the given name does not exist
        -
        -
      • -
      - - - -
        -
      • -

        column

        -
        public Column column(String fieldName)
        -
        Creates a Column expression for the field with the given fieldName.
        -
        -
        Parameters:
        -
        fieldName - the name of the StructField to create a column for
        -
        Returns:
        -
        a Column expression for the StructField with name fieldName
        -
        -
      • -
      - - - -
        -
      • -

        getTreeString

        -
        public String getTreeString()
        -
        -
        Returns:
        -
        a readable indented tree representation of this StructType - and all of its nested elements
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        isWriteCompatible

        -
        public boolean isWriteCompatible(StructType newSchema)
        -
        Whether a new schema can replace this existing schema in a Delta table without rewriting data - files in the table. -

        - Returns false if the new schema: -

          -
        • Drops any column that is present in the current schema
        • -
        • Converts nullable=true to nullable=false for any column
        • -
        • Changes any datatype
        • -
        -
        -
        Parameters:
        -
        newSchema - the new schema to update the table with
        -
        Returns:
        -
        whether the new schema is compatible with this existing schema
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html deleted file mode 100644 index db86bfa0da3..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -TimestampType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class TimestampType

-
-
- -
-
    -
  • -
    -
    -
    public final class TimestampType
    -extends DataType
    -
    The data type representing java.sql.Timestamp values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        TimestampType

        -
        public TimestampType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html deleted file mode 100644 index ea0421c1426..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -io.delta.standalone.types (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - -

io.delta.standalone.types

-
-

Classes

- -
- - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html deleted file mode 100644 index c65ef368c0f..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - -io.delta.standalone.types (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.types

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html deleted file mode 100644 index a34d6314223..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - -io.delta.standalone.types Class Hierarchy (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.types

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html deleted file mode 100644 index 176f1f806b1..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html +++ /dev/null @@ -1,365 +0,0 @@ - - - - - -ParquetSchemaConverter.ParquetOutputTimestampType (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.util
-

Enum ParquetSchemaConverter.ParquetOutputTimestampType

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable, Comparable<ParquetSchemaConverter.ParquetOutputTimestampType>
    -
    -
    -
    Enclosing class:
    -
    ParquetSchemaConverter
    -
    -
    -
    -
    public static enum ParquetSchemaConverter.ParquetOutputTimestampType
    -extends Enum<ParquetSchemaConverter.ParquetOutputTimestampType>
    -
    :: DeveloperApi :: -

    - Represents Parquet timestamp types. -

      -
    • INT96 is a non-standard but commonly used timestamp type in Parquet.
    • -
    • TIMESTAMP_MICROS is a standard timestamp type in Parquet, which stores number of - microseconds from the Unix epoch.
    • -
    • TIMESTAMP_MILLIS is also standard, but with millisecond precision, which means the - microsecond portion of the timestamp value is truncated.
    • -
    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        values

        -
        public static ParquetSchemaConverter.ParquetOutputTimestampType[] values()
        -
        Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
        -for (ParquetSchemaConverter.ParquetOutputTimestampType c : ParquetSchemaConverter.ParquetOutputTimestampType.values())
        -    System.out.println(c);
        -
        -
        -
        Returns:
        -
        an array containing the constants of this enum type, in the order they are declared
        -
        -
      • -
      - - - -
        -
      • -

        valueOf

        -
        public static ParquetSchemaConverter.ParquetOutputTimestampType valueOf(String name)
        -
        Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.)
        -
        -
        Parameters:
        -
        name - the name of the enum constant to be returned.
        -
        Returns:
        -
        the enum constant with the specified name
        -
        Throws:
        -
        IllegalArgumentException - if this enum type has no constant with the specified name
        -
        NullPointerException - if the argument is null
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html deleted file mode 100644 index 17c0fccd7af..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html +++ /dev/null @@ -1,417 +0,0 @@ - - - - - -ParquetSchemaConverter (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.util
-

Class ParquetSchemaConverter

-
-
- -
-
    -
  • -
    -
    -
    public final class ParquetSchemaConverter
    -extends Object
    -
    :: DeveloperApi :: -

    - Converter class to convert StructType to Parquet MessageType.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   Boolean writeLegacyParquetFormat)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        writeLegacyParquetFormat - Whether to use legacy Parquet format compatible with Spark - 1.4 and prior versions when converting a StructType to a Parquet - MessageType. When set to false, use standard format defined in parquet-format - spec.
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   ParquetSchemaConverter.ParquetOutputTimestampType outputTimestampType)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        outputTimestampType - which parquet timestamp type to use when writing
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   Boolean writeLegacyParquetFormat,
        -                                                                   ParquetSchemaConverter.ParquetOutputTimestampType outputTimestampType)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        writeLegacyParquetFormat - Whether to use legacy Parquet format compatible with Spark - 1.4 and prior versions when converting a StructType to a Parquet - MessageType. When set to false, use standard format defined in parquet-format - spec.
        -
        outputTimestampType - which parquet timestamp type to use when writing
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html deleted file mode 100644 index d5da6a36406..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -io.delta.standalone.util (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - -

io.delta.standalone.util

-
-

Classes

- -

Enums

- -
- - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html deleted file mode 100644 index 771dadc1c41..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - -io.delta.standalone.util (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.util

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html b/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html deleted file mode 100644 index d0bdcbe496d..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - -io.delta.standalone.util Class Hierarchy (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.util

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/overview-frame.html b/connectors/docs/0.3.0/delta-standalone/api/java/overview-frame.html deleted file mode 100644 index 50456f148e3..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/overview-frame.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Overview List (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - -
All Classes
-
-

Packages

- -
-

 

- - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/overview-summary.html b/connectors/docs/0.3.0/delta-standalone/api/java/overview-summary.html deleted file mode 100644 index ae0320d4fcc..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/overview-summary.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - -Overview (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Packages 
PackageDescription
io.delta.standalone 
io.delta.standalone.actions 
io.delta.standalone.data 
io.delta.standalone.exceptions 
io.delta.standalone.expressions 
io.delta.standalone.storage 
io.delta.standalone.types 
io.delta.standalone.util 
-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/overview-tree.html b/connectors/docs/0.3.0/delta-standalone/api/java/overview-tree.html deleted file mode 100644 index 7ac42c1620d..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/overview-tree.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - -Class Hierarchy (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For All Packages

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/package-list b/connectors/docs/0.3.0/delta-standalone/api/java/package-list deleted file mode 100644 index 14c216e7f77..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/package-list +++ /dev/null @@ -1,8 +0,0 @@ -io.delta.standalone -io.delta.standalone.actions -io.delta.standalone.data -io.delta.standalone.exceptions -io.delta.standalone.expressions -io.delta.standalone.storage -io.delta.standalone.types -io.delta.standalone.util diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/script.js b/connectors/docs/0.3.0/delta-standalone/api/java/script.js deleted file mode 100644 index b3463569314..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/script.js +++ /dev/null @@ -1,30 +0,0 @@ -function show(type) -{ - count = 0; - for (var key in methods) { - var row = document.getElementById(key); - if ((methods[key] & type) != 0) { - row.style.display = ''; - row.className = (count++ % 2) ? rowColor : altColor; - } - else - row.style.display = 'none'; - } - updateTabs(type); -} - -function updateTabs(type) -{ - for (var value in tabs) { - var sNode = document.getElementById(tabs[value][0]); - var spanNode = sNode.firstChild; - if (value == type) { - sNode.className = activeTableTab; - spanNode.innerHTML = tabs[value][1]; - } - else { - sNode.className = tableTab; - spanNode.innerHTML = "" + tabs[value][1] + ""; - } - } -} diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/serialized-form.html b/connectors/docs/0.3.0/delta-standalone/api/java/serialized-form.html deleted file mode 100644 index 9c5ed3c6f23..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/serialized-form.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - -Serialized Form (Delta Standalone Reader 0.3.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Serialized Form

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.3.0/delta-standalone/api/java/stylesheet.css b/connectors/docs/0.3.0/delta-standalone/api/java/stylesheet.css deleted file mode 100644 index 98055b22d6d..00000000000 --- a/connectors/docs/0.3.0/delta-standalone/api/java/stylesheet.css +++ /dev/null @@ -1,574 +0,0 @@ -/* Javadoc style sheet */ -/* -Overall document style -*/ - -@import url('resources/fonts/dejavu.css'); - -body { - background-color:#ffffff; - color:#353833; - font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; - font-size:14px; - margin:0; -} -a:link, a:visited { - text-decoration:none; - color:#4A6782; -} -a:hover, a:focus { - text-decoration:none; - color:#bb7a2a; -} -a:active { - text-decoration:none; - color:#4A6782; -} -a[name] { - color:#353833; -} -a[name]:hover { - text-decoration:none; - color:#353833; -} -pre { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; -} -h1 { - font-size:20px; -} -h2 { - font-size:18px; -} -h3 { - font-size:16px; - font-style:italic; -} -h4 { - font-size:13px; -} -h5 { - font-size:12px; -} -h6 { - font-size:11px; -} -ul { - list-style-type:disc; -} -code, tt { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; - margin-top:8px; - line-height:1.4em; -} -dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; -} -table tr td dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - vertical-align:top; - padding-top:4px; -} -sup { - font-size:8px; -} -/* -Document title and Copyright styles -*/ -.clear { - clear:both; - height:0px; - overflow:hidden; -} -.aboutLanguage { - float:right; - padding:0px 21px; - font-size:11px; - z-index:200; - margin-top:-9px; -} -.legalCopy { - margin-left:.5em; -} -.bar a, .bar a:link, .bar a:visited, .bar a:active { - color:#FFFFFF; - text-decoration:none; -} -.bar a:hover, .bar a:focus { - color:#bb7a2a; -} -.tab { - background-color:#0066FF; - color:#ffffff; - padding:8px; - width:5em; - font-weight:bold; -} -/* -Navigation bar styles -*/ -.bar { - background-color:#4D7A97; - color:#FFFFFF; - padding:.8em .5em .4em .8em; - height:auto;/*height:1.8em;*/ - font-size:11px; - margin:0; -} -.topNav { - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.bottomNav { - margin-top:10px; - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.subNav { - background-color:#dee3e9; - float:left; - width:100%; - overflow:hidden; - font-size:12px; -} -.subNav div { - clear:left; - float:left; - padding:0 0 5px 6px; - text-transform:uppercase; -} -ul.navList, ul.subNavList { - float:left; - margin:0 25px 0 0; - padding:0; -} -ul.navList li{ - list-style:none; - float:left; - padding: 5px 6px; - text-transform:uppercase; -} -ul.subNavList li{ - list-style:none; - float:left; -} -.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { - color:#FFFFFF; - text-decoration:none; - text-transform:uppercase; -} -.topNav a:hover, .bottomNav a:hover { - text-decoration:none; - color:#bb7a2a; - text-transform:uppercase; -} -.navBarCell1Rev { - background-color:#F8981D; - color:#253441; - margin: auto 5px; -} -.skipNav { - position:absolute; - top:auto; - left:-9999px; - overflow:hidden; -} -/* -Page header and footer styles -*/ -.header, .footer { - clear:both; - margin:0 20px; - padding:5px 0 0 0; -} -.indexHeader { - margin:10px; - position:relative; -} -.indexHeader span{ - margin-right:15px; -} -.indexHeader h1 { - font-size:13px; -} -.title { - color:#2c4557; - margin:10px 0; -} -.subTitle { - margin:5px 0 0 0; -} -.header ul { - margin:0 0 15px 0; - padding:0; -} -.footer ul { - margin:20px 0 5px 0; -} -.header ul li, .footer ul li { - list-style:none; - font-size:13px; -} -/* -Heading styles -*/ -div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList ul.blockList li.blockList h3 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList li.blockList h3 { - padding:0; - margin:15px 0; -} -ul.blockList li.blockList h2 { - padding:0px 0 20px 0; -} -/* -Page layout container styles -*/ -.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { - clear:both; - padding:10px 20px; - position:relative; -} -.indexContainer { - margin:10px; - position:relative; - font-size:12px; -} -.indexContainer h2 { - font-size:13px; - padding:0 0 3px 0; -} -.indexContainer ul { - margin:0; - padding:0; -} -.indexContainer ul li { - list-style:none; - padding-top:2px; -} -.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { - font-size:12px; - font-weight:bold; - margin:10px 0 0 0; - color:#4E4E4E; -} -.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { - margin:5px 0 10px 0px; - font-size:14px; - font-family:'DejaVu Sans Mono',monospace; -} -.serializedFormContainer dl.nameValue dt { - margin-left:1px; - font-size:1.1em; - display:inline; - font-weight:bold; -} -.serializedFormContainer dl.nameValue dd { - margin:0 0 0 1px; - font-size:1.1em; - display:inline; -} -/* -List styles -*/ -ul.horizontal li { - display:inline; - font-size:0.9em; -} -ul.inheritance { - margin:0; - padding:0; -} -ul.inheritance li { - display:inline; - list-style:none; -} -ul.inheritance li ul.inheritance { - margin-left:15px; - padding-left:15px; - padding-top:1px; -} -ul.blockList, ul.blockListLast { - margin:10px 0 10px 0; - padding:0; -} -ul.blockList li.blockList, ul.blockListLast li.blockList { - list-style:none; - margin-bottom:15px; - line-height:1.4; -} -ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { - padding:0px 20px 5px 10px; - border:1px solid #ededed; - background-color:#f8f8f8; -} -ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { - padding:0 0 5px 8px; - background-color:#ffffff; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { - margin-left:0; - padding-left:0; - padding-bottom:15px; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { - list-style:none; - border-bottom:none; - padding-bottom:0; -} -table tr td dl, table tr td dl dt, table tr td dl dd { - margin-top:0; - margin-bottom:1px; -} -/* -Table styles -*/ -.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { - width:100%; - border-left:1px solid #EEE; - border-right:1px solid #EEE; - border-bottom:1px solid #EEE; -} -.overviewSummary, .memberSummary { - padding:0px; -} -.overviewSummary caption, .memberSummary caption, .typeSummary caption, -.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { - position:relative; - text-align:left; - background-repeat:no-repeat; - color:#253441; - font-weight:bold; - clear:none; - overflow:hidden; - padding:0px; - padding-top:10px; - padding-left:1px; - margin:0px; - white-space:pre; -} -.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, -.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, -.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, -.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, -.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, -.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, -.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, -.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { - color:#FFFFFF; -} -.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, -.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - padding-bottom:7px; - display:inline-block; - float:left; - background-color:#F8981D; - border: none; - height:16px; -} -.memberSummary caption span.activeTableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#F8981D; - height:16px; -} -.memberSummary caption span.tableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#4D7A97; - height:16px; -} -.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { - padding-top:0px; - padding-left:0px; - padding-right:0px; - background-image:none; - float:none; - display:inline; -} -.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, -.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { - display:none; - width:5px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .activeTableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .tableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - background-color:#4D7A97; - float:left; - -} -.overviewSummary td, .memberSummary td, .typeSummary td, -.useSummary td, .constantsSummary td, .deprecatedSummary td { - text-align:left; - padding:0px 0px 12px 10px; -} -th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, -td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ - vertical-align:top; - padding-right:0px; - padding-top:8px; - padding-bottom:3px; -} -th.colFirst, th.colLast, th.colOne, .constantsSummary th { - background:#dee3e9; - text-align:left; - padding:8px 3px 3px 7px; -} -td.colFirst, th.colFirst { - white-space:nowrap; - font-size:13px; -} -td.colLast, th.colLast { - font-size:13px; -} -td.colOne, th.colOne { - font-size:13px; -} -.overviewSummary td.colFirst, .overviewSummary th.colFirst, -.useSummary td.colFirst, .useSummary th.colFirst, -.overviewSummary td.colOne, .overviewSummary th.colOne, -.memberSummary td.colFirst, .memberSummary th.colFirst, -.memberSummary td.colOne, .memberSummary th.colOne, -.typeSummary td.colFirst{ - width:25%; - vertical-align:top; -} -td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { - font-weight:bold; -} -.tableSubHeadingColor { - background-color:#EEEEFF; -} -.altColor { - background-color:#FFFFFF; -} -.rowColor { - background-color:#EEEEEF; -} -/* -Content styles -*/ -.description pre { - margin-top:0; -} -.deprecatedContent { - margin:0; - padding:10px 0; -} -.docSummary { - padding:0; -} - -ul.blockList ul.blockList ul.blockList li.blockList h3 { - font-style:normal; -} - -div.block { - font-size:14px; - font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; -} - -td.colLast div { - padding-top:0px; -} - - -td.colLast a { - padding-bottom:3px; -} -/* -Formatting effect styles -*/ -.sourceLineNo { - color:green; - padding:0 30px 0 0; -} -h1.hidden { - visibility:hidden; - overflow:hidden; - font-size:10px; -} -.block { - display:block; - margin:3px 10px 2px 0px; - color:#474747; -} -.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, -.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, -.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { - font-weight:bold; -} -.deprecationComment, .emphasizedPhrase, .interfaceName { - font-style:italic; -} - -div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, -div.block div.block span.interfaceName { - font-style:normal; -} - -div.contentContainer ul.blockList li.blockList h2{ - padding-bottom:0px; -} diff --git a/connectors/docs/0.4.0/delta-flink/api/java/allclasses-frame.html b/connectors/docs/0.4.0/delta-flink/api/java/allclasses-frame.html deleted file mode 100644 index c727c643da0..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/allclasses-frame.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - -All Classes (Flink Connector0.4.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.4.0/delta-flink/api/java/allclasses-noframe.html b/connectors/docs/0.4.0/delta-flink/api/java/allclasses-noframe.html deleted file mode 100644 index c2f5b0ada52..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/allclasses-noframe.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - -All Classes (Flink Connector0.4.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.4.0/delta-flink/api/java/constant-values.html b/connectors/docs/0.4.0/delta-flink/api/java/constant-values.html deleted file mode 100644 index 49e91092656..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/constant-values.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - -Constant Field Values (Flink Connector0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Constant Field Values

-

Contents

-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-flink/api/java/deprecated-list.html b/connectors/docs/0.4.0/delta-flink/api/java/deprecated-list.html deleted file mode 100644 index da3dff6490c..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/deprecated-list.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - -Deprecated List (Flink Connector0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Deprecated API

-

Contents

-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-flink/api/java/help-doc.html b/connectors/docs/0.4.0/delta-flink/api/java/help-doc.html deleted file mode 100644 index 8475871239e..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/help-doc.html +++ /dev/null @@ -1,217 +0,0 @@ - - - - - -API Help (Flink Connector0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

How This API Document Is Organized

-
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
-
-
- -This help file applies to API documentation generated using the standard doclet.
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-flink/api/java/index-all.html b/connectors/docs/0.4.0/delta-flink/api/java/index-all.html deleted file mode 100644 index 61de250f1da..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/index-all.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - -Index (Flink Connector0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
B D F I R W  - - -

B

-
-
build() - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Creates the actual sink.
-
-
- - - -

D

-
-
DeltaSink<IN> - Class in io.delta.flink.sink
-
-
A unified sink that emits its input elements to file system files within buckets using - Parquet format and commits those files to the DeltaLog.
-
-
- - - -

F

-
-
forRowData(Path, Configuration, RowType) - Static method in class io.delta.flink.sink.DeltaSink
-
-
Convenience method for creating a RowDataDeltaSinkBuilder for DeltaSink to a - Delta table.
-
-
- - - -

I

-
-
io.delta.flink.sink - package io.delta.flink.sink
-
 
-
- - - -

R

-
-
RowDataDeltaSinkBuilder - Class in io.delta.flink.sink
-
-
A builder class for DeltaSink for a stream of RowData.
-
-
RowDataDeltaSinkBuilder(Path, Configuration, RowType, boolean) - Constructor for class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Creates instance of the builder for DeltaSink.
-
-
- - - -

W

-
-
withMergeSchema(boolean) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets the sink's option whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch during a commit to the - DeltaLog.
-
-
withPartitionColumns(String...) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets list of partition fields that will be extracted from incoming RowData events.
-
-
-B D F I R W 
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-flink/api/java/index.html b/connectors/docs/0.4.0/delta-flink/api/java/index.html deleted file mode 100644 index 1a4f4d84da3..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/index.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - -Flink Connector0.4.0 JavaDoc - - - - - - -<noscript> -<div>JavaScript is disabled on your browser.</div> -</noscript> -<h2>Frame Alert</h2> -<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="io/delta/flink/sink/package-summary.html">Non-frame version</a>.</p> - - - diff --git a/connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html b/connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html deleted file mode 100644 index 864059ad9c2..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html +++ /dev/null @@ -1,307 +0,0 @@ - - - - - -DeltaSink (Flink Connector0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.sink
-

Class DeltaSink<IN>

-
-
- -
-
    -
  • -
    -
    Type Parameters:
    -
    IN - Type of the elements in the input of the sink that are also the elements to be - written to its output
    -
    -
    -
    -
    public class DeltaSink<IN>
    -extends <any>
    -
    A unified sink that emits its input elements to file system files within buckets using - Parquet format and commits those files to the DeltaLog. This sink achieves exactly-once - semantics for both BATCH and STREAMING. -

    - For most use cases users should use forRowData(org.apache.flink.core.fs.Path, org.apache.hadoop.conf.Configuration, org.apache.flink.table.types.logical.RowType) utility method to instantiate - the sink which provides proper writer factory implementation for the stream of RowData. -

    - To create new instance of the sink to a non-partitioned Delta table for stream of - RowData: -

    -     DataStream<RowData> stream = ...;
    -     RowType rowType = ...;
    -     ...
    -
    -     // sets a sink to a non-partitioned Delta table
    -     DeltaSink<RowData> deltaSink = DeltaSink.forRowData(
    -             new Path(deltaTablePath),
    -             new Configuration(),
    -             rowType).build();
    -     stream.sinkTo(deltaSink);
    - 
    - - To create new instance of the sink to a partitioned Delta table for stream of RowData: -
    -     String[] partitionCols = ...; // array of partition columns' names
    -
    -     DeltaSink<RowData> deltaSink = DeltaSink.forRowData(
    -             new Path(deltaTablePath),
    -             new Configuration(),
    -             rowType)
    -         .withPartitionColumns(partitionCols)
    -         .build();
    -     stream.sinkTo(deltaSink);
    - 
    -

    - Behaviour of this sink splits down upon two phases. The first phase takes place between - application's checkpoints when records are being flushed to files (or appended to writers' - buffers) where the behaviour is almost identical as in case of - FileSink. - Next during the checkpoint phase files are "closed" (renamed) by the independent instances of - io.delta.flink.sink.internal.committer.DeltaCommitter that behave very similar - to FileCommitter. - When all the parallel committers are done, then all the files are committed at once by - single-parallelism io.delta.flink.sink.internal.committer.DeltaGlobalCommitter. -

    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - -
      All Methods Static Methods Concrete Methods 
      Modifier and TypeMethod and Description
      static RowDataDeltaSinkBuilderforRowData(org.apache.flink.core.fs.Path basePath, - org.apache.hadoop.conf.Configuration conf, - org.apache.flink.table.types.logical.RowType rowType) -
      Convenience method for creating a RowDataDeltaSinkBuilder for DeltaSink to a - Delta table.
      -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        forRowData

        -
        public static RowDataDeltaSinkBuilder forRowData(org.apache.flink.core.fs.Path basePath,
        -                                                 org.apache.hadoop.conf.Configuration conf,
        -                                                 org.apache.flink.table.types.logical.RowType rowType)
        -
        Convenience method for creating a RowDataDeltaSinkBuilder for DeltaSink to a - Delta table.
        -
        -
        Parameters:
        -
        basePath - root path of the Delta table
        -
        conf - Hadoop's conf object that will be used for creating instances of - DeltaLog and will be also passed to the - ParquetRowDataBuilder to create ParquetWriterFactory
        -
        rowType - Flink's logical type to indicate the structure of the events in the stream
        -
        Returns:
        -
        builder for the DeltaSink
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html b/connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html deleted file mode 100644 index 96f51995fef..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html +++ /dev/null @@ -1,356 +0,0 @@ - - - - - -RowDataDeltaSinkBuilder (Flink Connector0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.sink
-

Class RowDataDeltaSinkBuilder

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      RowDataDeltaSinkBuilder(org.apache.flink.core.fs.Path tableBasePath, - org.apache.hadoop.conf.Configuration conf, - org.apache.flink.table.types.logical.RowType rowType, - boolean mergeSchema) -
      Creates instance of the builder for DeltaSink.
      -
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      DeltaSink<org.apache.flink.table.data.RowData>build() -
      Creates the actual sink.
      -
      RowDataDeltaSinkBuilderwithMergeSchema(boolean mergeSchema) -
      Sets the sink's option whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch during a commit to the - DeltaLog.
      -
      RowDataDeltaSinkBuilderwithPartitionColumns(String... partitionColumns) -
      Sets list of partition fields that will be extracted from incoming RowData events.
      -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        RowDataDeltaSinkBuilder

        -
        public RowDataDeltaSinkBuilder(org.apache.flink.core.fs.Path tableBasePath,
        -                               org.apache.hadoop.conf.Configuration conf,
        -                               org.apache.flink.table.types.logical.RowType rowType,
        -                               boolean mergeSchema)
        -
        Creates instance of the builder for DeltaSink.
        -
        -
        Parameters:
        -
        tableBasePath - path to a Delta table
        -
        conf - Hadoop's conf object
        -
        rowType - Flink's logical type to indicate the structure of the events in - the stream
        -
        mergeSchema - whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch. This is not guaranteed - since it checks for compatible schemas.
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        withMergeSchema

        -
        public RowDataDeltaSinkBuilder withMergeSchema(boolean mergeSchema)
        -
        Sets the sink's option whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch during a commit to the - DeltaLog. The update is not guaranteed since it checks for - compatible schemas.
        -
        -
        Parameters:
        -
        mergeSchema - whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch. This is not guaranteed - since it requires compatible schemas.
        -
        Returns:
        -
        builder for DeltaSink
        -
        -
      • -
      - - - -
        -
      • -

        withPartitionColumns

        -
        public RowDataDeltaSinkBuilder withPartitionColumns(String... partitionColumns)
        -
        Sets list of partition fields that will be extracted from incoming RowData events. -

        - Provided fields' names must correspond to the names provided in the RowType object - for this sink and must be in the same order as expected order of occurrence in the partition - path that will be generated.

        -
        -
        Parameters:
        -
        partitionColumns - array of partition columns' names in the order they should be applied - when creating destination path.
        -
        Returns:
        -
        builder for DeltaSink
        -
        -
      • -
      - - - -
        -
      • -

        build

        -
        public DeltaSink<org.apache.flink.table.data.RowData> build()
        -
        Creates the actual sink.
        -
        -
        Returns:
        -
        constructed DeltaSink object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/package-frame.html b/connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/package-frame.html deleted file mode 100644 index 39b8f7f70f4..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -io.delta.flink.sink (Flink Connector0.4.0 JavaDoc) - - - - - -

io.delta.flink.sink

-
-

Classes

- -
- - diff --git a/connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/package-summary.html b/connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/package-summary.html deleted file mode 100644 index ec09291a1ac..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/package-summary.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - -io.delta.flink.sink (Flink Connector0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.flink.sink

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/package-tree.html b/connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/package-tree.html deleted file mode 100644 index c217e32d5ce..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/io/delta/flink/sink/package-tree.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - -io.delta.flink.sink Class Hierarchy (Flink Connector0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.flink.sink

-
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-flink/api/java/overview-tree.html b/connectors/docs/0.4.0/delta-flink/api/java/overview-tree.html deleted file mode 100644 index 90bc4f7f0b1..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/overview-tree.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - -Class Hierarchy (Flink Connector0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For All Packages

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-flink/api/java/package-list b/connectors/docs/0.4.0/delta-flink/api/java/package-list deleted file mode 100644 index 5aa882fee5c..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/package-list +++ /dev/null @@ -1 +0,0 @@ -io.delta.flink.sink diff --git a/connectors/docs/0.4.0/delta-flink/api/java/script.js b/connectors/docs/0.4.0/delta-flink/api/java/script.js deleted file mode 100644 index b3463569314..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/script.js +++ /dev/null @@ -1,30 +0,0 @@ -function show(type) -{ - count = 0; - for (var key in methods) { - var row = document.getElementById(key); - if ((methods[key] & type) != 0) { - row.style.display = ''; - row.className = (count++ % 2) ? rowColor : altColor; - } - else - row.style.display = 'none'; - } - updateTabs(type); -} - -function updateTabs(type) -{ - for (var value in tabs) { - var sNode = document.getElementById(tabs[value][0]); - var spanNode = sNode.firstChild; - if (value == type) { - sNode.className = activeTableTab; - spanNode.innerHTML = tabs[value][1]; - } - else { - sNode.className = tableTab; - spanNode.innerHTML = "" + tabs[value][1] + ""; - } - } -} diff --git a/connectors/docs/0.4.0/delta-flink/api/java/stylesheet.css b/connectors/docs/0.4.0/delta-flink/api/java/stylesheet.css deleted file mode 100644 index 98055b22d6d..00000000000 --- a/connectors/docs/0.4.0/delta-flink/api/java/stylesheet.css +++ /dev/null @@ -1,574 +0,0 @@ -/* Javadoc style sheet */ -/* -Overall document style -*/ - -@import url('resources/fonts/dejavu.css'); - -body { - background-color:#ffffff; - color:#353833; - font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; - font-size:14px; - margin:0; -} -a:link, a:visited { - text-decoration:none; - color:#4A6782; -} -a:hover, a:focus { - text-decoration:none; - color:#bb7a2a; -} -a:active { - text-decoration:none; - color:#4A6782; -} -a[name] { - color:#353833; -} -a[name]:hover { - text-decoration:none; - color:#353833; -} -pre { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; -} -h1 { - font-size:20px; -} -h2 { - font-size:18px; -} -h3 { - font-size:16px; - font-style:italic; -} -h4 { - font-size:13px; -} -h5 { - font-size:12px; -} -h6 { - font-size:11px; -} -ul { - list-style-type:disc; -} -code, tt { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; - margin-top:8px; - line-height:1.4em; -} -dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; -} -table tr td dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - vertical-align:top; - padding-top:4px; -} -sup { - font-size:8px; -} -/* -Document title and Copyright styles -*/ -.clear { - clear:both; - height:0px; - overflow:hidden; -} -.aboutLanguage { - float:right; - padding:0px 21px; - font-size:11px; - z-index:200; - margin-top:-9px; -} -.legalCopy { - margin-left:.5em; -} -.bar a, .bar a:link, .bar a:visited, .bar a:active { - color:#FFFFFF; - text-decoration:none; -} -.bar a:hover, .bar a:focus { - color:#bb7a2a; -} -.tab { - background-color:#0066FF; - color:#ffffff; - padding:8px; - width:5em; - font-weight:bold; -} -/* -Navigation bar styles -*/ -.bar { - background-color:#4D7A97; - color:#FFFFFF; - padding:.8em .5em .4em .8em; - height:auto;/*height:1.8em;*/ - font-size:11px; - margin:0; -} -.topNav { - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.bottomNav { - margin-top:10px; - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.subNav { - background-color:#dee3e9; - float:left; - width:100%; - overflow:hidden; - font-size:12px; -} -.subNav div { - clear:left; - float:left; - padding:0 0 5px 6px; - text-transform:uppercase; -} -ul.navList, ul.subNavList { - float:left; - margin:0 25px 0 0; - padding:0; -} -ul.navList li{ - list-style:none; - float:left; - padding: 5px 6px; - text-transform:uppercase; -} -ul.subNavList li{ - list-style:none; - float:left; -} -.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { - color:#FFFFFF; - text-decoration:none; - text-transform:uppercase; -} -.topNav a:hover, .bottomNav a:hover { - text-decoration:none; - color:#bb7a2a; - text-transform:uppercase; -} -.navBarCell1Rev { - background-color:#F8981D; - color:#253441; - margin: auto 5px; -} -.skipNav { - position:absolute; - top:auto; - left:-9999px; - overflow:hidden; -} -/* -Page header and footer styles -*/ -.header, .footer { - clear:both; - margin:0 20px; - padding:5px 0 0 0; -} -.indexHeader { - margin:10px; - position:relative; -} -.indexHeader span{ - margin-right:15px; -} -.indexHeader h1 { - font-size:13px; -} -.title { - color:#2c4557; - margin:10px 0; -} -.subTitle { - margin:5px 0 0 0; -} -.header ul { - margin:0 0 15px 0; - padding:0; -} -.footer ul { - margin:20px 0 5px 0; -} -.header ul li, .footer ul li { - list-style:none; - font-size:13px; -} -/* -Heading styles -*/ -div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList ul.blockList li.blockList h3 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList li.blockList h3 { - padding:0; - margin:15px 0; -} -ul.blockList li.blockList h2 { - padding:0px 0 20px 0; -} -/* -Page layout container styles -*/ -.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { - clear:both; - padding:10px 20px; - position:relative; -} -.indexContainer { - margin:10px; - position:relative; - font-size:12px; -} -.indexContainer h2 { - font-size:13px; - padding:0 0 3px 0; -} -.indexContainer ul { - margin:0; - padding:0; -} -.indexContainer ul li { - list-style:none; - padding-top:2px; -} -.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { - font-size:12px; - font-weight:bold; - margin:10px 0 0 0; - color:#4E4E4E; -} -.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { - margin:5px 0 10px 0px; - font-size:14px; - font-family:'DejaVu Sans Mono',monospace; -} -.serializedFormContainer dl.nameValue dt { - margin-left:1px; - font-size:1.1em; - display:inline; - font-weight:bold; -} -.serializedFormContainer dl.nameValue dd { - margin:0 0 0 1px; - font-size:1.1em; - display:inline; -} -/* -List styles -*/ -ul.horizontal li { - display:inline; - font-size:0.9em; -} -ul.inheritance { - margin:0; - padding:0; -} -ul.inheritance li { - display:inline; - list-style:none; -} -ul.inheritance li ul.inheritance { - margin-left:15px; - padding-left:15px; - padding-top:1px; -} -ul.blockList, ul.blockListLast { - margin:10px 0 10px 0; - padding:0; -} -ul.blockList li.blockList, ul.blockListLast li.blockList { - list-style:none; - margin-bottom:15px; - line-height:1.4; -} -ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { - padding:0px 20px 5px 10px; - border:1px solid #ededed; - background-color:#f8f8f8; -} -ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { - padding:0 0 5px 8px; - background-color:#ffffff; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { - margin-left:0; - padding-left:0; - padding-bottom:15px; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { - list-style:none; - border-bottom:none; - padding-bottom:0; -} -table tr td dl, table tr td dl dt, table tr td dl dd { - margin-top:0; - margin-bottom:1px; -} -/* -Table styles -*/ -.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { - width:100%; - border-left:1px solid #EEE; - border-right:1px solid #EEE; - border-bottom:1px solid #EEE; -} -.overviewSummary, .memberSummary { - padding:0px; -} -.overviewSummary caption, .memberSummary caption, .typeSummary caption, -.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { - position:relative; - text-align:left; - background-repeat:no-repeat; - color:#253441; - font-weight:bold; - clear:none; - overflow:hidden; - padding:0px; - padding-top:10px; - padding-left:1px; - margin:0px; - white-space:pre; -} -.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, -.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, -.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, -.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, -.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, -.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, -.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, -.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { - color:#FFFFFF; -} -.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, -.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - padding-bottom:7px; - display:inline-block; - float:left; - background-color:#F8981D; - border: none; - height:16px; -} -.memberSummary caption span.activeTableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#F8981D; - height:16px; -} -.memberSummary caption span.tableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#4D7A97; - height:16px; -} -.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { - padding-top:0px; - padding-left:0px; - padding-right:0px; - background-image:none; - float:none; - display:inline; -} -.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, -.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { - display:none; - width:5px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .activeTableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .tableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - background-color:#4D7A97; - float:left; - -} -.overviewSummary td, .memberSummary td, .typeSummary td, -.useSummary td, .constantsSummary td, .deprecatedSummary td { - text-align:left; - padding:0px 0px 12px 10px; -} -th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, -td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ - vertical-align:top; - padding-right:0px; - padding-top:8px; - padding-bottom:3px; -} -th.colFirst, th.colLast, th.colOne, .constantsSummary th { - background:#dee3e9; - text-align:left; - padding:8px 3px 3px 7px; -} -td.colFirst, th.colFirst { - white-space:nowrap; - font-size:13px; -} -td.colLast, th.colLast { - font-size:13px; -} -td.colOne, th.colOne { - font-size:13px; -} -.overviewSummary td.colFirst, .overviewSummary th.colFirst, -.useSummary td.colFirst, .useSummary th.colFirst, -.overviewSummary td.colOne, .overviewSummary th.colOne, -.memberSummary td.colFirst, .memberSummary th.colFirst, -.memberSummary td.colOne, .memberSummary th.colOne, -.typeSummary td.colFirst{ - width:25%; - vertical-align:top; -} -td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { - font-weight:bold; -} -.tableSubHeadingColor { - background-color:#EEEEFF; -} -.altColor { - background-color:#FFFFFF; -} -.rowColor { - background-color:#EEEEEF; -} -/* -Content styles -*/ -.description pre { - margin-top:0; -} -.deprecatedContent { - margin:0; - padding:10px 0; -} -.docSummary { - padding:0; -} - -ul.blockList ul.blockList ul.blockList li.blockList h3 { - font-style:normal; -} - -div.block { - font-size:14px; - font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; -} - -td.colLast div { - padding-top:0px; -} - - -td.colLast a { - padding-bottom:3px; -} -/* -Formatting effect styles -*/ -.sourceLineNo { - color:green; - padding:0 30px 0 0; -} -h1.hidden { - visibility:hidden; - overflow:hidden; - font-size:10px; -} -.block { - display:block; - margin:3px 10px 2px 0px; - color:#474747; -} -.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, -.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, -.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { - font-weight:bold; -} -.deprecationComment, .emphasizedPhrase, .interfaceName { - font-style:italic; -} - -div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, -div.block div.block span.interfaceName { - font-style:normal; -} - -div.contentContainer ul.blockList li.blockList h2{ - padding-bottom:0px; -} diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/allclasses-frame.html b/connectors/docs/0.4.0/delta-standalone/api/java/allclasses-frame.html deleted file mode 100644 index 91a25e882f8..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/allclasses-frame.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - -All Classes (Delta Standalone 0.4.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/allclasses-noframe.html b/connectors/docs/0.4.0/delta-standalone/api/java/allclasses-noframe.html deleted file mode 100644 index 1dc6db474c7..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/allclasses-noframe.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - -All Classes (Delta Standalone 0.4.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/constant-values.html b/connectors/docs/0.4.0/delta-standalone/api/java/constant-values.html deleted file mode 100644 index c57e92cf90b..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/constant-values.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - -Constant Field Values (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Constant Field Values

-

Contents

- -
-
- - -

io.delta.*

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/deprecated-list.html b/connectors/docs/0.4.0/delta-standalone/api/java/deprecated-list.html deleted file mode 100644 index fe5e5d52e1d..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/deprecated-list.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - -Deprecated List (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Deprecated API

-

Contents

- -
-
- - - -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/help-doc.html b/connectors/docs/0.4.0/delta-standalone/api/java/help-doc.html deleted file mode 100644 index c64c2645c21..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/help-doc.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - -API Help (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

How This API Document Is Organized

-
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
-
-
- -This help file applies to API documentation generated using the standard doclet.
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/index-all.html b/connectors/docs/0.4.0/delta-standalone/api/java/index-all.html deleted file mode 100644 index 4792acdda42..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/index-all.html +++ /dev/null @@ -1,1531 +0,0 @@ - - - - - -Index (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
A B C D E F G H I J L M N O P R S T U V W  - - -

A

-
-
Action - Interface in io.delta.standalone.actions
-
-
A marker interface for all actions that can be applied to a Delta table.
-
-
add(StructField) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new field.
-
-
add(String, DataType) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new nullable field with no metadata.
-
-
add(String, DataType, boolean) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new field with no metadata.
-
-
AddCDCFile - Class in io.delta.standalone.actions
-
-
A change file containing CDC data for the Delta version it's within.
-
-
AddCDCFile(String, Map<String, String>, long, Map<String, String>) - Constructor for class io.delta.standalone.actions.AddCDCFile
-
 
-
AddFile - Class in io.delta.standalone.actions
-
-
Represents an action that adds a new file to the table.
-
-
AddFile(String, Map<String, String>, long, long, boolean, String, Map<String, String>) - Constructor for class io.delta.standalone.actions.AddFile
-
 
-
AddFile.Builder - Class in io.delta.standalone.actions
-
-
Builder class for AddFile.
-
-
And - Class in io.delta.standalone.expressions
-
-
Evaluates logical expr1 AND expr2 for new And(expr1, expr2).
-
-
And(Expression, Expression) - Constructor for class io.delta.standalone.expressions.And
-
 
-
ArrayType - Class in io.delta.standalone.types
-
-
The data type for collections of multiple values.
-
-
ArrayType(DataType, boolean) - Constructor for class io.delta.standalone.types.ArrayType
-
 
-
- - - -

B

-
-
BinaryComparison - Class in io.delta.standalone.expressions
-
-
A BinaryOperator that compares the left and right Expressions and evaluates to a - boolean value.
-
-
BinaryExpression - Class in io.delta.standalone.expressions
-
-
An Expression with two inputs and one output.
-
-
BinaryOperator - Class in io.delta.standalone.expressions
-
-
A BinaryExpression that is an operator, meaning the string representation is - x symbol y, rather than funcName(x, y).
-
-
BinaryType - Class in io.delta.standalone.types
-
-
The data type representing byte[] values.
-
-
BinaryType() - Constructor for class io.delta.standalone.types.BinaryType
-
 
-
BooleanType - Class in io.delta.standalone.types
-
-
The data type representing boolean values.
-
-
BooleanType() - Constructor for class io.delta.standalone.types.BooleanType
-
 
-
build() - Method in class io.delta.standalone.actions.AddFile.Builder
-
-
Builds an AddFile using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
-
Builds a CommitInfo using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.JobInfo.Builder
-
-
Builds a JobInfo using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.Metadata.Builder
-
-
Builds a Metadata using the provided parameters.
-
-
build() - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
builder(String, Map<String, String>, long, long, boolean) - Static method in class io.delta.standalone.actions.AddFile
-
 
-
Builder(String, Map<String, String>, long, long, boolean) - Constructor for class io.delta.standalone.actions.AddFile.Builder
-
 
-
builder() - Static method in class io.delta.standalone.actions.CommitInfo
-
 
-
Builder() - Constructor for class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
builder(String) - Static method in class io.delta.standalone.actions.JobInfo
-
 
-
Builder(String) - Constructor for class io.delta.standalone.actions.JobInfo.Builder
-
 
-
builder() - Static method in class io.delta.standalone.actions.Metadata
-
 
-
Builder() - Constructor for class io.delta.standalone.actions.Metadata.Builder
-
 
-
builder() - Static method in class io.delta.standalone.types.FieldMetadata
-
 
-
Builder() - Constructor for class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
ByteType - Class in io.delta.standalone.types
-
-
The data type representing byte values.
-
-
ByteType() - Constructor for class io.delta.standalone.types.ByteType
-
 
-
- - - -

C

-
-
children() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
children() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
children() - Method in class io.delta.standalone.expressions.In
-
 
-
children() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
children() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
CloseableIterator<T> - Interface in io.delta.standalone.data
-
-
An Iterator that also implements the Closeable interface.
-
-
clusterId(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
Column - Class in io.delta.standalone.expressions
-
-
A column whose row-value will be computed based on the data in a RowRecord.
-
-
Column(String, DataType) - Constructor for class io.delta.standalone.expressions.Column
-
 
-
column(String) - Method in class io.delta.standalone.types.StructType
-
-
Creates a Column expression for the field with the given fieldName.
-
-
commit(Iterable<T>, Operation, String) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Modifies the state of the log by adding a new commit that is based on a read at the table's - latest version as of this transaction's instantiation.
-
-
CommitInfo - Class in io.delta.standalone.actions
-
-
Holds provenance information about changes to the table.
-
-
CommitInfo(Optional<Long>, Timestamp, Optional<String>, Optional<String>, String, Map<String, String>, Optional<JobInfo>, Optional<NotebookInfo>, Optional<String>, Optional<Long>, Optional<String>, Optional<Boolean>, Optional<Map<String, String>>, Optional<String>) - Constructor for class io.delta.standalone.actions.CommitInfo
-
 
-
CommitInfo(Optional<Long>, Timestamp, Optional<String>, Optional<String>, String, Map<String, String>, Optional<JobInfo>, Optional<NotebookInfo>, Optional<String>, Optional<Long>, Optional<String>, Optional<Boolean>, Optional<Map<String, String>>, Optional<String>, Optional<String>) - Constructor for class io.delta.standalone.actions.CommitInfo
-
 
-
CommitInfo.Builder - Class in io.delta.standalone.actions
-
-
Builder class for CommitInfo.
-
-
CommitResult - Class in io.delta.standalone
-
- -
-
CommitResult(long) - Constructor for class io.delta.standalone.CommitResult
-
 
-
ConcurrentAppendException - Exception in io.delta.standalone.exceptions
-
-
Thrown when files are added that would have been read by the current transaction.
-
-
ConcurrentAppendException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentAppendException
-
 
-
ConcurrentDeleteDeleteException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the current transaction deletes data that was deleted by a concurrent transaction.
-
-
ConcurrentDeleteDeleteException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentDeleteDeleteException
-
 
-
ConcurrentDeleteReadException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the current transaction reads data that was deleted by a concurrent transaction.
-
-
ConcurrentDeleteReadException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentDeleteReadException
-
 
-
ConcurrentTransactionException - Exception in io.delta.standalone.exceptions
-
-
Thrown when concurrent transaction both attempt to update the same idempotent transaction.
-
-
ConcurrentTransactionException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentTransactionException
-
 
-
configuration(Map<String, String>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
contains(String) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
containsNull() - Method in class io.delta.standalone.types.ArrayType
-
 
-
copyBuilder() - Method in class io.delta.standalone.actions.Metadata
-
 
-
createdTime(Long) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
createdTime(Optional<Long>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
- - - -

D

-
-
dataType() - Method in class io.delta.standalone.expressions.Column
-
 
-
dataType() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
dataType() - Method in class io.delta.standalone.expressions.Literal
-
 
-
dataType() - Method in interface io.delta.standalone.expressions.Predicate
-
 
-
DataType - Class in io.delta.standalone.types
-
-
The base type of all io.delta.standalone data types.
-
-
DataType() - Constructor for class io.delta.standalone.types.DataType
-
 
-
DateType - Class in io.delta.standalone.types
-
-
A date type, supporting "0001-01-01" through "9999-12-31".
-
-
DateType() - Constructor for class io.delta.standalone.types.DateType
-
 
-
DecimalType - Class in io.delta.standalone.types
-
-
The data type representing java.math.BigDecimal values.
-
-
DecimalType(int, int) - Constructor for class io.delta.standalone.types.DecimalType
-
 
-
DeltaConcurrentModificationException - Exception in io.delta.standalone.exceptions
-
-
The basic class for all Delta Standalone commit conflict exceptions.
-
-
DeltaConcurrentModificationException(String) - Constructor for exception io.delta.standalone.exceptions.DeltaConcurrentModificationException
-
 
-
DeltaLog - Interface in io.delta.standalone
-
-
Represents the transaction logs of a Delta table.
-
-
DeltaScan - Interface in io.delta.standalone
-
-
Provides access to an iterator over the files in this snapshot.
-
-
DeltaStandaloneException - Exception in io.delta.standalone.exceptions
-
-
Thrown when a query fails, usually because the query itself is invalid.
-
-
DeltaStandaloneException() - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
DeltaStandaloneException(String) - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
DeltaStandaloneException(String, Throwable) - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
deltaToParquet(StructType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, Boolean) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, ParquetSchemaConverter.ParquetOutputTimestampType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, Boolean, ParquetSchemaConverter.ParquetOutputTimestampType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
description(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
DoubleType - Class in io.delta.standalone.types
-
-
The data type representing double values.
-
-
DoubleType() - Constructor for class io.delta.standalone.types.DoubleType
-
 
-
- - - -

E

-
-
engineInfo(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.AddFile
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Format
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.JobInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Metadata
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Protocol
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.Column
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.Literal
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.types.ArrayType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.DataType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.DecimalType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
equals(Object) - Method in class io.delta.standalone.types.MapType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.StructField
-
 
-
equals(Object) - Method in class io.delta.standalone.types.StructType
-
 
-
EqualTo - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 = expr2 for new EqualTo(expr1, expr2).
-
-
EqualTo(Expression, Expression) - Constructor for class io.delta.standalone.expressions.EqualTo
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.Column
-
 
-
eval(RowRecord) - Method in interface io.delta.standalone.expressions.Expression
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.In
-
-
This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide.
-
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.IsNotNull
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.IsNull
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.Literal
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
executionTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to execute the entire operation.
-
-
Expression - Interface in io.delta.standalone.expressions
-
-
An expression in Delta Standalone.
-
-
- - - -

F

-
-
False - Static variable in class io.delta.standalone.expressions.Literal
-
 
-
FieldMetadata - Class in io.delta.standalone.types
-
-
The metadata for a given StructField.
-
-
FieldMetadata.Builder - Class in io.delta.standalone.types
-
-
Builder class for FieldMetadata.
-
-
FileAction - Interface in io.delta.standalone.actions
-
-
Generic interface for Actions pertaining to the addition and removal of files.
-
-
FloatType - Class in io.delta.standalone.types
-
-
The data type representing float values.
-
-
FloatType() - Constructor for class io.delta.standalone.types.FloatType
-
 
-
Format - Class in io.delta.standalone.actions
-
-
A specification of the encoding for the files stored in a table.
-
-
Format(String, Map<String, String>) - Constructor for class io.delta.standalone.actions.Format
-
 
-
Format() - Constructor for class io.delta.standalone.actions.Format
-
 
-
format(Format) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
forTable(Configuration, String) - Static method in interface io.delta.standalone.DeltaLog
-
-
Create a DeltaLog instance representing the table located at the provided - path.
-
-
forTable(Configuration, Path) - Static method in interface io.delta.standalone.DeltaLog
-
-
Create a DeltaLog instance representing the table located at the provided - path.
-
-
- - - -

G

-
-
get(String) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
get(String) - Method in class io.delta.standalone.types.StructType
-
 
-
getActions() - Method in class io.delta.standalone.VersionLog
-
 
-
getAllFiles() - Method in interface io.delta.standalone.Snapshot
-
 
-
getAppId() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getBigDecimal(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.math.BigDecimal.
-
-
getBinary(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as binary (byte array).
-
-
getBoolean(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive boolean.
-
-
getByte(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive byte.
-
-
getCatalogString() - Method in class io.delta.standalone.types.DataType
-
 
-
getChanges(long, boolean) - Method in interface io.delta.standalone.DeltaLog
-
-
Get all actions starting from startVersion (inclusive) in increasing order of - committed version.
-
-
getChild() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
getClusterId() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getCommitInfoAt(long) - Method in interface io.delta.standalone.DeltaLog
-
 
-
getConfiguration() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getCreatedTime() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getDataType() - Method in class io.delta.standalone.types.StructField
-
 
-
getDate(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.sql.Date.
-
-
getDeletionTimestamp() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getDescription() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getDouble(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive double.
-
-
getElementType() - Method in class io.delta.standalone.types.ArrayType
-
 
-
getEngineInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getEntries() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
getFieldNames() - Method in class io.delta.standalone.types.StructType
-
 
-
getFields() - Method in class io.delta.standalone.types.StructType
-
 
-
getFiles() - Method in interface io.delta.standalone.DeltaScan
-
-
Creates a CloseableIterator over files belonging to this snapshot.
-
-
getFloat(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive float.
-
-
getFormat() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getId() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getInputPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getInt(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive int.
-
-
getIsBlindAppend() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getIsolationLevel() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getJobId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getJobInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getJobName() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getJobOwnerId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getKeyType() - Method in class io.delta.standalone.types.MapType
-
 
-
getLastUpdated() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getLeft() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
getLength() - Method in interface io.delta.standalone.data.RowRecord
-
 
-
getList(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.util.List<T> object.
-
-
getLong(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive long.
-
-
getMap(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
-
-
getMetadata() - Method in interface io.delta.standalone.Snapshot
-
 
-
getMetadata() - Method in class io.delta.standalone.types.StructField
-
 
-
getMetrics() - Method in class io.delta.standalone.Operation
-
 
-
getMinReaderVersion() - Method in class io.delta.standalone.actions.Protocol
-
 
-
getMinWriterVersion() - Method in class io.delta.standalone.actions.Protocol
-
 
-
getModificationTime() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getName() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getName() - Method in class io.delta.standalone.Operation
-
 
-
getName() - Method in class io.delta.standalone.types.StructField
-
 
-
getNotebookId() - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
getNotebookInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperation() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperationMetrics() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperationParameters() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOptions() - Method in class io.delta.standalone.actions.Format
-
 
-
getParameters() - Method in class io.delta.standalone.Operation
-
 
-
getPartitionColumns() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getPath() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getPath() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getPath() - Method in interface io.delta.standalone.actions.FileAction
-
 
-
getPath() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getPath() - Method in interface io.delta.standalone.DeltaLog
-
 
-
getPrecision() - Method in class io.delta.standalone.types.DecimalType
-
 
-
getProvider() - Method in class io.delta.standalone.actions.Format
-
 
-
getPushedPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getReadVersion() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getRecord(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a RowRecord object.
-
-
getResidualPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getRight() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
getRunId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getScale() - Method in class io.delta.standalone.types.DecimalType
-
 
-
getSchema() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getSchema() - Method in interface io.delta.standalone.data.RowRecord
-
 
-
getShort(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive short.
-
-
getSimpleString() - Method in class io.delta.standalone.types.ByteType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.DataType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.IntegerType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.LongType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.ShortType
-
 
-
getSize() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getSize() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getSize() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getSnapshotForTimestampAsOf(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Travel back in time to the latest Snapshot that was generated at or before - timestamp.
-
-
getSnapshotForVersionAsOf(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Travel back in time to the Snapshot with the provided version number.
-
-
getStats() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getString(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a String object.
-
-
getTags() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getTags() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getTags() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getTimestamp() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getTimestamp(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.sql.Timestamp.
-
-
getTreeString() - Method in class io.delta.standalone.types.StructType
-
 
-
getTriggerType() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getTypeName() - Method in class io.delta.standalone.types.DataType
-
 
-
getUserId() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getUserMetadata() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getUserMetadata() - Method in class io.delta.standalone.Operation
-
 
-
getUserName() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getValueType() - Method in class io.delta.standalone.types.MapType
-
 
-
getVersion() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getVersion() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getVersion() - Method in class io.delta.standalone.CommitResult
-
 
-
getVersion() - Method in interface io.delta.standalone.Snapshot
-
 
-
getVersion() - Method in class io.delta.standalone.VersionLog
-
 
-
GreaterThan - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 > expr2 for new GreaterThan(expr1, expr2).
-
-
GreaterThan(Expression, Expression) - Constructor for class io.delta.standalone.expressions.GreaterThan
-
 
-
GreaterThanOrEqual - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 >= expr2 for new GreaterThanOrEqual(expr1, expr2).
-
-
GreaterThanOrEqual(Expression, Expression) - Constructor for class io.delta.standalone.expressions.GreaterThanOrEqual
-
 
-
- - - -

H

-
-
hashCode() - Method in class io.delta.standalone.actions.AddFile
-
 
-
hashCode() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Format
-
 
-
hashCode() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Metadata
-
 
-
hashCode() - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Protocol
-
 
-
hashCode() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.Column
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.Literal
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
hashCode() - Method in class io.delta.standalone.types.ArrayType
-
 
-
hashCode() - Method in class io.delta.standalone.types.DataType
-
 
-
hashCode() - Method in class io.delta.standalone.types.DecimalType
-
 
-
hashCode() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
hashCode() - Method in class io.delta.standalone.types.MapType
-
 
-
hashCode() - Method in class io.delta.standalone.types.StructField
-
 
-
hashCode() - Method in class io.delta.standalone.types.StructType
-
 
-
- - - -

I

-
-
id(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
In - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is in exprList for new In(expr, exprList).
-
-
In(Expression, List<? extends Expression>) - Constructor for class io.delta.standalone.expressions.In
-
 
-
initHadoopConf() - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
IntegerType - Class in io.delta.standalone.types
-
-
The data type representing int values.
-
-
IntegerType() - Constructor for class io.delta.standalone.types.IntegerType
-
 
-
io.delta.standalone - package io.delta.standalone
-
 
-
io.delta.standalone.actions - package io.delta.standalone.actions
-
 
-
io.delta.standalone.data - package io.delta.standalone.data
-
 
-
io.delta.standalone.exceptions - package io.delta.standalone.exceptions
-
 
-
io.delta.standalone.expressions - package io.delta.standalone.expressions
-
 
-
io.delta.standalone.storage - package io.delta.standalone.storage
-
 
-
io.delta.standalone.types - package io.delta.standalone.types
-
 
-
io.delta.standalone.util - package io.delta.standalone.util
-
 
-
isBlindAppend(Boolean) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.AddFile
-
 
-
isDataChange() - Method in interface io.delta.standalone.actions.FileAction
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
isExtendedFileMetadata() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
IsNotNull - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is not null for new IsNotNull(expr).
-
-
IsNotNull(Expression) - Constructor for class io.delta.standalone.expressions.IsNotNull
-
 
-
IsNull - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is null for new IsNull(expr).
-
-
IsNull(Expression) - Constructor for class io.delta.standalone.expressions.IsNull
-
 
-
isNullable() - Method in class io.delta.standalone.types.StructField
-
 
-
isNullAt(String) - Method in interface io.delta.standalone.data.RowRecord
-
 
-
isolationLevel(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
isPartialWriteVisible(Path, Configuration) - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
isWriteCompatible(StructType) - Method in class io.delta.standalone.types.StructType
-
-
Whether a new schema can replace this existing schema in a Delta table without rewriting data - files in the table.
-
-
- - - -

J

-
-
jobInfo(JobInfo) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
JobInfo - Class in io.delta.standalone.actions
-
-
Represents the Databricks Job information that committed to the Delta table.
-
-
JobInfo(String, String, String, String, String) - Constructor for class io.delta.standalone.actions.JobInfo
-
 
-
JobInfo.Builder - Class in io.delta.standalone.actions
-
-
Builder class for JobInfo.
-
-
jobName(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
jobOwnerId(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
- - - -

L

-
-
LeafExpression - Class in io.delta.standalone.expressions
-
-
An Expression with no children.
-
-
length() - Method in class io.delta.standalone.types.StructType
-
 
-
LessThan - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 < expr2 for new LessThan(expr1, expr2).
-
-
LessThan(Expression, Expression) - Constructor for class io.delta.standalone.expressions.LessThan
-
 
-
LessThanOrEqual - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 <= expr2 for new LessThanOrEqual(expr1, expr2).
-
-
LessThanOrEqual(Expression, Expression) - Constructor for class io.delta.standalone.expressions.LessThanOrEqual
-
 
-
listFrom(Path, Configuration) - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
Literal - Class in io.delta.standalone.expressions
-
-
A literal value.
-
-
LogStore - Class in io.delta.standalone.storage
-
-
:: DeveloperApi ::
-
-
LogStore(Configuration) - Constructor for class io.delta.standalone.storage.LogStore
-
 
-
LongType - Class in io.delta.standalone.types
-
-
The data type representing long values.
-
-
LongType() - Constructor for class io.delta.standalone.types.LongType
-
 
-
- - - -

M

-
-
MapType - Class in io.delta.standalone.types
-
-
The data type for Maps.
-
-
MapType(DataType, DataType, boolean) - Constructor for class io.delta.standalone.types.MapType
-
 
-
markFilesAsRead(Expression) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Mark files matched by the readPredicate as read by this transaction.
-
-
Metadata - Class in io.delta.standalone.actions
-
-
Updates the metadata of the table.
-
-
Metadata(String, String, String, Format, List<String>, Map<String, String>, Optional<Long>, StructType) - Constructor for class io.delta.standalone.actions.Metadata
-
 
-
metadata() - Method in interface io.delta.standalone.OptimisticTransaction
-
 
-
Metadata.Builder - Class in io.delta.standalone.actions
-
-
Builder class for Metadata.
-
-
MetadataChangedException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the metadata of the Delta table has changed between the time of read - and the time of commit.
-
-
MetadataChangedException(String) - Constructor for exception io.delta.standalone.exceptions.MetadataChangedException
-
 
-
Metrics() - Constructor for class io.delta.standalone.Operation.Metrics
-
 
-
- - - -

N

-
-
name(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
name() - Method in class io.delta.standalone.expressions.Column
-
 
-
Not - Class in io.delta.standalone.expressions
-
-
Evaluates logical NOT expr for new Not(expr).
-
-
Not(Expression) - Constructor for class io.delta.standalone.expressions.Not
-
 
-
notebookInfo(NotebookInfo) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
NotebookInfo - Class in io.delta.standalone.actions
-
-
Represents the Databricks Notebook information that committed to the Delta table.
-
-
NotebookInfo(String) - Constructor for class io.delta.standalone.actions.NotebookInfo
-
 
-
nullSafeEval(Object, Object) - Method in class io.delta.standalone.expressions.And
-
 
-
nullSafeEval(Object) - Method in class io.delta.standalone.expressions.Not
-
 
-
nullSafeEval(Object, Object) - Method in class io.delta.standalone.expressions.Or
-
 
-
NullType - Class in io.delta.standalone.types
-
-
The data type representing null values.
-
-
NullType() - Constructor for class io.delta.standalone.types.NullType
-
 
-
numAddedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files added.
-
-
numConvertedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of parquet files that have been converted.
-
-
numCopiedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows copied in the process of deleting files.
-
-
numDeletedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows removed.
-
-
numFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files written.
-
-
numOutputBytes - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Size in bytes of the written contents.
-
-
numOutputRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows written.
-
-
numRemovedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files removed.
-
-
numSourceRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows in the source table.
-
-
numTargetFilesAdded - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number files added to the sink(target).
-
-
numTargetFilesRemoved - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files removed from the sink(target).
-
-
numTargetRowsCopied - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of target rows copied.
-
-
numTargetRowsDeleted - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows deleted in the target table.
-
-
numTargetRowsInserted - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows inserted into the target table.
-
-
numTargetRowsUpdated - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows updated in the target table.
-
-
numUpdatedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows updated.
-
-
- - - -

O

-
-
of(int) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(boolean) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(byte[]) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(Date) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(BigDecimal) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(double) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(float) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(long) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(short) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(String) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(Timestamp) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(byte) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
ofNull(DataType) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
open() - Method in interface io.delta.standalone.Snapshot
-
-
Creates a CloseableIterator which can iterate over data belonging to this snapshot.
-
-
operation(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
Operation - Class in io.delta.standalone
-
-
An operation that can be performed on a Delta table.
-
-
Operation(Operation.Name) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>, Map<String, String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>, Map<String, String>, Optional<String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation.Metrics - Class in io.delta.standalone
-
-
Some possible operation metrics and their suggested corresponding operation types.
-
-
Operation.Name - Enum in io.delta.standalone
-
-
Supported operation types.
-
-
operationMetrics(Map<String, String>) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
operationParameters(Map<String, String>) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
OptimisticTransaction - Interface in io.delta.standalone
-
-
Used to perform a set of reads in a transaction and then commit a set of updates to the - state of the log.
-
-
Or - Class in io.delta.standalone.expressions
-
-
Evaluates logical expr1 OR expr2 for new Or(expr1, expr2).
-
-
Or(Expression, Expression) - Constructor for class io.delta.standalone.expressions.Or
-
 
-
outputTimestampTypeDefault - Static variable in class io.delta.standalone.util.ParquetSchemaConverter
-
 
-
- - - -

P

-
-
ParquetSchemaConverter - Class in io.delta.standalone.util
-
-
:: DeveloperApi ::
-
-
ParquetSchemaConverter.ParquetOutputTimestampType - Enum in io.delta.standalone.util
-
-
:: DeveloperApi ::
-
-
partitionColumns(List<String>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
Predicate - Interface in io.delta.standalone.expressions
-
-
An Expression that defines a relation on inputs.
-
-
Protocol - Class in io.delta.standalone.actions
-
-
Used to block older clients from reading or writing the log when backwards - incompatible changes are made to the protocol.
-
-
Protocol(int, int) - Constructor for class io.delta.standalone.actions.Protocol
-
 
-
ProtocolChangedException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the protocol version has changed between the time of read and the time of commit.
-
-
ProtocolChangedException(String) - Constructor for exception io.delta.standalone.exceptions.ProtocolChangedException
-
 
-
putBoolean(String, boolean) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putBooleanArray(String, Boolean[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putDouble(String, double) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putDoubleArray(String, Double[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putLong(String, long) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putLongArray(String, Long[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putMetadata(String, FieldMetadata) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putMetadataArray(String, FieldMetadata[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putNull(String) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putString(String, String) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putStringArray(String, String[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
- - - -

R

-
-
read(Path, Configuration) - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
readVersion(Long) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
readWholeTable() - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Mark the entire table as tainted (i.e.
-
-
references() - Method in class io.delta.standalone.expressions.Column
-
 
-
references() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
references() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
remove() - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(long) - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(boolean) - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(long, boolean) - Method in class io.delta.standalone.actions.AddFile
-
 
-
RemoveFile - Class in io.delta.standalone.actions
-
-
Logical removal of a given file from the reservoir.
-
-
RemoveFile(String, Optional<Long>, boolean, boolean, Map<String, String>, Optional<Long>, Map<String, String>) - Constructor for class io.delta.standalone.actions.RemoveFile
-
-
Deprecated. -
RemoveFile should be created from AddFile.remove() instead.
-
-
-
resolvePathOnPhysicalStorage(Path, Configuration) - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
rewriteTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to rewrite the matched files.
-
-
RowRecord - Interface in io.delta.standalone.data
-
-
Represents one row of data containing a non-empty collection of fieldName - value pairs.
-
-
runId(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
- - - -

S

-
-
scan() - Method in interface io.delta.standalone.Snapshot
-
 
-
scan(Expression) - Method in interface io.delta.standalone.Snapshot
-
 
-
scanTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to scan the files for matches.
-
-
schema(StructType) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
SetTransaction - Class in io.delta.standalone.actions
-
-
Sets the committed version for a given application.
-
-
SetTransaction(String, long, Optional<Long>) - Constructor for class io.delta.standalone.actions.SetTransaction
-
 
-
ShortType - Class in io.delta.standalone.types
-
-
The data type representing short values.
-
-
ShortType() - Constructor for class io.delta.standalone.types.ShortType
-
 
-
snapshot() - Method in interface io.delta.standalone.DeltaLog
-
 
-
Snapshot - Interface in io.delta.standalone
-
-
Snapshot provides APIs to access the Delta table state (such as table metadata, active - files) at some version.
-
-
startTransaction() - Method in interface io.delta.standalone.DeltaLog
-
-
Returns a new OptimisticTransaction that can be used to read the current state of the - log and then commit updates.
-
-
stats(String) - Method in class io.delta.standalone.actions.AddFile.Builder
-
 
-
StringType - Class in io.delta.standalone.types
-
-
The data type representing String values.
-
-
StringType() - Constructor for class io.delta.standalone.types.StringType
-
 
-
StructField - Class in io.delta.standalone.types
-
-
A field inside a StructType.
-
-
StructField(String, DataType) - Constructor for class io.delta.standalone.types.StructField
-
-
Constructor with default nullable = true.
-
-
StructField(String, DataType, boolean) - Constructor for class io.delta.standalone.types.StructField
-
 
-
StructField(String, DataType, boolean, FieldMetadata) - Constructor for class io.delta.standalone.types.StructField
-
 
-
StructType - Class in io.delta.standalone.types
-
-
The data type representing a table's schema, consisting of a collection of - fields (that is, fieldName to dataType pairs).
-
-
StructType() - Constructor for class io.delta.standalone.types.StructType
-
 
-
StructType(StructField[]) - Constructor for class io.delta.standalone.types.StructType
-
 
-
- - - -

T

-
-
tableExists() - Method in interface io.delta.standalone.DeltaLog
-
 
-
tags(Map<String, String>) - Method in class io.delta.standalone.actions.AddFile.Builder
-
 
-
timestamp(Timestamp) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
TimestampType - Class in io.delta.standalone.types
-
-
The data type representing java.sql.Timestamp values.
-
-
TimestampType() - Constructor for class io.delta.standalone.types.TimestampType
-
 
-
toJson() - Method in class io.delta.standalone.types.DataType
-
 
-
toPrettyJson() - Method in class io.delta.standalone.types.DataType
-
 
-
toString() - Method in class io.delta.standalone.expressions.BinaryOperator
-
 
-
toString() - Method in class io.delta.standalone.expressions.Column
-
 
-
toString() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
toString() - Method in class io.delta.standalone.expressions.In
-
 
-
toString() - Method in class io.delta.standalone.expressions.IsNotNull
-
 
-
toString() - Method in class io.delta.standalone.expressions.IsNull
-
 
-
toString() - Method in class io.delta.standalone.expressions.Literal
-
 
-
toString() - Method in class io.delta.standalone.expressions.Not
-
 
-
toString() - Method in enum io.delta.standalone.Operation.Name
-
 
-
toString() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
triggerType(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
True - Static variable in class io.delta.standalone.expressions.Literal
-
 
-
txnVersion(String) - Method in interface io.delta.standalone.OptimisticTransaction
-
 
-
- - - -

U

-
-
UnaryExpression - Class in io.delta.standalone.expressions
-
-
An Expression with one input and one output.
-
-
update() - Method in interface io.delta.standalone.DeltaLog
-
-
Bring DeltaLog's current Snapshot to the latest state if there are any new - transaction logs.
-
-
updateMetadata(Metadata) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Records an update to the metadata that should be committed with this transaction.
-
-
USER_DEFAULT - Static variable in class io.delta.standalone.types.DecimalType
-
 
-
userId(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
userMetadata(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
userName(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
- - - -

V

-
-
value() - Method in class io.delta.standalone.expressions.Literal
-
 
-
valueContainsNull() - Method in class io.delta.standalone.types.MapType
-
 
-
valueOf(String) - Static method in enum io.delta.standalone.Operation.Name
-
-
Returns the enum constant of this type with the specified name.
-
-
valueOf(String) - Static method in enum io.delta.standalone.util.ParquetSchemaConverter.ParquetOutputTimestampType
-
-
Returns the enum constant of this type with the specified name.
-
-
values() - Static method in enum io.delta.standalone.Operation.Name
-
-
Returns an array containing the constants of this enum type, in -the order they are declared.
-
-
values() - Static method in enum io.delta.standalone.util.ParquetSchemaConverter.ParquetOutputTimestampType
-
-
Returns an array containing the constants of this enum type, in -the order they are declared.
-
-
version(Long) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
VersionLog - Class in io.delta.standalone
-
-
VersionLog is the representation of all actions (changes) to the Delta Table - at a specific table version.
-
-
VersionLog(long, List<Action>) - Constructor for class io.delta.standalone.VersionLog
-
 
-
- - - -

W

-
-
write(Path, Iterator<String>, Boolean, Configuration) - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
writeLegacyParquetFormatDefault - Static variable in class io.delta.standalone.util.ParquetSchemaConverter
-
 
-
-A B C D E F G H I J L M N O P R S T U V W 
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/index.html b/connectors/docs/0.4.0/delta-standalone/api/java/index.html deleted file mode 100644 index 0eda62f6423..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - -Delta Standalone 0.4.0 JavaDoc - - - - - - - - - -<noscript> -<div>JavaScript is disabled on your browser.</div> -</noscript> -<h2>Frame Alert</h2> -<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html deleted file mode 100644 index b6515bc6866..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - -CommitResult (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class CommitResult

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      CommitResult(long version) 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - -
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      longgetVersion() 
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CommitResult

        -
        public CommitResult(long version)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the table version that was committed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html deleted file mode 100644 index 43d6e65185c..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html +++ /dev/null @@ -1,472 +0,0 @@ - - - - - -DeltaLog (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface DeltaLog

-
-
-
-
    -
  • -
    -
    -
    public interface DeltaLog
    -
    Represents the transaction logs of a Delta table. It provides APIs to access the states of a - Delta table. -

    - You can use the following code to create a DeltaLog instance. -

    
    -   Configuration conf = ... // Create your own Hadoop Configuration instance
    -   DeltaLog deltaLog = DeltaLog.forTable(conf, "/the/delta/table/path");
    - 
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        snapshot

        -
        Snapshot snapshot()
        -
        -
        Returns:
        -
        the current Snapshot of the Delta table. You may need to call - update() to access the latest snapshot if the current snapshot is stale.
        -
        -
      • -
      - - - -
        -
      • -

        update

        -
        Snapshot update()
        -
        Bring DeltaLog's current Snapshot to the latest state if there are any new - transaction logs.
        -
        -
        Returns:
        -
        the latest snapshot after applying the new transaction logs.
        -
        -
      • -
      - - - -
        -
      • -

        getSnapshotForVersionAsOf

        -
        Snapshot getSnapshotForVersionAsOf(long version)
        -
        Travel back in time to the Snapshot with the provided version number.
        -
        -
        Parameters:
        -
        version - the snapshot version to generate
        -
        Returns:
        -
        the snapshot at the provided version
        -
        Throws:
        -
        IllegalArgumentException - if the version is outside the range of available - versions
        -
        -
      • -
      - - - -
        -
      • -

        getSnapshotForTimestampAsOf

        -
        Snapshot getSnapshotForTimestampAsOf(long timestamp)
        -
        Travel back in time to the latest Snapshot that was generated at or before - timestamp.
        -
        -
        Parameters:
        -
        timestamp - the number of milliseconds since midnight, January 1, 1970 UTC
        -
        Returns:
        -
        the snapshot nearest to, but not after, the provided timestamp
        -
        Throws:
        -
        RuntimeException - if the snapshot is unable to be recreated
        -
        IllegalArgumentException - if the timestamp is before the earliest possible - snapshot or after the latest possible snapshot
        -
        -
      • -
      - - - -
        -
      • -

        startTransaction

        -
        OptimisticTransaction startTransaction()
        -
        Returns a new OptimisticTransaction that can be used to read the current state of the - log and then commit updates. The reads and updates will be checked for logical conflicts - with any concurrent writes to the log. -

        - Note that all reads in a transaction must go through the returned transaction object, and not - directly to the DeltaLog otherwise they will not be checked for conflicts.

        -
        -
        Returns:
        -
        a new OptimisticTransaction.
        -
        -
      • -
      - - - -
        -
      • -

        getCommitInfoAt

        -
        CommitInfo getCommitInfoAt(long version)
        -
        -
        Parameters:
        -
        version - the commit version to retrieve CommitInfo
        -
        Returns:
        -
        the CommitInfo of the commit at the provided version.
        -
        -
      • -
      - - - -
        -
      • -

        getPath

        -
        org.apache.hadoop.fs.Path getPath()
        -
        -
        Returns:
        -
        the path of the Delta table.
        -
        -
      • -
      - - - -
        -
      • -

        getChanges

        -
        java.util.Iterator<VersionLog> getChanges(long startVersion,
        -                                          boolean failOnDataLoss)
        -
        Get all actions starting from startVersion (inclusive) in increasing order of - committed version. -

        - If startVersion doesn't exist, return an empty Iterator.

        -
        -
        Parameters:
        -
        startVersion - the table version to begin retrieving actions from (inclusive)
        -
        failOnDataLoss - whether to throw when data loss detected
        -
        Returns:
        -
        an Iterator of VersionLogs starting from startVersion
        -
        Throws:
        -
        IllegalArgumentException - if startVersion is negative
        -
        IllegalStateException - if data loss detected and failOnDataLoss is true
        -
        -
      • -
      - - - -
        -
      • -

        tableExists

        -
        boolean tableExists()
        -
        -
        Returns:
        -
        Whether a Delta table exists at this directory.
        -
        -
      • -
      - - - -
        -
      • -

        forTable

        -
        static DeltaLog forTable(org.apache.hadoop.conf.Configuration hadoopConf,
        -                         String path)
        -
        Create a DeltaLog instance representing the table located at the provided - path.
        -
        -
        Parameters:
        -
        hadoopConf - Hadoop Configuration to use when accessing the Delta table
        -
        path - the path to the Delta table
        -
        Returns:
        -
        the DeltaLog for the provided path
        -
        -
      • -
      - - - -
        -
      • -

        forTable

        -
        static DeltaLog forTable(org.apache.hadoop.conf.Configuration hadoopConf,
        -                         org.apache.hadoop.fs.Path path)
        -
        Create a DeltaLog instance representing the table located at the provided - path.
        -
        -
        Parameters:
        -
        hadoopConf - Hadoop Configuration to use when accessing the Delta table
        -
        path - the path to the Delta table
        -
        Returns:
        -
        the DeltaLog for the provided path
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html deleted file mode 100644 index f11c0772351..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - -DeltaScan (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface DeltaScan

-
-
-
-
    -
  • -
    -
    -
    public interface DeltaScan
    -
    Provides access to an iterator over the files in this snapshot. -

    - Typically created with a read predicate Expression to let users filter files. Please note - filtering is only supported on partition columns and users should use - getResidualPredicate() to check for any unapplied portion of the input - predicate.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        getInputPredicate

        -
        java.util.Optional<Expression> getInputPredicate()
        -
        -
        Returns:
        -
        the input predicate passed in by the user
        -
        -
      • -
      - - - -
        -
      • -

        getPushedPredicate

        -
        java.util.Optional<Expression> getPushedPredicate()
        -
        -
        Returns:
        -
        portion of the input predicate that can be evaluated by Delta Standalone using only - metadata (filters on partition columns). Files returned by getFiles() are - guaranteed to satisfy the pushed predicate, and the caller doesn’t need to apply them - again on the returned files.
        -
        -
      • -
      - - - -
        -
      • -

        getResidualPredicate

        -
        java.util.Optional<Expression> getResidualPredicate()
        -
        -
        Returns:
        -
        portion of the input predicate that may not be fully applied. Files returned by - getFiles() are not guaranteed to satisfy the residual predicate, and the - caller should still apply them on the returned files.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html deleted file mode 100644 index bbd6cf66811..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html +++ /dev/null @@ -1,683 +0,0 @@ - - - - - -Operation.Metrics (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class Operation.Metrics

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    Operation
    -
    -
    -
    -
    public static class Operation.Metrics
    -extends Object
    -
    Some possible operation metrics and their suggested corresponding operation types. - These are purely exemplary, and users may use whichever metrics best fit their application.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Field Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Fields 
      Modifier and TypeField and Description
      static StringexecutionTimeMs -
      Time taken to execute the entire operation.
      -
      static StringnumAddedFiles -
      Number of files added.
      -
      static StringnumConvertedFiles -
      Number of parquet files that have been converted.
      -
      static StringnumCopiedRows -
      Number of rows copied in the process of deleting files.
      -
      static StringnumDeletedRows -
      Number of rows removed.
      -
      static StringnumFiles -
      Number of files written.
      -
      static StringnumOutputBytes -
      Size in bytes of the written contents.
      -
      static StringnumOutputRows -
      Number of rows written.
      -
      static StringnumRemovedFiles -
      Number of files removed.
      -
      static StringnumSourceRows -
      Number of rows in the source table.
      -
      static StringnumTargetFilesAdded -
      Number files added to the sink(target).
      -
      static StringnumTargetFilesRemoved -
      Number of files removed from the sink(target).
      -
      static StringnumTargetRowsCopied -
      Number of target rows copied.
      -
      static StringnumTargetRowsDeleted -
      Number of rows deleted in the target table.
      -
      static StringnumTargetRowsInserted -
      Number of rows inserted into the target table.
      -
      static StringnumTargetRowsUpdated -
      Number of rows updated in the target table.
      -
      static StringnumUpdatedRows -
      Number of rows updated.
      -
      static StringrewriteTimeMs -
      Time taken to rewrite the matched files.
      -
      static StringscanTimeMs -
      Time taken to scan the files for matches.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Metrics() 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        numFiles

        -
        public static final String numFiles
        -
        Number of files written. - - Usually used with the WRITE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numOutputBytes

        -
        public static final String numOutputBytes
        -
        Size in bytes of the written contents. - - Usually used with WRITE, STREAMING_UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numOutputRows

        -
        public static final String numOutputRows
        -
        Number of rows written. - - Usually used with WRITE, STREAMING_UPDATE, MERGE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numAddedFiles

        -
        public static final String numAddedFiles
        -
        Number of files added. - - Usually used with STREAMING_UPDATE, DELETE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numRemovedFiles

        -
        public static final String numRemovedFiles
        -
        Number of files removed. - - Usually used with STREAMING_UPDATE, DELETE, DELETE_PARTITIONS, TRUNCATE, - UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numDeletedRows

        -
        public static final String numDeletedRows
        -
        Number of rows removed. - - Usually used with the DELETE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numCopiedRows

        -
        public static final String numCopiedRows
        -
        Number of rows copied in the process of deleting files. - - Usually used with DELETE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        executionTimeMs

        -
        public static final String executionTimeMs
        -
        Time taken to execute the entire operation. - - Usually used with DELETE, DELETE_PARTITIONS, TRUNCATE, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        scanTimeMs

        -
        public static final String scanTimeMs
        -
        Time taken to scan the files for matches. - - Usually used with DELETE, DELETE_PARTITIONS, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        rewriteTimeMs

        -
        public static final String rewriteTimeMs
        -
        Time taken to rewrite the matched files. - - Usually used with DELETE, DELETE_PARTITIONS, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numConvertedFiles

        -
        public static final String numConvertedFiles
        -
        Number of parquet files that have been converted. - - Usually used with the CONVERT operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numSourceRows

        -
        public static final String numSourceRows
        -
        Number of rows in the source table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsInserted

        -
        public static final String numTargetRowsInserted
        -
        Number of rows inserted into the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsUpdated

        -
        public static final String numTargetRowsUpdated
        -
        Number of rows updated in the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsDeleted

        -
        public static final String numTargetRowsDeleted
        -
        Number of rows deleted in the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsCopied

        -
        public static final String numTargetRowsCopied
        -
        Number of target rows copied. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetFilesAdded

        -
        public static final String numTargetFilesAdded
        -
        Number files added to the sink(target). - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetFilesRemoved

        -
        public static final String numTargetFilesRemoved
        -
        Number of files removed from the sink(target). - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numUpdatedRows

        -
        public static final String numUpdatedRows
        -
        Number of rows updated. - - Usually used with the UPDATE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Metrics

        -
        public Metrics()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html deleted file mode 100644 index 43bcd59e24b..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html +++ /dev/null @@ -1,589 +0,0 @@ - - - - - -Operation.Name (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Enum Operation.Name

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable, Comparable<Operation.Name>
    -
    -
    -
    Enclosing class:
    -
    Operation
    -
    -
    -
    -
    public static enum Operation.Name
    -extends Enum<Operation.Name>
    -
    Supported operation types.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Enum Constant Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Enum Constants 
      Enum Constant and Description
      ADD_COLUMNS -
      Recorded when columns are added.
      -
      CHANGE_COLUMN -
      Recorded when columns are changed.
      -
      CONVERT -
      Recorded when converting a table into a Delta table.
      -
      CREATE_TABLE -
      Recorded when the table is created.
      -
      DELETE -
      Recorded while deleting certain partitions.
      -
      MANUAL_UPDATE 
      MERGE -
      Recorded when a merge operation is committed to the table.
      -
      REPLACE_COLUMNS -
      Recorded when columns are replaced.
      -
      REPLACE_TABLE -
      Recorded when the table is replaced.
      -
      SET_TABLE_PROPERTIES -
      Recorded when the table properties are set.
      -
      STREAMING_UPDATE -
      Recorded during streaming inserts.
      -
      TRUNCATE -
      Recorded when truncating the table.
      -
      UNSET_TABLE_PROPERTIES -
      Recorded when the table properties are unset.
      -
      UPDATE -
      Recorded when an update operation is committed to the table.
      -
      UPGRADE_PROTOCOL -
      Recorded when the table protocol is upgraded.
      -
      UPGRADE_SCHEMA -
      Recorded when the table schema is upgraded.
      -
      WRITE -
      Recorded during batch inserts.
      -
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - -
      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      StringtoString() 
      static Operation.NamevalueOf(String name) -
      Returns the enum constant of this type with the specified name.
      -
      static Operation.Name[]values() -
      Returns an array containing the constants of this enum type, in -the order they are declared.
      -
      -
        -
      • - - -

        Methods inherited from class Enum

        -compareTo, equals, getDeclaringClass, hashCode, name, ordinal, valueOf
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -getClass, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Enum Constant Detail

      - - - -
        -
      • -

        WRITE

        -
        public static final Operation.Name WRITE
        -
        Recorded during batch inserts.
        -
      • -
      - - - -
        -
      • -

        STREAMING_UPDATE

        -
        public static final Operation.Name STREAMING_UPDATE
        -
        Recorded during streaming inserts.
        -
      • -
      - - - -
        -
      • -

        DELETE

        -
        public static final Operation.Name DELETE
        -
        Recorded while deleting certain partitions.
        -
      • -
      - - - -
        -
      • -

        TRUNCATE

        -
        public static final Operation.Name TRUNCATE
        -
        Recorded when truncating the table.
        -
      • -
      - - - -
        -
      • -

        CONVERT

        -
        public static final Operation.Name CONVERT
        -
        Recorded when converting a table into a Delta table.
        -
      • -
      - - - -
        -
      • -

        MERGE

        -
        public static final Operation.Name MERGE
        -
        Recorded when a merge operation is committed to the table.
        -
      • -
      - - - -
        -
      • -

        UPDATE

        -
        public static final Operation.Name UPDATE
        -
        Recorded when an update operation is committed to the table.
        -
      • -
      - - - -
        -
      • -

        CREATE_TABLE

        -
        public static final Operation.Name CREATE_TABLE
        -
        Recorded when the table is created.
        -
      • -
      - - - -
        -
      • -

        REPLACE_TABLE

        -
        public static final Operation.Name REPLACE_TABLE
        -
        Recorded when the table is replaced.
        -
      • -
      - - - -
        -
      • -

        SET_TABLE_PROPERTIES

        -
        public static final Operation.Name SET_TABLE_PROPERTIES
        -
        Recorded when the table properties are set.
        -
      • -
      - - - -
        -
      • -

        UNSET_TABLE_PROPERTIES

        -
        public static final Operation.Name UNSET_TABLE_PROPERTIES
        -
        Recorded when the table properties are unset.
        -
      • -
      - - - -
        -
      • -

        ADD_COLUMNS

        -
        public static final Operation.Name ADD_COLUMNS
        -
        Recorded when columns are added.
        -
      • -
      - - - -
        -
      • -

        CHANGE_COLUMN

        -
        public static final Operation.Name CHANGE_COLUMN
        -
        Recorded when columns are changed.
        -
      • -
      - - - -
        -
      • -

        REPLACE_COLUMNS

        -
        public static final Operation.Name REPLACE_COLUMNS
        -
        Recorded when columns are replaced.
        -
      • -
      - - - -
        -
      • -

        UPGRADE_PROTOCOL

        -
        public static final Operation.Name UPGRADE_PROTOCOL
        -
        Recorded when the table protocol is upgraded.
        -
      • -
      - - - -
        -
      • -

        UPGRADE_SCHEMA

        -
        public static final Operation.Name UPGRADE_SCHEMA
        -
        Recorded when the table schema is upgraded.
        -
      • -
      - - - -
        -
      • -

        MANUAL_UPDATE

        -
        public static final Operation.Name MANUAL_UPDATE
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        values

        -
        public static Operation.Name[] values()
        -
        Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
        -for (Operation.Name c : Operation.Name.values())
        -    System.out.println(c);
        -
        -
        -
        Returns:
        -
        an array containing the constants of this enum type, in the order they are declared
        -
        -
      • -
      - - - -
        -
      • -

        valueOf

        -
        public static Operation.Name valueOf(String name)
        -
        Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.)
        -
        -
        Parameters:
        -
        name - the name of the enum constant to be returned.
        -
        Returns:
        -
        the enum constant with the specified name
        -
        Throws:
        -
        IllegalArgumentException - if this enum type has no constant with the specified name
        -
        NullPointerException - if the argument is null
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Overrides:
        -
        toString in class Enum<Operation.Name>
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Operation.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Operation.html deleted file mode 100644 index 25f17c91901..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Operation.html +++ /dev/null @@ -1,442 +0,0 @@ - - - - - -Operation (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class Operation

-
-
- -
-
    -
  • -
    -
    -
    public final class Operation
    -extends Object
    -
    An operation that can be performed on a Delta table. -

    - An operation is tracked as the first line in delta logs, and powers DESCRIBE HISTORY for - Delta tables. -

    - Operations must be constructed using one of the Operation.Name types below. - As well, optional Operation.Metrics values are given below.

    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class Operation.Metrics -
      Some possible operation metrics and their suggested corresponding operation types.
      -
      static class Operation.Name -
      Supported operation types.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      Operation(Operation.Name name) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters, - java.util.Map<String,String> metrics) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters, - java.util.Map<String,String> metrics, - java.util.Optional<String> userMetadata) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - - - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        -
      • -
      - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters,
        -                 @Nullable
        -                 java.util.Map<String,String> metrics)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        metrics - Any relevant operation metrics. See Operation.Metrics for suggested keys.
        -
        -
      • -
      - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters,
        -                 @Nullable
        -                 java.util.Map<String,String> metrics,
        -                 @Nonnull
        -                 java.util.Optional<String> userMetadata)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        metrics - Any relevant operation metrics. See Operation.Metrics for suggested keys.
        -
        userMetadata - Optional additional user metadata.
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getName

        -
        @Nonnull
        -public Operation.Name getName()
        -
        -
        Returns:
        -
        operation name
        -
        -
      • -
      - - - -
        -
      • -

        getParameters

        -
        @Nullable
        -public java.util.Map<String,String> getParameters()
        -
        -
        Returns:
        -
        operation parameters
        -
        -
      • -
      - - - -
        -
      • -

        getMetrics

        -
        @Nullable
        -public java.util.Map<String,String> getMetrics()
        -
        -
        Returns:
        -
        operation metrics
        -
        -
      • -
      - - - -
        -
      • -

        getUserMetadata

        -
        @Nonnull
        -public java.util.Optional<String> getUserMetadata()
        -
        -
        Returns:
        -
        user metadata for this operation
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html deleted file mode 100644 index 652f6fe5432..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html +++ /dev/null @@ -1,388 +0,0 @@ - - - - - -OptimisticTransaction (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface OptimisticTransaction

-
-
-
-
    -
  • -
    -
    -
    public interface OptimisticTransaction
    -
    Used to perform a set of reads in a transaction and then commit a set of updates to the - state of the log. All reads from the DeltaLog MUST go through this instance rather - than directly to the DeltaLog otherwise they will not be checked for logical conflicts - with concurrent updates. -

    - This class is not thread-safe.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        commit

        -
        <T extends ActionCommitResult commit(Iterable<T> actions,
        -                                       Operation op,
        -                                       String engineInfo)
        -
        Modifies the state of the log by adding a new commit that is based on a read at the table's - latest version as of this transaction's instantiation. In the case of a conflict with a - concurrent writer this method will throw an exception. -

        - Note: any AddFile with an absolute path within the table - path will be updated to have a relative path (based off of the table path). Because of this, - be sure to generate all RemoveFiles using - AddFiles read from the Delta Log (do not use the - AddFiles created pre-commit.)

        -
        -
        Type Parameters:
        -
        T - A derived class of Action. This allows, for example, both a - List<Action> and a List<AddFile> to be accepted.
        -
        Parameters:
        -
        actions - Set of actions to commit.
        -
        op - Details of operation that is performing this transactional commit.
        -
        engineInfo - String used to identify the writer engine. It should resemble - "{engineName}/{engineVersion}", with dashes in place of whitespace. - For example, "Flink-Connector/1.1.0".
        -
        Returns:
        -
        a CommitResult, wrapping the table version that was committed.
        -
        -
      • -
      - - - -
        -
      • -

        markFilesAsRead

        -
        DeltaScan markFilesAsRead(Expression readPredicate)
        -
        Mark files matched by the readPredicate as read by this transaction. -

        - Please note filtering is only supported on partition columns, thus the files matched - may be a superset of the files in the Delta table that satisfy readPredicate. Users - should use DeltaScan.getResidualPredicate() to check for any unapplied portion of the - input predicate. -

        - Internally, readPredicate and the matched readFiles will be used to determine - if logical conflicts between this transaction and previously-committed transactions can be - resolved (i.e. no error thrown). -

        - For example: -

          -
        • This transaction TXN1 reads partition 'date=2021-09-08' to perform an UPDATE and tries - to commit at the next table version N.
        • -
        • After TXN1 starts, another transaction TXN2 reads partition 'date=2021-09-07' and - commits first at table version N (with no other metadata changes).
        • -
        • TXN1 sees that another commit won, and needs to know whether to commit at version N+1 - or fail. Using the readPredicates and resultant readFiles, TXN1 can see - that none of its read files were changed by TXN2. Thus there are no logical conflicts and - TXN1 can commit at table version N+1.
        • -
        -
        -
        Parameters:
        -
        readPredicate - Predicate used to determine which files were read.
        -
        Returns:
        -
        a DeltaScan containing the list of files matching the pushed portion of the - readPredicate.
        -
        -
      • -
      - - - -
        -
      • -

        updateMetadata

        -
        void updateMetadata(Metadata metadata)
        -
        Records an update to the metadata that should be committed with this transaction. - -

        - Use Metadata.copyBuilder() to build a new Metadata instance based on the - current table metadata. For example: - -

        
        - Metadata newMetadata = optimisticTransaction.metadata().copyBuilder()
        -     .schema(newSchema)
        -     .build();
        - optimisticTransaction.updateMetadata(newMetadata);
        - 
        - -

        - IMPORTANT: It is the responsibility of the caller to ensure that files currently - present in the table are still valid under the new metadata.

        -
        -
        Parameters:
        -
        metadata - The new metadata for the delta table.
        -
        -
      • -
      - - - -
        -
      • -

        readWholeTable

        -
        void readWholeTable()
        -
        Mark the entire table as tainted (i.e. read) by this transaction.
        -
      • -
      - - - -
        -
      • -

        txnVersion

        -
        long txnVersion(String id)
        -
        -
        Parameters:
        -
        id - transaction id
        -
        Returns:
        -
        the latest version that has committed for the idempotent transaction with given - id.
        -
        -
      • -
      - - - -
        -
      • -

        metadata

        -
        Metadata metadata()
        -
        -
        Returns:
        -
        the metadata for this transaction. The metadata refers to the metadata of the table's - latest version as of this transaction's instantiation unless updated during the - transaction.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html deleted file mode 100644 index 9a53b121ddf..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html +++ /dev/null @@ -1,320 +0,0 @@ - - - - - -Snapshot (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface Snapshot

-
-
-
-
    -
  • -
    -
    -
    public interface Snapshot
    -
    Snapshot provides APIs to access the Delta table state (such as table metadata, active - files) at some version. -

    - See Delta Transaction Log Protocol - for more details about the transaction logs.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        scan

        -
        DeltaScan scan(Expression predicate)
        -
        -
        Parameters:
        -
        predicate - the predicate to be used to filter the files in this snapshot.
        -
        Returns:
        -
        a DeltaScan of the files in this snapshot matching the pushed portion of - predicate
        -
        -
      • -
      - - - -
        -
      • -

        getAllFiles

        -
        java.util.List<AddFile> getAllFiles()
        -
        -
        Returns:
        -
        all of the files present in this snapshot
        -
        -
      • -
      - - - -
        -
      • -

        getMetadata

        -
        Metadata getMetadata()
        -
        -
        Returns:
        -
        the table metadata for this snapshot
        -
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        long getVersion()
        -
        -
        Returns:
        -
        the version for this snapshot
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html deleted file mode 100644 index aa6511dee58..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html +++ /dev/null @@ -1,296 +0,0 @@ - - - - - -VersionLog (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class VersionLog

-
-
- -
-
    -
  • -
    -
    -
    public final class VersionLog
    -extends Object
    -
    VersionLog is the representation of all actions (changes) to the Delta Table - at a specific table version.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      VersionLog(long version, - java.util.List<Action> actions) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        VersionLog

        -
        public VersionLog(long version,
        -                  @Nonnull
        -                  java.util.List<Action> actions)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the table version at which these actions occurred
        -
        -
      • -
      - - - -
        -
      • -

        getActions

        -
        @Nonnull
        -public java.util.List<Action> getActions()
        -
        -
        Returns:
        -
        an unmodifiable List of the actions for this table version
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html deleted file mode 100644 index 9348ea5525f..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - -Action (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Interface Action

-
-
-
-
    -
  • -
    -
    All Known Subinterfaces:
    -
    FileAction
    -
    -
    -
    All Known Implementing Classes:
    -
    AddCDCFile, AddFile, CommitInfo, Metadata, Protocol, RemoveFile, SetTransaction
    -
    -
    -
    -
    public interface Action
    -
    A marker interface for all actions that can be applied to a Delta table. - Each action represents a single change to the state of a Delta table. -

    - You can use the following code to extract the concrete type of an Action. -

    
    -   List<Action> actions = ...
    -   actions.forEach(x -> {
    -       if (x instanceof AddFile) {
    -          AddFile addFile = (AddFile) x;
    -          ...
    -       } else if (x instanceof AddCDCFile) {
    -          AddCDCFile addCDCFile = (AddCDCFile)x;
    -          ...
    -       } else if ...
    -   });
    - 
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html deleted file mode 100644 index 96d3c401722..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html +++ /dev/null @@ -1,371 +0,0 @@ - - - - - -AddCDCFile (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddCDCFile

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action, FileAction
    -
    -
    -
    -
    public final class AddCDCFile
    -extends Object
    -implements FileAction
    -
    A change file containing CDC data for the Delta version it's within. Non-CDC readers should - ignore this, CDC readers should scan all ChangeFiles in a version rather than computing - changes from AddFile and RemoveFile actions.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      AddCDCFile(String path, - java.util.Map<String,String> partitionValues, - long size, - java.util.Map<String,String> tags) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AddCDCFile

        -
        public AddCDCFile(@Nonnull
        -                  String path,
        -                  @Nonnull
        -                  java.util.Map<String,String> partitionValues,
        -                  long size,
        -                  @Nullable
        -                  java.util.Map<String,String> tags)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        @Nonnull
        -public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be added to the table. If it's a - relative path, it's relative to the root of the table. Note: the path is encoded and - should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nonnull
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public long getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being added or removed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html deleted file mode 100644 index 0bc50e6e7dd..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html +++ /dev/null @@ -1,317 +0,0 @@ - - - - - -AddFile.Builder (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddFile.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    AddFile
    -
    -
    -
    -
    public static final class AddFile.Builder
    -extends Object
    -
    Builder class for AddFile. Enables construction of AddFiles with default - values.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Builder(String path, - java.util.Map<String,String> partitionValues, - long size, - long modificationTime, - boolean dataChange) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder(String path,
        -               java.util.Map<String,String> partitionValues,
        -               long size,
        -               long modificationTime,
        -               boolean dataChange)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        tags

        -
        public AddFile.Builder tags(java.util.Map<String,String> tags)
        -
      • -
      - - - -
        -
      • -

        build

        -
        public AddFile build()
        -
        Builds an AddFile using the provided parameters. If a parameter is not provided - its default values is used.
        -
        -
        Returns:
        -
        a new AddFile with the properties added to the builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html deleted file mode 100644 index d849e9c1348..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html +++ /dev/null @@ -1,581 +0,0 @@ - - - - - -AddFile (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddFile

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action, FileAction
    -
    -
    -
    -
    public final class AddFile
    -extends Object
    -implements FileAction
    -
    Represents an action that adds a new file to the table. The path of a file acts as the primary - key for the entry in the set of files. -

    - Note: since actions within a given Delta file are not guaranteed to be applied in order, it is - not valid for multiple file operations with the same path to exist in a single version.

    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Add File and Remove File
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class AddFile.Builder -
      Builder class for AddFile.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      AddFile(String path, - java.util.Map<String,String> partitionValues, - long size, - long modificationTime, - boolean dataChange, - String stats, - java.util.Map<String,String> tags) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AddFile

        -
        public AddFile(@Nonnull
        -               String path,
        -               @Nonnull
        -               java.util.Map<String,String> partitionValues,
        -               long size,
        -               long modificationTime,
        -               boolean dataChange,
        -               @Nullable
        -               String stats,
        -               @Nullable
        -               java.util.Map<String,String> tags)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove()
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with - deletionTimestamp = System.currentTimeMillis()
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(long deletionTimestamp)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - deletionTimestamp
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(boolean dataChange)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - dataChange flag
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(long deletionTimestamp,
        -                                  boolean dataChange)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - deletionTimestamp value and dataChange flag
        -
        -
      • -
      - - - -
        -
      • -

        getPath

        -
        @Nonnull
        -public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be added to the table. If it's a - relative path, it's relative to the root of the table. Note: the path is encoded and - should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nonnull
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public long getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getModificationTime

        -
        public long getModificationTime()
        -
        -
        Returns:
        -
        the time that this file was last modified or created, as - milliseconds since the epoch
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being created. When - false the file must already be present in the table or the records in the - added file must be contained in one or more remove actions in the same version
        -
        -
      • -
      - - - -
        -
      • -

        getStats

        -
        @Nullable
        -public String getStats()
        -
        -
        Returns:
        -
        statistics (for example: count, min/max values for columns) - about the data in this file as serialized JSON
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - -
        -
      • -

        builder

        -
        public static AddFile.Builder builder(String path,
        -                                      java.util.Map<String,String> partitionValues,
        -                                      long size,
        -                                      long modificationTime,
        -                                      boolean dataChange)
        -
        -
        Returns:
        -
        a new AddFile.Builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html deleted file mode 100644 index ca739b7bb09..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html +++ /dev/null @@ -1,481 +0,0 @@ - - - - - -CommitInfo.Builder (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class CommitInfo.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    CommitInfo
    -
    -
    -
    -
    public static final class CommitInfo.Builder
    -extends Object
    -
    Builder class for CommitInfo. Enables construction of CommitInfos with - default values.
    -
  • -
-
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html deleted file mode 100644 index 8e54fe91d58..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html +++ /dev/null @@ -1,706 +0,0 @@ - - - - - -CommitInfo (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class CommitInfo

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public class CommitInfo
    -extends Object
    -implements Action
    -
    Holds provenance information about changes to the table. This CommitInfo - is not stored in the checkpoint and has reduced compatibility guarantees. - Information stored in it is best effort (i.e. can be falsified by a writer).
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Commit Provenance Information
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class CommitInfo.Builder -
      Builder class for CommitInfo.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      CommitInfo(java.util.Optional<Long> version, - java.sql.Timestamp timestamp, - java.util.Optional<String> userId, - java.util.Optional<String> userName, - String operation, - java.util.Map<String,String> operationParameters, - java.util.Optional<JobInfo> jobInfo, - java.util.Optional<NotebookInfo> notebookInfo, - java.util.Optional<String> clusterId, - java.util.Optional<Long> readVersion, - java.util.Optional<String> isolationLevel, - java.util.Optional<Boolean> isBlindAppend, - java.util.Optional<java.util.Map<String,String>> operationMetrics, - java.util.Optional<String> userMetadata) 
      CommitInfo(java.util.Optional<Long> version, - java.sql.Timestamp timestamp, - java.util.Optional<String> userId, - java.util.Optional<String> userName, - String operation, - java.util.Map<String,String> operationParameters, - java.util.Optional<JobInfo> jobInfo, - java.util.Optional<NotebookInfo> notebookInfo, - java.util.Optional<String> clusterId, - java.util.Optional<Long> readVersion, - java.util.Optional<String> isolationLevel, - java.util.Optional<Boolean> isBlindAppend, - java.util.Optional<java.util.Map<String,String>> operationMetrics, - java.util.Optional<String> userMetadata, - java.util.Optional<String> engineInfo) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CommitInfo

        -
        public CommitInfo(@Nonnull
        -                  java.util.Optional<Long> version,
        -                  @Nullable
        -                  java.sql.Timestamp timestamp,
        -                  @Nonnull
        -                  java.util.Optional<String> userId,
        -                  @Nonnull
        -                  java.util.Optional<String> userName,
        -                  @Nullable
        -                  String operation,
        -                  @Nullable
        -                  java.util.Map<String,String> operationParameters,
        -                  @Nonnull
        -                  java.util.Optional<JobInfo> jobInfo,
        -                  @Nonnull
        -                  java.util.Optional<NotebookInfo> notebookInfo,
        -                  @Nonnull
        -                  java.util.Optional<String> clusterId,
        -                  @Nonnull
        -                  java.util.Optional<Long> readVersion,
        -                  @Nonnull
        -                  java.util.Optional<String> isolationLevel,
        -                  @Nonnull
        -                  java.util.Optional<Boolean> isBlindAppend,
        -                  @Nonnull
        -                  java.util.Optional<java.util.Map<String,String>> operationMetrics,
        -                  @Nonnull
        -                  java.util.Optional<String> userMetadata)
        -
      • -
      - - - -
        -
      • -

        CommitInfo

        -
        public CommitInfo(@Nonnull
        -                  java.util.Optional<Long> version,
        -                  @Nullable
        -                  java.sql.Timestamp timestamp,
        -                  @Nonnull
        -                  java.util.Optional<String> userId,
        -                  @Nonnull
        -                  java.util.Optional<String> userName,
        -                  @Nullable
        -                  String operation,
        -                  @Nullable
        -                  java.util.Map<String,String> operationParameters,
        -                  @Nonnull
        -                  java.util.Optional<JobInfo> jobInfo,
        -                  @Nonnull
        -                  java.util.Optional<NotebookInfo> notebookInfo,
        -                  @Nonnull
        -                  java.util.Optional<String> clusterId,
        -                  @Nonnull
        -                  java.util.Optional<Long> readVersion,
        -                  @Nonnull
        -                  java.util.Optional<String> isolationLevel,
        -                  @Nonnull
        -                  java.util.Optional<Boolean> isBlindAppend,
        -                  @Nonnull
        -                  java.util.Optional<java.util.Map<String,String>> operationMetrics,
        -                  @Nonnull
        -                  java.util.Optional<String> userMetadata,
        -                  @Nonnull
        -                  java.util.Optional<String> engineInfo)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        @Nonnull
        -public java.util.Optional<Long> getVersion()
        -
        -
        Returns:
        -
        the log version for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getTimestamp

        -
        @Nullable
        -public java.sql.Timestamp getTimestamp()
        -
        -
        Returns:
        -
        the time the files in this commit were committed
        -
        -
      • -
      - - - -
        -
      • -

        getUserId

        -
        @Nonnull
        -public java.util.Optional<String> getUserId()
        -
        -
        Returns:
        -
        the userId of the user who committed this file
        -
        -
      • -
      - - - -
        -
      • -

        getUserName

        -
        @Nonnull
        -public java.util.Optional<String> getUserName()
        -
        -
        Returns:
        -
        the userName of the user who committed this file
        -
        -
      • -
      - - - -
        -
      • -

        getOperation

        -
        @Nullable
        -public String getOperation()
        -
        -
        Returns:
        -
        the type of operation for this commit. e.g. "WRITE"
        -
        -
      • -
      - - - -
        -
      • -

        getOperationParameters

        -
        @Nullable
        -public java.util.Map<String,String> getOperationParameters()
        -
        -
        Returns:
        -
        any relevant operation parameters. e.g. "mode", "partitionBy"
        -
        -
      • -
      - - - -
        -
      • -

        getJobInfo

        -
        @Nonnull
        -public java.util.Optional<JobInfo> getJobInfo()
        -
        -
        Returns:
        -
        the JobInfo for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getNotebookInfo

        -
        @Nonnull
        -public java.util.Optional<NotebookInfo> getNotebookInfo()
        -
        -
        Returns:
        -
        the NotebookInfo for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getClusterId

        -
        @Nonnull
        -public java.util.Optional<String> getClusterId()
        -
        -
        Returns:
        -
        the ID of the cluster used to generate this commit
        -
        -
      • -
      - - - -
        -
      • -

        getReadVersion

        -
        @Nonnull
        -public java.util.Optional<Long> getReadVersion()
        -
        -
        Returns:
        -
        the version that the transaction used to generate this commit is reading from
        -
        -
      • -
      - - - -
        -
      • -

        getIsolationLevel

        -
        @Nonnull
        -public java.util.Optional<String> getIsolationLevel()
        -
        -
        Returns:
        -
        the isolation level at which this commit was generated
        -
        -
      • -
      - - - -
        -
      • -

        getIsBlindAppend

        -
        @Nonnull
        -public java.util.Optional<Boolean> getIsBlindAppend()
        -
        -
        Returns:
        -
        whether this commit has blindly appended without caring about existing files
        -
        -
      • -
      - - - -
        -
      • -

        getOperationMetrics

        -
        @Nonnull
        -public java.util.Optional<java.util.Map<String,String>> getOperationMetrics()
        -
        -
        Returns:
        -
        any operation metrics calculated
        -
        -
      • -
      - - - -
        -
      • -

        getUserMetadata

        -
        @Nonnull
        -public java.util.Optional<String> getUserMetadata()
        -
        -
        Returns:
        -
        any additional user metadata
        -
        -
      • -
      - - - -
        -
      • -

        getEngineInfo

        -
        @Nonnull
        -public java.util.Optional<String> getEngineInfo()
        -
        -
        Returns:
        -
        the engineInfo of the engine that performed this commit. It should be of the form - "{engineName}/{engineVersion} Delta-Standalone/{deltaStandaloneVersion}"
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html deleted file mode 100644 index 52f2e9f75d3..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - -FileAction (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Interface FileAction

-
-
-
-
    -
  • -
    -
    All Superinterfaces:
    -
    Action
    -
    -
    -
    All Known Implementing Classes:
    -
    AddCDCFile, AddFile, RemoveFile
    -
    -
    -
    -
    public interface FileAction
    -extends Action
    -
    Generic interface for Actions pertaining to the addition and removal of files.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        String getPath()
        -
        -
        Returns:
        -
        the relative path or the absolute path of the file being added or removed by this - action. If it's a relative path, it's relative to the root of the table. Note: the path - is encoded and should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        boolean isDataChange()
        -
        -
        Returns:
        -
        whether any data was changed as a result of this file being added or removed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html deleted file mode 100644 index 0748fb77a04..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - -Format (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Format

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      Format() 
      Format(String provider, - java.util.Map<String,String> options) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Format

        -
        public Format(String provider,
        -              java.util.Map<String,String> options)
        -
      • -
      - - - -
        -
      • -

        Format

        -
        public Format()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getProvider

        -
        public String getProvider()
        -
        -
        Returns:
        -
        the name of the encoding for files in this table
        -
        -
      • -
      - - - -
        -
      • -

        getOptions

        -
        public java.util.Map<String,String> getOptions()
        -
        -
        Returns:
        -
        an unmodifiable Map containing configuration options for - the format
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html deleted file mode 100644 index c42dc3417e7..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - -JobInfo.Builder (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class JobInfo.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    JobInfo
    -
    -
    -
    -
    public static class JobInfo.Builder
    -extends Object
    -
    Builder class for JobInfo. Enables construction of JobInfos with default - values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder(String jobId)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - - - - - -
        -
      • -

        jobOwnerId

        -
        public JobInfo.Builder jobOwnerId(String jobOwnerId)
        -
      • -
      - - - -
        -
      • -

        triggerType

        -
        public JobInfo.Builder triggerType(String triggerType)
        -
      • -
      - - - -
        -
      • -

        build

        -
        public JobInfo build()
        -
        Builds a JobInfo using the provided parameters. If a parameter is not provided - its default values is used.
        -
        -
        Returns:
        -
        a new JobInfo with the properties added to the builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html deleted file mode 100644 index 8008d35ef9e..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html +++ /dev/null @@ -1,402 +0,0 @@ - - - - - -JobInfo (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class JobInfo

-
-
- -
-
    -
  • -
    -
    -
    public class JobInfo
    -extends Object
    -
    Represents the Databricks Job information that committed to the Delta table.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        JobInfo

        -
        public JobInfo(String jobId,
        -               String jobName,
        -               String runId,
        -               String jobOwnerId,
        -               String triggerType)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getJobId

        -
        public String getJobId()
        -
      • -
      - - - -
        -
      • -

        getJobName

        -
        public String getJobName()
        -
      • -
      - - - -
        -
      • -

        getRunId

        -
        public String getRunId()
        -
      • -
      - - - -
        -
      • -

        getJobOwnerId

        -
        public String getJobOwnerId()
        -
      • -
      - - - -
        -
      • -

        getTriggerType

        -
        public String getTriggerType()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html deleted file mode 100644 index 5e4258d9652..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html +++ /dev/null @@ -1,408 +0,0 @@ - - - - - -Metadata.Builder (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Metadata.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    Metadata
    -
    -
    -
    -
    public static final class Metadata.Builder
    -extends Object
    -
    Builder class for Metadata. Enables construction of Metadatas with default - values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder()
        -
      • -
      -
    • -
    - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html deleted file mode 100644 index a6f8db647e2..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html +++ /dev/null @@ -1,530 +0,0 @@ - - - - - -Metadata (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Metadata

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public final class Metadata
    -extends Object
    -implements Action
    -
    Updates the metadata of the table. The first version of a table must contain - a Metadata action. Subsequent Metadata actions completely - overwrite the current metadata of the table. It is the responsibility of the - writer to ensure that any data already present in the table is still valid - after any change. There can be at most one Metadata action in a - given version of the table.
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Change Metadata
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Metadata

        -
        public Metadata(@Nonnull
        -                String id,
        -                @Nullable
        -                String name,
        -                @Nullable
        -                String description,
        -                @Nonnull
        -                Format format,
        -                @Nonnull
        -                java.util.List<String> partitionColumns,
        -                @Nonnull
        -                java.util.Map<String,String> configuration,
        -                @Nonnull
        -                java.util.Optional<Long> createdTime,
        -                @Nullable
        -                StructType schema)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getId

        -
        @Nonnull
        -public String getId()
        -
        -
        Returns:
        -
        the unique identifier for this table
        -
        -
      • -
      - - - -
        -
      • -

        getName

        -
        @Nullable
        -public String getName()
        -
        -
        Returns:
        -
        the user-provided identifier for this table
        -
        -
      • -
      - - - -
        -
      • -

        getDescription

        -
        @Nullable
        -public String getDescription()
        -
        -
        Returns:
        -
        the user-provided description for this table
        -
        -
      • -
      - - - -
        -
      • -

        getFormat

        -
        @Nonnull
        -public Format getFormat()
        -
        -
        Returns:
        -
        the Format for this table
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionColumns

        -
        @Nonnull
        -public java.util.List<String> getPartitionColumns()
        -
        -
        Returns:
        -
        an unmodifiable java.util.List containing the names of - columns by which the data should be partitioned
        -
        -
      • -
      - - - -
        -
      • -

        getConfiguration

        -
        @Nonnull
        -public java.util.Map<String,String> getConfiguration()
        -
        -
        Returns:
        -
        an unmodifiable java.util.Map containing configuration - options for this metadata
        -
        -
      • -
      - - - -
        -
      • -

        getCreatedTime

        -
        @Nonnull
        -public java.util.Optional<Long> getCreatedTime()
        -
        -
        Returns:
        -
        the time when this metadata action was created, in milliseconds - since the Unix epoch
        -
        -
      • -
      - - - -
        -
      • -

        getSchema

        -
        @Nullable
        -public StructType getSchema()
        -
        -
        Returns:
        -
        the schema of the table as a StructType
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html deleted file mode 100644 index 7272a026c5f..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - -NotebookInfo (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class NotebookInfo

-
-
- -
-
    -
  • -
    -
    -
    public class NotebookInfo
    -extends Object
    -
    Represents the Databricks Notebook information that committed to the Delta table.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      NotebookInfo(String notebookId) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        NotebookInfo

        -
        public NotebookInfo(String notebookId)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getNotebookId

        -
        public String getNotebookId()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html deleted file mode 100644 index fc0426d374b..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html +++ /dev/null @@ -1,345 +0,0 @@ - - - - - -Protocol (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Protocol

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public final class Protocol
    -extends Object
    -implements Action
    -
    Used to block older clients from reading or writing the log when backwards - incompatible changes are made to the protocol. Readers and writers are - responsible for checking that they meet the minimum versions before performing - any other operations. -

    - Since this action allows us to explicitly block older clients in the case of a - breaking change to the protocol, clients should be tolerant of messages and - fields that they do not understand.

    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Protocol Evolution
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Protocol(int minReaderVersion, - int minWriterVersion) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Protocol

        -
        public Protocol(int minReaderVersion,
        -                int minWriterVersion)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getMinReaderVersion

        -
        public int getMinReaderVersion()
        -
        -
        Returns:
        -
        the minimum version of the Delta read protocol that a client must implement in order - to correctly read this table
        -
        -
      • -
      - - - -
        -
      • -

        getMinWriterVersion

        -
        public int getMinWriterVersion()
        -
        -
        Returns:
        -
        the minimum version of the Delta write protocol that a client must implement in order - to correctly write this table
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html deleted file mode 100644 index 40b55b0091d..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html +++ /dev/null @@ -1,471 +0,0 @@ - - - - - -RemoveFile (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class RemoveFile

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      RemoveFile(String path, - java.util.Optional<Long> deletionTimestamp, - boolean dataChange, - boolean extendedFileMetadata, - java.util.Map<String,String> partitionValues, - java.util.Optional<Long> size, - java.util.Map<String,String> tags) -
      Deprecated.  -
      RemoveFile should be created from AddFile.remove() instead.
      -
      -
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        RemoveFile

        -
        @Deprecated
        -public RemoveFile(@Nonnull
        -                              String path,
        -                              @Nonnull
        -                              java.util.Optional<Long> deletionTimestamp,
        -                              boolean dataChange,
        -                              boolean extendedFileMetadata,
        -                              @Nullable
        -                              java.util.Map<String,String> partitionValues,
        -                              @Nonnull
        -                              java.util.Optional<Long> size,
        -                              @Nullable
        -                              java.util.Map<String,String> tags)
        -
        Deprecated. RemoveFile should be created from AddFile.remove() instead.
        -
        Users should not construct RemoveFiles themselves, and should instead use one - of the various AddFile.remove() methods to instantiate the correct RemoveFile - for a given AddFile instance.
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be removed from the table. If it's - a relative path, it's relative to the root of the table. Note: the path is encoded - and should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getDeletionTimestamp

        -
        public java.util.Optional<Long> getDeletionTimestamp()
        -
        -
        Returns:
        -
        the time that this file was deleted as milliseconds since the epoch
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being removed. When - false the records in the removed file must be contained in one or more add - actions in the same version
        -
        -
      • -
      - - - -
        -
      • -

        isExtendedFileMetadata

        -
        public boolean isExtendedFileMetadata()
        -
        -
        Returns:
        -
        true if the fields partitionValues, size, and tags are - present
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nullable
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public java.util.Optional<Long> getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html deleted file mode 100644 index 4f9bb2088af..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - -SetTransaction (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class SetTransaction

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      SetTransaction(String appId, - long version, - java.util.Optional<Long> lastUpdated) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        SetTransaction

        -
        public SetTransaction(@Nonnull
        -                      String appId,
        -                      long version,
        -                      @Nonnull
        -                      java.util.Optional<Long> lastUpdated)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getAppId

        -
        @Nonnull
        -public String getAppId()
        -
        -
        Returns:
        -
        the unique identifier for the application performing the transaction
        -
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the application-specific numeric identifier for this transaction
        -
        -
      • -
      - - - -
        -
      • -

        getLastUpdated

        -
        @Nonnull
        -public java.util.Optional<Long> getLastUpdated()
        -
        -
        Returns:
        -
        the time when this transaction action was created, in milliseconds since the Unix - epoch
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html deleted file mode 100644 index 25314348128..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -io.delta.standalone.actions (Delta Standalone 0.4.0 JavaDoc) - - - - - -

io.delta.standalone.actions

-
-

Interfaces

- -

Classes

- -
- - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html deleted file mode 100644 index 6de01268e93..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - -io.delta.standalone.actions (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.actions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html deleted file mode 100644 index 458e5b9bb21..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - -io.delta.standalone.actions Class Hierarchy (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.actions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html deleted file mode 100644 index deecf4629a9..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - -CloseableIterator (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.data
-

Interface CloseableIterator<T>

-
-
-
-
    -
  • -
    -
    All Superinterfaces:
    -
    AutoCloseable, java.io.Closeable, java.util.Iterator<T>
    -
    -
    -
    -
    public interface CloseableIterator<T>
    -extends java.util.Iterator<T>, java.io.Closeable
    -
    An Iterator that also implements the Closeable interface. The caller - should call Closeable.close() method to free all resources properly after using the iterator.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from interface java.util.Iterator

        -forEachRemaining, hasNext, next, remove
      • -
      -
        -
      • - - -

        Methods inherited from interface java.io.Closeable

        -close
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html deleted file mode 100644 index 0ce2bea61de..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html +++ /dev/null @@ -1,682 +0,0 @@ - - - - - -RowRecord (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.data
-

Interface RowRecord

-
-
-
-
    -
  • -
    -
    -
    public interface RowRecord
    -
    Represents one row of data containing a non-empty collection of fieldName - value pairs. - It provides APIs to allow retrieval of values through fieldName lookup. For example, - -
    
    -   if (row.isNullAt("int_field")) {
    -     // handle the null value.
    -   } else {
    -     int x = getInt("int_field");
    -   }
    - 
    -
    -
    See Also:
    -
    StructType, -StructField
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Abstract Methods 
      Modifier and TypeMethod and Description
      java.math.BigDecimalgetBigDecimal(String fieldName) -
      Retrieves value from data record and returns the value as a java.math.BigDecimal.
      -
      byte[]getBinary(String fieldName) -
      Retrieves value from data record and returns the value as binary (byte array).
      -
      booleangetBoolean(String fieldName) -
      Retrieves value from data record and returns the value as a primitive boolean.
      -
      bytegetByte(String fieldName) -
      Retrieves value from data record and returns the value as a primitive byte.
      -
      java.sql.DategetDate(String fieldName) -
      Retrieves value from data record and returns the value as a java.sql.Date.
      -
      doublegetDouble(String fieldName) -
      Retrieves value from data record and returns the value as a primitive double.
      -
      floatgetFloat(String fieldName) -
      Retrieves value from data record and returns the value as a primitive float.
      -
      intgetInt(String fieldName) -
      Retrieves value from data record and returns the value as a primitive int.
      -
      intgetLength() 
      <T> java.util.List<T>getList(String fieldName) -
      Retrieves value from data record and returns the value as a java.util.List<T> object.
      -
      longgetLong(String fieldName) -
      Retrieves value from data record and returns the value as a primitive long.
      -
      <K,V> java.util.Map<K,V>getMap(String fieldName) -
      Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
      -
      RowRecordgetRecord(String fieldName) -
      Retrieves value from data record and returns the value as a RowRecord object.
      -
      StructTypegetSchema() 
      shortgetShort(String fieldName) -
      Retrieves value from data record and returns the value as a primitive short.
      -
      StringgetString(String fieldName) -
      Retrieves value from data record and returns the value as a String object.
      -
      java.sql.TimestampgetTimestamp(String fieldName) -
      Retrieves value from data record and returns the value as a java.sql.Timestamp.
      -
      booleanisNullAt(String fieldName) 
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        getLength

        -
        int getLength()
        -
        -
        Returns:
        -
        the number of elements in this RowRecord
        -
        -
      • -
      - - - -
        -
      • -

        isNullAt

        -
        boolean isNullAt(String fieldName)
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        whether the value of field fieldName is null
        -
        -
      • -
      - - - -
        -
      • -

        getInt

        -
        int getInt(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive int.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive int
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getLong

        -
        long getLong(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive long.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive long
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getByte

        -
        byte getByte(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive byte.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive byte
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getShort

        -
        short getShort(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive short.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive short
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBoolean

        -
        boolean getBoolean(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive boolean.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive boolean
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getFloat

        -
        float getFloat(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive float.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive float
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getDouble

        -
        double getDouble(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive double.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive double
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getString

        -
        String getString(String fieldName)
        -
        Retrieves value from data record and returns the value as a String object.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a String object. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBinary

        -
        byte[] getBinary(String fieldName)
        -
        Retrieves value from data record and returns the value as binary (byte array).
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as binary (byte array). null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBigDecimal

        -
        java.math.BigDecimal getBigDecimal(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.math.BigDecimal.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.math.BigDecimal. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getTimestamp

        -
        java.sql.Timestamp getTimestamp(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.sql.Timestamp.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.sql.Timestamp. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getDate

        -
        java.sql.Date getDate(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.sql.Date.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.sql.Date. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getRecord

        -
        RowRecord getRecord(String fieldName)
        -
        Retrieves value from data record and returns the value as a RowRecord object.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a RowRecord object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any nested field, if that field is not - nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getList

        -
        <T> java.util.List<T> getList(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.util.List<T> object.
        -
        -
        Type Parameters:
        -
        T - element type
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a java.util.List<T> object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any element field, if that field is not - nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getMap

        -
        <K,V> java.util.Map<K,V> getMap(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
        -
        -
        Type Parameters:
        -
        K - key type
        -
        V - value type
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a java.util.Map<K, V> object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any key/value field, if that field is not - nullable and null data value read
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html deleted file mode 100644 index c8ccf99a0d7..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -io.delta.standalone.data (Delta Standalone 0.4.0 JavaDoc) - - - - - -

io.delta.standalone.data

-
-

Interfaces

- -
- - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html deleted file mode 100644 index 9b00d624f8c..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - -io.delta.standalone.data (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.data

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html deleted file mode 100644 index c6aa213cff0..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - -io.delta.standalone.data Class Hierarchy (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.data

-Package Hierarchies: - -
-
-

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html deleted file mode 100644 index c28b470444f..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentAppendException (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentAppendException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentAppendException
    -extends DeltaConcurrentModificationException
    -
    Thrown when files are added that would have been read by the current transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentAppendException

        -
        public ConcurrentAppendException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html deleted file mode 100644 index 63b3cc0299c..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentDeleteDeleteException (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentDeleteDeleteException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentDeleteDeleteException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the current transaction deletes data that was deleted by a concurrent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentDeleteDeleteException

        -
        public ConcurrentDeleteDeleteException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html deleted file mode 100644 index e75feca0e71..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentDeleteReadException (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentDeleteReadException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentDeleteReadException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the current transaction reads data that was deleted by a concurrent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentDeleteReadException

        -
        public ConcurrentDeleteReadException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html deleted file mode 100644 index f152ccb6475..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentTransactionException (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentTransactionException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentTransactionException
    -extends DeltaConcurrentModificationException
    -
    Thrown when concurrent transaction both attempt to update the same idempotent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentTransactionException

        -
        public ConcurrentTransactionException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html deleted file mode 100644 index 99224bd4b60..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html +++ /dev/null @@ -1,275 +0,0 @@ - - - - - -DeltaConcurrentModificationException (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class DeltaConcurrentModificationException

-
-
- -
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DeltaConcurrentModificationException

        -
        public DeltaConcurrentModificationException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html deleted file mode 100644 index d59e421a6b3..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - -DeltaStandaloneException (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class DeltaStandaloneException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class DeltaStandaloneException
    -extends RuntimeException
    -
    Thrown when a query fails, usually because the query itself is invalid.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException()
        -
      • -
      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException(String message)
        -
      • -
      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException(String message,
        -                                Throwable cause)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html deleted file mode 100644 index 4b25b432c9a..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - -MetadataChangedException (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class MetadataChangedException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class MetadataChangedException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the metadata of the Delta table has changed between the time of read - and the time of commit.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MetadataChangedException

        -
        public MetadataChangedException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html deleted file mode 100644 index f412b465ad3..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ProtocolChangedException (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ProtocolChangedException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ProtocolChangedException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the protocol version has changed between the time of read and the time of commit.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ProtocolChangedException

        -
        public ProtocolChangedException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html deleted file mode 100644 index 8dcefecbcaa..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -io.delta.standalone.exceptions (Delta Standalone 0.4.0 JavaDoc) - - - - - -

io.delta.standalone.exceptions

-
-

Exceptions

- -
- - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html deleted file mode 100644 index 5d0625e51d8..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - -io.delta.standalone.exceptions (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.exceptions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html deleted file mode 100644 index ccae718a8ef..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - -io.delta.standalone.exceptions Class Hierarchy (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.exceptions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html deleted file mode 100644 index c3132d24507..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - -And (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class And

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class And
    -extends BinaryOperator
    -implements Predicate
    -
    Evaluates logical expr1 AND expr2 for new And(expr1, expr2). -

    - Requires both left and right input expressions evaluate to booleans.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object leftResult,
        -                           Object rightResult)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html deleted file mode 100644 index 449a550ef4a..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - -BinaryComparison (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryComparison

-
-
- -
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html deleted file mode 100644 index 185af193fd9..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html +++ /dev/null @@ -1,340 +0,0 @@ - - - - - -BinaryExpression (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryExpression

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    BinaryOperator
    -
    -
    -
    -
    public abstract class BinaryExpression
    -extends Object
    -implements Expression
    -
    An Expression with two inputs and one output. The output is by default evaluated to null - if either input is evaluated to null.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - - - - - -
        -
      • -

        eval

        -
        public final Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html deleted file mode 100644 index 2637ae68286..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - -BinaryOperator (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryOperator

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    And, BinaryComparison, Or
    -
    -
    -
    -
    public abstract class BinaryOperator
    -extends BinaryExpression
    -
    A BinaryExpression that is an operator, meaning the string representation is - x symbol y, rather than funcName(x, y). -

    - Requires both inputs to be of the same data type.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html deleted file mode 100644 index e03c6667b44..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - -Column (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Column

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Column

        -
        public Column(String name,
        -              DataType dataType)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        name

        -
        public String name()
        -
      • -
      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        dataType

        -
        public DataType dataType()
        -
        -
        Returns:
        -
        the DataType of the result of evaluating this expression.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        public java.util.Set<String> references()
        -
        -
        Specified by:
        -
        references in interface Expression
        -
        Overrides:
        -
        references in class LeafExpression
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Specified by:
        -
        equals in class LeafExpression
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html deleted file mode 100644 index 6b82eab435b..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -EqualTo (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class EqualTo

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html deleted file mode 100644 index d4b9a81eda1..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - -Expression (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Interface Expression

-
-
-
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        Object eval(RowRecord record)
        -
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        dataType

        -
        DataType dataType()
        -
        -
        Returns:
        -
        the DataType of the result of evaluating this expression.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        String toString()
        -
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        default java.util.Set<String> references()
        -
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        java.util.List<Expression> children()
        -
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html deleted file mode 100644 index 65b57e42586..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -GreaterThan (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class GreaterThan

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html deleted file mode 100644 index fab04aa12e8..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -GreaterThanOrEqual (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class GreaterThanOrEqual

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class GreaterThanOrEqual
    -extends BinaryComparison
    -implements Predicate
    -
    Evaluates expr1 >= expr2 for new GreaterThanOrEqual(expr1, expr2).
    -
  • -
-
-
- -
-
-
    -
  • - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html deleted file mode 100644 index 53a1fd20941..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - -In (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class In

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class In
    -extends Object
    -implements Predicate
    -
    Evaluates if expr is in exprList for new In(expr, exprList). True if - expr is equal to any expression in exprList, else false.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      In(Expression value, - java.util.List<? extends Expression> elems) 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      java.util.List<Expression>children() 
      Booleaneval(RowRecord record) -
      This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide.
      -
      StringtoString() 
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      - - -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        In

        -
        public In(Expression value,
        -          java.util.List<? extends Expression> elems)
        -
        -
        Parameters:
        -
        value - a nonnull expression
        -
        elems - a nonnull, nonempty list of expressions with the same data type as - value
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Boolean eval(RowRecord record)
        -
        This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide. The logic is as follows: -
          -
        • TRUE if the non-NULL value is found in the list
        • -
        • FALSE if the non-NULL value is not found in the list and the list does not contain - NULL values
        • -
        • NULL if the value is NULL, or the non-NULL value is not found in the list and the - list contains at least one NULL value
        • -
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        See Also:
        -
        NULL Semantics
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html deleted file mode 100644 index 62cdf2dbdd8..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - -IsNotNull (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class IsNotNull

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        IsNotNull

        -
        public IsNotNull(Expression child)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Overrides:
        -
        eval in class UnaryExpression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html deleted file mode 100644 index 5bfd546c6d0..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - -IsNull (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class IsNull

-
-
- -
- -
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Overrides:
        -
        eval in class UnaryExpression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html deleted file mode 100644 index 7b872fd0e7e..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - -LeafExpression (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LeafExpression

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        public java.util.Set<String> references()
        -
        -
        Specified by:
        -
        references in interface Expression
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public abstract boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public abstract int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html deleted file mode 100644 index 9978aa60c53..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -LessThan (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LessThan

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html deleted file mode 100644 index f4e2c0645cd..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -LessThanOrEqual (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LessThanOrEqual

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html deleted file mode 100644 index c9e09278072..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html +++ /dev/null @@ -1,617 +0,0 @@ - - - - - -Literal (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Literal

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html deleted file mode 100644 index 59a5144b9a3..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html +++ /dev/null @@ -1,324 +0,0 @@ - - - - - -Not (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Not

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class Not
    -extends UnaryExpression
    -implements Predicate
    -
    Evaluates logical NOT expr for new Not(expr). -

    - Requires the child expression evaluates to a boolean.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object childResult)
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html deleted file mode 100644 index 5a5e6d8015f..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - -Or (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Or

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class Or
    -extends BinaryOperator
    -implements Predicate
    -
    Evaluates logical expr1 OR expr2 for new Or(expr1, expr2). -

    - Requires both left and right input expressions evaluate to booleans.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object leftResult,
        -                           Object rightResult)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html deleted file mode 100644 index 72651b0cef4..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - -Predicate (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Interface Predicate

-
-
-
- -
-
- -
-
-
    -
  • - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html deleted file mode 100644 index 4e9b3990e99..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - -UnaryExpression (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class UnaryExpression

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    IsNotNull, IsNull, Not
    -
    -
    -
    -
    public abstract class UnaryExpression
    -extends Object
    -implements Expression
    -
    An Expression with one input and one output. The output is by default evaluated to null - if the input is evaluated to null.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html deleted file mode 100644 index ff5960ef3c2..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - -io.delta.standalone.expressions (Delta Standalone 0.4.0 JavaDoc) - - - - - -

io.delta.standalone.expressions

-
-

Interfaces

- -

Classes

- -
- - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html deleted file mode 100644 index 56c6582e5b9..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - -io.delta.standalone.expressions (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.expressions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html deleted file mode 100644 index 9d08396f949..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - -io.delta.standalone.expressions Class Hierarchy (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.expressions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/package-frame.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/package-frame.html deleted file mode 100644 index 8c1eb709111..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/package-frame.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -io.delta.standalone (Delta Standalone 0.4.0 JavaDoc) - - - - - -

io.delta.standalone

-
-

Interfaces

- -

Classes

- -

Enums

- -
- - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/package-summary.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/package-summary.html deleted file mode 100644 index f8da0e2c4cd..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/package-summary.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - -io.delta.standalone (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/package-tree.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/package-tree.html deleted file mode 100644 index 39a3da640b1..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/package-tree.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - -io.delta.standalone Class Hierarchy (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/LogStore.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/LogStore.html deleted file mode 100644 index 3c0de6dda65..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/LogStore.html +++ /dev/null @@ -1,478 +0,0 @@ - - - - - -LogStore (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.storage
-

Class LogStore

-
-
- -
-
    -
  • -
    -
    -
    public abstract class LogStore
    -extends Object
    -
    :: DeveloperApi :: -

    - General interface for all critical file system operations required to read and write the - Delta logs. The correctness is predicated on the atomicity and durability guarantees of - the implementation of this interface. Specifically, -

      -
    1. - Atomic visibility of files: If isPartialWriteVisible is false, any file written through - this store must be made visible atomically. In other words, this should not generate - partial files. -
    2. -
    3. - Mutual exclusion: Only one writer must be able to create (or rename) a file at the final - destination. -
    4. -
    5. - Consistent listing: Once a file has been written in a directory, all future listings for - that directory must return that file. -
    6. -
    -

    - All subclasses of this interface are required to have a constructor that takes - Configuration as a single parameter. This constructor is used to dynamically create the - LogStore. -

    - LogStore and its implementations are not meant for direct access but for configuration based - on storage system.

    -
    -
    Since:
    -
    0.3.0
    -
    See Also:
    -
    Delta Storage
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      LogStore(org.apache.hadoop.conf.Configuration initHadoopConf) 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Abstract Methods Concrete Methods 
      Modifier and TypeMethod and Description
      org.apache.hadoop.conf.ConfigurationinitHadoopConf() -
      :: DeveloperApi ::
      -
      abstract BooleanisPartialWriteVisible(org.apache.hadoop.fs.Path path, - org.apache.hadoop.conf.Configuration hadoopConf) -
      :: DeveloperApi ::
      -
      abstract java.util.Iterator<org.apache.hadoop.fs.FileStatus>listFrom(org.apache.hadoop.fs.Path path, - org.apache.hadoop.conf.Configuration hadoopConf) -
      :: DeveloperApi ::
      -
      abstract CloseableIterator<String>read(org.apache.hadoop.fs.Path path, - org.apache.hadoop.conf.Configuration hadoopConf) -
      :: DeveloperApi ::
      -
      abstract org.apache.hadoop.fs.PathresolvePathOnPhysicalStorage(org.apache.hadoop.fs.Path path, - org.apache.hadoop.conf.Configuration hadoopConf) -
      :: DeveloperApi ::
      -
      abstract voidwrite(org.apache.hadoop.fs.Path path, - java.util.Iterator<String> actions, - Boolean overwrite, - org.apache.hadoop.conf.Configuration hadoopConf) -
      :: DeveloperApi ::
      -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        LogStore

        -
        public LogStore(org.apache.hadoop.conf.Configuration initHadoopConf)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        initHadoopConf

        -
        public org.apache.hadoop.conf.Configuration initHadoopConf()
        -
        :: DeveloperApi :: -

        - Hadoop configuration that should only be used during initialization of LogStore. Each method - should use their hadoopConf parameter rather than this (potentially outdated) hadoop - configuration.

        -
        -
        Returns:
        -
        the initial hadoop configuration.
        -
        -
      • -
      - - - -
        -
      • -

        read

        -
        public abstract CloseableIterator<String> read(org.apache.hadoop.fs.Path path,
        -                                               org.apache.hadoop.conf.Configuration hadoopConf)
        -
        :: DeveloperApi :: -

        - Load the given file and return an Iterator of lines, with line breaks removed from - each line. Callers of this function are responsible to close the iterator if they are done - with it.

        -
        -
        Parameters:
        -
        path - the path to load
        -
        hadoopConf - the latest hadoopConf
        -
        Returns:
        -
        the CloseableIterator of lines in the given file.
        -
        Since:
        -
        0.3.0
        -
        -
      • -
      - - - -
        -
      • -

        write

        -
        public abstract void write(org.apache.hadoop.fs.Path path,
        -                           java.util.Iterator<String> actions,
        -                           Boolean overwrite,
        -                           org.apache.hadoop.conf.Configuration hadoopConf)
        -                    throws java.nio.file.FileAlreadyExistsException
        -
        :: DeveloperApi :: -

        - Write the given actions to the given Path with or without overwrite as indicated. -

        - Implementation must throw FileAlreadyExistsException exception if the - file already exists and overwrite = false. Furthermore, if - isPartialWriteVisible(org.apache.hadoop.fs.Path, org.apache.hadoop.conf.Configuration) returns false, implementation must ensure that the - entire file is made visible atomically, that is, it should not generate partial files.

        -
        -
        Parameters:
        -
        path - the path to write to
        -
        actions - actions to be written
        -
        overwrite - if true, overwrites the file if it already exists
        -
        hadoopConf - the latest hadoopConf
        -
        Throws:
        -
        java.nio.file.FileAlreadyExistsException - if the file already exists and overwrite is - false
        -
        Since:
        -
        0.3.0
        -
        -
      • -
      - - - -
        -
      • -

        listFrom

        -
        public abstract java.util.Iterator<org.apache.hadoop.fs.FileStatus> listFrom(org.apache.hadoop.fs.Path path,
        -                                                                             org.apache.hadoop.conf.Configuration hadoopConf)
        -                                                                      throws java.io.FileNotFoundException
        -
        :: DeveloperApi :: -

        - List the paths in the same directory that are lexicographically greater or equal to - (UTF-8 sorting) the given Path. The result should also be sorted by the file name.

        -
        -
        Parameters:
        -
        path - the path to load
        -
        hadoopConf - the latest hadoopConf
        -
        Returns:
        -
        an Iterator of the paths lexicographically greater or equal to (UTF-8 sorting) the - given Path
        -
        Throws:
        -
        java.io.FileNotFoundException - if the file does not exist
        -
        Since:
        -
        0.3.0
        -
        -
      • -
      - - - -
        -
      • -

        resolvePathOnPhysicalStorage

        -
        public abstract org.apache.hadoop.fs.Path resolvePathOnPhysicalStorage(org.apache.hadoop.fs.Path path,
        -                                                                       org.apache.hadoop.conf.Configuration hadoopConf)
        -
        :: DeveloperApi :: -

        - Resolve the fully qualified path for the given Path.

        -
        -
        Parameters:
        -
        path - the path to resolve
        -
        hadoopConf - the latest hadoopConf
        -
        Returns:
        -
        the resolved path
        -
        Since:
        -
        0.3.0
        -
        -
      • -
      - - - -
        -
      • -

        isPartialWriteVisible

        -
        public abstract Boolean isPartialWriteVisible(org.apache.hadoop.fs.Path path,
        -                                              org.apache.hadoop.conf.Configuration hadoopConf)
        -
        :: DeveloperApi :: -

        - Whether a partial write is visible for the underlying file system of the given Path.

        -
        -
        Parameters:
        -
        path - the path in question
        -
        hadoopConf - the latest hadoopConf
        -
        Returns:
        -
        true if partial writes are visible for the given Path, else false
        -
        Since:
        -
        0.3.0
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/package-frame.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/package-frame.html deleted file mode 100644 index b9c993a170a..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/package-frame.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - -io.delta.standalone.storage (Delta Standalone 0.4.0 JavaDoc) - - - - - -

io.delta.standalone.storage

-
-

Classes

- -
- - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/package-summary.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/package-summary.html deleted file mode 100644 index e8e235e3a8b..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/package-summary.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - -io.delta.standalone.storage (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.storage

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/package-tree.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/package-tree.html deleted file mode 100644 index 51af54207ad..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/storage/package-tree.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - -io.delta.standalone.storage Class Hierarchy (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.storage

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html deleted file mode 100644 index 471ca395956..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - -ArrayType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ArrayType

-
-
- -
-
    -
  • -
    -
    -
    public final class ArrayType
    -extends DataType
    -
    The data type for collections of multiple values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ArrayType

        -
        public ArrayType(DataType elementType,
        -                 boolean containsNull)
        -
        -
        Parameters:
        -
        elementType - the data type of values
        -
        containsNull - indicates if values have null value
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getElementType

        -
        public DataType getElementType()
        -
        -
        Returns:
        -
        the type of array elements
        -
        -
      • -
      - - - -
        -
      • -

        containsNull

        -
        public boolean containsNull()
        -
        -
        Returns:
        -
        true if the array has null values, else false
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html deleted file mode 100644 index 0f0bd658634..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -BinaryType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class BinaryType

-
-
- -
-
    -
  • -
    -
    -
    public final class BinaryType
    -extends DataType
    -
    The data type representing byte[] values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BinaryType

        -
        public BinaryType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html deleted file mode 100644 index 4291c37136f..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -BooleanType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class BooleanType

-
-
- -
-
    -
  • -
    -
    -
    public final class BooleanType
    -extends DataType
    -
    The data type representing boolean values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BooleanType

        -
        public BooleanType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html deleted file mode 100644 index 985e9f087d1..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -ByteType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ByteType

-
-
- -
-
    -
  • -
    -
    -
    public final class ByteType
    -extends DataType
    -
    The data type representing byte values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ByteType

        -
        public ByteType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html deleted file mode 100644 index fa79163201f..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html +++ /dev/null @@ -1,383 +0,0 @@ - - - - - -DataType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DataType

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DataType

        -
        public DataType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getTypeName

        -
        public String getTypeName()
        -
        -
        Returns:
        -
        the name of the type used in JSON serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      - - - -
        -
      • -

        getCatalogString

        -
        public String getCatalogString()
        -
        -
        Returns:
        -
        a String representation for the type saved in external catalogs
        -
        -
      • -
      - - - -
        -
      • -

        toJson

        -
        public String toJson()
        -
        -
        Returns:
        -
        a JSON String representation of the type
        -
        -
      • -
      - - - -
        -
      • -

        toPrettyJson

        -
        public String toPrettyJson()
        -
        -
        Returns:
        -
        a pretty (i.e. indented) JSON String representation of the type
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html deleted file mode 100644 index 75683d780fa..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - -DateType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DateType

-
-
- -
-
    -
  • -
    -
    -
    public final class DateType
    -extends DataType
    -
    A date type, supporting "0001-01-01" through "9999-12-31". - Internally, this is represented as the number of days from 1970-01-01.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DateType

        -
        public DateType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html deleted file mode 100644 index b8ae5ad4783..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html +++ /dev/null @@ -1,381 +0,0 @@ - - - - - -DecimalType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DecimalType

-
-
- -
-
    -
  • -
    -
    -
    public final class DecimalType
    -extends DataType
    -
    The data type representing java.math.BigDecimal values. - A Decimal that must have fixed precision (the maximum number of digits) and scale (the number - of digits on right side of dot). - - The precision can be up to 38, scale can also be up to 38 (less or equal to precision). - - The default precision and scale is (10, 0).
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        USER_DEFAULT

        -
        public static final DecimalType USER_DEFAULT
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DecimalType

        -
        public DecimalType(int precision,
        -                   int scale)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPrecision

        -
        public int getPrecision()
        -
        -
        Returns:
        -
        the maximum number of digits of the decimal
        -
        -
      • -
      - - - -
        -
      • -

        getScale

        -
        public int getScale()
        -
        -
        Returns:
        -
        the number of digits on the right side of the decimal point (dot)
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html deleted file mode 100644 index 1fc270a21c7..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -DoubleType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DoubleType

-
-
- -
-
    -
  • -
    -
    -
    public final class DoubleType
    -extends DataType
    -
    The data type representing double values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DoubleType

        -
        public DoubleType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html deleted file mode 100644 index 18e1d52df57..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html +++ /dev/null @@ -1,441 +0,0 @@ - - - - - -FieldMetadata.Builder (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FieldMetadata.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    FieldMetadata
    -
    -
    -
    -
    public static class FieldMetadata.Builder
    -extends Object
    -
    Builder class for FieldMetadata.
    -
  • -
-
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html deleted file mode 100644 index c30b55010ff..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html +++ /dev/null @@ -1,368 +0,0 @@ - - - - - -FieldMetadata (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FieldMetadata

-
-
- -
-
    -
  • -
    -
    -
    public final class FieldMetadata
    -extends Object
    -
    The metadata for a given StructField.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getEntries

        -
        public java.util.Map<String,Object> getEntries()
        -
        -
        Returns:
        -
        list of the key-value pairs in this FieldMetadata
        -
        -
      • -
      - - - -
        -
      • -

        contains

        -
        public boolean contains(String key)
        -
        -
        Parameters:
        -
        key - the key to check for
        -
        Returns:
        -
        True if this contains a mapping for the given key, False otherwise
        -
        -
      • -
      - - - -
        -
      • -

        get

        -
        public Object get(String key)
        -
        -
        Parameters:
        -
        key - the key to check for
        -
        Returns:
        -
        the value to which the specified key is mapped, or null if there is no mapping for - the given key
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Overrides:
        -
        toString in class Object
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html deleted file mode 100644 index ee83585a545..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -FloatType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FloatType

-
-
- -
-
    -
  • -
    -
    -
    public final class FloatType
    -extends DataType
    -
    The data type representing float values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        FloatType

        -
        public FloatType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html deleted file mode 100644 index 3d16e62d8a7..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -IntegerType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class IntegerType

-
-
- -
-
    -
  • -
    -
    -
    public final class IntegerType
    -extends DataType
    -
    The data type representing int values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        IntegerType

        -
        public IntegerType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html deleted file mode 100644 index bebd1a3100a..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -LongType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class LongType

-
-
- -
-
    -
  • -
    -
    -
    public final class LongType
    -extends DataType
    -
    The data type representing long values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        LongType

        -
        public LongType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html deleted file mode 100644 index a935047ee54..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html +++ /dev/null @@ -1,364 +0,0 @@ - - - - - -MapType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class MapType

-
-
- -
-
    -
  • -
    -
    -
    public final class MapType
    -extends DataType
    -
    The data type for Maps. Keys in a map are not allowed to have null values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MapType

        -
        public MapType(DataType keyType,
        -               DataType valueType,
        -               boolean valueContainsNull)
        -
        -
        Parameters:
        -
        keyType - the data type of map keys
        -
        valueType - the data type of map values
        -
        valueContainsNull - indicates if map values have null values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getKeyType

        -
        public DataType getKeyType()
        -
        -
        Returns:
        -
        the data type of map keys
        -
        -
      • -
      - - - -
        -
      • -

        getValueType

        -
        public DataType getValueType()
        -
        -
        Returns:
        -
        the data type of map values
        -
        -
      • -
      - - - -
        -
      • -

        valueContainsNull

        -
        public boolean valueContainsNull()
        -
        -
        Returns:
        -
        true if this map has null values, else false
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html deleted file mode 100644 index 6dc3931e019..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -NullType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class NullType

-
-
- -
-
    -
  • -
    -
    -
    public final class NullType
    -extends DataType
    -
    The data type representing null values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        NullType

        -
        public NullType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html deleted file mode 100644 index 3e464c79669..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -ShortType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ShortType

-
-
- -
-
    -
  • -
    -
    -
    public final class ShortType
    -extends DataType
    -
    The data type representing short values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ShortType

        -
        public ShortType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html deleted file mode 100644 index 8bb0ee2c4a2..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -StringType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StringType

-
-
- -
-
    -
  • -
    -
    -
    public final class StringType
    -extends DataType
    -
    The data type representing String values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StringType

        -
        public StringType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html deleted file mode 100644 index db0a581ea33..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html +++ /dev/null @@ -1,416 +0,0 @@ - - - - - -StructField (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StructField

-
-
- -
-
    -
  • -
    -
    -
    public final class StructField
    -extends Object
    -
    A field inside a StructType.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType)
        -
        Constructor with default nullable = true.
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        -
      • -
      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType,
        -                   boolean nullable)
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        nullable - indicates if values of this field can be null values
        -
        -
      • -
      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType,
        -                   boolean nullable,
        -                   FieldMetadata metadata)
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        nullable - indicates if values of this field can be null values
        -
        metadata - metadata for this field
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getName

        -
        public String getName()
        -
        -
        Returns:
        -
        the name of this field
        -
        -
      • -
      - - - -
        -
      • -

        getDataType

        -
        public DataType getDataType()
        -
        -
        Returns:
        -
        the data type of this field
        -
        -
      • -
      - - - -
        -
      • -

        isNullable

        -
        public boolean isNullable()
        -
        -
        Returns:
        -
        whether this field allows to have a null value.
        -
        -
      • -
      - - - -
        -
      • -

        getMetadata

        -
        public FieldMetadata getMetadata()
        -
        -
        Returns:
        -
        the metadata for this field
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html deleted file mode 100644 index 785411155d6..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html +++ /dev/null @@ -1,559 +0,0 @@ - - - - - -StructType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StructType

-
-
- -
-
    -
  • -
    -
    -
    public final class StructType
    -extends DataType
    -
    The data type representing a table's schema, consisting of a collection of - fields (that is, fieldName to dataType pairs).
    -
    -
    See Also:
    -
    StructField
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StructType

        -
        public StructType()
        -
      • -
      - - - -
        -
      • -

        StructType

        -
        public StructType(StructField[] fields)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        add

        -
        public StructType add(StructField field)
        -
        Creates a new StructType by adding a new field. - -
        
        - StructType schema = new StructType()
        -     .add(new StructField("a", new IntegerType(), true))
        -     .add(new StructField("b", new LongType(), false))
        -     .add(new StructField("c", new StringType(), true))
        - 
        -
        -
        Parameters:
        -
        field - The new field to add.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        add

        -
        public StructType add(String fieldName,
        -                      DataType dataType)
        -
        Creates a new StructType by adding a new nullable field with no metadata. - -
        
        - StructType schema = new StructType()
        -     .add("a", new IntegerType())
        -     .add("b", new LongType())
        -     .add("c", new StringType())
        - 
        -
        -
        Parameters:
        -
        fieldName - The name of the new field.
        -
        dataType - The datatype for the new field.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        add

        -
        public StructType add(String fieldName,
        -                      DataType dataType,
        -                      boolean nullable)
        -
        Creates a new StructType by adding a new field with no metadata. - -
        
        - StructType schema = new StructType()
        -     .add("a", new IntegerType(), true)
        -     .add("b", new LongType(), false)
        -     .add("c", new StringType(), true)
        - 
        -
        -
        Parameters:
        -
        fieldName - The name of the new field.
        -
        dataType - The datatype for the new field.
        -
        nullable - Whether or not the new field is nullable.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        getFields

        -
        public StructField[] getFields()
        -
        -
        Returns:
        -
        array of fields
        -
        -
      • -
      - - - -
        -
      • -

        getFieldNames

        -
        public String[] getFieldNames()
        -
        -
        Returns:
        -
        array of field names
        -
        -
      • -
      - - - -
        -
      • -

        length

        -
        public int length()
        -
        -
        Returns:
        -
        the number of fields
        -
        -
      • -
      - - - -
        -
      • -

        get

        -
        public StructField get(String fieldName)
        -
        -
        Parameters:
        -
        fieldName - the name of the desired StructField, not null
        -
        Returns:
        -
        the link with the given name, not null
        -
        Throws:
        -
        IllegalArgumentException - if a field with the given name does not exist
        -
        -
      • -
      - - - -
        -
      • -

        column

        -
        public Column column(String fieldName)
        -
        Creates a Column expression for the field with the given fieldName.
        -
        -
        Parameters:
        -
        fieldName - the name of the StructField to create a column for
        -
        Returns:
        -
        a Column expression for the StructField with name fieldName
        -
        -
      • -
      - - - -
        -
      • -

        getTreeString

        -
        public String getTreeString()
        -
        -
        Returns:
        -
        a readable indented tree representation of this StructType - and all of its nested elements
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        isWriteCompatible

        -
        public boolean isWriteCompatible(StructType newSchema)
        -
        Whether a new schema can replace this existing schema in a Delta table without rewriting data - files in the table. -

        - Returns false if the new schema: -

          -
        • Drops any column that is present in the current schema
        • -
        • Converts nullable=true to nullable=false for any column
        • -
        • Changes any datatype
        • -
        -
        -
        Parameters:
        -
        newSchema - the new schema to update the table with
        -
        Returns:
        -
        whether the new schema is compatible with this existing schema
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html deleted file mode 100644 index 00965aade01..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -TimestampType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class TimestampType

-
-
- -
-
    -
  • -
    -
    -
    public final class TimestampType
    -extends DataType
    -
    The data type representing java.sql.Timestamp values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        TimestampType

        -
        public TimestampType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html deleted file mode 100644 index d96c3831b7a..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -io.delta.standalone.types (Delta Standalone 0.4.0 JavaDoc) - - - - - -

io.delta.standalone.types

-
-

Classes

- -
- - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html deleted file mode 100644 index c01ed25a3fe..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - -io.delta.standalone.types (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.types

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html deleted file mode 100644 index 136ebf246c2..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - -io.delta.standalone.types Class Hierarchy (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.types

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html deleted file mode 100644 index c83ba422c91..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html +++ /dev/null @@ -1,365 +0,0 @@ - - - - - -ParquetSchemaConverter.ParquetOutputTimestampType (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.util
-

Enum ParquetSchemaConverter.ParquetOutputTimestampType

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable, Comparable<ParquetSchemaConverter.ParquetOutputTimestampType>
    -
    -
    -
    Enclosing class:
    -
    ParquetSchemaConverter
    -
    -
    -
    -
    public static enum ParquetSchemaConverter.ParquetOutputTimestampType
    -extends Enum<ParquetSchemaConverter.ParquetOutputTimestampType>
    -
    :: DeveloperApi :: -

    - Represents Parquet timestamp types. -

      -
    • INT96 is a non-standard but commonly used timestamp type in Parquet.
    • -
    • TIMESTAMP_MICROS is a standard timestamp type in Parquet, which stores number of - microseconds from the Unix epoch.
    • -
    • TIMESTAMP_MILLIS is also standard, but with millisecond precision, which means the - microsecond portion of the timestamp value is truncated.
    • -
    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        values

        -
        public static ParquetSchemaConverter.ParquetOutputTimestampType[] values()
        -
        Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
        -for (ParquetSchemaConverter.ParquetOutputTimestampType c : ParquetSchemaConverter.ParquetOutputTimestampType.values())
        -    System.out.println(c);
        -
        -
        -
        Returns:
        -
        an array containing the constants of this enum type, in the order they are declared
        -
        -
      • -
      - - - -
        -
      • -

        valueOf

        -
        public static ParquetSchemaConverter.ParquetOutputTimestampType valueOf(String name)
        -
        Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.)
        -
        -
        Parameters:
        -
        name - the name of the enum constant to be returned.
        -
        Returns:
        -
        the enum constant with the specified name
        -
        Throws:
        -
        IllegalArgumentException - if this enum type has no constant with the specified name
        -
        NullPointerException - if the argument is null
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html deleted file mode 100644 index d0bb8ad3d61..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html +++ /dev/null @@ -1,417 +0,0 @@ - - - - - -ParquetSchemaConverter (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.util
-

Class ParquetSchemaConverter

-
-
- -
-
    -
  • -
    -
    -
    public final class ParquetSchemaConverter
    -extends Object
    -
    :: DeveloperApi :: -

    - Converter class to convert StructType to Parquet MessageType.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   Boolean writeLegacyParquetFormat)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        writeLegacyParquetFormat - Whether to use legacy Parquet format compatible with Spark - 1.4 and prior versions when converting a StructType to a Parquet - MessageType. When set to false, use standard format defined in parquet-format - spec.
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   ParquetSchemaConverter.ParquetOutputTimestampType outputTimestampType)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        outputTimestampType - which parquet timestamp type to use when writing
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   Boolean writeLegacyParquetFormat,
        -                                                                   ParquetSchemaConverter.ParquetOutputTimestampType outputTimestampType)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        writeLegacyParquetFormat - Whether to use legacy Parquet format compatible with Spark - 1.4 and prior versions when converting a StructType to a Parquet - MessageType. When set to false, use standard format defined in parquet-format - spec.
        -
        outputTimestampType - which parquet timestamp type to use when writing
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html deleted file mode 100644 index bd22641ef4a..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -io.delta.standalone.util (Delta Standalone 0.4.0 JavaDoc) - - - - - -

io.delta.standalone.util

-
-

Classes

- -

Enums

- -
- - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html deleted file mode 100644 index 523bc3cd857..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - -io.delta.standalone.util (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.util

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html b/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html deleted file mode 100644 index d38c95d29f4..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - -io.delta.standalone.util Class Hierarchy (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.util

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/overview-frame.html b/connectors/docs/0.4.0/delta-standalone/api/java/overview-frame.html deleted file mode 100644 index dc697715d64..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/overview-frame.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Overview List (Delta Standalone 0.4.0 JavaDoc) - - - - - -
All Classes
-
-

Packages

- -
-

 

- - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/overview-summary.html b/connectors/docs/0.4.0/delta-standalone/api/java/overview-summary.html deleted file mode 100644 index 3547f51e1cd..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/overview-summary.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - -Overview (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Packages 
PackageDescription
io.delta.standalone 
io.delta.standalone.actions 
io.delta.standalone.data 
io.delta.standalone.exceptions 
io.delta.standalone.expressions 
io.delta.standalone.storage 
io.delta.standalone.types 
io.delta.standalone.util 
-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/overview-tree.html b/connectors/docs/0.4.0/delta-standalone/api/java/overview-tree.html deleted file mode 100644 index af8fa5779f3..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/overview-tree.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - -Class Hierarchy (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For All Packages

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/package-list b/connectors/docs/0.4.0/delta-standalone/api/java/package-list deleted file mode 100644 index 14c216e7f77..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/package-list +++ /dev/null @@ -1,8 +0,0 @@ -io.delta.standalone -io.delta.standalone.actions -io.delta.standalone.data -io.delta.standalone.exceptions -io.delta.standalone.expressions -io.delta.standalone.storage -io.delta.standalone.types -io.delta.standalone.util diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/script.js b/connectors/docs/0.4.0/delta-standalone/api/java/script.js deleted file mode 100644 index b3463569314..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/script.js +++ /dev/null @@ -1,30 +0,0 @@ -function show(type) -{ - count = 0; - for (var key in methods) { - var row = document.getElementById(key); - if ((methods[key] & type) != 0) { - row.style.display = ''; - row.className = (count++ % 2) ? rowColor : altColor; - } - else - row.style.display = 'none'; - } - updateTabs(type); -} - -function updateTabs(type) -{ - for (var value in tabs) { - var sNode = document.getElementById(tabs[value][0]); - var spanNode = sNode.firstChild; - if (value == type) { - sNode.className = activeTableTab; - spanNode.innerHTML = tabs[value][1]; - } - else { - sNode.className = tableTab; - spanNode.innerHTML = "" + tabs[value][1] + ""; - } - } -} diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/serialized-form.html b/connectors/docs/0.4.0/delta-standalone/api/java/serialized-form.html deleted file mode 100644 index 7ab33097d6c..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/serialized-form.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - -Serialized Form (Delta Standalone 0.4.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Serialized Form

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.0/delta-standalone/api/java/stylesheet.css b/connectors/docs/0.4.0/delta-standalone/api/java/stylesheet.css deleted file mode 100644 index 98055b22d6d..00000000000 --- a/connectors/docs/0.4.0/delta-standalone/api/java/stylesheet.css +++ /dev/null @@ -1,574 +0,0 @@ -/* Javadoc style sheet */ -/* -Overall document style -*/ - -@import url('resources/fonts/dejavu.css'); - -body { - background-color:#ffffff; - color:#353833; - font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; - font-size:14px; - margin:0; -} -a:link, a:visited { - text-decoration:none; - color:#4A6782; -} -a:hover, a:focus { - text-decoration:none; - color:#bb7a2a; -} -a:active { - text-decoration:none; - color:#4A6782; -} -a[name] { - color:#353833; -} -a[name]:hover { - text-decoration:none; - color:#353833; -} -pre { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; -} -h1 { - font-size:20px; -} -h2 { - font-size:18px; -} -h3 { - font-size:16px; - font-style:italic; -} -h4 { - font-size:13px; -} -h5 { - font-size:12px; -} -h6 { - font-size:11px; -} -ul { - list-style-type:disc; -} -code, tt { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; - margin-top:8px; - line-height:1.4em; -} -dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; -} -table tr td dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - vertical-align:top; - padding-top:4px; -} -sup { - font-size:8px; -} -/* -Document title and Copyright styles -*/ -.clear { - clear:both; - height:0px; - overflow:hidden; -} -.aboutLanguage { - float:right; - padding:0px 21px; - font-size:11px; - z-index:200; - margin-top:-9px; -} -.legalCopy { - margin-left:.5em; -} -.bar a, .bar a:link, .bar a:visited, .bar a:active { - color:#FFFFFF; - text-decoration:none; -} -.bar a:hover, .bar a:focus { - color:#bb7a2a; -} -.tab { - background-color:#0066FF; - color:#ffffff; - padding:8px; - width:5em; - font-weight:bold; -} -/* -Navigation bar styles -*/ -.bar { - background-color:#4D7A97; - color:#FFFFFF; - padding:.8em .5em .4em .8em; - height:auto;/*height:1.8em;*/ - font-size:11px; - margin:0; -} -.topNav { - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.bottomNav { - margin-top:10px; - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.subNav { - background-color:#dee3e9; - float:left; - width:100%; - overflow:hidden; - font-size:12px; -} -.subNav div { - clear:left; - float:left; - padding:0 0 5px 6px; - text-transform:uppercase; -} -ul.navList, ul.subNavList { - float:left; - margin:0 25px 0 0; - padding:0; -} -ul.navList li{ - list-style:none; - float:left; - padding: 5px 6px; - text-transform:uppercase; -} -ul.subNavList li{ - list-style:none; - float:left; -} -.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { - color:#FFFFFF; - text-decoration:none; - text-transform:uppercase; -} -.topNav a:hover, .bottomNav a:hover { - text-decoration:none; - color:#bb7a2a; - text-transform:uppercase; -} -.navBarCell1Rev { - background-color:#F8981D; - color:#253441; - margin: auto 5px; -} -.skipNav { - position:absolute; - top:auto; - left:-9999px; - overflow:hidden; -} -/* -Page header and footer styles -*/ -.header, .footer { - clear:both; - margin:0 20px; - padding:5px 0 0 0; -} -.indexHeader { - margin:10px; - position:relative; -} -.indexHeader span{ - margin-right:15px; -} -.indexHeader h1 { - font-size:13px; -} -.title { - color:#2c4557; - margin:10px 0; -} -.subTitle { - margin:5px 0 0 0; -} -.header ul { - margin:0 0 15px 0; - padding:0; -} -.footer ul { - margin:20px 0 5px 0; -} -.header ul li, .footer ul li { - list-style:none; - font-size:13px; -} -/* -Heading styles -*/ -div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList ul.blockList li.blockList h3 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList li.blockList h3 { - padding:0; - margin:15px 0; -} -ul.blockList li.blockList h2 { - padding:0px 0 20px 0; -} -/* -Page layout container styles -*/ -.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { - clear:both; - padding:10px 20px; - position:relative; -} -.indexContainer { - margin:10px; - position:relative; - font-size:12px; -} -.indexContainer h2 { - font-size:13px; - padding:0 0 3px 0; -} -.indexContainer ul { - margin:0; - padding:0; -} -.indexContainer ul li { - list-style:none; - padding-top:2px; -} -.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { - font-size:12px; - font-weight:bold; - margin:10px 0 0 0; - color:#4E4E4E; -} -.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { - margin:5px 0 10px 0px; - font-size:14px; - font-family:'DejaVu Sans Mono',monospace; -} -.serializedFormContainer dl.nameValue dt { - margin-left:1px; - font-size:1.1em; - display:inline; - font-weight:bold; -} -.serializedFormContainer dl.nameValue dd { - margin:0 0 0 1px; - font-size:1.1em; - display:inline; -} -/* -List styles -*/ -ul.horizontal li { - display:inline; - font-size:0.9em; -} -ul.inheritance { - margin:0; - padding:0; -} -ul.inheritance li { - display:inline; - list-style:none; -} -ul.inheritance li ul.inheritance { - margin-left:15px; - padding-left:15px; - padding-top:1px; -} -ul.blockList, ul.blockListLast { - margin:10px 0 10px 0; - padding:0; -} -ul.blockList li.blockList, ul.blockListLast li.blockList { - list-style:none; - margin-bottom:15px; - line-height:1.4; -} -ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { - padding:0px 20px 5px 10px; - border:1px solid #ededed; - background-color:#f8f8f8; -} -ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { - padding:0 0 5px 8px; - background-color:#ffffff; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { - margin-left:0; - padding-left:0; - padding-bottom:15px; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { - list-style:none; - border-bottom:none; - padding-bottom:0; -} -table tr td dl, table tr td dl dt, table tr td dl dd { - margin-top:0; - margin-bottom:1px; -} -/* -Table styles -*/ -.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { - width:100%; - border-left:1px solid #EEE; - border-right:1px solid #EEE; - border-bottom:1px solid #EEE; -} -.overviewSummary, .memberSummary { - padding:0px; -} -.overviewSummary caption, .memberSummary caption, .typeSummary caption, -.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { - position:relative; - text-align:left; - background-repeat:no-repeat; - color:#253441; - font-weight:bold; - clear:none; - overflow:hidden; - padding:0px; - padding-top:10px; - padding-left:1px; - margin:0px; - white-space:pre; -} -.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, -.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, -.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, -.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, -.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, -.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, -.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, -.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { - color:#FFFFFF; -} -.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, -.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - padding-bottom:7px; - display:inline-block; - float:left; - background-color:#F8981D; - border: none; - height:16px; -} -.memberSummary caption span.activeTableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#F8981D; - height:16px; -} -.memberSummary caption span.tableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#4D7A97; - height:16px; -} -.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { - padding-top:0px; - padding-left:0px; - padding-right:0px; - background-image:none; - float:none; - display:inline; -} -.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, -.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { - display:none; - width:5px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .activeTableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .tableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - background-color:#4D7A97; - float:left; - -} -.overviewSummary td, .memberSummary td, .typeSummary td, -.useSummary td, .constantsSummary td, .deprecatedSummary td { - text-align:left; - padding:0px 0px 12px 10px; -} -th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, -td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ - vertical-align:top; - padding-right:0px; - padding-top:8px; - padding-bottom:3px; -} -th.colFirst, th.colLast, th.colOne, .constantsSummary th { - background:#dee3e9; - text-align:left; - padding:8px 3px 3px 7px; -} -td.colFirst, th.colFirst { - white-space:nowrap; - font-size:13px; -} -td.colLast, th.colLast { - font-size:13px; -} -td.colOne, th.colOne { - font-size:13px; -} -.overviewSummary td.colFirst, .overviewSummary th.colFirst, -.useSummary td.colFirst, .useSummary th.colFirst, -.overviewSummary td.colOne, .overviewSummary th.colOne, -.memberSummary td.colFirst, .memberSummary th.colFirst, -.memberSummary td.colOne, .memberSummary th.colOne, -.typeSummary td.colFirst{ - width:25%; - vertical-align:top; -} -td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { - font-weight:bold; -} -.tableSubHeadingColor { - background-color:#EEEEFF; -} -.altColor { - background-color:#FFFFFF; -} -.rowColor { - background-color:#EEEEEF; -} -/* -Content styles -*/ -.description pre { - margin-top:0; -} -.deprecatedContent { - margin:0; - padding:10px 0; -} -.docSummary { - padding:0; -} - -ul.blockList ul.blockList ul.blockList li.blockList h3 { - font-style:normal; -} - -div.block { - font-size:14px; - font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; -} - -td.colLast div { - padding-top:0px; -} - - -td.colLast a { - padding-bottom:3px; -} -/* -Formatting effect styles -*/ -.sourceLineNo { - color:green; - padding:0 30px 0 0; -} -h1.hidden { - visibility:hidden; - overflow:hidden; - font-size:10px; -} -.block { - display:block; - margin:3px 10px 2px 0px; - color:#474747; -} -.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, -.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, -.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { - font-weight:bold; -} -.deprecationComment, .emphasizedPhrase, .interfaceName { - font-style:italic; -} - -div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, -div.block div.block span.interfaceName { - font-style:normal; -} - -div.contentContainer ul.blockList li.blockList h2{ - padding-bottom:0px; -} diff --git a/connectors/docs/0.4.1/delta-flink/api/java/allclasses-frame.html b/connectors/docs/0.4.1/delta-flink/api/java/allclasses-frame.html deleted file mode 100644 index 9ad986f60fc..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/allclasses-frame.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - -All Classes (Flink/Delta Connector 0.4.1 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.4.1/delta-flink/api/java/allclasses-noframe.html b/connectors/docs/0.4.1/delta-flink/api/java/allclasses-noframe.html deleted file mode 100644 index 9f20751d02d..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/allclasses-noframe.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - -All Classes (Flink/Delta Connector 0.4.1 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.4.1/delta-flink/api/java/constant-values.html b/connectors/docs/0.4.1/delta-flink/api/java/constant-values.html deleted file mode 100644 index 9cf6b7ee279..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/constant-values.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - -Constant Field Values (Flink/Delta Connector 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Constant Field Values

-

Contents

-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-flink/api/java/deprecated-list.html b/connectors/docs/0.4.1/delta-flink/api/java/deprecated-list.html deleted file mode 100644 index d0f02535069..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/deprecated-list.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - -Deprecated List (Flink/Delta Connector 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Deprecated API

-

Contents

-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-flink/api/java/help-doc.html b/connectors/docs/0.4.1/delta-flink/api/java/help-doc.html deleted file mode 100644 index e0ab0ea76e9..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/help-doc.html +++ /dev/null @@ -1,217 +0,0 @@ - - - - - -API Help (Flink/Delta Connector 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

How This API Document Is Organized

-
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
-
-
- -This help file applies to API documentation generated using the standard doclet.
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-flink/api/java/index-all.html b/connectors/docs/0.4.1/delta-flink/api/java/index-all.html deleted file mode 100644 index 244124382c8..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/index-all.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - -Index (Flink/Delta Connector 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
B D F I R W  - - -

B

-
-
build() - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Creates the actual sink.
-
-
- - - -

D

-
-
DeltaSink<IN> - Class in io.delta.flink.sink
-
-
A unified sink that emits its input elements to file system files within buckets using - Parquet format and commits those files to the DeltaLog.
-
-
- - - -

F

-
-
forRowData(Path, Configuration, RowType) - Static method in class io.delta.flink.sink.DeltaSink
-
-
Convenience method for creating a RowDataDeltaSinkBuilder for DeltaSink to a - DeltaLake's table.
-
-
- - - -

I

-
-
io.delta.flink.sink - package io.delta.flink.sink
-
 
-
- - - -

R

-
-
RowDataDeltaSinkBuilder - Class in io.delta.flink.sink
-
-
A builder class for DeltaSink for a stream of RowData.
-
-
RowDataDeltaSinkBuilder(Path, Configuration, RowType, boolean) - Constructor for class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Creates instance of the builder for DeltaSink.
-
-
- - - -

W

-
-
withMergeSchema(boolean) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets the sink's option whether in case of any differences between stream's schema and Delta - table's schema we should try to update it during commit to the - DeltaLog.
-
-
withPartitionColumns(String...) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets list of partition fields that will be extracted of incoming RowData events.
-
-
-B D F I R W 
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-flink/api/java/index.html b/connectors/docs/0.4.1/delta-flink/api/java/index.html deleted file mode 100644 index 881010c7498..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/index.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - -Flink/Delta Connector 0.4.1 JavaDoc - - - - - - -<noscript> -<div>JavaScript is disabled on your browser.</div> -</noscript> -<h2>Frame Alert</h2> -<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="io/delta/flink/sink/package-summary.html">Non-frame version</a>.</p> - - - diff --git a/connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html b/connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html deleted file mode 100644 index a6f3640e873..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html +++ /dev/null @@ -1,307 +0,0 @@ - - - - - -DeltaSink (Flink/Delta Connector 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.sink
-

Class DeltaSink<IN>

-
-
- -
-
    -
  • -
    -
    Type Parameters:
    -
    IN - Type of the elements in the input of the sink that are also the elements to be - written to its output
    -
    -
    -
    -
    public class DeltaSink<IN>
    -extends <any>
    -
    A unified sink that emits its input elements to file system files within buckets using - Parquet format and commits those files to the DeltaLog. This sink achieves exactly-once - semantics for both BATCH and STREAMING. -

    - For most use cases users should use forRowData(org.apache.flink.core.fs.Path, org.apache.hadoop.conf.Configuration, org.apache.flink.table.types.logical.RowType) utility method to instantiate - the sink which provides proper writer factory implementation for the stream of RowData. -

    - To create new instance of the sink to a non-partitioned Delta table for stream of - RowData: -

    -     DataStream<RowData> stream = ...;
    -     RowType rowType = ...;
    -     ...
    -
    -     // sets a sink to a non-partitioned Delta table
    -     DeltaSink<RowData> deltaSink = DeltaSink.forRowData(
    -             new Path(deltaTablePath),
    -             new Configuration(),
    -             rowType).build();
    -     stream.sinkTo(deltaSink);
    - 
    - - To create new instance of the sink to a partitioned Delta table for stream of RowData: -
    -     String[] partitionCols = ...; // array of partition columns' names
    -
    -     DeltaSink<RowData> deltaSink = DeltaSink.forRowData(
    -             new Path(deltaTablePath),
    -             new Configuration(),
    -             rowType)
    -         .withPartitionColumns(partitionCols)
    -         .build();
    -     stream.sinkTo(deltaSink);
    - 
    -

    - Behaviour of this sink splits down upon two phases. The first phase takes place between - application's checkpoints when records are being flushed to files (or appended to writers' - buffers) where the behaviour is almost identical as in case of - FileSink. - Next during the checkpoint phase files are "closed" (renamed) by the independent instances of - io.delta.flink.sink.internal.committer.DeltaCommitter that behave very similar - to FileCommitter. - When all the parallel committers are done, then all the files are committed at once by - single-parallelism io.delta.flink.sink.internal.committer.DeltaGlobalCommitter. -

    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - -
      All Methods Static Methods Concrete Methods 
      Modifier and TypeMethod and Description
      static RowDataDeltaSinkBuilderforRowData(org.apache.flink.core.fs.Path basePath, - org.apache.hadoop.conf.Configuration conf, - org.apache.flink.table.types.logical.RowType rowType) -
      Convenience method for creating a RowDataDeltaSinkBuilder for DeltaSink to a - DeltaLake's table.
      -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        forRowData

        -
        public static RowDataDeltaSinkBuilder forRowData(org.apache.flink.core.fs.Path basePath,
        -                                                 org.apache.hadoop.conf.Configuration conf,
        -                                                 org.apache.flink.table.types.logical.RowType rowType)
        -
        Convenience method for creating a RowDataDeltaSinkBuilder for DeltaSink to a - DeltaLake's table.
        -
        -
        Parameters:
        -
        basePath - root path of the DeltaLake's table
        -
        conf - Hadoop's conf object that will be used for creating instances of - DeltaLog and will be also passed to the - ParquetRowDataBuilder to create ParquetWriterFactory
        -
        rowType - Flink's logical type to indicate the structure of the events in the stream
        -
        Returns:
        -
        builder for the DeltaSink
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html b/connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html deleted file mode 100644 index 48790dc3f13..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html +++ /dev/null @@ -1,358 +0,0 @@ - - - - - -RowDataDeltaSinkBuilder (Flink/Delta Connector 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.sink
-

Class RowDataDeltaSinkBuilder

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      RowDataDeltaSinkBuilder(org.apache.flink.core.fs.Path tableBasePath, - org.apache.hadoop.conf.Configuration conf, - org.apache.flink.table.types.logical.RowType rowType, - boolean mergeSchema) -
      Creates instance of the builder for DeltaSink.
      -
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      DeltaSink<org.apache.flink.table.data.RowData>build() -
      Creates the actual sink.
      -
      RowDataDeltaSinkBuilderwithMergeSchema(boolean mergeSchema) -
      Sets the sink's option whether in case of any differences between stream's schema and Delta - table's schema we should try to update it during commit to the - DeltaLog.
      -
      RowDataDeltaSinkBuilderwithPartitionColumns(String... partitionColumns) -
      Sets list of partition fields that will be extracted of incoming RowData events.
      -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        RowDataDeltaSinkBuilder

        -
        public RowDataDeltaSinkBuilder(org.apache.flink.core.fs.Path tableBasePath,
        -                               org.apache.hadoop.conf.Configuration conf,
        -                               org.apache.flink.table.types.logical.RowType rowType,
        -                               boolean mergeSchema)
        -
        Creates instance of the builder for DeltaSink.
        -
        -
        Parameters:
        -
        tableBasePath - path to a Delta table
        -
        conf - Hadoop's conf object
        -
        rowType - Flink's logical type to indicate the structure of the events in - the stream
        -
        mergeSchema - indicator whether we should try to update table's schema with - stream's schema in case those will not match. The update is not - guaranteed as there will be still some checks performed whether - the updates to the schema are compatible.
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        withMergeSchema

        -
        public RowDataDeltaSinkBuilder withMergeSchema(boolean mergeSchema)
        -
        Sets the sink's option whether in case of any differences between stream's schema and Delta - table's schema we should try to update it during commit to the - DeltaLog. The update is not guaranteed as there will be some - compatibility checks performed.
        -
        -
        Parameters:
        -
        mergeSchema - indicator whether we should try to update table's schema with stream's - schema in case those will not match. The update is not guaranteed as there - will be still some checks performed whether the updates to the schema are - compatible.
        -
        Returns:
        -
        builder for DeltaSink
        -
        -
      • -
      - - - -
        -
      • -

        withPartitionColumns

        -
        public RowDataDeltaSinkBuilder withPartitionColumns(String... partitionColumns)
        -
        Sets list of partition fields that will be extracted of incoming RowData events. -

        - Provided fields' names must correspond to the names provided in the RowType object - for this sink and must be in the same order as expected order of occurrence in the partition - path that will be generated.

        -
        -
        Parameters:
        -
        partitionColumns - array of partition columns' names in the order they should be applied - when creating destination path.
        -
        Returns:
        -
        builder for DeltaSink
        -
        -
      • -
      - - - -
        -
      • -

        build

        -
        public DeltaSink<org.apache.flink.table.data.RowData> build()
        -
        Creates the actual sink.
        -
        -
        Returns:
        -
        constructed DeltaSink object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/package-frame.html b/connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/package-frame.html deleted file mode 100644 index 804c858949e..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -io.delta.flink.sink (Flink/Delta Connector 0.4.1 JavaDoc) - - - - - -

io.delta.flink.sink

-
-

Classes

- -
- - diff --git a/connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/package-summary.html b/connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/package-summary.html deleted file mode 100644 index 92f568ca256..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/package-summary.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - -io.delta.flink.sink (Flink/Delta Connector 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.flink.sink

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/package-tree.html b/connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/package-tree.html deleted file mode 100644 index f301470618f..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/io/delta/flink/sink/package-tree.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - -io.delta.flink.sink Class Hierarchy (Flink/Delta Connector 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.flink.sink

-
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-flink/api/java/overview-tree.html b/connectors/docs/0.4.1/delta-flink/api/java/overview-tree.html deleted file mode 100644 index 0cf19358ea3..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/overview-tree.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - -Class Hierarchy (Flink/Delta Connector 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For All Packages

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-flink/api/java/package-list b/connectors/docs/0.4.1/delta-flink/api/java/package-list deleted file mode 100644 index 5aa882fee5c..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/package-list +++ /dev/null @@ -1 +0,0 @@ -io.delta.flink.sink diff --git a/connectors/docs/0.4.1/delta-flink/api/java/script.js b/connectors/docs/0.4.1/delta-flink/api/java/script.js deleted file mode 100644 index b3463569314..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/script.js +++ /dev/null @@ -1,30 +0,0 @@ -function show(type) -{ - count = 0; - for (var key in methods) { - var row = document.getElementById(key); - if ((methods[key] & type) != 0) { - row.style.display = ''; - row.className = (count++ % 2) ? rowColor : altColor; - } - else - row.style.display = 'none'; - } - updateTabs(type); -} - -function updateTabs(type) -{ - for (var value in tabs) { - var sNode = document.getElementById(tabs[value][0]); - var spanNode = sNode.firstChild; - if (value == type) { - sNode.className = activeTableTab; - spanNode.innerHTML = tabs[value][1]; - } - else { - sNode.className = tableTab; - spanNode.innerHTML = "" + tabs[value][1] + ""; - } - } -} diff --git a/connectors/docs/0.4.1/delta-flink/api/java/stylesheet.css b/connectors/docs/0.4.1/delta-flink/api/java/stylesheet.css deleted file mode 100644 index 98055b22d6d..00000000000 --- a/connectors/docs/0.4.1/delta-flink/api/java/stylesheet.css +++ /dev/null @@ -1,574 +0,0 @@ -/* Javadoc style sheet */ -/* -Overall document style -*/ - -@import url('resources/fonts/dejavu.css'); - -body { - background-color:#ffffff; - color:#353833; - font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; - font-size:14px; - margin:0; -} -a:link, a:visited { - text-decoration:none; - color:#4A6782; -} -a:hover, a:focus { - text-decoration:none; - color:#bb7a2a; -} -a:active { - text-decoration:none; - color:#4A6782; -} -a[name] { - color:#353833; -} -a[name]:hover { - text-decoration:none; - color:#353833; -} -pre { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; -} -h1 { - font-size:20px; -} -h2 { - font-size:18px; -} -h3 { - font-size:16px; - font-style:italic; -} -h4 { - font-size:13px; -} -h5 { - font-size:12px; -} -h6 { - font-size:11px; -} -ul { - list-style-type:disc; -} -code, tt { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; - margin-top:8px; - line-height:1.4em; -} -dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; -} -table tr td dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - vertical-align:top; - padding-top:4px; -} -sup { - font-size:8px; -} -/* -Document title and Copyright styles -*/ -.clear { - clear:both; - height:0px; - overflow:hidden; -} -.aboutLanguage { - float:right; - padding:0px 21px; - font-size:11px; - z-index:200; - margin-top:-9px; -} -.legalCopy { - margin-left:.5em; -} -.bar a, .bar a:link, .bar a:visited, .bar a:active { - color:#FFFFFF; - text-decoration:none; -} -.bar a:hover, .bar a:focus { - color:#bb7a2a; -} -.tab { - background-color:#0066FF; - color:#ffffff; - padding:8px; - width:5em; - font-weight:bold; -} -/* -Navigation bar styles -*/ -.bar { - background-color:#4D7A97; - color:#FFFFFF; - padding:.8em .5em .4em .8em; - height:auto;/*height:1.8em;*/ - font-size:11px; - margin:0; -} -.topNav { - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.bottomNav { - margin-top:10px; - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.subNav { - background-color:#dee3e9; - float:left; - width:100%; - overflow:hidden; - font-size:12px; -} -.subNav div { - clear:left; - float:left; - padding:0 0 5px 6px; - text-transform:uppercase; -} -ul.navList, ul.subNavList { - float:left; - margin:0 25px 0 0; - padding:0; -} -ul.navList li{ - list-style:none; - float:left; - padding: 5px 6px; - text-transform:uppercase; -} -ul.subNavList li{ - list-style:none; - float:left; -} -.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { - color:#FFFFFF; - text-decoration:none; - text-transform:uppercase; -} -.topNav a:hover, .bottomNav a:hover { - text-decoration:none; - color:#bb7a2a; - text-transform:uppercase; -} -.navBarCell1Rev { - background-color:#F8981D; - color:#253441; - margin: auto 5px; -} -.skipNav { - position:absolute; - top:auto; - left:-9999px; - overflow:hidden; -} -/* -Page header and footer styles -*/ -.header, .footer { - clear:both; - margin:0 20px; - padding:5px 0 0 0; -} -.indexHeader { - margin:10px; - position:relative; -} -.indexHeader span{ - margin-right:15px; -} -.indexHeader h1 { - font-size:13px; -} -.title { - color:#2c4557; - margin:10px 0; -} -.subTitle { - margin:5px 0 0 0; -} -.header ul { - margin:0 0 15px 0; - padding:0; -} -.footer ul { - margin:20px 0 5px 0; -} -.header ul li, .footer ul li { - list-style:none; - font-size:13px; -} -/* -Heading styles -*/ -div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList ul.blockList li.blockList h3 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList li.blockList h3 { - padding:0; - margin:15px 0; -} -ul.blockList li.blockList h2 { - padding:0px 0 20px 0; -} -/* -Page layout container styles -*/ -.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { - clear:both; - padding:10px 20px; - position:relative; -} -.indexContainer { - margin:10px; - position:relative; - font-size:12px; -} -.indexContainer h2 { - font-size:13px; - padding:0 0 3px 0; -} -.indexContainer ul { - margin:0; - padding:0; -} -.indexContainer ul li { - list-style:none; - padding-top:2px; -} -.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { - font-size:12px; - font-weight:bold; - margin:10px 0 0 0; - color:#4E4E4E; -} -.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { - margin:5px 0 10px 0px; - font-size:14px; - font-family:'DejaVu Sans Mono',monospace; -} -.serializedFormContainer dl.nameValue dt { - margin-left:1px; - font-size:1.1em; - display:inline; - font-weight:bold; -} -.serializedFormContainer dl.nameValue dd { - margin:0 0 0 1px; - font-size:1.1em; - display:inline; -} -/* -List styles -*/ -ul.horizontal li { - display:inline; - font-size:0.9em; -} -ul.inheritance { - margin:0; - padding:0; -} -ul.inheritance li { - display:inline; - list-style:none; -} -ul.inheritance li ul.inheritance { - margin-left:15px; - padding-left:15px; - padding-top:1px; -} -ul.blockList, ul.blockListLast { - margin:10px 0 10px 0; - padding:0; -} -ul.blockList li.blockList, ul.blockListLast li.blockList { - list-style:none; - margin-bottom:15px; - line-height:1.4; -} -ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { - padding:0px 20px 5px 10px; - border:1px solid #ededed; - background-color:#f8f8f8; -} -ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { - padding:0 0 5px 8px; - background-color:#ffffff; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { - margin-left:0; - padding-left:0; - padding-bottom:15px; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { - list-style:none; - border-bottom:none; - padding-bottom:0; -} -table tr td dl, table tr td dl dt, table tr td dl dd { - margin-top:0; - margin-bottom:1px; -} -/* -Table styles -*/ -.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { - width:100%; - border-left:1px solid #EEE; - border-right:1px solid #EEE; - border-bottom:1px solid #EEE; -} -.overviewSummary, .memberSummary { - padding:0px; -} -.overviewSummary caption, .memberSummary caption, .typeSummary caption, -.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { - position:relative; - text-align:left; - background-repeat:no-repeat; - color:#253441; - font-weight:bold; - clear:none; - overflow:hidden; - padding:0px; - padding-top:10px; - padding-left:1px; - margin:0px; - white-space:pre; -} -.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, -.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, -.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, -.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, -.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, -.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, -.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, -.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { - color:#FFFFFF; -} -.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, -.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - padding-bottom:7px; - display:inline-block; - float:left; - background-color:#F8981D; - border: none; - height:16px; -} -.memberSummary caption span.activeTableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#F8981D; - height:16px; -} -.memberSummary caption span.tableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#4D7A97; - height:16px; -} -.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { - padding-top:0px; - padding-left:0px; - padding-right:0px; - background-image:none; - float:none; - display:inline; -} -.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, -.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { - display:none; - width:5px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .activeTableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .tableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - background-color:#4D7A97; - float:left; - -} -.overviewSummary td, .memberSummary td, .typeSummary td, -.useSummary td, .constantsSummary td, .deprecatedSummary td { - text-align:left; - padding:0px 0px 12px 10px; -} -th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, -td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ - vertical-align:top; - padding-right:0px; - padding-top:8px; - padding-bottom:3px; -} -th.colFirst, th.colLast, th.colOne, .constantsSummary th { - background:#dee3e9; - text-align:left; - padding:8px 3px 3px 7px; -} -td.colFirst, th.colFirst { - white-space:nowrap; - font-size:13px; -} -td.colLast, th.colLast { - font-size:13px; -} -td.colOne, th.colOne { - font-size:13px; -} -.overviewSummary td.colFirst, .overviewSummary th.colFirst, -.useSummary td.colFirst, .useSummary th.colFirst, -.overviewSummary td.colOne, .overviewSummary th.colOne, -.memberSummary td.colFirst, .memberSummary th.colFirst, -.memberSummary td.colOne, .memberSummary th.colOne, -.typeSummary td.colFirst{ - width:25%; - vertical-align:top; -} -td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { - font-weight:bold; -} -.tableSubHeadingColor { - background-color:#EEEEFF; -} -.altColor { - background-color:#FFFFFF; -} -.rowColor { - background-color:#EEEEEF; -} -/* -Content styles -*/ -.description pre { - margin-top:0; -} -.deprecatedContent { - margin:0; - padding:10px 0; -} -.docSummary { - padding:0; -} - -ul.blockList ul.blockList ul.blockList li.blockList h3 { - font-style:normal; -} - -div.block { - font-size:14px; - font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; -} - -td.colLast div { - padding-top:0px; -} - - -td.colLast a { - padding-bottom:3px; -} -/* -Formatting effect styles -*/ -.sourceLineNo { - color:green; - padding:0 30px 0 0; -} -h1.hidden { - visibility:hidden; - overflow:hidden; - font-size:10px; -} -.block { - display:block; - margin:3px 10px 2px 0px; - color:#474747; -} -.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, -.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, -.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { - font-weight:bold; -} -.deprecationComment, .emphasizedPhrase, .interfaceName { - font-style:italic; -} - -div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, -div.block div.block span.interfaceName { - font-style:normal; -} - -div.contentContainer ul.blockList li.blockList h2{ - padding-bottom:0px; -} diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/allclasses-frame.html b/connectors/docs/0.4.1/delta-standalone/api/java/allclasses-frame.html deleted file mode 100644 index e716bf85017..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/allclasses-frame.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - -All Classes (Delta Standalone 0.4.1 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/allclasses-noframe.html b/connectors/docs/0.4.1/delta-standalone/api/java/allclasses-noframe.html deleted file mode 100644 index a296c9194a6..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/allclasses-noframe.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - -All Classes (Delta Standalone 0.4.1 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/constant-values.html b/connectors/docs/0.4.1/delta-standalone/api/java/constant-values.html deleted file mode 100644 index 72de2d2c5f4..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/constant-values.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - -Constant Field Values (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Constant Field Values

-

Contents

- -
-
- - -

io.delta.*

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/deprecated-list.html b/connectors/docs/0.4.1/delta-standalone/api/java/deprecated-list.html deleted file mode 100644 index aec3bece2de..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/deprecated-list.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - -Deprecated List (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Deprecated API

-

Contents

- -
-
- - - -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/help-doc.html b/connectors/docs/0.4.1/delta-standalone/api/java/help-doc.html deleted file mode 100644 index 7d53d2ac462..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/help-doc.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - -API Help (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

How This API Document Is Organized

-
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
-
-
- -This help file applies to API documentation generated using the standard doclet.
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/index-all.html b/connectors/docs/0.4.1/delta-standalone/api/java/index-all.html deleted file mode 100644 index 00b2105eba3..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/index-all.html +++ /dev/null @@ -1,1531 +0,0 @@ - - - - - -Index (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
A B C D E F G H I J L M N O P R S T U V W  - - -

A

-
-
Action - Interface in io.delta.standalone.actions
-
-
A marker interface for all actions that can be applied to a Delta table.
-
-
add(StructField) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new field.
-
-
add(String, DataType) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new nullable field with no metadata.
-
-
add(String, DataType, boolean) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new field with no metadata.
-
-
AddCDCFile - Class in io.delta.standalone.actions
-
-
A change file containing CDC data for the Delta version it's within.
-
-
AddCDCFile(String, Map<String, String>, long, Map<String, String>) - Constructor for class io.delta.standalone.actions.AddCDCFile
-
 
-
AddFile - Class in io.delta.standalone.actions
-
-
Represents an action that adds a new file to the table.
-
-
AddFile(String, Map<String, String>, long, long, boolean, String, Map<String, String>) - Constructor for class io.delta.standalone.actions.AddFile
-
 
-
AddFile.Builder - Class in io.delta.standalone.actions
-
-
Builder class for AddFile.
-
-
And - Class in io.delta.standalone.expressions
-
-
Evaluates logical expr1 AND expr2 for new And(expr1, expr2).
-
-
And(Expression, Expression) - Constructor for class io.delta.standalone.expressions.And
-
 
-
ArrayType - Class in io.delta.standalone.types
-
-
The data type for collections of multiple values.
-
-
ArrayType(DataType, boolean) - Constructor for class io.delta.standalone.types.ArrayType
-
 
-
- - - -

B

-
-
BinaryComparison - Class in io.delta.standalone.expressions
-
-
A BinaryOperator that compares the left and right Expressions and evaluates to a - boolean value.
-
-
BinaryExpression - Class in io.delta.standalone.expressions
-
-
An Expression with two inputs and one output.
-
-
BinaryOperator - Class in io.delta.standalone.expressions
-
-
A BinaryExpression that is an operator, meaning the string representation is - x symbol y, rather than funcName(x, y).
-
-
BinaryType - Class in io.delta.standalone.types
-
-
The data type representing byte[] values.
-
-
BinaryType() - Constructor for class io.delta.standalone.types.BinaryType
-
 
-
BooleanType - Class in io.delta.standalone.types
-
-
The data type representing boolean values.
-
-
BooleanType() - Constructor for class io.delta.standalone.types.BooleanType
-
 
-
build() - Method in class io.delta.standalone.actions.AddFile.Builder
-
-
Builds an AddFile using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
-
Builds a CommitInfo using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.JobInfo.Builder
-
-
Builds a JobInfo using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.Metadata.Builder
-
-
Builds a Metadata using the provided parameters.
-
-
build() - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
builder(String, Map<String, String>, long, long, boolean) - Static method in class io.delta.standalone.actions.AddFile
-
 
-
Builder(String, Map<String, String>, long, long, boolean) - Constructor for class io.delta.standalone.actions.AddFile.Builder
-
 
-
builder() - Static method in class io.delta.standalone.actions.CommitInfo
-
 
-
Builder() - Constructor for class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
builder(String) - Static method in class io.delta.standalone.actions.JobInfo
-
 
-
Builder(String) - Constructor for class io.delta.standalone.actions.JobInfo.Builder
-
 
-
builder() - Static method in class io.delta.standalone.actions.Metadata
-
 
-
Builder() - Constructor for class io.delta.standalone.actions.Metadata.Builder
-
 
-
builder() - Static method in class io.delta.standalone.types.FieldMetadata
-
 
-
Builder() - Constructor for class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
ByteType - Class in io.delta.standalone.types
-
-
The data type representing byte values.
-
-
ByteType() - Constructor for class io.delta.standalone.types.ByteType
-
 
-
- - - -

C

-
-
children() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
children() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
children() - Method in class io.delta.standalone.expressions.In
-
 
-
children() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
children() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
CloseableIterator<T> - Interface in io.delta.standalone.data
-
-
An Iterator that also implements the Closeable interface.
-
-
clusterId(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
Column - Class in io.delta.standalone.expressions
-
-
A column whose row-value will be computed based on the data in a RowRecord.
-
-
Column(String, DataType) - Constructor for class io.delta.standalone.expressions.Column
-
 
-
column(String) - Method in class io.delta.standalone.types.StructType
-
-
Creates a Column expression for the field with the given fieldName.
-
-
commit(Iterable<T>, Operation, String) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Modifies the state of the log by adding a new commit that is based on a read at the table's - latest version as of this transaction's instantiation.
-
-
CommitInfo - Class in io.delta.standalone.actions
-
-
Holds provenance information about changes to the table.
-
-
CommitInfo(Optional<Long>, Timestamp, Optional<String>, Optional<String>, String, Map<String, String>, Optional<JobInfo>, Optional<NotebookInfo>, Optional<String>, Optional<Long>, Optional<String>, Optional<Boolean>, Optional<Map<String, String>>, Optional<String>) - Constructor for class io.delta.standalone.actions.CommitInfo
-
 
-
CommitInfo(Optional<Long>, Timestamp, Optional<String>, Optional<String>, String, Map<String, String>, Optional<JobInfo>, Optional<NotebookInfo>, Optional<String>, Optional<Long>, Optional<String>, Optional<Boolean>, Optional<Map<String, String>>, Optional<String>, Optional<String>) - Constructor for class io.delta.standalone.actions.CommitInfo
-
 
-
CommitInfo.Builder - Class in io.delta.standalone.actions
-
-
Builder class for CommitInfo.
-
-
CommitResult - Class in io.delta.standalone
-
- -
-
CommitResult(long) - Constructor for class io.delta.standalone.CommitResult
-
 
-
ConcurrentAppendException - Exception in io.delta.standalone.exceptions
-
-
Thrown when files are added that would have been read by the current transaction.
-
-
ConcurrentAppendException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentAppendException
-
 
-
ConcurrentDeleteDeleteException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the current transaction deletes data that was deleted by a concurrent transaction.
-
-
ConcurrentDeleteDeleteException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentDeleteDeleteException
-
 
-
ConcurrentDeleteReadException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the current transaction reads data that was deleted by a concurrent transaction.
-
-
ConcurrentDeleteReadException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentDeleteReadException
-
 
-
ConcurrentTransactionException - Exception in io.delta.standalone.exceptions
-
-
Thrown when concurrent transaction both attempt to update the same idempotent transaction.
-
-
ConcurrentTransactionException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentTransactionException
-
 
-
configuration(Map<String, String>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
contains(String) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
containsNull() - Method in class io.delta.standalone.types.ArrayType
-
 
-
copyBuilder() - Method in class io.delta.standalone.actions.Metadata
-
 
-
createdTime(Long) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
createdTime(Optional<Long>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
- - - -

D

-
-
dataType() - Method in class io.delta.standalone.expressions.Column
-
 
-
dataType() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
dataType() - Method in class io.delta.standalone.expressions.Literal
-
 
-
dataType() - Method in interface io.delta.standalone.expressions.Predicate
-
 
-
DataType - Class in io.delta.standalone.types
-
-
The base type of all io.delta.standalone data types.
-
-
DataType() - Constructor for class io.delta.standalone.types.DataType
-
 
-
DateType - Class in io.delta.standalone.types
-
-
A date type, supporting "0001-01-01" through "9999-12-31".
-
-
DateType() - Constructor for class io.delta.standalone.types.DateType
-
 
-
DecimalType - Class in io.delta.standalone.types
-
-
The data type representing java.math.BigDecimal values.
-
-
DecimalType(int, int) - Constructor for class io.delta.standalone.types.DecimalType
-
 
-
DeltaConcurrentModificationException - Exception in io.delta.standalone.exceptions
-
-
The basic class for all Delta Standalone commit conflict exceptions.
-
-
DeltaConcurrentModificationException(String) - Constructor for exception io.delta.standalone.exceptions.DeltaConcurrentModificationException
-
 
-
DeltaLog - Interface in io.delta.standalone
-
-
Represents the transaction logs of a Delta table.
-
-
DeltaScan - Interface in io.delta.standalone
-
-
Provides access to an iterator over the files in this snapshot.
-
-
DeltaStandaloneException - Exception in io.delta.standalone.exceptions
-
-
Thrown when a query fails, usually because the query itself is invalid.
-
-
DeltaStandaloneException() - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
DeltaStandaloneException(String) - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
DeltaStandaloneException(String, Throwable) - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
deltaToParquet(StructType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, Boolean) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, ParquetSchemaConverter.ParquetOutputTimestampType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, Boolean, ParquetSchemaConverter.ParquetOutputTimestampType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
description(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
DoubleType - Class in io.delta.standalone.types
-
-
The data type representing double values.
-
-
DoubleType() - Constructor for class io.delta.standalone.types.DoubleType
-
 
-
- - - -

E

-
-
engineInfo(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.AddFile
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Format
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.JobInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Metadata
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Protocol
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.Column
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.Literal
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.types.ArrayType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.DataType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.DecimalType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
equals(Object) - Method in class io.delta.standalone.types.MapType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.StructField
-
 
-
equals(Object) - Method in class io.delta.standalone.types.StructType
-
 
-
EqualTo - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 = expr2 for new EqualTo(expr1, expr2).
-
-
EqualTo(Expression, Expression) - Constructor for class io.delta.standalone.expressions.EqualTo
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.Column
-
 
-
eval(RowRecord) - Method in interface io.delta.standalone.expressions.Expression
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.In
-
-
This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide.
-
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.IsNotNull
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.IsNull
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.Literal
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
executionTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to execute the entire operation.
-
-
Expression - Interface in io.delta.standalone.expressions
-
-
An expression in Delta Standalone.
-
-
- - - -

F

-
-
False - Static variable in class io.delta.standalone.expressions.Literal
-
 
-
FieldMetadata - Class in io.delta.standalone.types
-
-
The metadata for a given StructField.
-
-
FieldMetadata.Builder - Class in io.delta.standalone.types
-
-
Builder class for FieldMetadata.
-
-
FileAction - Interface in io.delta.standalone.actions
-
-
Generic interface for Actions pertaining to the addition and removal of files.
-
-
FloatType - Class in io.delta.standalone.types
-
-
The data type representing float values.
-
-
FloatType() - Constructor for class io.delta.standalone.types.FloatType
-
 
-
Format - Class in io.delta.standalone.actions
-
-
A specification of the encoding for the files stored in a table.
-
-
Format(String, Map<String, String>) - Constructor for class io.delta.standalone.actions.Format
-
 
-
Format() - Constructor for class io.delta.standalone.actions.Format
-
 
-
format(Format) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
forTable(Configuration, String) - Static method in interface io.delta.standalone.DeltaLog
-
-
Create a DeltaLog instance representing the table located at the provided - path.
-
-
forTable(Configuration, Path) - Static method in interface io.delta.standalone.DeltaLog
-
-
Create a DeltaLog instance representing the table located at the provided - path.
-
-
- - - -

G

-
-
get(String) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
get(String) - Method in class io.delta.standalone.types.StructType
-
 
-
getActions() - Method in class io.delta.standalone.VersionLog
-
 
-
getAllFiles() - Method in interface io.delta.standalone.Snapshot
-
 
-
getAppId() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getBigDecimal(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.math.BigDecimal.
-
-
getBinary(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as binary (byte array).
-
-
getBoolean(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive boolean.
-
-
getByte(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive byte.
-
-
getCatalogString() - Method in class io.delta.standalone.types.DataType
-
 
-
getChanges(long, boolean) - Method in interface io.delta.standalone.DeltaLog
-
-
Get all actions starting from startVersion (inclusive) in increasing order of - committed version.
-
-
getChild() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
getClusterId() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getCommitInfoAt(long) - Method in interface io.delta.standalone.DeltaLog
-
 
-
getConfiguration() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getCreatedTime() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getDataType() - Method in class io.delta.standalone.types.StructField
-
 
-
getDate(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.sql.Date.
-
-
getDeletionTimestamp() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getDescription() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getDouble(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive double.
-
-
getElementType() - Method in class io.delta.standalone.types.ArrayType
-
 
-
getEngineInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getEntries() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
getFieldNames() - Method in class io.delta.standalone.types.StructType
-
 
-
getFields() - Method in class io.delta.standalone.types.StructType
-
 
-
getFiles() - Method in interface io.delta.standalone.DeltaScan
-
-
Creates a CloseableIterator over files belonging to this snapshot.
-
-
getFloat(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive float.
-
-
getFormat() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getId() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getInputPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getInt(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive int.
-
-
getIsBlindAppend() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getIsolationLevel() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getJobId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getJobInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getJobName() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getJobOwnerId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getKeyType() - Method in class io.delta.standalone.types.MapType
-
 
-
getLastUpdated() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getLeft() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
getLength() - Method in interface io.delta.standalone.data.RowRecord
-
 
-
getList(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.util.List<T> object.
-
-
getLong(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive long.
-
-
getMap(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
-
-
getMetadata() - Method in interface io.delta.standalone.Snapshot
-
 
-
getMetadata() - Method in class io.delta.standalone.types.StructField
-
 
-
getMetrics() - Method in class io.delta.standalone.Operation
-
 
-
getMinReaderVersion() - Method in class io.delta.standalone.actions.Protocol
-
 
-
getMinWriterVersion() - Method in class io.delta.standalone.actions.Protocol
-
 
-
getModificationTime() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getName() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getName() - Method in class io.delta.standalone.Operation
-
 
-
getName() - Method in class io.delta.standalone.types.StructField
-
 
-
getNotebookId() - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
getNotebookInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperation() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperationMetrics() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperationParameters() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOptions() - Method in class io.delta.standalone.actions.Format
-
 
-
getParameters() - Method in class io.delta.standalone.Operation
-
 
-
getPartitionColumns() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getPath() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getPath() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getPath() - Method in interface io.delta.standalone.actions.FileAction
-
 
-
getPath() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getPath() - Method in interface io.delta.standalone.DeltaLog
-
 
-
getPrecision() - Method in class io.delta.standalone.types.DecimalType
-
 
-
getProvider() - Method in class io.delta.standalone.actions.Format
-
 
-
getPushedPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getReadVersion() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getRecord(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a RowRecord object.
-
-
getResidualPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getRight() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
getRunId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getScale() - Method in class io.delta.standalone.types.DecimalType
-
 
-
getSchema() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getSchema() - Method in interface io.delta.standalone.data.RowRecord
-
 
-
getShort(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive short.
-
-
getSimpleString() - Method in class io.delta.standalone.types.ByteType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.DataType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.IntegerType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.LongType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.ShortType
-
 
-
getSize() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getSize() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getSize() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getSnapshotForTimestampAsOf(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Travel back in time to the latest Snapshot that was generated at or before - timestamp.
-
-
getSnapshotForVersionAsOf(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Travel back in time to the Snapshot with the provided version number.
-
-
getStats() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getString(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a String object.
-
-
getTags() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getTags() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getTags() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getTimestamp() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getTimestamp(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.sql.Timestamp.
-
-
getTreeString() - Method in class io.delta.standalone.types.StructType
-
 
-
getTriggerType() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getTypeName() - Method in class io.delta.standalone.types.DataType
-
 
-
getUserId() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getUserMetadata() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getUserMetadata() - Method in class io.delta.standalone.Operation
-
 
-
getUserName() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getValueType() - Method in class io.delta.standalone.types.MapType
-
 
-
getVersion() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getVersion() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getVersion() - Method in class io.delta.standalone.CommitResult
-
 
-
getVersion() - Method in interface io.delta.standalone.Snapshot
-
 
-
getVersion() - Method in class io.delta.standalone.VersionLog
-
 
-
GreaterThan - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 > expr2 for new GreaterThan(expr1, expr2).
-
-
GreaterThan(Expression, Expression) - Constructor for class io.delta.standalone.expressions.GreaterThan
-
 
-
GreaterThanOrEqual - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 >= expr2 for new GreaterThanOrEqual(expr1, expr2).
-
-
GreaterThanOrEqual(Expression, Expression) - Constructor for class io.delta.standalone.expressions.GreaterThanOrEqual
-
 
-
- - - -

H

-
-
hashCode() - Method in class io.delta.standalone.actions.AddFile
-
 
-
hashCode() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Format
-
 
-
hashCode() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Metadata
-
 
-
hashCode() - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Protocol
-
 
-
hashCode() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.Column
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.Literal
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
hashCode() - Method in class io.delta.standalone.types.ArrayType
-
 
-
hashCode() - Method in class io.delta.standalone.types.DataType
-
 
-
hashCode() - Method in class io.delta.standalone.types.DecimalType
-
 
-
hashCode() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
hashCode() - Method in class io.delta.standalone.types.MapType
-
 
-
hashCode() - Method in class io.delta.standalone.types.StructField
-
 
-
hashCode() - Method in class io.delta.standalone.types.StructType
-
 
-
- - - -

I

-
-
id(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
In - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is in exprList for new In(expr, exprList).
-
-
In(Expression, List<? extends Expression>) - Constructor for class io.delta.standalone.expressions.In
-
 
-
initHadoopConf() - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
IntegerType - Class in io.delta.standalone.types
-
-
The data type representing int values.
-
-
IntegerType() - Constructor for class io.delta.standalone.types.IntegerType
-
 
-
io.delta.standalone - package io.delta.standalone
-
 
-
io.delta.standalone.actions - package io.delta.standalone.actions
-
 
-
io.delta.standalone.data - package io.delta.standalone.data
-
 
-
io.delta.standalone.exceptions - package io.delta.standalone.exceptions
-
 
-
io.delta.standalone.expressions - package io.delta.standalone.expressions
-
 
-
io.delta.standalone.storage - package io.delta.standalone.storage
-
 
-
io.delta.standalone.types - package io.delta.standalone.types
-
 
-
io.delta.standalone.util - package io.delta.standalone.util
-
 
-
isBlindAppend(Boolean) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.AddFile
-
 
-
isDataChange() - Method in interface io.delta.standalone.actions.FileAction
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
isExtendedFileMetadata() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
IsNotNull - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is not null for new IsNotNull(expr).
-
-
IsNotNull(Expression) - Constructor for class io.delta.standalone.expressions.IsNotNull
-
 
-
IsNull - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is null for new IsNull(expr).
-
-
IsNull(Expression) - Constructor for class io.delta.standalone.expressions.IsNull
-
 
-
isNullable() - Method in class io.delta.standalone.types.StructField
-
 
-
isNullAt(String) - Method in interface io.delta.standalone.data.RowRecord
-
 
-
isolationLevel(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
isPartialWriteVisible(Path, Configuration) - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
isWriteCompatible(StructType) - Method in class io.delta.standalone.types.StructType
-
-
Whether a new schema can replace this existing schema in a Delta table without rewriting data - files in the table.
-
-
- - - -

J

-
-
jobInfo(JobInfo) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
JobInfo - Class in io.delta.standalone.actions
-
-
Represents the Databricks Job information that committed to the Delta table.
-
-
JobInfo(String, String, String, String, String) - Constructor for class io.delta.standalone.actions.JobInfo
-
 
-
JobInfo.Builder - Class in io.delta.standalone.actions
-
-
Builder class for JobInfo.
-
-
jobName(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
jobOwnerId(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
- - - -

L

-
-
LeafExpression - Class in io.delta.standalone.expressions
-
-
An Expression with no children.
-
-
length() - Method in class io.delta.standalone.types.StructType
-
 
-
LessThan - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 < expr2 for new LessThan(expr1, expr2).
-
-
LessThan(Expression, Expression) - Constructor for class io.delta.standalone.expressions.LessThan
-
 
-
LessThanOrEqual - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 <= expr2 for new LessThanOrEqual(expr1, expr2).
-
-
LessThanOrEqual(Expression, Expression) - Constructor for class io.delta.standalone.expressions.LessThanOrEqual
-
 
-
listFrom(Path, Configuration) - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
Literal - Class in io.delta.standalone.expressions
-
-
A literal value.
-
-
LogStore - Class in io.delta.standalone.storage
-
-
:: DeveloperApi ::
-
-
LogStore(Configuration) - Constructor for class io.delta.standalone.storage.LogStore
-
 
-
LongType - Class in io.delta.standalone.types
-
-
The data type representing long values.
-
-
LongType() - Constructor for class io.delta.standalone.types.LongType
-
 
-
- - - -

M

-
-
MapType - Class in io.delta.standalone.types
-
-
The data type for Maps.
-
-
MapType(DataType, DataType, boolean) - Constructor for class io.delta.standalone.types.MapType
-
 
-
markFilesAsRead(Expression) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Mark files matched by the readPredicate as read by this transaction.
-
-
Metadata - Class in io.delta.standalone.actions
-
-
Updates the metadata of the table.
-
-
Metadata(String, String, String, Format, List<String>, Map<String, String>, Optional<Long>, StructType) - Constructor for class io.delta.standalone.actions.Metadata
-
 
-
metadata() - Method in interface io.delta.standalone.OptimisticTransaction
-
 
-
Metadata.Builder - Class in io.delta.standalone.actions
-
-
Builder class for Metadata.
-
-
MetadataChangedException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the metadata of the Delta table has changed between the time of read - and the time of commit.
-
-
MetadataChangedException(String) - Constructor for exception io.delta.standalone.exceptions.MetadataChangedException
-
 
-
Metrics() - Constructor for class io.delta.standalone.Operation.Metrics
-
 
-
- - - -

N

-
-
name(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
name() - Method in class io.delta.standalone.expressions.Column
-
 
-
Not - Class in io.delta.standalone.expressions
-
-
Evaluates logical NOT expr for new Not(expr).
-
-
Not(Expression) - Constructor for class io.delta.standalone.expressions.Not
-
 
-
notebookInfo(NotebookInfo) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
NotebookInfo - Class in io.delta.standalone.actions
-
-
Represents the Databricks Notebook information that committed to the Delta table.
-
-
NotebookInfo(String) - Constructor for class io.delta.standalone.actions.NotebookInfo
-
 
-
nullSafeEval(Object, Object) - Method in class io.delta.standalone.expressions.And
-
 
-
nullSafeEval(Object) - Method in class io.delta.standalone.expressions.Not
-
 
-
nullSafeEval(Object, Object) - Method in class io.delta.standalone.expressions.Or
-
 
-
NullType - Class in io.delta.standalone.types
-
-
The data type representing null values.
-
-
NullType() - Constructor for class io.delta.standalone.types.NullType
-
 
-
numAddedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files added.
-
-
numConvertedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of parquet files that have been converted.
-
-
numCopiedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows copied in the process of deleting files.
-
-
numDeletedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows removed.
-
-
numFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files written.
-
-
numOutputBytes - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Size in bytes of the written contents.
-
-
numOutputRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows written.
-
-
numRemovedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files removed.
-
-
numSourceRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows in the source table.
-
-
numTargetFilesAdded - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number files added to the sink(target).
-
-
numTargetFilesRemoved - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files removed from the sink(target).
-
-
numTargetRowsCopied - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of target rows copied.
-
-
numTargetRowsDeleted - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows deleted in the target table.
-
-
numTargetRowsInserted - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows inserted into the target table.
-
-
numTargetRowsUpdated - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows updated in the target table.
-
-
numUpdatedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows updated.
-
-
- - - -

O

-
-
of(int) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(boolean) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(byte[]) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(Date) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(BigDecimal) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(double) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(float) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(long) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(short) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(String) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(Timestamp) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(byte) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
ofNull(DataType) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
open() - Method in interface io.delta.standalone.Snapshot
-
-
Creates a CloseableIterator which can iterate over data belonging to this snapshot.
-
-
operation(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
Operation - Class in io.delta.standalone
-
-
An operation that can be performed on a Delta table.
-
-
Operation(Operation.Name) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>, Map<String, String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>, Map<String, String>, Optional<String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation.Metrics - Class in io.delta.standalone
-
-
Some possible operation metrics and their suggested corresponding operation types.
-
-
Operation.Name - Enum in io.delta.standalone
-
-
Supported operation types.
-
-
operationMetrics(Map<String, String>) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
operationParameters(Map<String, String>) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
OptimisticTransaction - Interface in io.delta.standalone
-
-
Used to perform a set of reads in a transaction and then commit a set of updates to the - state of the log.
-
-
Or - Class in io.delta.standalone.expressions
-
-
Evaluates logical expr1 OR expr2 for new Or(expr1, expr2).
-
-
Or(Expression, Expression) - Constructor for class io.delta.standalone.expressions.Or
-
 
-
outputTimestampTypeDefault - Static variable in class io.delta.standalone.util.ParquetSchemaConverter
-
 
-
- - - -

P

-
-
ParquetSchemaConverter - Class in io.delta.standalone.util
-
-
:: DeveloperApi ::
-
-
ParquetSchemaConverter.ParquetOutputTimestampType - Enum in io.delta.standalone.util
-
-
:: DeveloperApi ::
-
-
partitionColumns(List<String>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
Predicate - Interface in io.delta.standalone.expressions
-
-
An Expression that defines a relation on inputs.
-
-
Protocol - Class in io.delta.standalone.actions
-
-
Used to block older clients from reading or writing the log when backwards - incompatible changes are made to the protocol.
-
-
Protocol(int, int) - Constructor for class io.delta.standalone.actions.Protocol
-
 
-
ProtocolChangedException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the protocol version has changed between the time of read and the time of commit.
-
-
ProtocolChangedException(String) - Constructor for exception io.delta.standalone.exceptions.ProtocolChangedException
-
 
-
putBoolean(String, boolean) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putBooleanArray(String, Boolean[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putDouble(String, double) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putDoubleArray(String, Double[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putLong(String, long) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putLongArray(String, Long[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putMetadata(String, FieldMetadata) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putMetadataArray(String, FieldMetadata[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putNull(String) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putString(String, String) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putStringArray(String, String[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
- - - -

R

-
-
read(Path, Configuration) - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
readVersion(Long) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
readWholeTable() - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Mark the entire table as tainted (i.e.
-
-
references() - Method in class io.delta.standalone.expressions.Column
-
 
-
references() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
references() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
remove() - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(long) - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(boolean) - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(long, boolean) - Method in class io.delta.standalone.actions.AddFile
-
 
-
RemoveFile - Class in io.delta.standalone.actions
-
-
Logical removal of a given file from the reservoir.
-
-
RemoveFile(String, Optional<Long>, boolean, boolean, Map<String, String>, Optional<Long>, Map<String, String>) - Constructor for class io.delta.standalone.actions.RemoveFile
-
-
Deprecated. -
RemoveFile should be created from AddFile.remove() instead.
-
-
-
resolvePathOnPhysicalStorage(Path, Configuration) - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
rewriteTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to rewrite the matched files.
-
-
RowRecord - Interface in io.delta.standalone.data
-
-
Represents one row of data containing a non-empty collection of fieldName - value pairs.
-
-
runId(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
- - - -

S

-
-
scan() - Method in interface io.delta.standalone.Snapshot
-
 
-
scan(Expression) - Method in interface io.delta.standalone.Snapshot
-
 
-
scanTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to scan the files for matches.
-
-
schema(StructType) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
SetTransaction - Class in io.delta.standalone.actions
-
-
Sets the committed version for a given application.
-
-
SetTransaction(String, long, Optional<Long>) - Constructor for class io.delta.standalone.actions.SetTransaction
-
 
-
ShortType - Class in io.delta.standalone.types
-
-
The data type representing short values.
-
-
ShortType() - Constructor for class io.delta.standalone.types.ShortType
-
 
-
snapshot() - Method in interface io.delta.standalone.DeltaLog
-
 
-
Snapshot - Interface in io.delta.standalone
-
-
Snapshot provides APIs to access the Delta table state (such as table metadata, active - files) at some version.
-
-
startTransaction() - Method in interface io.delta.standalone.DeltaLog
-
-
Returns a new OptimisticTransaction that can be used to read the current state of the - log and then commit updates.
-
-
stats(String) - Method in class io.delta.standalone.actions.AddFile.Builder
-
 
-
StringType - Class in io.delta.standalone.types
-
-
The data type representing String values.
-
-
StringType() - Constructor for class io.delta.standalone.types.StringType
-
 
-
StructField - Class in io.delta.standalone.types
-
-
A field inside a StructType.
-
-
StructField(String, DataType) - Constructor for class io.delta.standalone.types.StructField
-
-
Constructor with default nullable = true.
-
-
StructField(String, DataType, boolean) - Constructor for class io.delta.standalone.types.StructField
-
 
-
StructField(String, DataType, boolean, FieldMetadata) - Constructor for class io.delta.standalone.types.StructField
-
 
-
StructType - Class in io.delta.standalone.types
-
-
The data type representing a table's schema, consisting of a collection of - fields (that is, fieldName to dataType pairs).
-
-
StructType() - Constructor for class io.delta.standalone.types.StructType
-
 
-
StructType(StructField[]) - Constructor for class io.delta.standalone.types.StructType
-
 
-
- - - -

T

-
-
tableExists() - Method in interface io.delta.standalone.DeltaLog
-
 
-
tags(Map<String, String>) - Method in class io.delta.standalone.actions.AddFile.Builder
-
 
-
timestamp(Timestamp) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
TimestampType - Class in io.delta.standalone.types
-
-
The data type representing java.sql.Timestamp values.
-
-
TimestampType() - Constructor for class io.delta.standalone.types.TimestampType
-
 
-
toJson() - Method in class io.delta.standalone.types.DataType
-
 
-
toPrettyJson() - Method in class io.delta.standalone.types.DataType
-
 
-
toString() - Method in class io.delta.standalone.expressions.BinaryOperator
-
 
-
toString() - Method in class io.delta.standalone.expressions.Column
-
 
-
toString() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
toString() - Method in class io.delta.standalone.expressions.In
-
 
-
toString() - Method in class io.delta.standalone.expressions.IsNotNull
-
 
-
toString() - Method in class io.delta.standalone.expressions.IsNull
-
 
-
toString() - Method in class io.delta.standalone.expressions.Literal
-
 
-
toString() - Method in class io.delta.standalone.expressions.Not
-
 
-
toString() - Method in enum io.delta.standalone.Operation.Name
-
 
-
toString() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
triggerType(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
True - Static variable in class io.delta.standalone.expressions.Literal
-
 
-
txnVersion(String) - Method in interface io.delta.standalone.OptimisticTransaction
-
 
-
- - - -

U

-
-
UnaryExpression - Class in io.delta.standalone.expressions
-
-
An Expression with one input and one output.
-
-
update() - Method in interface io.delta.standalone.DeltaLog
-
-
Bring DeltaLog's current Snapshot to the latest state if there are any new - transaction logs.
-
-
updateMetadata(Metadata) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Records an update to the metadata that should be committed with this transaction.
-
-
USER_DEFAULT - Static variable in class io.delta.standalone.types.DecimalType
-
 
-
userId(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
userMetadata(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
userName(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
- - - -

V

-
-
value() - Method in class io.delta.standalone.expressions.Literal
-
 
-
valueContainsNull() - Method in class io.delta.standalone.types.MapType
-
 
-
valueOf(String) - Static method in enum io.delta.standalone.Operation.Name
-
-
Returns the enum constant of this type with the specified name.
-
-
valueOf(String) - Static method in enum io.delta.standalone.util.ParquetSchemaConverter.ParquetOutputTimestampType
-
-
Returns the enum constant of this type with the specified name.
-
-
values() - Static method in enum io.delta.standalone.Operation.Name
-
-
Returns an array containing the constants of this enum type, in -the order they are declared.
-
-
values() - Static method in enum io.delta.standalone.util.ParquetSchemaConverter.ParquetOutputTimestampType
-
-
Returns an array containing the constants of this enum type, in -the order they are declared.
-
-
version(Long) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
VersionLog - Class in io.delta.standalone
-
-
VersionLog is the representation of all actions (changes) to the Delta Table - at a specific table version.
-
-
VersionLog(long, List<Action>) - Constructor for class io.delta.standalone.VersionLog
-
 
-
- - - -

W

-
-
write(Path, Iterator<String>, Boolean, Configuration) - Method in class io.delta.standalone.storage.LogStore
-
-
:: DeveloperApi ::
-
-
writeLegacyParquetFormatDefault - Static variable in class io.delta.standalone.util.ParquetSchemaConverter
-
 
-
-A B C D E F G H I J L M N O P R S T U V W 
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/index.html b/connectors/docs/0.4.1/delta-standalone/api/java/index.html deleted file mode 100644 index d06dd8f9a1a..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - -Delta Standalone 0.4.1 JavaDoc - - - - - - - - - -<noscript> -<div>JavaScript is disabled on your browser.</div> -</noscript> -<h2>Frame Alert</h2> -<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/CommitResult.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/CommitResult.html deleted file mode 100644 index b7d3aa95c01..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/CommitResult.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - -CommitResult (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class CommitResult

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      CommitResult(long version) 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - -
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      longgetVersion() 
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CommitResult

        -
        public CommitResult(long version)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the table version that was committed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/DeltaLog.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/DeltaLog.html deleted file mode 100644 index ba37287b079..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/DeltaLog.html +++ /dev/null @@ -1,472 +0,0 @@ - - - - - -DeltaLog (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface DeltaLog

-
-
-
-
    -
  • -
    -
    -
    public interface DeltaLog
    -
    Represents the transaction logs of a Delta table. It provides APIs to access the states of a - Delta table. -

    - You can use the following code to create a DeltaLog instance. -

    
    -   Configuration conf = ... // Create your own Hadoop Configuration instance
    -   DeltaLog deltaLog = DeltaLog.forTable(conf, "/the/delta/table/path");
    - 
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        snapshot

        -
        Snapshot snapshot()
        -
        -
        Returns:
        -
        the current Snapshot of the Delta table. You may need to call - update() to access the latest snapshot if the current snapshot is stale.
        -
        -
      • -
      - - - -
        -
      • -

        update

        -
        Snapshot update()
        -
        Bring DeltaLog's current Snapshot to the latest state if there are any new - transaction logs.
        -
        -
        Returns:
        -
        the latest snapshot after applying the new transaction logs.
        -
        -
      • -
      - - - -
        -
      • -

        getSnapshotForVersionAsOf

        -
        Snapshot getSnapshotForVersionAsOf(long version)
        -
        Travel back in time to the Snapshot with the provided version number.
        -
        -
        Parameters:
        -
        version - the snapshot version to generate
        -
        Returns:
        -
        the snapshot at the provided version
        -
        Throws:
        -
        IllegalArgumentException - if the version is outside the range of available - versions
        -
        -
      • -
      - - - -
        -
      • -

        getSnapshotForTimestampAsOf

        -
        Snapshot getSnapshotForTimestampAsOf(long timestamp)
        -
        Travel back in time to the latest Snapshot that was generated at or before - timestamp.
        -
        -
        Parameters:
        -
        timestamp - the number of milliseconds since midnight, January 1, 1970 UTC
        -
        Returns:
        -
        the snapshot nearest to, but not after, the provided timestamp
        -
        Throws:
        -
        RuntimeException - if the snapshot is unable to be recreated
        -
        IllegalArgumentException - if the timestamp is before the earliest possible - snapshot or after the latest possible snapshot
        -
        -
      • -
      - - - -
        -
      • -

        startTransaction

        -
        OptimisticTransaction startTransaction()
        -
        Returns a new OptimisticTransaction that can be used to read the current state of the - log and then commit updates. The reads and updates will be checked for logical conflicts - with any concurrent writes to the log. -

        - Note that all reads in a transaction must go through the returned transaction object, and not - directly to the DeltaLog otherwise they will not be checked for conflicts.

        -
        -
        Returns:
        -
        a new OptimisticTransaction.
        -
        -
      • -
      - - - -
        -
      • -

        getCommitInfoAt

        -
        CommitInfo getCommitInfoAt(long version)
        -
        -
        Parameters:
        -
        version - the commit version to retrieve CommitInfo
        -
        Returns:
        -
        the CommitInfo of the commit at the provided version.
        -
        -
      • -
      - - - -
        -
      • -

        getPath

        -
        org.apache.hadoop.fs.Path getPath()
        -
        -
        Returns:
        -
        the path of the Delta table.
        -
        -
      • -
      - - - -
        -
      • -

        getChanges

        -
        java.util.Iterator<VersionLog> getChanges(long startVersion,
        -                                          boolean failOnDataLoss)
        -
        Get all actions starting from startVersion (inclusive) in increasing order of - committed version. -

        - If startVersion doesn't exist, return an empty Iterator.

        -
        -
        Parameters:
        -
        startVersion - the table version to begin retrieving actions from (inclusive)
        -
        failOnDataLoss - whether to throw when data loss detected
        -
        Returns:
        -
        an Iterator of VersionLogs starting from startVersion
        -
        Throws:
        -
        IllegalArgumentException - if startVersion is negative
        -
        IllegalStateException - if data loss detected and failOnDataLoss is true
        -
        -
      • -
      - - - -
        -
      • -

        tableExists

        -
        boolean tableExists()
        -
        -
        Returns:
        -
        Whether a Delta table exists at this directory.
        -
        -
      • -
      - - - -
        -
      • -

        forTable

        -
        static DeltaLog forTable(org.apache.hadoop.conf.Configuration hadoopConf,
        -                         String path)
        -
        Create a DeltaLog instance representing the table located at the provided - path.
        -
        -
        Parameters:
        -
        hadoopConf - Hadoop Configuration to use when accessing the Delta table
        -
        path - the path to the Delta table
        -
        Returns:
        -
        the DeltaLog for the provided path
        -
        -
      • -
      - - - -
        -
      • -

        forTable

        -
        static DeltaLog forTable(org.apache.hadoop.conf.Configuration hadoopConf,
        -                         org.apache.hadoop.fs.Path path)
        -
        Create a DeltaLog instance representing the table located at the provided - path.
        -
        -
        Parameters:
        -
        hadoopConf - Hadoop Configuration to use when accessing the Delta table
        -
        path - the path to the Delta table
        -
        Returns:
        -
        the DeltaLog for the provided path
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/DeltaScan.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/DeltaScan.html deleted file mode 100644 index b98b8579868..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/DeltaScan.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - -DeltaScan (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface DeltaScan

-
-
-
-
    -
  • -
    -
    -
    public interface DeltaScan
    -
    Provides access to an iterator over the files in this snapshot. -

    - Typically created with a read predicate Expression to let users filter files. Please note - filtering is only supported on partition columns and users should use - getResidualPredicate() to check for any unapplied portion of the input - predicate.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        getInputPredicate

        -
        java.util.Optional<Expression> getInputPredicate()
        -
        -
        Returns:
        -
        the input predicate passed in by the user
        -
        -
      • -
      - - - -
        -
      • -

        getPushedPredicate

        -
        java.util.Optional<Expression> getPushedPredicate()
        -
        -
        Returns:
        -
        portion of the input predicate that can be evaluated by Delta Standalone using only - metadata (filters on partition columns). Files returned by getFiles() are - guaranteed to satisfy the pushed predicate, and the caller doesn’t need to apply them - again on the returned files.
        -
        -
      • -
      - - - -
        -
      • -

        getResidualPredicate

        -
        java.util.Optional<Expression> getResidualPredicate()
        -
        -
        Returns:
        -
        portion of the input predicate that may not be fully applied. Files returned by - getFiles() are not guaranteed to satisfy the residual predicate, and the - caller should still apply them on the returned files.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html deleted file mode 100644 index fb4234acbc4..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html +++ /dev/null @@ -1,683 +0,0 @@ - - - - - -Operation.Metrics (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class Operation.Metrics

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    Operation
    -
    -
    -
    -
    public static class Operation.Metrics
    -extends Object
    -
    Some possible operation metrics and their suggested corresponding operation types. - These are purely exemplary, and users may use whichever metrics best fit their application.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Field Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Fields 
      Modifier and TypeField and Description
      static StringexecutionTimeMs -
      Time taken to execute the entire operation.
      -
      static StringnumAddedFiles -
      Number of files added.
      -
      static StringnumConvertedFiles -
      Number of parquet files that have been converted.
      -
      static StringnumCopiedRows -
      Number of rows copied in the process of deleting files.
      -
      static StringnumDeletedRows -
      Number of rows removed.
      -
      static StringnumFiles -
      Number of files written.
      -
      static StringnumOutputBytes -
      Size in bytes of the written contents.
      -
      static StringnumOutputRows -
      Number of rows written.
      -
      static StringnumRemovedFiles -
      Number of files removed.
      -
      static StringnumSourceRows -
      Number of rows in the source table.
      -
      static StringnumTargetFilesAdded -
      Number files added to the sink(target).
      -
      static StringnumTargetFilesRemoved -
      Number of files removed from the sink(target).
      -
      static StringnumTargetRowsCopied -
      Number of target rows copied.
      -
      static StringnumTargetRowsDeleted -
      Number of rows deleted in the target table.
      -
      static StringnumTargetRowsInserted -
      Number of rows inserted into the target table.
      -
      static StringnumTargetRowsUpdated -
      Number of rows updated in the target table.
      -
      static StringnumUpdatedRows -
      Number of rows updated.
      -
      static StringrewriteTimeMs -
      Time taken to rewrite the matched files.
      -
      static StringscanTimeMs -
      Time taken to scan the files for matches.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Metrics() 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        numFiles

        -
        public static final String numFiles
        -
        Number of files written. - - Usually used with the WRITE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numOutputBytes

        -
        public static final String numOutputBytes
        -
        Size in bytes of the written contents. - - Usually used with WRITE, STREAMING_UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numOutputRows

        -
        public static final String numOutputRows
        -
        Number of rows written. - - Usually used with WRITE, STREAMING_UPDATE, MERGE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numAddedFiles

        -
        public static final String numAddedFiles
        -
        Number of files added. - - Usually used with STREAMING_UPDATE, DELETE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numRemovedFiles

        -
        public static final String numRemovedFiles
        -
        Number of files removed. - - Usually used with STREAMING_UPDATE, DELETE, DELETE_PARTITIONS, TRUNCATE, - UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numDeletedRows

        -
        public static final String numDeletedRows
        -
        Number of rows removed. - - Usually used with the DELETE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numCopiedRows

        -
        public static final String numCopiedRows
        -
        Number of rows copied in the process of deleting files. - - Usually used with DELETE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        executionTimeMs

        -
        public static final String executionTimeMs
        -
        Time taken to execute the entire operation. - - Usually used with DELETE, DELETE_PARTITIONS, TRUNCATE, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        scanTimeMs

        -
        public static final String scanTimeMs
        -
        Time taken to scan the files for matches. - - Usually used with DELETE, DELETE_PARTITIONS, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        rewriteTimeMs

        -
        public static final String rewriteTimeMs
        -
        Time taken to rewrite the matched files. - - Usually used with DELETE, DELETE_PARTITIONS, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numConvertedFiles

        -
        public static final String numConvertedFiles
        -
        Number of parquet files that have been converted. - - Usually used with the CONVERT operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numSourceRows

        -
        public static final String numSourceRows
        -
        Number of rows in the source table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsInserted

        -
        public static final String numTargetRowsInserted
        -
        Number of rows inserted into the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsUpdated

        -
        public static final String numTargetRowsUpdated
        -
        Number of rows updated in the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsDeleted

        -
        public static final String numTargetRowsDeleted
        -
        Number of rows deleted in the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsCopied

        -
        public static final String numTargetRowsCopied
        -
        Number of target rows copied. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetFilesAdded

        -
        public static final String numTargetFilesAdded
        -
        Number files added to the sink(target). - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetFilesRemoved

        -
        public static final String numTargetFilesRemoved
        -
        Number of files removed from the sink(target). - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numUpdatedRows

        -
        public static final String numUpdatedRows
        -
        Number of rows updated. - - Usually used with the UPDATE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Metrics

        -
        public Metrics()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Operation.Name.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Operation.Name.html deleted file mode 100644 index 557e91c0436..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Operation.Name.html +++ /dev/null @@ -1,589 +0,0 @@ - - - - - -Operation.Name (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Enum Operation.Name

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable, Comparable<Operation.Name>
    -
    -
    -
    Enclosing class:
    -
    Operation
    -
    -
    -
    -
    public static enum Operation.Name
    -extends Enum<Operation.Name>
    -
    Supported operation types.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Enum Constant Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Enum Constants 
      Enum Constant and Description
      ADD_COLUMNS -
      Recorded when columns are added.
      -
      CHANGE_COLUMN -
      Recorded when columns are changed.
      -
      CONVERT -
      Recorded when converting a table into a Delta table.
      -
      CREATE_TABLE -
      Recorded when the table is created.
      -
      DELETE -
      Recorded while deleting certain partitions.
      -
      MANUAL_UPDATE 
      MERGE -
      Recorded when a merge operation is committed to the table.
      -
      REPLACE_COLUMNS -
      Recorded when columns are replaced.
      -
      REPLACE_TABLE -
      Recorded when the table is replaced.
      -
      SET_TABLE_PROPERTIES -
      Recorded when the table properties are set.
      -
      STREAMING_UPDATE -
      Recorded during streaming inserts.
      -
      TRUNCATE -
      Recorded when truncating the table.
      -
      UNSET_TABLE_PROPERTIES -
      Recorded when the table properties are unset.
      -
      UPDATE -
      Recorded when an update operation is committed to the table.
      -
      UPGRADE_PROTOCOL -
      Recorded when the table protocol is upgraded.
      -
      UPGRADE_SCHEMA -
      Recorded when the table schema is upgraded.
      -
      WRITE -
      Recorded during batch inserts.
      -
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - -
      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      StringtoString() 
      static Operation.NamevalueOf(String name) -
      Returns the enum constant of this type with the specified name.
      -
      static Operation.Name[]values() -
      Returns an array containing the constants of this enum type, in -the order they are declared.
      -
      -
        -
      • - - -

        Methods inherited from class Enum

        -compareTo, equals, getDeclaringClass, hashCode, name, ordinal, valueOf
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -getClass, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Enum Constant Detail

      - - - -
        -
      • -

        WRITE

        -
        public static final Operation.Name WRITE
        -
        Recorded during batch inserts.
        -
      • -
      - - - -
        -
      • -

        STREAMING_UPDATE

        -
        public static final Operation.Name STREAMING_UPDATE
        -
        Recorded during streaming inserts.
        -
      • -
      - - - -
        -
      • -

        DELETE

        -
        public static final Operation.Name DELETE
        -
        Recorded while deleting certain partitions.
        -
      • -
      - - - -
        -
      • -

        TRUNCATE

        -
        public static final Operation.Name TRUNCATE
        -
        Recorded when truncating the table.
        -
      • -
      - - - -
        -
      • -

        CONVERT

        -
        public static final Operation.Name CONVERT
        -
        Recorded when converting a table into a Delta table.
        -
      • -
      - - - -
        -
      • -

        MERGE

        -
        public static final Operation.Name MERGE
        -
        Recorded when a merge operation is committed to the table.
        -
      • -
      - - - -
        -
      • -

        UPDATE

        -
        public static final Operation.Name UPDATE
        -
        Recorded when an update operation is committed to the table.
        -
      • -
      - - - -
        -
      • -

        CREATE_TABLE

        -
        public static final Operation.Name CREATE_TABLE
        -
        Recorded when the table is created.
        -
      • -
      - - - -
        -
      • -

        REPLACE_TABLE

        -
        public static final Operation.Name REPLACE_TABLE
        -
        Recorded when the table is replaced.
        -
      • -
      - - - -
        -
      • -

        SET_TABLE_PROPERTIES

        -
        public static final Operation.Name SET_TABLE_PROPERTIES
        -
        Recorded when the table properties are set.
        -
      • -
      - - - -
        -
      • -

        UNSET_TABLE_PROPERTIES

        -
        public static final Operation.Name UNSET_TABLE_PROPERTIES
        -
        Recorded when the table properties are unset.
        -
      • -
      - - - -
        -
      • -

        ADD_COLUMNS

        -
        public static final Operation.Name ADD_COLUMNS
        -
        Recorded when columns are added.
        -
      • -
      - - - -
        -
      • -

        CHANGE_COLUMN

        -
        public static final Operation.Name CHANGE_COLUMN
        -
        Recorded when columns are changed.
        -
      • -
      - - - -
        -
      • -

        REPLACE_COLUMNS

        -
        public static final Operation.Name REPLACE_COLUMNS
        -
        Recorded when columns are replaced.
        -
      • -
      - - - -
        -
      • -

        UPGRADE_PROTOCOL

        -
        public static final Operation.Name UPGRADE_PROTOCOL
        -
        Recorded when the table protocol is upgraded.
        -
      • -
      - - - -
        -
      • -

        UPGRADE_SCHEMA

        -
        public static final Operation.Name UPGRADE_SCHEMA
        -
        Recorded when the table schema is upgraded.
        -
      • -
      - - - -
        -
      • -

        MANUAL_UPDATE

        -
        public static final Operation.Name MANUAL_UPDATE
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        values

        -
        public static Operation.Name[] values()
        -
        Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
        -for (Operation.Name c : Operation.Name.values())
        -    System.out.println(c);
        -
        -
        -
        Returns:
        -
        an array containing the constants of this enum type, in the order they are declared
        -
        -
      • -
      - - - -
        -
      • -

        valueOf

        -
        public static Operation.Name valueOf(String name)
        -
        Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.)
        -
        -
        Parameters:
        -
        name - the name of the enum constant to be returned.
        -
        Returns:
        -
        the enum constant with the specified name
        -
        Throws:
        -
        IllegalArgumentException - if this enum type has no constant with the specified name
        -
        NullPointerException - if the argument is null
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Overrides:
        -
        toString in class Enum<Operation.Name>
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Operation.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Operation.html deleted file mode 100644 index c521e198f53..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Operation.html +++ /dev/null @@ -1,442 +0,0 @@ - - - - - -Operation (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class Operation

-
-
- -
-
    -
  • -
    -
    -
    public final class Operation
    -extends Object
    -
    An operation that can be performed on a Delta table. -

    - An operation is tracked as the first line in delta logs, and powers DESCRIBE HISTORY for - Delta tables. -

    - Operations must be constructed using one of the Operation.Name types below. - As well, optional Operation.Metrics values are given below.

    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class Operation.Metrics -
      Some possible operation metrics and their suggested corresponding operation types.
      -
      static class Operation.Name -
      Supported operation types.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      Operation(Operation.Name name) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters, - java.util.Map<String,String> metrics) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters, - java.util.Map<String,String> metrics, - java.util.Optional<String> userMetadata) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - - - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        -
      • -
      - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters,
        -                 @Nullable
        -                 java.util.Map<String,String> metrics)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        metrics - Any relevant operation metrics. See Operation.Metrics for suggested keys.
        -
        -
      • -
      - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters,
        -                 @Nullable
        -                 java.util.Map<String,String> metrics,
        -                 @Nonnull
        -                 java.util.Optional<String> userMetadata)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        metrics - Any relevant operation metrics. See Operation.Metrics for suggested keys.
        -
        userMetadata - Optional additional user metadata.
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getName

        -
        @Nonnull
        -public Operation.Name getName()
        -
        -
        Returns:
        -
        operation name
        -
        -
      • -
      - - - -
        -
      • -

        getParameters

        -
        @Nullable
        -public java.util.Map<String,String> getParameters()
        -
        -
        Returns:
        -
        operation parameters
        -
        -
      • -
      - - - -
        -
      • -

        getMetrics

        -
        @Nullable
        -public java.util.Map<String,String> getMetrics()
        -
        -
        Returns:
        -
        operation metrics
        -
        -
      • -
      - - - -
        -
      • -

        getUserMetadata

        -
        @Nonnull
        -public java.util.Optional<String> getUserMetadata()
        -
        -
        Returns:
        -
        user metadata for this operation
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html deleted file mode 100644 index 6675c40cc6e..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html +++ /dev/null @@ -1,388 +0,0 @@ - - - - - -OptimisticTransaction (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface OptimisticTransaction

-
-
-
-
    -
  • -
    -
    -
    public interface OptimisticTransaction
    -
    Used to perform a set of reads in a transaction and then commit a set of updates to the - state of the log. All reads from the DeltaLog MUST go through this instance rather - than directly to the DeltaLog otherwise they will not be checked for logical conflicts - with concurrent updates. -

    - This class is not thread-safe.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        commit

        -
        <T extends ActionCommitResult commit(Iterable<T> actions,
        -                                       Operation op,
        -                                       String engineInfo)
        -
        Modifies the state of the log by adding a new commit that is based on a read at the table's - latest version as of this transaction's instantiation. In the case of a conflict with a - concurrent writer this method will throw an exception. -

        - Note: any AddFile with an absolute path within the table - path will be updated to have a relative path (based off of the table path). Because of this, - be sure to generate all RemoveFiles using - AddFiles read from the Delta Log (do not use the - AddFiles created pre-commit.)

        -
        -
        Type Parameters:
        -
        T - A derived class of Action. This allows, for example, both a - List<Action> and a List<AddFile> to be accepted.
        -
        Parameters:
        -
        actions - Set of actions to commit.
        -
        op - Details of operation that is performing this transactional commit.
        -
        engineInfo - String used to identify the writer engine. It should resemble - "{engineName}/{engineVersion}", with dashes in place of whitespace. - For example, "Flink-Connector/1.1.0".
        -
        Returns:
        -
        a CommitResult, wrapping the table version that was committed.
        -
        -
      • -
      - - - -
        -
      • -

        markFilesAsRead

        -
        DeltaScan markFilesAsRead(Expression readPredicate)
        -
        Mark files matched by the readPredicate as read by this transaction. -

        - Please note filtering is only supported on partition columns, thus the files matched - may be a superset of the files in the Delta table that satisfy readPredicate. Users - should use DeltaScan.getResidualPredicate() to check for any unapplied portion of the - input predicate. -

        - Internally, readPredicate and the matched readFiles will be used to determine - if logical conflicts between this transaction and previously-committed transactions can be - resolved (i.e. no error thrown). -

        - For example: -

          -
        • This transaction TXN1 reads partition 'date=2021-09-08' to perform an UPDATE and tries - to commit at the next table version N.
        • -
        • After TXN1 starts, another transaction TXN2 reads partition 'date=2021-09-07' and - commits first at table version N (with no other metadata changes).
        • -
        • TXN1 sees that another commit won, and needs to know whether to commit at version N+1 - or fail. Using the readPredicates and resultant readFiles, TXN1 can see - that none of its read files were changed by TXN2. Thus there are no logical conflicts and - TXN1 can commit at table version N+1.
        • -
        -
        -
        Parameters:
        -
        readPredicate - Predicate used to determine which files were read.
        -
        Returns:
        -
        a DeltaScan containing the list of files matching the pushed portion of the - readPredicate.
        -
        -
      • -
      - - - -
        -
      • -

        updateMetadata

        -
        void updateMetadata(Metadata metadata)
        -
        Records an update to the metadata that should be committed with this transaction. - -

        - Use Metadata.copyBuilder() to build a new Metadata instance based on the - current table metadata. For example: - -

        
        - Metadata newMetadata = optimisticTransaction.metadata().copyBuilder()
        -     .schema(newSchema)
        -     .build();
        - optimisticTransaction.updateMetadata(newMetadata);
        - 
        - -

        - IMPORTANT: It is the responsibility of the caller to ensure that files currently - present in the table are still valid under the new metadata.

        -
        -
        Parameters:
        -
        metadata - The new metadata for the delta table.
        -
        -
      • -
      - - - -
        -
      • -

        readWholeTable

        -
        void readWholeTable()
        -
        Mark the entire table as tainted (i.e. read) by this transaction.
        -
      • -
      - - - -
        -
      • -

        txnVersion

        -
        long txnVersion(String id)
        -
        -
        Parameters:
        -
        id - transaction id
        -
        Returns:
        -
        the latest version that has committed for the idempotent transaction with given - id.
        -
        -
      • -
      - - - -
        -
      • -

        metadata

        -
        Metadata metadata()
        -
        -
        Returns:
        -
        the metadata for this transaction. The metadata refers to the metadata of the table's - latest version as of this transaction's instantiation unless updated during the - transaction.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Snapshot.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Snapshot.html deleted file mode 100644 index 23e755dbb15..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/Snapshot.html +++ /dev/null @@ -1,320 +0,0 @@ - - - - - -Snapshot (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface Snapshot

-
-
-
-
    -
  • -
    -
    -
    public interface Snapshot
    -
    Snapshot provides APIs to access the Delta table state (such as table metadata, active - files) at some version. -

    - See Delta Transaction Log Protocol - for more details about the transaction logs.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        scan

        -
        DeltaScan scan(Expression predicate)
        -
        -
        Parameters:
        -
        predicate - the predicate to be used to filter the files in this snapshot.
        -
        Returns:
        -
        a DeltaScan of the files in this snapshot matching the pushed portion of - predicate
        -
        -
      • -
      - - - -
        -
      • -

        getAllFiles

        -
        java.util.List<AddFile> getAllFiles()
        -
        -
        Returns:
        -
        all of the files present in this snapshot
        -
        -
      • -
      - - - -
        -
      • -

        getMetadata

        -
        Metadata getMetadata()
        -
        -
        Returns:
        -
        the table metadata for this snapshot
        -
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        long getVersion()
        -
        -
        Returns:
        -
        the version for this snapshot
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/VersionLog.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/VersionLog.html deleted file mode 100644 index 99d1a6ff819..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/VersionLog.html +++ /dev/null @@ -1,296 +0,0 @@ - - - - - -VersionLog (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class VersionLog

-
-
- -
-
    -
  • -
    -
    -
    public final class VersionLog
    -extends Object
    -
    VersionLog is the representation of all actions (changes) to the Delta Table - at a specific table version.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      VersionLog(long version, - java.util.List<Action> actions) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        VersionLog

        -
        public VersionLog(long version,
        -                  @Nonnull
        -                  java.util.List<Action> actions)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the table version at which these actions occurred
        -
        -
      • -
      - - - -
        -
      • -

        getActions

        -
        @Nonnull
        -public java.util.List<Action> getActions()
        -
        -
        Returns:
        -
        an unmodifiable List of the actions for this table version
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Action.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Action.html deleted file mode 100644 index 67da301d8d0..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Action.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - -Action (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Interface Action

-
-
-
-
    -
  • -
    -
    All Known Subinterfaces:
    -
    FileAction
    -
    -
    -
    All Known Implementing Classes:
    -
    AddCDCFile, AddFile, CommitInfo, Metadata, Protocol, RemoveFile, SetTransaction
    -
    -
    -
    -
    public interface Action
    -
    A marker interface for all actions that can be applied to a Delta table. - Each action represents a single change to the state of a Delta table. -

    - You can use the following code to extract the concrete type of an Action. -

    
    -   List<Action> actions = ...
    -   actions.forEach(x -> {
    -       if (x instanceof AddFile) {
    -          AddFile addFile = (AddFile) x;
    -          ...
    -       } else if (x instanceof AddCDCFile) {
    -          AddCDCFile addCDCFile = (AddCDCFile)x;
    -          ...
    -       } else if ...
    -   });
    - 
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html deleted file mode 100644 index d2c4cc4fe14..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html +++ /dev/null @@ -1,371 +0,0 @@ - - - - - -AddCDCFile (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddCDCFile

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action, FileAction
    -
    -
    -
    -
    public final class AddCDCFile
    -extends Object
    -implements FileAction
    -
    A change file containing CDC data for the Delta version it's within. Non-CDC readers should - ignore this, CDC readers should scan all ChangeFiles in a version rather than computing - changes from AddFile and RemoveFile actions.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      AddCDCFile(String path, - java.util.Map<String,String> partitionValues, - long size, - java.util.Map<String,String> tags) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AddCDCFile

        -
        public AddCDCFile(@Nonnull
        -                  String path,
        -                  @Nonnull
        -                  java.util.Map<String,String> partitionValues,
        -                  long size,
        -                  @Nullable
        -                  java.util.Map<String,String> tags)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        @Nonnull
        -public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be added to the table. If it's a - relative path, it's relative to the root of the table. Note: the path is encoded and - should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nonnull
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public long getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being added or removed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html deleted file mode 100644 index c48513bc21a..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html +++ /dev/null @@ -1,317 +0,0 @@ - - - - - -AddFile.Builder (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddFile.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    AddFile
    -
    -
    -
    -
    public static final class AddFile.Builder
    -extends Object
    -
    Builder class for AddFile. Enables construction of AddFiles with default - values.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Builder(String path, - java.util.Map<String,String> partitionValues, - long size, - long modificationTime, - boolean dataChange) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder(String path,
        -               java.util.Map<String,String> partitionValues,
        -               long size,
        -               long modificationTime,
        -               boolean dataChange)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        tags

        -
        public AddFile.Builder tags(java.util.Map<String,String> tags)
        -
      • -
      - - - -
        -
      • -

        build

        -
        public AddFile build()
        -
        Builds an AddFile using the provided parameters. If a parameter is not provided - its default values is used.
        -
        -
        Returns:
        -
        a new AddFile with the properties added to the builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html deleted file mode 100644 index 27f3b8667f9..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html +++ /dev/null @@ -1,581 +0,0 @@ - - - - - -AddFile (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddFile

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action, FileAction
    -
    -
    -
    -
    public final class AddFile
    -extends Object
    -implements FileAction
    -
    Represents an action that adds a new file to the table. The path of a file acts as the primary - key for the entry in the set of files. -

    - Note: since actions within a given Delta file are not guaranteed to be applied in order, it is - not valid for multiple file operations with the same path to exist in a single version.

    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Add File and Remove File
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class AddFile.Builder -
      Builder class for AddFile.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      AddFile(String path, - java.util.Map<String,String> partitionValues, - long size, - long modificationTime, - boolean dataChange, - String stats, - java.util.Map<String,String> tags) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AddFile

        -
        public AddFile(@Nonnull
        -               String path,
        -               @Nonnull
        -               java.util.Map<String,String> partitionValues,
        -               long size,
        -               long modificationTime,
        -               boolean dataChange,
        -               @Nullable
        -               String stats,
        -               @Nullable
        -               java.util.Map<String,String> tags)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove()
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with - deletionTimestamp = System.currentTimeMillis()
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(long deletionTimestamp)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - deletionTimestamp
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(boolean dataChange)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - dataChange flag
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(long deletionTimestamp,
        -                                  boolean dataChange)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - deletionTimestamp value and dataChange flag
        -
        -
      • -
      - - - -
        -
      • -

        getPath

        -
        @Nonnull
        -public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be added to the table. If it's a - relative path, it's relative to the root of the table. Note: the path is encoded and - should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nonnull
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public long getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getModificationTime

        -
        public long getModificationTime()
        -
        -
        Returns:
        -
        the time that this file was last modified or created, as - milliseconds since the epoch
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being created. When - false the file must already be present in the table or the records in the - added file must be contained in one or more remove actions in the same version
        -
        -
      • -
      - - - -
        -
      • -

        getStats

        -
        @Nullable
        -public String getStats()
        -
        -
        Returns:
        -
        statistics (for example: count, min/max values for columns) - about the data in this file as serialized JSON
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - -
        -
      • -

        builder

        -
        public static AddFile.Builder builder(String path,
        -                                      java.util.Map<String,String> partitionValues,
        -                                      long size,
        -                                      long modificationTime,
        -                                      boolean dataChange)
        -
        -
        Returns:
        -
        a new AddFile.Builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html deleted file mode 100644 index ca7fbb56f27..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html +++ /dev/null @@ -1,481 +0,0 @@ - - - - - -CommitInfo.Builder (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class CommitInfo.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    CommitInfo
    -
    -
    -
    -
    public static final class CommitInfo.Builder
    -extends Object
    -
    Builder class for CommitInfo. Enables construction of CommitInfos with - default values.
    -
  • -
-
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html deleted file mode 100644 index 68af07b72a7..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html +++ /dev/null @@ -1,706 +0,0 @@ - - - - - -CommitInfo (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class CommitInfo

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public class CommitInfo
    -extends Object
    -implements Action
    -
    Holds provenance information about changes to the table. This CommitInfo - is not stored in the checkpoint and has reduced compatibility guarantees. - Information stored in it is best effort (i.e. can be falsified by a writer).
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Commit Provenance Information
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class CommitInfo.Builder -
      Builder class for CommitInfo.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      CommitInfo(java.util.Optional<Long> version, - java.sql.Timestamp timestamp, - java.util.Optional<String> userId, - java.util.Optional<String> userName, - String operation, - java.util.Map<String,String> operationParameters, - java.util.Optional<JobInfo> jobInfo, - java.util.Optional<NotebookInfo> notebookInfo, - java.util.Optional<String> clusterId, - java.util.Optional<Long> readVersion, - java.util.Optional<String> isolationLevel, - java.util.Optional<Boolean> isBlindAppend, - java.util.Optional<java.util.Map<String,String>> operationMetrics, - java.util.Optional<String> userMetadata) 
      CommitInfo(java.util.Optional<Long> version, - java.sql.Timestamp timestamp, - java.util.Optional<String> userId, - java.util.Optional<String> userName, - String operation, - java.util.Map<String,String> operationParameters, - java.util.Optional<JobInfo> jobInfo, - java.util.Optional<NotebookInfo> notebookInfo, - java.util.Optional<String> clusterId, - java.util.Optional<Long> readVersion, - java.util.Optional<String> isolationLevel, - java.util.Optional<Boolean> isBlindAppend, - java.util.Optional<java.util.Map<String,String>> operationMetrics, - java.util.Optional<String> userMetadata, - java.util.Optional<String> engineInfo) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CommitInfo

        -
        public CommitInfo(@Nonnull
        -                  java.util.Optional<Long> version,
        -                  @Nullable
        -                  java.sql.Timestamp timestamp,
        -                  @Nonnull
        -                  java.util.Optional<String> userId,
        -                  @Nonnull
        -                  java.util.Optional<String> userName,
        -                  @Nullable
        -                  String operation,
        -                  @Nullable
        -                  java.util.Map<String,String> operationParameters,
        -                  @Nonnull
        -                  java.util.Optional<JobInfo> jobInfo,
        -                  @Nonnull
        -                  java.util.Optional<NotebookInfo> notebookInfo,
        -                  @Nonnull
        -                  java.util.Optional<String> clusterId,
        -                  @Nonnull
        -                  java.util.Optional<Long> readVersion,
        -                  @Nonnull
        -                  java.util.Optional<String> isolationLevel,
        -                  @Nonnull
        -                  java.util.Optional<Boolean> isBlindAppend,
        -                  @Nonnull
        -                  java.util.Optional<java.util.Map<String,String>> operationMetrics,
        -                  @Nonnull
        -                  java.util.Optional<String> userMetadata)
        -
      • -
      - - - -
        -
      • -

        CommitInfo

        -
        public CommitInfo(@Nonnull
        -                  java.util.Optional<Long> version,
        -                  @Nullable
        -                  java.sql.Timestamp timestamp,
        -                  @Nonnull
        -                  java.util.Optional<String> userId,
        -                  @Nonnull
        -                  java.util.Optional<String> userName,
        -                  @Nullable
        -                  String operation,
        -                  @Nullable
        -                  java.util.Map<String,String> operationParameters,
        -                  @Nonnull
        -                  java.util.Optional<JobInfo> jobInfo,
        -                  @Nonnull
        -                  java.util.Optional<NotebookInfo> notebookInfo,
        -                  @Nonnull
        -                  java.util.Optional<String> clusterId,
        -                  @Nonnull
        -                  java.util.Optional<Long> readVersion,
        -                  @Nonnull
        -                  java.util.Optional<String> isolationLevel,
        -                  @Nonnull
        -                  java.util.Optional<Boolean> isBlindAppend,
        -                  @Nonnull
        -                  java.util.Optional<java.util.Map<String,String>> operationMetrics,
        -                  @Nonnull
        -                  java.util.Optional<String> userMetadata,
        -                  @Nonnull
        -                  java.util.Optional<String> engineInfo)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        @Nonnull
        -public java.util.Optional<Long> getVersion()
        -
        -
        Returns:
        -
        the log version for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getTimestamp

        -
        @Nullable
        -public java.sql.Timestamp getTimestamp()
        -
        -
        Returns:
        -
        the time the files in this commit were committed
        -
        -
      • -
      - - - -
        -
      • -

        getUserId

        -
        @Nonnull
        -public java.util.Optional<String> getUserId()
        -
        -
        Returns:
        -
        the userId of the user who committed this file
        -
        -
      • -
      - - - -
        -
      • -

        getUserName

        -
        @Nonnull
        -public java.util.Optional<String> getUserName()
        -
        -
        Returns:
        -
        the userName of the user who committed this file
        -
        -
      • -
      - - - -
        -
      • -

        getOperation

        -
        @Nullable
        -public String getOperation()
        -
        -
        Returns:
        -
        the type of operation for this commit. e.g. "WRITE"
        -
        -
      • -
      - - - -
        -
      • -

        getOperationParameters

        -
        @Nullable
        -public java.util.Map<String,String> getOperationParameters()
        -
        -
        Returns:
        -
        any relevant operation parameters. e.g. "mode", "partitionBy"
        -
        -
      • -
      - - - -
        -
      • -

        getJobInfo

        -
        @Nonnull
        -public java.util.Optional<JobInfo> getJobInfo()
        -
        -
        Returns:
        -
        the JobInfo for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getNotebookInfo

        -
        @Nonnull
        -public java.util.Optional<NotebookInfo> getNotebookInfo()
        -
        -
        Returns:
        -
        the NotebookInfo for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getClusterId

        -
        @Nonnull
        -public java.util.Optional<String> getClusterId()
        -
        -
        Returns:
        -
        the ID of the cluster used to generate this commit
        -
        -
      • -
      - - - -
        -
      • -

        getReadVersion

        -
        @Nonnull
        -public java.util.Optional<Long> getReadVersion()
        -
        -
        Returns:
        -
        the version that the transaction used to generate this commit is reading from
        -
        -
      • -
      - - - -
        -
      • -

        getIsolationLevel

        -
        @Nonnull
        -public java.util.Optional<String> getIsolationLevel()
        -
        -
        Returns:
        -
        the isolation level at which this commit was generated
        -
        -
      • -
      - - - -
        -
      • -

        getIsBlindAppend

        -
        @Nonnull
        -public java.util.Optional<Boolean> getIsBlindAppend()
        -
        -
        Returns:
        -
        whether this commit has blindly appended without caring about existing files
        -
        -
      • -
      - - - -
        -
      • -

        getOperationMetrics

        -
        @Nonnull
        -public java.util.Optional<java.util.Map<String,String>> getOperationMetrics()
        -
        -
        Returns:
        -
        any operation metrics calculated
        -
        -
      • -
      - - - -
        -
      • -

        getUserMetadata

        -
        @Nonnull
        -public java.util.Optional<String> getUserMetadata()
        -
        -
        Returns:
        -
        any additional user metadata
        -
        -
      • -
      - - - -
        -
      • -

        getEngineInfo

        -
        @Nonnull
        -public java.util.Optional<String> getEngineInfo()
        -
        -
        Returns:
        -
        the engineInfo of the engine that performed this commit. It should be of the form - "{engineName}/{engineVersion} Delta-Standalone/{deltaStandaloneVersion}"
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html deleted file mode 100644 index b274b9b898b..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - -FileAction (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Interface FileAction

-
-
-
-
    -
  • -
    -
    All Superinterfaces:
    -
    Action
    -
    -
    -
    All Known Implementing Classes:
    -
    AddCDCFile, AddFile, RemoveFile
    -
    -
    -
    -
    public interface FileAction
    -extends Action
    -
    Generic interface for Actions pertaining to the addition and removal of files.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        String getPath()
        -
        -
        Returns:
        -
        the relative path or the absolute path of the file being added or removed by this - action. If it's a relative path, it's relative to the root of the table. Note: the path - is encoded and should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        boolean isDataChange()
        -
        -
        Returns:
        -
        whether any data was changed as a result of this file being added or removed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Format.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Format.html deleted file mode 100644 index 2247daac7e1..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Format.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - -Format (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Format

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      Format() 
      Format(String provider, - java.util.Map<String,String> options) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Format

        -
        public Format(String provider,
        -              java.util.Map<String,String> options)
        -
      • -
      - - - -
        -
      • -

        Format

        -
        public Format()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getProvider

        -
        public String getProvider()
        -
        -
        Returns:
        -
        the name of the encoding for files in this table
        -
        -
      • -
      - - - -
        -
      • -

        getOptions

        -
        public java.util.Map<String,String> getOptions()
        -
        -
        Returns:
        -
        an unmodifiable Map containing configuration options for - the format
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html deleted file mode 100644 index c7071ff9a05..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - -JobInfo.Builder (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class JobInfo.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    JobInfo
    -
    -
    -
    -
    public static class JobInfo.Builder
    -extends Object
    -
    Builder class for JobInfo. Enables construction of JobInfos with default - values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder(String jobId)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - - - - - -
        -
      • -

        jobOwnerId

        -
        public JobInfo.Builder jobOwnerId(String jobOwnerId)
        -
      • -
      - - - -
        -
      • -

        triggerType

        -
        public JobInfo.Builder triggerType(String triggerType)
        -
      • -
      - - - -
        -
      • -

        build

        -
        public JobInfo build()
        -
        Builds a JobInfo using the provided parameters. If a parameter is not provided - its default values is used.
        -
        -
        Returns:
        -
        a new JobInfo with the properties added to the builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html deleted file mode 100644 index 0883586ef14..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html +++ /dev/null @@ -1,402 +0,0 @@ - - - - - -JobInfo (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class JobInfo

-
-
- -
-
    -
  • -
    -
    -
    public class JobInfo
    -extends Object
    -
    Represents the Databricks Job information that committed to the Delta table.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        JobInfo

        -
        public JobInfo(String jobId,
        -               String jobName,
        -               String runId,
        -               String jobOwnerId,
        -               String triggerType)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getJobId

        -
        public String getJobId()
        -
      • -
      - - - -
        -
      • -

        getJobName

        -
        public String getJobName()
        -
      • -
      - - - -
        -
      • -

        getRunId

        -
        public String getRunId()
        -
      • -
      - - - -
        -
      • -

        getJobOwnerId

        -
        public String getJobOwnerId()
        -
      • -
      - - - -
        -
      • -

        getTriggerType

        -
        public String getTriggerType()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html deleted file mode 100644 index 38d3e2d92f1..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html +++ /dev/null @@ -1,408 +0,0 @@ - - - - - -Metadata.Builder (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Metadata.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    Metadata
    -
    -
    -
    -
    public static final class Metadata.Builder
    -extends Object
    -
    Builder class for Metadata. Enables construction of Metadatas with default - values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder()
        -
      • -
      -
    • -
    - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html deleted file mode 100644 index 67c349ce2dc..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html +++ /dev/null @@ -1,530 +0,0 @@ - - - - - -Metadata (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Metadata

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public final class Metadata
    -extends Object
    -implements Action
    -
    Updates the metadata of the table. The first version of a table must contain - a Metadata action. Subsequent Metadata actions completely - overwrite the current metadata of the table. It is the responsibility of the - writer to ensure that any data already present in the table is still valid - after any change. There can be at most one Metadata action in a - given version of the table.
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Change Metadata
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Metadata

        -
        public Metadata(@Nonnull
        -                String id,
        -                @Nullable
        -                String name,
        -                @Nullable
        -                String description,
        -                @Nonnull
        -                Format format,
        -                @Nonnull
        -                java.util.List<String> partitionColumns,
        -                @Nonnull
        -                java.util.Map<String,String> configuration,
        -                @Nonnull
        -                java.util.Optional<Long> createdTime,
        -                @Nullable
        -                StructType schema)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getId

        -
        @Nonnull
        -public String getId()
        -
        -
        Returns:
        -
        the unique identifier for this table
        -
        -
      • -
      - - - -
        -
      • -

        getName

        -
        @Nullable
        -public String getName()
        -
        -
        Returns:
        -
        the user-provided identifier for this table
        -
        -
      • -
      - - - -
        -
      • -

        getDescription

        -
        @Nullable
        -public String getDescription()
        -
        -
        Returns:
        -
        the user-provided description for this table
        -
        -
      • -
      - - - -
        -
      • -

        getFormat

        -
        @Nonnull
        -public Format getFormat()
        -
        -
        Returns:
        -
        the Format for this table
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionColumns

        -
        @Nonnull
        -public java.util.List<String> getPartitionColumns()
        -
        -
        Returns:
        -
        an unmodifiable java.util.List containing the names of - columns by which the data should be partitioned
        -
        -
      • -
      - - - -
        -
      • -

        getConfiguration

        -
        @Nonnull
        -public java.util.Map<String,String> getConfiguration()
        -
        -
        Returns:
        -
        an unmodifiable java.util.Map containing configuration - options for this metadata
        -
        -
      • -
      - - - -
        -
      • -

        getCreatedTime

        -
        @Nonnull
        -public java.util.Optional<Long> getCreatedTime()
        -
        -
        Returns:
        -
        the time when this metadata action was created, in milliseconds - since the Unix epoch
        -
        -
      • -
      - - - -
        -
      • -

        getSchema

        -
        @Nullable
        -public StructType getSchema()
        -
        -
        Returns:
        -
        the schema of the table as a StructType
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html deleted file mode 100644 index 2137d537c82..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - -NotebookInfo (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class NotebookInfo

-
-
- -
-
    -
  • -
    -
    -
    public class NotebookInfo
    -extends Object
    -
    Represents the Databricks Notebook information that committed to the Delta table.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      NotebookInfo(String notebookId) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        NotebookInfo

        -
        public NotebookInfo(String notebookId)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getNotebookId

        -
        public String getNotebookId()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html deleted file mode 100644 index c935789aaf0..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html +++ /dev/null @@ -1,345 +0,0 @@ - - - - - -Protocol (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Protocol

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public final class Protocol
    -extends Object
    -implements Action
    -
    Used to block older clients from reading or writing the log when backwards - incompatible changes are made to the protocol. Readers and writers are - responsible for checking that they meet the minimum versions before performing - any other operations. -

    - Since this action allows us to explicitly block older clients in the case of a - breaking change to the protocol, clients should be tolerant of messages and - fields that they do not understand.

    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Protocol Evolution
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Protocol(int minReaderVersion, - int minWriterVersion) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Protocol

        -
        public Protocol(int minReaderVersion,
        -                int minWriterVersion)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getMinReaderVersion

        -
        public int getMinReaderVersion()
        -
        -
        Returns:
        -
        the minimum version of the Delta read protocol that a client must implement in order - to correctly read this table
        -
        -
      • -
      - - - -
        -
      • -

        getMinWriterVersion

        -
        public int getMinWriterVersion()
        -
        -
        Returns:
        -
        the minimum version of the Delta write protocol that a client must implement in order - to correctly write this table
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html deleted file mode 100644 index 62f444a1c2f..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html +++ /dev/null @@ -1,471 +0,0 @@ - - - - - -RemoveFile (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class RemoveFile

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      RemoveFile(String path, - java.util.Optional<Long> deletionTimestamp, - boolean dataChange, - boolean extendedFileMetadata, - java.util.Map<String,String> partitionValues, - java.util.Optional<Long> size, - java.util.Map<String,String> tags) -
      Deprecated.  -
      RemoveFile should be created from AddFile.remove() instead.
      -
      -
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        RemoveFile

        -
        @Deprecated
        -public RemoveFile(@Nonnull
        -                              String path,
        -                              @Nonnull
        -                              java.util.Optional<Long> deletionTimestamp,
        -                              boolean dataChange,
        -                              boolean extendedFileMetadata,
        -                              @Nullable
        -                              java.util.Map<String,String> partitionValues,
        -                              @Nonnull
        -                              java.util.Optional<Long> size,
        -                              @Nullable
        -                              java.util.Map<String,String> tags)
        -
        Deprecated. RemoveFile should be created from AddFile.remove() instead.
        -
        Users should not construct RemoveFiles themselves, and should instead use one - of the various AddFile.remove() methods to instantiate the correct RemoveFile - for a given AddFile instance.
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be removed from the table. If it's - a relative path, it's relative to the root of the table. Note: the path is encoded - and should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getDeletionTimestamp

        -
        public java.util.Optional<Long> getDeletionTimestamp()
        -
        -
        Returns:
        -
        the time that this file was deleted as milliseconds since the epoch
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being removed. When - false the records in the removed file must be contained in one or more add - actions in the same version
        -
        -
      • -
      - - - -
        -
      • -

        isExtendedFileMetadata

        -
        public boolean isExtendedFileMetadata()
        -
        -
        Returns:
        -
        true if the fields partitionValues, size, and tags are - present
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nullable
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public java.util.Optional<Long> getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html deleted file mode 100644 index ee5ef4d73b1..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - -SetTransaction (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class SetTransaction

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      SetTransaction(String appId, - long version, - java.util.Optional<Long> lastUpdated) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        SetTransaction

        -
        public SetTransaction(@Nonnull
        -                      String appId,
        -                      long version,
        -                      @Nonnull
        -                      java.util.Optional<Long> lastUpdated)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getAppId

        -
        @Nonnull
        -public String getAppId()
        -
        -
        Returns:
        -
        the unique identifier for the application performing the transaction
        -
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the application-specific numeric identifier for this transaction
        -
        -
      • -
      - - - -
        -
      • -

        getLastUpdated

        -
        @Nonnull
        -public java.util.Optional<Long> getLastUpdated()
        -
        -
        Returns:
        -
        the time when this transaction action was created, in milliseconds since the Unix - epoch
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html deleted file mode 100644 index 80f9ca7a5cb..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -io.delta.standalone.actions (Delta Standalone 0.4.1 JavaDoc) - - - - - -

io.delta.standalone.actions

-
-

Interfaces

- -

Classes

- -
- - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html deleted file mode 100644 index 071143cd49a..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - -io.delta.standalone.actions (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.actions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html deleted file mode 100644 index ca1bab3bfc3..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - -io.delta.standalone.actions Class Hierarchy (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.actions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html deleted file mode 100644 index c3596c00f8f..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - -CloseableIterator (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.data
-

Interface CloseableIterator<T>

-
-
-
-
    -
  • -
    -
    All Superinterfaces:
    -
    AutoCloseable, java.io.Closeable, java.util.Iterator<T>
    -
    -
    -
    -
    public interface CloseableIterator<T>
    -extends java.util.Iterator<T>, java.io.Closeable
    -
    An Iterator that also implements the Closeable interface. The caller - should call Closeable.close() method to free all resources properly after using the iterator.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from interface java.util.Iterator

        -forEachRemaining, hasNext, next, remove
      • -
      -
        -
      • - - -

        Methods inherited from interface java.io.Closeable

        -close
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html deleted file mode 100644 index 938c515b5de..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html +++ /dev/null @@ -1,682 +0,0 @@ - - - - - -RowRecord (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.data
-

Interface RowRecord

-
-
-
-
    -
  • -
    -
    -
    public interface RowRecord
    -
    Represents one row of data containing a non-empty collection of fieldName - value pairs. - It provides APIs to allow retrieval of values through fieldName lookup. For example, - -
    
    -   if (row.isNullAt("int_field")) {
    -     // handle the null value.
    -   } else {
    -     int x = getInt("int_field");
    -   }
    - 
    -
    -
    See Also:
    -
    StructType, -StructField
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Abstract Methods 
      Modifier and TypeMethod and Description
      java.math.BigDecimalgetBigDecimal(String fieldName) -
      Retrieves value from data record and returns the value as a java.math.BigDecimal.
      -
      byte[]getBinary(String fieldName) -
      Retrieves value from data record and returns the value as binary (byte array).
      -
      booleangetBoolean(String fieldName) -
      Retrieves value from data record and returns the value as a primitive boolean.
      -
      bytegetByte(String fieldName) -
      Retrieves value from data record and returns the value as a primitive byte.
      -
      java.sql.DategetDate(String fieldName) -
      Retrieves value from data record and returns the value as a java.sql.Date.
      -
      doublegetDouble(String fieldName) -
      Retrieves value from data record and returns the value as a primitive double.
      -
      floatgetFloat(String fieldName) -
      Retrieves value from data record and returns the value as a primitive float.
      -
      intgetInt(String fieldName) -
      Retrieves value from data record and returns the value as a primitive int.
      -
      intgetLength() 
      <T> java.util.List<T>getList(String fieldName) -
      Retrieves value from data record and returns the value as a java.util.List<T> object.
      -
      longgetLong(String fieldName) -
      Retrieves value from data record and returns the value as a primitive long.
      -
      <K,V> java.util.Map<K,V>getMap(String fieldName) -
      Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
      -
      RowRecordgetRecord(String fieldName) -
      Retrieves value from data record and returns the value as a RowRecord object.
      -
      StructTypegetSchema() 
      shortgetShort(String fieldName) -
      Retrieves value from data record and returns the value as a primitive short.
      -
      StringgetString(String fieldName) -
      Retrieves value from data record and returns the value as a String object.
      -
      java.sql.TimestampgetTimestamp(String fieldName) -
      Retrieves value from data record and returns the value as a java.sql.Timestamp.
      -
      booleanisNullAt(String fieldName) 
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        getLength

        -
        int getLength()
        -
        -
        Returns:
        -
        the number of elements in this RowRecord
        -
        -
      • -
      - - - -
        -
      • -

        isNullAt

        -
        boolean isNullAt(String fieldName)
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        whether the value of field fieldName is null
        -
        -
      • -
      - - - -
        -
      • -

        getInt

        -
        int getInt(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive int.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive int
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getLong

        -
        long getLong(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive long.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive long
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getByte

        -
        byte getByte(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive byte.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive byte
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getShort

        -
        short getShort(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive short.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive short
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBoolean

        -
        boolean getBoolean(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive boolean.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive boolean
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getFloat

        -
        float getFloat(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive float.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive float
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getDouble

        -
        double getDouble(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive double.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive double
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getString

        -
        String getString(String fieldName)
        -
        Retrieves value from data record and returns the value as a String object.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a String object. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBinary

        -
        byte[] getBinary(String fieldName)
        -
        Retrieves value from data record and returns the value as binary (byte array).
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as binary (byte array). null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBigDecimal

        -
        java.math.BigDecimal getBigDecimal(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.math.BigDecimal.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.math.BigDecimal. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getTimestamp

        -
        java.sql.Timestamp getTimestamp(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.sql.Timestamp.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.sql.Timestamp. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getDate

        -
        java.sql.Date getDate(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.sql.Date.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.sql.Date. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getRecord

        -
        RowRecord getRecord(String fieldName)
        -
        Retrieves value from data record and returns the value as a RowRecord object.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a RowRecord object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any nested field, if that field is not - nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getList

        -
        <T> java.util.List<T> getList(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.util.List<T> object.
        -
        -
        Type Parameters:
        -
        T - element type
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a java.util.List<T> object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any element field, if that field is not - nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getMap

        -
        <K,V> java.util.Map<K,V> getMap(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
        -
        -
        Type Parameters:
        -
        K - key type
        -
        V - value type
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a java.util.Map<K, V> object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any key/value field, if that field is not - nullable and null data value read
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/package-frame.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/package-frame.html deleted file mode 100644 index ebe08d37c40..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -io.delta.standalone.data (Delta Standalone 0.4.1 JavaDoc) - - - - - -

io.delta.standalone.data

-
-

Interfaces

- -
- - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/package-summary.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/package-summary.html deleted file mode 100644 index cb4b5272d4e..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/package-summary.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - -io.delta.standalone.data (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.data

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/package-tree.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/package-tree.html deleted file mode 100644 index 4d72b36a3e6..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/data/package-tree.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - -io.delta.standalone.data Class Hierarchy (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.data

-Package Hierarchies: - -
-
-

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html deleted file mode 100644 index 1b87a52ddbd..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentAppendException (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentAppendException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentAppendException
    -extends DeltaConcurrentModificationException
    -
    Thrown when files are added that would have been read by the current transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentAppendException

        -
        public ConcurrentAppendException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html deleted file mode 100644 index da1063da767..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentDeleteDeleteException (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentDeleteDeleteException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentDeleteDeleteException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the current transaction deletes data that was deleted by a concurrent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentDeleteDeleteException

        -
        public ConcurrentDeleteDeleteException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html deleted file mode 100644 index 019f8d624b6..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentDeleteReadException (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentDeleteReadException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentDeleteReadException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the current transaction reads data that was deleted by a concurrent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentDeleteReadException

        -
        public ConcurrentDeleteReadException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html deleted file mode 100644 index 2e7b9c30d96..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentTransactionException (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentTransactionException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentTransactionException
    -extends DeltaConcurrentModificationException
    -
    Thrown when concurrent transaction both attempt to update the same idempotent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentTransactionException

        -
        public ConcurrentTransactionException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html deleted file mode 100644 index 2c24f910a19..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html +++ /dev/null @@ -1,275 +0,0 @@ - - - - - -DeltaConcurrentModificationException (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class DeltaConcurrentModificationException

-
-
- -
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DeltaConcurrentModificationException

        -
        public DeltaConcurrentModificationException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html deleted file mode 100644 index 6778fffd368..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - -DeltaStandaloneException (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class DeltaStandaloneException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class DeltaStandaloneException
    -extends RuntimeException
    -
    Thrown when a query fails, usually because the query itself is invalid.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException()
        -
      • -
      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException(String message)
        -
      • -
      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException(String message,
        -                                Throwable cause)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html deleted file mode 100644 index baf3efc130c..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - -MetadataChangedException (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class MetadataChangedException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class MetadataChangedException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the metadata of the Delta table has changed between the time of read - and the time of commit.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MetadataChangedException

        -
        public MetadataChangedException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html deleted file mode 100644 index cc5816e1cd7..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ProtocolChangedException (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ProtocolChangedException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ProtocolChangedException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the protocol version has changed between the time of read and the time of commit.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ProtocolChangedException

        -
        public ProtocolChangedException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html deleted file mode 100644 index 72c37f62034..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -io.delta.standalone.exceptions (Delta Standalone 0.4.1 JavaDoc) - - - - - -

io.delta.standalone.exceptions

-
-

Exceptions

- -
- - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html deleted file mode 100644 index 49137bd3080..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - -io.delta.standalone.exceptions (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.exceptions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html deleted file mode 100644 index 2fcb876bc1c..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - -io.delta.standalone.exceptions Class Hierarchy (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.exceptions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/And.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/And.html deleted file mode 100644 index ccc89c5d78e..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/And.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - -And (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class And

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class And
    -extends BinaryOperator
    -implements Predicate
    -
    Evaluates logical expr1 AND expr2 for new And(expr1, expr2). -

    - Requires both left and right input expressions evaluate to booleans.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object leftResult,
        -                           Object rightResult)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html deleted file mode 100644 index 806230e2214..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - -BinaryComparison (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryComparison

-
-
- -
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html deleted file mode 100644 index ac466a381f5..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html +++ /dev/null @@ -1,340 +0,0 @@ - - - - - -BinaryExpression (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryExpression

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    BinaryOperator
    -
    -
    -
    -
    public abstract class BinaryExpression
    -extends Object
    -implements Expression
    -
    An Expression with two inputs and one output. The output is by default evaluated to null - if either input is evaluated to null.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - - - - - -
        -
      • -

        eval

        -
        public final Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html deleted file mode 100644 index 5686ce4bf7c..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - -BinaryOperator (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryOperator

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    And, BinaryComparison, Or
    -
    -
    -
    -
    public abstract class BinaryOperator
    -extends BinaryExpression
    -
    A BinaryExpression that is an operator, meaning the string representation is - x symbol y, rather than funcName(x, y). -

    - Requires both inputs to be of the same data type.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Column.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Column.html deleted file mode 100644 index 087e9936030..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Column.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - -Column (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Column

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Column

        -
        public Column(String name,
        -              DataType dataType)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        name

        -
        public String name()
        -
      • -
      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        dataType

        -
        public DataType dataType()
        -
        -
        Returns:
        -
        the DataType of the result of evaluating this expression.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        public java.util.Set<String> references()
        -
        -
        Specified by:
        -
        references in interface Expression
        -
        Overrides:
        -
        references in class LeafExpression
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Specified by:
        -
        equals in class LeafExpression
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html deleted file mode 100644 index ce7569357dd..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -EqualTo (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class EqualTo

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html deleted file mode 100644 index dd79018b1e7..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - -Expression (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Interface Expression

-
-
-
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        Object eval(RowRecord record)
        -
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        dataType

        -
        DataType dataType()
        -
        -
        Returns:
        -
        the DataType of the result of evaluating this expression.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        String toString()
        -
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        default java.util.Set<String> references()
        -
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        java.util.List<Expression> children()
        -
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html deleted file mode 100644 index a4cf25c10e5..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -GreaterThan (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class GreaterThan

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html deleted file mode 100644 index 6d6254321bf..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -GreaterThanOrEqual (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class GreaterThanOrEqual

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class GreaterThanOrEqual
    -extends BinaryComparison
    -implements Predicate
    -
    Evaluates expr1 >= expr2 for new GreaterThanOrEqual(expr1, expr2).
    -
  • -
-
-
- -
-
-
    -
  • - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/In.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/In.html deleted file mode 100644 index d2aba20e66d..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/In.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - -In (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class In

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class In
    -extends Object
    -implements Predicate
    -
    Evaluates if expr is in exprList for new In(expr, exprList). True if - expr is equal to any expression in exprList, else false.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      In(Expression value, - java.util.List<? extends Expression> elems) 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      java.util.List<Expression>children() 
      Booleaneval(RowRecord record) -
      This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide.
      -
      StringtoString() 
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      - - -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        In

        -
        public In(Expression value,
        -          java.util.List<? extends Expression> elems)
        -
        -
        Parameters:
        -
        value - a nonnull expression
        -
        elems - a nonnull, nonempty list of expressions with the same data type as - value
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Boolean eval(RowRecord record)
        -
        This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide. The logic is as follows: -
          -
        • TRUE if the non-NULL value is found in the list
        • -
        • FALSE if the non-NULL value is not found in the list and the list does not contain - NULL values
        • -
        • NULL if the value is NULL, or the non-NULL value is not found in the list and the - list contains at least one NULL value
        • -
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        See Also:
        -
        NULL Semantics
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html deleted file mode 100644 index 4ba86747c41..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - -IsNotNull (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class IsNotNull

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        IsNotNull

        -
        public IsNotNull(Expression child)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Overrides:
        -
        eval in class UnaryExpression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html deleted file mode 100644 index 9d94fa2ff9e..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - -IsNull (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class IsNull

-
-
- -
- -
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Overrides:
        -
        eval in class UnaryExpression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html deleted file mode 100644 index 212be12c8eb..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - -LeafExpression (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LeafExpression

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        public java.util.Set<String> references()
        -
        -
        Specified by:
        -
        references in interface Expression
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public abstract boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public abstract int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html deleted file mode 100644 index 112b1f7f13e..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -LessThan (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LessThan

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html deleted file mode 100644 index 14bf1cf1a2a..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -LessThanOrEqual (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LessThanOrEqual

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html deleted file mode 100644 index 4284e8341aa..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html +++ /dev/null @@ -1,617 +0,0 @@ - - - - - -Literal (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Literal

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Not.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Not.html deleted file mode 100644 index e3c445366ba..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Not.html +++ /dev/null @@ -1,324 +0,0 @@ - - - - - -Not (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Not

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class Not
    -extends UnaryExpression
    -implements Predicate
    -
    Evaluates logical NOT expr for new Not(expr). -

    - Requires the child expression evaluates to a boolean.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object childResult)
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Or.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Or.html deleted file mode 100644 index adbce9bd4a3..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Or.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - -Or (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Or

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class Or
    -extends BinaryOperator
    -implements Predicate
    -
    Evaluates logical expr1 OR expr2 for new Or(expr1, expr2). -

    - Requires both left and right input expressions evaluate to booleans.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object leftResult,
        -                           Object rightResult)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html deleted file mode 100644 index e7cfa7e80a2..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - -Predicate (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Interface Predicate

-
-
-
- -
-
- -
-
-
    -
  • - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html deleted file mode 100644 index 2d0011d8402..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - -UnaryExpression (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class UnaryExpression

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    IsNotNull, IsNull, Not
    -
    -
    -
    -
    public abstract class UnaryExpression
    -extends Object
    -implements Expression
    -
    An Expression with one input and one output. The output is by default evaluated to null - if the input is evaluated to null.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html deleted file mode 100644 index 6f13259b045..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - -io.delta.standalone.expressions (Delta Standalone 0.4.1 JavaDoc) - - - - - -

io.delta.standalone.expressions

-
-

Interfaces

- -

Classes

- -
- - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html deleted file mode 100644 index b836cdf2769..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - -io.delta.standalone.expressions (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.expressions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html deleted file mode 100644 index 127bdedadc8..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - -io.delta.standalone.expressions Class Hierarchy (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.expressions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/package-frame.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/package-frame.html deleted file mode 100644 index cc5173173f3..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/package-frame.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -io.delta.standalone (Delta Standalone 0.4.1 JavaDoc) - - - - - -

io.delta.standalone

-
-

Interfaces

- -

Classes

- -

Enums

- -
- - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/package-summary.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/package-summary.html deleted file mode 100644 index e6122554d8d..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/package-summary.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - -io.delta.standalone (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/package-tree.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/package-tree.html deleted file mode 100644 index b9df26e5ece..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/package-tree.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - -io.delta.standalone Class Hierarchy (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/LogStore.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/LogStore.html deleted file mode 100644 index d9b64637b35..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/LogStore.html +++ /dev/null @@ -1,478 +0,0 @@ - - - - - -LogStore (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.storage
-

Class LogStore

-
-
- -
-
    -
  • -
    -
    -
    public abstract class LogStore
    -extends Object
    -
    :: DeveloperApi :: -

    - General interface for all critical file system operations required to read and write the - Delta logs. The correctness is predicated on the atomicity and durability guarantees of - the implementation of this interface. Specifically, -

      -
    1. - Atomic visibility of files: If isPartialWriteVisible is false, any file written through - this store must be made visible atomically. In other words, this should not generate - partial files. -
    2. -
    3. - Mutual exclusion: Only one writer must be able to create (or rename) a file at the final - destination. -
    4. -
    5. - Consistent listing: Once a file has been written in a directory, all future listings for - that directory must return that file. -
    6. -
    -

    - All subclasses of this interface are required to have a constructor that takes - Configuration as a single parameter. This constructor is used to dynamically create the - LogStore. -

    - LogStore and its implementations are not meant for direct access but for configuration based - on storage system.

    -
    -
    Since:
    -
    0.3.0
    -
    See Also:
    -
    Delta Storage
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      LogStore(org.apache.hadoop.conf.Configuration initHadoopConf) 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Abstract Methods Concrete Methods 
      Modifier and TypeMethod and Description
      org.apache.hadoop.conf.ConfigurationinitHadoopConf() -
      :: DeveloperApi ::
      -
      abstract BooleanisPartialWriteVisible(org.apache.hadoop.fs.Path path, - org.apache.hadoop.conf.Configuration hadoopConf) -
      :: DeveloperApi ::
      -
      abstract java.util.Iterator<org.apache.hadoop.fs.FileStatus>listFrom(org.apache.hadoop.fs.Path path, - org.apache.hadoop.conf.Configuration hadoopConf) -
      :: DeveloperApi ::
      -
      abstract CloseableIterator<String>read(org.apache.hadoop.fs.Path path, - org.apache.hadoop.conf.Configuration hadoopConf) -
      :: DeveloperApi ::
      -
      abstract org.apache.hadoop.fs.PathresolvePathOnPhysicalStorage(org.apache.hadoop.fs.Path path, - org.apache.hadoop.conf.Configuration hadoopConf) -
      :: DeveloperApi ::
      -
      abstract voidwrite(org.apache.hadoop.fs.Path path, - java.util.Iterator<String> actions, - Boolean overwrite, - org.apache.hadoop.conf.Configuration hadoopConf) -
      :: DeveloperApi ::
      -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        LogStore

        -
        public LogStore(org.apache.hadoop.conf.Configuration initHadoopConf)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        initHadoopConf

        -
        public org.apache.hadoop.conf.Configuration initHadoopConf()
        -
        :: DeveloperApi :: -

        - Hadoop configuration that should only be used during initialization of LogStore. Each method - should use their hadoopConf parameter rather than this (potentially outdated) hadoop - configuration.

        -
        -
        Returns:
        -
        the initial hadoop configuration.
        -
        -
      • -
      - - - -
        -
      • -

        read

        -
        public abstract CloseableIterator<String> read(org.apache.hadoop.fs.Path path,
        -                                               org.apache.hadoop.conf.Configuration hadoopConf)
        -
        :: DeveloperApi :: -

        - Load the given file and return an Iterator of lines, with line breaks removed from - each line. Callers of this function are responsible to close the iterator if they are done - with it.

        -
        -
        Parameters:
        -
        path - the path to load
        -
        hadoopConf - the latest hadoopConf
        -
        Returns:
        -
        the CloseableIterator of lines in the given file.
        -
        Since:
        -
        0.3.0
        -
        -
      • -
      - - - -
        -
      • -

        write

        -
        public abstract void write(org.apache.hadoop.fs.Path path,
        -                           java.util.Iterator<String> actions,
        -                           Boolean overwrite,
        -                           org.apache.hadoop.conf.Configuration hadoopConf)
        -                    throws java.nio.file.FileAlreadyExistsException
        -
        :: DeveloperApi :: -

        - Write the given actions to the given Path with or without overwrite as indicated. -

        - Implementation must throw FileAlreadyExistsException exception if the - file already exists and overwrite = false. Furthermore, if - isPartialWriteVisible(org.apache.hadoop.fs.Path, org.apache.hadoop.conf.Configuration) returns false, implementation must ensure that the - entire file is made visible atomically, that is, it should not generate partial files.

        -
        -
        Parameters:
        -
        path - the path to write to
        -
        actions - actions to be written
        -
        overwrite - if true, overwrites the file if it already exists
        -
        hadoopConf - the latest hadoopConf
        -
        Throws:
        -
        java.nio.file.FileAlreadyExistsException - if the file already exists and overwrite is - false
        -
        Since:
        -
        0.3.0
        -
        -
      • -
      - - - -
        -
      • -

        listFrom

        -
        public abstract java.util.Iterator<org.apache.hadoop.fs.FileStatus> listFrom(org.apache.hadoop.fs.Path path,
        -                                                                             org.apache.hadoop.conf.Configuration hadoopConf)
        -                                                                      throws java.io.FileNotFoundException
        -
        :: DeveloperApi :: -

        - List the paths in the same directory that are lexicographically greater or equal to - (UTF-8 sorting) the given Path. The result should also be sorted by the file name.

        -
        -
        Parameters:
        -
        path - the path to load
        -
        hadoopConf - the latest hadoopConf
        -
        Returns:
        -
        an Iterator of the paths lexicographically greater or equal to (UTF-8 sorting) the - given Path
        -
        Throws:
        -
        java.io.FileNotFoundException - if the file does not exist
        -
        Since:
        -
        0.3.0
        -
        -
      • -
      - - - -
        -
      • -

        resolvePathOnPhysicalStorage

        -
        public abstract org.apache.hadoop.fs.Path resolvePathOnPhysicalStorage(org.apache.hadoop.fs.Path path,
        -                                                                       org.apache.hadoop.conf.Configuration hadoopConf)
        -
        :: DeveloperApi :: -

        - Resolve the fully qualified path for the given Path.

        -
        -
        Parameters:
        -
        path - the path to resolve
        -
        hadoopConf - the latest hadoopConf
        -
        Returns:
        -
        the resolved path
        -
        Since:
        -
        0.3.0
        -
        -
      • -
      - - - -
        -
      • -

        isPartialWriteVisible

        -
        public abstract Boolean isPartialWriteVisible(org.apache.hadoop.fs.Path path,
        -                                              org.apache.hadoop.conf.Configuration hadoopConf)
        -
        :: DeveloperApi :: -

        - Whether a partial write is visible for the underlying file system of the given Path.

        -
        -
        Parameters:
        -
        path - the path in question
        -
        hadoopConf - the latest hadoopConf
        -
        Returns:
        -
        true if partial writes are visible for the given Path, else false
        -
        Since:
        -
        0.3.0
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/package-frame.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/package-frame.html deleted file mode 100644 index e4bca503f86..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/package-frame.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - -io.delta.standalone.storage (Delta Standalone 0.4.1 JavaDoc) - - - - - -

io.delta.standalone.storage

-
-

Classes

- -
- - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/package-summary.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/package-summary.html deleted file mode 100644 index 16561c51612..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/package-summary.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - -io.delta.standalone.storage (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.storage

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/package-tree.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/package-tree.html deleted file mode 100644 index 92b33de5e53..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/storage/package-tree.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - -io.delta.standalone.storage Class Hierarchy (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.storage

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html deleted file mode 100644 index a07294b0008..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - -ArrayType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ArrayType

-
-
- -
-
    -
  • -
    -
    -
    public final class ArrayType
    -extends DataType
    -
    The data type for collections of multiple values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ArrayType

        -
        public ArrayType(DataType elementType,
        -                 boolean containsNull)
        -
        -
        Parameters:
        -
        elementType - the data type of values
        -
        containsNull - indicates if values have null value
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getElementType

        -
        public DataType getElementType()
        -
        -
        Returns:
        -
        the type of array elements
        -
        -
      • -
      - - - -
        -
      • -

        containsNull

        -
        public boolean containsNull()
        -
        -
        Returns:
        -
        true if the array has null values, else false
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html deleted file mode 100644 index 9ed8d7dc76a..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -BinaryType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class BinaryType

-
-
- -
-
    -
  • -
    -
    -
    public final class BinaryType
    -extends DataType
    -
    The data type representing byte[] values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BinaryType

        -
        public BinaryType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html deleted file mode 100644 index f482e298427..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -BooleanType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class BooleanType

-
-
- -
-
    -
  • -
    -
    -
    public final class BooleanType
    -extends DataType
    -
    The data type representing boolean values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BooleanType

        -
        public BooleanType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/ByteType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/ByteType.html deleted file mode 100644 index 8d9b20a1752..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/ByteType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -ByteType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ByteType

-
-
- -
-
    -
  • -
    -
    -
    public final class ByteType
    -extends DataType
    -
    The data type representing byte values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ByteType

        -
        public ByteType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DataType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DataType.html deleted file mode 100644 index 442dcdf40c0..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DataType.html +++ /dev/null @@ -1,383 +0,0 @@ - - - - - -DataType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DataType

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DataType

        -
        public DataType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getTypeName

        -
        public String getTypeName()
        -
        -
        Returns:
        -
        the name of the type used in JSON serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      - - - -
        -
      • -

        getCatalogString

        -
        public String getCatalogString()
        -
        -
        Returns:
        -
        a String representation for the type saved in external catalogs
        -
        -
      • -
      - - - -
        -
      • -

        toJson

        -
        public String toJson()
        -
        -
        Returns:
        -
        a JSON String representation of the type
        -
        -
      • -
      - - - -
        -
      • -

        toPrettyJson

        -
        public String toPrettyJson()
        -
        -
        Returns:
        -
        a pretty (i.e. indented) JSON String representation of the type
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DateType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DateType.html deleted file mode 100644 index e54c704f495..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DateType.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - -DateType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DateType

-
-
- -
-
    -
  • -
    -
    -
    public final class DateType
    -extends DataType
    -
    A date type, supporting "0001-01-01" through "9999-12-31". - Internally, this is represented as the number of days from 1970-01-01.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DateType

        -
        public DateType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html deleted file mode 100644 index cc40e1e2297..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html +++ /dev/null @@ -1,381 +0,0 @@ - - - - - -DecimalType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DecimalType

-
-
- -
-
    -
  • -
    -
    -
    public final class DecimalType
    -extends DataType
    -
    The data type representing java.math.BigDecimal values. - A Decimal that must have fixed precision (the maximum number of digits) and scale (the number - of digits on right side of dot). - - The precision can be up to 38, scale can also be up to 38 (less or equal to precision). - - The default precision and scale is (10, 0).
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        USER_DEFAULT

        -
        public static final DecimalType USER_DEFAULT
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DecimalType

        -
        public DecimalType(int precision,
        -                   int scale)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPrecision

        -
        public int getPrecision()
        -
        -
        Returns:
        -
        the maximum number of digits of the decimal
        -
        -
      • -
      - - - -
        -
      • -

        getScale

        -
        public int getScale()
        -
        -
        Returns:
        -
        the number of digits on the right side of the decimal point (dot)
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html deleted file mode 100644 index bc27a4ebe03..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -DoubleType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DoubleType

-
-
- -
-
    -
  • -
    -
    -
    public final class DoubleType
    -extends DataType
    -
    The data type representing double values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DoubleType

        -
        public DoubleType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html deleted file mode 100644 index e429491f83d..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html +++ /dev/null @@ -1,441 +0,0 @@ - - - - - -FieldMetadata.Builder (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FieldMetadata.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    FieldMetadata
    -
    -
    -
    -
    public static class FieldMetadata.Builder
    -extends Object
    -
    Builder class for FieldMetadata.
    -
  • -
-
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html deleted file mode 100644 index 76f7ea52161..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html +++ /dev/null @@ -1,368 +0,0 @@ - - - - - -FieldMetadata (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FieldMetadata

-
-
- -
-
    -
  • -
    -
    -
    public final class FieldMetadata
    -extends Object
    -
    The metadata for a given StructField.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getEntries

        -
        public java.util.Map<String,Object> getEntries()
        -
        -
        Returns:
        -
        list of the key-value pairs in this FieldMetadata
        -
        -
      • -
      - - - -
        -
      • -

        contains

        -
        public boolean contains(String key)
        -
        -
        Parameters:
        -
        key - the key to check for
        -
        Returns:
        -
        True if this contains a mapping for the given key, False otherwise
        -
        -
      • -
      - - - -
        -
      • -

        get

        -
        public Object get(String key)
        -
        -
        Parameters:
        -
        key - the key to check for
        -
        Returns:
        -
        the value to which the specified key is mapped, or null if there is no mapping for - the given key
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Overrides:
        -
        toString in class Object
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/FloatType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/FloatType.html deleted file mode 100644 index 489467e3b17..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/FloatType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -FloatType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FloatType

-
-
- -
-
    -
  • -
    -
    -
    public final class FloatType
    -extends DataType
    -
    The data type representing float values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        FloatType

        -
        public FloatType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html deleted file mode 100644 index 2c9ff49bf82..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -IntegerType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class IntegerType

-
-
- -
-
    -
  • -
    -
    -
    public final class IntegerType
    -extends DataType
    -
    The data type representing int values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        IntegerType

        -
        public IntegerType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/LongType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/LongType.html deleted file mode 100644 index cd9a2e80669..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/LongType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -LongType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class LongType

-
-
- -
-
    -
  • -
    -
    -
    public final class LongType
    -extends DataType
    -
    The data type representing long values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        LongType

        -
        public LongType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/MapType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/MapType.html deleted file mode 100644 index 3c12cfae74a..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/MapType.html +++ /dev/null @@ -1,364 +0,0 @@ - - - - - -MapType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class MapType

-
-
- -
-
    -
  • -
    -
    -
    public final class MapType
    -extends DataType
    -
    The data type for Maps. Keys in a map are not allowed to have null values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MapType

        -
        public MapType(DataType keyType,
        -               DataType valueType,
        -               boolean valueContainsNull)
        -
        -
        Parameters:
        -
        keyType - the data type of map keys
        -
        valueType - the data type of map values
        -
        valueContainsNull - indicates if map values have null values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getKeyType

        -
        public DataType getKeyType()
        -
        -
        Returns:
        -
        the data type of map keys
        -
        -
      • -
      - - - -
        -
      • -

        getValueType

        -
        public DataType getValueType()
        -
        -
        Returns:
        -
        the data type of map values
        -
        -
      • -
      - - - -
        -
      • -

        valueContainsNull

        -
        public boolean valueContainsNull()
        -
        -
        Returns:
        -
        true if this map has null values, else false
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/NullType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/NullType.html deleted file mode 100644 index 132cc38bdb1..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/NullType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -NullType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class NullType

-
-
- -
-
    -
  • -
    -
    -
    public final class NullType
    -extends DataType
    -
    The data type representing null values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        NullType

        -
        public NullType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/ShortType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/ShortType.html deleted file mode 100644 index e1882c4b73f..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/ShortType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -ShortType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ShortType

-
-
- -
-
    -
  • -
    -
    -
    public final class ShortType
    -extends DataType
    -
    The data type representing short values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ShortType

        -
        public ShortType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/StringType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/StringType.html deleted file mode 100644 index 890a7766329..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/StringType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -StringType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StringType

-
-
- -
-
    -
  • -
    -
    -
    public final class StringType
    -extends DataType
    -
    The data type representing String values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StringType

        -
        public StringType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/StructField.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/StructField.html deleted file mode 100644 index 1b295756bb0..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/StructField.html +++ /dev/null @@ -1,416 +0,0 @@ - - - - - -StructField (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StructField

-
-
- -
-
    -
  • -
    -
    -
    public final class StructField
    -extends Object
    -
    A field inside a StructType.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType)
        -
        Constructor with default nullable = true.
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        -
      • -
      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType,
        -                   boolean nullable)
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        nullable - indicates if values of this field can be null values
        -
        -
      • -
      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType,
        -                   boolean nullable,
        -                   FieldMetadata metadata)
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        nullable - indicates if values of this field can be null values
        -
        metadata - metadata for this field
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getName

        -
        public String getName()
        -
        -
        Returns:
        -
        the name of this field
        -
        -
      • -
      - - - -
        -
      • -

        getDataType

        -
        public DataType getDataType()
        -
        -
        Returns:
        -
        the data type of this field
        -
        -
      • -
      - - - -
        -
      • -

        isNullable

        -
        public boolean isNullable()
        -
        -
        Returns:
        -
        whether this field allows to have a null value.
        -
        -
      • -
      - - - -
        -
      • -

        getMetadata

        -
        public FieldMetadata getMetadata()
        -
        -
        Returns:
        -
        the metadata for this field
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/StructType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/StructType.html deleted file mode 100644 index 0b22b7500a9..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/StructType.html +++ /dev/null @@ -1,559 +0,0 @@ - - - - - -StructType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StructType

-
-
- -
-
    -
  • -
    -
    -
    public final class StructType
    -extends DataType
    -
    The data type representing a table's schema, consisting of a collection of - fields (that is, fieldName to dataType pairs).
    -
    -
    See Also:
    -
    StructField
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StructType

        -
        public StructType()
        -
      • -
      - - - -
        -
      • -

        StructType

        -
        public StructType(StructField[] fields)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        add

        -
        public StructType add(StructField field)
        -
        Creates a new StructType by adding a new field. - -
        
        - StructType schema = new StructType()
        -     .add(new StructField("a", new IntegerType(), true))
        -     .add(new StructField("b", new LongType(), false))
        -     .add(new StructField("c", new StringType(), true))
        - 
        -
        -
        Parameters:
        -
        field - The new field to add.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        add

        -
        public StructType add(String fieldName,
        -                      DataType dataType)
        -
        Creates a new StructType by adding a new nullable field with no metadata. - -
        
        - StructType schema = new StructType()
        -     .add("a", new IntegerType())
        -     .add("b", new LongType())
        -     .add("c", new StringType())
        - 
        -
        -
        Parameters:
        -
        fieldName - The name of the new field.
        -
        dataType - The datatype for the new field.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        add

        -
        public StructType add(String fieldName,
        -                      DataType dataType,
        -                      boolean nullable)
        -
        Creates a new StructType by adding a new field with no metadata. - -
        
        - StructType schema = new StructType()
        -     .add("a", new IntegerType(), true)
        -     .add("b", new LongType(), false)
        -     .add("c", new StringType(), true)
        - 
        -
        -
        Parameters:
        -
        fieldName - The name of the new field.
        -
        dataType - The datatype for the new field.
        -
        nullable - Whether or not the new field is nullable.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        getFields

        -
        public StructField[] getFields()
        -
        -
        Returns:
        -
        array of fields
        -
        -
      • -
      - - - -
        -
      • -

        getFieldNames

        -
        public String[] getFieldNames()
        -
        -
        Returns:
        -
        array of field names
        -
        -
      • -
      - - - -
        -
      • -

        length

        -
        public int length()
        -
        -
        Returns:
        -
        the number of fields
        -
        -
      • -
      - - - -
        -
      • -

        get

        -
        public StructField get(String fieldName)
        -
        -
        Parameters:
        -
        fieldName - the name of the desired StructField, not null
        -
        Returns:
        -
        the link with the given name, not null
        -
        Throws:
        -
        IllegalArgumentException - if a field with the given name does not exist
        -
        -
      • -
      - - - -
        -
      • -

        column

        -
        public Column column(String fieldName)
        -
        Creates a Column expression for the field with the given fieldName.
        -
        -
        Parameters:
        -
        fieldName - the name of the StructField to create a column for
        -
        Returns:
        -
        a Column expression for the StructField with name fieldName
        -
        -
      • -
      - - - -
        -
      • -

        getTreeString

        -
        public String getTreeString()
        -
        -
        Returns:
        -
        a readable indented tree representation of this StructType - and all of its nested elements
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        isWriteCompatible

        -
        public boolean isWriteCompatible(StructType newSchema)
        -
        Whether a new schema can replace this existing schema in a Delta table without rewriting data - files in the table. -

        - Returns false if the new schema: -

          -
        • Drops any column that is present in the current schema
        • -
        • Converts nullable=true to nullable=false for any column
        • -
        • Changes any datatype
        • -
        -
        -
        Parameters:
        -
        newSchema - the new schema to update the table with
        -
        Returns:
        -
        whether the new schema is compatible with this existing schema
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html deleted file mode 100644 index b3b37701da7..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -TimestampType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class TimestampType

-
-
- -
-
    -
  • -
    -
    -
    public final class TimestampType
    -extends DataType
    -
    The data type representing java.sql.Timestamp values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        TimestampType

        -
        public TimestampType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/package-frame.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/package-frame.html deleted file mode 100644 index 89e971cbd86..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/package-frame.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -io.delta.standalone.types (Delta Standalone 0.4.1 JavaDoc) - - - - - -

io.delta.standalone.types

-
-

Classes

- -
- - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/package-summary.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/package-summary.html deleted file mode 100644 index bade7223115..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/package-summary.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - -io.delta.standalone.types (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.types

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/package-tree.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/package-tree.html deleted file mode 100644 index 8f05fba332d..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/types/package-tree.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - -io.delta.standalone.types Class Hierarchy (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.types

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html deleted file mode 100644 index d2ba1eda27d..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html +++ /dev/null @@ -1,365 +0,0 @@ - - - - - -ParquetSchemaConverter.ParquetOutputTimestampType (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.util
-

Enum ParquetSchemaConverter.ParquetOutputTimestampType

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable, Comparable<ParquetSchemaConverter.ParquetOutputTimestampType>
    -
    -
    -
    Enclosing class:
    -
    ParquetSchemaConverter
    -
    -
    -
    -
    public static enum ParquetSchemaConverter.ParquetOutputTimestampType
    -extends Enum<ParquetSchemaConverter.ParquetOutputTimestampType>
    -
    :: DeveloperApi :: -

    - Represents Parquet timestamp types. -

      -
    • INT96 is a non-standard but commonly used timestamp type in Parquet.
    • -
    • TIMESTAMP_MICROS is a standard timestamp type in Parquet, which stores number of - microseconds from the Unix epoch.
    • -
    • TIMESTAMP_MILLIS is also standard, but with millisecond precision, which means the - microsecond portion of the timestamp value is truncated.
    • -
    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        values

        -
        public static ParquetSchemaConverter.ParquetOutputTimestampType[] values()
        -
        Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
        -for (ParquetSchemaConverter.ParquetOutputTimestampType c : ParquetSchemaConverter.ParquetOutputTimestampType.values())
        -    System.out.println(c);
        -
        -
        -
        Returns:
        -
        an array containing the constants of this enum type, in the order they are declared
        -
        -
      • -
      - - - -
        -
      • -

        valueOf

        -
        public static ParquetSchemaConverter.ParquetOutputTimestampType valueOf(String name)
        -
        Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.)
        -
        -
        Parameters:
        -
        name - the name of the enum constant to be returned.
        -
        Returns:
        -
        the enum constant with the specified name
        -
        Throws:
        -
        IllegalArgumentException - if this enum type has no constant with the specified name
        -
        NullPointerException - if the argument is null
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html deleted file mode 100644 index 36dc0a314fd..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html +++ /dev/null @@ -1,417 +0,0 @@ - - - - - -ParquetSchemaConverter (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.util
-

Class ParquetSchemaConverter

-
-
- -
-
    -
  • -
    -
    -
    public final class ParquetSchemaConverter
    -extends Object
    -
    :: DeveloperApi :: -

    - Converter class to convert StructType to Parquet MessageType.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   Boolean writeLegacyParquetFormat)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        writeLegacyParquetFormat - Whether to use legacy Parquet format compatible with Spark - 1.4 and prior versions when converting a StructType to a Parquet - MessageType. When set to false, use standard format defined in parquet-format - spec.
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   ParquetSchemaConverter.ParquetOutputTimestampType outputTimestampType)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        outputTimestampType - which parquet timestamp type to use when writing
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   Boolean writeLegacyParquetFormat,
        -                                                                   ParquetSchemaConverter.ParquetOutputTimestampType outputTimestampType)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        writeLegacyParquetFormat - Whether to use legacy Parquet format compatible with Spark - 1.4 and prior versions when converting a StructType to a Parquet - MessageType. When set to false, use standard format defined in parquet-format - spec.
        -
        outputTimestampType - which parquet timestamp type to use when writing
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/package-frame.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/package-frame.html deleted file mode 100644 index e0804fcc3b5..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/package-frame.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -io.delta.standalone.util (Delta Standalone 0.4.1 JavaDoc) - - - - - -

io.delta.standalone.util

-
-

Classes

- -

Enums

- -
- - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/package-summary.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/package-summary.html deleted file mode 100644 index 213e387912c..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/package-summary.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - -io.delta.standalone.util (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.util

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/package-tree.html b/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/package-tree.html deleted file mode 100644 index fb3eae59f00..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/io/delta/standalone/util/package-tree.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - -io.delta.standalone.util Class Hierarchy (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.util

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/overview-frame.html b/connectors/docs/0.4.1/delta-standalone/api/java/overview-frame.html deleted file mode 100644 index f21c4cb2c86..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/overview-frame.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Overview List (Delta Standalone 0.4.1 JavaDoc) - - - - - -
All Classes
-
-

Packages

- -
-

 

- - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/overview-summary.html b/connectors/docs/0.4.1/delta-standalone/api/java/overview-summary.html deleted file mode 100644 index 481e8f5940f..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/overview-summary.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - -Overview (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Packages 
PackageDescription
io.delta.standalone 
io.delta.standalone.actions 
io.delta.standalone.data 
io.delta.standalone.exceptions 
io.delta.standalone.expressions 
io.delta.standalone.storage 
io.delta.standalone.types 
io.delta.standalone.util 
-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/overview-tree.html b/connectors/docs/0.4.1/delta-standalone/api/java/overview-tree.html deleted file mode 100644 index 58dcc0dfd30..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/overview-tree.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - -Class Hierarchy (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For All Packages

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/package-list b/connectors/docs/0.4.1/delta-standalone/api/java/package-list deleted file mode 100644 index 14c216e7f77..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/package-list +++ /dev/null @@ -1,8 +0,0 @@ -io.delta.standalone -io.delta.standalone.actions -io.delta.standalone.data -io.delta.standalone.exceptions -io.delta.standalone.expressions -io.delta.standalone.storage -io.delta.standalone.types -io.delta.standalone.util diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/script.js b/connectors/docs/0.4.1/delta-standalone/api/java/script.js deleted file mode 100644 index b3463569314..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/script.js +++ /dev/null @@ -1,30 +0,0 @@ -function show(type) -{ - count = 0; - for (var key in methods) { - var row = document.getElementById(key); - if ((methods[key] & type) != 0) { - row.style.display = ''; - row.className = (count++ % 2) ? rowColor : altColor; - } - else - row.style.display = 'none'; - } - updateTabs(type); -} - -function updateTabs(type) -{ - for (var value in tabs) { - var sNode = document.getElementById(tabs[value][0]); - var spanNode = sNode.firstChild; - if (value == type) { - sNode.className = activeTableTab; - spanNode.innerHTML = tabs[value][1]; - } - else { - sNode.className = tableTab; - spanNode.innerHTML = "" + tabs[value][1] + ""; - } - } -} diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/serialized-form.html b/connectors/docs/0.4.1/delta-standalone/api/java/serialized-form.html deleted file mode 100644 index 49235e61277..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/serialized-form.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - -Serialized Form (Delta Standalone 0.4.1 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Serialized Form

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.4.1/delta-standalone/api/java/stylesheet.css b/connectors/docs/0.4.1/delta-standalone/api/java/stylesheet.css deleted file mode 100644 index 98055b22d6d..00000000000 --- a/connectors/docs/0.4.1/delta-standalone/api/java/stylesheet.css +++ /dev/null @@ -1,574 +0,0 @@ -/* Javadoc style sheet */ -/* -Overall document style -*/ - -@import url('resources/fonts/dejavu.css'); - -body { - background-color:#ffffff; - color:#353833; - font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; - font-size:14px; - margin:0; -} -a:link, a:visited { - text-decoration:none; - color:#4A6782; -} -a:hover, a:focus { - text-decoration:none; - color:#bb7a2a; -} -a:active { - text-decoration:none; - color:#4A6782; -} -a[name] { - color:#353833; -} -a[name]:hover { - text-decoration:none; - color:#353833; -} -pre { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; -} -h1 { - font-size:20px; -} -h2 { - font-size:18px; -} -h3 { - font-size:16px; - font-style:italic; -} -h4 { - font-size:13px; -} -h5 { - font-size:12px; -} -h6 { - font-size:11px; -} -ul { - list-style-type:disc; -} -code, tt { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; - margin-top:8px; - line-height:1.4em; -} -dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; -} -table tr td dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - vertical-align:top; - padding-top:4px; -} -sup { - font-size:8px; -} -/* -Document title and Copyright styles -*/ -.clear { - clear:both; - height:0px; - overflow:hidden; -} -.aboutLanguage { - float:right; - padding:0px 21px; - font-size:11px; - z-index:200; - margin-top:-9px; -} -.legalCopy { - margin-left:.5em; -} -.bar a, .bar a:link, .bar a:visited, .bar a:active { - color:#FFFFFF; - text-decoration:none; -} -.bar a:hover, .bar a:focus { - color:#bb7a2a; -} -.tab { - background-color:#0066FF; - color:#ffffff; - padding:8px; - width:5em; - font-weight:bold; -} -/* -Navigation bar styles -*/ -.bar { - background-color:#4D7A97; - color:#FFFFFF; - padding:.8em .5em .4em .8em; - height:auto;/*height:1.8em;*/ - font-size:11px; - margin:0; -} -.topNav { - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.bottomNav { - margin-top:10px; - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.subNav { - background-color:#dee3e9; - float:left; - width:100%; - overflow:hidden; - font-size:12px; -} -.subNav div { - clear:left; - float:left; - padding:0 0 5px 6px; - text-transform:uppercase; -} -ul.navList, ul.subNavList { - float:left; - margin:0 25px 0 0; - padding:0; -} -ul.navList li{ - list-style:none; - float:left; - padding: 5px 6px; - text-transform:uppercase; -} -ul.subNavList li{ - list-style:none; - float:left; -} -.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { - color:#FFFFFF; - text-decoration:none; - text-transform:uppercase; -} -.topNav a:hover, .bottomNav a:hover { - text-decoration:none; - color:#bb7a2a; - text-transform:uppercase; -} -.navBarCell1Rev { - background-color:#F8981D; - color:#253441; - margin: auto 5px; -} -.skipNav { - position:absolute; - top:auto; - left:-9999px; - overflow:hidden; -} -/* -Page header and footer styles -*/ -.header, .footer { - clear:both; - margin:0 20px; - padding:5px 0 0 0; -} -.indexHeader { - margin:10px; - position:relative; -} -.indexHeader span{ - margin-right:15px; -} -.indexHeader h1 { - font-size:13px; -} -.title { - color:#2c4557; - margin:10px 0; -} -.subTitle { - margin:5px 0 0 0; -} -.header ul { - margin:0 0 15px 0; - padding:0; -} -.footer ul { - margin:20px 0 5px 0; -} -.header ul li, .footer ul li { - list-style:none; - font-size:13px; -} -/* -Heading styles -*/ -div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList ul.blockList li.blockList h3 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList li.blockList h3 { - padding:0; - margin:15px 0; -} -ul.blockList li.blockList h2 { - padding:0px 0 20px 0; -} -/* -Page layout container styles -*/ -.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { - clear:both; - padding:10px 20px; - position:relative; -} -.indexContainer { - margin:10px; - position:relative; - font-size:12px; -} -.indexContainer h2 { - font-size:13px; - padding:0 0 3px 0; -} -.indexContainer ul { - margin:0; - padding:0; -} -.indexContainer ul li { - list-style:none; - padding-top:2px; -} -.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { - font-size:12px; - font-weight:bold; - margin:10px 0 0 0; - color:#4E4E4E; -} -.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { - margin:5px 0 10px 0px; - font-size:14px; - font-family:'DejaVu Sans Mono',monospace; -} -.serializedFormContainer dl.nameValue dt { - margin-left:1px; - font-size:1.1em; - display:inline; - font-weight:bold; -} -.serializedFormContainer dl.nameValue dd { - margin:0 0 0 1px; - font-size:1.1em; - display:inline; -} -/* -List styles -*/ -ul.horizontal li { - display:inline; - font-size:0.9em; -} -ul.inheritance { - margin:0; - padding:0; -} -ul.inheritance li { - display:inline; - list-style:none; -} -ul.inheritance li ul.inheritance { - margin-left:15px; - padding-left:15px; - padding-top:1px; -} -ul.blockList, ul.blockListLast { - margin:10px 0 10px 0; - padding:0; -} -ul.blockList li.blockList, ul.blockListLast li.blockList { - list-style:none; - margin-bottom:15px; - line-height:1.4; -} -ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { - padding:0px 20px 5px 10px; - border:1px solid #ededed; - background-color:#f8f8f8; -} -ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { - padding:0 0 5px 8px; - background-color:#ffffff; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { - margin-left:0; - padding-left:0; - padding-bottom:15px; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { - list-style:none; - border-bottom:none; - padding-bottom:0; -} -table tr td dl, table tr td dl dt, table tr td dl dd { - margin-top:0; - margin-bottom:1px; -} -/* -Table styles -*/ -.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { - width:100%; - border-left:1px solid #EEE; - border-right:1px solid #EEE; - border-bottom:1px solid #EEE; -} -.overviewSummary, .memberSummary { - padding:0px; -} -.overviewSummary caption, .memberSummary caption, .typeSummary caption, -.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { - position:relative; - text-align:left; - background-repeat:no-repeat; - color:#253441; - font-weight:bold; - clear:none; - overflow:hidden; - padding:0px; - padding-top:10px; - padding-left:1px; - margin:0px; - white-space:pre; -} -.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, -.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, -.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, -.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, -.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, -.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, -.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, -.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { - color:#FFFFFF; -} -.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, -.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - padding-bottom:7px; - display:inline-block; - float:left; - background-color:#F8981D; - border: none; - height:16px; -} -.memberSummary caption span.activeTableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#F8981D; - height:16px; -} -.memberSummary caption span.tableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#4D7A97; - height:16px; -} -.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { - padding-top:0px; - padding-left:0px; - padding-right:0px; - background-image:none; - float:none; - display:inline; -} -.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, -.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { - display:none; - width:5px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .activeTableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .tableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - background-color:#4D7A97; - float:left; - -} -.overviewSummary td, .memberSummary td, .typeSummary td, -.useSummary td, .constantsSummary td, .deprecatedSummary td { - text-align:left; - padding:0px 0px 12px 10px; -} -th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, -td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ - vertical-align:top; - padding-right:0px; - padding-top:8px; - padding-bottom:3px; -} -th.colFirst, th.colLast, th.colOne, .constantsSummary th { - background:#dee3e9; - text-align:left; - padding:8px 3px 3px 7px; -} -td.colFirst, th.colFirst { - white-space:nowrap; - font-size:13px; -} -td.colLast, th.colLast { - font-size:13px; -} -td.colOne, th.colOne { - font-size:13px; -} -.overviewSummary td.colFirst, .overviewSummary th.colFirst, -.useSummary td.colFirst, .useSummary th.colFirst, -.overviewSummary td.colOne, .overviewSummary th.colOne, -.memberSummary td.colFirst, .memberSummary th.colFirst, -.memberSummary td.colOne, .memberSummary th.colOne, -.typeSummary td.colFirst{ - width:25%; - vertical-align:top; -} -td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { - font-weight:bold; -} -.tableSubHeadingColor { - background-color:#EEEEFF; -} -.altColor { - background-color:#FFFFFF; -} -.rowColor { - background-color:#EEEEEF; -} -/* -Content styles -*/ -.description pre { - margin-top:0; -} -.deprecatedContent { - margin:0; - padding:10px 0; -} -.docSummary { - padding:0; -} - -ul.blockList ul.blockList ul.blockList li.blockList h3 { - font-style:normal; -} - -div.block { - font-size:14px; - font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; -} - -td.colLast div { - padding-top:0px; -} - - -td.colLast a { - padding-bottom:3px; -} -/* -Formatting effect styles -*/ -.sourceLineNo { - color:green; - padding:0 30px 0 0; -} -h1.hidden { - visibility:hidden; - overflow:hidden; - font-size:10px; -} -.block { - display:block; - margin:3px 10px 2px 0px; - color:#474747; -} -.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, -.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, -.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { - font-weight:bold; -} -.deprecationComment, .emphasizedPhrase, .interfaceName { - font-style:italic; -} - -div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, -div.block div.block span.interfaceName { - font-style:normal; -} - -div.contentContainer ul.blockList li.blockList h2{ - padding-bottom:0px; -} diff --git a/connectors/docs/0.5.0/delta-flink/api/java/allclasses-frame.html b/connectors/docs/0.5.0/delta-flink/api/java/allclasses-frame.html deleted file mode 100644 index c06efddabae..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/allclasses-frame.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - -All Classes (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/allclasses-noframe.html b/connectors/docs/0.5.0/delta-flink/api/java/allclasses-noframe.html deleted file mode 100644 index 733bee4ab37..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/allclasses-noframe.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - -All Classes (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/constant-values.html b/connectors/docs/0.5.0/delta-flink/api/java/constant-values.html deleted file mode 100644 index bf1df7f7058..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/constant-values.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - -Constant Field Values (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Constant Field Values

-

Contents

-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/deprecated-list.html b/connectors/docs/0.5.0/delta-flink/api/java/deprecated-list.html deleted file mode 100644 index ac9a1d18bfc..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/deprecated-list.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - -Deprecated List (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Deprecated API

-

Contents

-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/help-doc.html b/connectors/docs/0.5.0/delta-flink/api/java/help-doc.html deleted file mode 100644 index e6a69c23949..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/help-doc.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - -API Help (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

How This API Document Is Organized

-
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
-
-
- -This help file applies to API documentation generated using the standard doclet.
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/index-all.html b/connectors/docs/0.5.0/delta-flink/api/java/index-all.html deleted file mode 100644 index 010855b1099..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/index-all.html +++ /dev/null @@ -1,339 +0,0 @@ - - - - - -Index (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
B C D F I O R S T U V W  - - -

B

-
-
build() - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Creates the actual sink.
-
-
build() - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Creates an instance of DeltaSource for a stream of RowData.
-
-
build() - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Creates an instance of DeltaSource for a stream of RowData.
-
-
- - - -

C

-
-
columnNames(List<String>) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Specifies a List of column names that should be read from Delta table.
-
-
columnNames(String...) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Specifies an array of column names that should be read from Delta table.
-
-
columnNames(List<String>) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Specifies a List of column names that should be read from Delta table.
-
-
columnNames(String...) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Specifies an array of column names that should be read from Delta table.
-
-
- - - -

D

-
-
DeltaSink<IN> - Class in io.delta.flink.sink
-
-
A unified sink that emits its input elements to file system files within buckets using - Parquet format and commits those files to the DeltaLog.
-
-
DeltaSource<T> - Class in io.delta.flink.source
-
-
A unified data source that reads Delta table - both in batch and in streaming mode.
-
-
- - - -

F

-
-
forBoundedRowData(Path, Configuration) - Static method in class io.delta.flink.source.DeltaSource
-
-
Creates an instance of Delta source builder for Bounded mode and for RowData - elements.
-
-
forContinuousRowData(Path, Configuration) - Static method in class io.delta.flink.source.DeltaSource
-
-
Creates an instance of Delta source builder for Continuous mode and for RowData - elements.
-
-
forRowData(Path, Configuration, RowType) - Static method in class io.delta.flink.sink.DeltaSink
-
-
Convenience method for creating a RowDataDeltaSinkBuilder for DeltaSink to a - Delta table.
-
-
- - - -

I

-
-
ignoreChanges(boolean) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets the "ignoreChanges" option.
-
-
ignoreDeletes(boolean) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets the "ignoreDeletes" option.
-
-
io.delta.flink.sink - package io.delta.flink.sink
-
 
-
io.delta.flink.source - package io.delta.flink.source
-
 
-
- - - -

O

-
-
option(String, String) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, boolean) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, int) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, long) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, String) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, boolean) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, int) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, long) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
- - - -

R

-
-
RowDataBoundedDeltaSourceBuilder - Class in io.delta.flink.source
-
-
A builder class for DeltaSource for a stream of RowData where the created source - instance will operate in Bounded mode.
-
-
RowDataContinuousDeltaSourceBuilder - Class in io.delta.flink.source
-
-
A builder class for DeltaSource for a stream of RowData where the created source - instance will operate in Continuous mode.
-
-
RowDataDeltaSinkBuilder - Class in io.delta.flink.sink
-
-
A builder class for DeltaSink for a stream of RowData.
-
-
RowDataDeltaSinkBuilder(Path, Configuration, RowType, boolean) - Constructor for class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Creates instance of the builder for DeltaSink.
-
-
- - - -

S

-
-
startingTimestamp(String) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets value of "startingTimestamp" option.
-
-
startingVersion(String) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets value of "startingVersion" option.
-
-
startingVersion(long) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets value of "startingVersion" option.
-
-
- - - -

T

-
-
timestampAsOf(String) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets value of "timestampAsOf" option.
-
-
- - - -

U

-
-
updateCheckIntervalMillis(long) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets the value for "updateCheckIntervalMillis" option.
-
-
- - - -

V

-
-
versionAsOf(long) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets value of "versionAsOf" option.
-
-
- - - -

W

-
-
withMergeSchema(boolean) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets the sink's option whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch during a commit to the - DeltaLog.
-
-
withPartitionColumns(String...) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets list of partition fields that will be extracted from incoming RowData events.
-
-
-B C D F I O R S T U V W 
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/index.html b/connectors/docs/0.5.0/delta-flink/api/java/index.html deleted file mode 100644 index 26398a79b21..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - -Flink/Delta Connector 0.5.0 JavaDoc - - - - - - - - - -<noscript> -<div>JavaScript is disabled on your browser.</div> -</noscript> -<h2>Frame Alert</h2> -<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html b/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html deleted file mode 100644 index b443067bd16..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html +++ /dev/null @@ -1,309 +0,0 @@ - - - - - -DeltaSink (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.sink
-

Class DeltaSink<IN>

-
-
- -
-
    -
  • -
    -
    Type Parameters:
    -
    IN - Type of the elements in the input of the sink that are also the elements to be - written to its output
    -
    -
    -
    -
    public class DeltaSink<IN>
    -extends <any>
    -
    A unified sink that emits its input elements to file system files within buckets using - Parquet format and commits those files to the DeltaLog. This sink achieves exactly-once - semantics for both BATCH and STREAMING. -

    - For most use cases users should use forRowData(org.apache.flink.core.fs.Path, org.apache.hadoop.conf.Configuration, org.apache.flink.table.types.logical.RowType) utility method to instantiate - the sink which provides proper writer factory implementation for the stream of RowData. -

    - To create new instance of the sink to a non-partitioned Delta table for stream of - RowData: -

    -     DataStream<RowData> stream = ...;
    -     RowType rowType = ...;
    -     ...
    -
    -     // sets a sink to a non-partitioned Delta table
    -     DeltaSink<RowData> deltaSink = DeltaSink.forRowData(
    -             new Path(deltaTablePath),
    -             new Configuration(),
    -             rowType).build();
    -     stream.sinkTo(deltaSink);
    - 
    - - To create new instance of the sink to a partitioned Delta table for stream of RowData: -
    -     String[] partitionCols = ...; // array of partition columns' names
    -
    -     DeltaSink<RowData> deltaSink = DeltaSink.forRowData(
    -             new Path(deltaTablePath),
    -             new Configuration(),
    -             rowType)
    -         .withPartitionColumns(partitionCols)
    -         .build();
    -     stream.sinkTo(deltaSink);
    - 
    -

    - Behaviour of this sink splits down upon two phases. The first phase takes place between - application's checkpoints when records are being flushed to files (or appended to writers' - buffers) where the behaviour is almost identical as in case of - FileSink. - Next during the checkpoint phase files are "closed" (renamed) by the independent instances of - io.delta.flink.sink.internal.committer.DeltaCommitter that behave very similar - to FileCommitter. - When all the parallel committers are done, then all the files are committed at once by - single-parallelism io.delta.flink.sink.internal.committer.DeltaGlobalCommitter. -

    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - -
      All Methods Static Methods Concrete Methods 
      Modifier and TypeMethod and Description
      static RowDataDeltaSinkBuilderforRowData(org.apache.flink.core.fs.Path basePath, - org.apache.hadoop.conf.Configuration conf, - org.apache.flink.table.types.logical.RowType rowType) -
      Convenience method for creating a RowDataDeltaSinkBuilder for DeltaSink to a - Delta table.
      -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        forRowData

        -
        public static RowDataDeltaSinkBuilder forRowData(org.apache.flink.core.fs.Path basePath,
        -                                                 org.apache.hadoop.conf.Configuration conf,
        -                                                 org.apache.flink.table.types.logical.RowType rowType)
        -
        Convenience method for creating a RowDataDeltaSinkBuilder for DeltaSink to a - Delta table.
        -
        -
        Parameters:
        -
        basePath - root path of the Delta table
        -
        conf - Hadoop's conf object that will be used for creating instances of - DeltaLog and will be also passed to the - ParquetRowDataBuilder to create ParquetWriterFactory
        -
        rowType - Flink's logical type to indicate the structure of the events in the stream
        -
        Returns:
        -
        builder for the DeltaSink
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html b/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html deleted file mode 100644 index 1ecadfe53c4..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html +++ /dev/null @@ -1,358 +0,0 @@ - - - - - -RowDataDeltaSinkBuilder (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.sink
-

Class RowDataDeltaSinkBuilder

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      RowDataDeltaSinkBuilder(org.apache.flink.core.fs.Path tableBasePath, - org.apache.hadoop.conf.Configuration conf, - org.apache.flink.table.types.logical.RowType rowType, - boolean mergeSchema) -
      Creates instance of the builder for DeltaSink.
      -
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      DeltaSink<org.apache.flink.table.data.RowData>build() -
      Creates the actual sink.
      -
      RowDataDeltaSinkBuilderwithMergeSchema(boolean mergeSchema) -
      Sets the sink's option whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch during a commit to the - DeltaLog.
      -
      RowDataDeltaSinkBuilderwithPartitionColumns(String... partitionColumns) -
      Sets list of partition fields that will be extracted from incoming RowData events.
      -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        RowDataDeltaSinkBuilder

        -
        public RowDataDeltaSinkBuilder(org.apache.flink.core.fs.Path tableBasePath,
        -                               org.apache.hadoop.conf.Configuration conf,
        -                               org.apache.flink.table.types.logical.RowType rowType,
        -                               boolean mergeSchema)
        -
        Creates instance of the builder for DeltaSink.
        -
        -
        Parameters:
        -
        tableBasePath - path to a Delta table
        -
        conf - Hadoop's conf object
        -
        rowType - Flink's logical type to indicate the structure of the events in - the stream
        -
        mergeSchema - whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch. This is not guaranteed - since it checks for compatible schemas.
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        withMergeSchema

        -
        public RowDataDeltaSinkBuilder withMergeSchema(boolean mergeSchema)
        -
        Sets the sink's option whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch during a commit to the - DeltaLog. The update is not guaranteed since it checks for - compatible schemas.
        -
        -
        Parameters:
        -
        mergeSchema - whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch. This is not guaranteed - since it requires compatible schemas.
        -
        Returns:
        -
        builder for DeltaSink
        -
        -
      • -
      - - - -
        -
      • -

        withPartitionColumns

        -
        public RowDataDeltaSinkBuilder withPartitionColumns(String... partitionColumns)
        -
        Sets list of partition fields that will be extracted from incoming RowData events. -

        - Provided fields' names must correspond to the names provided in the RowType object - for this sink and must be in the same order as expected order of occurrence in the partition - path that will be generated.

        -
        -
        Parameters:
        -
        partitionColumns - array of partition columns' names in the order they should be applied - when creating destination path.
        -
        Returns:
        -
        builder for DeltaSink
        -
        -
      • -
      - - - -
        -
      • -

        build

        -
        public DeltaSink<org.apache.flink.table.data.RowData> build()
        -
        Creates the actual sink.
        -
        -
        Returns:
        -
        constructed DeltaSink object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/package-frame.html b/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/package-frame.html deleted file mode 100644 index 9af2d9e6742..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -io.delta.flink.sink (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - -

io.delta.flink.sink

-
-

Classes

- -
- - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/package-summary.html b/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/package-summary.html deleted file mode 100644 index 8374762b125..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/package-summary.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - -io.delta.flink.sink (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.flink.sink

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/package-tree.html b/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/package-tree.html deleted file mode 100644 index 8cf4a78c7db..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/sink/package-tree.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - -io.delta.flink.sink Class Hierarchy (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.flink.sink

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/DeltaSource.html b/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/DeltaSource.html deleted file mode 100644 index 073737ca71e..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/DeltaSource.html +++ /dev/null @@ -1,366 +0,0 @@ - - - - - -DeltaSource (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.source
-

Class DeltaSource<T>

-
-
- -
-
    -
  • -
    -
    Type Parameters:
    -
    T - The type of the events/records produced by this source.
    -
    -
    -
    -
    public class DeltaSource<T>
    -extends <any>
    -
    A unified data source that reads Delta table - both in batch and in streaming mode. - -

    This source supports all (distributed) file systems and object stores that can be accessed - via the Flink's FileSystem class. -

    - To create a new instance of DeltaSource for a Delta table that will produce - RowData records that contain all table columns: -

    -     StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    -     ...
    -     // Bounded mode.
    -     DeltaSource<RowData> deltaSource = DeltaSource.forBoundedRowData(
    -                new Path("s3://some/path"),
    -                new Configuration()
    -             )
    -             .versionAsOf(10)
    -             .build();
    -
    -     env.fromSource(deltaSource, WatermarkStrategy.noWatermarks(), "delta-source")
    -
    -     ..........
    -     // Continuous mode.
    -     DeltaSource<RowData> deltaSource = DeltaSource.forContinuousRowData(
    -                new Path("s3://some/path"),
    -                new Configuration()
    -               )
    -              .updateCheckIntervalMillis(1000)
    -              .startingVersion(10)
    -              .build();
    -
    -     env.fromSource(deltaSource, WatermarkStrategy.noWatermarks(), "delta-source")
    - 
    -

    - To create a new instance of DeltaSource for a Delta table that will produce - RowData records with user-selected columns: -

    -     StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    -     ...
    -     // Bounded mode.
    -     DeltaSource<RowData> deltaSource = DeltaSource.forBoundedRowData(
    -                new Path("s3://some/path"),
    -                new Configuration()
    -             )
    -             .columnNames(Arrays.asList("col1", "col2"))
    -             .versionAsOf(10)
    -             .build();
    -
    -     env.fromSource(deltaSource, WatermarkStrategy.noWatermarks(), "delta-source")
    -
    -     ..........
    -     // Continuous mode.
    -     DeltaSource<RowData> deltaSource = DeltaSource.forContinuousRowData(
    -                new Path("s3://some/path"),
    -                new Configuration()
    -               )
    -               .columnNames(Arrays.asList("col1", "col2"))
    -               .updateCheckIntervalMillis(1000)
    -               .startingVersion(10)
    -               .build();
    -
    -     env.fromSource(deltaSource, WatermarkStrategy.noWatermarks(), "delta-source")
    - 
    - When using columnNames(...) method, the source will discover the data types for the - given columns from the Delta log.
    -
    -
    Implementation Note:
    -

    Batch and Streaming

    - -

    This source supports both bounded/batch and continuous/streaming modes. For the - bounded/batch case, the Delta Source processes the full state of the Delta table. In - the continuous/streaming case, the default Delta Source will also process the full state of the - table, and then begin to periodically check the Delta table for any appending changes and read - them. Using either of the RowDataContinuousDeltaSourceBuilder.startingVersion(java.lang.String) or - RowDataContinuousDeltaSourceBuilder.startingTimestamp(java.lang.String) APIs will cause the Delta Source, - in continuous mode, to stream only the changes from that historical version. - -

    Format Types

    - -

    The reading of each file happens through file readers defined by file format. These - define the parsing logic for the contents of the underlying Parquet files. - -

    A BulkFormat reads batches of records from a file at a time.,

    Discovering / Enumerating Files

    -

    The way that the source lists the files to be processes is defined by the AddFileEnumerator. The AddFileEnumerator is responsible to select the relevant AddFile and to optionally splits files into multiple regions (file source splits) that can be - read in parallel.

    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - -
      All Methods Static Methods Concrete Methods 
      Modifier and TypeMethod and Description
      static RowDataBoundedDeltaSourceBuilderforBoundedRowData(org.apache.flink.core.fs.Path tablePath, - org.apache.hadoop.conf.Configuration hadoopConfiguration) -
      Creates an instance of Delta source builder for Bounded mode and for RowData - elements.
      -
      static RowDataContinuousDeltaSourceBuilderforContinuousRowData(org.apache.flink.core.fs.Path tablePath, - org.apache.hadoop.conf.Configuration hadoopConfiguration) -
      Creates an instance of Delta source builder for Continuous mode and for RowData - elements.
      -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        forBoundedRowData

        -
        public static RowDataBoundedDeltaSourceBuilder forBoundedRowData(org.apache.flink.core.fs.Path tablePath,
        -                                                                 org.apache.hadoop.conf.Configuration hadoopConfiguration)
        -
        Creates an instance of Delta source builder for Bounded mode and for RowData - elements.
        -
        -
        Parameters:
        -
        tablePath - Path to Delta table to read data from.
        -
        hadoopConfiguration - Hadoop configuration.
        -
        -
      • -
      - - - -
        -
      • -

        forContinuousRowData

        -
        public static RowDataContinuousDeltaSourceBuilder forContinuousRowData(org.apache.flink.core.fs.Path tablePath,
        -                                                                       org.apache.hadoop.conf.Configuration hadoopConfiguration)
        -
        Creates an instance of Delta source builder for Continuous mode and for RowData - elements.
        -
        -
        Parameters:
        -
        tablePath - Path to Delta table to read data from.
        -
        hadoopConfiguration - Hadoop configuration.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/RowDataBoundedDeltaSourceBuilder.html b/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/RowDataBoundedDeltaSourceBuilder.html deleted file mode 100644 index 2eea28c9c7b..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/RowDataBoundedDeltaSourceBuilder.html +++ /dev/null @@ -1,454 +0,0 @@ - - - - - -RowDataBoundedDeltaSourceBuilder (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.source
-

Class RowDataBoundedDeltaSourceBuilder

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        columnNames

        -
        public RowDataBoundedDeltaSourceBuilder columnNames(java.util.List<String> columnNames)
        -
        Specifies a List of column names that should be read from Delta table. If this method - is not used, Source will read all columns from Delta table. -

        - If provided List is null or contains null, empty or blank elements it will throw a - DeltaSourceValidationException by builder after calling build() method.

        -
        -
        Parameters:
        -
        columnNames - column names that should be read.
        -
        -
      • -
      - - - -
        -
      • -

        columnNames

        -
        public RowDataBoundedDeltaSourceBuilder columnNames(String... columnNames)
        -
        Specifies an array of column names that should be read from Delta table. If this method - is not used, Source will read all columns from Delta table. -

        - If provided List is null or contains null, empty or blank elements it will throw a - DeltaSourceValidationException by builder after calling build() method.

        -
        -
        Parameters:
        -
        columnNames - column names that should be read.
        -
        -
      • -
      - - - -
        -
      • -

        versionAsOf

        -
        public RowDataBoundedDeltaSourceBuilder versionAsOf(long snapshotVersion)
        -
        Sets value of "versionAsOf" option. With this option we will load the given table version and - read from it. - -

        - This option is mutually exclusive with timestampAsOf(String) option.

        -
        -
        Parameters:
        -
        snapshotVersion - Delta table version to time travel to.
        -
        -
      • -
      - - - -
        -
      • -

        timestampAsOf

        -
        public RowDataBoundedDeltaSourceBuilder timestampAsOf(String snapshotTimestamp)
        -
        Sets value of "timestampAsOf" option. With this option we will load the latest table version - that was generated at or before the given timestamp. -

        - This option is mutually exclusive with versionAsOf(long) option.

        -
        -
        Parameters:
        -
        snapshotTimestamp - The timestamp we should time travel to. Supported formats are: -
          -
        • 2022-02-24
        • -
        • 2022-02-24 04:55:00
        • -
        • 2022-02-24 04:55:00.001
        • -
        • 2022-02-24T04:55:00
        • -
        • 2022-02-24T04:55:00.001
        • -
        • 2022-02-24T04:55:00.001Z
        • -
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataBoundedDeltaSourceBuilder option(String optionName,
        -                                               String optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option String value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataBoundedDeltaSourceBuilder option(String optionName,
        -                                               boolean optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option boolean value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataBoundedDeltaSourceBuilder option(String optionName,
        -                                               int optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option int value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataBoundedDeltaSourceBuilder option(String optionName,
        -                                               long optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option long value to set.
        -
        -
      • -
      - - - -
        -
      • -

        build

        -
        public DeltaSource<org.apache.flink.table.data.RowData> build()
        -
        Creates an instance of DeltaSource for a stream of RowData. Created source - will work in Bounded mode, meaning it will read the content of the configured Delta snapshot - at the fixed version, ignoring all changes done to this table after starting this source. - -

        - This method can throw DeltaSourceValidationException in case of invalid arguments - passed to Delta source builder.

        -
        -
        Returns:
        -
        New DeltaSource instance.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/RowDataContinuousDeltaSourceBuilder.html b/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/RowDataContinuousDeltaSourceBuilder.html deleted file mode 100644 index 7d1f4db0d27..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/RowDataContinuousDeltaSourceBuilder.html +++ /dev/null @@ -1,557 +0,0 @@ - - - - - -RowDataContinuousDeltaSourceBuilder (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.source
-

Class RowDataContinuousDeltaSourceBuilder

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        columnNames

        -
        public RowDataContinuousDeltaSourceBuilder columnNames(java.util.List<String> columnNames)
        -
        Specifies a List of column names that should be read from Delta table. If this method - is not used, Source will read all columns from Delta table. -

        - If provided List is null or contains null, empty or blank elements it will throw a - DeltaSourceValidationException by builder after calling build() method.

        -
        -
        Parameters:
        -
        columnNames - column names that should be read.
        -
        -
      • -
      - - - -
        -
      • -

        columnNames

        -
        public RowDataContinuousDeltaSourceBuilder columnNames(String... columnNames)
        -
        Specifies an array of column names that should be read from Delta table. If this method - is not used, Source will read all columns from Delta table. -

        - If provided List is null or contains null, empty or blank elements it will throw a - DeltaSourceValidationException by builder after calling build() method.

        -
        -
        Parameters:
        -
        columnNames - column names that should be read.
        -
        -
      • -
      - - - -
        -
      • -

        startingVersion

        -
        public RowDataContinuousDeltaSourceBuilder startingVersion(String startingVersion)
        -
        Sets value of "startingVersion" option. This option specifies the starting table version from - which we want to start reading changes. - -

        - This option is mutually exclusive with startingTimestamp(String) option.

        -
        -
        Parameters:
        -
        startingVersion - Delta table version to start reading changes from. The values can be - string numbers like "1", "10" etc. or keyword "latest", where in that - case, changes from the latest Delta table version will be read.
        -
        -
      • -
      - - - -
        -
      • -

        startingVersion

        -
        public RowDataContinuousDeltaSourceBuilder startingVersion(long startingVersion)
        -
        Sets value of "startingVersion" option. This option specifies the starting table version from - which we want to start reading changes. - -

        - This option is mutually exclusive with startingTimestamp(String) option.

        -
        -
        Parameters:
        -
        startingVersion - Delta table version to start reading changes from.
        -
        -
      • -
      - - - -
        -
      • -

        startingTimestamp

        -
        public RowDataContinuousDeltaSourceBuilder startingTimestamp(String startingTimestamp)
        -
        Sets value of "startingTimestamp" option. This option is used to read only changes starting - from the table version that was generated at or after the given timestamp. - -

        - This option is mutually exclusive with startingVersion(String) and startingVersion(long) option.

        -
        -
        Parameters:
        -
        startingTimestamp - The timestamp of the table from which we start reading changes. - Supported formats are: -
          -
        • 2022-02-24
        • -
        • 2022-02-24 04:55:00
        • -
        • 2022-02-24 04:55:00.001
        • -
        • 2022-02-24T04:55:00
        • -
        • 2022-02-24T04:55:00.001
        • -
        • 2022-02-24T04:55:00.001Z
        • -
        -
        -
      • -
      - - - -
        -
      • -

        updateCheckIntervalMillis

        -
        public RowDataContinuousDeltaSourceBuilder updateCheckIntervalMillis(long updateCheckInterval)
        -
        Sets the value for "updateCheckIntervalMillis" option. This option is used to specify the - check interval (in milliseconds) used for periodic Delta table changes checks. - -

        - The default value for this option is 5000 ms.

        -
        -
        Parameters:
        -
        updateCheckInterval - The update check internal in milliseconds.
        -
        -
      • -
      - - - -
        -
      • -

        ignoreDeletes

        -
        public RowDataContinuousDeltaSourceBuilder ignoreDeletes(boolean ignoreDeletes)
        -
        Sets the "ignoreDeletes" option. When set to true, this option allows processing Delta table - versions where data is deleted. -

        - The default value for this option is false.

        -
      • -
      - - - -
        -
      • -

        ignoreChanges

        -
        public RowDataContinuousDeltaSourceBuilder ignoreChanges(boolean ignoreChanges)
        -
        Sets the "ignoreChanges" option. When set to true, this option allows processing Delta table - versions where data is changed (i.e. updated) or deleted. -

        - Note that setting this option to true can lead to duplicate processing of data, as, in the - case of updates, existing rows may be rewritten in new files, and those new files will be - treated as new data and be fully reprocessed. -

        - This option subsumes ignoreDeletes(boolean) option. Therefore, if you set "ignoreChanges" to - true, your stream will not be disrupted by either deletions or updates to the source table. -

        - The default value for this option is false.

        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataContinuousDeltaSourceBuilder option(String optionName,
        -                                                  String optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option String value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataContinuousDeltaSourceBuilder option(String optionName,
        -                                                  boolean optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option boolean value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataContinuousDeltaSourceBuilder option(String optionName,
        -                                                  int optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option int value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataContinuousDeltaSourceBuilder option(String optionName,
        -                                                  long optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option long value to set.
        -
        -
      • -
      - - - -
        -
      • -

        build

        -
        public DeltaSource<org.apache.flink.table.data.RowData> build()
        -
        Creates an instance of DeltaSource for a stream of RowData. Created source - will work in Continuous mode, actively monitoring Delta table for new changes. - -

        - This method can throw DeltaSourceValidationException in case of invalid arguments - passed to Delta source builder.

        -
        -
        Returns:
        -
        New DeltaSource instance.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/package-frame.html b/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/package-frame.html deleted file mode 100644 index c82ce654741..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/package-frame.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - -io.delta.flink.source (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - -

io.delta.flink.source

-
-

Classes

- -
- - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/package-summary.html b/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/package-summary.html deleted file mode 100644 index ad74d6e84b0..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/package-summary.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - -io.delta.flink.source (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.flink.source

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/package-tree.html b/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/package-tree.html deleted file mode 100644 index 6a42c26ca99..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/io/delta/flink/source/package-tree.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - -io.delta.flink.source Class Hierarchy (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.flink.source

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/overview-frame.html b/connectors/docs/0.5.0/delta-flink/api/java/overview-frame.html deleted file mode 100644 index 3a2b05e9eae..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/overview-frame.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - -Overview List (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - -
All Classes
-
-

Packages

- -
-

 

- - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/overview-summary.html b/connectors/docs/0.5.0/delta-flink/api/java/overview-summary.html deleted file mode 100644 index 302eacb0aa0..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/overview-summary.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - -Overview (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
- - - - - - - - - - - - - - - - -
Packages 
PackageDescription
io.delta.flink.sink 
io.delta.flink.source 
-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/overview-tree.html b/connectors/docs/0.5.0/delta-flink/api/java/overview-tree.html deleted file mode 100644 index 359239094a7..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/overview-tree.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - -Class Hierarchy (Flink/Delta Connector 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For All Packages

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-flink/api/java/package-list b/connectors/docs/0.5.0/delta-flink/api/java/package-list deleted file mode 100644 index c808a2a72e7..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/package-list +++ /dev/null @@ -1,2 +0,0 @@ -io.delta.flink.sink -io.delta.flink.source diff --git a/connectors/docs/0.5.0/delta-flink/api/java/script.js b/connectors/docs/0.5.0/delta-flink/api/java/script.js deleted file mode 100644 index b3463569314..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/script.js +++ /dev/null @@ -1,30 +0,0 @@ -function show(type) -{ - count = 0; - for (var key in methods) { - var row = document.getElementById(key); - if ((methods[key] & type) != 0) { - row.style.display = ''; - row.className = (count++ % 2) ? rowColor : altColor; - } - else - row.style.display = 'none'; - } - updateTabs(type); -} - -function updateTabs(type) -{ - for (var value in tabs) { - var sNode = document.getElementById(tabs[value][0]); - var spanNode = sNode.firstChild; - if (value == type) { - sNode.className = activeTableTab; - spanNode.innerHTML = tabs[value][1]; - } - else { - sNode.className = tableTab; - spanNode.innerHTML = "" + tabs[value][1] + ""; - } - } -} diff --git a/connectors/docs/0.5.0/delta-flink/api/java/stylesheet.css b/connectors/docs/0.5.0/delta-flink/api/java/stylesheet.css deleted file mode 100644 index 98055b22d6d..00000000000 --- a/connectors/docs/0.5.0/delta-flink/api/java/stylesheet.css +++ /dev/null @@ -1,574 +0,0 @@ -/* Javadoc style sheet */ -/* -Overall document style -*/ - -@import url('resources/fonts/dejavu.css'); - -body { - background-color:#ffffff; - color:#353833; - font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; - font-size:14px; - margin:0; -} -a:link, a:visited { - text-decoration:none; - color:#4A6782; -} -a:hover, a:focus { - text-decoration:none; - color:#bb7a2a; -} -a:active { - text-decoration:none; - color:#4A6782; -} -a[name] { - color:#353833; -} -a[name]:hover { - text-decoration:none; - color:#353833; -} -pre { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; -} -h1 { - font-size:20px; -} -h2 { - font-size:18px; -} -h3 { - font-size:16px; - font-style:italic; -} -h4 { - font-size:13px; -} -h5 { - font-size:12px; -} -h6 { - font-size:11px; -} -ul { - list-style-type:disc; -} -code, tt { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; - margin-top:8px; - line-height:1.4em; -} -dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; -} -table tr td dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - vertical-align:top; - padding-top:4px; -} -sup { - font-size:8px; -} -/* -Document title and Copyright styles -*/ -.clear { - clear:both; - height:0px; - overflow:hidden; -} -.aboutLanguage { - float:right; - padding:0px 21px; - font-size:11px; - z-index:200; - margin-top:-9px; -} -.legalCopy { - margin-left:.5em; -} -.bar a, .bar a:link, .bar a:visited, .bar a:active { - color:#FFFFFF; - text-decoration:none; -} -.bar a:hover, .bar a:focus { - color:#bb7a2a; -} -.tab { - background-color:#0066FF; - color:#ffffff; - padding:8px; - width:5em; - font-weight:bold; -} -/* -Navigation bar styles -*/ -.bar { - background-color:#4D7A97; - color:#FFFFFF; - padding:.8em .5em .4em .8em; - height:auto;/*height:1.8em;*/ - font-size:11px; - margin:0; -} -.topNav { - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.bottomNav { - margin-top:10px; - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.subNav { - background-color:#dee3e9; - float:left; - width:100%; - overflow:hidden; - font-size:12px; -} -.subNav div { - clear:left; - float:left; - padding:0 0 5px 6px; - text-transform:uppercase; -} -ul.navList, ul.subNavList { - float:left; - margin:0 25px 0 0; - padding:0; -} -ul.navList li{ - list-style:none; - float:left; - padding: 5px 6px; - text-transform:uppercase; -} -ul.subNavList li{ - list-style:none; - float:left; -} -.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { - color:#FFFFFF; - text-decoration:none; - text-transform:uppercase; -} -.topNav a:hover, .bottomNav a:hover { - text-decoration:none; - color:#bb7a2a; - text-transform:uppercase; -} -.navBarCell1Rev { - background-color:#F8981D; - color:#253441; - margin: auto 5px; -} -.skipNav { - position:absolute; - top:auto; - left:-9999px; - overflow:hidden; -} -/* -Page header and footer styles -*/ -.header, .footer { - clear:both; - margin:0 20px; - padding:5px 0 0 0; -} -.indexHeader { - margin:10px; - position:relative; -} -.indexHeader span{ - margin-right:15px; -} -.indexHeader h1 { - font-size:13px; -} -.title { - color:#2c4557; - margin:10px 0; -} -.subTitle { - margin:5px 0 0 0; -} -.header ul { - margin:0 0 15px 0; - padding:0; -} -.footer ul { - margin:20px 0 5px 0; -} -.header ul li, .footer ul li { - list-style:none; - font-size:13px; -} -/* -Heading styles -*/ -div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList ul.blockList li.blockList h3 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList li.blockList h3 { - padding:0; - margin:15px 0; -} -ul.blockList li.blockList h2 { - padding:0px 0 20px 0; -} -/* -Page layout container styles -*/ -.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { - clear:both; - padding:10px 20px; - position:relative; -} -.indexContainer { - margin:10px; - position:relative; - font-size:12px; -} -.indexContainer h2 { - font-size:13px; - padding:0 0 3px 0; -} -.indexContainer ul { - margin:0; - padding:0; -} -.indexContainer ul li { - list-style:none; - padding-top:2px; -} -.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { - font-size:12px; - font-weight:bold; - margin:10px 0 0 0; - color:#4E4E4E; -} -.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { - margin:5px 0 10px 0px; - font-size:14px; - font-family:'DejaVu Sans Mono',monospace; -} -.serializedFormContainer dl.nameValue dt { - margin-left:1px; - font-size:1.1em; - display:inline; - font-weight:bold; -} -.serializedFormContainer dl.nameValue dd { - margin:0 0 0 1px; - font-size:1.1em; - display:inline; -} -/* -List styles -*/ -ul.horizontal li { - display:inline; - font-size:0.9em; -} -ul.inheritance { - margin:0; - padding:0; -} -ul.inheritance li { - display:inline; - list-style:none; -} -ul.inheritance li ul.inheritance { - margin-left:15px; - padding-left:15px; - padding-top:1px; -} -ul.blockList, ul.blockListLast { - margin:10px 0 10px 0; - padding:0; -} -ul.blockList li.blockList, ul.blockListLast li.blockList { - list-style:none; - margin-bottom:15px; - line-height:1.4; -} -ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { - padding:0px 20px 5px 10px; - border:1px solid #ededed; - background-color:#f8f8f8; -} -ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { - padding:0 0 5px 8px; - background-color:#ffffff; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { - margin-left:0; - padding-left:0; - padding-bottom:15px; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { - list-style:none; - border-bottom:none; - padding-bottom:0; -} -table tr td dl, table tr td dl dt, table tr td dl dd { - margin-top:0; - margin-bottom:1px; -} -/* -Table styles -*/ -.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { - width:100%; - border-left:1px solid #EEE; - border-right:1px solid #EEE; - border-bottom:1px solid #EEE; -} -.overviewSummary, .memberSummary { - padding:0px; -} -.overviewSummary caption, .memberSummary caption, .typeSummary caption, -.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { - position:relative; - text-align:left; - background-repeat:no-repeat; - color:#253441; - font-weight:bold; - clear:none; - overflow:hidden; - padding:0px; - padding-top:10px; - padding-left:1px; - margin:0px; - white-space:pre; -} -.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, -.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, -.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, -.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, -.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, -.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, -.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, -.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { - color:#FFFFFF; -} -.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, -.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - padding-bottom:7px; - display:inline-block; - float:left; - background-color:#F8981D; - border: none; - height:16px; -} -.memberSummary caption span.activeTableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#F8981D; - height:16px; -} -.memberSummary caption span.tableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#4D7A97; - height:16px; -} -.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { - padding-top:0px; - padding-left:0px; - padding-right:0px; - background-image:none; - float:none; - display:inline; -} -.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, -.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { - display:none; - width:5px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .activeTableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .tableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - background-color:#4D7A97; - float:left; - -} -.overviewSummary td, .memberSummary td, .typeSummary td, -.useSummary td, .constantsSummary td, .deprecatedSummary td { - text-align:left; - padding:0px 0px 12px 10px; -} -th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, -td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ - vertical-align:top; - padding-right:0px; - padding-top:8px; - padding-bottom:3px; -} -th.colFirst, th.colLast, th.colOne, .constantsSummary th { - background:#dee3e9; - text-align:left; - padding:8px 3px 3px 7px; -} -td.colFirst, th.colFirst { - white-space:nowrap; - font-size:13px; -} -td.colLast, th.colLast { - font-size:13px; -} -td.colOne, th.colOne { - font-size:13px; -} -.overviewSummary td.colFirst, .overviewSummary th.colFirst, -.useSummary td.colFirst, .useSummary th.colFirst, -.overviewSummary td.colOne, .overviewSummary th.colOne, -.memberSummary td.colFirst, .memberSummary th.colFirst, -.memberSummary td.colOne, .memberSummary th.colOne, -.typeSummary td.colFirst{ - width:25%; - vertical-align:top; -} -td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { - font-weight:bold; -} -.tableSubHeadingColor { - background-color:#EEEEFF; -} -.altColor { - background-color:#FFFFFF; -} -.rowColor { - background-color:#EEEEEF; -} -/* -Content styles -*/ -.description pre { - margin-top:0; -} -.deprecatedContent { - margin:0; - padding:10px 0; -} -.docSummary { - padding:0; -} - -ul.blockList ul.blockList ul.blockList li.blockList h3 { - font-style:normal; -} - -div.block { - font-size:14px; - font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; -} - -td.colLast div { - padding-top:0px; -} - - -td.colLast a { - padding-bottom:3px; -} -/* -Formatting effect styles -*/ -.sourceLineNo { - color:green; - padding:0 30px 0 0; -} -h1.hidden { - visibility:hidden; - overflow:hidden; - font-size:10px; -} -.block { - display:block; - margin:3px 10px 2px 0px; - color:#474747; -} -.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, -.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, -.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { - font-weight:bold; -} -.deprecationComment, .emphasizedPhrase, .interfaceName { - font-style:italic; -} - -div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, -div.block div.block span.interfaceName { - font-style:normal; -} - -div.contentContainer ul.blockList li.blockList h2{ - padding-bottom:0px; -} diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/allclasses-frame.html b/connectors/docs/0.5.0/delta-standalone/api/java/allclasses-frame.html deleted file mode 100644 index 9d2755cfc55..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/allclasses-frame.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - -All Classes (Delta Standalone 0.5.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/allclasses-noframe.html b/connectors/docs/0.5.0/delta-standalone/api/java/allclasses-noframe.html deleted file mode 100644 index 73baf2379c2..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/allclasses-noframe.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - -All Classes (Delta Standalone 0.5.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/constant-values.html b/connectors/docs/0.5.0/delta-standalone/api/java/constant-values.html deleted file mode 100644 index ed4344ed903..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/constant-values.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - -Constant Field Values (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Constant Field Values

-

Contents

- -
-
- - -

io.delta.*

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/deprecated-list.html b/connectors/docs/0.5.0/delta-standalone/api/java/deprecated-list.html deleted file mode 100644 index 848ee191730..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/deprecated-list.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - -Deprecated List (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Deprecated API

-

Contents

- -
-
- - - -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/help-doc.html b/connectors/docs/0.5.0/delta-standalone/api/java/help-doc.html deleted file mode 100644 index c919c586342..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/help-doc.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - -API Help (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

How This API Document Is Organized

-
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
-
-
- -This help file applies to API documentation generated using the standard doclet.
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/index-all.html b/connectors/docs/0.5.0/delta-standalone/api/java/index-all.html deleted file mode 100644 index 5644d70493f..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/index-all.html +++ /dev/null @@ -1,1513 +0,0 @@ - - - - - -Index (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
A B C D E F G H I J L M N O P R S T U V W  - - -

A

-
-
Action - Interface in io.delta.standalone.actions
-
-
A marker interface for all actions that can be applied to a Delta table.
-
-
add(StructField) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new field.
-
-
add(String, DataType) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new nullable field with no metadata.
-
-
add(String, DataType, boolean) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new field with no metadata.
-
-
AddCDCFile - Class in io.delta.standalone.actions
-
-
A change file containing CDC data for the Delta version it's within.
-
-
AddCDCFile(String, Map<String, String>, long, Map<String, String>) - Constructor for class io.delta.standalone.actions.AddCDCFile
-
 
-
AddFile - Class in io.delta.standalone.actions
-
-
Represents an action that adds a new file to the table.
-
-
AddFile(String, Map<String, String>, long, long, boolean, String, Map<String, String>) - Constructor for class io.delta.standalone.actions.AddFile
-
 
-
AddFile.Builder - Class in io.delta.standalone.actions
-
-
Builder class for AddFile.
-
-
And - Class in io.delta.standalone.expressions
-
-
Evaluates logical expr1 AND expr2 for new And(expr1, expr2).
-
-
And(Expression, Expression) - Constructor for class io.delta.standalone.expressions.And
-
 
-
ArrayType - Class in io.delta.standalone.types
-
-
The data type for collections of multiple values.
-
-
ArrayType(DataType, boolean) - Constructor for class io.delta.standalone.types.ArrayType
-
 
-
- - - -

B

-
-
BinaryComparison - Class in io.delta.standalone.expressions
-
-
A BinaryOperator that compares the left and right Expressions and evaluates to a - boolean value.
-
-
BinaryExpression - Class in io.delta.standalone.expressions
-
-
An Expression with two inputs and one output.
-
-
BinaryOperator - Class in io.delta.standalone.expressions
-
-
A BinaryExpression that is an operator, meaning the string representation is - x symbol y, rather than funcName(x, y).
-
-
BinaryType - Class in io.delta.standalone.types
-
-
The data type representing byte[] values.
-
-
BinaryType() - Constructor for class io.delta.standalone.types.BinaryType
-
 
-
BooleanType - Class in io.delta.standalone.types
-
-
The data type representing boolean values.
-
-
BooleanType() - Constructor for class io.delta.standalone.types.BooleanType
-
 
-
build() - Method in class io.delta.standalone.actions.AddFile.Builder
-
-
Builds an AddFile using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
-
Builds a CommitInfo using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.JobInfo.Builder
-
-
Builds a JobInfo using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.Metadata.Builder
-
-
Builds a Metadata using the provided parameters.
-
-
build() - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
builder(String, Map<String, String>, long, long, boolean) - Static method in class io.delta.standalone.actions.AddFile
-
 
-
Builder(String, Map<String, String>, long, long, boolean) - Constructor for class io.delta.standalone.actions.AddFile.Builder
-
 
-
builder() - Static method in class io.delta.standalone.actions.CommitInfo
-
 
-
Builder() - Constructor for class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
builder(String) - Static method in class io.delta.standalone.actions.JobInfo
-
 
-
Builder(String) - Constructor for class io.delta.standalone.actions.JobInfo.Builder
-
 
-
builder() - Static method in class io.delta.standalone.actions.Metadata
-
 
-
Builder() - Constructor for class io.delta.standalone.actions.Metadata.Builder
-
 
-
builder() - Static method in class io.delta.standalone.types.FieldMetadata
-
 
-
Builder() - Constructor for class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
ByteType - Class in io.delta.standalone.types
-
-
The data type representing byte values.
-
-
ByteType() - Constructor for class io.delta.standalone.types.ByteType
-
 
-
- - - -

C

-
-
children() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
children() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
children() - Method in class io.delta.standalone.expressions.In
-
 
-
children() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
children() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
CloseableIterator<T> - Interface in io.delta.standalone.data
-
-
An Iterator that also implements the Closeable interface.
-
-
clusterId(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
Column - Class in io.delta.standalone.expressions
-
-
A column whose row-value will be computed based on the data in a RowRecord.
-
-
Column(String, DataType) - Constructor for class io.delta.standalone.expressions.Column
-
 
-
column(String) - Method in class io.delta.standalone.types.StructType
-
-
Creates a Column expression for the field with the given fieldName.
-
-
commit(Iterable<T>, Operation, String) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Modifies the state of the log by adding a new commit that is based on a read at the table's - latest version as of this transaction's instantiation.
-
-
CommitInfo - Class in io.delta.standalone.actions
-
-
Holds provenance information about changes to the table.
-
-
CommitInfo(Optional<Long>, Timestamp, Optional<String>, Optional<String>, String, Map<String, String>, Optional<JobInfo>, Optional<NotebookInfo>, Optional<String>, Optional<Long>, Optional<String>, Optional<Boolean>, Optional<Map<String, String>>, Optional<String>) - Constructor for class io.delta.standalone.actions.CommitInfo
-
 
-
CommitInfo(Optional<Long>, Timestamp, Optional<String>, Optional<String>, String, Map<String, String>, Optional<JobInfo>, Optional<NotebookInfo>, Optional<String>, Optional<Long>, Optional<String>, Optional<Boolean>, Optional<Map<String, String>>, Optional<String>, Optional<String>) - Constructor for class io.delta.standalone.actions.CommitInfo
-
 
-
CommitInfo.Builder - Class in io.delta.standalone.actions
-
-
Builder class for CommitInfo.
-
-
CommitResult - Class in io.delta.standalone
-
- -
-
CommitResult(long) - Constructor for class io.delta.standalone.CommitResult
-
 
-
ConcurrentAppendException - Exception in io.delta.standalone.exceptions
-
-
Thrown when files are added that would have been read by the current transaction.
-
-
ConcurrentAppendException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentAppendException
-
 
-
ConcurrentDeleteDeleteException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the current transaction deletes data that was deleted by a concurrent transaction.
-
-
ConcurrentDeleteDeleteException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentDeleteDeleteException
-
 
-
ConcurrentDeleteReadException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the current transaction reads data that was deleted by a concurrent transaction.
-
-
ConcurrentDeleteReadException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentDeleteReadException
-
 
-
ConcurrentTransactionException - Exception in io.delta.standalone.exceptions
-
-
Thrown when concurrent transaction both attempt to update the same idempotent transaction.
-
-
ConcurrentTransactionException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentTransactionException
-
 
-
configuration(Map<String, String>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
contains(String) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
containsNull() - Method in class io.delta.standalone.types.ArrayType
-
 
-
copyBuilder() - Method in class io.delta.standalone.actions.Metadata
-
 
-
createdTime(Long) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
createdTime(Optional<Long>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
- - - -

D

-
-
dataType() - Method in class io.delta.standalone.expressions.Column
-
 
-
dataType() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
dataType() - Method in class io.delta.standalone.expressions.Literal
-
 
-
dataType() - Method in interface io.delta.standalone.expressions.Predicate
-
 
-
DataType - Class in io.delta.standalone.types
-
-
The base type of all io.delta.standalone data types.
-
-
DataType() - Constructor for class io.delta.standalone.types.DataType
-
 
-
DateType - Class in io.delta.standalone.types
-
-
A date type, supporting "0001-01-01" through "9999-12-31".
-
-
DateType() - Constructor for class io.delta.standalone.types.DateType
-
 
-
DecimalType - Class in io.delta.standalone.types
-
-
The data type representing java.math.BigDecimal values.
-
-
DecimalType(int, int) - Constructor for class io.delta.standalone.types.DecimalType
-
 
-
DeltaConcurrentModificationException - Exception in io.delta.standalone.exceptions
-
-
The basic class for all Delta Standalone commit conflict exceptions.
-
-
DeltaConcurrentModificationException(String) - Constructor for exception io.delta.standalone.exceptions.DeltaConcurrentModificationException
-
 
-
DeltaLog - Interface in io.delta.standalone
-
-
Represents the transaction logs of a Delta table.
-
-
DeltaScan - Interface in io.delta.standalone
-
-
Provides access to an iterator over the files in this snapshot.
-
-
DeltaStandaloneException - Exception in io.delta.standalone.exceptions
-
-
Thrown when a query fails, usually because the query itself is invalid.
-
-
DeltaStandaloneException() - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
DeltaStandaloneException(String) - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
DeltaStandaloneException(String, Throwable) - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
deltaToParquet(StructType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, Boolean) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, ParquetSchemaConverter.ParquetOutputTimestampType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, Boolean, ParquetSchemaConverter.ParquetOutputTimestampType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
description(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
DoubleType - Class in io.delta.standalone.types
-
-
The data type representing double values.
-
-
DoubleType() - Constructor for class io.delta.standalone.types.DoubleType
-
 
-
- - - -

E

-
-
engineInfo(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.AddFile
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Format
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.JobInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Metadata
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Protocol
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.Column
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.Literal
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.types.ArrayType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.DataType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.DecimalType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
equals(Object) - Method in class io.delta.standalone.types.MapType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.StructField
-
 
-
equals(Object) - Method in class io.delta.standalone.types.StructType
-
 
-
EqualTo - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 = expr2 for new EqualTo(expr1, expr2).
-
-
EqualTo(Expression, Expression) - Constructor for class io.delta.standalone.expressions.EqualTo
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.Column
-
 
-
eval(RowRecord) - Method in interface io.delta.standalone.expressions.Expression
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.In
-
-
This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide.
-
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.IsNotNull
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.IsNull
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.Literal
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
executionTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to execute the entire operation.
-
-
Expression - Interface in io.delta.standalone.expressions
-
-
An expression in Delta Standalone.
-
-
- - - -

F

-
-
False - Static variable in class io.delta.standalone.expressions.Literal
-
 
-
FieldMetadata - Class in io.delta.standalone.types
-
-
The metadata for a given StructField.
-
-
FieldMetadata.Builder - Class in io.delta.standalone.types
-
-
Builder class for FieldMetadata.
-
-
FileAction - Interface in io.delta.standalone.actions
-
-
Generic interface for Actions pertaining to the addition and removal of files.
-
-
FloatType - Class in io.delta.standalone.types
-
-
The data type representing float values.
-
-
FloatType() - Constructor for class io.delta.standalone.types.FloatType
-
 
-
Format - Class in io.delta.standalone.actions
-
-
A specification of the encoding for the files stored in a table.
-
-
Format(String, Map<String, String>) - Constructor for class io.delta.standalone.actions.Format
-
 
-
Format() - Constructor for class io.delta.standalone.actions.Format
-
 
-
format(Format) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
forTable(Configuration, String) - Static method in interface io.delta.standalone.DeltaLog
-
-
Create a DeltaLog instance representing the table located at the provided - path.
-
-
forTable(Configuration, Path) - Static method in interface io.delta.standalone.DeltaLog
-
-
Create a DeltaLog instance representing the table located at the provided - path.
-
-
fromJson(String) - Static method in class io.delta.standalone.types.DataType
-
-
Parses the input json into a DataType.
-
-
- - - -

G

-
-
get(String) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
get(String) - Method in class io.delta.standalone.types.StructType
-
 
-
getActions() - Method in class io.delta.standalone.VersionLog
-
 
-
getActionsIterator() - Method in class io.delta.standalone.VersionLog
-
 
-
getAllFiles() - Method in interface io.delta.standalone.Snapshot
-
 
-
getAppId() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getBigDecimal(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.math.BigDecimal.
-
-
getBinary(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as binary (byte array).
-
-
getBoolean(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive boolean.
-
-
getByte(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive byte.
-
-
getCatalogString() - Method in class io.delta.standalone.types.DataType
-
 
-
getChanges(long, boolean) - Method in interface io.delta.standalone.DeltaLog
-
-
Get all actions starting from startVersion (inclusive) in increasing order of - committed version.
-
-
getChild() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
getClusterId() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getCommitInfoAt(long) - Method in interface io.delta.standalone.DeltaLog
-
 
-
getConfiguration() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getCreatedTime() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getDataType() - Method in class io.delta.standalone.types.StructField
-
 
-
getDate(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.sql.Date.
-
-
getDeletionTimestamp() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getDescription() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getDouble(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive double.
-
-
getElementType() - Method in class io.delta.standalone.types.ArrayType
-
 
-
getEngineInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getEntries() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
getFieldNames() - Method in class io.delta.standalone.types.StructType
-
 
-
getFields() - Method in class io.delta.standalone.types.StructType
-
 
-
getFiles() - Method in interface io.delta.standalone.DeltaScan
-
-
Creates a CloseableIterator over files belonging to this snapshot.
-
-
getFloat(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive float.
-
-
getFormat() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getId() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getInputPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getInt(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive int.
-
-
getIsBlindAppend() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getIsolationLevel() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getJobId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getJobInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getJobName() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getJobOwnerId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getKeyType() - Method in class io.delta.standalone.types.MapType
-
 
-
getLastUpdated() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getLeft() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
getLength() - Method in interface io.delta.standalone.data.RowRecord
-
 
-
getList(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.util.List<T> object.
-
-
getLong(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive long.
-
-
getMap(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
-
-
getMetadata() - Method in interface io.delta.standalone.Snapshot
-
 
-
getMetadata() - Method in class io.delta.standalone.types.StructField
-
 
-
getMetrics() - Method in class io.delta.standalone.Operation
-
 
-
getMinReaderVersion() - Method in class io.delta.standalone.actions.Protocol
-
 
-
getMinWriterVersion() - Method in class io.delta.standalone.actions.Protocol
-
 
-
getModificationTime() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getName() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getName() - Method in class io.delta.standalone.Operation
-
 
-
getName() - Method in class io.delta.standalone.types.StructField
-
 
-
getNotebookId() - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
getNotebookInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperation() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperationMetrics() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperationParameters() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOptions() - Method in class io.delta.standalone.actions.Format
-
 
-
getParameters() - Method in class io.delta.standalone.Operation
-
 
-
getPartitionColumns() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getPath() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getPath() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getPath() - Method in interface io.delta.standalone.actions.FileAction
-
 
-
getPath() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getPath() - Method in interface io.delta.standalone.DeltaLog
-
 
-
getPrecision() - Method in class io.delta.standalone.types.DecimalType
-
 
-
getProvider() - Method in class io.delta.standalone.actions.Format
-
 
-
getPushedPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getReadVersion() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getRecord(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a RowRecord object.
-
-
getResidualPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getRight() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
getRunId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getScale() - Method in class io.delta.standalone.types.DecimalType
-
 
-
getSchema() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getSchema() - Method in interface io.delta.standalone.data.RowRecord
-
 
-
getShort(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive short.
-
-
getSimpleString() - Method in class io.delta.standalone.types.ByteType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.DataType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.IntegerType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.LongType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.ShortType
-
 
-
getSize() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getSize() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getSize() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getSnapshotForTimestampAsOf(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Travel back in time to the latest Snapshot that was generated at or before - timestamp.
-
-
getSnapshotForVersionAsOf(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Travel back in time to the Snapshot with the provided version number.
-
-
getStats() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getString(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a String object.
-
-
getTags() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getTags() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getTags() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getTimestamp() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getTimestamp(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.sql.Timestamp.
-
-
getTreeString() - Method in class io.delta.standalone.types.StructType
-
 
-
getTriggerType() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getTypeName() - Method in class io.delta.standalone.types.DataType
-
 
-
getUserId() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getUserMetadata() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getUserMetadata() - Method in class io.delta.standalone.Operation
-
 
-
getUserName() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getValueType() - Method in class io.delta.standalone.types.MapType
-
 
-
getVersion() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getVersion() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getVersion() - Method in class io.delta.standalone.CommitResult
-
 
-
getVersion() - Method in interface io.delta.standalone.Snapshot
-
 
-
getVersion() - Method in class io.delta.standalone.VersionLog
-
 
-
getVersionAtOrAfterTimestamp(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Returns the latest version that was committed at or after timestamp.
-
-
getVersionBeforeOrAtTimestamp(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Returns the latest version that was committed before or at timestamp.
-
-
GreaterThan - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 > expr2 for new GreaterThan(expr1, expr2).
-
-
GreaterThan(Expression, Expression) - Constructor for class io.delta.standalone.expressions.GreaterThan
-
 
-
GreaterThanOrEqual - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 >= expr2 for new GreaterThanOrEqual(expr1, expr2).
-
-
GreaterThanOrEqual(Expression, Expression) - Constructor for class io.delta.standalone.expressions.GreaterThanOrEqual
-
 
-
- - - -

H

-
-
hashCode() - Method in class io.delta.standalone.actions.AddFile
-
 
-
hashCode() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Format
-
 
-
hashCode() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Metadata
-
 
-
hashCode() - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Protocol
-
 
-
hashCode() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.Column
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.Literal
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
hashCode() - Method in class io.delta.standalone.types.ArrayType
-
 
-
hashCode() - Method in class io.delta.standalone.types.DataType
-
 
-
hashCode() - Method in class io.delta.standalone.types.DecimalType
-
 
-
hashCode() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
hashCode() - Method in class io.delta.standalone.types.MapType
-
 
-
hashCode() - Method in class io.delta.standalone.types.StructField
-
 
-
hashCode() - Method in class io.delta.standalone.types.StructType
-
 
-
- - - -

I

-
-
id(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
In - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is in exprList for new In(expr, exprList).
-
-
In(Expression, List<? extends Expression>) - Constructor for class io.delta.standalone.expressions.In
-
 
-
IntegerType - Class in io.delta.standalone.types
-
-
The data type representing int values.
-
-
IntegerType() - Constructor for class io.delta.standalone.types.IntegerType
-
 
-
io.delta.standalone - package io.delta.standalone
-
 
-
io.delta.standalone.actions - package io.delta.standalone.actions
-
 
-
io.delta.standalone.data - package io.delta.standalone.data
-
 
-
io.delta.standalone.exceptions - package io.delta.standalone.exceptions
-
 
-
io.delta.standalone.expressions - package io.delta.standalone.expressions
-
 
-
io.delta.standalone.types - package io.delta.standalone.types
-
 
-
io.delta.standalone.util - package io.delta.standalone.util
-
 
-
isBlindAppend(Boolean) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.AddFile
-
 
-
isDataChange() - Method in interface io.delta.standalone.actions.FileAction
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
isExtendedFileMetadata() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
IsNotNull - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is not null for new IsNotNull(expr).
-
-
IsNotNull(Expression) - Constructor for class io.delta.standalone.expressions.IsNotNull
-
 
-
IsNull - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is null for new IsNull(expr).
-
-
IsNull(Expression) - Constructor for class io.delta.standalone.expressions.IsNull
-
 
-
isNullable() - Method in class io.delta.standalone.types.StructField
-
 
-
isNullAt(String) - Method in interface io.delta.standalone.data.RowRecord
-
 
-
isolationLevel(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
isWriteCompatible(StructType) - Method in class io.delta.standalone.types.StructType
-
-
Whether a new schema can replace this existing schema in a Delta table without rewriting data - files in the table.
-
-
- - - -

J

-
-
jobInfo(JobInfo) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
JobInfo - Class in io.delta.standalone.actions
-
-
Represents the Databricks Job information that committed to the Delta table.
-
-
JobInfo(String, String, String, String, String) - Constructor for class io.delta.standalone.actions.JobInfo
-
 
-
JobInfo.Builder - Class in io.delta.standalone.actions
-
-
Builder class for JobInfo.
-
-
jobName(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
jobOwnerId(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
- - - -

L

-
-
LeafExpression - Class in io.delta.standalone.expressions
-
-
An Expression with no children.
-
-
length() - Method in class io.delta.standalone.types.StructType
-
 
-
LessThan - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 < expr2 for new LessThan(expr1, expr2).
-
-
LessThan(Expression, Expression) - Constructor for class io.delta.standalone.expressions.LessThan
-
 
-
LessThanOrEqual - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 <= expr2 for new LessThanOrEqual(expr1, expr2).
-
-
LessThanOrEqual(Expression, Expression) - Constructor for class io.delta.standalone.expressions.LessThanOrEqual
-
 
-
Literal - Class in io.delta.standalone.expressions
-
-
A literal value.
-
-
LongType - Class in io.delta.standalone.types
-
-
The data type representing long values.
-
-
LongType() - Constructor for class io.delta.standalone.types.LongType
-
 
-
- - - -

M

-
-
MapType - Class in io.delta.standalone.types
-
-
The data type for Maps.
-
-
MapType(DataType, DataType, boolean) - Constructor for class io.delta.standalone.types.MapType
-
 
-
markFilesAsRead(Expression) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Mark files matched by the readPredicate as read by this transaction.
-
-
Metadata - Class in io.delta.standalone.actions
-
-
Updates the metadata of the table.
-
-
Metadata(String, String, String, Format, List<String>, Map<String, String>, Optional<Long>, StructType) - Constructor for class io.delta.standalone.actions.Metadata
-
 
-
metadata() - Method in interface io.delta.standalone.OptimisticTransaction
-
 
-
Metadata.Builder - Class in io.delta.standalone.actions
-
-
Builder class for Metadata.
-
-
MetadataChangedException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the metadata of the Delta table has changed between the time of read - and the time of commit.
-
-
MetadataChangedException(String) - Constructor for exception io.delta.standalone.exceptions.MetadataChangedException
-
 
-
Metrics() - Constructor for class io.delta.standalone.Operation.Metrics
-
 
-
- - - -

N

-
-
name(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
name() - Method in class io.delta.standalone.expressions.Column
-
 
-
Not - Class in io.delta.standalone.expressions
-
-
Evaluates logical NOT expr for new Not(expr).
-
-
Not(Expression) - Constructor for class io.delta.standalone.expressions.Not
-
 
-
notebookInfo(NotebookInfo) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
NotebookInfo - Class in io.delta.standalone.actions
-
-
Represents the Databricks Notebook information that committed to the Delta table.
-
-
NotebookInfo(String) - Constructor for class io.delta.standalone.actions.NotebookInfo
-
 
-
nullSafeEval(Object, Object) - Method in class io.delta.standalone.expressions.And
-
 
-
nullSafeEval(Object) - Method in class io.delta.standalone.expressions.Not
-
 
-
nullSafeEval(Object, Object) - Method in class io.delta.standalone.expressions.Or
-
 
-
NullType - Class in io.delta.standalone.types
-
-
The data type representing null values.
-
-
NullType() - Constructor for class io.delta.standalone.types.NullType
-
 
-
numAddedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files added.
-
-
numConvertedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of parquet files that have been converted.
-
-
numCopiedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows copied in the process of deleting files.
-
-
numDeletedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows removed.
-
-
numFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files written.
-
-
numOutputBytes - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Size in bytes of the written contents.
-
-
numOutputRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows written.
-
-
numRemovedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files removed.
-
-
numSourceRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows in the source table.
-
-
numTargetFilesAdded - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number files added to the sink(target).
-
-
numTargetFilesRemoved - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files removed from the sink(target).
-
-
numTargetRowsCopied - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of target rows copied.
-
-
numTargetRowsDeleted - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows deleted in the target table.
-
-
numTargetRowsInserted - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows inserted into the target table.
-
-
numTargetRowsUpdated - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows updated in the target table.
-
-
numUpdatedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows updated.
-
-
- - - -

O

-
-
of(int) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(boolean) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(byte[]) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(Date) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(BigDecimal) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(double) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(float) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(long) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(short) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(String) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(Timestamp) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(byte) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
ofNull(DataType) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
open() - Method in interface io.delta.standalone.Snapshot
-
-
Creates a CloseableIterator which can iterate over data belonging to this snapshot.
-
-
operation(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
Operation - Class in io.delta.standalone
-
-
An operation that can be performed on a Delta table.
-
-
Operation(Operation.Name) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>, Map<String, String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>, Map<String, String>, Optional<String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation.Metrics - Class in io.delta.standalone
-
-
Some possible operation metrics and their suggested corresponding operation types.
-
-
Operation.Name - Enum in io.delta.standalone
-
-
Supported operation types.
-
-
operationMetrics(Map<String, String>) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
operationParameters(Map<String, String>) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
OptimisticTransaction - Interface in io.delta.standalone
-
-
Used to perform a set of reads in a transaction and then commit a set of updates to the - state of the log.
-
-
Or - Class in io.delta.standalone.expressions
-
-
Evaluates logical expr1 OR expr2 for new Or(expr1, expr2).
-
-
Or(Expression, Expression) - Constructor for class io.delta.standalone.expressions.Or
-
 
-
outputTimestampTypeDefault - Static variable in class io.delta.standalone.util.ParquetSchemaConverter
-
 
-
- - - -

P

-
-
ParquetSchemaConverter - Class in io.delta.standalone.util
-
-
:: DeveloperApi ::
-
-
ParquetSchemaConverter.ParquetOutputTimestampType - Enum in io.delta.standalone.util
-
-
:: DeveloperApi ::
-
-
partitionColumns(List<String>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
Predicate - Interface in io.delta.standalone.expressions
-
-
An Expression that defines a relation on inputs.
-
-
Protocol - Class in io.delta.standalone.actions
-
-
Used to block older clients from reading or writing the log when backwards - incompatible changes are made to the protocol.
-
-
Protocol(int, int) - Constructor for class io.delta.standalone.actions.Protocol
-
 
-
ProtocolChangedException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the protocol version has changed between the time of read and the time of commit.
-
-
ProtocolChangedException(String) - Constructor for exception io.delta.standalone.exceptions.ProtocolChangedException
-
 
-
putBoolean(String, boolean) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putBooleanArray(String, Boolean[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putDouble(String, double) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putDoubleArray(String, Double[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putLong(String, long) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putLongArray(String, Long[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putMetadata(String, FieldMetadata) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putMetadataArray(String, FieldMetadata[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putNull(String) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putString(String, String) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putStringArray(String, String[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
- - - -

R

-
-
readVersion(Long) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
readWholeTable() - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Mark the entire table as tainted (i.e.
-
-
references() - Method in class io.delta.standalone.expressions.Column
-
 
-
references() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
references() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
remove() - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(long) - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(boolean) - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(long, boolean) - Method in class io.delta.standalone.actions.AddFile
-
 
-
RemoveFile - Class in io.delta.standalone.actions
-
-
Logical removal of a given file from the reservoir.
-
-
RemoveFile(String, Optional<Long>, boolean, boolean, Map<String, String>, Optional<Long>, Map<String, String>) - Constructor for class io.delta.standalone.actions.RemoveFile
-
-
Deprecated. -
RemoveFile should be created from AddFile.remove() instead.
-
-
-
rewriteTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to rewrite the matched files.
-
-
RowRecord - Interface in io.delta.standalone.data
-
-
Represents one row of data containing a non-empty collection of fieldName - value pairs.
-
-
runId(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
- - - -

S

-
-
scan() - Method in interface io.delta.standalone.Snapshot
-
 
-
scan(Expression) - Method in interface io.delta.standalone.Snapshot
-
 
-
scanTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to scan the files for matches.
-
-
schema(StructType) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
SetTransaction - Class in io.delta.standalone.actions
-
-
Sets the committed version for a given application.
-
-
SetTransaction(String, long, Optional<Long>) - Constructor for class io.delta.standalone.actions.SetTransaction
-
 
-
ShortType - Class in io.delta.standalone.types
-
-
The data type representing short values.
-
-
ShortType() - Constructor for class io.delta.standalone.types.ShortType
-
 
-
snapshot() - Method in interface io.delta.standalone.DeltaLog
-
 
-
Snapshot - Interface in io.delta.standalone
-
-
Snapshot provides APIs to access the Delta table state (such as table metadata, active - files) at some version.
-
-
startTransaction() - Method in interface io.delta.standalone.DeltaLog
-
-
Returns a new OptimisticTransaction that can be used to read the current state of the - log and then commit updates.
-
-
stats(String) - Method in class io.delta.standalone.actions.AddFile.Builder
-
 
-
StringType - Class in io.delta.standalone.types
-
-
The data type representing String values.
-
-
StringType() - Constructor for class io.delta.standalone.types.StringType
-
 
-
StructField - Class in io.delta.standalone.types
-
-
A field inside a StructType.
-
-
StructField(String, DataType) - Constructor for class io.delta.standalone.types.StructField
-
-
Constructor with default nullable = true.
-
-
StructField(String, DataType, boolean) - Constructor for class io.delta.standalone.types.StructField
-
 
-
StructField(String, DataType, boolean, FieldMetadata) - Constructor for class io.delta.standalone.types.StructField
-
 
-
StructType - Class in io.delta.standalone.types
-
-
The data type representing a table's schema, consisting of a collection of - fields (that is, fieldName to dataType pairs).
-
-
StructType() - Constructor for class io.delta.standalone.types.StructType
-
 
-
StructType(StructField[]) - Constructor for class io.delta.standalone.types.StructType
-
 
-
- - - -

T

-
-
tableExists() - Method in interface io.delta.standalone.DeltaLog
-
 
-
tags(Map<String, String>) - Method in class io.delta.standalone.actions.AddFile.Builder
-
 
-
timestamp(Timestamp) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
TimestampType - Class in io.delta.standalone.types
-
-
The data type representing java.sql.Timestamp values.
-
-
TimestampType() - Constructor for class io.delta.standalone.types.TimestampType
-
 
-
toJson() - Method in class io.delta.standalone.types.DataType
-
 
-
toPrettyJson() - Method in class io.delta.standalone.types.DataType
-
 
-
toString() - Method in class io.delta.standalone.expressions.BinaryOperator
-
 
-
toString() - Method in class io.delta.standalone.expressions.Column
-
 
-
toString() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
toString() - Method in class io.delta.standalone.expressions.In
-
 
-
toString() - Method in class io.delta.standalone.expressions.IsNotNull
-
 
-
toString() - Method in class io.delta.standalone.expressions.IsNull
-
 
-
toString() - Method in class io.delta.standalone.expressions.Literal
-
 
-
toString() - Method in class io.delta.standalone.expressions.Not
-
 
-
toString() - Method in enum io.delta.standalone.Operation.Name
-
 
-
toString() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
triggerType(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
True - Static variable in class io.delta.standalone.expressions.Literal
-
 
-
txnVersion(String) - Method in interface io.delta.standalone.OptimisticTransaction
-
 
-
- - - -

U

-
-
UnaryExpression - Class in io.delta.standalone.expressions
-
-
An Expression with one input and one output.
-
-
update() - Method in interface io.delta.standalone.DeltaLog
-
-
Bring DeltaLog's current Snapshot to the latest state if there are any new - transaction logs.
-
-
updateMetadata(Metadata) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Records an update to the metadata that should be committed with this transaction.
-
-
USER_DEFAULT - Static variable in class io.delta.standalone.types.DecimalType
-
 
-
userId(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
userMetadata(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
userName(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
- - - -

V

-
-
value() - Method in class io.delta.standalone.expressions.Literal
-
 
-
valueContainsNull() - Method in class io.delta.standalone.types.MapType
-
 
-
valueOf(String) - Static method in enum io.delta.standalone.Operation.Name
-
-
Returns the enum constant of this type with the specified name.
-
-
valueOf(String) - Static method in enum io.delta.standalone.util.ParquetSchemaConverter.ParquetOutputTimestampType
-
-
Returns the enum constant of this type with the specified name.
-
-
values() - Static method in enum io.delta.standalone.Operation.Name
-
-
Returns an array containing the constants of this enum type, in -the order they are declared.
-
-
values() - Static method in enum io.delta.standalone.util.ParquetSchemaConverter.ParquetOutputTimestampType
-
-
Returns an array containing the constants of this enum type, in -the order they are declared.
-
-
version(Long) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
VersionLog - Class in io.delta.standalone
-
-
VersionLog is the representation of all actions (changes) to the Delta Table - at a specific table version.
-
-
VersionLog(long, List<Action>) - Constructor for class io.delta.standalone.VersionLog
-
 
-
- - - -

W

-
-
writeLegacyParquetFormatDefault - Static variable in class io.delta.standalone.util.ParquetSchemaConverter
-
 
-
-A B C D E F G H I J L M N O P R S T U V W 
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/index.html b/connectors/docs/0.5.0/delta-standalone/api/java/index.html deleted file mode 100644 index 0f6f82d325c..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - -Delta Standalone 0.5.0 JavaDoc - - - - - - - - - -<noscript> -<div>JavaScript is disabled on your browser.</div> -</noscript> -<h2>Frame Alert</h2> -<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html deleted file mode 100644 index bc27ede6553..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - -CommitResult (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class CommitResult

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      CommitResult(long version) 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - -
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      longgetVersion() 
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CommitResult

        -
        public CommitResult(long version)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the table version that was committed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html deleted file mode 100644 index 1e52a1d9e60..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html +++ /dev/null @@ -1,542 +0,0 @@ - - - - - -DeltaLog (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface DeltaLog

-
-
-
-
    -
  • -
    -
    -
    public interface DeltaLog
    -
    Represents the transaction logs of a Delta table. It provides APIs to access the states of a - Delta table. -

    - You can use the following code to create a DeltaLog instance. -

    
    -   Configuration conf = ... // Create your own Hadoop Configuration instance
    -   DeltaLog deltaLog = DeltaLog.forTable(conf, "/the/delta/table/path");
    - 
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        snapshot

        -
        Snapshot snapshot()
        -
        -
        Returns:
        -
        the current Snapshot of the Delta table. You may need to call - update() to access the latest snapshot if the current snapshot is stale.
        -
        -
      • -
      - - - -
        -
      • -

        update

        -
        Snapshot update()
        -
        Bring DeltaLog's current Snapshot to the latest state if there are any new - transaction logs.
        -
        -
        Returns:
        -
        the latest snapshot after applying the new transaction logs.
        -
        -
      • -
      - - - -
        -
      • -

        getSnapshotForVersionAsOf

        -
        Snapshot getSnapshotForVersionAsOf(long version)
        -
        Travel back in time to the Snapshot with the provided version number.
        -
        -
        Parameters:
        -
        version - the snapshot version to generate
        -
        Returns:
        -
        the snapshot at the provided version
        -
        Throws:
        -
        IllegalArgumentException - if the version is outside the range of available - versions
        -
        -
      • -
      - - - -
        -
      • -

        getSnapshotForTimestampAsOf

        -
        Snapshot getSnapshotForTimestampAsOf(long timestamp)
        -
        Travel back in time to the latest Snapshot that was generated at or before - timestamp.
        -
        -
        Parameters:
        -
        timestamp - the number of milliseconds since midnight, January 1, 1970 UTC
        -
        Returns:
        -
        the snapshot nearest to, but not after, the provided timestamp
        -
        Throws:
        -
        RuntimeException - if the snapshot is unable to be recreated
        -
        IllegalArgumentException - if the timestamp is before the earliest possible - snapshot or after the latest possible snapshot
        -
        -
      • -
      - - - -
        -
      • -

        startTransaction

        -
        OptimisticTransaction startTransaction()
        -
        Returns a new OptimisticTransaction that can be used to read the current state of the - log and then commit updates. The reads and updates will be checked for logical conflicts - with any concurrent writes to the log. -

        - Note that all reads in a transaction must go through the returned transaction object, and not - directly to the DeltaLog otherwise they will not be checked for conflicts.

        -
        -
        Returns:
        -
        a new OptimisticTransaction.
        -
        -
      • -
      - - - -
        -
      • -

        getCommitInfoAt

        -
        CommitInfo getCommitInfoAt(long version)
        -
        -
        Parameters:
        -
        version - the commit version to retrieve CommitInfo
        -
        Returns:
        -
        the CommitInfo of the commit at the provided version.
        -
        -
      • -
      - - - -
        -
      • -

        getPath

        -
        org.apache.hadoop.fs.Path getPath()
        -
        -
        Returns:
        -
        the path of the Delta table.
        -
        -
      • -
      - - - -
        -
      • -

        getChanges

        -
        java.util.Iterator<VersionLog> getChanges(long startVersion,
        -                                          boolean failOnDataLoss)
        -
        Get all actions starting from startVersion (inclusive) in increasing order of - committed version. -

        - If startVersion doesn't exist, return an empty Iterator.

        -
        -
        Parameters:
        -
        startVersion - the table version to begin retrieving actions from (inclusive)
        -
        failOnDataLoss - whether to throw when data loss detected
        -
        Returns:
        -
        an Iterator of VersionLogs starting from startVersion
        -
        Throws:
        -
        IllegalArgumentException - if startVersion is negative
        -
        IllegalStateException - if data loss detected and failOnDataLoss is true
        -
        -
      • -
      - - - -
        -
      • -

        getVersionBeforeOrAtTimestamp

        -
        long getVersionBeforeOrAtTimestamp(long timestamp)
        -
        Returns the latest version that was committed before or at timestamp. If no version - exists, returns -1. - - Specifically: -
          -
        • if a commit version exactly matches the provided timestamp, we return it
        • -
        • else, we return the latest commit version with a timestamp less than the - provided one
        • -
        • If the provided timestamp is less than the timestamp of any committed version, - we throw an error.
        • -
        .
        -
        -
        Parameters:
        -
        timestamp - the number of milliseconds since midnight, January 1, 1970 UTC
        -
        Returns:
        -
        latest commit that happened before or at timestamp.
        -
        Throws:
        -
        IllegalArgumentException - if the timestamp is less than the timestamp of any committed - version
        -
        -
      • -
      - - - -
        -
      • -

        getVersionAtOrAfterTimestamp

        -
        long getVersionAtOrAfterTimestamp(long timestamp)
        -
        Returns the latest version that was committed at or after timestamp. If no version - exists, returns -1. - - Specifically: -
          -
        • if a commit version exactly matches the provided timestamp, we return it
        • -
        • else, we return the earliest commit version with a timestamp greater than the - provided one
        • -
        • If the provided timestamp is larger than the timestamp of any committed version, - we throw an error.
        • -
        .
        -
        -
        Parameters:
        -
        timestamp - the number of milliseconds since midnight, January 1, 1970 UTC
        -
        Returns:
        -
        latest commit that happened at or before timestamp.
        -
        Throws:
        -
        IllegalArgumentException - if the timestamp is more than the timestamp of any committed - version
        -
        -
      • -
      - - - -
        -
      • -

        tableExists

        -
        boolean tableExists()
        -
        -
        Returns:
        -
        Whether a Delta table exists at this directory.
        -
        -
      • -
      - - - -
        -
      • -

        forTable

        -
        static DeltaLog forTable(org.apache.hadoop.conf.Configuration hadoopConf,
        -                         String path)
        -
        Create a DeltaLog instance representing the table located at the provided - path.
        -
        -
        Parameters:
        -
        hadoopConf - Hadoop Configuration to use when accessing the Delta table
        -
        path - the path to the Delta table
        -
        Returns:
        -
        the DeltaLog for the provided path
        -
        -
      • -
      - - - -
        -
      • -

        forTable

        -
        static DeltaLog forTable(org.apache.hadoop.conf.Configuration hadoopConf,
        -                         org.apache.hadoop.fs.Path path)
        -
        Create a DeltaLog instance representing the table located at the provided - path.
        -
        -
        Parameters:
        -
        hadoopConf - Hadoop Configuration to use when accessing the Delta table
        -
        path - the path to the Delta table
        -
        Returns:
        -
        the DeltaLog for the provided path
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html deleted file mode 100644 index e62da7d8507..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - -DeltaScan (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface DeltaScan

-
-
-
-
    -
  • -
    -
    -
    public interface DeltaScan
    -
    Provides access to an iterator over the files in this snapshot. -

    - Typically created with a read predicate Expression to let users filter files. Please note - filtering is only supported on partition columns and users should use - getResidualPredicate() to check for any unapplied portion of the input - predicate.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        getInputPredicate

        -
        java.util.Optional<Expression> getInputPredicate()
        -
        -
        Returns:
        -
        the input predicate passed in by the user
        -
        -
      • -
      - - - -
        -
      • -

        getPushedPredicate

        -
        java.util.Optional<Expression> getPushedPredicate()
        -
        -
        Returns:
        -
        portion of the input predicate that can be evaluated by Delta Standalone using only - metadata (filters on partition columns). Files returned by getFiles() are - guaranteed to satisfy the pushed predicate, and the caller doesn’t need to apply them - again on the returned files.
        -
        -
      • -
      - - - -
        -
      • -

        getResidualPredicate

        -
        java.util.Optional<Expression> getResidualPredicate()
        -
        -
        Returns:
        -
        portion of the input predicate that may not be fully applied. Files returned by - getFiles() are not guaranteed to satisfy the residual predicate, and the - caller should still apply them on the returned files.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html deleted file mode 100644 index fd21b90b577..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html +++ /dev/null @@ -1,683 +0,0 @@ - - - - - -Operation.Metrics (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class Operation.Metrics

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    Operation
    -
    -
    -
    -
    public static class Operation.Metrics
    -extends Object
    -
    Some possible operation metrics and their suggested corresponding operation types. - These are purely exemplary, and users may use whichever metrics best fit their application.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Field Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Fields 
      Modifier and TypeField and Description
      static StringexecutionTimeMs -
      Time taken to execute the entire operation.
      -
      static StringnumAddedFiles -
      Number of files added.
      -
      static StringnumConvertedFiles -
      Number of parquet files that have been converted.
      -
      static StringnumCopiedRows -
      Number of rows copied in the process of deleting files.
      -
      static StringnumDeletedRows -
      Number of rows removed.
      -
      static StringnumFiles -
      Number of files written.
      -
      static StringnumOutputBytes -
      Size in bytes of the written contents.
      -
      static StringnumOutputRows -
      Number of rows written.
      -
      static StringnumRemovedFiles -
      Number of files removed.
      -
      static StringnumSourceRows -
      Number of rows in the source table.
      -
      static StringnumTargetFilesAdded -
      Number files added to the sink(target).
      -
      static StringnumTargetFilesRemoved -
      Number of files removed from the sink(target).
      -
      static StringnumTargetRowsCopied -
      Number of target rows copied.
      -
      static StringnumTargetRowsDeleted -
      Number of rows deleted in the target table.
      -
      static StringnumTargetRowsInserted -
      Number of rows inserted into the target table.
      -
      static StringnumTargetRowsUpdated -
      Number of rows updated in the target table.
      -
      static StringnumUpdatedRows -
      Number of rows updated.
      -
      static StringrewriteTimeMs -
      Time taken to rewrite the matched files.
      -
      static StringscanTimeMs -
      Time taken to scan the files for matches.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Metrics() 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        numFiles

        -
        public static final String numFiles
        -
        Number of files written. - - Usually used with the WRITE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numOutputBytes

        -
        public static final String numOutputBytes
        -
        Size in bytes of the written contents. - - Usually used with WRITE, STREAMING_UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numOutputRows

        -
        public static final String numOutputRows
        -
        Number of rows written. - - Usually used with WRITE, STREAMING_UPDATE, MERGE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numAddedFiles

        -
        public static final String numAddedFiles
        -
        Number of files added. - - Usually used with STREAMING_UPDATE, DELETE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numRemovedFiles

        -
        public static final String numRemovedFiles
        -
        Number of files removed. - - Usually used with STREAMING_UPDATE, DELETE, DELETE_PARTITIONS, TRUNCATE, - UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numDeletedRows

        -
        public static final String numDeletedRows
        -
        Number of rows removed. - - Usually used with the DELETE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numCopiedRows

        -
        public static final String numCopiedRows
        -
        Number of rows copied in the process of deleting files. - - Usually used with DELETE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        executionTimeMs

        -
        public static final String executionTimeMs
        -
        Time taken to execute the entire operation. - - Usually used with DELETE, DELETE_PARTITIONS, TRUNCATE, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        scanTimeMs

        -
        public static final String scanTimeMs
        -
        Time taken to scan the files for matches. - - Usually used with DELETE, DELETE_PARTITIONS, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        rewriteTimeMs

        -
        public static final String rewriteTimeMs
        -
        Time taken to rewrite the matched files. - - Usually used with DELETE, DELETE_PARTITIONS, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numConvertedFiles

        -
        public static final String numConvertedFiles
        -
        Number of parquet files that have been converted. - - Usually used with the CONVERT operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numSourceRows

        -
        public static final String numSourceRows
        -
        Number of rows in the source table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsInserted

        -
        public static final String numTargetRowsInserted
        -
        Number of rows inserted into the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsUpdated

        -
        public static final String numTargetRowsUpdated
        -
        Number of rows updated in the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsDeleted

        -
        public static final String numTargetRowsDeleted
        -
        Number of rows deleted in the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsCopied

        -
        public static final String numTargetRowsCopied
        -
        Number of target rows copied. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetFilesAdded

        -
        public static final String numTargetFilesAdded
        -
        Number files added to the sink(target). - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetFilesRemoved

        -
        public static final String numTargetFilesRemoved
        -
        Number of files removed from the sink(target). - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numUpdatedRows

        -
        public static final String numUpdatedRows
        -
        Number of rows updated. - - Usually used with the UPDATE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Metrics

        -
        public Metrics()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html deleted file mode 100644 index d1383743323..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html +++ /dev/null @@ -1,589 +0,0 @@ - - - - - -Operation.Name (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Enum Operation.Name

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable, Comparable<Operation.Name>
    -
    -
    -
    Enclosing class:
    -
    Operation
    -
    -
    -
    -
    public static enum Operation.Name
    -extends Enum<Operation.Name>
    -
    Supported operation types.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Enum Constant Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Enum Constants 
      Enum Constant and Description
      ADD_COLUMNS -
      Recorded when columns are added.
      -
      CHANGE_COLUMN -
      Recorded when columns are changed.
      -
      CONVERT -
      Recorded when converting a table into a Delta table.
      -
      CREATE_TABLE -
      Recorded when the table is created.
      -
      DELETE -
      Recorded while deleting certain partitions.
      -
      MANUAL_UPDATE 
      MERGE -
      Recorded when a merge operation is committed to the table.
      -
      REPLACE_COLUMNS -
      Recorded when columns are replaced.
      -
      REPLACE_TABLE -
      Recorded when the table is replaced.
      -
      SET_TABLE_PROPERTIES -
      Recorded when the table properties are set.
      -
      STREAMING_UPDATE -
      Recorded during streaming inserts.
      -
      TRUNCATE -
      Recorded when truncating the table.
      -
      UNSET_TABLE_PROPERTIES -
      Recorded when the table properties are unset.
      -
      UPDATE -
      Recorded when an update operation is committed to the table.
      -
      UPGRADE_PROTOCOL -
      Recorded when the table protocol is upgraded.
      -
      UPGRADE_SCHEMA -
      Recorded when the table schema is upgraded.
      -
      WRITE -
      Recorded during batch inserts.
      -
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - -
      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      StringtoString() 
      static Operation.NamevalueOf(String name) -
      Returns the enum constant of this type with the specified name.
      -
      static Operation.Name[]values() -
      Returns an array containing the constants of this enum type, in -the order they are declared.
      -
      -
        -
      • - - -

        Methods inherited from class Enum

        -compareTo, equals, getDeclaringClass, hashCode, name, ordinal, valueOf
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -getClass, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Enum Constant Detail

      - - - -
        -
      • -

        WRITE

        -
        public static final Operation.Name WRITE
        -
        Recorded during batch inserts.
        -
      • -
      - - - -
        -
      • -

        STREAMING_UPDATE

        -
        public static final Operation.Name STREAMING_UPDATE
        -
        Recorded during streaming inserts.
        -
      • -
      - - - -
        -
      • -

        DELETE

        -
        public static final Operation.Name DELETE
        -
        Recorded while deleting certain partitions.
        -
      • -
      - - - -
        -
      • -

        TRUNCATE

        -
        public static final Operation.Name TRUNCATE
        -
        Recorded when truncating the table.
        -
      • -
      - - - -
        -
      • -

        CONVERT

        -
        public static final Operation.Name CONVERT
        -
        Recorded when converting a table into a Delta table.
        -
      • -
      - - - -
        -
      • -

        MERGE

        -
        public static final Operation.Name MERGE
        -
        Recorded when a merge operation is committed to the table.
        -
      • -
      - - - -
        -
      • -

        UPDATE

        -
        public static final Operation.Name UPDATE
        -
        Recorded when an update operation is committed to the table.
        -
      • -
      - - - -
        -
      • -

        CREATE_TABLE

        -
        public static final Operation.Name CREATE_TABLE
        -
        Recorded when the table is created.
        -
      • -
      - - - -
        -
      • -

        REPLACE_TABLE

        -
        public static final Operation.Name REPLACE_TABLE
        -
        Recorded when the table is replaced.
        -
      • -
      - - - -
        -
      • -

        SET_TABLE_PROPERTIES

        -
        public static final Operation.Name SET_TABLE_PROPERTIES
        -
        Recorded when the table properties are set.
        -
      • -
      - - - -
        -
      • -

        UNSET_TABLE_PROPERTIES

        -
        public static final Operation.Name UNSET_TABLE_PROPERTIES
        -
        Recorded when the table properties are unset.
        -
      • -
      - - - -
        -
      • -

        ADD_COLUMNS

        -
        public static final Operation.Name ADD_COLUMNS
        -
        Recorded when columns are added.
        -
      • -
      - - - -
        -
      • -

        CHANGE_COLUMN

        -
        public static final Operation.Name CHANGE_COLUMN
        -
        Recorded when columns are changed.
        -
      • -
      - - - -
        -
      • -

        REPLACE_COLUMNS

        -
        public static final Operation.Name REPLACE_COLUMNS
        -
        Recorded when columns are replaced.
        -
      • -
      - - - -
        -
      • -

        UPGRADE_PROTOCOL

        -
        public static final Operation.Name UPGRADE_PROTOCOL
        -
        Recorded when the table protocol is upgraded.
        -
      • -
      - - - -
        -
      • -

        UPGRADE_SCHEMA

        -
        public static final Operation.Name UPGRADE_SCHEMA
        -
        Recorded when the table schema is upgraded.
        -
      • -
      - - - -
        -
      • -

        MANUAL_UPDATE

        -
        public static final Operation.Name MANUAL_UPDATE
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        values

        -
        public static Operation.Name[] values()
        -
        Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
        -for (Operation.Name c : Operation.Name.values())
        -    System.out.println(c);
        -
        -
        -
        Returns:
        -
        an array containing the constants of this enum type, in the order they are declared
        -
        -
      • -
      - - - -
        -
      • -

        valueOf

        -
        public static Operation.Name valueOf(String name)
        -
        Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.)
        -
        -
        Parameters:
        -
        name - the name of the enum constant to be returned.
        -
        Returns:
        -
        the enum constant with the specified name
        -
        Throws:
        -
        IllegalArgumentException - if this enum type has no constant with the specified name
        -
        NullPointerException - if the argument is null
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Overrides:
        -
        toString in class Enum<Operation.Name>
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Operation.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Operation.html deleted file mode 100644 index 3c02f28d7c8..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Operation.html +++ /dev/null @@ -1,442 +0,0 @@ - - - - - -Operation (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class Operation

-
-
- -
-
    -
  • -
    -
    -
    public final class Operation
    -extends Object
    -
    An operation that can be performed on a Delta table. -

    - An operation is tracked as the first line in delta logs, and powers DESCRIBE HISTORY for - Delta tables. -

    - Operations must be constructed using one of the Operation.Name types below. - As well, optional Operation.Metrics values are given below.

    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class Operation.Metrics -
      Some possible operation metrics and their suggested corresponding operation types.
      -
      static class Operation.Name -
      Supported operation types.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      Operation(Operation.Name name) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters, - java.util.Map<String,String> metrics) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters, - java.util.Map<String,String> metrics, - java.util.Optional<String> userMetadata) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - - - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        -
      • -
      - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters,
        -                 @Nullable
        -                 java.util.Map<String,String> metrics)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        metrics - Any relevant operation metrics. See Operation.Metrics for suggested keys.
        -
        -
      • -
      - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters,
        -                 @Nullable
        -                 java.util.Map<String,String> metrics,
        -                 @Nonnull
        -                 java.util.Optional<String> userMetadata)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        metrics - Any relevant operation metrics. See Operation.Metrics for suggested keys.
        -
        userMetadata - Optional additional user metadata.
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getName

        -
        @Nonnull
        -public Operation.Name getName()
        -
        -
        Returns:
        -
        operation name
        -
        -
      • -
      - - - -
        -
      • -

        getParameters

        -
        @Nullable
        -public java.util.Map<String,String> getParameters()
        -
        -
        Returns:
        -
        operation parameters
        -
        -
      • -
      - - - -
        -
      • -

        getMetrics

        -
        @Nullable
        -public java.util.Map<String,String> getMetrics()
        -
        -
        Returns:
        -
        operation metrics
        -
        -
      • -
      - - - -
        -
      • -

        getUserMetadata

        -
        @Nonnull
        -public java.util.Optional<String> getUserMetadata()
        -
        -
        Returns:
        -
        user metadata for this operation
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html deleted file mode 100644 index 5cbeb970cff..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html +++ /dev/null @@ -1,388 +0,0 @@ - - - - - -OptimisticTransaction (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface OptimisticTransaction

-
-
-
-
    -
  • -
    -
    -
    public interface OptimisticTransaction
    -
    Used to perform a set of reads in a transaction and then commit a set of updates to the - state of the log. All reads from the DeltaLog MUST go through this instance rather - than directly to the DeltaLog otherwise they will not be checked for logical conflicts - with concurrent updates. -

    - This class is not thread-safe.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        commit

        -
        <T extends ActionCommitResult commit(Iterable<T> actions,
        -                                       Operation op,
        -                                       String engineInfo)
        -
        Modifies the state of the log by adding a new commit that is based on a read at the table's - latest version as of this transaction's instantiation. In the case of a conflict with a - concurrent writer this method will throw an exception. -

        - Note: any AddFile with an absolute path within the table - path will be updated to have a relative path (based off of the table path). Because of this, - be sure to generate all RemoveFiles using - AddFiles read from the Delta Log (do not use the - AddFiles created pre-commit.)

        -
        -
        Type Parameters:
        -
        T - A derived class of Action. This allows, for example, both a - List<Action> and a List<AddFile> to be accepted.
        -
        Parameters:
        -
        actions - Set of actions to commit.
        -
        op - Details of operation that is performing this transactional commit.
        -
        engineInfo - String used to identify the writer engine. It should resemble - "{engineName}/{engineVersion}", with dashes in place of whitespace. - For example, "Flink-Connector/1.1.0".
        -
        Returns:
        -
        a CommitResult, wrapping the table version that was committed.
        -
        -
      • -
      - - - -
        -
      • -

        markFilesAsRead

        -
        DeltaScan markFilesAsRead(Expression readPredicate)
        -
        Mark files matched by the readPredicate as read by this transaction. -

        - Please note filtering is only supported on partition columns, thus the files matched - may be a superset of the files in the Delta table that satisfy readPredicate. Users - should use DeltaScan.getResidualPredicate() to check for any unapplied portion of the - input predicate. -

        - Internally, readPredicate and the matched readFiles will be used to determine - if logical conflicts between this transaction and previously-committed transactions can be - resolved (i.e. no error thrown). -

        - For example: -

          -
        • This transaction TXN1 reads partition 'date=2021-09-08' to perform an UPDATE and tries - to commit at the next table version N.
        • -
        • After TXN1 starts, another transaction TXN2 reads partition 'date=2021-09-07' and - commits first at table version N (with no other metadata changes).
        • -
        • TXN1 sees that another commit won, and needs to know whether to commit at version N+1 - or fail. Using the readPredicates and resultant readFiles, TXN1 can see - that none of its read files were changed by TXN2. Thus there are no logical conflicts and - TXN1 can commit at table version N+1.
        • -
        -
        -
        Parameters:
        -
        readPredicate - Predicate used to determine which files were read.
        -
        Returns:
        -
        a DeltaScan containing the list of files matching the pushed portion of the - readPredicate.
        -
        -
      • -
      - - - -
        -
      • -

        updateMetadata

        -
        void updateMetadata(Metadata metadata)
        -
        Records an update to the metadata that should be committed with this transaction. - -

        - Use Metadata.copyBuilder() to build a new Metadata instance based on the - current table metadata. For example: - -

        
        - Metadata newMetadata = optimisticTransaction.metadata().copyBuilder()
        -     .schema(newSchema)
        -     .build();
        - optimisticTransaction.updateMetadata(newMetadata);
        - 
        - -

        - IMPORTANT: It is the responsibility of the caller to ensure that files currently - present in the table are still valid under the new metadata.

        -
        -
        Parameters:
        -
        metadata - The new metadata for the delta table.
        -
        -
      • -
      - - - -
        -
      • -

        readWholeTable

        -
        void readWholeTable()
        -
        Mark the entire table as tainted (i.e. read) by this transaction.
        -
      • -
      - - - -
        -
      • -

        txnVersion

        -
        long txnVersion(String id)
        -
        -
        Parameters:
        -
        id - transaction id
        -
        Returns:
        -
        the latest version that has committed for the idempotent transaction with given - id.
        -
        -
      • -
      - - - -
        -
      • -

        metadata

        -
        Metadata metadata()
        -
        -
        Returns:
        -
        the metadata for this transaction. The metadata refers to the metadata of the table's - latest version as of this transaction's instantiation unless updated during the - transaction.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html deleted file mode 100644 index b660c9ae8f0..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html +++ /dev/null @@ -1,320 +0,0 @@ - - - - - -Snapshot (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface Snapshot

-
-
-
-
    -
  • -
    -
    -
    public interface Snapshot
    -
    Snapshot provides APIs to access the Delta table state (such as table metadata, active - files) at some version. -

    - See Delta Transaction Log Protocol - for more details about the transaction logs.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        scan

        -
        DeltaScan scan(Expression predicate)
        -
        -
        Parameters:
        -
        predicate - the predicate to be used to filter the files in this snapshot.
        -
        Returns:
        -
        a DeltaScan of the files in this snapshot matching the pushed portion of - predicate
        -
        -
      • -
      - - - -
        -
      • -

        getAllFiles

        -
        java.util.List<AddFile> getAllFiles()
        -
        -
        Returns:
        -
        all of the files present in this snapshot
        -
        -
      • -
      - - - -
        -
      • -

        getMetadata

        -
        Metadata getMetadata()
        -
        -
        Returns:
        -
        the table metadata for this snapshot
        -
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        long getVersion()
        -
        -
        Returns:
        -
        the version for this snapshot
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html deleted file mode 100644 index 7f5056e4b82..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html +++ /dev/null @@ -1,315 +0,0 @@ - - - - - -VersionLog (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class VersionLog

-
-
- -
-
    -
  • -
    -
    -
    public class VersionLog
    -extends Object
    -
    VersionLog is the representation of all actions (changes) to the Delta Table - at a specific table version.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      VersionLog(long version, - java.util.List<Action> actions) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        VersionLog

        -
        public VersionLog(long version,
        -                  @Nonnull
        -                  java.util.List<Action> actions)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the table version at which these actions occurred
        -
        -
      • -
      - - - -
        -
      • -

        getActions

        -
        @Nonnull
        -public java.util.List<Action> getActions()
        -
        -
        Returns:
        -
        an unmodifiable List of the actions for this table version
        -
        -
      • -
      - - - -
        -
      • -

        getActionsIterator

        -
        @Nonnull
        -public io.delta.storage.CloseableIterator<Action> getActionsIterator()
        -
        -
        Returns:
        -
        an CloseableIterator of the actions for this table version. This method is - preferred for memory efficient iteration through the action list.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html deleted file mode 100644 index 909c8e82335..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - -Action (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Interface Action

-
-
-
-
    -
  • -
    -
    All Known Subinterfaces:
    -
    FileAction
    -
    -
    -
    All Known Implementing Classes:
    -
    AddCDCFile, AddFile, CommitInfo, Metadata, Protocol, RemoveFile, SetTransaction
    -
    -
    -
    -
    public interface Action
    -
    A marker interface for all actions that can be applied to a Delta table. - Each action represents a single change to the state of a Delta table. -

    - You can use the following code to extract the concrete type of an Action. -

    
    -   List<Action> actions = ...
    -   actions.forEach(x -> {
    -       if (x instanceof AddFile) {
    -          AddFile addFile = (AddFile) x;
    -          ...
    -       } else if (x instanceof AddCDCFile) {
    -          AddCDCFile addCDCFile = (AddCDCFile)x;
    -          ...
    -       } else if ...
    -   });
    - 
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html deleted file mode 100644 index 558af313312..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html +++ /dev/null @@ -1,371 +0,0 @@ - - - - - -AddCDCFile (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddCDCFile

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action, FileAction
    -
    -
    -
    -
    public final class AddCDCFile
    -extends Object
    -implements FileAction
    -
    A change file containing CDC data for the Delta version it's within. Non-CDC readers should - ignore this, CDC readers should scan all ChangeFiles in a version rather than computing - changes from AddFile and RemoveFile actions.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      AddCDCFile(String path, - java.util.Map<String,String> partitionValues, - long size, - java.util.Map<String,String> tags) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AddCDCFile

        -
        public AddCDCFile(@Nonnull
        -                  String path,
        -                  @Nonnull
        -                  java.util.Map<String,String> partitionValues,
        -                  long size,
        -                  @Nullable
        -                  java.util.Map<String,String> tags)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        @Nonnull
        -public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be added to the table. If it's a - relative path, it's relative to the root of the table. Note: the path is encoded and - should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nonnull
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public long getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being added or removed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html deleted file mode 100644 index de2d3c7e6db..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html +++ /dev/null @@ -1,317 +0,0 @@ - - - - - -AddFile.Builder (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddFile.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    AddFile
    -
    -
    -
    -
    public static final class AddFile.Builder
    -extends Object
    -
    Builder class for AddFile. Enables construction of AddFiles with default - values.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Builder(String path, - java.util.Map<String,String> partitionValues, - long size, - long modificationTime, - boolean dataChange) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder(String path,
        -               java.util.Map<String,String> partitionValues,
        -               long size,
        -               long modificationTime,
        -               boolean dataChange)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        tags

        -
        public AddFile.Builder tags(java.util.Map<String,String> tags)
        -
      • -
      - - - -
        -
      • -

        build

        -
        public AddFile build()
        -
        Builds an AddFile using the provided parameters. If a parameter is not provided - its default values is used.
        -
        -
        Returns:
        -
        a new AddFile with the properties added to the builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html deleted file mode 100644 index edf905aad4b..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html +++ /dev/null @@ -1,581 +0,0 @@ - - - - - -AddFile (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddFile

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action, FileAction
    -
    -
    -
    -
    public final class AddFile
    -extends Object
    -implements FileAction
    -
    Represents an action that adds a new file to the table. The path of a file acts as the primary - key for the entry in the set of files. -

    - Note: since actions within a given Delta file are not guaranteed to be applied in order, it is - not valid for multiple file operations with the same path to exist in a single version.

    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Add File and Remove File
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class AddFile.Builder -
      Builder class for AddFile.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      AddFile(String path, - java.util.Map<String,String> partitionValues, - long size, - long modificationTime, - boolean dataChange, - String stats, - java.util.Map<String,String> tags) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AddFile

        -
        public AddFile(@Nonnull
        -               String path,
        -               @Nonnull
        -               java.util.Map<String,String> partitionValues,
        -               long size,
        -               long modificationTime,
        -               boolean dataChange,
        -               @Nullable
        -               String stats,
        -               @Nullable
        -               java.util.Map<String,String> tags)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove()
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with - deletionTimestamp = System.currentTimeMillis()
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(long deletionTimestamp)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - deletionTimestamp
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(boolean dataChange)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - dataChange flag
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(long deletionTimestamp,
        -                                  boolean dataChange)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - deletionTimestamp value and dataChange flag
        -
        -
      • -
      - - - -
        -
      • -

        getPath

        -
        @Nonnull
        -public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be added to the table. If it's a - relative path, it's relative to the root of the table. Note: the path is encoded and - should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nonnull
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public long getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getModificationTime

        -
        public long getModificationTime()
        -
        -
        Returns:
        -
        the time that this file was last modified or created, as - milliseconds since the epoch
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being created. When - false the file must already be present in the table or the records in the - added file must be contained in one or more remove actions in the same version
        -
        -
      • -
      - - - -
        -
      • -

        getStats

        -
        @Nullable
        -public String getStats()
        -
        -
        Returns:
        -
        statistics (for example: count, min/max values for columns) - about the data in this file as serialized JSON
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - -
        -
      • -

        builder

        -
        public static AddFile.Builder builder(String path,
        -                                      java.util.Map<String,String> partitionValues,
        -                                      long size,
        -                                      long modificationTime,
        -                                      boolean dataChange)
        -
        -
        Returns:
        -
        a new AddFile.Builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html deleted file mode 100644 index 7bec46d703f..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html +++ /dev/null @@ -1,481 +0,0 @@ - - - - - -CommitInfo.Builder (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class CommitInfo.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    CommitInfo
    -
    -
    -
    -
    public static final class CommitInfo.Builder
    -extends Object
    -
    Builder class for CommitInfo. Enables construction of CommitInfos with - default values.
    -
  • -
-
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html deleted file mode 100644 index 53f258abcf2..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html +++ /dev/null @@ -1,706 +0,0 @@ - - - - - -CommitInfo (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class CommitInfo

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public class CommitInfo
    -extends Object
    -implements Action
    -
    Holds provenance information about changes to the table. This CommitInfo - is not stored in the checkpoint and has reduced compatibility guarantees. - Information stored in it is best effort (i.e. can be falsified by a writer).
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Commit Provenance Information
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class CommitInfo.Builder -
      Builder class for CommitInfo.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      CommitInfo(java.util.Optional<Long> version, - java.sql.Timestamp timestamp, - java.util.Optional<String> userId, - java.util.Optional<String> userName, - String operation, - java.util.Map<String,String> operationParameters, - java.util.Optional<JobInfo> jobInfo, - java.util.Optional<NotebookInfo> notebookInfo, - java.util.Optional<String> clusterId, - java.util.Optional<Long> readVersion, - java.util.Optional<String> isolationLevel, - java.util.Optional<Boolean> isBlindAppend, - java.util.Optional<java.util.Map<String,String>> operationMetrics, - java.util.Optional<String> userMetadata) 
      CommitInfo(java.util.Optional<Long> version, - java.sql.Timestamp timestamp, - java.util.Optional<String> userId, - java.util.Optional<String> userName, - String operation, - java.util.Map<String,String> operationParameters, - java.util.Optional<JobInfo> jobInfo, - java.util.Optional<NotebookInfo> notebookInfo, - java.util.Optional<String> clusterId, - java.util.Optional<Long> readVersion, - java.util.Optional<String> isolationLevel, - java.util.Optional<Boolean> isBlindAppend, - java.util.Optional<java.util.Map<String,String>> operationMetrics, - java.util.Optional<String> userMetadata, - java.util.Optional<String> engineInfo) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CommitInfo

        -
        public CommitInfo(@Nonnull
        -                  java.util.Optional<Long> version,
        -                  @Nullable
        -                  java.sql.Timestamp timestamp,
        -                  @Nonnull
        -                  java.util.Optional<String> userId,
        -                  @Nonnull
        -                  java.util.Optional<String> userName,
        -                  @Nullable
        -                  String operation,
        -                  @Nullable
        -                  java.util.Map<String,String> operationParameters,
        -                  @Nonnull
        -                  java.util.Optional<JobInfo> jobInfo,
        -                  @Nonnull
        -                  java.util.Optional<NotebookInfo> notebookInfo,
        -                  @Nonnull
        -                  java.util.Optional<String> clusterId,
        -                  @Nonnull
        -                  java.util.Optional<Long> readVersion,
        -                  @Nonnull
        -                  java.util.Optional<String> isolationLevel,
        -                  @Nonnull
        -                  java.util.Optional<Boolean> isBlindAppend,
        -                  @Nonnull
        -                  java.util.Optional<java.util.Map<String,String>> operationMetrics,
        -                  @Nonnull
        -                  java.util.Optional<String> userMetadata)
        -
      • -
      - - - -
        -
      • -

        CommitInfo

        -
        public CommitInfo(@Nonnull
        -                  java.util.Optional<Long> version,
        -                  @Nullable
        -                  java.sql.Timestamp timestamp,
        -                  @Nonnull
        -                  java.util.Optional<String> userId,
        -                  @Nonnull
        -                  java.util.Optional<String> userName,
        -                  @Nullable
        -                  String operation,
        -                  @Nullable
        -                  java.util.Map<String,String> operationParameters,
        -                  @Nonnull
        -                  java.util.Optional<JobInfo> jobInfo,
        -                  @Nonnull
        -                  java.util.Optional<NotebookInfo> notebookInfo,
        -                  @Nonnull
        -                  java.util.Optional<String> clusterId,
        -                  @Nonnull
        -                  java.util.Optional<Long> readVersion,
        -                  @Nonnull
        -                  java.util.Optional<String> isolationLevel,
        -                  @Nonnull
        -                  java.util.Optional<Boolean> isBlindAppend,
        -                  @Nonnull
        -                  java.util.Optional<java.util.Map<String,String>> operationMetrics,
        -                  @Nonnull
        -                  java.util.Optional<String> userMetadata,
        -                  @Nonnull
        -                  java.util.Optional<String> engineInfo)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        @Nonnull
        -public java.util.Optional<Long> getVersion()
        -
        -
        Returns:
        -
        the log version for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getTimestamp

        -
        @Nullable
        -public java.sql.Timestamp getTimestamp()
        -
        -
        Returns:
        -
        the time the files in this commit were committed
        -
        -
      • -
      - - - -
        -
      • -

        getUserId

        -
        @Nonnull
        -public java.util.Optional<String> getUserId()
        -
        -
        Returns:
        -
        the userId of the user who committed this file
        -
        -
      • -
      - - - -
        -
      • -

        getUserName

        -
        @Nonnull
        -public java.util.Optional<String> getUserName()
        -
        -
        Returns:
        -
        the userName of the user who committed this file
        -
        -
      • -
      - - - -
        -
      • -

        getOperation

        -
        @Nullable
        -public String getOperation()
        -
        -
        Returns:
        -
        the type of operation for this commit. e.g. "WRITE"
        -
        -
      • -
      - - - -
        -
      • -

        getOperationParameters

        -
        @Nullable
        -public java.util.Map<String,String> getOperationParameters()
        -
        -
        Returns:
        -
        any relevant operation parameters. e.g. "mode", "partitionBy"
        -
        -
      • -
      - - - -
        -
      • -

        getJobInfo

        -
        @Nonnull
        -public java.util.Optional<JobInfo> getJobInfo()
        -
        -
        Returns:
        -
        the JobInfo for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getNotebookInfo

        -
        @Nonnull
        -public java.util.Optional<NotebookInfo> getNotebookInfo()
        -
        -
        Returns:
        -
        the NotebookInfo for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getClusterId

        -
        @Nonnull
        -public java.util.Optional<String> getClusterId()
        -
        -
        Returns:
        -
        the ID of the cluster used to generate this commit
        -
        -
      • -
      - - - -
        -
      • -

        getReadVersion

        -
        @Nonnull
        -public java.util.Optional<Long> getReadVersion()
        -
        -
        Returns:
        -
        the version that the transaction used to generate this commit is reading from
        -
        -
      • -
      - - - -
        -
      • -

        getIsolationLevel

        -
        @Nonnull
        -public java.util.Optional<String> getIsolationLevel()
        -
        -
        Returns:
        -
        the isolation level at which this commit was generated
        -
        -
      • -
      - - - -
        -
      • -

        getIsBlindAppend

        -
        @Nonnull
        -public java.util.Optional<Boolean> getIsBlindAppend()
        -
        -
        Returns:
        -
        whether this commit has blindly appended without caring about existing files
        -
        -
      • -
      - - - -
        -
      • -

        getOperationMetrics

        -
        @Nonnull
        -public java.util.Optional<java.util.Map<String,String>> getOperationMetrics()
        -
        -
        Returns:
        -
        any operation metrics calculated
        -
        -
      • -
      - - - -
        -
      • -

        getUserMetadata

        -
        @Nonnull
        -public java.util.Optional<String> getUserMetadata()
        -
        -
        Returns:
        -
        any additional user metadata
        -
        -
      • -
      - - - -
        -
      • -

        getEngineInfo

        -
        @Nonnull
        -public java.util.Optional<String> getEngineInfo()
        -
        -
        Returns:
        -
        the engineInfo of the engine that performed this commit. It should be of the form - "{engineName}/{engineVersion} Delta-Standalone/{deltaStandaloneVersion}"
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html deleted file mode 100644 index 021ddd7d05a..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - -FileAction (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Interface FileAction

-
-
-
-
    -
  • -
    -
    All Superinterfaces:
    -
    Action
    -
    -
    -
    All Known Implementing Classes:
    -
    AddCDCFile, AddFile, RemoveFile
    -
    -
    -
    -
    public interface FileAction
    -extends Action
    -
    Generic interface for Actions pertaining to the addition and removal of files.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        String getPath()
        -
        -
        Returns:
        -
        the relative path or the absolute path of the file being added or removed by this - action. If it's a relative path, it's relative to the root of the table. Note: the path - is encoded and should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        boolean isDataChange()
        -
        -
        Returns:
        -
        whether any data was changed as a result of this file being added or removed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html deleted file mode 100644 index bbe0f120174..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - -Format (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Format

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      Format() 
      Format(String provider, - java.util.Map<String,String> options) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Format

        -
        public Format(String provider,
        -              java.util.Map<String,String> options)
        -
      • -
      - - - -
        -
      • -

        Format

        -
        public Format()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getProvider

        -
        public String getProvider()
        -
        -
        Returns:
        -
        the name of the encoding for files in this table
        -
        -
      • -
      - - - -
        -
      • -

        getOptions

        -
        public java.util.Map<String,String> getOptions()
        -
        -
        Returns:
        -
        an unmodifiable Map containing configuration options for - the format
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html deleted file mode 100644 index d1d8b7ba7e0..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - -JobInfo.Builder (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class JobInfo.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    JobInfo
    -
    -
    -
    -
    public static class JobInfo.Builder
    -extends Object
    -
    Builder class for JobInfo. Enables construction of JobInfos with default - values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder(String jobId)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - - - - - -
        -
      • -

        jobOwnerId

        -
        public JobInfo.Builder jobOwnerId(String jobOwnerId)
        -
      • -
      - - - -
        -
      • -

        triggerType

        -
        public JobInfo.Builder triggerType(String triggerType)
        -
      • -
      - - - -
        -
      • -

        build

        -
        public JobInfo build()
        -
        Builds a JobInfo using the provided parameters. If a parameter is not provided - its default values is used.
        -
        -
        Returns:
        -
        a new JobInfo with the properties added to the builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html deleted file mode 100644 index 0ce9c393600..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html +++ /dev/null @@ -1,402 +0,0 @@ - - - - - -JobInfo (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class JobInfo

-
-
- -
-
    -
  • -
    -
    -
    public class JobInfo
    -extends Object
    -
    Represents the Databricks Job information that committed to the Delta table.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        JobInfo

        -
        public JobInfo(String jobId,
        -               String jobName,
        -               String runId,
        -               String jobOwnerId,
        -               String triggerType)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getJobId

        -
        public String getJobId()
        -
      • -
      - - - -
        -
      • -

        getJobName

        -
        public String getJobName()
        -
      • -
      - - - -
        -
      • -

        getRunId

        -
        public String getRunId()
        -
      • -
      - - - -
        -
      • -

        getJobOwnerId

        -
        public String getJobOwnerId()
        -
      • -
      - - - -
        -
      • -

        getTriggerType

        -
        public String getTriggerType()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html deleted file mode 100644 index cf90ff08267..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html +++ /dev/null @@ -1,408 +0,0 @@ - - - - - -Metadata.Builder (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Metadata.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    Metadata
    -
    -
    -
    -
    public static final class Metadata.Builder
    -extends Object
    -
    Builder class for Metadata. Enables construction of Metadatas with default - values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder()
        -
      • -
      -
    • -
    - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html deleted file mode 100644 index cd6ff11999a..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html +++ /dev/null @@ -1,530 +0,0 @@ - - - - - -Metadata (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Metadata

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public final class Metadata
    -extends Object
    -implements Action
    -
    Updates the metadata of the table. The first version of a table must contain - a Metadata action. Subsequent Metadata actions completely - overwrite the current metadata of the table. It is the responsibility of the - writer to ensure that any data already present in the table is still valid - after any change. There can be at most one Metadata action in a - given version of the table.
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Change Metadata
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Metadata

        -
        public Metadata(@Nonnull
        -                String id,
        -                @Nullable
        -                String name,
        -                @Nullable
        -                String description,
        -                @Nonnull
        -                Format format,
        -                @Nonnull
        -                java.util.List<String> partitionColumns,
        -                @Nonnull
        -                java.util.Map<String,String> configuration,
        -                @Nonnull
        -                java.util.Optional<Long> createdTime,
        -                @Nullable
        -                StructType schema)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getId

        -
        @Nonnull
        -public String getId()
        -
        -
        Returns:
        -
        the unique identifier for this table
        -
        -
      • -
      - - - -
        -
      • -

        getName

        -
        @Nullable
        -public String getName()
        -
        -
        Returns:
        -
        the user-provided identifier for this table
        -
        -
      • -
      - - - -
        -
      • -

        getDescription

        -
        @Nullable
        -public String getDescription()
        -
        -
        Returns:
        -
        the user-provided description for this table
        -
        -
      • -
      - - - -
        -
      • -

        getFormat

        -
        @Nonnull
        -public Format getFormat()
        -
        -
        Returns:
        -
        the Format for this table
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionColumns

        -
        @Nonnull
        -public java.util.List<String> getPartitionColumns()
        -
        -
        Returns:
        -
        an unmodifiable java.util.List containing the names of - columns by which the data should be partitioned
        -
        -
      • -
      - - - -
        -
      • -

        getConfiguration

        -
        @Nonnull
        -public java.util.Map<String,String> getConfiguration()
        -
        -
        Returns:
        -
        an unmodifiable java.util.Map containing configuration - options for this metadata
        -
        -
      • -
      - - - -
        -
      • -

        getCreatedTime

        -
        @Nonnull
        -public java.util.Optional<Long> getCreatedTime()
        -
        -
        Returns:
        -
        the time when this metadata action was created, in milliseconds - since the Unix epoch
        -
        -
      • -
      - - - -
        -
      • -

        getSchema

        -
        @Nullable
        -public StructType getSchema()
        -
        -
        Returns:
        -
        the schema of the table as a StructType
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html deleted file mode 100644 index 68786d38103..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - -NotebookInfo (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class NotebookInfo

-
-
- -
-
    -
  • -
    -
    -
    public class NotebookInfo
    -extends Object
    -
    Represents the Databricks Notebook information that committed to the Delta table.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      NotebookInfo(String notebookId) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        NotebookInfo

        -
        public NotebookInfo(String notebookId)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getNotebookId

        -
        public String getNotebookId()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html deleted file mode 100644 index 40f79140c5a..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html +++ /dev/null @@ -1,345 +0,0 @@ - - - - - -Protocol (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Protocol

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public final class Protocol
    -extends Object
    -implements Action
    -
    Used to block older clients from reading or writing the log when backwards - incompatible changes are made to the protocol. Readers and writers are - responsible for checking that they meet the minimum versions before performing - any other operations. -

    - Since this action allows us to explicitly block older clients in the case of a - breaking change to the protocol, clients should be tolerant of messages and - fields that they do not understand.

    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Protocol Evolution
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Protocol(int minReaderVersion, - int minWriterVersion) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Protocol

        -
        public Protocol(int minReaderVersion,
        -                int minWriterVersion)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getMinReaderVersion

        -
        public int getMinReaderVersion()
        -
        -
        Returns:
        -
        the minimum version of the Delta read protocol that a client must implement in order - to correctly read this table
        -
        -
      • -
      - - - -
        -
      • -

        getMinWriterVersion

        -
        public int getMinWriterVersion()
        -
        -
        Returns:
        -
        the minimum version of the Delta write protocol that a client must implement in order - to correctly write this table
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html deleted file mode 100644 index 725064c4b38..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html +++ /dev/null @@ -1,471 +0,0 @@ - - - - - -RemoveFile (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class RemoveFile

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      RemoveFile(String path, - java.util.Optional<Long> deletionTimestamp, - boolean dataChange, - boolean extendedFileMetadata, - java.util.Map<String,String> partitionValues, - java.util.Optional<Long> size, - java.util.Map<String,String> tags) -
      Deprecated.  -
      RemoveFile should be created from AddFile.remove() instead.
      -
      -
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        RemoveFile

        -
        @Deprecated
        -public RemoveFile(@Nonnull
        -                              String path,
        -                              @Nonnull
        -                              java.util.Optional<Long> deletionTimestamp,
        -                              boolean dataChange,
        -                              boolean extendedFileMetadata,
        -                              @Nullable
        -                              java.util.Map<String,String> partitionValues,
        -                              @Nonnull
        -                              java.util.Optional<Long> size,
        -                              @Nullable
        -                              java.util.Map<String,String> tags)
        -
        Deprecated. RemoveFile should be created from AddFile.remove() instead.
        -
        Users should not construct RemoveFiles themselves, and should instead use one - of the various AddFile.remove() methods to instantiate the correct RemoveFile - for a given AddFile instance.
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be removed from the table. If it's - a relative path, it's relative to the root of the table. Note: the path is encoded - and should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getDeletionTimestamp

        -
        public java.util.Optional<Long> getDeletionTimestamp()
        -
        -
        Returns:
        -
        the time that this file was deleted as milliseconds since the epoch
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being removed. When - false the records in the removed file must be contained in one or more add - actions in the same version
        -
        -
      • -
      - - - -
        -
      • -

        isExtendedFileMetadata

        -
        public boolean isExtendedFileMetadata()
        -
        -
        Returns:
        -
        true if the fields partitionValues, size, and tags are - present
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nullable
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public java.util.Optional<Long> getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html deleted file mode 100644 index 2243d34a020..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - -SetTransaction (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class SetTransaction

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      SetTransaction(String appId, - long version, - java.util.Optional<Long> lastUpdated) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        SetTransaction

        -
        public SetTransaction(@Nonnull
        -                      String appId,
        -                      long version,
        -                      @Nonnull
        -                      java.util.Optional<Long> lastUpdated)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getAppId

        -
        @Nonnull
        -public String getAppId()
        -
        -
        Returns:
        -
        the unique identifier for the application performing the transaction
        -
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the application-specific numeric identifier for this transaction
        -
        -
      • -
      - - - -
        -
      • -

        getLastUpdated

        -
        @Nonnull
        -public java.util.Optional<Long> getLastUpdated()
        -
        -
        Returns:
        -
        the time when this transaction action was created, in milliseconds since the Unix - epoch
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html deleted file mode 100644 index 9da4e4d688f..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -io.delta.standalone.actions (Delta Standalone 0.5.0 JavaDoc) - - - - - -

io.delta.standalone.actions

-
-

Interfaces

- -

Classes

- -
- - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html deleted file mode 100644 index 83f813de617..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - -io.delta.standalone.actions (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.actions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html deleted file mode 100644 index 24ef6254a2c..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - -io.delta.standalone.actions Class Hierarchy (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.actions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html deleted file mode 100644 index 3c7406b1c45..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - -CloseableIterator (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.data
-

Interface CloseableIterator<T>

-
-
-
-
    -
  • -
    -
    All Superinterfaces:
    -
    AutoCloseable, java.io.Closeable, java.util.Iterator<T>
    -
    -
    -
    -
    public interface CloseableIterator<T>
    -extends java.util.Iterator<T>, java.io.Closeable
    -
    An Iterator that also implements the Closeable interface. The caller - should call Closeable.close() method to free all resources properly after using the iterator.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from interface java.util.Iterator

        -forEachRemaining, hasNext, next, remove
      • -
      -
        -
      • - - -

        Methods inherited from interface java.io.Closeable

        -close
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html deleted file mode 100644 index f671fea42b1..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html +++ /dev/null @@ -1,682 +0,0 @@ - - - - - -RowRecord (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.data
-

Interface RowRecord

-
-
-
-
    -
  • -
    -
    -
    public interface RowRecord
    -
    Represents one row of data containing a non-empty collection of fieldName - value pairs. - It provides APIs to allow retrieval of values through fieldName lookup. For example, - -
    
    -   if (row.isNullAt("int_field")) {
    -     // handle the null value.
    -   } else {
    -     int x = getInt("int_field");
    -   }
    - 
    -
    -
    See Also:
    -
    StructType, -StructField
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Abstract Methods 
      Modifier and TypeMethod and Description
      java.math.BigDecimalgetBigDecimal(String fieldName) -
      Retrieves value from data record and returns the value as a java.math.BigDecimal.
      -
      byte[]getBinary(String fieldName) -
      Retrieves value from data record and returns the value as binary (byte array).
      -
      booleangetBoolean(String fieldName) -
      Retrieves value from data record and returns the value as a primitive boolean.
      -
      bytegetByte(String fieldName) -
      Retrieves value from data record and returns the value as a primitive byte.
      -
      java.sql.DategetDate(String fieldName) -
      Retrieves value from data record and returns the value as a java.sql.Date.
      -
      doublegetDouble(String fieldName) -
      Retrieves value from data record and returns the value as a primitive double.
      -
      floatgetFloat(String fieldName) -
      Retrieves value from data record and returns the value as a primitive float.
      -
      intgetInt(String fieldName) -
      Retrieves value from data record and returns the value as a primitive int.
      -
      intgetLength() 
      <T> java.util.List<T>getList(String fieldName) -
      Retrieves value from data record and returns the value as a java.util.List<T> object.
      -
      longgetLong(String fieldName) -
      Retrieves value from data record and returns the value as a primitive long.
      -
      <K,V> java.util.Map<K,V>getMap(String fieldName) -
      Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
      -
      RowRecordgetRecord(String fieldName) -
      Retrieves value from data record and returns the value as a RowRecord object.
      -
      StructTypegetSchema() 
      shortgetShort(String fieldName) -
      Retrieves value from data record and returns the value as a primitive short.
      -
      StringgetString(String fieldName) -
      Retrieves value from data record and returns the value as a String object.
      -
      java.sql.TimestampgetTimestamp(String fieldName) -
      Retrieves value from data record and returns the value as a java.sql.Timestamp.
      -
      booleanisNullAt(String fieldName) 
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        getLength

        -
        int getLength()
        -
        -
        Returns:
        -
        the number of elements in this RowRecord
        -
        -
      • -
      - - - -
        -
      • -

        isNullAt

        -
        boolean isNullAt(String fieldName)
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        whether the value of field fieldName is null
        -
        -
      • -
      - - - -
        -
      • -

        getInt

        -
        int getInt(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive int.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive int
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getLong

        -
        long getLong(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive long.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive long
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getByte

        -
        byte getByte(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive byte.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive byte
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getShort

        -
        short getShort(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive short.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive short
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBoolean

        -
        boolean getBoolean(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive boolean.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive boolean
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getFloat

        -
        float getFloat(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive float.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive float
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getDouble

        -
        double getDouble(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive double.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive double
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getString

        -
        String getString(String fieldName)
        -
        Retrieves value from data record and returns the value as a String object.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a String object. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBinary

        -
        byte[] getBinary(String fieldName)
        -
        Retrieves value from data record and returns the value as binary (byte array).
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as binary (byte array). null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBigDecimal

        -
        java.math.BigDecimal getBigDecimal(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.math.BigDecimal.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.math.BigDecimal. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getTimestamp

        -
        java.sql.Timestamp getTimestamp(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.sql.Timestamp.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.sql.Timestamp. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getDate

        -
        java.sql.Date getDate(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.sql.Date.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.sql.Date. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getRecord

        -
        RowRecord getRecord(String fieldName)
        -
        Retrieves value from data record and returns the value as a RowRecord object.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a RowRecord object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any nested field, if that field is not - nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getList

        -
        <T> java.util.List<T> getList(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.util.List<T> object.
        -
        -
        Type Parameters:
        -
        T - element type
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a java.util.List<T> object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any element field, if that field is not - nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getMap

        -
        <K,V> java.util.Map<K,V> getMap(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
        -
        -
        Type Parameters:
        -
        K - key type
        -
        V - value type
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a java.util.Map<K, V> object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any key/value field, if that field is not - nullable and null data value read
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html deleted file mode 100644 index b1ee105407a..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -io.delta.standalone.data (Delta Standalone 0.5.0 JavaDoc) - - - - - -

io.delta.standalone.data

-
-

Interfaces

- -
- - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html deleted file mode 100644 index c4bff84770a..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - -io.delta.standalone.data (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.data

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html deleted file mode 100644 index 70a72655fe0..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - -io.delta.standalone.data Class Hierarchy (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.data

-Package Hierarchies: - -
-
-

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html deleted file mode 100644 index e0db2f712e9..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentAppendException (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentAppendException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentAppendException
    -extends DeltaConcurrentModificationException
    -
    Thrown when files are added that would have been read by the current transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentAppendException

        -
        public ConcurrentAppendException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html deleted file mode 100644 index a0bfb2a397a..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentDeleteDeleteException (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentDeleteDeleteException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentDeleteDeleteException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the current transaction deletes data that was deleted by a concurrent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentDeleteDeleteException

        -
        public ConcurrentDeleteDeleteException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html deleted file mode 100644 index 82541ba397d..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentDeleteReadException (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentDeleteReadException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentDeleteReadException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the current transaction reads data that was deleted by a concurrent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentDeleteReadException

        -
        public ConcurrentDeleteReadException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html deleted file mode 100644 index 7a83f076b5d..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentTransactionException (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentTransactionException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentTransactionException
    -extends DeltaConcurrentModificationException
    -
    Thrown when concurrent transaction both attempt to update the same idempotent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentTransactionException

        -
        public ConcurrentTransactionException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html deleted file mode 100644 index 33920a1da4d..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html +++ /dev/null @@ -1,275 +0,0 @@ - - - - - -DeltaConcurrentModificationException (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class DeltaConcurrentModificationException

-
-
- -
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DeltaConcurrentModificationException

        -
        public DeltaConcurrentModificationException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html deleted file mode 100644 index ce9232d2e99..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - -DeltaStandaloneException (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class DeltaStandaloneException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class DeltaStandaloneException
    -extends RuntimeException
    -
    Thrown when a query fails, usually because the query itself is invalid.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException()
        -
      • -
      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException(String message)
        -
      • -
      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException(String message,
        -                                Throwable cause)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html deleted file mode 100644 index 9a3801ab71d..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - -MetadataChangedException (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class MetadataChangedException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class MetadataChangedException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the metadata of the Delta table has changed between the time of read - and the time of commit.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MetadataChangedException

        -
        public MetadataChangedException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html deleted file mode 100644 index e2226c92100..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ProtocolChangedException (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ProtocolChangedException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ProtocolChangedException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the protocol version has changed between the time of read and the time of commit.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ProtocolChangedException

        -
        public ProtocolChangedException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html deleted file mode 100644 index f7ee91380bc..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -io.delta.standalone.exceptions (Delta Standalone 0.5.0 JavaDoc) - - - - - -

io.delta.standalone.exceptions

-
-

Exceptions

- -
- - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html deleted file mode 100644 index d411c99afbc..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - -io.delta.standalone.exceptions (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.exceptions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html deleted file mode 100644 index c605fa5f9cd..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - -io.delta.standalone.exceptions Class Hierarchy (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.exceptions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html deleted file mode 100644 index 427a7437c4c..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - -And (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class And

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class And
    -extends BinaryOperator
    -implements Predicate
    -
    Evaluates logical expr1 AND expr2 for new And(expr1, expr2). -

    - Requires both left and right input expressions evaluate to booleans.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object leftResult,
        -                           Object rightResult)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html deleted file mode 100644 index c6d049daae0..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - -BinaryComparison (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryComparison

-
-
- -
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html deleted file mode 100644 index d0d7c2053ed..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html +++ /dev/null @@ -1,340 +0,0 @@ - - - - - -BinaryExpression (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryExpression

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    BinaryOperator
    -
    -
    -
    -
    public abstract class BinaryExpression
    -extends Object
    -implements Expression
    -
    An Expression with two inputs and one output. The output is by default evaluated to null - if either input is evaluated to null.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - - - - - -
        -
      • -

        eval

        -
        public final Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html deleted file mode 100644 index e3101ccd141..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - -BinaryOperator (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryOperator

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    And, BinaryComparison, Or
    -
    -
    -
    -
    public abstract class BinaryOperator
    -extends BinaryExpression
    -
    A BinaryExpression that is an operator, meaning the string representation is - x symbol y, rather than funcName(x, y). -

    - Requires both inputs to be of the same data type.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html deleted file mode 100644 index 4b385b8e339..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - -Column (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Column

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Column

        -
        public Column(String name,
        -              DataType dataType)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        name

        -
        public String name()
        -
      • -
      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        dataType

        -
        public DataType dataType()
        -
        -
        Returns:
        -
        the DataType of the result of evaluating this expression.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        public java.util.Set<String> references()
        -
        -
        Specified by:
        -
        references in interface Expression
        -
        Overrides:
        -
        references in class LeafExpression
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Specified by:
        -
        equals in class LeafExpression
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html deleted file mode 100644 index 6be70f88e4c..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -EqualTo (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class EqualTo

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html deleted file mode 100644 index f7f4555237d..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - -Expression (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Interface Expression

-
-
-
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        Object eval(RowRecord record)
        -
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        dataType

        -
        DataType dataType()
        -
        -
        Returns:
        -
        the DataType of the result of evaluating this expression.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        String toString()
        -
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        default java.util.Set<String> references()
        -
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        java.util.List<Expression> children()
        -
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html deleted file mode 100644 index 71b09ad4e9a..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -GreaterThan (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class GreaterThan

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html deleted file mode 100644 index c6d452aa2d6..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -GreaterThanOrEqual (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class GreaterThanOrEqual

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class GreaterThanOrEqual
    -extends BinaryComparison
    -implements Predicate
    -
    Evaluates expr1 >= expr2 for new GreaterThanOrEqual(expr1, expr2).
    -
  • -
-
-
- -
-
-
    -
  • - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html deleted file mode 100644 index 43ddebf5e86..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - -In (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class In

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class In
    -extends Object
    -implements Predicate
    -
    Evaluates if expr is in exprList for new In(expr, exprList). True if - expr is equal to any expression in exprList, else false.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      In(Expression value, - java.util.List<? extends Expression> elems) 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      java.util.List<Expression>children() 
      Booleaneval(RowRecord record) -
      This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide.
      -
      StringtoString() 
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      - - -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        In

        -
        public In(Expression value,
        -          java.util.List<? extends Expression> elems)
        -
        -
        Parameters:
        -
        value - a nonnull expression
        -
        elems - a nonnull, nonempty list of expressions with the same data type as - value
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Boolean eval(RowRecord record)
        -
        This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide. The logic is as follows: -
          -
        • TRUE if the non-NULL value is found in the list
        • -
        • FALSE if the non-NULL value is not found in the list and the list does not contain - NULL values
        • -
        • NULL if the value is NULL, or the non-NULL value is not found in the list and the - list contains at least one NULL value
        • -
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        See Also:
        -
        NULL Semantics
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html deleted file mode 100644 index da7c9687800..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - -IsNotNull (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class IsNotNull

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        IsNotNull

        -
        public IsNotNull(Expression child)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Overrides:
        -
        eval in class UnaryExpression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html deleted file mode 100644 index 81a606f0aa6..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - -IsNull (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class IsNull

-
-
- -
- -
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Overrides:
        -
        eval in class UnaryExpression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html deleted file mode 100644 index 640f03546f4..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - -LeafExpression (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LeafExpression

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        public java.util.Set<String> references()
        -
        -
        Specified by:
        -
        references in interface Expression
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public abstract boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public abstract int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html deleted file mode 100644 index 2fd2dd7b923..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -LessThan (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LessThan

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html deleted file mode 100644 index 60613f54878..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -LessThanOrEqual (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LessThanOrEqual

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html deleted file mode 100644 index 6c3dcc75ad7..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html +++ /dev/null @@ -1,617 +0,0 @@ - - - - - -Literal (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Literal

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html deleted file mode 100644 index 597e316ecce..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html +++ /dev/null @@ -1,324 +0,0 @@ - - - - - -Not (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Not

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class Not
    -extends UnaryExpression
    -implements Predicate
    -
    Evaluates logical NOT expr for new Not(expr). -

    - Requires the child expression evaluates to a boolean.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object childResult)
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html deleted file mode 100644 index 221c57387b2..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - -Or (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Or

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class Or
    -extends BinaryOperator
    -implements Predicate
    -
    Evaluates logical expr1 OR expr2 for new Or(expr1, expr2). -

    - Requires both left and right input expressions evaluate to booleans.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object leftResult,
        -                           Object rightResult)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html deleted file mode 100644 index b07f552bdf6..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - -Predicate (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Interface Predicate

-
-
-
- -
-
- -
-
-
    -
  • - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html deleted file mode 100644 index cf3fb3a6ff9..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - -UnaryExpression (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class UnaryExpression

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    IsNotNull, IsNull, Not
    -
    -
    -
    -
    public abstract class UnaryExpression
    -extends Object
    -implements Expression
    -
    An Expression with one input and one output. The output is by default evaluated to null - if the input is evaluated to null.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html deleted file mode 100644 index e6dcfd782bd..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - -io.delta.standalone.expressions (Delta Standalone 0.5.0 JavaDoc) - - - - - -

io.delta.standalone.expressions

-
-

Interfaces

- -

Classes

- -
- - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html deleted file mode 100644 index ae75ec169cd..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - -io.delta.standalone.expressions (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.expressions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html deleted file mode 100644 index 211bbb67374..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - -io.delta.standalone.expressions Class Hierarchy (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.expressions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/package-frame.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/package-frame.html deleted file mode 100644 index 9463d118301..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/package-frame.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -io.delta.standalone (Delta Standalone 0.5.0 JavaDoc) - - - - - -

io.delta.standalone

-
-

Interfaces

- -

Classes

- -

Enums

- -
- - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/package-summary.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/package-summary.html deleted file mode 100644 index 28069c08e5d..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/package-summary.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - -io.delta.standalone (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/package-tree.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/package-tree.html deleted file mode 100644 index 8deee0ad097..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/package-tree.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - -io.delta.standalone Class Hierarchy (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html deleted file mode 100644 index 6d95f14f7ef..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - -ArrayType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ArrayType

-
-
- -
-
    -
  • -
    -
    -
    public final class ArrayType
    -extends DataType
    -
    The data type for collections of multiple values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ArrayType

        -
        public ArrayType(DataType elementType,
        -                 boolean containsNull)
        -
        -
        Parameters:
        -
        elementType - the data type of values
        -
        containsNull - indicates if values have null value
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getElementType

        -
        public DataType getElementType()
        -
        -
        Returns:
        -
        the type of array elements
        -
        -
      • -
      - - - -
        -
      • -

        containsNull

        -
        public boolean containsNull()
        -
        -
        Returns:
        -
        true if the array has null values, else false
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html deleted file mode 100644 index 928a3709a1a..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -BinaryType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class BinaryType

-
-
- -
-
    -
  • -
    -
    -
    public final class BinaryType
    -extends DataType
    -
    The data type representing byte[] values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BinaryType

        -
        public BinaryType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html deleted file mode 100644 index 0be2cdac4d2..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -BooleanType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class BooleanType

-
-
- -
-
    -
  • -
    -
    -
    public final class BooleanType
    -extends DataType
    -
    The data type representing boolean values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BooleanType

        -
        public BooleanType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html deleted file mode 100644 index 2a43dfa27ea..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -ByteType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ByteType

-
-
- -
-
    -
  • -
    -
    -
    public final class ByteType
    -extends DataType
    -
    The data type representing byte values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ByteType

        -
        public ByteType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html deleted file mode 100644 index b8a956a3de3..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html +++ /dev/null @@ -1,405 +0,0 @@ - - - - - -DataType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DataType

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DataType

        -
        public DataType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        fromJson

        -
        public static DataType fromJson(String json)
        -
        Parses the input json into a DataType.
        -
        -
        Parameters:
        -
        json - the String json to parse
        -
        Returns:
        -
        the parsed DataType
        -
        -
      • -
      - - - -
        -
      • -

        getTypeName

        -
        public String getTypeName()
        -
        -
        Returns:
        -
        the name of the type used in JSON serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      - - - -
        -
      • -

        getCatalogString

        -
        public String getCatalogString()
        -
        -
        Returns:
        -
        a String representation for the type saved in external catalogs
        -
        -
      • -
      - - - -
        -
      • -

        toJson

        -
        public String toJson()
        -
        -
        Returns:
        -
        a JSON String representation of the type
        -
        -
      • -
      - - - -
        -
      • -

        toPrettyJson

        -
        public String toPrettyJson()
        -
        -
        Returns:
        -
        a pretty (i.e. indented) JSON String representation of the type
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html deleted file mode 100644 index 261638ae463..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - -DateType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DateType

-
-
- -
-
    -
  • -
    -
    -
    public final class DateType
    -extends DataType
    -
    A date type, supporting "0001-01-01" through "9999-12-31". - Internally, this is represented as the number of days from 1970-01-01.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DateType

        -
        public DateType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html deleted file mode 100644 index 555a14401bd..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html +++ /dev/null @@ -1,381 +0,0 @@ - - - - - -DecimalType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DecimalType

-
-
- -
-
    -
  • -
    -
    -
    public final class DecimalType
    -extends DataType
    -
    The data type representing java.math.BigDecimal values. - A Decimal that must have fixed precision (the maximum number of digits) and scale (the number - of digits on right side of dot). - - The precision can be up to 38, scale can also be up to 38 (less or equal to precision). - - The default precision and scale is (10, 0).
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        USER_DEFAULT

        -
        public static final DecimalType USER_DEFAULT
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DecimalType

        -
        public DecimalType(int precision,
        -                   int scale)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPrecision

        -
        public int getPrecision()
        -
        -
        Returns:
        -
        the maximum number of digits of the decimal
        -
        -
      • -
      - - - -
        -
      • -

        getScale

        -
        public int getScale()
        -
        -
        Returns:
        -
        the number of digits on the right side of the decimal point (dot)
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html deleted file mode 100644 index 2e030035f02..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -DoubleType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DoubleType

-
-
- -
-
    -
  • -
    -
    -
    public final class DoubleType
    -extends DataType
    -
    The data type representing double values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DoubleType

        -
        public DoubleType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html deleted file mode 100644 index 658d7d9862a..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html +++ /dev/null @@ -1,441 +0,0 @@ - - - - - -FieldMetadata.Builder (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FieldMetadata.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    FieldMetadata
    -
    -
    -
    -
    public static class FieldMetadata.Builder
    -extends Object
    -
    Builder class for FieldMetadata.
    -
  • -
-
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html deleted file mode 100644 index 5c7c58a5018..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html +++ /dev/null @@ -1,368 +0,0 @@ - - - - - -FieldMetadata (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FieldMetadata

-
-
- -
-
    -
  • -
    -
    -
    public final class FieldMetadata
    -extends Object
    -
    The metadata for a given StructField.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getEntries

        -
        public java.util.Map<String,Object> getEntries()
        -
        -
        Returns:
        -
        list of the key-value pairs in this FieldMetadata
        -
        -
      • -
      - - - -
        -
      • -

        contains

        -
        public boolean contains(String key)
        -
        -
        Parameters:
        -
        key - the key to check for
        -
        Returns:
        -
        True if this contains a mapping for the given key, False otherwise
        -
        -
      • -
      - - - -
        -
      • -

        get

        -
        public Object get(String key)
        -
        -
        Parameters:
        -
        key - the key to check for
        -
        Returns:
        -
        the value to which the specified key is mapped, or null if there is no mapping for - the given key
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Overrides:
        -
        toString in class Object
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html deleted file mode 100644 index 03fee2b526b..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -FloatType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FloatType

-
-
- -
-
    -
  • -
    -
    -
    public final class FloatType
    -extends DataType
    -
    The data type representing float values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        FloatType

        -
        public FloatType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html deleted file mode 100644 index 3e0376b76a9..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -IntegerType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class IntegerType

-
-
- -
-
    -
  • -
    -
    -
    public final class IntegerType
    -extends DataType
    -
    The data type representing int values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        IntegerType

        -
        public IntegerType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html deleted file mode 100644 index e246ad0b597..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -LongType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class LongType

-
-
- -
-
    -
  • -
    -
    -
    public final class LongType
    -extends DataType
    -
    The data type representing long values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        LongType

        -
        public LongType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html deleted file mode 100644 index a297ed32c5b..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html +++ /dev/null @@ -1,364 +0,0 @@ - - - - - -MapType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class MapType

-
-
- -
-
    -
  • -
    -
    -
    public final class MapType
    -extends DataType
    -
    The data type for Maps. Keys in a map are not allowed to have null values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MapType

        -
        public MapType(DataType keyType,
        -               DataType valueType,
        -               boolean valueContainsNull)
        -
        -
        Parameters:
        -
        keyType - the data type of map keys
        -
        valueType - the data type of map values
        -
        valueContainsNull - indicates if map values have null values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getKeyType

        -
        public DataType getKeyType()
        -
        -
        Returns:
        -
        the data type of map keys
        -
        -
      • -
      - - - -
        -
      • -

        getValueType

        -
        public DataType getValueType()
        -
        -
        Returns:
        -
        the data type of map values
        -
        -
      • -
      - - - -
        -
      • -

        valueContainsNull

        -
        public boolean valueContainsNull()
        -
        -
        Returns:
        -
        true if this map has null values, else false
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html deleted file mode 100644 index 126bc06c039..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -NullType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class NullType

-
-
- -
-
    -
  • -
    -
    -
    public final class NullType
    -extends DataType
    -
    The data type representing null values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        NullType

        -
        public NullType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html deleted file mode 100644 index f1ab9672884..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -ShortType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ShortType

-
-
- -
-
    -
  • -
    -
    -
    public final class ShortType
    -extends DataType
    -
    The data type representing short values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ShortType

        -
        public ShortType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html deleted file mode 100644 index 776db3619df..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -StringType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StringType

-
-
- -
-
    -
  • -
    -
    -
    public final class StringType
    -extends DataType
    -
    The data type representing String values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StringType

        -
        public StringType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html deleted file mode 100644 index 0046aeb2a05..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html +++ /dev/null @@ -1,416 +0,0 @@ - - - - - -StructField (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StructField

-
-
- -
-
    -
  • -
    -
    -
    public final class StructField
    -extends Object
    -
    A field inside a StructType.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType)
        -
        Constructor with default nullable = true.
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        -
      • -
      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType,
        -                   boolean nullable)
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        nullable - indicates if values of this field can be null values
        -
        -
      • -
      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType,
        -                   boolean nullable,
        -                   FieldMetadata metadata)
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        nullable - indicates if values of this field can be null values
        -
        metadata - metadata for this field
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getName

        -
        public String getName()
        -
        -
        Returns:
        -
        the name of this field
        -
        -
      • -
      - - - -
        -
      • -

        getDataType

        -
        public DataType getDataType()
        -
        -
        Returns:
        -
        the data type of this field
        -
        -
      • -
      - - - -
        -
      • -

        isNullable

        -
        public boolean isNullable()
        -
        -
        Returns:
        -
        whether this field allows to have a null value.
        -
        -
      • -
      - - - -
        -
      • -

        getMetadata

        -
        public FieldMetadata getMetadata()
        -
        -
        Returns:
        -
        the metadata for this field
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html deleted file mode 100644 index 4906b4527a1..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html +++ /dev/null @@ -1,559 +0,0 @@ - - - - - -StructType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StructType

-
-
- -
-
    -
  • -
    -
    -
    public final class StructType
    -extends DataType
    -
    The data type representing a table's schema, consisting of a collection of - fields (that is, fieldName to dataType pairs).
    -
    -
    See Also:
    -
    StructField
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StructType

        -
        public StructType()
        -
      • -
      - - - -
        -
      • -

        StructType

        -
        public StructType(StructField[] fields)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        add

        -
        public StructType add(StructField field)
        -
        Creates a new StructType by adding a new field. - -
        
        - StructType schema = new StructType()
        -     .add(new StructField("a", new IntegerType(), true))
        -     .add(new StructField("b", new LongType(), false))
        -     .add(new StructField("c", new StringType(), true))
        - 
        -
        -
        Parameters:
        -
        field - The new field to add.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        add

        -
        public StructType add(String fieldName,
        -                      DataType dataType)
        -
        Creates a new StructType by adding a new nullable field with no metadata. - -
        
        - StructType schema = new StructType()
        -     .add("a", new IntegerType())
        -     .add("b", new LongType())
        -     .add("c", new StringType())
        - 
        -
        -
        Parameters:
        -
        fieldName - The name of the new field.
        -
        dataType - The datatype for the new field.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        add

        -
        public StructType add(String fieldName,
        -                      DataType dataType,
        -                      boolean nullable)
        -
        Creates a new StructType by adding a new field with no metadata. - -
        
        - StructType schema = new StructType()
        -     .add("a", new IntegerType(), true)
        -     .add("b", new LongType(), false)
        -     .add("c", new StringType(), true)
        - 
        -
        -
        Parameters:
        -
        fieldName - The name of the new field.
        -
        dataType - The datatype for the new field.
        -
        nullable - Whether or not the new field is nullable.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        getFields

        -
        public StructField[] getFields()
        -
        -
        Returns:
        -
        array of fields
        -
        -
      • -
      - - - -
        -
      • -

        getFieldNames

        -
        public String[] getFieldNames()
        -
        -
        Returns:
        -
        array of field names
        -
        -
      • -
      - - - -
        -
      • -

        length

        -
        public int length()
        -
        -
        Returns:
        -
        the number of fields
        -
        -
      • -
      - - - -
        -
      • -

        get

        -
        public StructField get(String fieldName)
        -
        -
        Parameters:
        -
        fieldName - the name of the desired StructField, not null
        -
        Returns:
        -
        the link with the given name, not null
        -
        Throws:
        -
        IllegalArgumentException - if a field with the given name does not exist
        -
        -
      • -
      - - - -
        -
      • -

        column

        -
        public Column column(String fieldName)
        -
        Creates a Column expression for the field with the given fieldName.
        -
        -
        Parameters:
        -
        fieldName - the name of the StructField to create a column for
        -
        Returns:
        -
        a Column expression for the StructField with name fieldName
        -
        -
      • -
      - - - -
        -
      • -

        getTreeString

        -
        public String getTreeString()
        -
        -
        Returns:
        -
        a readable indented tree representation of this StructType - and all of its nested elements
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        isWriteCompatible

        -
        public boolean isWriteCompatible(StructType newSchema)
        -
        Whether a new schema can replace this existing schema in a Delta table without rewriting data - files in the table. -

        - Returns false if the new schema: -

          -
        • Drops any column that is present in the current schema
        • -
        • Converts nullable=true to nullable=false for any column
        • -
        • Changes any datatype
        • -
        -
        -
        Parameters:
        -
        newSchema - the new schema to update the table with
        -
        Returns:
        -
        whether the new schema is compatible with this existing schema
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html deleted file mode 100644 index 94d638e4424..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -TimestampType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class TimestampType

-
-
- -
-
    -
  • -
    -
    -
    public final class TimestampType
    -extends DataType
    -
    The data type representing java.sql.Timestamp values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        TimestampType

        -
        public TimestampType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html deleted file mode 100644 index 98e305577a8..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -io.delta.standalone.types (Delta Standalone 0.5.0 JavaDoc) - - - - - -

io.delta.standalone.types

-
-

Classes

- -
- - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html deleted file mode 100644 index a32f75efcbb..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - -io.delta.standalone.types (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.types

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html deleted file mode 100644 index 3c2879c4cfb..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - -io.delta.standalone.types Class Hierarchy (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.types

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html deleted file mode 100644 index a1556ed8b32..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html +++ /dev/null @@ -1,365 +0,0 @@ - - - - - -ParquetSchemaConverter.ParquetOutputTimestampType (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.util
-

Enum ParquetSchemaConverter.ParquetOutputTimestampType

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable, Comparable<ParquetSchemaConverter.ParquetOutputTimestampType>
    -
    -
    -
    Enclosing class:
    -
    ParquetSchemaConverter
    -
    -
    -
    -
    public static enum ParquetSchemaConverter.ParquetOutputTimestampType
    -extends Enum<ParquetSchemaConverter.ParquetOutputTimestampType>
    -
    :: DeveloperApi :: -

    - Represents Parquet timestamp types. -

      -
    • INT96 is a non-standard but commonly used timestamp type in Parquet.
    • -
    • TIMESTAMP_MICROS is a standard timestamp type in Parquet, which stores number of - microseconds from the Unix epoch.
    • -
    • TIMESTAMP_MILLIS is also standard, but with millisecond precision, which means the - microsecond portion of the timestamp value is truncated.
    • -
    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        values

        -
        public static ParquetSchemaConverter.ParquetOutputTimestampType[] values()
        -
        Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
        -for (ParquetSchemaConverter.ParquetOutputTimestampType c : ParquetSchemaConverter.ParquetOutputTimestampType.values())
        -    System.out.println(c);
        -
        -
        -
        Returns:
        -
        an array containing the constants of this enum type, in the order they are declared
        -
        -
      • -
      - - - -
        -
      • -

        valueOf

        -
        public static ParquetSchemaConverter.ParquetOutputTimestampType valueOf(String name)
        -
        Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.)
        -
        -
        Parameters:
        -
        name - the name of the enum constant to be returned.
        -
        Returns:
        -
        the enum constant with the specified name
        -
        Throws:
        -
        IllegalArgumentException - if this enum type has no constant with the specified name
        -
        NullPointerException - if the argument is null
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html deleted file mode 100644 index 9c52a035ba4..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html +++ /dev/null @@ -1,417 +0,0 @@ - - - - - -ParquetSchemaConverter (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.util
-

Class ParquetSchemaConverter

-
-
- -
-
    -
  • -
    -
    -
    public final class ParquetSchemaConverter
    -extends Object
    -
    :: DeveloperApi :: -

    - Converter class to convert StructType to Parquet MessageType.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   Boolean writeLegacyParquetFormat)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        writeLegacyParquetFormat - Whether to use legacy Parquet format compatible with Spark - 1.4 and prior versions when converting a StructType to a Parquet - MessageType. When set to false, use standard format defined in parquet-format - spec.
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   ParquetSchemaConverter.ParquetOutputTimestampType outputTimestampType)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        outputTimestampType - which parquet timestamp type to use when writing
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   Boolean writeLegacyParquetFormat,
        -                                                                   ParquetSchemaConverter.ParquetOutputTimestampType outputTimestampType)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        writeLegacyParquetFormat - Whether to use legacy Parquet format compatible with Spark - 1.4 and prior versions when converting a StructType to a Parquet - MessageType. When set to false, use standard format defined in parquet-format - spec.
        -
        outputTimestampType - which parquet timestamp type to use when writing
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html deleted file mode 100644 index 330f0d55223..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -io.delta.standalone.util (Delta Standalone 0.5.0 JavaDoc) - - - - - -

io.delta.standalone.util

-
-

Classes

- -

Enums

- -
- - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html deleted file mode 100644 index 599e8cec7b4..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - -io.delta.standalone.util (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.util

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html b/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html deleted file mode 100644 index 60bb45ee160..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - -io.delta.standalone.util Class Hierarchy (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.util

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/overview-frame.html b/connectors/docs/0.5.0/delta-standalone/api/java/overview-frame.html deleted file mode 100644 index e8f48d99fc7..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/overview-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Overview List (Delta Standalone 0.5.0 JavaDoc) - - - - - -
All Classes
-
-

Packages

- -
-

 

- - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/overview-summary.html b/connectors/docs/0.5.0/delta-standalone/api/java/overview-summary.html deleted file mode 100644 index 178aa1d3b4f..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/overview-summary.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - -Overview (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Packages 
PackageDescription
io.delta.standalone 
io.delta.standalone.actions 
io.delta.standalone.data 
io.delta.standalone.exceptions 
io.delta.standalone.expressions 
io.delta.standalone.types 
io.delta.standalone.util 
-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/overview-tree.html b/connectors/docs/0.5.0/delta-standalone/api/java/overview-tree.html deleted file mode 100644 index 28d02fce38d..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/overview-tree.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -Class Hierarchy (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For All Packages

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/package-list b/connectors/docs/0.5.0/delta-standalone/api/java/package-list deleted file mode 100644 index be387bb5e0f..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/package-list +++ /dev/null @@ -1,7 +0,0 @@ -io.delta.standalone -io.delta.standalone.actions -io.delta.standalone.data -io.delta.standalone.exceptions -io.delta.standalone.expressions -io.delta.standalone.types -io.delta.standalone.util diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/script.js b/connectors/docs/0.5.0/delta-standalone/api/java/script.js deleted file mode 100644 index b3463569314..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/script.js +++ /dev/null @@ -1,30 +0,0 @@ -function show(type) -{ - count = 0; - for (var key in methods) { - var row = document.getElementById(key); - if ((methods[key] & type) != 0) { - row.style.display = ''; - row.className = (count++ % 2) ? rowColor : altColor; - } - else - row.style.display = 'none'; - } - updateTabs(type); -} - -function updateTabs(type) -{ - for (var value in tabs) { - var sNode = document.getElementById(tabs[value][0]); - var spanNode = sNode.firstChild; - if (value == type) { - sNode.className = activeTableTab; - spanNode.innerHTML = tabs[value][1]; - } - else { - sNode.className = tableTab; - spanNode.innerHTML = "" + tabs[value][1] + ""; - } - } -} diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/serialized-form.html b/connectors/docs/0.5.0/delta-standalone/api/java/serialized-form.html deleted file mode 100644 index 4b132c92381..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/serialized-form.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - -Serialized Form (Delta Standalone 0.5.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Serialized Form

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.5.0/delta-standalone/api/java/stylesheet.css b/connectors/docs/0.5.0/delta-standalone/api/java/stylesheet.css deleted file mode 100644 index 98055b22d6d..00000000000 --- a/connectors/docs/0.5.0/delta-standalone/api/java/stylesheet.css +++ /dev/null @@ -1,574 +0,0 @@ -/* Javadoc style sheet */ -/* -Overall document style -*/ - -@import url('resources/fonts/dejavu.css'); - -body { - background-color:#ffffff; - color:#353833; - font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; - font-size:14px; - margin:0; -} -a:link, a:visited { - text-decoration:none; - color:#4A6782; -} -a:hover, a:focus { - text-decoration:none; - color:#bb7a2a; -} -a:active { - text-decoration:none; - color:#4A6782; -} -a[name] { - color:#353833; -} -a[name]:hover { - text-decoration:none; - color:#353833; -} -pre { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; -} -h1 { - font-size:20px; -} -h2 { - font-size:18px; -} -h3 { - font-size:16px; - font-style:italic; -} -h4 { - font-size:13px; -} -h5 { - font-size:12px; -} -h6 { - font-size:11px; -} -ul { - list-style-type:disc; -} -code, tt { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; - margin-top:8px; - line-height:1.4em; -} -dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; -} -table tr td dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - vertical-align:top; - padding-top:4px; -} -sup { - font-size:8px; -} -/* -Document title and Copyright styles -*/ -.clear { - clear:both; - height:0px; - overflow:hidden; -} -.aboutLanguage { - float:right; - padding:0px 21px; - font-size:11px; - z-index:200; - margin-top:-9px; -} -.legalCopy { - margin-left:.5em; -} -.bar a, .bar a:link, .bar a:visited, .bar a:active { - color:#FFFFFF; - text-decoration:none; -} -.bar a:hover, .bar a:focus { - color:#bb7a2a; -} -.tab { - background-color:#0066FF; - color:#ffffff; - padding:8px; - width:5em; - font-weight:bold; -} -/* -Navigation bar styles -*/ -.bar { - background-color:#4D7A97; - color:#FFFFFF; - padding:.8em .5em .4em .8em; - height:auto;/*height:1.8em;*/ - font-size:11px; - margin:0; -} -.topNav { - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.bottomNav { - margin-top:10px; - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.subNav { - background-color:#dee3e9; - float:left; - width:100%; - overflow:hidden; - font-size:12px; -} -.subNav div { - clear:left; - float:left; - padding:0 0 5px 6px; - text-transform:uppercase; -} -ul.navList, ul.subNavList { - float:left; - margin:0 25px 0 0; - padding:0; -} -ul.navList li{ - list-style:none; - float:left; - padding: 5px 6px; - text-transform:uppercase; -} -ul.subNavList li{ - list-style:none; - float:left; -} -.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { - color:#FFFFFF; - text-decoration:none; - text-transform:uppercase; -} -.topNav a:hover, .bottomNav a:hover { - text-decoration:none; - color:#bb7a2a; - text-transform:uppercase; -} -.navBarCell1Rev { - background-color:#F8981D; - color:#253441; - margin: auto 5px; -} -.skipNav { - position:absolute; - top:auto; - left:-9999px; - overflow:hidden; -} -/* -Page header and footer styles -*/ -.header, .footer { - clear:both; - margin:0 20px; - padding:5px 0 0 0; -} -.indexHeader { - margin:10px; - position:relative; -} -.indexHeader span{ - margin-right:15px; -} -.indexHeader h1 { - font-size:13px; -} -.title { - color:#2c4557; - margin:10px 0; -} -.subTitle { - margin:5px 0 0 0; -} -.header ul { - margin:0 0 15px 0; - padding:0; -} -.footer ul { - margin:20px 0 5px 0; -} -.header ul li, .footer ul li { - list-style:none; - font-size:13px; -} -/* -Heading styles -*/ -div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList ul.blockList li.blockList h3 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList li.blockList h3 { - padding:0; - margin:15px 0; -} -ul.blockList li.blockList h2 { - padding:0px 0 20px 0; -} -/* -Page layout container styles -*/ -.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { - clear:both; - padding:10px 20px; - position:relative; -} -.indexContainer { - margin:10px; - position:relative; - font-size:12px; -} -.indexContainer h2 { - font-size:13px; - padding:0 0 3px 0; -} -.indexContainer ul { - margin:0; - padding:0; -} -.indexContainer ul li { - list-style:none; - padding-top:2px; -} -.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { - font-size:12px; - font-weight:bold; - margin:10px 0 0 0; - color:#4E4E4E; -} -.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { - margin:5px 0 10px 0px; - font-size:14px; - font-family:'DejaVu Sans Mono',monospace; -} -.serializedFormContainer dl.nameValue dt { - margin-left:1px; - font-size:1.1em; - display:inline; - font-weight:bold; -} -.serializedFormContainer dl.nameValue dd { - margin:0 0 0 1px; - font-size:1.1em; - display:inline; -} -/* -List styles -*/ -ul.horizontal li { - display:inline; - font-size:0.9em; -} -ul.inheritance { - margin:0; - padding:0; -} -ul.inheritance li { - display:inline; - list-style:none; -} -ul.inheritance li ul.inheritance { - margin-left:15px; - padding-left:15px; - padding-top:1px; -} -ul.blockList, ul.blockListLast { - margin:10px 0 10px 0; - padding:0; -} -ul.blockList li.blockList, ul.blockListLast li.blockList { - list-style:none; - margin-bottom:15px; - line-height:1.4; -} -ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { - padding:0px 20px 5px 10px; - border:1px solid #ededed; - background-color:#f8f8f8; -} -ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { - padding:0 0 5px 8px; - background-color:#ffffff; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { - margin-left:0; - padding-left:0; - padding-bottom:15px; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { - list-style:none; - border-bottom:none; - padding-bottom:0; -} -table tr td dl, table tr td dl dt, table tr td dl dd { - margin-top:0; - margin-bottom:1px; -} -/* -Table styles -*/ -.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { - width:100%; - border-left:1px solid #EEE; - border-right:1px solid #EEE; - border-bottom:1px solid #EEE; -} -.overviewSummary, .memberSummary { - padding:0px; -} -.overviewSummary caption, .memberSummary caption, .typeSummary caption, -.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { - position:relative; - text-align:left; - background-repeat:no-repeat; - color:#253441; - font-weight:bold; - clear:none; - overflow:hidden; - padding:0px; - padding-top:10px; - padding-left:1px; - margin:0px; - white-space:pre; -} -.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, -.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, -.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, -.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, -.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, -.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, -.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, -.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { - color:#FFFFFF; -} -.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, -.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - padding-bottom:7px; - display:inline-block; - float:left; - background-color:#F8981D; - border: none; - height:16px; -} -.memberSummary caption span.activeTableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#F8981D; - height:16px; -} -.memberSummary caption span.tableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#4D7A97; - height:16px; -} -.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { - padding-top:0px; - padding-left:0px; - padding-right:0px; - background-image:none; - float:none; - display:inline; -} -.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, -.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { - display:none; - width:5px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .activeTableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .tableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - background-color:#4D7A97; - float:left; - -} -.overviewSummary td, .memberSummary td, .typeSummary td, -.useSummary td, .constantsSummary td, .deprecatedSummary td { - text-align:left; - padding:0px 0px 12px 10px; -} -th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, -td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ - vertical-align:top; - padding-right:0px; - padding-top:8px; - padding-bottom:3px; -} -th.colFirst, th.colLast, th.colOne, .constantsSummary th { - background:#dee3e9; - text-align:left; - padding:8px 3px 3px 7px; -} -td.colFirst, th.colFirst { - white-space:nowrap; - font-size:13px; -} -td.colLast, th.colLast { - font-size:13px; -} -td.colOne, th.colOne { - font-size:13px; -} -.overviewSummary td.colFirst, .overviewSummary th.colFirst, -.useSummary td.colFirst, .useSummary th.colFirst, -.overviewSummary td.colOne, .overviewSummary th.colOne, -.memberSummary td.colFirst, .memberSummary th.colFirst, -.memberSummary td.colOne, .memberSummary th.colOne, -.typeSummary td.colFirst{ - width:25%; - vertical-align:top; -} -td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { - font-weight:bold; -} -.tableSubHeadingColor { - background-color:#EEEEFF; -} -.altColor { - background-color:#FFFFFF; -} -.rowColor { - background-color:#EEEEEF; -} -/* -Content styles -*/ -.description pre { - margin-top:0; -} -.deprecatedContent { - margin:0; - padding:10px 0; -} -.docSummary { - padding:0; -} - -ul.blockList ul.blockList ul.blockList li.blockList h3 { - font-style:normal; -} - -div.block { - font-size:14px; - font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; -} - -td.colLast div { - padding-top:0px; -} - - -td.colLast a { - padding-bottom:3px; -} -/* -Formatting effect styles -*/ -.sourceLineNo { - color:green; - padding:0 30px 0 0; -} -h1.hidden { - visibility:hidden; - overflow:hidden; - font-size:10px; -} -.block { - display:block; - margin:3px 10px 2px 0px; - color:#474747; -} -.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, -.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, -.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { - font-weight:bold; -} -.deprecationComment, .emphasizedPhrase, .interfaceName { - font-style:italic; -} - -div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, -div.block div.block span.interfaceName { - font-style:normal; -} - -div.contentContainer ul.blockList li.blockList h2{ - padding-bottom:0px; -} diff --git a/connectors/docs/0.6.0/delta-flink/api/java/allclasses-frame.html b/connectors/docs/0.6.0/delta-flink/api/java/allclasses-frame.html deleted file mode 100644 index 86decfba7d4..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/allclasses-frame.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - -All Classes (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/allclasses-noframe.html b/connectors/docs/0.6.0/delta-flink/api/java/allclasses-noframe.html deleted file mode 100644 index b6a2c2d8d43..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/allclasses-noframe.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - -All Classes (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/constant-values.html b/connectors/docs/0.6.0/delta-flink/api/java/constant-values.html deleted file mode 100644 index 3975789d5a5..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/constant-values.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - -Constant Field Values (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Constant Field Values

-

Contents

-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/deprecated-list.html b/connectors/docs/0.6.0/delta-flink/api/java/deprecated-list.html deleted file mode 100644 index b2522837723..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/deprecated-list.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - -Deprecated List (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Deprecated API

-

Contents

-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/help-doc.html b/connectors/docs/0.6.0/delta-flink/api/java/help-doc.html deleted file mode 100644 index 17346944ce9..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/help-doc.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - -API Help (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

How This API Document Is Organized

-
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
-
-
- -This help file applies to API documentation generated using the standard doclet.
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/index-all.html b/connectors/docs/0.6.0/delta-flink/api/java/index-all.html deleted file mode 100644 index 203bf45bae6..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/index-all.html +++ /dev/null @@ -1,355 +0,0 @@ - - - - - -Index (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
B C D F I O R S T U V W  - - -

B

-
-
build() - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Creates the actual sink.
-
-
build() - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Creates an instance of DeltaSource for a stream of RowData.
-
-
build() - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Creates an instance of DeltaSource for a stream of RowData.
-
-
- - - -

C

-
-
columnNames(List<String>) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Specifies a List of column names that should be read from Delta table.
-
-
columnNames(String...) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Specifies an array of column names that should be read from Delta table.
-
-
columnNames(List<String>) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Specifies a List of column names that should be read from Delta table.
-
-
columnNames(String...) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Specifies an array of column names that should be read from Delta table.
-
-
- - - -

D

-
-
DeltaSink<IN> - Class in io.delta.flink.sink
-
-
A unified sink that emits its input elements to file system files within buckets using - Parquet format and commits those files to the DeltaLog.
-
-
DeltaSource<T> - Class in io.delta.flink.source
-
-
A unified data source that reads Delta table - both in batch and in streaming mode.
-
-
- - - -

F

-
-
forBoundedRowData(Path, Configuration) - Static method in class io.delta.flink.source.DeltaSource
-
-
Creates an instance of Delta source builder for Bounded mode and for RowData - elements.
-
-
forContinuousRowData(Path, Configuration) - Static method in class io.delta.flink.source.DeltaSource
-
-
Creates an instance of Delta source builder for Continuous mode and for RowData - elements.
-
-
forRowData(Path, Configuration, RowType) - Static method in class io.delta.flink.sink.DeltaSink
-
-
Convenience method for creating a RowDataDeltaSinkBuilder for DeltaSink to a - Delta table.
-
-
- - - -

I

-
-
ignoreChanges(boolean) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets the "ignoreChanges" option.
-
-
ignoreDeletes(boolean) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets the "ignoreDeletes" option.
-
-
io.delta.flink.sink - package io.delta.flink.sink
-
 
-
io.delta.flink.source - package io.delta.flink.source
-
 
-
- - - -

O

-
-
option(String, String) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets a configuration option.
-
-
option(String, boolean) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets a configuration option.
-
-
option(String, int) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets a configuration option.
-
-
option(String, long) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets a configuration option.
-
-
option(String, String) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, boolean) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, int) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, long) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, String) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, boolean) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, int) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, long) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
- - - -

R

-
-
RowDataBoundedDeltaSourceBuilder - Class in io.delta.flink.source
-
-
A builder class for DeltaSource for a stream of RowData where the created source - instance will operate in Bounded mode.
-
-
RowDataContinuousDeltaSourceBuilder - Class in io.delta.flink.source
-
-
A builder class for DeltaSource for a stream of RowData where the created source - instance will operate in Continuous mode.
-
-
RowDataDeltaSinkBuilder - Class in io.delta.flink.sink
-
-
A builder class for DeltaSink for a stream of RowData.
-
-
RowDataDeltaSinkBuilder(Path, Configuration, RowType, boolean) - Constructor for class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Creates instance of the builder for DeltaSink.
-
-
- - - -

S

-
-
startingTimestamp(String) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets value of "startingTimestamp" option.
-
-
startingVersion(String) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets value of "startingVersion" option.
-
-
startingVersion(long) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets value of "startingVersion" option.
-
-
- - - -

T

-
-
timestampAsOf(String) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets value of "timestampAsOf" option.
-
-
- - - -

U

-
-
updateCheckIntervalMillis(long) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets the value for "updateCheckIntervalMillis" option.
-
-
- - - -

V

-
-
versionAsOf(long) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets value of "versionAsOf" option.
-
-
- - - -

W

-
-
withMergeSchema(boolean) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets the sink's option whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch during a commit to the - DeltaLog.
-
-
withPartitionColumns(String...) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets list of partition fields that will be extracted from incoming RowData events.
-
-
-B C D F I O R S T U V W 
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/index.html b/connectors/docs/0.6.0/delta-flink/api/java/index.html deleted file mode 100644 index 0f1fbd559c9..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - -Flink/Delta Connector 0.6.0 JavaDoc - - - - - - - - - -<noscript> -<div>JavaScript is disabled on your browser.</div> -</noscript> -<h2>Frame Alert</h2> -<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html b/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html deleted file mode 100644 index 47bff821371..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html +++ /dev/null @@ -1,309 +0,0 @@ - - - - - -DeltaSink (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.sink
-

Class DeltaSink<IN>

-
-
- -
-
    -
  • -
    -
    Type Parameters:
    -
    IN - Type of the elements in the input of the sink that are also the elements to be - written to its output
    -
    -
    -
    -
    public class DeltaSink<IN>
    -extends <any>
    -
    A unified sink that emits its input elements to file system files within buckets using - Parquet format and commits those files to the DeltaLog. This sink achieves exactly-once - semantics for both BATCH and STREAMING. -

    - For most use cases users should use forRowData(org.apache.flink.core.fs.Path, org.apache.hadoop.conf.Configuration, org.apache.flink.table.types.logical.RowType) utility method to instantiate - the sink which provides proper writer factory implementation for the stream of RowData. -

    - To create new instance of the sink to a non-partitioned Delta table for stream of - RowData: -

    -     DataStream<RowData> stream = ...;
    -     RowType rowType = ...;
    -     ...
    -
    -     // sets a sink to a non-partitioned Delta table
    -     DeltaSink<RowData> deltaSink = DeltaSink.forRowData(
    -             new Path(deltaTablePath),
    -             new Configuration(),
    -             rowType).build();
    -     stream.sinkTo(deltaSink);
    - 
    - - To create new instance of the sink to a partitioned Delta table for stream of RowData: -
    -     String[] partitionCols = ...; // array of partition columns' names
    -
    -     DeltaSink<RowData> deltaSink = DeltaSink.forRowData(
    -             new Path(deltaTablePath),
    -             new Configuration(),
    -             rowType)
    -         .withPartitionColumns(partitionCols)
    -         .build();
    -     stream.sinkTo(deltaSink);
    - 
    -

    - Behaviour of this sink splits down upon two phases. The first phase takes place between - application's checkpoints when records are being flushed to files (or appended to writers' - buffers) where the behaviour is almost identical as in case of - FileSink. - Next during the checkpoint phase files are "closed" (renamed) by the independent instances of - io.delta.flink.sink.internal.committer.DeltaCommitter that behave very similar - to FileCommitter. - When all the parallel committers are done, then all the files are committed at once by - single-parallelism io.delta.flink.sink.internal.committer.DeltaGlobalCommitter. -

    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - -
      All Methods Static Methods Concrete Methods 
      Modifier and TypeMethod and Description
      static RowDataDeltaSinkBuilderforRowData(org.apache.flink.core.fs.Path basePath, - org.apache.hadoop.conf.Configuration conf, - org.apache.flink.table.types.logical.RowType rowType) -
      Convenience method for creating a RowDataDeltaSinkBuilder for DeltaSink to a - Delta table.
      -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        forRowData

        -
        public static RowDataDeltaSinkBuilder forRowData(org.apache.flink.core.fs.Path basePath,
        -                                                 org.apache.hadoop.conf.Configuration conf,
        -                                                 org.apache.flink.table.types.logical.RowType rowType)
        -
        Convenience method for creating a RowDataDeltaSinkBuilder for DeltaSink to a - Delta table.
        -
        -
        Parameters:
        -
        basePath - root path of the Delta table
        -
        conf - Hadoop's conf object that will be used for creating instances of - DeltaLog and will be also passed to the - ParquetRowDataBuilder to create ParquetWriterFactory
        -
        rowType - Flink's logical type to indicate the structure of the events in the stream
        -
        Returns:
        -
        builder for the DeltaSink
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html b/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html deleted file mode 100644 index 3f1d6aab1d3..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html +++ /dev/null @@ -1,430 +0,0 @@ - - - - - -RowDataDeltaSinkBuilder (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.sink
-

Class RowDataDeltaSinkBuilder

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      RowDataDeltaSinkBuilder(org.apache.flink.core.fs.Path tableBasePath, - org.apache.hadoop.conf.Configuration conf, - org.apache.flink.table.types.logical.RowType rowType, - boolean mergeSchema) -
      Creates instance of the builder for DeltaSink.
      -
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        RowDataDeltaSinkBuilder

        -
        public RowDataDeltaSinkBuilder(org.apache.flink.core.fs.Path tableBasePath,
        -                               org.apache.hadoop.conf.Configuration conf,
        -                               org.apache.flink.table.types.logical.RowType rowType,
        -                               boolean mergeSchema)
        -
        Creates instance of the builder for DeltaSink.
        -
        -
        Parameters:
        -
        tableBasePath - path to a Delta table
        -
        conf - Hadoop's conf object
        -
        rowType - Flink's logical type to indicate the structure of the events in - the stream
        -
        mergeSchema - whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch. This is not guaranteed - since it checks for compatible schemas.
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        withMergeSchema

        -
        public RowDataDeltaSinkBuilder withMergeSchema(boolean mergeSchema)
        -
        Sets the sink's option whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch during a commit to the - DeltaLog. The update is not guaranteed since it checks for - compatible schemas.
        -
        -
        Parameters:
        -
        mergeSchema - whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch. This is not guaranteed - since it requires compatible schemas.
        -
        Returns:
        -
        builder for DeltaSink
        -
        -
      • -
      - - - -
        -
      • -

        withPartitionColumns

        -
        public RowDataDeltaSinkBuilder withPartitionColumns(String... partitionColumns)
        -
        Sets list of partition fields that will be extracted from incoming RowData events. -

        - Provided fields' names must correspond to the names provided in the RowType object - for this sink and must be in the same order as expected order of occurrence in the partition - path that will be generated.

        -
        -
        Parameters:
        -
        partitionColumns - array of partition columns' names in the order they should be applied - when creating destination path.
        -
        Returns:
        -
        builder for DeltaSink
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataDeltaSinkBuilder option(String optionName,
        -                                      String optionValue)
        -
        Sets a configuration option.
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataDeltaSinkBuilder option(String optionName,
        -                                      boolean optionValue)
        -
        Sets a configuration option.
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataDeltaSinkBuilder option(String optionName,
        -                                      int optionValue)
        -
        Sets a configuration option.
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataDeltaSinkBuilder option(String optionName,
        -                                      long optionValue)
        -
        Sets a configuration option.
        -
      • -
      - - - -
        -
      • -

        build

        -
        public DeltaSink<org.apache.flink.table.data.RowData> build()
        -
        Creates the actual sink.
        -
        -
        Returns:
        -
        constructed DeltaSink object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/package-frame.html b/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/package-frame.html deleted file mode 100644 index 21341ecfc7b..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -io.delta.flink.sink (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - -

io.delta.flink.sink

-
-

Classes

- -
- - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/package-summary.html b/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/package-summary.html deleted file mode 100644 index b77e54b0ecc..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/package-summary.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - -io.delta.flink.sink (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.flink.sink

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/package-tree.html b/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/package-tree.html deleted file mode 100644 index 9b976f0c6c2..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/sink/package-tree.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - -io.delta.flink.sink Class Hierarchy (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.flink.sink

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/DeltaSource.html b/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/DeltaSource.html deleted file mode 100644 index 92dac9f4b8f..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/DeltaSource.html +++ /dev/null @@ -1,366 +0,0 @@ - - - - - -DeltaSource (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.source
-

Class DeltaSource<T>

-
-
- -
-
    -
  • -
    -
    Type Parameters:
    -
    T - The type of the events/records produced by this source.
    -
    -
    -
    -
    public class DeltaSource<T>
    -extends <any>
    -
    A unified data source that reads Delta table - both in batch and in streaming mode. - -

    This source supports all (distributed) file systems and object stores that can be accessed - via the Flink's FileSystem class. -

    - To create a new instance of DeltaSource for a Delta table that will produce - RowData records that contain all table columns: -

    -     StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    -     ...
    -     // Bounded mode.
    -     DeltaSource<RowData> deltaSource = DeltaSource.forBoundedRowData(
    -                new Path("s3://some/path"),
    -                new Configuration()
    -             )
    -             .versionAsOf(10)
    -             .build();
    -
    -     env.fromSource(deltaSource, WatermarkStrategy.noWatermarks(), "delta-source")
    -
    -     ..........
    -     // Continuous mode.
    -     DeltaSource<RowData> deltaSource = DeltaSource.forContinuousRowData(
    -                new Path("s3://some/path"),
    -                new Configuration()
    -               )
    -              .updateCheckIntervalMillis(1000)
    -              .startingVersion(10)
    -              .build();
    -
    -     env.fromSource(deltaSource, WatermarkStrategy.noWatermarks(), "delta-source")
    - 
    -

    - To create a new instance of DeltaSource for a Delta table that will produce - RowData records with user-selected columns: -

    -     StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    -     ...
    -     // Bounded mode.
    -     DeltaSource<RowData> deltaSource = DeltaSource.forBoundedRowData(
    -                new Path("s3://some/path"),
    -                new Configuration()
    -             )
    -             .columnNames(Arrays.asList("col1", "col2"))
    -             .versionAsOf(10)
    -             .build();
    -
    -     env.fromSource(deltaSource, WatermarkStrategy.noWatermarks(), "delta-source")
    -
    -     ..........
    -     // Continuous mode.
    -     DeltaSource<RowData> deltaSource = DeltaSource.forContinuousRowData(
    -                new Path("s3://some/path"),
    -                new Configuration()
    -               )
    -               .columnNames(Arrays.asList("col1", "col2"))
    -               .updateCheckIntervalMillis(1000)
    -               .startingVersion(10)
    -               .build();
    -
    -     env.fromSource(deltaSource, WatermarkStrategy.noWatermarks(), "delta-source")
    - 
    - When using columnNames(...) method, the source will discover the data types for the - given columns from the Delta log.
    -
    -
    Implementation Note:
    -

    Batch and Streaming

    - -

    This source supports both bounded/batch and continuous/streaming modes. For the - bounded/batch case, the Delta Source processes the full state of the Delta table. In - the continuous/streaming case, the default Delta Source will also process the full state of the - table, and then begin to periodically check the Delta table for any appending changes and read - them. Using either of the RowDataContinuousDeltaSourceBuilder.startingVersion(java.lang.String) or - RowDataContinuousDeltaSourceBuilder.startingTimestamp(java.lang.String) APIs will cause the Delta Source, - in continuous mode, to stream only the changes from that historical version. - -

    Format Types

    - -

    The reading of each file happens through file readers defined by file format. These - define the parsing logic for the contents of the underlying Parquet files. - -

    A BulkFormat reads batches of records from a file at a time.,

    Discovering / Enumerating Files

    -

    The way that the source lists the files to be processes is defined by the AddFileEnumerator. The AddFileEnumerator is responsible to select the relevant AddFile and to optionally splits files into multiple regions (file source splits) that can be - read in parallel.

    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - -
      All Methods Static Methods Concrete Methods 
      Modifier and TypeMethod and Description
      static RowDataBoundedDeltaSourceBuilderforBoundedRowData(org.apache.flink.core.fs.Path tablePath, - org.apache.hadoop.conf.Configuration hadoopConfiguration) -
      Creates an instance of Delta source builder for Bounded mode and for RowData - elements.
      -
      static RowDataContinuousDeltaSourceBuilderforContinuousRowData(org.apache.flink.core.fs.Path tablePath, - org.apache.hadoop.conf.Configuration hadoopConfiguration) -
      Creates an instance of Delta source builder for Continuous mode and for RowData - elements.
      -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        forBoundedRowData

        -
        public static RowDataBoundedDeltaSourceBuilder forBoundedRowData(org.apache.flink.core.fs.Path tablePath,
        -                                                                 org.apache.hadoop.conf.Configuration hadoopConfiguration)
        -
        Creates an instance of Delta source builder for Bounded mode and for RowData - elements.
        -
        -
        Parameters:
        -
        tablePath - Path to Delta table to read data from.
        -
        hadoopConfiguration - Hadoop configuration.
        -
        -
      • -
      - - - -
        -
      • -

        forContinuousRowData

        -
        public static RowDataContinuousDeltaSourceBuilder forContinuousRowData(org.apache.flink.core.fs.Path tablePath,
        -                                                                       org.apache.hadoop.conf.Configuration hadoopConfiguration)
        -
        Creates an instance of Delta source builder for Continuous mode and for RowData - elements.
        -
        -
        Parameters:
        -
        tablePath - Path to Delta table to read data from.
        -
        hadoopConfiguration - Hadoop configuration.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/RowDataBoundedDeltaSourceBuilder.html b/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/RowDataBoundedDeltaSourceBuilder.html deleted file mode 100644 index d0e5fa836be..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/RowDataBoundedDeltaSourceBuilder.html +++ /dev/null @@ -1,454 +0,0 @@ - - - - - -RowDataBoundedDeltaSourceBuilder (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.source
-

Class RowDataBoundedDeltaSourceBuilder

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        columnNames

        -
        public RowDataBoundedDeltaSourceBuilder columnNames(java.util.List<String> columnNames)
        -
        Specifies a List of column names that should be read from Delta table. If this method - is not used, Source will read all columns from Delta table. -

        - If provided List is null or contains null, empty or blank elements it will throw a - DeltaSourceValidationException by builder after calling build() method.

        -
        -
        Parameters:
        -
        columnNames - column names that should be read.
        -
        -
      • -
      - - - -
        -
      • -

        columnNames

        -
        public RowDataBoundedDeltaSourceBuilder columnNames(String... columnNames)
        -
        Specifies an array of column names that should be read from Delta table. If this method - is not used, Source will read all columns from Delta table. -

        - If provided List is null or contains null, empty or blank elements it will throw a - DeltaSourceValidationException by builder after calling build() method.

        -
        -
        Parameters:
        -
        columnNames - column names that should be read.
        -
        -
      • -
      - - - -
        -
      • -

        versionAsOf

        -
        public RowDataBoundedDeltaSourceBuilder versionAsOf(long snapshotVersion)
        -
        Sets value of "versionAsOf" option. With this option we will load the given table version and - read from it. - -

        - This option is mutually exclusive with timestampAsOf(String) option.

        -
        -
        Parameters:
        -
        snapshotVersion - Delta table version to time travel to.
        -
        -
      • -
      - - - -
        -
      • -

        timestampAsOf

        -
        public RowDataBoundedDeltaSourceBuilder timestampAsOf(String snapshotTimestamp)
        -
        Sets value of "timestampAsOf" option. With this option we will load the latest table version - that was generated at or before the given timestamp. -

        - This option is mutually exclusive with versionAsOf(long) option.

        -
        -
        Parameters:
        -
        snapshotTimestamp - The timestamp we should time travel to. Supported formats are: -
          -
        • 2022-02-24
        • -
        • 2022-02-24 04:55:00
        • -
        • 2022-02-24 04:55:00.001
        • -
        • 2022-02-24T04:55:00
        • -
        • 2022-02-24T04:55:00.001
        • -
        • 2022-02-24T04:55:00.001Z
        • -
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataBoundedDeltaSourceBuilder option(String optionName,
        -                                               String optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option String value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataBoundedDeltaSourceBuilder option(String optionName,
        -                                               boolean optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option boolean value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataBoundedDeltaSourceBuilder option(String optionName,
        -                                               int optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option int value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataBoundedDeltaSourceBuilder option(String optionName,
        -                                               long optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option long value to set.
        -
        -
      • -
      - - - -
        -
      • -

        build

        -
        public DeltaSource<org.apache.flink.table.data.RowData> build()
        -
        Creates an instance of DeltaSource for a stream of RowData. Created source - will work in Bounded mode, meaning it will read the content of the configured Delta snapshot - at the fixed version, ignoring all changes done to this table after starting this source. - -

        - This method can throw DeltaSourceValidationException in case of invalid arguments - passed to Delta source builder.

        -
        -
        Returns:
        -
        New DeltaSource instance.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/RowDataContinuousDeltaSourceBuilder.html b/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/RowDataContinuousDeltaSourceBuilder.html deleted file mode 100644 index 4aea8c5bb50..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/RowDataContinuousDeltaSourceBuilder.html +++ /dev/null @@ -1,557 +0,0 @@ - - - - - -RowDataContinuousDeltaSourceBuilder (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.source
-

Class RowDataContinuousDeltaSourceBuilder

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        columnNames

        -
        public RowDataContinuousDeltaSourceBuilder columnNames(java.util.List<String> columnNames)
        -
        Specifies a List of column names that should be read from Delta table. If this method - is not used, Source will read all columns from Delta table. -

        - If provided List is null or contains null, empty or blank elements it will throw a - DeltaSourceValidationException by builder after calling build() method.

        -
        -
        Parameters:
        -
        columnNames - column names that should be read.
        -
        -
      • -
      - - - -
        -
      • -

        columnNames

        -
        public RowDataContinuousDeltaSourceBuilder columnNames(String... columnNames)
        -
        Specifies an array of column names that should be read from Delta table. If this method - is not used, Source will read all columns from Delta table. -

        - If provided List is null or contains null, empty or blank elements it will throw a - DeltaSourceValidationException by builder after calling build() method.

        -
        -
        Parameters:
        -
        columnNames - column names that should be read.
        -
        -
      • -
      - - - -
        -
      • -

        startingVersion

        -
        public RowDataContinuousDeltaSourceBuilder startingVersion(String startingVersion)
        -
        Sets value of "startingVersion" option. This option specifies the starting table version from - which we want to start reading changes. - -

        - This option is mutually exclusive with startingTimestamp(String) option.

        -
        -
        Parameters:
        -
        startingVersion - Delta table version to start reading changes from. The values can be - string numbers like "1", "10" etc. or keyword "latest", where in that - case, changes from the latest Delta table version will be read.
        -
        -
      • -
      - - - -
        -
      • -

        startingVersion

        -
        public RowDataContinuousDeltaSourceBuilder startingVersion(long startingVersion)
        -
        Sets value of "startingVersion" option. This option specifies the starting table version from - which we want to start reading changes. - -

        - This option is mutually exclusive with startingTimestamp(String) option.

        -
        -
        Parameters:
        -
        startingVersion - Delta table version to start reading changes from.
        -
        -
      • -
      - - - -
        -
      • -

        startingTimestamp

        -
        public RowDataContinuousDeltaSourceBuilder startingTimestamp(String startingTimestamp)
        -
        Sets value of "startingTimestamp" option. This option is used to read only changes starting - from the table version that was generated at or after the given timestamp. - -

        - This option is mutually exclusive with startingVersion(String) and startingVersion(long) option.

        -
        -
        Parameters:
        -
        startingTimestamp - The timestamp of the table from which we start reading changes. - Supported formats are: -
          -
        • 2022-02-24
        • -
        • 2022-02-24 04:55:00
        • -
        • 2022-02-24 04:55:00.001
        • -
        • 2022-02-24T04:55:00
        • -
        • 2022-02-24T04:55:00.001
        • -
        • 2022-02-24T04:55:00.001Z
        • -
        -
        -
      • -
      - - - -
        -
      • -

        updateCheckIntervalMillis

        -
        public RowDataContinuousDeltaSourceBuilder updateCheckIntervalMillis(long updateCheckInterval)
        -
        Sets the value for "updateCheckIntervalMillis" option. This option is used to specify the - check interval (in milliseconds) used for periodic Delta table changes checks. - -

        - The default value for this option is 5000 ms.

        -
        -
        Parameters:
        -
        updateCheckInterval - The update check internal in milliseconds.
        -
        -
      • -
      - - - -
        -
      • -

        ignoreDeletes

        -
        public RowDataContinuousDeltaSourceBuilder ignoreDeletes(boolean ignoreDeletes)
        -
        Sets the "ignoreDeletes" option. When set to true, this option allows processing Delta table - versions where data is deleted. -

        - The default value for this option is false.

        -
      • -
      - - - -
        -
      • -

        ignoreChanges

        -
        public RowDataContinuousDeltaSourceBuilder ignoreChanges(boolean ignoreChanges)
        -
        Sets the "ignoreChanges" option. When set to true, this option allows processing Delta table - versions where data is changed (i.e. updated) or deleted. -

        - Note that setting this option to true can lead to duplicate processing of data, as, in the - case of updates, existing rows may be rewritten in new files, and those new files will be - treated as new data and be fully reprocessed. -

        - This option subsumes ignoreDeletes(boolean) option. Therefore, if you set "ignoreChanges" to - true, your stream will not be disrupted by either deletions or updates to the source table. -

        - The default value for this option is false.

        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataContinuousDeltaSourceBuilder option(String optionName,
        -                                                  String optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option String value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataContinuousDeltaSourceBuilder option(String optionName,
        -                                                  boolean optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option boolean value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataContinuousDeltaSourceBuilder option(String optionName,
        -                                                  int optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option int value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataContinuousDeltaSourceBuilder option(String optionName,
        -                                                  long optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option long value to set.
        -
        -
      • -
      - - - -
        -
      • -

        build

        -
        public DeltaSource<org.apache.flink.table.data.RowData> build()
        -
        Creates an instance of DeltaSource for a stream of RowData. Created source - will work in Continuous mode, actively monitoring Delta table for new changes. - -

        - This method can throw DeltaSourceValidationException in case of invalid arguments - passed to Delta source builder.

        -
        -
        Returns:
        -
        New DeltaSource instance.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/package-frame.html b/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/package-frame.html deleted file mode 100644 index ba6daaa7134..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/package-frame.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - -io.delta.flink.source (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - -

io.delta.flink.source

-
-

Classes

- -
- - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/package-summary.html b/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/package-summary.html deleted file mode 100644 index 911a0a497a3..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/package-summary.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - -io.delta.flink.source (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.flink.source

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/package-tree.html b/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/package-tree.html deleted file mode 100644 index 454250cab54..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/io/delta/flink/source/package-tree.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - -io.delta.flink.source Class Hierarchy (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.flink.source

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/overview-frame.html b/connectors/docs/0.6.0/delta-flink/api/java/overview-frame.html deleted file mode 100644 index 0fcaeed613e..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/overview-frame.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - -Overview List (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - -
All Classes
-
-

Packages

- -
-

 

- - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/overview-summary.html b/connectors/docs/0.6.0/delta-flink/api/java/overview-summary.html deleted file mode 100644 index d584cde1828..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/overview-summary.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - -Overview (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
- - - - - - - - - - - - - - - - -
Packages 
PackageDescription
io.delta.flink.sink 
io.delta.flink.source 
-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/overview-tree.html b/connectors/docs/0.6.0/delta-flink/api/java/overview-tree.html deleted file mode 100644 index fb7bd958350..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/overview-tree.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - -Class Hierarchy (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For All Packages

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-flink/api/java/package-list b/connectors/docs/0.6.0/delta-flink/api/java/package-list deleted file mode 100644 index c808a2a72e7..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/package-list +++ /dev/null @@ -1,2 +0,0 @@ -io.delta.flink.sink -io.delta.flink.source diff --git a/connectors/docs/0.6.0/delta-flink/api/java/script.js b/connectors/docs/0.6.0/delta-flink/api/java/script.js deleted file mode 100644 index b3463569314..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/script.js +++ /dev/null @@ -1,30 +0,0 @@ -function show(type) -{ - count = 0; - for (var key in methods) { - var row = document.getElementById(key); - if ((methods[key] & type) != 0) { - row.style.display = ''; - row.className = (count++ % 2) ? rowColor : altColor; - } - else - row.style.display = 'none'; - } - updateTabs(type); -} - -function updateTabs(type) -{ - for (var value in tabs) { - var sNode = document.getElementById(tabs[value][0]); - var spanNode = sNode.firstChild; - if (value == type) { - sNode.className = activeTableTab; - spanNode.innerHTML = tabs[value][1]; - } - else { - sNode.className = tableTab; - spanNode.innerHTML = "" + tabs[value][1] + ""; - } - } -} diff --git a/connectors/docs/0.6.0/delta-flink/api/java/stylesheet.css b/connectors/docs/0.6.0/delta-flink/api/java/stylesheet.css deleted file mode 100644 index 98055b22d6d..00000000000 --- a/connectors/docs/0.6.0/delta-flink/api/java/stylesheet.css +++ /dev/null @@ -1,574 +0,0 @@ -/* Javadoc style sheet */ -/* -Overall document style -*/ - -@import url('resources/fonts/dejavu.css'); - -body { - background-color:#ffffff; - color:#353833; - font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; - font-size:14px; - margin:0; -} -a:link, a:visited { - text-decoration:none; - color:#4A6782; -} -a:hover, a:focus { - text-decoration:none; - color:#bb7a2a; -} -a:active { - text-decoration:none; - color:#4A6782; -} -a[name] { - color:#353833; -} -a[name]:hover { - text-decoration:none; - color:#353833; -} -pre { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; -} -h1 { - font-size:20px; -} -h2 { - font-size:18px; -} -h3 { - font-size:16px; - font-style:italic; -} -h4 { - font-size:13px; -} -h5 { - font-size:12px; -} -h6 { - font-size:11px; -} -ul { - list-style-type:disc; -} -code, tt { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; - margin-top:8px; - line-height:1.4em; -} -dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; -} -table tr td dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - vertical-align:top; - padding-top:4px; -} -sup { - font-size:8px; -} -/* -Document title and Copyright styles -*/ -.clear { - clear:both; - height:0px; - overflow:hidden; -} -.aboutLanguage { - float:right; - padding:0px 21px; - font-size:11px; - z-index:200; - margin-top:-9px; -} -.legalCopy { - margin-left:.5em; -} -.bar a, .bar a:link, .bar a:visited, .bar a:active { - color:#FFFFFF; - text-decoration:none; -} -.bar a:hover, .bar a:focus { - color:#bb7a2a; -} -.tab { - background-color:#0066FF; - color:#ffffff; - padding:8px; - width:5em; - font-weight:bold; -} -/* -Navigation bar styles -*/ -.bar { - background-color:#4D7A97; - color:#FFFFFF; - padding:.8em .5em .4em .8em; - height:auto;/*height:1.8em;*/ - font-size:11px; - margin:0; -} -.topNav { - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.bottomNav { - margin-top:10px; - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.subNav { - background-color:#dee3e9; - float:left; - width:100%; - overflow:hidden; - font-size:12px; -} -.subNav div { - clear:left; - float:left; - padding:0 0 5px 6px; - text-transform:uppercase; -} -ul.navList, ul.subNavList { - float:left; - margin:0 25px 0 0; - padding:0; -} -ul.navList li{ - list-style:none; - float:left; - padding: 5px 6px; - text-transform:uppercase; -} -ul.subNavList li{ - list-style:none; - float:left; -} -.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { - color:#FFFFFF; - text-decoration:none; - text-transform:uppercase; -} -.topNav a:hover, .bottomNav a:hover { - text-decoration:none; - color:#bb7a2a; - text-transform:uppercase; -} -.navBarCell1Rev { - background-color:#F8981D; - color:#253441; - margin: auto 5px; -} -.skipNav { - position:absolute; - top:auto; - left:-9999px; - overflow:hidden; -} -/* -Page header and footer styles -*/ -.header, .footer { - clear:both; - margin:0 20px; - padding:5px 0 0 0; -} -.indexHeader { - margin:10px; - position:relative; -} -.indexHeader span{ - margin-right:15px; -} -.indexHeader h1 { - font-size:13px; -} -.title { - color:#2c4557; - margin:10px 0; -} -.subTitle { - margin:5px 0 0 0; -} -.header ul { - margin:0 0 15px 0; - padding:0; -} -.footer ul { - margin:20px 0 5px 0; -} -.header ul li, .footer ul li { - list-style:none; - font-size:13px; -} -/* -Heading styles -*/ -div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList ul.blockList li.blockList h3 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList li.blockList h3 { - padding:0; - margin:15px 0; -} -ul.blockList li.blockList h2 { - padding:0px 0 20px 0; -} -/* -Page layout container styles -*/ -.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { - clear:both; - padding:10px 20px; - position:relative; -} -.indexContainer { - margin:10px; - position:relative; - font-size:12px; -} -.indexContainer h2 { - font-size:13px; - padding:0 0 3px 0; -} -.indexContainer ul { - margin:0; - padding:0; -} -.indexContainer ul li { - list-style:none; - padding-top:2px; -} -.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { - font-size:12px; - font-weight:bold; - margin:10px 0 0 0; - color:#4E4E4E; -} -.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { - margin:5px 0 10px 0px; - font-size:14px; - font-family:'DejaVu Sans Mono',monospace; -} -.serializedFormContainer dl.nameValue dt { - margin-left:1px; - font-size:1.1em; - display:inline; - font-weight:bold; -} -.serializedFormContainer dl.nameValue dd { - margin:0 0 0 1px; - font-size:1.1em; - display:inline; -} -/* -List styles -*/ -ul.horizontal li { - display:inline; - font-size:0.9em; -} -ul.inheritance { - margin:0; - padding:0; -} -ul.inheritance li { - display:inline; - list-style:none; -} -ul.inheritance li ul.inheritance { - margin-left:15px; - padding-left:15px; - padding-top:1px; -} -ul.blockList, ul.blockListLast { - margin:10px 0 10px 0; - padding:0; -} -ul.blockList li.blockList, ul.blockListLast li.blockList { - list-style:none; - margin-bottom:15px; - line-height:1.4; -} -ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { - padding:0px 20px 5px 10px; - border:1px solid #ededed; - background-color:#f8f8f8; -} -ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { - padding:0 0 5px 8px; - background-color:#ffffff; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { - margin-left:0; - padding-left:0; - padding-bottom:15px; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { - list-style:none; - border-bottom:none; - padding-bottom:0; -} -table tr td dl, table tr td dl dt, table tr td dl dd { - margin-top:0; - margin-bottom:1px; -} -/* -Table styles -*/ -.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { - width:100%; - border-left:1px solid #EEE; - border-right:1px solid #EEE; - border-bottom:1px solid #EEE; -} -.overviewSummary, .memberSummary { - padding:0px; -} -.overviewSummary caption, .memberSummary caption, .typeSummary caption, -.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { - position:relative; - text-align:left; - background-repeat:no-repeat; - color:#253441; - font-weight:bold; - clear:none; - overflow:hidden; - padding:0px; - padding-top:10px; - padding-left:1px; - margin:0px; - white-space:pre; -} -.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, -.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, -.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, -.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, -.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, -.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, -.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, -.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { - color:#FFFFFF; -} -.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, -.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - padding-bottom:7px; - display:inline-block; - float:left; - background-color:#F8981D; - border: none; - height:16px; -} -.memberSummary caption span.activeTableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#F8981D; - height:16px; -} -.memberSummary caption span.tableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#4D7A97; - height:16px; -} -.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { - padding-top:0px; - padding-left:0px; - padding-right:0px; - background-image:none; - float:none; - display:inline; -} -.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, -.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { - display:none; - width:5px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .activeTableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .tableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - background-color:#4D7A97; - float:left; - -} -.overviewSummary td, .memberSummary td, .typeSummary td, -.useSummary td, .constantsSummary td, .deprecatedSummary td { - text-align:left; - padding:0px 0px 12px 10px; -} -th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, -td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ - vertical-align:top; - padding-right:0px; - padding-top:8px; - padding-bottom:3px; -} -th.colFirst, th.colLast, th.colOne, .constantsSummary th { - background:#dee3e9; - text-align:left; - padding:8px 3px 3px 7px; -} -td.colFirst, th.colFirst { - white-space:nowrap; - font-size:13px; -} -td.colLast, th.colLast { - font-size:13px; -} -td.colOne, th.colOne { - font-size:13px; -} -.overviewSummary td.colFirst, .overviewSummary th.colFirst, -.useSummary td.colFirst, .useSummary th.colFirst, -.overviewSummary td.colOne, .overviewSummary th.colOne, -.memberSummary td.colFirst, .memberSummary th.colFirst, -.memberSummary td.colOne, .memberSummary th.colOne, -.typeSummary td.colFirst{ - width:25%; - vertical-align:top; -} -td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { - font-weight:bold; -} -.tableSubHeadingColor { - background-color:#EEEEFF; -} -.altColor { - background-color:#FFFFFF; -} -.rowColor { - background-color:#EEEEEF; -} -/* -Content styles -*/ -.description pre { - margin-top:0; -} -.deprecatedContent { - margin:0; - padding:10px 0; -} -.docSummary { - padding:0; -} - -ul.blockList ul.blockList ul.blockList li.blockList h3 { - font-style:normal; -} - -div.block { - font-size:14px; - font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; -} - -td.colLast div { - padding-top:0px; -} - - -td.colLast a { - padding-bottom:3px; -} -/* -Formatting effect styles -*/ -.sourceLineNo { - color:green; - padding:0 30px 0 0; -} -h1.hidden { - visibility:hidden; - overflow:hidden; - font-size:10px; -} -.block { - display:block; - margin:3px 10px 2px 0px; - color:#474747; -} -.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, -.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, -.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { - font-weight:bold; -} -.deprecationComment, .emphasizedPhrase, .interfaceName { - font-style:italic; -} - -div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, -div.block div.block span.interfaceName { - font-style:normal; -} - -div.contentContainer ul.blockList li.blockList h2{ - padding-bottom:0px; -} diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/allclasses-frame.html b/connectors/docs/0.6.0/delta-standalone/api/java/allclasses-frame.html deleted file mode 100644 index 2cd19b9c6b3..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/allclasses-frame.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - -All Classes (Delta Standalone 0.6.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/allclasses-noframe.html b/connectors/docs/0.6.0/delta-standalone/api/java/allclasses-noframe.html deleted file mode 100644 index 20beac65d20..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/allclasses-noframe.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - -All Classes (Delta Standalone 0.6.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/constant-values.html b/connectors/docs/0.6.0/delta-standalone/api/java/constant-values.html deleted file mode 100644 index 721d086fa0a..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/constant-values.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - -Constant Field Values (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Constant Field Values

-

Contents

- -
-
- - -

io.delta.*

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/deprecated-list.html b/connectors/docs/0.6.0/delta-standalone/api/java/deprecated-list.html deleted file mode 100644 index f6209b0bd56..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/deprecated-list.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - -Deprecated List (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Deprecated API

-

Contents

- -
-
- - - -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/help-doc.html b/connectors/docs/0.6.0/delta-standalone/api/java/help-doc.html deleted file mode 100644 index dcd95e0284e..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/help-doc.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - -API Help (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

How This API Document Is Organized

-
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
-
-
- -This help file applies to API documentation generated using the standard doclet.
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/index-all.html b/connectors/docs/0.6.0/delta-standalone/api/java/index-all.html deleted file mode 100644 index be58d05fb14..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/index-all.html +++ /dev/null @@ -1,1519 +0,0 @@ - - - - - -Index (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
A B C D E F G H I J L M N O P R S T U V W  - - -

A

-
-
Action - Interface in io.delta.standalone.actions
-
-
A marker interface for all actions that can be applied to a Delta table.
-
-
add(StructField) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new field.
-
-
add(String, DataType) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new nullable field with no metadata.
-
-
add(String, DataType, boolean) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new field with no metadata.
-
-
AddCDCFile - Class in io.delta.standalone.actions
-
-
A change file containing CDC data for the Delta version it's within.
-
-
AddCDCFile(String, Map<String, String>, long, Map<String, String>) - Constructor for class io.delta.standalone.actions.AddCDCFile
-
 
-
AddFile - Class in io.delta.standalone.actions
-
-
Represents an action that adds a new file to the table.
-
-
AddFile(String, Map<String, String>, long, long, boolean, String, Map<String, String>) - Constructor for class io.delta.standalone.actions.AddFile
-
 
-
AddFile.Builder - Class in io.delta.standalone.actions
-
-
Builder class for AddFile.
-
-
And - Class in io.delta.standalone.expressions
-
-
Evaluates logical expr1 AND expr2 for new And(expr1, expr2).
-
-
And(Expression, Expression) - Constructor for class io.delta.standalone.expressions.And
-
 
-
ArrayType - Class in io.delta.standalone.types
-
-
The data type for collections of multiple values.
-
-
ArrayType(DataType, boolean) - Constructor for class io.delta.standalone.types.ArrayType
-
 
-
- - - -

B

-
-
BinaryComparison - Class in io.delta.standalone.expressions
-
-
A BinaryOperator that compares the left and right Expressions and evaluates to a - boolean value.
-
-
BinaryExpression - Class in io.delta.standalone.expressions
-
-
An Expression with two inputs and one output.
-
-
BinaryOperator - Class in io.delta.standalone.expressions
-
-
A BinaryExpression that is an operator, meaning the string representation is - x symbol y, rather than funcName(x, y).
-
-
BinaryType - Class in io.delta.standalone.types
-
-
The data type representing byte[] values.
-
-
BinaryType() - Constructor for class io.delta.standalone.types.BinaryType
-
 
-
BooleanType - Class in io.delta.standalone.types
-
-
The data type representing boolean values.
-
-
BooleanType() - Constructor for class io.delta.standalone.types.BooleanType
-
 
-
build() - Method in class io.delta.standalone.actions.AddFile.Builder
-
-
Builds an AddFile using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
-
Builds a CommitInfo using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.JobInfo.Builder
-
-
Builds a JobInfo using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.Metadata.Builder
-
-
Builds a Metadata using the provided parameters.
-
-
build() - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
builder(String, Map<String, String>, long, long, boolean) - Static method in class io.delta.standalone.actions.AddFile
-
 
-
Builder(String, Map<String, String>, long, long, boolean) - Constructor for class io.delta.standalone.actions.AddFile.Builder
-
 
-
builder() - Static method in class io.delta.standalone.actions.CommitInfo
-
 
-
Builder() - Constructor for class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
builder(String) - Static method in class io.delta.standalone.actions.JobInfo
-
 
-
Builder(String) - Constructor for class io.delta.standalone.actions.JobInfo.Builder
-
 
-
builder() - Static method in class io.delta.standalone.actions.Metadata
-
 
-
Builder() - Constructor for class io.delta.standalone.actions.Metadata.Builder
-
 
-
builder() - Static method in class io.delta.standalone.types.FieldMetadata
-
 
-
Builder() - Constructor for class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
ByteType - Class in io.delta.standalone.types
-
-
The data type representing byte values.
-
-
ByteType() - Constructor for class io.delta.standalone.types.ByteType
-
 
-
- - - -

C

-
-
children() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
children() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
children() - Method in class io.delta.standalone.expressions.In
-
 
-
children() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
children() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
CloseableIterator<T> - Interface in io.delta.standalone.data
-
-
An Iterator that also implements the Closeable interface.
-
-
clusterId(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
Column - Class in io.delta.standalone.expressions
-
-
A column whose row-value will be computed based on the data in a RowRecord.
-
-
Column(String, DataType) - Constructor for class io.delta.standalone.expressions.Column
-
 
-
column(String) - Method in class io.delta.standalone.types.StructType
-
-
Creates a Column expression for the field with the given fieldName.
-
-
commit(Iterable<T>, Operation, String) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Modifies the state of the log by adding a new commit that is based on a read at the table's - latest version as of this transaction's instantiation.
-
-
CommitInfo - Class in io.delta.standalone.actions
-
-
Holds provenance information about changes to the table.
-
-
CommitInfo(Optional<Long>, Timestamp, Optional<String>, Optional<String>, String, Map<String, String>, Optional<JobInfo>, Optional<NotebookInfo>, Optional<String>, Optional<Long>, Optional<String>, Optional<Boolean>, Optional<Map<String, String>>, Optional<String>) - Constructor for class io.delta.standalone.actions.CommitInfo
-
 
-
CommitInfo(Optional<Long>, Timestamp, Optional<String>, Optional<String>, String, Map<String, String>, Optional<JobInfo>, Optional<NotebookInfo>, Optional<String>, Optional<Long>, Optional<String>, Optional<Boolean>, Optional<Map<String, String>>, Optional<String>, Optional<String>) - Constructor for class io.delta.standalone.actions.CommitInfo
-
 
-
CommitInfo.Builder - Class in io.delta.standalone.actions
-
-
Builder class for CommitInfo.
-
-
CommitResult - Class in io.delta.standalone
-
- -
-
CommitResult(long) - Constructor for class io.delta.standalone.CommitResult
-
 
-
ConcurrentAppendException - Exception in io.delta.standalone.exceptions
-
-
Thrown when files are added that would have been read by the current transaction.
-
-
ConcurrentAppendException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentAppendException
-
 
-
ConcurrentDeleteDeleteException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the current transaction deletes data that was deleted by a concurrent transaction.
-
-
ConcurrentDeleteDeleteException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentDeleteDeleteException
-
 
-
ConcurrentDeleteReadException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the current transaction reads data that was deleted by a concurrent transaction.
-
-
ConcurrentDeleteReadException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentDeleteReadException
-
 
-
ConcurrentTransactionException - Exception in io.delta.standalone.exceptions
-
-
Thrown when concurrent transaction both attempt to update the same idempotent transaction.
-
-
ConcurrentTransactionException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentTransactionException
-
 
-
configuration(Map<String, String>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
contains(String) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
containsNull() - Method in class io.delta.standalone.types.ArrayType
-
 
-
copyBuilder() - Method in class io.delta.standalone.actions.Metadata
-
 
-
createdTime(Long) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
createdTime(Optional<Long>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
- - - -

D

-
-
dataType() - Method in class io.delta.standalone.expressions.Column
-
 
-
dataType() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
dataType() - Method in class io.delta.standalone.expressions.Literal
-
 
-
dataType() - Method in interface io.delta.standalone.expressions.Predicate
-
 
-
DataType - Class in io.delta.standalone.types
-
-
The base type of all io.delta.standalone data types.
-
-
DataType() - Constructor for class io.delta.standalone.types.DataType
-
 
-
DateType - Class in io.delta.standalone.types
-
-
A date type, supporting "0001-01-01" through "9999-12-31".
-
-
DateType() - Constructor for class io.delta.standalone.types.DateType
-
 
-
DecimalType - Class in io.delta.standalone.types
-
-
The data type representing java.math.BigDecimal values.
-
-
DecimalType(int, int) - Constructor for class io.delta.standalone.types.DecimalType
-
 
-
DeltaConcurrentModificationException - Exception in io.delta.standalone.exceptions
-
-
The basic class for all Delta Standalone commit conflict exceptions.
-
-
DeltaConcurrentModificationException(String) - Constructor for exception io.delta.standalone.exceptions.DeltaConcurrentModificationException
-
 
-
DeltaLog - Interface in io.delta.standalone
-
-
Represents the transaction logs of a Delta table.
-
-
DeltaScan - Interface in io.delta.standalone
-
-
Provides access to an iterator over the files in this snapshot.
-
-
DeltaStandaloneException - Exception in io.delta.standalone.exceptions
-
-
Thrown when a query fails, usually because the query itself is invalid.
-
-
DeltaStandaloneException() - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
DeltaStandaloneException(String) - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
DeltaStandaloneException(String, Throwable) - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
deltaToParquet(StructType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, Boolean) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, ParquetSchemaConverter.ParquetOutputTimestampType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, Boolean, ParquetSchemaConverter.ParquetOutputTimestampType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
description(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
DoubleType - Class in io.delta.standalone.types
-
-
The data type representing double values.
-
-
DoubleType() - Constructor for class io.delta.standalone.types.DoubleType
-
 
-
- - - -

E

-
-
engineInfo(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.AddFile
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Format
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.JobInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Metadata
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Protocol
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.Column
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.Literal
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.types.ArrayType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.DataType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.DecimalType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
equals(Object) - Method in class io.delta.standalone.types.MapType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.StructField
-
 
-
equals(Object) - Method in class io.delta.standalone.types.StructType
-
 
-
EqualTo - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 = expr2 for new EqualTo(expr1, expr2).
-
-
EqualTo(Expression, Expression) - Constructor for class io.delta.standalone.expressions.EqualTo
-
 
-
equivalent(DataType) - Method in class io.delta.standalone.types.DataType
-
 
-
equivalent(DataType) - Method in class io.delta.standalone.types.DecimalType
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.Column
-
 
-
eval(RowRecord) - Method in interface io.delta.standalone.expressions.Expression
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.In
-
-
This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide.
-
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.IsNotNull
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.IsNull
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.Literal
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
executionTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to execute the entire operation.
-
-
Expression - Interface in io.delta.standalone.expressions
-
-
An expression in Delta Standalone.
-
-
- - - -

F

-
-
False - Static variable in class io.delta.standalone.expressions.Literal
-
 
-
FieldMetadata - Class in io.delta.standalone.types
-
-
The metadata for a given StructField.
-
-
FieldMetadata.Builder - Class in io.delta.standalone.types
-
-
Builder class for FieldMetadata.
-
-
FileAction - Interface in io.delta.standalone.actions
-
-
Generic interface for Actions pertaining to the addition and removal of files.
-
-
FloatType - Class in io.delta.standalone.types
-
-
The data type representing float values.
-
-
FloatType() - Constructor for class io.delta.standalone.types.FloatType
-
 
-
Format - Class in io.delta.standalone.actions
-
-
A specification of the encoding for the files stored in a table.
-
-
Format(String, Map<String, String>) - Constructor for class io.delta.standalone.actions.Format
-
 
-
Format() - Constructor for class io.delta.standalone.actions.Format
-
 
-
format(Format) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
forTable(Configuration, String) - Static method in interface io.delta.standalone.DeltaLog
-
-
Create a DeltaLog instance representing the table located at the provided - path.
-
-
forTable(Configuration, Path) - Static method in interface io.delta.standalone.DeltaLog
-
-
Create a DeltaLog instance representing the table located at the provided - path.
-
-
fromJson(String) - Static method in class io.delta.standalone.types.DataType
-
-
Parses the input json into a DataType.
-
-
- - - -

G

-
-
get(String) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
get(String) - Method in class io.delta.standalone.types.StructType
-
 
-
getActions() - Method in class io.delta.standalone.VersionLog
-
 
-
getActionsIterator() - Method in class io.delta.standalone.VersionLog
-
 
-
getAllFiles() - Method in interface io.delta.standalone.Snapshot
-
 
-
getAppId() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getBigDecimal(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.math.BigDecimal.
-
-
getBinary(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as binary (byte array).
-
-
getBoolean(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive boolean.
-
-
getByte(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive byte.
-
-
getCatalogString() - Method in class io.delta.standalone.types.DataType
-
 
-
getChanges(long, boolean) - Method in interface io.delta.standalone.DeltaLog
-
-
Get all actions starting from startVersion (inclusive) in increasing order of - committed version.
-
-
getChild() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
getClusterId() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getCommitInfoAt(long) - Method in interface io.delta.standalone.DeltaLog
-
 
-
getConfiguration() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getCreatedTime() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getDataType() - Method in class io.delta.standalone.types.StructField
-
 
-
getDate(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.sql.Date.
-
-
getDeletionTimestamp() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getDescription() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getDouble(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive double.
-
-
getElementType() - Method in class io.delta.standalone.types.ArrayType
-
 
-
getEngineInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getEntries() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
getFieldNames() - Method in class io.delta.standalone.types.StructType
-
 
-
getFields() - Method in class io.delta.standalone.types.StructType
-
 
-
getFiles() - Method in interface io.delta.standalone.DeltaScan
-
-
Creates a CloseableIterator over files belonging to this snapshot.
-
-
getFloat(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive float.
-
-
getFormat() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getId() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getInputPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getInt(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive int.
-
-
getIsBlindAppend() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getIsolationLevel() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getJobId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getJobInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getJobName() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getJobOwnerId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getKeyType() - Method in class io.delta.standalone.types.MapType
-
 
-
getLastUpdated() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getLeft() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
getLength() - Method in interface io.delta.standalone.data.RowRecord
-
 
-
getList(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.util.List<T> object.
-
-
getLong(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive long.
-
-
getMap(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
-
-
getMetadata() - Method in interface io.delta.standalone.Snapshot
-
 
-
getMetadata() - Method in class io.delta.standalone.types.StructField
-
 
-
getMetrics() - Method in class io.delta.standalone.Operation
-
 
-
getMinReaderVersion() - Method in class io.delta.standalone.actions.Protocol
-
 
-
getMinWriterVersion() - Method in class io.delta.standalone.actions.Protocol
-
 
-
getModificationTime() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getName() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getName() - Method in class io.delta.standalone.Operation
-
 
-
getName() - Method in class io.delta.standalone.types.StructField
-
 
-
getNotebookId() - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
getNotebookInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperation() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperationMetrics() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperationParameters() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOptions() - Method in class io.delta.standalone.actions.Format
-
 
-
getParameters() - Method in class io.delta.standalone.Operation
-
 
-
getPartitionColumns() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getPath() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getPath() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getPath() - Method in interface io.delta.standalone.actions.FileAction
-
 
-
getPath() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getPath() - Method in interface io.delta.standalone.DeltaLog
-
 
-
getPrecision() - Method in class io.delta.standalone.types.DecimalType
-
 
-
getProvider() - Method in class io.delta.standalone.actions.Format
-
 
-
getPushedPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getReadVersion() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getRecord(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a RowRecord object.
-
-
getResidualPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getRight() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
getRunId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getScale() - Method in class io.delta.standalone.types.DecimalType
-
 
-
getSchema() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getSchema() - Method in interface io.delta.standalone.data.RowRecord
-
 
-
getShort(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive short.
-
-
getSimpleString() - Method in class io.delta.standalone.types.ByteType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.DataType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.IntegerType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.LongType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.ShortType
-
 
-
getSize() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getSize() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getSize() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getSnapshotForTimestampAsOf(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Travel back in time to the latest Snapshot that was generated at or before - timestamp.
-
-
getSnapshotForVersionAsOf(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Travel back in time to the Snapshot with the provided version number.
-
-
getStats() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getString(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a String object.
-
-
getTags() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getTags() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getTags() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getTimestamp() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getTimestamp(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.sql.Timestamp.
-
-
getTreeString() - Method in class io.delta.standalone.types.StructType
-
 
-
getTriggerType() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getTypeName() - Method in class io.delta.standalone.types.DataType
-
 
-
getUserId() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getUserMetadata() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getUserMetadata() - Method in class io.delta.standalone.Operation
-
 
-
getUserName() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getValueType() - Method in class io.delta.standalone.types.MapType
-
 
-
getVersion() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getVersion() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getVersion() - Method in class io.delta.standalone.CommitResult
-
 
-
getVersion() - Method in interface io.delta.standalone.Snapshot
-
 
-
getVersion() - Method in class io.delta.standalone.VersionLog
-
 
-
getVersionAtOrAfterTimestamp(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Returns the latest version that was committed at or after timestamp.
-
-
getVersionBeforeOrAtTimestamp(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Returns the latest version that was committed before or at timestamp.
-
-
GreaterThan - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 > expr2 for new GreaterThan(expr1, expr2).
-
-
GreaterThan(Expression, Expression) - Constructor for class io.delta.standalone.expressions.GreaterThan
-
 
-
GreaterThanOrEqual - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 >= expr2 for new GreaterThanOrEqual(expr1, expr2).
-
-
GreaterThanOrEqual(Expression, Expression) - Constructor for class io.delta.standalone.expressions.GreaterThanOrEqual
-
 
-
- - - -

H

-
-
hashCode() - Method in class io.delta.standalone.actions.AddFile
-
 
-
hashCode() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Format
-
 
-
hashCode() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Metadata
-
 
-
hashCode() - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Protocol
-
 
-
hashCode() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.Column
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.Literal
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
hashCode() - Method in class io.delta.standalone.types.ArrayType
-
 
-
hashCode() - Method in class io.delta.standalone.types.DataType
-
 
-
hashCode() - Method in class io.delta.standalone.types.DecimalType
-
 
-
hashCode() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
hashCode() - Method in class io.delta.standalone.types.MapType
-
 
-
hashCode() - Method in class io.delta.standalone.types.StructField
-
 
-
hashCode() - Method in class io.delta.standalone.types.StructType
-
 
-
- - - -

I

-
-
id(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
In - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is in exprList for new In(expr, exprList).
-
-
In(Expression, List<? extends Expression>) - Constructor for class io.delta.standalone.expressions.In
-
 
-
IntegerType - Class in io.delta.standalone.types
-
-
The data type representing int values.
-
-
IntegerType() - Constructor for class io.delta.standalone.types.IntegerType
-
 
-
io.delta.standalone - package io.delta.standalone
-
 
-
io.delta.standalone.actions - package io.delta.standalone.actions
-
 
-
io.delta.standalone.data - package io.delta.standalone.data
-
 
-
io.delta.standalone.exceptions - package io.delta.standalone.exceptions
-
 
-
io.delta.standalone.expressions - package io.delta.standalone.expressions
-
 
-
io.delta.standalone.types - package io.delta.standalone.types
-
 
-
io.delta.standalone.util - package io.delta.standalone.util
-
 
-
isBlindAppend(Boolean) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.AddFile
-
 
-
isDataChange() - Method in interface io.delta.standalone.actions.FileAction
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
isExtendedFileMetadata() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
IsNotNull - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is not null for new IsNotNull(expr).
-
-
IsNotNull(Expression) - Constructor for class io.delta.standalone.expressions.IsNotNull
-
 
-
IsNull - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is null for new IsNull(expr).
-
-
IsNull(Expression) - Constructor for class io.delta.standalone.expressions.IsNull
-
 
-
isNullable() - Method in class io.delta.standalone.types.StructField
-
 
-
isNullAt(String) - Method in interface io.delta.standalone.data.RowRecord
-
 
-
isolationLevel(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
isWriteCompatible(StructType) - Method in class io.delta.standalone.types.StructType
-
-
Whether a new schema can replace this existing schema in a Delta table without rewriting data - files in the table.
-
-
- - - -

J

-
-
jobInfo(JobInfo) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
JobInfo - Class in io.delta.standalone.actions
-
-
Represents the Databricks Job information that committed to the Delta table.
-
-
JobInfo(String, String, String, String, String) - Constructor for class io.delta.standalone.actions.JobInfo
-
 
-
JobInfo.Builder - Class in io.delta.standalone.actions
-
-
Builder class for JobInfo.
-
-
jobName(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
jobOwnerId(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
- - - -

L

-
-
LeafExpression - Class in io.delta.standalone.expressions
-
-
An Expression with no children.
-
-
length() - Method in class io.delta.standalone.types.StructType
-
 
-
LessThan - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 < expr2 for new LessThan(expr1, expr2).
-
-
LessThan(Expression, Expression) - Constructor for class io.delta.standalone.expressions.LessThan
-
 
-
LessThanOrEqual - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 <= expr2 for new LessThanOrEqual(expr1, expr2).
-
-
LessThanOrEqual(Expression, Expression) - Constructor for class io.delta.standalone.expressions.LessThanOrEqual
-
 
-
Literal - Class in io.delta.standalone.expressions
-
-
A literal value.
-
-
LongType - Class in io.delta.standalone.types
-
-
The data type representing long values.
-
-
LongType() - Constructor for class io.delta.standalone.types.LongType
-
 
-
- - - -

M

-
-
MapType - Class in io.delta.standalone.types
-
-
The data type for Maps.
-
-
MapType(DataType, DataType, boolean) - Constructor for class io.delta.standalone.types.MapType
-
 
-
markFilesAsRead(Expression) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Mark files matched by the readPredicate as read by this transaction.
-
-
Metadata - Class in io.delta.standalone.actions
-
-
Updates the metadata of the table.
-
-
Metadata(String, String, String, Format, List<String>, Map<String, String>, Optional<Long>, StructType) - Constructor for class io.delta.standalone.actions.Metadata
-
 
-
metadata() - Method in interface io.delta.standalone.OptimisticTransaction
-
 
-
Metadata.Builder - Class in io.delta.standalone.actions
-
-
Builder class for Metadata.
-
-
MetadataChangedException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the metadata of the Delta table has changed between the time of read - and the time of commit.
-
-
MetadataChangedException(String) - Constructor for exception io.delta.standalone.exceptions.MetadataChangedException
-
 
-
Metrics() - Constructor for class io.delta.standalone.Operation.Metrics
-
 
-
- - - -

N

-
-
name(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
name() - Method in class io.delta.standalone.expressions.Column
-
 
-
Not - Class in io.delta.standalone.expressions
-
-
Evaluates logical NOT expr for new Not(expr).
-
-
Not(Expression) - Constructor for class io.delta.standalone.expressions.Not
-
 
-
notebookInfo(NotebookInfo) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
NotebookInfo - Class in io.delta.standalone.actions
-
-
Represents the Databricks Notebook information that committed to the Delta table.
-
-
NotebookInfo(String) - Constructor for class io.delta.standalone.actions.NotebookInfo
-
 
-
nullSafeEval(Object, Object) - Method in class io.delta.standalone.expressions.And
-
 
-
nullSafeEval(Object) - Method in class io.delta.standalone.expressions.Not
-
 
-
nullSafeEval(Object, Object) - Method in class io.delta.standalone.expressions.Or
-
 
-
NullType - Class in io.delta.standalone.types
-
-
The data type representing null values.
-
-
NullType() - Constructor for class io.delta.standalone.types.NullType
-
 
-
numAddedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files added.
-
-
numConvertedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of parquet files that have been converted.
-
-
numCopiedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows copied in the process of deleting files.
-
-
numDeletedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows removed.
-
-
numFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files written.
-
-
numOutputBytes - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Size in bytes of the written contents.
-
-
numOutputRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows written.
-
-
numRemovedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files removed.
-
-
numSourceRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows in the source table.
-
-
numTargetFilesAdded - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number files added to the sink(target).
-
-
numTargetFilesRemoved - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files removed from the sink(target).
-
-
numTargetRowsCopied - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of target rows copied.
-
-
numTargetRowsDeleted - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows deleted in the target table.
-
-
numTargetRowsInserted - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows inserted into the target table.
-
-
numTargetRowsUpdated - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows updated in the target table.
-
-
numUpdatedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows updated.
-
-
- - - -

O

-
-
of(int) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(boolean) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(byte[]) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(Date) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(BigDecimal) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(double) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(float) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(long) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(short) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(String) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(Timestamp) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(byte) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
ofNull(DataType) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
open() - Method in interface io.delta.standalone.Snapshot
-
-
Creates a CloseableIterator which can iterate over data belonging to this snapshot.
-
-
operation(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
Operation - Class in io.delta.standalone
-
-
An operation that can be performed on a Delta table.
-
-
Operation(Operation.Name) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>, Map<String, String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>, Map<String, String>, Optional<String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation.Metrics - Class in io.delta.standalone
-
-
Some possible operation metrics and their suggested corresponding operation types.
-
-
Operation.Name - Enum in io.delta.standalone
-
-
Supported operation types.
-
-
operationMetrics(Map<String, String>) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
operationParameters(Map<String, String>) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
OptimisticTransaction - Interface in io.delta.standalone
-
-
Used to perform a set of reads in a transaction and then commit a set of updates to the - state of the log.
-
-
Or - Class in io.delta.standalone.expressions
-
-
Evaluates logical expr1 OR expr2 for new Or(expr1, expr2).
-
-
Or(Expression, Expression) - Constructor for class io.delta.standalone.expressions.Or
-
 
-
outputTimestampTypeDefault - Static variable in class io.delta.standalone.util.ParquetSchemaConverter
-
 
-
- - - -

P

-
-
ParquetSchemaConverter - Class in io.delta.standalone.util
-
-
:: DeveloperApi ::
-
-
ParquetSchemaConverter.ParquetOutputTimestampType - Enum in io.delta.standalone.util
-
-
:: DeveloperApi ::
-
-
partitionColumns(List<String>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
Predicate - Interface in io.delta.standalone.expressions
-
-
An Expression that defines a relation on inputs.
-
-
Protocol - Class in io.delta.standalone.actions
-
-
Used to block older clients from reading or writing the log when backwards - incompatible changes are made to the protocol.
-
-
Protocol(int, int) - Constructor for class io.delta.standalone.actions.Protocol
-
 
-
ProtocolChangedException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the protocol version has changed between the time of read and the time of commit.
-
-
ProtocolChangedException(String) - Constructor for exception io.delta.standalone.exceptions.ProtocolChangedException
-
 
-
putBoolean(String, boolean) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putBooleanArray(String, Boolean[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putDouble(String, double) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putDoubleArray(String, Double[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putLong(String, long) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putLongArray(String, Long[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putMetadata(String, FieldMetadata) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putMetadataArray(String, FieldMetadata[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putNull(String) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putString(String, String) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putStringArray(String, String[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
- - - -

R

-
-
readVersion(Long) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
readVersion() - Method in interface io.delta.standalone.OptimisticTransaction
-
 
-
readWholeTable() - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Mark the entire table as tainted (i.e.
-
-
references() - Method in class io.delta.standalone.expressions.Column
-
 
-
references() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
references() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
remove() - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(long) - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(boolean) - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(long, boolean) - Method in class io.delta.standalone.actions.AddFile
-
 
-
RemoveFile - Class in io.delta.standalone.actions
-
-
Logical removal of a given file from the reservoir.
-
-
RemoveFile(String, Optional<Long>, boolean, boolean, Map<String, String>, Optional<Long>, Map<String, String>) - Constructor for class io.delta.standalone.actions.RemoveFile
-
-
Deprecated. -
RemoveFile should be created from AddFile.remove() instead.
-
-
-
rewriteTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to rewrite the matched files.
-
-
RowRecord - Interface in io.delta.standalone.data
-
-
Represents one row of data containing a non-empty collection of fieldName - value pairs.
-
-
runId(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
- - - -

S

-
-
scan() - Method in interface io.delta.standalone.Snapshot
-
 
-
scan(Expression) - Method in interface io.delta.standalone.Snapshot
-
 
-
scanTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to scan the files for matches.
-
-
schema(StructType) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
SetTransaction - Class in io.delta.standalone.actions
-
-
Sets the committed version for a given application.
-
-
SetTransaction(String, long, Optional<Long>) - Constructor for class io.delta.standalone.actions.SetTransaction
-
 
-
ShortType - Class in io.delta.standalone.types
-
-
The data type representing short values.
-
-
ShortType() - Constructor for class io.delta.standalone.types.ShortType
-
 
-
snapshot() - Method in interface io.delta.standalone.DeltaLog
-
 
-
Snapshot - Interface in io.delta.standalone
-
-
Snapshot provides APIs to access the Delta table state (such as table metadata, active - files) at some version.
-
-
startTransaction() - Method in interface io.delta.standalone.DeltaLog
-
-
Returns a new OptimisticTransaction that can be used to read the current state of the - log and then commit updates.
-
-
stats(String) - Method in class io.delta.standalone.actions.AddFile.Builder
-
 
-
StringType - Class in io.delta.standalone.types
-
-
The data type representing String values.
-
-
StringType() - Constructor for class io.delta.standalone.types.StringType
-
 
-
StructField - Class in io.delta.standalone.types
-
-
A field inside a StructType.
-
-
StructField(String, DataType) - Constructor for class io.delta.standalone.types.StructField
-
-
Constructor with default nullable = true.
-
-
StructField(String, DataType, boolean) - Constructor for class io.delta.standalone.types.StructField
-
 
-
StructField(String, DataType, boolean, FieldMetadata) - Constructor for class io.delta.standalone.types.StructField
-
 
-
StructType - Class in io.delta.standalone.types
-
-
The data type representing a table's schema, consisting of a collection of - fields (that is, fieldName to dataType pairs).
-
-
StructType() - Constructor for class io.delta.standalone.types.StructType
-
 
-
StructType(StructField[]) - Constructor for class io.delta.standalone.types.StructType
-
 
-
- - - -

T

-
-
tableExists() - Method in interface io.delta.standalone.DeltaLog
-
 
-
tags(Map<String, String>) - Method in class io.delta.standalone.actions.AddFile.Builder
-
 
-
timestamp(Timestamp) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
TimestampType - Class in io.delta.standalone.types
-
-
The data type representing java.sql.Timestamp values.
-
-
TimestampType() - Constructor for class io.delta.standalone.types.TimestampType
-
 
-
toJson() - Method in class io.delta.standalone.types.DataType
-
 
-
toPrettyJson() - Method in class io.delta.standalone.types.DataType
-
 
-
toString() - Method in class io.delta.standalone.expressions.BinaryOperator
-
 
-
toString() - Method in class io.delta.standalone.expressions.Column
-
 
-
toString() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
toString() - Method in class io.delta.standalone.expressions.In
-
 
-
toString() - Method in class io.delta.standalone.expressions.IsNotNull
-
 
-
toString() - Method in class io.delta.standalone.expressions.IsNull
-
 
-
toString() - Method in class io.delta.standalone.expressions.Literal
-
 
-
toString() - Method in class io.delta.standalone.expressions.Not
-
 
-
toString() - Method in enum io.delta.standalone.Operation.Name
-
 
-
toString() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
triggerType(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
True - Static variable in class io.delta.standalone.expressions.Literal
-
 
-
txnVersion(String) - Method in interface io.delta.standalone.OptimisticTransaction
-
 
-
- - - -

U

-
-
UnaryExpression - Class in io.delta.standalone.expressions
-
-
An Expression with one input and one output.
-
-
update() - Method in interface io.delta.standalone.DeltaLog
-
-
Bring DeltaLog's current Snapshot to the latest state if there are any new - transaction logs.
-
-
updateMetadata(Metadata) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Records an update to the metadata that should be committed with this transaction.
-
-
USER_DEFAULT - Static variable in class io.delta.standalone.types.DecimalType
-
 
-
userId(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
userMetadata(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
userName(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
- - - -

V

-
-
value() - Method in class io.delta.standalone.expressions.Literal
-
 
-
valueContainsNull() - Method in class io.delta.standalone.types.MapType
-
 
-
valueOf(String) - Static method in enum io.delta.standalone.Operation.Name
-
-
Returns the enum constant of this type with the specified name.
-
-
valueOf(String) - Static method in enum io.delta.standalone.util.ParquetSchemaConverter.ParquetOutputTimestampType
-
-
Returns the enum constant of this type with the specified name.
-
-
values() - Static method in enum io.delta.standalone.Operation.Name
-
-
Returns an array containing the constants of this enum type, in -the order they are declared.
-
-
values() - Static method in enum io.delta.standalone.util.ParquetSchemaConverter.ParquetOutputTimestampType
-
-
Returns an array containing the constants of this enum type, in -the order they are declared.
-
-
version(Long) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
VersionLog - Class in io.delta.standalone
-
-
VersionLog is the representation of all actions (changes) to the Delta Table - at a specific table version.
-
-
VersionLog(long, List<Action>) - Constructor for class io.delta.standalone.VersionLog
-
 
-
- - - -

W

-
-
writeLegacyParquetFormatDefault - Static variable in class io.delta.standalone.util.ParquetSchemaConverter
-
 
-
-A B C D E F G H I J L M N O P R S T U V W 
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/index.html b/connectors/docs/0.6.0/delta-standalone/api/java/index.html deleted file mode 100644 index 404da2cafec..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - -Delta Standalone 0.6.0 JavaDoc - - - - - - - - - -<noscript> -<div>JavaScript is disabled on your browser.</div> -</noscript> -<h2>Frame Alert</h2> -<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html deleted file mode 100644 index 23a8c2f0357..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/CommitResult.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - -CommitResult (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class CommitResult

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      CommitResult(long version) 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - -
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      longgetVersion() 
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CommitResult

        -
        public CommitResult(long version)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the table version that was committed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html deleted file mode 100644 index 2e382c27f63..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/DeltaLog.html +++ /dev/null @@ -1,542 +0,0 @@ - - - - - -DeltaLog (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface DeltaLog

-
-
-
-
    -
  • -
    -
    -
    public interface DeltaLog
    -
    Represents the transaction logs of a Delta table. It provides APIs to access the states of a - Delta table. -

    - You can use the following code to create a DeltaLog instance. -

    
    -   Configuration conf = ... // Create your own Hadoop Configuration instance
    -   DeltaLog deltaLog = DeltaLog.forTable(conf, "/the/delta/table/path");
    - 
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        snapshot

        -
        Snapshot snapshot()
        -
        -
        Returns:
        -
        the current Snapshot of the Delta table. You may need to call - update() to access the latest snapshot if the current snapshot is stale.
        -
        -
      • -
      - - - -
        -
      • -

        update

        -
        Snapshot update()
        -
        Bring DeltaLog's current Snapshot to the latest state if there are any new - transaction logs.
        -
        -
        Returns:
        -
        the latest snapshot after applying the new transaction logs.
        -
        -
      • -
      - - - -
        -
      • -

        getSnapshotForVersionAsOf

        -
        Snapshot getSnapshotForVersionAsOf(long version)
        -
        Travel back in time to the Snapshot with the provided version number.
        -
        -
        Parameters:
        -
        version - the snapshot version to generate
        -
        Returns:
        -
        the snapshot at the provided version
        -
        Throws:
        -
        IllegalArgumentException - if the version is outside the range of available - versions
        -
        -
      • -
      - - - -
        -
      • -

        getSnapshotForTimestampAsOf

        -
        Snapshot getSnapshotForTimestampAsOf(long timestamp)
        -
        Travel back in time to the latest Snapshot that was generated at or before - timestamp.
        -
        -
        Parameters:
        -
        timestamp - the number of milliseconds since midnight, January 1, 1970 UTC
        -
        Returns:
        -
        the snapshot nearest to, but not after, the provided timestamp
        -
        Throws:
        -
        RuntimeException - if the snapshot is unable to be recreated
        -
        IllegalArgumentException - if the timestamp is before the earliest possible - snapshot or after the latest possible snapshot
        -
        -
      • -
      - - - -
        -
      • -

        startTransaction

        -
        OptimisticTransaction startTransaction()
        -
        Returns a new OptimisticTransaction that can be used to read the current state of the - log and then commit updates. The reads and updates will be checked for logical conflicts - with any concurrent writes to the log. -

        - Note that all reads in a transaction must go through the returned transaction object, and not - directly to the DeltaLog otherwise they will not be checked for conflicts.

        -
        -
        Returns:
        -
        a new OptimisticTransaction.
        -
        -
      • -
      - - - -
        -
      • -

        getCommitInfoAt

        -
        CommitInfo getCommitInfoAt(long version)
        -
        -
        Parameters:
        -
        version - the commit version to retrieve CommitInfo
        -
        Returns:
        -
        the CommitInfo of the commit at the provided version.
        -
        -
      • -
      - - - -
        -
      • -

        getPath

        -
        org.apache.hadoop.fs.Path getPath()
        -
        -
        Returns:
        -
        the path of the Delta table.
        -
        -
      • -
      - - - -
        -
      • -

        getChanges

        -
        java.util.Iterator<VersionLog> getChanges(long startVersion,
        -                                          boolean failOnDataLoss)
        -
        Get all actions starting from startVersion (inclusive) in increasing order of - committed version. -

        - If startVersion doesn't exist, return an empty Iterator.

        -
        -
        Parameters:
        -
        startVersion - the table version to begin retrieving actions from (inclusive)
        -
        failOnDataLoss - whether to throw when data loss detected
        -
        Returns:
        -
        an Iterator of VersionLogs starting from startVersion
        -
        Throws:
        -
        IllegalArgumentException - if startVersion is negative
        -
        IllegalStateException - if data loss detected and failOnDataLoss is true
        -
        -
      • -
      - - - -
        -
      • -

        getVersionBeforeOrAtTimestamp

        -
        long getVersionBeforeOrAtTimestamp(long timestamp)
        -
        Returns the latest version that was committed before or at timestamp. If no version - exists, returns -1. - - Specifically: -
          -
        • if a commit version exactly matches the provided timestamp, we return it
        • -
        • else, we return the latest commit version with a timestamp less than the - provided one
        • -
        • If the provided timestamp is less than the timestamp of any committed version, - we throw an error.
        • -
        .
        -
        -
        Parameters:
        -
        timestamp - the number of milliseconds since midnight, January 1, 1970 UTC
        -
        Returns:
        -
        latest commit that happened before or at timestamp.
        -
        Throws:
        -
        IllegalArgumentException - if the timestamp is less than the timestamp of any committed - version
        -
        -
      • -
      - - - -
        -
      • -

        getVersionAtOrAfterTimestamp

        -
        long getVersionAtOrAfterTimestamp(long timestamp)
        -
        Returns the latest version that was committed at or after timestamp. If no version - exists, returns -1. - - Specifically: -
          -
        • if a commit version exactly matches the provided timestamp, we return it
        • -
        • else, we return the earliest commit version with a timestamp greater than the - provided one
        • -
        • If the provided timestamp is larger than the timestamp of any committed version, - we throw an error.
        • -
        .
        -
        -
        Parameters:
        -
        timestamp - the number of milliseconds since midnight, January 1, 1970 UTC
        -
        Returns:
        -
        latest commit that happened at or before timestamp.
        -
        Throws:
        -
        IllegalArgumentException - if the timestamp is more than the timestamp of any committed - version
        -
        -
      • -
      - - - -
        -
      • -

        tableExists

        -
        boolean tableExists()
        -
        -
        Returns:
        -
        Whether a Delta table exists at this directory.
        -
        -
      • -
      - - - -
        -
      • -

        forTable

        -
        static DeltaLog forTable(org.apache.hadoop.conf.Configuration hadoopConf,
        -                         String path)
        -
        Create a DeltaLog instance representing the table located at the provided - path.
        -
        -
        Parameters:
        -
        hadoopConf - Hadoop Configuration to use when accessing the Delta table
        -
        path - the path to the Delta table
        -
        Returns:
        -
        the DeltaLog for the provided path
        -
        -
      • -
      - - - -
        -
      • -

        forTable

        -
        static DeltaLog forTable(org.apache.hadoop.conf.Configuration hadoopConf,
        -                         org.apache.hadoop.fs.Path path)
        -
        Create a DeltaLog instance representing the table located at the provided - path.
        -
        -
        Parameters:
        -
        hadoopConf - Hadoop Configuration to use when accessing the Delta table
        -
        path - the path to the Delta table
        -
        Returns:
        -
        the DeltaLog for the provided path
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html deleted file mode 100644 index fd90b26bdc0..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/DeltaScan.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - -DeltaScan (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface DeltaScan

-
-
-
-
    -
  • -
    -
    -
    public interface DeltaScan
    -
    Provides access to an iterator over the files in this snapshot. -

    - Typically created with a read predicate Expression to let users filter files. Please note - filtering is only supported on partition columns and users should use - getResidualPredicate() to check for any unapplied portion of the input - predicate.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        getInputPredicate

        -
        java.util.Optional<Expression> getInputPredicate()
        -
        -
        Returns:
        -
        the input predicate passed in by the user
        -
        -
      • -
      - - - -
        -
      • -

        getPushedPredicate

        -
        java.util.Optional<Expression> getPushedPredicate()
        -
        -
        Returns:
        -
        portion of the input predicate that can be evaluated by Delta Standalone using only - metadata (filters on partition columns). Files returned by getFiles() are - guaranteed to satisfy the pushed predicate, and the caller doesn’t need to apply them - again on the returned files.
        -
        -
      • -
      - - - -
        -
      • -

        getResidualPredicate

        -
        java.util.Optional<Expression> getResidualPredicate()
        -
        -
        Returns:
        -
        portion of the input predicate that may not be fully applied. Files returned by - getFiles() are not guaranteed to satisfy the residual predicate, and the - caller should still apply them on the returned files.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html deleted file mode 100644 index 772a1f97e92..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html +++ /dev/null @@ -1,683 +0,0 @@ - - - - - -Operation.Metrics (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class Operation.Metrics

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    Operation
    -
    -
    -
    -
    public static class Operation.Metrics
    -extends Object
    -
    Some possible operation metrics and their suggested corresponding operation types. - These are purely exemplary, and users may use whichever metrics best fit their application.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Field Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Fields 
      Modifier and TypeField and Description
      static StringexecutionTimeMs -
      Time taken to execute the entire operation.
      -
      static StringnumAddedFiles -
      Number of files added.
      -
      static StringnumConvertedFiles -
      Number of parquet files that have been converted.
      -
      static StringnumCopiedRows -
      Number of rows copied in the process of deleting files.
      -
      static StringnumDeletedRows -
      Number of rows removed.
      -
      static StringnumFiles -
      Number of files written.
      -
      static StringnumOutputBytes -
      Size in bytes of the written contents.
      -
      static StringnumOutputRows -
      Number of rows written.
      -
      static StringnumRemovedFiles -
      Number of files removed.
      -
      static StringnumSourceRows -
      Number of rows in the source table.
      -
      static StringnumTargetFilesAdded -
      Number files added to the sink(target).
      -
      static StringnumTargetFilesRemoved -
      Number of files removed from the sink(target).
      -
      static StringnumTargetRowsCopied -
      Number of target rows copied.
      -
      static StringnumTargetRowsDeleted -
      Number of rows deleted in the target table.
      -
      static StringnumTargetRowsInserted -
      Number of rows inserted into the target table.
      -
      static StringnumTargetRowsUpdated -
      Number of rows updated in the target table.
      -
      static StringnumUpdatedRows -
      Number of rows updated.
      -
      static StringrewriteTimeMs -
      Time taken to rewrite the matched files.
      -
      static StringscanTimeMs -
      Time taken to scan the files for matches.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Metrics() 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        numFiles

        -
        public static final String numFiles
        -
        Number of files written. - - Usually used with the WRITE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numOutputBytes

        -
        public static final String numOutputBytes
        -
        Size in bytes of the written contents. - - Usually used with WRITE, STREAMING_UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numOutputRows

        -
        public static final String numOutputRows
        -
        Number of rows written. - - Usually used with WRITE, STREAMING_UPDATE, MERGE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numAddedFiles

        -
        public static final String numAddedFiles
        -
        Number of files added. - - Usually used with STREAMING_UPDATE, DELETE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numRemovedFiles

        -
        public static final String numRemovedFiles
        -
        Number of files removed. - - Usually used with STREAMING_UPDATE, DELETE, DELETE_PARTITIONS, TRUNCATE, - UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numDeletedRows

        -
        public static final String numDeletedRows
        -
        Number of rows removed. - - Usually used with the DELETE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numCopiedRows

        -
        public static final String numCopiedRows
        -
        Number of rows copied in the process of deleting files. - - Usually used with DELETE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        executionTimeMs

        -
        public static final String executionTimeMs
        -
        Time taken to execute the entire operation. - - Usually used with DELETE, DELETE_PARTITIONS, TRUNCATE, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        scanTimeMs

        -
        public static final String scanTimeMs
        -
        Time taken to scan the files for matches. - - Usually used with DELETE, DELETE_PARTITIONS, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        rewriteTimeMs

        -
        public static final String rewriteTimeMs
        -
        Time taken to rewrite the matched files. - - Usually used with DELETE, DELETE_PARTITIONS, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numConvertedFiles

        -
        public static final String numConvertedFiles
        -
        Number of parquet files that have been converted. - - Usually used with the CONVERT operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numSourceRows

        -
        public static final String numSourceRows
        -
        Number of rows in the source table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsInserted

        -
        public static final String numTargetRowsInserted
        -
        Number of rows inserted into the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsUpdated

        -
        public static final String numTargetRowsUpdated
        -
        Number of rows updated in the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsDeleted

        -
        public static final String numTargetRowsDeleted
        -
        Number of rows deleted in the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsCopied

        -
        public static final String numTargetRowsCopied
        -
        Number of target rows copied. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetFilesAdded

        -
        public static final String numTargetFilesAdded
        -
        Number files added to the sink(target). - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetFilesRemoved

        -
        public static final String numTargetFilesRemoved
        -
        Number of files removed from the sink(target). - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numUpdatedRows

        -
        public static final String numUpdatedRows
        -
        Number of rows updated. - - Usually used with the UPDATE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Metrics

        -
        public Metrics()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html deleted file mode 100644 index 40c76a09f83..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Operation.Name.html +++ /dev/null @@ -1,589 +0,0 @@ - - - - - -Operation.Name (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Enum Operation.Name

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable, Comparable<Operation.Name>
    -
    -
    -
    Enclosing class:
    -
    Operation
    -
    -
    -
    -
    public static enum Operation.Name
    -extends Enum<Operation.Name>
    -
    Supported operation types.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Enum Constant Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Enum Constants 
      Enum Constant and Description
      ADD_COLUMNS -
      Recorded when columns are added.
      -
      CHANGE_COLUMN -
      Recorded when columns are changed.
      -
      CONVERT -
      Recorded when converting a table into a Delta table.
      -
      CREATE_TABLE -
      Recorded when the table is created.
      -
      DELETE -
      Recorded while deleting certain partitions.
      -
      MANUAL_UPDATE 
      MERGE -
      Recorded when a merge operation is committed to the table.
      -
      REPLACE_COLUMNS -
      Recorded when columns are replaced.
      -
      REPLACE_TABLE -
      Recorded when the table is replaced.
      -
      SET_TABLE_PROPERTIES -
      Recorded when the table properties are set.
      -
      STREAMING_UPDATE -
      Recorded during streaming inserts.
      -
      TRUNCATE -
      Recorded when truncating the table.
      -
      UNSET_TABLE_PROPERTIES -
      Recorded when the table properties are unset.
      -
      UPDATE -
      Recorded when an update operation is committed to the table.
      -
      UPGRADE_PROTOCOL -
      Recorded when the table protocol is upgraded.
      -
      UPGRADE_SCHEMA -
      Recorded when the table schema is upgraded.
      -
      WRITE -
      Recorded during batch inserts.
      -
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - -
      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      StringtoString() 
      static Operation.NamevalueOf(String name) -
      Returns the enum constant of this type with the specified name.
      -
      static Operation.Name[]values() -
      Returns an array containing the constants of this enum type, in -the order they are declared.
      -
      -
        -
      • - - -

        Methods inherited from class Enum

        -compareTo, equals, getDeclaringClass, hashCode, name, ordinal, valueOf
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -getClass, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Enum Constant Detail

      - - - -
        -
      • -

        WRITE

        -
        public static final Operation.Name WRITE
        -
        Recorded during batch inserts.
        -
      • -
      - - - -
        -
      • -

        STREAMING_UPDATE

        -
        public static final Operation.Name STREAMING_UPDATE
        -
        Recorded during streaming inserts.
        -
      • -
      - - - -
        -
      • -

        DELETE

        -
        public static final Operation.Name DELETE
        -
        Recorded while deleting certain partitions.
        -
      • -
      - - - -
        -
      • -

        TRUNCATE

        -
        public static final Operation.Name TRUNCATE
        -
        Recorded when truncating the table.
        -
      • -
      - - - -
        -
      • -

        CONVERT

        -
        public static final Operation.Name CONVERT
        -
        Recorded when converting a table into a Delta table.
        -
      • -
      - - - -
        -
      • -

        MERGE

        -
        public static final Operation.Name MERGE
        -
        Recorded when a merge operation is committed to the table.
        -
      • -
      - - - -
        -
      • -

        UPDATE

        -
        public static final Operation.Name UPDATE
        -
        Recorded when an update operation is committed to the table.
        -
      • -
      - - - -
        -
      • -

        CREATE_TABLE

        -
        public static final Operation.Name CREATE_TABLE
        -
        Recorded when the table is created.
        -
      • -
      - - - -
        -
      • -

        REPLACE_TABLE

        -
        public static final Operation.Name REPLACE_TABLE
        -
        Recorded when the table is replaced.
        -
      • -
      - - - -
        -
      • -

        SET_TABLE_PROPERTIES

        -
        public static final Operation.Name SET_TABLE_PROPERTIES
        -
        Recorded when the table properties are set.
        -
      • -
      - - - -
        -
      • -

        UNSET_TABLE_PROPERTIES

        -
        public static final Operation.Name UNSET_TABLE_PROPERTIES
        -
        Recorded when the table properties are unset.
        -
      • -
      - - - -
        -
      • -

        ADD_COLUMNS

        -
        public static final Operation.Name ADD_COLUMNS
        -
        Recorded when columns are added.
        -
      • -
      - - - -
        -
      • -

        CHANGE_COLUMN

        -
        public static final Operation.Name CHANGE_COLUMN
        -
        Recorded when columns are changed.
        -
      • -
      - - - -
        -
      • -

        REPLACE_COLUMNS

        -
        public static final Operation.Name REPLACE_COLUMNS
        -
        Recorded when columns are replaced.
        -
      • -
      - - - -
        -
      • -

        UPGRADE_PROTOCOL

        -
        public static final Operation.Name UPGRADE_PROTOCOL
        -
        Recorded when the table protocol is upgraded.
        -
      • -
      - - - -
        -
      • -

        UPGRADE_SCHEMA

        -
        public static final Operation.Name UPGRADE_SCHEMA
        -
        Recorded when the table schema is upgraded.
        -
      • -
      - - - -
        -
      • -

        MANUAL_UPDATE

        -
        public static final Operation.Name MANUAL_UPDATE
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        values

        -
        public static Operation.Name[] values()
        -
        Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
        -for (Operation.Name c : Operation.Name.values())
        -    System.out.println(c);
        -
        -
        -
        Returns:
        -
        an array containing the constants of this enum type, in the order they are declared
        -
        -
      • -
      - - - -
        -
      • -

        valueOf

        -
        public static Operation.Name valueOf(String name)
        -
        Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.)
        -
        -
        Parameters:
        -
        name - the name of the enum constant to be returned.
        -
        Returns:
        -
        the enum constant with the specified name
        -
        Throws:
        -
        IllegalArgumentException - if this enum type has no constant with the specified name
        -
        NullPointerException - if the argument is null
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Overrides:
        -
        toString in class Enum<Operation.Name>
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Operation.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Operation.html deleted file mode 100644 index 6bbc2c00f06..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Operation.html +++ /dev/null @@ -1,442 +0,0 @@ - - - - - -Operation (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class Operation

-
-
- -
-
    -
  • -
    -
    -
    public final class Operation
    -extends Object
    -
    An operation that can be performed on a Delta table. -

    - An operation is tracked as the first line in delta logs, and powers DESCRIBE HISTORY for - Delta tables. -

    - Operations must be constructed using one of the Operation.Name types below. - As well, optional Operation.Metrics values are given below.

    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class Operation.Metrics -
      Some possible operation metrics and their suggested corresponding operation types.
      -
      static class Operation.Name -
      Supported operation types.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      Operation(Operation.Name name) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters, - java.util.Map<String,String> metrics) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters, - java.util.Map<String,String> metrics, - java.util.Optional<String> userMetadata) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - - - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        -
      • -
      - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters,
        -                 @Nullable
        -                 java.util.Map<String,String> metrics)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        metrics - Any relevant operation metrics. See Operation.Metrics for suggested keys.
        -
        -
      • -
      - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters,
        -                 @Nullable
        -                 java.util.Map<String,String> metrics,
        -                 @Nonnull
        -                 java.util.Optional<String> userMetadata)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        metrics - Any relevant operation metrics. See Operation.Metrics for suggested keys.
        -
        userMetadata - Optional additional user metadata.
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getName

        -
        @Nonnull
        -public Operation.Name getName()
        -
        -
        Returns:
        -
        operation name
        -
        -
      • -
      - - - -
        -
      • -

        getParameters

        -
        @Nullable
        -public java.util.Map<String,String> getParameters()
        -
        -
        Returns:
        -
        operation parameters
        -
        -
      • -
      - - - -
        -
      • -

        getMetrics

        -
        @Nullable
        -public java.util.Map<String,String> getMetrics()
        -
        -
        Returns:
        -
        operation metrics
        -
        -
      • -
      - - - -
        -
      • -

        getUserMetadata

        -
        @Nonnull
        -public java.util.Optional<String> getUserMetadata()
        -
        -
        Returns:
        -
        user metadata for this operation
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html deleted file mode 100644 index b5522fd3a6f..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html +++ /dev/null @@ -1,405 +0,0 @@ - - - - - -OptimisticTransaction (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface OptimisticTransaction

-
-
-
-
    -
  • -
    -
    -
    public interface OptimisticTransaction
    -
    Used to perform a set of reads in a transaction and then commit a set of updates to the - state of the log. All reads from the DeltaLog MUST go through this instance rather - than directly to the DeltaLog otherwise they will not be checked for logical conflicts - with concurrent updates. -

    - This class is not thread-safe.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        commit

        -
        <T extends ActionCommitResult commit(Iterable<T> actions,
        -                                       Operation op,
        -                                       String engineInfo)
        -
        Modifies the state of the log by adding a new commit that is based on a read at the table's - latest version as of this transaction's instantiation. In the case of a conflict with a - concurrent writer this method will throw an exception. -

        - Note: any AddFile with an absolute path within the table - path will be updated to have a relative path (based off of the table path). Because of this, - be sure to generate all RemoveFiles using - AddFiles read from the Delta Log (do not use the - AddFiles created pre-commit.)

        -
        -
        Type Parameters:
        -
        T - A derived class of Action. This allows, for example, both a - List<Action> and a List<AddFile> to be accepted.
        -
        Parameters:
        -
        actions - Set of actions to commit.
        -
        op - Details of operation that is performing this transactional commit.
        -
        engineInfo - String used to identify the writer engine. It should resemble - "{engineName}/{engineVersion}", with dashes in place of whitespace. - For example, "Flink-Connector/1.1.0".
        -
        Returns:
        -
        a CommitResult, wrapping the table version that was committed.
        -
        -
      • -
      - - - -
        -
      • -

        markFilesAsRead

        -
        DeltaScan markFilesAsRead(Expression readPredicate)
        -
        Mark files matched by the readPredicate as read by this transaction. -

        - Please note filtering is only supported on partition columns, thus the files matched - may be a superset of the files in the Delta table that satisfy readPredicate. Users - should use DeltaScan.getResidualPredicate() to check for any unapplied portion of the - input predicate. -

        - Internally, readPredicate and the matched readFiles will be used to determine - if logical conflicts between this transaction and previously-committed transactions can be - resolved (i.e. no error thrown). -

        - For example: -

          -
        • This transaction TXN1 reads partition 'date=2021-09-08' to perform an UPDATE and tries - to commit at the next table version N.
        • -
        • After TXN1 starts, another transaction TXN2 reads partition 'date=2021-09-07' and - commits first at table version N (with no other metadata changes).
        • -
        • TXN1 sees that another commit won, and needs to know whether to commit at version N+1 - or fail. Using the readPredicates and resultant readFiles, TXN1 can see - that none of its read files were changed by TXN2. Thus there are no logical conflicts and - TXN1 can commit at table version N+1.
        • -
        -
        -
        Parameters:
        -
        readPredicate - Predicate used to determine which files were read.
        -
        Returns:
        -
        a DeltaScan containing the list of files matching the pushed portion of the - readPredicate.
        -
        -
      • -
      - - - -
        -
      • -

        updateMetadata

        -
        void updateMetadata(Metadata metadata)
        -
        Records an update to the metadata that should be committed with this transaction. - -

        - Use Metadata.copyBuilder() to build a new Metadata instance based on the - current table metadata. For example: - -

        
        - Metadata newMetadata = optimisticTransaction.metadata().copyBuilder()
        -     .schema(newSchema)
        -     .build();
        - optimisticTransaction.updateMetadata(newMetadata);
        - 
        - -

        - IMPORTANT: It is the responsibility of the caller to ensure that files currently - present in the table are still valid under the new metadata.

        -
        -
        Parameters:
        -
        metadata - The new metadata for the delta table.
        -
        -
      • -
      - - - -
        -
      • -

        readWholeTable

        -
        void readWholeTable()
        -
        Mark the entire table as tainted (i.e. read) by this transaction.
        -
      • -
      - - - -
        -
      • -

        txnVersion

        -
        long txnVersion(String id)
        -
        -
        Parameters:
        -
        id - transaction id
        -
        Returns:
        -
        the latest version that has committed for the idempotent transaction with given - id.
        -
        -
      • -
      - - - -
        -
      • -

        metadata

        -
        Metadata metadata()
        -
        -
        Returns:
        -
        the metadata for this transaction. The metadata refers to the metadata of the table's - latest version as of this transaction's instantiation unless updated during the - transaction.
        -
        -
      • -
      - - - -
        -
      • -

        readVersion

        -
        long readVersion()
        -
        -
        Returns:
        -
        The table version that this transaction is reading from.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html deleted file mode 100644 index e05e4af5b2b..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/Snapshot.html +++ /dev/null @@ -1,320 +0,0 @@ - - - - - -Snapshot (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface Snapshot

-
-
-
-
    -
  • -
    -
    -
    public interface Snapshot
    -
    Snapshot provides APIs to access the Delta table state (such as table metadata, active - files) at some version. -

    - See Delta Transaction Log Protocol - for more details about the transaction logs.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        scan

        -
        DeltaScan scan(Expression predicate)
        -
        -
        Parameters:
        -
        predicate - the predicate to be used to filter the files in this snapshot.
        -
        Returns:
        -
        a DeltaScan of the files in this snapshot matching the pushed portion of - predicate
        -
        -
      • -
      - - - -
        -
      • -

        getAllFiles

        -
        java.util.List<AddFile> getAllFiles()
        -
        -
        Returns:
        -
        all of the files present in this snapshot
        -
        -
      • -
      - - - -
        -
      • -

        getMetadata

        -
        Metadata getMetadata()
        -
        -
        Returns:
        -
        the table metadata for this snapshot
        -
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        long getVersion()
        -
        -
        Returns:
        -
        the version for this snapshot
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html deleted file mode 100644 index cb7c38cbfe2..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/VersionLog.html +++ /dev/null @@ -1,315 +0,0 @@ - - - - - -VersionLog (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class VersionLog

-
-
- -
-
    -
  • -
    -
    -
    public class VersionLog
    -extends Object
    -
    VersionLog is the representation of all actions (changes) to the Delta Table - at a specific table version.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      VersionLog(long version, - java.util.List<Action> actions) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        VersionLog

        -
        public VersionLog(long version,
        -                  @Nonnull
        -                  java.util.List<Action> actions)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the table version at which these actions occurred
        -
        -
      • -
      - - - -
        -
      • -

        getActions

        -
        @Nonnull
        -public java.util.List<Action> getActions()
        -
        -
        Returns:
        -
        an unmodifiable List of the actions for this table version
        -
        -
      • -
      - - - -
        -
      • -

        getActionsIterator

        -
        @Nonnull
        -public io.delta.storage.CloseableIterator<Action> getActionsIterator()
        -
        -
        Returns:
        -
        an CloseableIterator of the actions for this table version. This method is - preferred for memory efficient iteration through the action list.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html deleted file mode 100644 index d522999e987..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Action.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - -Action (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Interface Action

-
-
-
-
    -
  • -
    -
    All Known Subinterfaces:
    -
    FileAction
    -
    -
    -
    All Known Implementing Classes:
    -
    AddCDCFile, AddFile, CommitInfo, Metadata, Protocol, RemoveFile, SetTransaction
    -
    -
    -
    -
    public interface Action
    -
    A marker interface for all actions that can be applied to a Delta table. - Each action represents a single change to the state of a Delta table. -

    - You can use the following code to extract the concrete type of an Action. -

    
    -   List<Action> actions = ...
    -   actions.forEach(x -> {
    -       if (x instanceof AddFile) {
    -          AddFile addFile = (AddFile) x;
    -          ...
    -       } else if (x instanceof AddCDCFile) {
    -          AddCDCFile addCDCFile = (AddCDCFile)x;
    -          ...
    -       } else if ...
    -   });
    - 
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html deleted file mode 100644 index 22b4d8ea678..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html +++ /dev/null @@ -1,371 +0,0 @@ - - - - - -AddCDCFile (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddCDCFile

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action, FileAction
    -
    -
    -
    -
    public final class AddCDCFile
    -extends Object
    -implements FileAction
    -
    A change file containing CDC data for the Delta version it's within. Non-CDC readers should - ignore this, CDC readers should scan all ChangeFiles in a version rather than computing - changes from AddFile and RemoveFile actions.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      AddCDCFile(String path, - java.util.Map<String,String> partitionValues, - long size, - java.util.Map<String,String> tags) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AddCDCFile

        -
        public AddCDCFile(@Nonnull
        -                  String path,
        -                  @Nonnull
        -                  java.util.Map<String,String> partitionValues,
        -                  long size,
        -                  @Nullable
        -                  java.util.Map<String,String> tags)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        @Nonnull
        -public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be added to the table. If it's a - relative path, it's relative to the root of the table. Note: the path is encoded and - should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nonnull
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public long getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being added or removed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html deleted file mode 100644 index 9addaa2f37a..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html +++ /dev/null @@ -1,317 +0,0 @@ - - - - - -AddFile.Builder (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddFile.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    AddFile
    -
    -
    -
    -
    public static final class AddFile.Builder
    -extends Object
    -
    Builder class for AddFile. Enables construction of AddFiles with default - values.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Builder(String path, - java.util.Map<String,String> partitionValues, - long size, - long modificationTime, - boolean dataChange) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder(String path,
        -               java.util.Map<String,String> partitionValues,
        -               long size,
        -               long modificationTime,
        -               boolean dataChange)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        tags

        -
        public AddFile.Builder tags(java.util.Map<String,String> tags)
        -
      • -
      - - - -
        -
      • -

        build

        -
        public AddFile build()
        -
        Builds an AddFile using the provided parameters. If a parameter is not provided - its default values is used.
        -
        -
        Returns:
        -
        a new AddFile with the properties added to the builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html deleted file mode 100644 index 4bae13156fb..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html +++ /dev/null @@ -1,581 +0,0 @@ - - - - - -AddFile (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddFile

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action, FileAction
    -
    -
    -
    -
    public final class AddFile
    -extends Object
    -implements FileAction
    -
    Represents an action that adds a new file to the table. The path of a file acts as the primary - key for the entry in the set of files. -

    - Note: since actions within a given Delta file are not guaranteed to be applied in order, it is - not valid for multiple file operations with the same path to exist in a single version.

    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Add File and Remove File
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class AddFile.Builder -
      Builder class for AddFile.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      AddFile(String path, - java.util.Map<String,String> partitionValues, - long size, - long modificationTime, - boolean dataChange, - String stats, - java.util.Map<String,String> tags) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AddFile

        -
        public AddFile(@Nonnull
        -               String path,
        -               @Nonnull
        -               java.util.Map<String,String> partitionValues,
        -               long size,
        -               long modificationTime,
        -               boolean dataChange,
        -               @Nullable
        -               String stats,
        -               @Nullable
        -               java.util.Map<String,String> tags)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove()
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with - deletionTimestamp = System.currentTimeMillis()
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(long deletionTimestamp)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - deletionTimestamp
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(boolean dataChange)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - dataChange flag
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(long deletionTimestamp,
        -                                  boolean dataChange)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - deletionTimestamp value and dataChange flag
        -
        -
      • -
      - - - -
        -
      • -

        getPath

        -
        @Nonnull
        -public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be added to the table. If it's a - relative path, it's relative to the root of the table. Note: the path is encoded and - should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nonnull
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public long getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getModificationTime

        -
        public long getModificationTime()
        -
        -
        Returns:
        -
        the time that this file was last modified or created, as - milliseconds since the epoch
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being created. When - false the file must already be present in the table or the records in the - added file must be contained in one or more remove actions in the same version
        -
        -
      • -
      - - - -
        -
      • -

        getStats

        -
        @Nullable
        -public String getStats()
        -
        -
        Returns:
        -
        statistics (for example: count, min/max values for columns) - about the data in this file as serialized JSON
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - -
        -
      • -

        builder

        -
        public static AddFile.Builder builder(String path,
        -                                      java.util.Map<String,String> partitionValues,
        -                                      long size,
        -                                      long modificationTime,
        -                                      boolean dataChange)
        -
        -
        Returns:
        -
        a new AddFile.Builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html deleted file mode 100644 index fcbafc8d446..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html +++ /dev/null @@ -1,481 +0,0 @@ - - - - - -CommitInfo.Builder (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class CommitInfo.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    CommitInfo
    -
    -
    -
    -
    public static final class CommitInfo.Builder
    -extends Object
    -
    Builder class for CommitInfo. Enables construction of CommitInfos with - default values.
    -
  • -
-
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html deleted file mode 100644 index 937dcada860..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html +++ /dev/null @@ -1,706 +0,0 @@ - - - - - -CommitInfo (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class CommitInfo

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public class CommitInfo
    -extends Object
    -implements Action
    -
    Holds provenance information about changes to the table. This CommitInfo - is not stored in the checkpoint and has reduced compatibility guarantees. - Information stored in it is best effort (i.e. can be falsified by a writer).
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Commit Provenance Information
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class CommitInfo.Builder -
      Builder class for CommitInfo.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      CommitInfo(java.util.Optional<Long> version, - java.sql.Timestamp timestamp, - java.util.Optional<String> userId, - java.util.Optional<String> userName, - String operation, - java.util.Map<String,String> operationParameters, - java.util.Optional<JobInfo> jobInfo, - java.util.Optional<NotebookInfo> notebookInfo, - java.util.Optional<String> clusterId, - java.util.Optional<Long> readVersion, - java.util.Optional<String> isolationLevel, - java.util.Optional<Boolean> isBlindAppend, - java.util.Optional<java.util.Map<String,String>> operationMetrics, - java.util.Optional<String> userMetadata) 
      CommitInfo(java.util.Optional<Long> version, - java.sql.Timestamp timestamp, - java.util.Optional<String> userId, - java.util.Optional<String> userName, - String operation, - java.util.Map<String,String> operationParameters, - java.util.Optional<JobInfo> jobInfo, - java.util.Optional<NotebookInfo> notebookInfo, - java.util.Optional<String> clusterId, - java.util.Optional<Long> readVersion, - java.util.Optional<String> isolationLevel, - java.util.Optional<Boolean> isBlindAppend, - java.util.Optional<java.util.Map<String,String>> operationMetrics, - java.util.Optional<String> userMetadata, - java.util.Optional<String> engineInfo) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CommitInfo

        -
        public CommitInfo(@Nonnull
        -                  java.util.Optional<Long> version,
        -                  @Nullable
        -                  java.sql.Timestamp timestamp,
        -                  @Nonnull
        -                  java.util.Optional<String> userId,
        -                  @Nonnull
        -                  java.util.Optional<String> userName,
        -                  @Nullable
        -                  String operation,
        -                  @Nullable
        -                  java.util.Map<String,String> operationParameters,
        -                  @Nonnull
        -                  java.util.Optional<JobInfo> jobInfo,
        -                  @Nonnull
        -                  java.util.Optional<NotebookInfo> notebookInfo,
        -                  @Nonnull
        -                  java.util.Optional<String> clusterId,
        -                  @Nonnull
        -                  java.util.Optional<Long> readVersion,
        -                  @Nonnull
        -                  java.util.Optional<String> isolationLevel,
        -                  @Nonnull
        -                  java.util.Optional<Boolean> isBlindAppend,
        -                  @Nonnull
        -                  java.util.Optional<java.util.Map<String,String>> operationMetrics,
        -                  @Nonnull
        -                  java.util.Optional<String> userMetadata)
        -
      • -
      - - - -
        -
      • -

        CommitInfo

        -
        public CommitInfo(@Nonnull
        -                  java.util.Optional<Long> version,
        -                  @Nullable
        -                  java.sql.Timestamp timestamp,
        -                  @Nonnull
        -                  java.util.Optional<String> userId,
        -                  @Nonnull
        -                  java.util.Optional<String> userName,
        -                  @Nullable
        -                  String operation,
        -                  @Nullable
        -                  java.util.Map<String,String> operationParameters,
        -                  @Nonnull
        -                  java.util.Optional<JobInfo> jobInfo,
        -                  @Nonnull
        -                  java.util.Optional<NotebookInfo> notebookInfo,
        -                  @Nonnull
        -                  java.util.Optional<String> clusterId,
        -                  @Nonnull
        -                  java.util.Optional<Long> readVersion,
        -                  @Nonnull
        -                  java.util.Optional<String> isolationLevel,
        -                  @Nonnull
        -                  java.util.Optional<Boolean> isBlindAppend,
        -                  @Nonnull
        -                  java.util.Optional<java.util.Map<String,String>> operationMetrics,
        -                  @Nonnull
        -                  java.util.Optional<String> userMetadata,
        -                  @Nonnull
        -                  java.util.Optional<String> engineInfo)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        @Nonnull
        -public java.util.Optional<Long> getVersion()
        -
        -
        Returns:
        -
        the log version for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getTimestamp

        -
        @Nullable
        -public java.sql.Timestamp getTimestamp()
        -
        -
        Returns:
        -
        the time the files in this commit were committed
        -
        -
      • -
      - - - -
        -
      • -

        getUserId

        -
        @Nonnull
        -public java.util.Optional<String> getUserId()
        -
        -
        Returns:
        -
        the userId of the user who committed this file
        -
        -
      • -
      - - - -
        -
      • -

        getUserName

        -
        @Nonnull
        -public java.util.Optional<String> getUserName()
        -
        -
        Returns:
        -
        the userName of the user who committed this file
        -
        -
      • -
      - - - -
        -
      • -

        getOperation

        -
        @Nullable
        -public String getOperation()
        -
        -
        Returns:
        -
        the type of operation for this commit. e.g. "WRITE"
        -
        -
      • -
      - - - -
        -
      • -

        getOperationParameters

        -
        @Nullable
        -public java.util.Map<String,String> getOperationParameters()
        -
        -
        Returns:
        -
        any relevant operation parameters. e.g. "mode", "partitionBy"
        -
        -
      • -
      - - - -
        -
      • -

        getJobInfo

        -
        @Nonnull
        -public java.util.Optional<JobInfo> getJobInfo()
        -
        -
        Returns:
        -
        the JobInfo for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getNotebookInfo

        -
        @Nonnull
        -public java.util.Optional<NotebookInfo> getNotebookInfo()
        -
        -
        Returns:
        -
        the NotebookInfo for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getClusterId

        -
        @Nonnull
        -public java.util.Optional<String> getClusterId()
        -
        -
        Returns:
        -
        the ID of the cluster used to generate this commit
        -
        -
      • -
      - - - -
        -
      • -

        getReadVersion

        -
        @Nonnull
        -public java.util.Optional<Long> getReadVersion()
        -
        -
        Returns:
        -
        the version that the transaction used to generate this commit is reading from
        -
        -
      • -
      - - - -
        -
      • -

        getIsolationLevel

        -
        @Nonnull
        -public java.util.Optional<String> getIsolationLevel()
        -
        -
        Returns:
        -
        the isolation level at which this commit was generated
        -
        -
      • -
      - - - -
        -
      • -

        getIsBlindAppend

        -
        @Nonnull
        -public java.util.Optional<Boolean> getIsBlindAppend()
        -
        -
        Returns:
        -
        whether this commit has blindly appended without caring about existing files
        -
        -
      • -
      - - - -
        -
      • -

        getOperationMetrics

        -
        @Nonnull
        -public java.util.Optional<java.util.Map<String,String>> getOperationMetrics()
        -
        -
        Returns:
        -
        any operation metrics calculated
        -
        -
      • -
      - - - -
        -
      • -

        getUserMetadata

        -
        @Nonnull
        -public java.util.Optional<String> getUserMetadata()
        -
        -
        Returns:
        -
        any additional user metadata
        -
        -
      • -
      - - - -
        -
      • -

        getEngineInfo

        -
        @Nonnull
        -public java.util.Optional<String> getEngineInfo()
        -
        -
        Returns:
        -
        the engineInfo of the engine that performed this commit. It should be of the form - "{engineName}/{engineVersion} Delta-Standalone/{deltaStandaloneVersion}"
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html deleted file mode 100644 index 9ccdfb1e037..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - -FileAction (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Interface FileAction

-
-
-
-
    -
  • -
    -
    All Superinterfaces:
    -
    Action
    -
    -
    -
    All Known Implementing Classes:
    -
    AddCDCFile, AddFile, RemoveFile
    -
    -
    -
    -
    public interface FileAction
    -extends Action
    -
    Generic interface for Actions pertaining to the addition and removal of files.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        String getPath()
        -
        -
        Returns:
        -
        the relative path or the absolute path of the file being added or removed by this - action. If it's a relative path, it's relative to the root of the table. Note: the path - is encoded and should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        boolean isDataChange()
        -
        -
        Returns:
        -
        whether any data was changed as a result of this file being added or removed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html deleted file mode 100644 index 325015096a2..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Format.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - -Format (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Format

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      Format() 
      Format(String provider, - java.util.Map<String,String> options) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Format

        -
        public Format(String provider,
        -              java.util.Map<String,String> options)
        -
      • -
      - - - -
        -
      • -

        Format

        -
        public Format()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getProvider

        -
        public String getProvider()
        -
        -
        Returns:
        -
        the name of the encoding for files in this table
        -
        -
      • -
      - - - -
        -
      • -

        getOptions

        -
        public java.util.Map<String,String> getOptions()
        -
        -
        Returns:
        -
        an unmodifiable Map containing configuration options for - the format
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html deleted file mode 100644 index e4439d6fd46..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - -JobInfo.Builder (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class JobInfo.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    JobInfo
    -
    -
    -
    -
    public static class JobInfo.Builder
    -extends Object
    -
    Builder class for JobInfo. Enables construction of JobInfos with default - values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder(String jobId)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - - - - - -
        -
      • -

        jobOwnerId

        -
        public JobInfo.Builder jobOwnerId(String jobOwnerId)
        -
      • -
      - - - -
        -
      • -

        triggerType

        -
        public JobInfo.Builder triggerType(String triggerType)
        -
      • -
      - - - -
        -
      • -

        build

        -
        public JobInfo build()
        -
        Builds a JobInfo using the provided parameters. If a parameter is not provided - its default values is used.
        -
        -
        Returns:
        -
        a new JobInfo with the properties added to the builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html deleted file mode 100644 index 5b8235bc7e2..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html +++ /dev/null @@ -1,402 +0,0 @@ - - - - - -JobInfo (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class JobInfo

-
-
- -
-
    -
  • -
    -
    -
    public class JobInfo
    -extends Object
    -
    Represents the Databricks Job information that committed to the Delta table.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        JobInfo

        -
        public JobInfo(String jobId,
        -               String jobName,
        -               String runId,
        -               String jobOwnerId,
        -               String triggerType)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getJobId

        -
        public String getJobId()
        -
      • -
      - - - -
        -
      • -

        getJobName

        -
        public String getJobName()
        -
      • -
      - - - -
        -
      • -

        getRunId

        -
        public String getRunId()
        -
      • -
      - - - -
        -
      • -

        getJobOwnerId

        -
        public String getJobOwnerId()
        -
      • -
      - - - -
        -
      • -

        getTriggerType

        -
        public String getTriggerType()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html deleted file mode 100644 index 23ffbf7b208..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html +++ /dev/null @@ -1,408 +0,0 @@ - - - - - -Metadata.Builder (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Metadata.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    Metadata
    -
    -
    -
    -
    public static final class Metadata.Builder
    -extends Object
    -
    Builder class for Metadata. Enables construction of Metadatas with default - values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder()
        -
      • -
      -
    • -
    - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html deleted file mode 100644 index 198d944828b..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html +++ /dev/null @@ -1,530 +0,0 @@ - - - - - -Metadata (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Metadata

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public final class Metadata
    -extends Object
    -implements Action
    -
    Updates the metadata of the table. The first version of a table must contain - a Metadata action. Subsequent Metadata actions completely - overwrite the current metadata of the table. It is the responsibility of the - writer to ensure that any data already present in the table is still valid - after any change. There can be at most one Metadata action in a - given version of the table.
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Change Metadata
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Metadata

        -
        public Metadata(@Nonnull
        -                String id,
        -                @Nullable
        -                String name,
        -                @Nullable
        -                String description,
        -                @Nonnull
        -                Format format,
        -                @Nonnull
        -                java.util.List<String> partitionColumns,
        -                @Nonnull
        -                java.util.Map<String,String> configuration,
        -                @Nonnull
        -                java.util.Optional<Long> createdTime,
        -                @Nullable
        -                StructType schema)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getId

        -
        @Nonnull
        -public String getId()
        -
        -
        Returns:
        -
        the unique identifier for this table
        -
        -
      • -
      - - - -
        -
      • -

        getName

        -
        @Nullable
        -public String getName()
        -
        -
        Returns:
        -
        the user-provided identifier for this table
        -
        -
      • -
      - - - -
        -
      • -

        getDescription

        -
        @Nullable
        -public String getDescription()
        -
        -
        Returns:
        -
        the user-provided description for this table
        -
        -
      • -
      - - - -
        -
      • -

        getFormat

        -
        @Nonnull
        -public Format getFormat()
        -
        -
        Returns:
        -
        the Format for this table
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionColumns

        -
        @Nonnull
        -public java.util.List<String> getPartitionColumns()
        -
        -
        Returns:
        -
        an unmodifiable java.util.List containing the names of - columns by which the data should be partitioned
        -
        -
      • -
      - - - -
        -
      • -

        getConfiguration

        -
        @Nonnull
        -public java.util.Map<String,String> getConfiguration()
        -
        -
        Returns:
        -
        an unmodifiable java.util.Map containing configuration - options for this metadata
        -
        -
      • -
      - - - -
        -
      • -

        getCreatedTime

        -
        @Nonnull
        -public java.util.Optional<Long> getCreatedTime()
        -
        -
        Returns:
        -
        the time when this metadata action was created, in milliseconds - since the Unix epoch
        -
        -
      • -
      - - - -
        -
      • -

        getSchema

        -
        @Nullable
        -public StructType getSchema()
        -
        -
        Returns:
        -
        the schema of the table as a StructType
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html deleted file mode 100644 index acf02964307..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - -NotebookInfo (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class NotebookInfo

-
-
- -
-
    -
  • -
    -
    -
    public class NotebookInfo
    -extends Object
    -
    Represents the Databricks Notebook information that committed to the Delta table.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      NotebookInfo(String notebookId) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        NotebookInfo

        -
        public NotebookInfo(String notebookId)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getNotebookId

        -
        public String getNotebookId()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html deleted file mode 100644 index 5a3497503e7..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html +++ /dev/null @@ -1,345 +0,0 @@ - - - - - -Protocol (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Protocol

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public final class Protocol
    -extends Object
    -implements Action
    -
    Used to block older clients from reading or writing the log when backwards - incompatible changes are made to the protocol. Readers and writers are - responsible for checking that they meet the minimum versions before performing - any other operations. -

    - Since this action allows us to explicitly block older clients in the case of a - breaking change to the protocol, clients should be tolerant of messages and - fields that they do not understand.

    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Protocol Evolution
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Protocol(int minReaderVersion, - int minWriterVersion) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Protocol

        -
        public Protocol(int minReaderVersion,
        -                int minWriterVersion)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getMinReaderVersion

        -
        public int getMinReaderVersion()
        -
        -
        Returns:
        -
        the minimum version of the Delta read protocol that a client must implement in order - to correctly read this table
        -
        -
      • -
      - - - -
        -
      • -

        getMinWriterVersion

        -
        public int getMinWriterVersion()
        -
        -
        Returns:
        -
        the minimum version of the Delta write protocol that a client must implement in order - to correctly write this table
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html deleted file mode 100644 index 0c2da044a82..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html +++ /dev/null @@ -1,471 +0,0 @@ - - - - - -RemoveFile (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class RemoveFile

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      RemoveFile(String path, - java.util.Optional<Long> deletionTimestamp, - boolean dataChange, - boolean extendedFileMetadata, - java.util.Map<String,String> partitionValues, - java.util.Optional<Long> size, - java.util.Map<String,String> tags) -
      Deprecated.  -
      RemoveFile should be created from AddFile.remove() instead.
      -
      -
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        RemoveFile

        -
        @Deprecated
        -public RemoveFile(@Nonnull
        -                              String path,
        -                              @Nonnull
        -                              java.util.Optional<Long> deletionTimestamp,
        -                              boolean dataChange,
        -                              boolean extendedFileMetadata,
        -                              @Nullable
        -                              java.util.Map<String,String> partitionValues,
        -                              @Nonnull
        -                              java.util.Optional<Long> size,
        -                              @Nullable
        -                              java.util.Map<String,String> tags)
        -
        Deprecated. RemoveFile should be created from AddFile.remove() instead.
        -
        Users should not construct RemoveFiles themselves, and should instead use one - of the various AddFile.remove() methods to instantiate the correct RemoveFile - for a given AddFile instance.
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be removed from the table. If it's - a relative path, it's relative to the root of the table. Note: the path is encoded - and should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getDeletionTimestamp

        -
        public java.util.Optional<Long> getDeletionTimestamp()
        -
        -
        Returns:
        -
        the time that this file was deleted as milliseconds since the epoch
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being removed. When - false the records in the removed file must be contained in one or more add - actions in the same version
        -
        -
      • -
      - - - -
        -
      • -

        isExtendedFileMetadata

        -
        public boolean isExtendedFileMetadata()
        -
        -
        Returns:
        -
        true if the fields partitionValues, size, and tags are - present
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nullable
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public java.util.Optional<Long> getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html deleted file mode 100644 index 255b82e4f0c..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - -SetTransaction (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class SetTransaction

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      SetTransaction(String appId, - long version, - java.util.Optional<Long> lastUpdated) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        SetTransaction

        -
        public SetTransaction(@Nonnull
        -                      String appId,
        -                      long version,
        -                      @Nonnull
        -                      java.util.Optional<Long> lastUpdated)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getAppId

        -
        @Nonnull
        -public String getAppId()
        -
        -
        Returns:
        -
        the unique identifier for the application performing the transaction
        -
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the application-specific numeric identifier for this transaction
        -
        -
      • -
      - - - -
        -
      • -

        getLastUpdated

        -
        @Nonnull
        -public java.util.Optional<Long> getLastUpdated()
        -
        -
        Returns:
        -
        the time when this transaction action was created, in milliseconds since the Unix - epoch
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html deleted file mode 100644 index f62d1161a0a..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -io.delta.standalone.actions (Delta Standalone 0.6.0 JavaDoc) - - - - - -

io.delta.standalone.actions

-
-

Interfaces

- -

Classes

- -
- - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html deleted file mode 100644 index b973efe8d97..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - -io.delta.standalone.actions (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.actions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html deleted file mode 100644 index 71a21c180f4..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - -io.delta.standalone.actions Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.actions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html deleted file mode 100644 index 89a9418829e..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - -CloseableIterator (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.data
-

Interface CloseableIterator<T>

-
-
-
-
    -
  • -
    -
    All Superinterfaces:
    -
    AutoCloseable, java.io.Closeable, java.util.Iterator<T>
    -
    -
    -
    -
    public interface CloseableIterator<T>
    -extends java.util.Iterator<T>, java.io.Closeable
    -
    An Iterator that also implements the Closeable interface. The caller - should call Closeable.close() method to free all resources properly after using the iterator.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from interface java.util.Iterator

        -forEachRemaining, hasNext, next, remove
      • -
      -
        -
      • - - -

        Methods inherited from interface java.io.Closeable

        -close
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html deleted file mode 100644 index b1a9bdc18ac..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html +++ /dev/null @@ -1,682 +0,0 @@ - - - - - -RowRecord (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.data
-

Interface RowRecord

-
-
-
-
    -
  • -
    -
    -
    public interface RowRecord
    -
    Represents one row of data containing a non-empty collection of fieldName - value pairs. - It provides APIs to allow retrieval of values through fieldName lookup. For example, - -
    
    -   if (row.isNullAt("int_field")) {
    -     // handle the null value.
    -   } else {
    -     int x = getInt("int_field");
    -   }
    - 
    -
    -
    See Also:
    -
    StructType, -StructField
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Abstract Methods 
      Modifier and TypeMethod and Description
      java.math.BigDecimalgetBigDecimal(String fieldName) -
      Retrieves value from data record and returns the value as a java.math.BigDecimal.
      -
      byte[]getBinary(String fieldName) -
      Retrieves value from data record and returns the value as binary (byte array).
      -
      booleangetBoolean(String fieldName) -
      Retrieves value from data record and returns the value as a primitive boolean.
      -
      bytegetByte(String fieldName) -
      Retrieves value from data record and returns the value as a primitive byte.
      -
      java.sql.DategetDate(String fieldName) -
      Retrieves value from data record and returns the value as a java.sql.Date.
      -
      doublegetDouble(String fieldName) -
      Retrieves value from data record and returns the value as a primitive double.
      -
      floatgetFloat(String fieldName) -
      Retrieves value from data record and returns the value as a primitive float.
      -
      intgetInt(String fieldName) -
      Retrieves value from data record and returns the value as a primitive int.
      -
      intgetLength() 
      <T> java.util.List<T>getList(String fieldName) -
      Retrieves value from data record and returns the value as a java.util.List<T> object.
      -
      longgetLong(String fieldName) -
      Retrieves value from data record and returns the value as a primitive long.
      -
      <K,V> java.util.Map<K,V>getMap(String fieldName) -
      Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
      -
      RowRecordgetRecord(String fieldName) -
      Retrieves value from data record and returns the value as a RowRecord object.
      -
      StructTypegetSchema() 
      shortgetShort(String fieldName) -
      Retrieves value from data record and returns the value as a primitive short.
      -
      StringgetString(String fieldName) -
      Retrieves value from data record and returns the value as a String object.
      -
      java.sql.TimestampgetTimestamp(String fieldName) -
      Retrieves value from data record and returns the value as a java.sql.Timestamp.
      -
      booleanisNullAt(String fieldName) 
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        getLength

        -
        int getLength()
        -
        -
        Returns:
        -
        the number of elements in this RowRecord
        -
        -
      • -
      - - - -
        -
      • -

        isNullAt

        -
        boolean isNullAt(String fieldName)
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        whether the value of field fieldName is null
        -
        -
      • -
      - - - -
        -
      • -

        getInt

        -
        int getInt(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive int.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive int
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getLong

        -
        long getLong(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive long.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive long
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getByte

        -
        byte getByte(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive byte.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive byte
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getShort

        -
        short getShort(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive short.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive short
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBoolean

        -
        boolean getBoolean(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive boolean.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive boolean
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getFloat

        -
        float getFloat(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive float.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive float
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getDouble

        -
        double getDouble(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive double.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive double
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getString

        -
        String getString(String fieldName)
        -
        Retrieves value from data record and returns the value as a String object.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a String object. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBinary

        -
        byte[] getBinary(String fieldName)
        -
        Retrieves value from data record and returns the value as binary (byte array).
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as binary (byte array). null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBigDecimal

        -
        java.math.BigDecimal getBigDecimal(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.math.BigDecimal.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.math.BigDecimal. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getTimestamp

        -
        java.sql.Timestamp getTimestamp(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.sql.Timestamp.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.sql.Timestamp. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getDate

        -
        java.sql.Date getDate(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.sql.Date.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.sql.Date. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getRecord

        -
        RowRecord getRecord(String fieldName)
        -
        Retrieves value from data record and returns the value as a RowRecord object.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a RowRecord object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any nested field, if that field is not - nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getList

        -
        <T> java.util.List<T> getList(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.util.List<T> object.
        -
        -
        Type Parameters:
        -
        T - element type
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a java.util.List<T> object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any element field, if that field is not - nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getMap

        -
        <K,V> java.util.Map<K,V> getMap(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
        -
        -
        Type Parameters:
        -
        K - key type
        -
        V - value type
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a java.util.Map<K, V> object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any key/value field, if that field is not - nullable and null data value read
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html deleted file mode 100644 index 19a5bc55aad..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -io.delta.standalone.data (Delta Standalone 0.6.0 JavaDoc) - - - - - -

io.delta.standalone.data

-
-

Interfaces

- -
- - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html deleted file mode 100644 index 3963c9c8181..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/package-summary.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - -io.delta.standalone.data (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.data

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html deleted file mode 100644 index 4c7d7c14707..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/data/package-tree.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - -io.delta.standalone.data Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.data

-Package Hierarchies: - -
-
-

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html deleted file mode 100644 index 847f9008dfe..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentAppendException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentAppendException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentAppendException
    -extends DeltaConcurrentModificationException
    -
    Thrown when files are added that would have been read by the current transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentAppendException

        -
        public ConcurrentAppendException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html deleted file mode 100644 index 6c66c07690e..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentDeleteDeleteException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentDeleteDeleteException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentDeleteDeleteException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the current transaction deletes data that was deleted by a concurrent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentDeleteDeleteException

        -
        public ConcurrentDeleteDeleteException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html deleted file mode 100644 index 7b4893a3a46..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentDeleteReadException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentDeleteReadException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentDeleteReadException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the current transaction reads data that was deleted by a concurrent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentDeleteReadException

        -
        public ConcurrentDeleteReadException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html deleted file mode 100644 index cae00d0cf62..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentTransactionException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentTransactionException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentTransactionException
    -extends DeltaConcurrentModificationException
    -
    Thrown when concurrent transaction both attempt to update the same idempotent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentTransactionException

        -
        public ConcurrentTransactionException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html deleted file mode 100644 index f6680fd0a91..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html +++ /dev/null @@ -1,275 +0,0 @@ - - - - - -DeltaConcurrentModificationException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class DeltaConcurrentModificationException

-
-
- -
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DeltaConcurrentModificationException

        -
        public DeltaConcurrentModificationException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html deleted file mode 100644 index 00afec7e197..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - -DeltaStandaloneException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class DeltaStandaloneException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class DeltaStandaloneException
    -extends RuntimeException
    -
    Thrown when a query fails, usually because the query itself is invalid.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException()
        -
      • -
      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException(String message)
        -
      • -
      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException(String message,
        -                                Throwable cause)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html deleted file mode 100644 index 4ee39b52074..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - -MetadataChangedException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class MetadataChangedException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class MetadataChangedException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the metadata of the Delta table has changed between the time of read - and the time of commit.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MetadataChangedException

        -
        public MetadataChangedException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html deleted file mode 100644 index 7acc33a483f..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ProtocolChangedException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ProtocolChangedException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ProtocolChangedException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the protocol version has changed between the time of read and the time of commit.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ProtocolChangedException

        -
        public ProtocolChangedException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html deleted file mode 100644 index e58d232e76e..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -io.delta.standalone.exceptions (Delta Standalone 0.6.0 JavaDoc) - - - - - -

io.delta.standalone.exceptions

-
-

Exceptions

- -
- - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html deleted file mode 100644 index 239b16ca4a3..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - -io.delta.standalone.exceptions (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.exceptions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html deleted file mode 100644 index fa01da95f4d..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - -io.delta.standalone.exceptions Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.exceptions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html deleted file mode 100644 index b78fdff2db6..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/And.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - -And (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class And

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class And
    -extends BinaryOperator
    -implements Predicate
    -
    Evaluates logical expr1 AND expr2 for new And(expr1, expr2). -

    - Requires both left and right input expressions evaluate to booleans.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object leftResult,
        -                           Object rightResult)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html deleted file mode 100644 index 1788e4814c0..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - -BinaryComparison (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryComparison

-
-
- -
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html deleted file mode 100644 index 5eafd62a25a..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html +++ /dev/null @@ -1,340 +0,0 @@ - - - - - -BinaryExpression (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryExpression

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    BinaryOperator
    -
    -
    -
    -
    public abstract class BinaryExpression
    -extends Object
    -implements Expression
    -
    An Expression with two inputs and one output. The output is by default evaluated to null - if either input is evaluated to null.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - - - - - -
        -
      • -

        eval

        -
        public final Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html deleted file mode 100644 index 9723eaf4be8..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - -BinaryOperator (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryOperator

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    And, BinaryComparison, Or
    -
    -
    -
    -
    public abstract class BinaryOperator
    -extends BinaryExpression
    -
    A BinaryExpression that is an operator, meaning the string representation is - x symbol y, rather than funcName(x, y). -

    - Requires both inputs to be of the same data type.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html deleted file mode 100644 index 46438187fa7..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Column.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - -Column (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Column

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Column

        -
        public Column(String name,
        -              DataType dataType)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        name

        -
        public String name()
        -
      • -
      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        dataType

        -
        public DataType dataType()
        -
        -
        Returns:
        -
        the DataType of the result of evaluating this expression.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        public java.util.Set<String> references()
        -
        -
        Specified by:
        -
        references in interface Expression
        -
        Overrides:
        -
        references in class LeafExpression
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Specified by:
        -
        equals in class LeafExpression
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html deleted file mode 100644 index d99432055b3..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -EqualTo (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class EqualTo

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html deleted file mode 100644 index 18acb401378..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - -Expression (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Interface Expression

-
-
-
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        Object eval(RowRecord record)
        -
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        dataType

        -
        DataType dataType()
        -
        -
        Returns:
        -
        the DataType of the result of evaluating this expression.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        String toString()
        -
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        default java.util.Set<String> references()
        -
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        java.util.List<Expression> children()
        -
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html deleted file mode 100644 index 996d8a44db3..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -GreaterThan (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class GreaterThan

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html deleted file mode 100644 index dc185ae3fdf..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -GreaterThanOrEqual (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class GreaterThanOrEqual

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class GreaterThanOrEqual
    -extends BinaryComparison
    -implements Predicate
    -
    Evaluates expr1 >= expr2 for new GreaterThanOrEqual(expr1, expr2).
    -
  • -
-
-
- -
-
-
    -
  • - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html deleted file mode 100644 index 710292c93cb..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/In.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - -In (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class In

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class In
    -extends Object
    -implements Predicate
    -
    Evaluates if expr is in exprList for new In(expr, exprList). True if - expr is equal to any expression in exprList, else false.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      In(Expression value, - java.util.List<? extends Expression> elems) 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      java.util.List<Expression>children() 
      Booleaneval(RowRecord record) -
      This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide.
      -
      StringtoString() 
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      - - -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        In

        -
        public In(Expression value,
        -          java.util.List<? extends Expression> elems)
        -
        -
        Parameters:
        -
        value - a nonnull expression
        -
        elems - a nonnull, nonempty list of expressions with the same data type as - value
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Boolean eval(RowRecord record)
        -
        This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide. The logic is as follows: -
          -
        • TRUE if the non-NULL value is found in the list
        • -
        • FALSE if the non-NULL value is not found in the list and the list does not contain - NULL values
        • -
        • NULL if the value is NULL, or the non-NULL value is not found in the list and the - list contains at least one NULL value
        • -
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        See Also:
        -
        NULL Semantics
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html deleted file mode 100644 index 79e9ed4d053..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - -IsNotNull (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class IsNotNull

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        IsNotNull

        -
        public IsNotNull(Expression child)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Overrides:
        -
        eval in class UnaryExpression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html deleted file mode 100644 index 67fc13cad0c..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - -IsNull (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class IsNull

-
-
- -
- -
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Overrides:
        -
        eval in class UnaryExpression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html deleted file mode 100644 index edbdfbd9846..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - -LeafExpression (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LeafExpression

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        public java.util.Set<String> references()
        -
        -
        Specified by:
        -
        references in interface Expression
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public abstract boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public abstract int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html deleted file mode 100644 index f7cef3225d0..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -LessThan (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LessThan

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html deleted file mode 100644 index 2ba911f9de1..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -LessThanOrEqual (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LessThanOrEqual

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html deleted file mode 100644 index 51726167930..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html +++ /dev/null @@ -1,617 +0,0 @@ - - - - - -Literal (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Literal

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html deleted file mode 100644 index 59d7db9f3bc..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Not.html +++ /dev/null @@ -1,324 +0,0 @@ - - - - - -Not (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Not

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class Not
    -extends UnaryExpression
    -implements Predicate
    -
    Evaluates logical NOT expr for new Not(expr). -

    - Requires the child expression evaluates to a boolean.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object childResult)
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html deleted file mode 100644 index cce2be15095..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Or.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - -Or (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Or

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class Or
    -extends BinaryOperator
    -implements Predicate
    -
    Evaluates logical expr1 OR expr2 for new Or(expr1, expr2). -

    - Requires both left and right input expressions evaluate to booleans.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object leftResult,
        -                           Object rightResult)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html deleted file mode 100644 index 9c885fb7dfc..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - -Predicate (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Interface Predicate

-
-
-
- -
-
- -
-
-
    -
  • - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html deleted file mode 100644 index 8a24bf0b989..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - -UnaryExpression (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class UnaryExpression

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    IsNotNull, IsNull, Not
    -
    -
    -
    -
    public abstract class UnaryExpression
    -extends Object
    -implements Expression
    -
    An Expression with one input and one output. The output is by default evaluated to null - if the input is evaluated to null.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html deleted file mode 100644 index bdd0dca1c10..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - -io.delta.standalone.expressions (Delta Standalone 0.6.0 JavaDoc) - - - - - -

io.delta.standalone.expressions

-
-

Interfaces

- -

Classes

- -
- - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html deleted file mode 100644 index fbdf9480cc0..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - -io.delta.standalone.expressions (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.expressions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html deleted file mode 100644 index e6a051f5e57..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - -io.delta.standalone.expressions Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.expressions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/package-frame.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/package-frame.html deleted file mode 100644 index 7803fe6c692..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/package-frame.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -io.delta.standalone (Delta Standalone 0.6.0 JavaDoc) - - - - - -

io.delta.standalone

-
-

Interfaces

- -

Classes

- -

Enums

- -
- - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/package-summary.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/package-summary.html deleted file mode 100644 index e5d6f70e86a..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/package-summary.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - -io.delta.standalone (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/package-tree.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/package-tree.html deleted file mode 100644 index 8fabe4bf2ac..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/package-tree.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - -io.delta.standalone Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html deleted file mode 100644 index 2d6891aec8b..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - -ArrayType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ArrayType

-
-
- -
-
    -
  • -
    -
    -
    public final class ArrayType
    -extends DataType
    -
    The data type for collections of multiple values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ArrayType

        -
        public ArrayType(DataType elementType,
        -                 boolean containsNull)
        -
        -
        Parameters:
        -
        elementType - the data type of values
        -
        containsNull - indicates if values have null value
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getElementType

        -
        public DataType getElementType()
        -
        -
        Returns:
        -
        the type of array elements
        -
        -
      • -
      - - - -
        -
      • -

        containsNull

        -
        public boolean containsNull()
        -
        -
        Returns:
        -
        true if the array has null values, else false
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html deleted file mode 100644 index adf625372b1..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -BinaryType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class BinaryType

-
-
- -
-
    -
  • -
    -
    -
    public final class BinaryType
    -extends DataType
    -
    The data type representing byte[] values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BinaryType

        -
        public BinaryType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html deleted file mode 100644 index bb669dadca5..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -BooleanType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class BooleanType

-
-
- -
-
    -
  • -
    -
    -
    public final class BooleanType
    -extends DataType
    -
    The data type representing boolean values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BooleanType

        -
        public BooleanType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html deleted file mode 100644 index 3cc69db2531..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/ByteType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -ByteType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ByteType

-
-
- -
-
    -
  • -
    -
    -
    public final class ByteType
    -extends DataType
    -
    The data type representing byte values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ByteType

        -
        public ByteType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html deleted file mode 100644 index 60a64b5f51a..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DataType.html +++ /dev/null @@ -1,418 +0,0 @@ - - - - - -DataType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DataType

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DataType

        -
        public DataType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        fromJson

        -
        public static DataType fromJson(String json)
        -
        Parses the input json into a DataType.
        -
        -
        Parameters:
        -
        json - the String json to parse
        -
        Returns:
        -
        the parsed DataType
        -
        -
      • -
      - - - -
        -
      • -

        getTypeName

        -
        public String getTypeName()
        -
        -
        Returns:
        -
        the name of the type used in JSON serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      - - - -
        -
      • -

        getCatalogString

        -
        public String getCatalogString()
        -
        -
        Returns:
        -
        a String representation for the type saved in external catalogs
        -
        -
      • -
      - - - -
        -
      • -

        toJson

        -
        public String toJson()
        -
        -
        Returns:
        -
        a JSON String representation of the type
        -
        -
      • -
      - - - -
        -
      • -

        toPrettyJson

        -
        public String toPrettyJson()
        -
        -
        Returns:
        -
        a pretty (i.e. indented) JSON String representation of the type
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        equivalent

        -
        public boolean equivalent(DataType dt)
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html deleted file mode 100644 index d35f098e02a..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DateType.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - -DateType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DateType

-
-
- -
-
    -
  • -
    -
    -
    public final class DateType
    -extends DataType
    -
    A date type, supporting "0001-01-01" through "9999-12-31". - Internally, this is represented as the number of days from 1970-01-01.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DateType

        -
        public DateType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html deleted file mode 100644 index 1846bce210b..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html +++ /dev/null @@ -1,398 +0,0 @@ - - - - - -DecimalType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DecimalType

-
-
- -
-
    -
  • -
    -
    -
    public final class DecimalType
    -extends DataType
    -
    The data type representing java.math.BigDecimal values. - A Decimal that must have fixed precision (the maximum number of digits) and scale (the number - of digits on right side of dot). - - The precision can be up to 38, scale can also be up to 38 (less or equal to precision). - - The default precision and scale is (10, 0).
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        USER_DEFAULT

        -
        public static final DecimalType USER_DEFAULT
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DecimalType

        -
        public DecimalType(int precision,
        -                   int scale)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPrecision

        -
        public int getPrecision()
        -
        -
        Returns:
        -
        the maximum number of digits of the decimal
        -
        -
      • -
      - - - -
        -
      • -

        getScale

        -
        public int getScale()
        -
        -
        Returns:
        -
        the number of digits on the right side of the decimal point (dot)
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - - - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html deleted file mode 100644 index 4a13d918211..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -DoubleType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DoubleType

-
-
- -
-
    -
  • -
    -
    -
    public final class DoubleType
    -extends DataType
    -
    The data type representing double values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DoubleType

        -
        public DoubleType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html deleted file mode 100644 index 7e8fa6f4b5a..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html +++ /dev/null @@ -1,441 +0,0 @@ - - - - - -FieldMetadata.Builder (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FieldMetadata.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    FieldMetadata
    -
    -
    -
    -
    public static class FieldMetadata.Builder
    -extends Object
    -
    Builder class for FieldMetadata.
    -
  • -
-
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html deleted file mode 100644 index 0e140a67cac..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html +++ /dev/null @@ -1,368 +0,0 @@ - - - - - -FieldMetadata (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FieldMetadata

-
-
- -
-
    -
  • -
    -
    -
    public final class FieldMetadata
    -extends Object
    -
    The metadata for a given StructField.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getEntries

        -
        public java.util.Map<String,Object> getEntries()
        -
        -
        Returns:
        -
        list of the key-value pairs in this FieldMetadata
        -
        -
      • -
      - - - -
        -
      • -

        contains

        -
        public boolean contains(String key)
        -
        -
        Parameters:
        -
        key - the key to check for
        -
        Returns:
        -
        True if this contains a mapping for the given key, False otherwise
        -
        -
      • -
      - - - -
        -
      • -

        get

        -
        public Object get(String key)
        -
        -
        Parameters:
        -
        key - the key to check for
        -
        Returns:
        -
        the value to which the specified key is mapped, or null if there is no mapping for - the given key
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Overrides:
        -
        toString in class Object
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html deleted file mode 100644 index a0970a04324..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/FloatType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -FloatType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FloatType

-
-
- -
-
    -
  • -
    -
    -
    public final class FloatType
    -extends DataType
    -
    The data type representing float values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        FloatType

        -
        public FloatType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html deleted file mode 100644 index d058547061f..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -IntegerType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class IntegerType

-
-
- -
-
    -
  • -
    -
    -
    public final class IntegerType
    -extends DataType
    -
    The data type representing int values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        IntegerType

        -
        public IntegerType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html deleted file mode 100644 index e5ac397ab63..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/LongType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -LongType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class LongType

-
-
- -
-
    -
  • -
    -
    -
    public final class LongType
    -extends DataType
    -
    The data type representing long values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        LongType

        -
        public LongType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html deleted file mode 100644 index 0dd7d326952..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/MapType.html +++ /dev/null @@ -1,364 +0,0 @@ - - - - - -MapType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class MapType

-
-
- -
-
    -
  • -
    -
    -
    public final class MapType
    -extends DataType
    -
    The data type for Maps. Keys in a map are not allowed to have null values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MapType

        -
        public MapType(DataType keyType,
        -               DataType valueType,
        -               boolean valueContainsNull)
        -
        -
        Parameters:
        -
        keyType - the data type of map keys
        -
        valueType - the data type of map values
        -
        valueContainsNull - indicates if map values have null values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getKeyType

        -
        public DataType getKeyType()
        -
        -
        Returns:
        -
        the data type of map keys
        -
        -
      • -
      - - - -
        -
      • -

        getValueType

        -
        public DataType getValueType()
        -
        -
        Returns:
        -
        the data type of map values
        -
        -
      • -
      - - - -
        -
      • -

        valueContainsNull

        -
        public boolean valueContainsNull()
        -
        -
        Returns:
        -
        true if this map has null values, else false
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html deleted file mode 100644 index 3de7d0fb08d..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/NullType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -NullType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class NullType

-
-
- -
-
    -
  • -
    -
    -
    public final class NullType
    -extends DataType
    -
    The data type representing null values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        NullType

        -
        public NullType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html deleted file mode 100644 index 883c4cb48de..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/ShortType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -ShortType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ShortType

-
-
- -
-
    -
  • -
    -
    -
    public final class ShortType
    -extends DataType
    -
    The data type representing short values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ShortType

        -
        public ShortType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html deleted file mode 100644 index 100db722eb7..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/StringType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -StringType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StringType

-
-
- -
-
    -
  • -
    -
    -
    public final class StringType
    -extends DataType
    -
    The data type representing String values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StringType

        -
        public StringType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html deleted file mode 100644 index e1de1f68793..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/StructField.html +++ /dev/null @@ -1,416 +0,0 @@ - - - - - -StructField (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StructField

-
-
- -
-
    -
  • -
    -
    -
    public final class StructField
    -extends Object
    -
    A field inside a StructType.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType)
        -
        Constructor with default nullable = true.
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        -
      • -
      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType,
        -                   boolean nullable)
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        nullable - indicates if values of this field can be null values
        -
        -
      • -
      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType,
        -                   boolean nullable,
        -                   FieldMetadata metadata)
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        nullable - indicates if values of this field can be null values
        -
        metadata - metadata for this field
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getName

        -
        public String getName()
        -
        -
        Returns:
        -
        the name of this field
        -
        -
      • -
      - - - -
        -
      • -

        getDataType

        -
        public DataType getDataType()
        -
        -
        Returns:
        -
        the data type of this field
        -
        -
      • -
      - - - -
        -
      • -

        isNullable

        -
        public boolean isNullable()
        -
        -
        Returns:
        -
        whether this field allows to have a null value.
        -
        -
      • -
      - - - -
        -
      • -

        getMetadata

        -
        public FieldMetadata getMetadata()
        -
        -
        Returns:
        -
        the metadata for this field
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html deleted file mode 100644 index 38004e5ea62..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/StructType.html +++ /dev/null @@ -1,559 +0,0 @@ - - - - - -StructType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StructType

-
-
- -
-
    -
  • -
    -
    -
    public final class StructType
    -extends DataType
    -
    The data type representing a table's schema, consisting of a collection of - fields (that is, fieldName to dataType pairs).
    -
    -
    See Also:
    -
    StructField
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StructType

        -
        public StructType()
        -
      • -
      - - - -
        -
      • -

        StructType

        -
        public StructType(StructField[] fields)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        add

        -
        public StructType add(StructField field)
        -
        Creates a new StructType by adding a new field. - -
        
        - StructType schema = new StructType()
        -     .add(new StructField("a", new IntegerType(), true))
        -     .add(new StructField("b", new LongType(), false))
        -     .add(new StructField("c", new StringType(), true))
        - 
        -
        -
        Parameters:
        -
        field - The new field to add.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        add

        -
        public StructType add(String fieldName,
        -                      DataType dataType)
        -
        Creates a new StructType by adding a new nullable field with no metadata. - -
        
        - StructType schema = new StructType()
        -     .add("a", new IntegerType())
        -     .add("b", new LongType())
        -     .add("c", new StringType())
        - 
        -
        -
        Parameters:
        -
        fieldName - The name of the new field.
        -
        dataType - The datatype for the new field.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        add

        -
        public StructType add(String fieldName,
        -                      DataType dataType,
        -                      boolean nullable)
        -
        Creates a new StructType by adding a new field with no metadata. - -
        
        - StructType schema = new StructType()
        -     .add("a", new IntegerType(), true)
        -     .add("b", new LongType(), false)
        -     .add("c", new StringType(), true)
        - 
        -
        -
        Parameters:
        -
        fieldName - The name of the new field.
        -
        dataType - The datatype for the new field.
        -
        nullable - Whether or not the new field is nullable.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        getFields

        -
        public StructField[] getFields()
        -
        -
        Returns:
        -
        array of fields
        -
        -
      • -
      - - - -
        -
      • -

        getFieldNames

        -
        public String[] getFieldNames()
        -
        -
        Returns:
        -
        array of field names
        -
        -
      • -
      - - - -
        -
      • -

        length

        -
        public int length()
        -
        -
        Returns:
        -
        the number of fields
        -
        -
      • -
      - - - -
        -
      • -

        get

        -
        public StructField get(String fieldName)
        -
        -
        Parameters:
        -
        fieldName - the name of the desired StructField, not null
        -
        Returns:
        -
        the link with the given name, not null
        -
        Throws:
        -
        IllegalArgumentException - if a field with the given name does not exist
        -
        -
      • -
      - - - -
        -
      • -

        column

        -
        public Column column(String fieldName)
        -
        Creates a Column expression for the field with the given fieldName.
        -
        -
        Parameters:
        -
        fieldName - the name of the StructField to create a column for
        -
        Returns:
        -
        a Column expression for the StructField with name fieldName
        -
        -
      • -
      - - - -
        -
      • -

        getTreeString

        -
        public String getTreeString()
        -
        -
        Returns:
        -
        a readable indented tree representation of this StructType - and all of its nested elements
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        isWriteCompatible

        -
        public boolean isWriteCompatible(StructType newSchema)
        -
        Whether a new schema can replace this existing schema in a Delta table without rewriting data - files in the table. -

        - Returns false if the new schema: -

          -
        • Drops any column that is present in the current schema
        • -
        • Converts nullable=true to nullable=false for any column
        • -
        • Changes any datatype
        • -
        -
        -
        Parameters:
        -
        newSchema - the new schema to update the table with
        -
        Returns:
        -
        whether the new schema is compatible with this existing schema
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html deleted file mode 100644 index 2f01741714b..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -TimestampType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class TimestampType

-
-
- -
-
    -
  • -
    -
    -
    public final class TimestampType
    -extends DataType
    -
    The data type representing java.sql.Timestamp values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        TimestampType

        -
        public TimestampType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html deleted file mode 100644 index d5f3e36f964..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/package-frame.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -io.delta.standalone.types (Delta Standalone 0.6.0 JavaDoc) - - - - - -

io.delta.standalone.types

-
-

Classes

- -
- - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html deleted file mode 100644 index 849f04a7eda..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/package-summary.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - -io.delta.standalone.types (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.types

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html deleted file mode 100644 index cae0ec00899..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/types/package-tree.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - -io.delta.standalone.types Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.types

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html deleted file mode 100644 index bc45cd377f1..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html +++ /dev/null @@ -1,365 +0,0 @@ - - - - - -ParquetSchemaConverter.ParquetOutputTimestampType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.util
-

Enum ParquetSchemaConverter.ParquetOutputTimestampType

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable, Comparable<ParquetSchemaConverter.ParquetOutputTimestampType>
    -
    -
    -
    Enclosing class:
    -
    ParquetSchemaConverter
    -
    -
    -
    -
    public static enum ParquetSchemaConverter.ParquetOutputTimestampType
    -extends Enum<ParquetSchemaConverter.ParquetOutputTimestampType>
    -
    :: DeveloperApi :: -

    - Represents Parquet timestamp types. -

      -
    • INT96 is a non-standard but commonly used timestamp type in Parquet.
    • -
    • TIMESTAMP_MICROS is a standard timestamp type in Parquet, which stores number of - microseconds from the Unix epoch.
    • -
    • TIMESTAMP_MILLIS is also standard, but with millisecond precision, which means the - microsecond portion of the timestamp value is truncated.
    • -
    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        values

        -
        public static ParquetSchemaConverter.ParquetOutputTimestampType[] values()
        -
        Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
        -for (ParquetSchemaConverter.ParquetOutputTimestampType c : ParquetSchemaConverter.ParquetOutputTimestampType.values())
        -    System.out.println(c);
        -
        -
        -
        Returns:
        -
        an array containing the constants of this enum type, in the order they are declared
        -
        -
      • -
      - - - -
        -
      • -

        valueOf

        -
        public static ParquetSchemaConverter.ParquetOutputTimestampType valueOf(String name)
        -
        Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.)
        -
        -
        Parameters:
        -
        name - the name of the enum constant to be returned.
        -
        Returns:
        -
        the enum constant with the specified name
        -
        Throws:
        -
        IllegalArgumentException - if this enum type has no constant with the specified name
        -
        NullPointerException - if the argument is null
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html deleted file mode 100644 index 08853b0bf9b..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html +++ /dev/null @@ -1,417 +0,0 @@ - - - - - -ParquetSchemaConverter (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.util
-

Class ParquetSchemaConverter

-
-
- -
-
    -
  • -
    -
    -
    public final class ParquetSchemaConverter
    -extends Object
    -
    :: DeveloperApi :: -

    - Converter class to convert StructType to Parquet MessageType.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   Boolean writeLegacyParquetFormat)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        writeLegacyParquetFormat - Whether to use legacy Parquet format compatible with Spark - 1.4 and prior versions when converting a StructType to a Parquet - MessageType. When set to false, use standard format defined in parquet-format - spec.
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   ParquetSchemaConverter.ParquetOutputTimestampType outputTimestampType)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        outputTimestampType - which parquet timestamp type to use when writing
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   Boolean writeLegacyParquetFormat,
        -                                                                   ParquetSchemaConverter.ParquetOutputTimestampType outputTimestampType)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        writeLegacyParquetFormat - Whether to use legacy Parquet format compatible with Spark - 1.4 and prior versions when converting a StructType to a Parquet - MessageType. When set to false, use standard format defined in parquet-format - spec.
        -
        outputTimestampType - which parquet timestamp type to use when writing
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html deleted file mode 100644 index 5b17e834881..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/package-frame.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -io.delta.standalone.util (Delta Standalone 0.6.0 JavaDoc) - - - - - -

io.delta.standalone.util

-
-

Classes

- -

Enums

- -
- - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html deleted file mode 100644 index 881cf804146..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/package-summary.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - -io.delta.standalone.util (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.util

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html b/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html deleted file mode 100644 index 58b5db2b321..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/io/delta/standalone/util/package-tree.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - -io.delta.standalone.util Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.util

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/overview-frame.html b/connectors/docs/0.6.0/delta-standalone/api/java/overview-frame.html deleted file mode 100644 index 9d4a3837ad2..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/overview-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Overview List (Delta Standalone 0.6.0 JavaDoc) - - - - - -
All Classes
-
-

Packages

- -
-

 

- - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/overview-summary.html b/connectors/docs/0.6.0/delta-standalone/api/java/overview-summary.html deleted file mode 100644 index a35ec24f7f5..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/overview-summary.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - -Overview (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Packages 
PackageDescription
io.delta.standalone 
io.delta.standalone.actions 
io.delta.standalone.data 
io.delta.standalone.exceptions 
io.delta.standalone.expressions 
io.delta.standalone.types 
io.delta.standalone.util 
-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/overview-tree.html b/connectors/docs/0.6.0/delta-standalone/api/java/overview-tree.html deleted file mode 100644 index 54f74fc44ae..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/overview-tree.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For All Packages

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/package-list b/connectors/docs/0.6.0/delta-standalone/api/java/package-list deleted file mode 100644 index be387bb5e0f..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/package-list +++ /dev/null @@ -1,7 +0,0 @@ -io.delta.standalone -io.delta.standalone.actions -io.delta.standalone.data -io.delta.standalone.exceptions -io.delta.standalone.expressions -io.delta.standalone.types -io.delta.standalone.util diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/script.js b/connectors/docs/0.6.0/delta-standalone/api/java/script.js deleted file mode 100644 index b3463569314..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/script.js +++ /dev/null @@ -1,30 +0,0 @@ -function show(type) -{ - count = 0; - for (var key in methods) { - var row = document.getElementById(key); - if ((methods[key] & type) != 0) { - row.style.display = ''; - row.className = (count++ % 2) ? rowColor : altColor; - } - else - row.style.display = 'none'; - } - updateTabs(type); -} - -function updateTabs(type) -{ - for (var value in tabs) { - var sNode = document.getElementById(tabs[value][0]); - var spanNode = sNode.firstChild; - if (value == type) { - sNode.className = activeTableTab; - spanNode.innerHTML = tabs[value][1]; - } - else { - sNode.className = tableTab; - spanNode.innerHTML = "" + tabs[value][1] + ""; - } - } -} diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/serialized-form.html b/connectors/docs/0.6.0/delta-standalone/api/java/serialized-form.html deleted file mode 100644 index 7993145a0f9..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/serialized-form.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - -Serialized Form (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Serialized Form

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/0.6.0/delta-standalone/api/java/stylesheet.css b/connectors/docs/0.6.0/delta-standalone/api/java/stylesheet.css deleted file mode 100644 index 98055b22d6d..00000000000 --- a/connectors/docs/0.6.0/delta-standalone/api/java/stylesheet.css +++ /dev/null @@ -1,574 +0,0 @@ -/* Javadoc style sheet */ -/* -Overall document style -*/ - -@import url('resources/fonts/dejavu.css'); - -body { - background-color:#ffffff; - color:#353833; - font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; - font-size:14px; - margin:0; -} -a:link, a:visited { - text-decoration:none; - color:#4A6782; -} -a:hover, a:focus { - text-decoration:none; - color:#bb7a2a; -} -a:active { - text-decoration:none; - color:#4A6782; -} -a[name] { - color:#353833; -} -a[name]:hover { - text-decoration:none; - color:#353833; -} -pre { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; -} -h1 { - font-size:20px; -} -h2 { - font-size:18px; -} -h3 { - font-size:16px; - font-style:italic; -} -h4 { - font-size:13px; -} -h5 { - font-size:12px; -} -h6 { - font-size:11px; -} -ul { - list-style-type:disc; -} -code, tt { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; - margin-top:8px; - line-height:1.4em; -} -dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; -} -table tr td dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - vertical-align:top; - padding-top:4px; -} -sup { - font-size:8px; -} -/* -Document title and Copyright styles -*/ -.clear { - clear:both; - height:0px; - overflow:hidden; -} -.aboutLanguage { - float:right; - padding:0px 21px; - font-size:11px; - z-index:200; - margin-top:-9px; -} -.legalCopy { - margin-left:.5em; -} -.bar a, .bar a:link, .bar a:visited, .bar a:active { - color:#FFFFFF; - text-decoration:none; -} -.bar a:hover, .bar a:focus { - color:#bb7a2a; -} -.tab { - background-color:#0066FF; - color:#ffffff; - padding:8px; - width:5em; - font-weight:bold; -} -/* -Navigation bar styles -*/ -.bar { - background-color:#4D7A97; - color:#FFFFFF; - padding:.8em .5em .4em .8em; - height:auto;/*height:1.8em;*/ - font-size:11px; - margin:0; -} -.topNav { - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.bottomNav { - margin-top:10px; - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.subNav { - background-color:#dee3e9; - float:left; - width:100%; - overflow:hidden; - font-size:12px; -} -.subNav div { - clear:left; - float:left; - padding:0 0 5px 6px; - text-transform:uppercase; -} -ul.navList, ul.subNavList { - float:left; - margin:0 25px 0 0; - padding:0; -} -ul.navList li{ - list-style:none; - float:left; - padding: 5px 6px; - text-transform:uppercase; -} -ul.subNavList li{ - list-style:none; - float:left; -} -.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { - color:#FFFFFF; - text-decoration:none; - text-transform:uppercase; -} -.topNav a:hover, .bottomNav a:hover { - text-decoration:none; - color:#bb7a2a; - text-transform:uppercase; -} -.navBarCell1Rev { - background-color:#F8981D; - color:#253441; - margin: auto 5px; -} -.skipNav { - position:absolute; - top:auto; - left:-9999px; - overflow:hidden; -} -/* -Page header and footer styles -*/ -.header, .footer { - clear:both; - margin:0 20px; - padding:5px 0 0 0; -} -.indexHeader { - margin:10px; - position:relative; -} -.indexHeader span{ - margin-right:15px; -} -.indexHeader h1 { - font-size:13px; -} -.title { - color:#2c4557; - margin:10px 0; -} -.subTitle { - margin:5px 0 0 0; -} -.header ul { - margin:0 0 15px 0; - padding:0; -} -.footer ul { - margin:20px 0 5px 0; -} -.header ul li, .footer ul li { - list-style:none; - font-size:13px; -} -/* -Heading styles -*/ -div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList ul.blockList li.blockList h3 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList li.blockList h3 { - padding:0; - margin:15px 0; -} -ul.blockList li.blockList h2 { - padding:0px 0 20px 0; -} -/* -Page layout container styles -*/ -.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { - clear:both; - padding:10px 20px; - position:relative; -} -.indexContainer { - margin:10px; - position:relative; - font-size:12px; -} -.indexContainer h2 { - font-size:13px; - padding:0 0 3px 0; -} -.indexContainer ul { - margin:0; - padding:0; -} -.indexContainer ul li { - list-style:none; - padding-top:2px; -} -.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { - font-size:12px; - font-weight:bold; - margin:10px 0 0 0; - color:#4E4E4E; -} -.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { - margin:5px 0 10px 0px; - font-size:14px; - font-family:'DejaVu Sans Mono',monospace; -} -.serializedFormContainer dl.nameValue dt { - margin-left:1px; - font-size:1.1em; - display:inline; - font-weight:bold; -} -.serializedFormContainer dl.nameValue dd { - margin:0 0 0 1px; - font-size:1.1em; - display:inline; -} -/* -List styles -*/ -ul.horizontal li { - display:inline; - font-size:0.9em; -} -ul.inheritance { - margin:0; - padding:0; -} -ul.inheritance li { - display:inline; - list-style:none; -} -ul.inheritance li ul.inheritance { - margin-left:15px; - padding-left:15px; - padding-top:1px; -} -ul.blockList, ul.blockListLast { - margin:10px 0 10px 0; - padding:0; -} -ul.blockList li.blockList, ul.blockListLast li.blockList { - list-style:none; - margin-bottom:15px; - line-height:1.4; -} -ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { - padding:0px 20px 5px 10px; - border:1px solid #ededed; - background-color:#f8f8f8; -} -ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { - padding:0 0 5px 8px; - background-color:#ffffff; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { - margin-left:0; - padding-left:0; - padding-bottom:15px; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { - list-style:none; - border-bottom:none; - padding-bottom:0; -} -table tr td dl, table tr td dl dt, table tr td dl dd { - margin-top:0; - margin-bottom:1px; -} -/* -Table styles -*/ -.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { - width:100%; - border-left:1px solid #EEE; - border-right:1px solid #EEE; - border-bottom:1px solid #EEE; -} -.overviewSummary, .memberSummary { - padding:0px; -} -.overviewSummary caption, .memberSummary caption, .typeSummary caption, -.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { - position:relative; - text-align:left; - background-repeat:no-repeat; - color:#253441; - font-weight:bold; - clear:none; - overflow:hidden; - padding:0px; - padding-top:10px; - padding-left:1px; - margin:0px; - white-space:pre; -} -.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, -.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, -.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, -.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, -.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, -.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, -.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, -.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { - color:#FFFFFF; -} -.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, -.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - padding-bottom:7px; - display:inline-block; - float:left; - background-color:#F8981D; - border: none; - height:16px; -} -.memberSummary caption span.activeTableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#F8981D; - height:16px; -} -.memberSummary caption span.tableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#4D7A97; - height:16px; -} -.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { - padding-top:0px; - padding-left:0px; - padding-right:0px; - background-image:none; - float:none; - display:inline; -} -.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, -.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { - display:none; - width:5px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .activeTableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .tableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - background-color:#4D7A97; - float:left; - -} -.overviewSummary td, .memberSummary td, .typeSummary td, -.useSummary td, .constantsSummary td, .deprecatedSummary td { - text-align:left; - padding:0px 0px 12px 10px; -} -th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, -td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ - vertical-align:top; - padding-right:0px; - padding-top:8px; - padding-bottom:3px; -} -th.colFirst, th.colLast, th.colOne, .constantsSummary th { - background:#dee3e9; - text-align:left; - padding:8px 3px 3px 7px; -} -td.colFirst, th.colFirst { - white-space:nowrap; - font-size:13px; -} -td.colLast, th.colLast { - font-size:13px; -} -td.colOne, th.colOne { - font-size:13px; -} -.overviewSummary td.colFirst, .overviewSummary th.colFirst, -.useSummary td.colFirst, .useSummary th.colFirst, -.overviewSummary td.colOne, .overviewSummary th.colOne, -.memberSummary td.colFirst, .memberSummary th.colFirst, -.memberSummary td.colOne, .memberSummary th.colOne, -.typeSummary td.colFirst{ - width:25%; - vertical-align:top; -} -td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { - font-weight:bold; -} -.tableSubHeadingColor { - background-color:#EEEEFF; -} -.altColor { - background-color:#FFFFFF; -} -.rowColor { - background-color:#EEEEEF; -} -/* -Content styles -*/ -.description pre { - margin-top:0; -} -.deprecatedContent { - margin:0; - padding:10px 0; -} -.docSummary { - padding:0; -} - -ul.blockList ul.blockList ul.blockList li.blockList h3 { - font-style:normal; -} - -div.block { - font-size:14px; - font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; -} - -td.colLast div { - padding-top:0px; -} - - -td.colLast a { - padding-bottom:3px; -} -/* -Formatting effect styles -*/ -.sourceLineNo { - color:green; - padding:0 30px 0 0; -} -h1.hidden { - visibility:hidden; - overflow:hidden; - font-size:10px; -} -.block { - display:block; - margin:3px 10px 2px 0px; - color:#474747; -} -.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, -.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, -.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { - font-weight:bold; -} -.deprecationComment, .emphasizedPhrase, .interfaceName { - font-style:italic; -} - -div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, -div.block div.block span.interfaceName { - font-style:normal; -} - -div.contentContainer ul.blockList li.blockList h2{ - padding-bottom:0px; -} diff --git a/connectors/docs/latest/delta-flink/api/java/allclasses-frame.html b/connectors/docs/latest/delta-flink/api/java/allclasses-frame.html deleted file mode 100644 index 86decfba7d4..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/allclasses-frame.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - -All Classes (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/latest/delta-flink/api/java/allclasses-noframe.html b/connectors/docs/latest/delta-flink/api/java/allclasses-noframe.html deleted file mode 100644 index b6a2c2d8d43..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/allclasses-noframe.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - -All Classes (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/latest/delta-flink/api/java/constant-values.html b/connectors/docs/latest/delta-flink/api/java/constant-values.html deleted file mode 100644 index 3975789d5a5..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/constant-values.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - -Constant Field Values (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Constant Field Values

-

Contents

-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-flink/api/java/deprecated-list.html b/connectors/docs/latest/delta-flink/api/java/deprecated-list.html deleted file mode 100644 index b2522837723..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/deprecated-list.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - -Deprecated List (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Deprecated API

-

Contents

-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-flink/api/java/help-doc.html b/connectors/docs/latest/delta-flink/api/java/help-doc.html deleted file mode 100644 index 17346944ce9..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/help-doc.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - -API Help (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

How This API Document Is Organized

-
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
-
-
- -This help file applies to API documentation generated using the standard doclet.
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-flink/api/java/index-all.html b/connectors/docs/latest/delta-flink/api/java/index-all.html deleted file mode 100644 index 203bf45bae6..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/index-all.html +++ /dev/null @@ -1,355 +0,0 @@ - - - - - -Index (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
B C D F I O R S T U V W  - - -

B

-
-
build() - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Creates the actual sink.
-
-
build() - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Creates an instance of DeltaSource for a stream of RowData.
-
-
build() - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Creates an instance of DeltaSource for a stream of RowData.
-
-
- - - -

C

-
-
columnNames(List<String>) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Specifies a List of column names that should be read from Delta table.
-
-
columnNames(String...) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Specifies an array of column names that should be read from Delta table.
-
-
columnNames(List<String>) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Specifies a List of column names that should be read from Delta table.
-
-
columnNames(String...) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Specifies an array of column names that should be read from Delta table.
-
-
- - - -

D

-
-
DeltaSink<IN> - Class in io.delta.flink.sink
-
-
A unified sink that emits its input elements to file system files within buckets using - Parquet format and commits those files to the DeltaLog.
-
-
DeltaSource<T> - Class in io.delta.flink.source
-
-
A unified data source that reads Delta table - both in batch and in streaming mode.
-
-
- - - -

F

-
-
forBoundedRowData(Path, Configuration) - Static method in class io.delta.flink.source.DeltaSource
-
-
Creates an instance of Delta source builder for Bounded mode and for RowData - elements.
-
-
forContinuousRowData(Path, Configuration) - Static method in class io.delta.flink.source.DeltaSource
-
-
Creates an instance of Delta source builder for Continuous mode and for RowData - elements.
-
-
forRowData(Path, Configuration, RowType) - Static method in class io.delta.flink.sink.DeltaSink
-
-
Convenience method for creating a RowDataDeltaSinkBuilder for DeltaSink to a - Delta table.
-
-
- - - -

I

-
-
ignoreChanges(boolean) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets the "ignoreChanges" option.
-
-
ignoreDeletes(boolean) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets the "ignoreDeletes" option.
-
-
io.delta.flink.sink - package io.delta.flink.sink
-
 
-
io.delta.flink.source - package io.delta.flink.source
-
 
-
- - - -

O

-
-
option(String, String) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets a configuration option.
-
-
option(String, boolean) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets a configuration option.
-
-
option(String, int) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets a configuration option.
-
-
option(String, long) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets a configuration option.
-
-
option(String, String) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, boolean) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, int) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, long) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, String) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, boolean) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, int) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
option(String, long) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets a configuration option.
-
-
- - - -

R

-
-
RowDataBoundedDeltaSourceBuilder - Class in io.delta.flink.source
-
-
A builder class for DeltaSource for a stream of RowData where the created source - instance will operate in Bounded mode.
-
-
RowDataContinuousDeltaSourceBuilder - Class in io.delta.flink.source
-
-
A builder class for DeltaSource for a stream of RowData where the created source - instance will operate in Continuous mode.
-
-
RowDataDeltaSinkBuilder - Class in io.delta.flink.sink
-
-
A builder class for DeltaSink for a stream of RowData.
-
-
RowDataDeltaSinkBuilder(Path, Configuration, RowType, boolean) - Constructor for class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Creates instance of the builder for DeltaSink.
-
-
- - - -

S

-
-
startingTimestamp(String) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets value of "startingTimestamp" option.
-
-
startingVersion(String) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets value of "startingVersion" option.
-
-
startingVersion(long) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets value of "startingVersion" option.
-
-
- - - -

T

-
-
timestampAsOf(String) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets value of "timestampAsOf" option.
-
-
- - - -

U

-
-
updateCheckIntervalMillis(long) - Method in class io.delta.flink.source.RowDataContinuousDeltaSourceBuilder
-
-
Sets the value for "updateCheckIntervalMillis" option.
-
-
- - - -

V

-
-
versionAsOf(long) - Method in class io.delta.flink.source.RowDataBoundedDeltaSourceBuilder
-
-
Sets value of "versionAsOf" option.
-
-
- - - -

W

-
-
withMergeSchema(boolean) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets the sink's option whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch during a commit to the - DeltaLog.
-
-
withPartitionColumns(String...) - Method in class io.delta.flink.sink.RowDataDeltaSinkBuilder
-
-
Sets list of partition fields that will be extracted from incoming RowData events.
-
-
-B C D F I O R S T U V W 
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-flink/api/java/index.html b/connectors/docs/latest/delta-flink/api/java/index.html deleted file mode 100644 index 0f1fbd559c9..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - -Flink/Delta Connector 0.6.0 JavaDoc - - - - - - - - - -<noscript> -<div>JavaScript is disabled on your browser.</div> -</noscript> -<h2>Frame Alert</h2> -<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> - - - diff --git a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html b/connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html deleted file mode 100644 index 47bff821371..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/DeltaSink.html +++ /dev/null @@ -1,309 +0,0 @@ - - - - - -DeltaSink (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.sink
-

Class DeltaSink<IN>

-
-
- -
-
    -
  • -
    -
    Type Parameters:
    -
    IN - Type of the elements in the input of the sink that are also the elements to be - written to its output
    -
    -
    -
    -
    public class DeltaSink<IN>
    -extends <any>
    -
    A unified sink that emits its input elements to file system files within buckets using - Parquet format and commits those files to the DeltaLog. This sink achieves exactly-once - semantics for both BATCH and STREAMING. -

    - For most use cases users should use forRowData(org.apache.flink.core.fs.Path, org.apache.hadoop.conf.Configuration, org.apache.flink.table.types.logical.RowType) utility method to instantiate - the sink which provides proper writer factory implementation for the stream of RowData. -

    - To create new instance of the sink to a non-partitioned Delta table for stream of - RowData: -

    -     DataStream<RowData> stream = ...;
    -     RowType rowType = ...;
    -     ...
    -
    -     // sets a sink to a non-partitioned Delta table
    -     DeltaSink<RowData> deltaSink = DeltaSink.forRowData(
    -             new Path(deltaTablePath),
    -             new Configuration(),
    -             rowType).build();
    -     stream.sinkTo(deltaSink);
    - 
    - - To create new instance of the sink to a partitioned Delta table for stream of RowData: -
    -     String[] partitionCols = ...; // array of partition columns' names
    -
    -     DeltaSink<RowData> deltaSink = DeltaSink.forRowData(
    -             new Path(deltaTablePath),
    -             new Configuration(),
    -             rowType)
    -         .withPartitionColumns(partitionCols)
    -         .build();
    -     stream.sinkTo(deltaSink);
    - 
    -

    - Behaviour of this sink splits down upon two phases. The first phase takes place between - application's checkpoints when records are being flushed to files (or appended to writers' - buffers) where the behaviour is almost identical as in case of - FileSink. - Next during the checkpoint phase files are "closed" (renamed) by the independent instances of - io.delta.flink.sink.internal.committer.DeltaCommitter that behave very similar - to FileCommitter. - When all the parallel committers are done, then all the files are committed at once by - single-parallelism io.delta.flink.sink.internal.committer.DeltaGlobalCommitter. -

    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - -
      All Methods Static Methods Concrete Methods 
      Modifier and TypeMethod and Description
      static RowDataDeltaSinkBuilderforRowData(org.apache.flink.core.fs.Path basePath, - org.apache.hadoop.conf.Configuration conf, - org.apache.flink.table.types.logical.RowType rowType) -
      Convenience method for creating a RowDataDeltaSinkBuilder for DeltaSink to a - Delta table.
      -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        forRowData

        -
        public static RowDataDeltaSinkBuilder forRowData(org.apache.flink.core.fs.Path basePath,
        -                                                 org.apache.hadoop.conf.Configuration conf,
        -                                                 org.apache.flink.table.types.logical.RowType rowType)
        -
        Convenience method for creating a RowDataDeltaSinkBuilder for DeltaSink to a - Delta table.
        -
        -
        Parameters:
        -
        basePath - root path of the Delta table
        -
        conf - Hadoop's conf object that will be used for creating instances of - DeltaLog and will be also passed to the - ParquetRowDataBuilder to create ParquetWriterFactory
        -
        rowType - Flink's logical type to indicate the structure of the events in the stream
        -
        Returns:
        -
        builder for the DeltaSink
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html b/connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html deleted file mode 100644 index 3f1d6aab1d3..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/RowDataDeltaSinkBuilder.html +++ /dev/null @@ -1,430 +0,0 @@ - - - - - -RowDataDeltaSinkBuilder (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.sink
-

Class RowDataDeltaSinkBuilder

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      RowDataDeltaSinkBuilder(org.apache.flink.core.fs.Path tableBasePath, - org.apache.hadoop.conf.Configuration conf, - org.apache.flink.table.types.logical.RowType rowType, - boolean mergeSchema) -
      Creates instance of the builder for DeltaSink.
      -
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        RowDataDeltaSinkBuilder

        -
        public RowDataDeltaSinkBuilder(org.apache.flink.core.fs.Path tableBasePath,
        -                               org.apache.hadoop.conf.Configuration conf,
        -                               org.apache.flink.table.types.logical.RowType rowType,
        -                               boolean mergeSchema)
        -
        Creates instance of the builder for DeltaSink.
        -
        -
        Parameters:
        -
        tableBasePath - path to a Delta table
        -
        conf - Hadoop's conf object
        -
        rowType - Flink's logical type to indicate the structure of the events in - the stream
        -
        mergeSchema - whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch. This is not guaranteed - since it checks for compatible schemas.
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        withMergeSchema

        -
        public RowDataDeltaSinkBuilder withMergeSchema(boolean mergeSchema)
        -
        Sets the sink's option whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch during a commit to the - DeltaLog. The update is not guaranteed since it checks for - compatible schemas.
        -
        -
        Parameters:
        -
        mergeSchema - whether we should try to update the Delta table's schema with - the stream's schema in case of a mismatch. This is not guaranteed - since it requires compatible schemas.
        -
        Returns:
        -
        builder for DeltaSink
        -
        -
      • -
      - - - -
        -
      • -

        withPartitionColumns

        -
        public RowDataDeltaSinkBuilder withPartitionColumns(String... partitionColumns)
        -
        Sets list of partition fields that will be extracted from incoming RowData events. -

        - Provided fields' names must correspond to the names provided in the RowType object - for this sink and must be in the same order as expected order of occurrence in the partition - path that will be generated.

        -
        -
        Parameters:
        -
        partitionColumns - array of partition columns' names in the order they should be applied - when creating destination path.
        -
        Returns:
        -
        builder for DeltaSink
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataDeltaSinkBuilder option(String optionName,
        -                                      String optionValue)
        -
        Sets a configuration option.
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataDeltaSinkBuilder option(String optionName,
        -                                      boolean optionValue)
        -
        Sets a configuration option.
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataDeltaSinkBuilder option(String optionName,
        -                                      int optionValue)
        -
        Sets a configuration option.
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataDeltaSinkBuilder option(String optionName,
        -                                      long optionValue)
        -
        Sets a configuration option.
        -
      • -
      - - - -
        -
      • -

        build

        -
        public DeltaSink<org.apache.flink.table.data.RowData> build()
        -
        Creates the actual sink.
        -
        -
        Returns:
        -
        constructed DeltaSink object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/package-frame.html b/connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/package-frame.html deleted file mode 100644 index 21341ecfc7b..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -io.delta.flink.sink (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - -

io.delta.flink.sink

-
-

Classes

- -
- - diff --git a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/package-summary.html b/connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/package-summary.html deleted file mode 100644 index b77e54b0ecc..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/package-summary.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - -io.delta.flink.sink (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.flink.sink

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/package-tree.html b/connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/package-tree.html deleted file mode 100644 index 9b976f0c6c2..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/sink/package-tree.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - -io.delta.flink.sink Class Hierarchy (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.flink.sink

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/DeltaSource.html b/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/DeltaSource.html deleted file mode 100644 index 92dac9f4b8f..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/DeltaSource.html +++ /dev/null @@ -1,366 +0,0 @@ - - - - - -DeltaSource (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.source
-

Class DeltaSource<T>

-
-
- -
-
    -
  • -
    -
    Type Parameters:
    -
    T - The type of the events/records produced by this source.
    -
    -
    -
    -
    public class DeltaSource<T>
    -extends <any>
    -
    A unified data source that reads Delta table - both in batch and in streaming mode. - -

    This source supports all (distributed) file systems and object stores that can be accessed - via the Flink's FileSystem class. -

    - To create a new instance of DeltaSource for a Delta table that will produce - RowData records that contain all table columns: -

    -     StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    -     ...
    -     // Bounded mode.
    -     DeltaSource<RowData> deltaSource = DeltaSource.forBoundedRowData(
    -                new Path("s3://some/path"),
    -                new Configuration()
    -             )
    -             .versionAsOf(10)
    -             .build();
    -
    -     env.fromSource(deltaSource, WatermarkStrategy.noWatermarks(), "delta-source")
    -
    -     ..........
    -     // Continuous mode.
    -     DeltaSource<RowData> deltaSource = DeltaSource.forContinuousRowData(
    -                new Path("s3://some/path"),
    -                new Configuration()
    -               )
    -              .updateCheckIntervalMillis(1000)
    -              .startingVersion(10)
    -              .build();
    -
    -     env.fromSource(deltaSource, WatermarkStrategy.noWatermarks(), "delta-source")
    - 
    -

    - To create a new instance of DeltaSource for a Delta table that will produce - RowData records with user-selected columns: -

    -     StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    -     ...
    -     // Bounded mode.
    -     DeltaSource<RowData> deltaSource = DeltaSource.forBoundedRowData(
    -                new Path("s3://some/path"),
    -                new Configuration()
    -             )
    -             .columnNames(Arrays.asList("col1", "col2"))
    -             .versionAsOf(10)
    -             .build();
    -
    -     env.fromSource(deltaSource, WatermarkStrategy.noWatermarks(), "delta-source")
    -
    -     ..........
    -     // Continuous mode.
    -     DeltaSource<RowData> deltaSource = DeltaSource.forContinuousRowData(
    -                new Path("s3://some/path"),
    -                new Configuration()
    -               )
    -               .columnNames(Arrays.asList("col1", "col2"))
    -               .updateCheckIntervalMillis(1000)
    -               .startingVersion(10)
    -               .build();
    -
    -     env.fromSource(deltaSource, WatermarkStrategy.noWatermarks(), "delta-source")
    - 
    - When using columnNames(...) method, the source will discover the data types for the - given columns from the Delta log.
    -
    -
    Implementation Note:
    -

    Batch and Streaming

    - -

    This source supports both bounded/batch and continuous/streaming modes. For the - bounded/batch case, the Delta Source processes the full state of the Delta table. In - the continuous/streaming case, the default Delta Source will also process the full state of the - table, and then begin to periodically check the Delta table for any appending changes and read - them. Using either of the RowDataContinuousDeltaSourceBuilder.startingVersion(java.lang.String) or - RowDataContinuousDeltaSourceBuilder.startingTimestamp(java.lang.String) APIs will cause the Delta Source, - in continuous mode, to stream only the changes from that historical version. - -

    Format Types

    - -

    The reading of each file happens through file readers defined by file format. These - define the parsing logic for the contents of the underlying Parquet files. - -

    A BulkFormat reads batches of records from a file at a time.,

    Discovering / Enumerating Files

    -

    The way that the source lists the files to be processes is defined by the AddFileEnumerator. The AddFileEnumerator is responsible to select the relevant AddFile and to optionally splits files into multiple regions (file source splits) that can be - read in parallel.

    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - -
      All Methods Static Methods Concrete Methods 
      Modifier and TypeMethod and Description
      static RowDataBoundedDeltaSourceBuilderforBoundedRowData(org.apache.flink.core.fs.Path tablePath, - org.apache.hadoop.conf.Configuration hadoopConfiguration) -
      Creates an instance of Delta source builder for Bounded mode and for RowData - elements.
      -
      static RowDataContinuousDeltaSourceBuilderforContinuousRowData(org.apache.flink.core.fs.Path tablePath, - org.apache.hadoop.conf.Configuration hadoopConfiguration) -
      Creates an instance of Delta source builder for Continuous mode and for RowData - elements.
      -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        forBoundedRowData

        -
        public static RowDataBoundedDeltaSourceBuilder forBoundedRowData(org.apache.flink.core.fs.Path tablePath,
        -                                                                 org.apache.hadoop.conf.Configuration hadoopConfiguration)
        -
        Creates an instance of Delta source builder for Bounded mode and for RowData - elements.
        -
        -
        Parameters:
        -
        tablePath - Path to Delta table to read data from.
        -
        hadoopConfiguration - Hadoop configuration.
        -
        -
      • -
      - - - -
        -
      • -

        forContinuousRowData

        -
        public static RowDataContinuousDeltaSourceBuilder forContinuousRowData(org.apache.flink.core.fs.Path tablePath,
        -                                                                       org.apache.hadoop.conf.Configuration hadoopConfiguration)
        -
        Creates an instance of Delta source builder for Continuous mode and for RowData - elements.
        -
        -
        Parameters:
        -
        tablePath - Path to Delta table to read data from.
        -
        hadoopConfiguration - Hadoop configuration.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/RowDataBoundedDeltaSourceBuilder.html b/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/RowDataBoundedDeltaSourceBuilder.html deleted file mode 100644 index d0e5fa836be..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/RowDataBoundedDeltaSourceBuilder.html +++ /dev/null @@ -1,454 +0,0 @@ - - - - - -RowDataBoundedDeltaSourceBuilder (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.source
-

Class RowDataBoundedDeltaSourceBuilder

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        columnNames

        -
        public RowDataBoundedDeltaSourceBuilder columnNames(java.util.List<String> columnNames)
        -
        Specifies a List of column names that should be read from Delta table. If this method - is not used, Source will read all columns from Delta table. -

        - If provided List is null or contains null, empty or blank elements it will throw a - DeltaSourceValidationException by builder after calling build() method.

        -
        -
        Parameters:
        -
        columnNames - column names that should be read.
        -
        -
      • -
      - - - -
        -
      • -

        columnNames

        -
        public RowDataBoundedDeltaSourceBuilder columnNames(String... columnNames)
        -
        Specifies an array of column names that should be read from Delta table. If this method - is not used, Source will read all columns from Delta table. -

        - If provided List is null or contains null, empty or blank elements it will throw a - DeltaSourceValidationException by builder after calling build() method.

        -
        -
        Parameters:
        -
        columnNames - column names that should be read.
        -
        -
      • -
      - - - -
        -
      • -

        versionAsOf

        -
        public RowDataBoundedDeltaSourceBuilder versionAsOf(long snapshotVersion)
        -
        Sets value of "versionAsOf" option. With this option we will load the given table version and - read from it. - -

        - This option is mutually exclusive with timestampAsOf(String) option.

        -
        -
        Parameters:
        -
        snapshotVersion - Delta table version to time travel to.
        -
        -
      • -
      - - - -
        -
      • -

        timestampAsOf

        -
        public RowDataBoundedDeltaSourceBuilder timestampAsOf(String snapshotTimestamp)
        -
        Sets value of "timestampAsOf" option. With this option we will load the latest table version - that was generated at or before the given timestamp. -

        - This option is mutually exclusive with versionAsOf(long) option.

        -
        -
        Parameters:
        -
        snapshotTimestamp - The timestamp we should time travel to. Supported formats are: -
          -
        • 2022-02-24
        • -
        • 2022-02-24 04:55:00
        • -
        • 2022-02-24 04:55:00.001
        • -
        • 2022-02-24T04:55:00
        • -
        • 2022-02-24T04:55:00.001
        • -
        • 2022-02-24T04:55:00.001Z
        • -
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataBoundedDeltaSourceBuilder option(String optionName,
        -                                               String optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option String value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataBoundedDeltaSourceBuilder option(String optionName,
        -                                               boolean optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option boolean value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataBoundedDeltaSourceBuilder option(String optionName,
        -                                               int optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option int value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataBoundedDeltaSourceBuilder option(String optionName,
        -                                               long optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option long value to set.
        -
        -
      • -
      - - - -
        -
      • -

        build

        -
        public DeltaSource<org.apache.flink.table.data.RowData> build()
        -
        Creates an instance of DeltaSource for a stream of RowData. Created source - will work in Bounded mode, meaning it will read the content of the configured Delta snapshot - at the fixed version, ignoring all changes done to this table after starting this source. - -

        - This method can throw DeltaSourceValidationException in case of invalid arguments - passed to Delta source builder.

        -
        -
        Returns:
        -
        New DeltaSource instance.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/RowDataContinuousDeltaSourceBuilder.html b/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/RowDataContinuousDeltaSourceBuilder.html deleted file mode 100644 index 4aea8c5bb50..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/RowDataContinuousDeltaSourceBuilder.html +++ /dev/null @@ -1,557 +0,0 @@ - - - - - -RowDataContinuousDeltaSourceBuilder (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.flink.source
-

Class RowDataContinuousDeltaSourceBuilder

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        columnNames

        -
        public RowDataContinuousDeltaSourceBuilder columnNames(java.util.List<String> columnNames)
        -
        Specifies a List of column names that should be read from Delta table. If this method - is not used, Source will read all columns from Delta table. -

        - If provided List is null or contains null, empty or blank elements it will throw a - DeltaSourceValidationException by builder after calling build() method.

        -
        -
        Parameters:
        -
        columnNames - column names that should be read.
        -
        -
      • -
      - - - -
        -
      • -

        columnNames

        -
        public RowDataContinuousDeltaSourceBuilder columnNames(String... columnNames)
        -
        Specifies an array of column names that should be read from Delta table. If this method - is not used, Source will read all columns from Delta table. -

        - If provided List is null or contains null, empty or blank elements it will throw a - DeltaSourceValidationException by builder after calling build() method.

        -
        -
        Parameters:
        -
        columnNames - column names that should be read.
        -
        -
      • -
      - - - -
        -
      • -

        startingVersion

        -
        public RowDataContinuousDeltaSourceBuilder startingVersion(String startingVersion)
        -
        Sets value of "startingVersion" option. This option specifies the starting table version from - which we want to start reading changes. - -

        - This option is mutually exclusive with startingTimestamp(String) option.

        -
        -
        Parameters:
        -
        startingVersion - Delta table version to start reading changes from. The values can be - string numbers like "1", "10" etc. or keyword "latest", where in that - case, changes from the latest Delta table version will be read.
        -
        -
      • -
      - - - -
        -
      • -

        startingVersion

        -
        public RowDataContinuousDeltaSourceBuilder startingVersion(long startingVersion)
        -
        Sets value of "startingVersion" option. This option specifies the starting table version from - which we want to start reading changes. - -

        - This option is mutually exclusive with startingTimestamp(String) option.

        -
        -
        Parameters:
        -
        startingVersion - Delta table version to start reading changes from.
        -
        -
      • -
      - - - -
        -
      • -

        startingTimestamp

        -
        public RowDataContinuousDeltaSourceBuilder startingTimestamp(String startingTimestamp)
        -
        Sets value of "startingTimestamp" option. This option is used to read only changes starting - from the table version that was generated at or after the given timestamp. - -

        - This option is mutually exclusive with startingVersion(String) and startingVersion(long) option.

        -
        -
        Parameters:
        -
        startingTimestamp - The timestamp of the table from which we start reading changes. - Supported formats are: -
          -
        • 2022-02-24
        • -
        • 2022-02-24 04:55:00
        • -
        • 2022-02-24 04:55:00.001
        • -
        • 2022-02-24T04:55:00
        • -
        • 2022-02-24T04:55:00.001
        • -
        • 2022-02-24T04:55:00.001Z
        • -
        -
        -
      • -
      - - - -
        -
      • -

        updateCheckIntervalMillis

        -
        public RowDataContinuousDeltaSourceBuilder updateCheckIntervalMillis(long updateCheckInterval)
        -
        Sets the value for "updateCheckIntervalMillis" option. This option is used to specify the - check interval (in milliseconds) used for periodic Delta table changes checks. - -

        - The default value for this option is 5000 ms.

        -
        -
        Parameters:
        -
        updateCheckInterval - The update check internal in milliseconds.
        -
        -
      • -
      - - - -
        -
      • -

        ignoreDeletes

        -
        public RowDataContinuousDeltaSourceBuilder ignoreDeletes(boolean ignoreDeletes)
        -
        Sets the "ignoreDeletes" option. When set to true, this option allows processing Delta table - versions where data is deleted. -

        - The default value for this option is false.

        -
      • -
      - - - -
        -
      • -

        ignoreChanges

        -
        public RowDataContinuousDeltaSourceBuilder ignoreChanges(boolean ignoreChanges)
        -
        Sets the "ignoreChanges" option. When set to true, this option allows processing Delta table - versions where data is changed (i.e. updated) or deleted. -

        - Note that setting this option to true can lead to duplicate processing of data, as, in the - case of updates, existing rows may be rewritten in new files, and those new files will be - treated as new data and be fully reprocessed. -

        - This option subsumes ignoreDeletes(boolean) option. Therefore, if you set "ignoreChanges" to - true, your stream will not be disrupted by either deletions or updates to the source table. -

        - The default value for this option is false.

        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataContinuousDeltaSourceBuilder option(String optionName,
        -                                                  String optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option String value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataContinuousDeltaSourceBuilder option(String optionName,
        -                                                  boolean optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option boolean value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataContinuousDeltaSourceBuilder option(String optionName,
        -                                                  int optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option int value to set.
        -
        -
      • -
      - - - -
        -
      • -

        option

        -
        public RowDataContinuousDeltaSourceBuilder option(String optionName,
        -                                                  long optionValue)
        -
        Sets a configuration option.
        -
        -
        Parameters:
        -
        optionName - Option name to set.
        -
        optionValue - Option long value to set.
        -
        -
      • -
      - - - -
        -
      • -

        build

        -
        public DeltaSource<org.apache.flink.table.data.RowData> build()
        -
        Creates an instance of DeltaSource for a stream of RowData. Created source - will work in Continuous mode, actively monitoring Delta table for new changes. - -

        - This method can throw DeltaSourceValidationException in case of invalid arguments - passed to Delta source builder.

        -
        -
        Returns:
        -
        New DeltaSource instance.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/package-frame.html b/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/package-frame.html deleted file mode 100644 index ba6daaa7134..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/package-frame.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - -io.delta.flink.source (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - -

io.delta.flink.source

-
-

Classes

- -
- - diff --git a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/package-summary.html b/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/package-summary.html deleted file mode 100644 index 911a0a497a3..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/package-summary.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - -io.delta.flink.source (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.flink.source

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/package-tree.html b/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/package-tree.html deleted file mode 100644 index 454250cab54..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/io/delta/flink/source/package-tree.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - -io.delta.flink.source Class Hierarchy (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.flink.source

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-flink/api/java/overview-frame.html b/connectors/docs/latest/delta-flink/api/java/overview-frame.html deleted file mode 100644 index 0fcaeed613e..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/overview-frame.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - -Overview List (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - -
All Classes
-
-

Packages

- -
-

 

- - diff --git a/connectors/docs/latest/delta-flink/api/java/overview-summary.html b/connectors/docs/latest/delta-flink/api/java/overview-summary.html deleted file mode 100644 index d584cde1828..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/overview-summary.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - -Overview (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
- - - - - - - - - - - - - - - - -
Packages 
PackageDescription
io.delta.flink.sink 
io.delta.flink.source 
-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-flink/api/java/overview-tree.html b/connectors/docs/latest/delta-flink/api/java/overview-tree.html deleted file mode 100644 index fb7bd958350..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/overview-tree.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - -Class Hierarchy (Flink/Delta Connector 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For All Packages

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-flink/api/java/package-list b/connectors/docs/latest/delta-flink/api/java/package-list deleted file mode 100644 index c808a2a72e7..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/package-list +++ /dev/null @@ -1,2 +0,0 @@ -io.delta.flink.sink -io.delta.flink.source diff --git a/connectors/docs/latest/delta-flink/api/java/script.js b/connectors/docs/latest/delta-flink/api/java/script.js deleted file mode 100644 index b3463569314..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/script.js +++ /dev/null @@ -1,30 +0,0 @@ -function show(type) -{ - count = 0; - for (var key in methods) { - var row = document.getElementById(key); - if ((methods[key] & type) != 0) { - row.style.display = ''; - row.className = (count++ % 2) ? rowColor : altColor; - } - else - row.style.display = 'none'; - } - updateTabs(type); -} - -function updateTabs(type) -{ - for (var value in tabs) { - var sNode = document.getElementById(tabs[value][0]); - var spanNode = sNode.firstChild; - if (value == type) { - sNode.className = activeTableTab; - spanNode.innerHTML = tabs[value][1]; - } - else { - sNode.className = tableTab; - spanNode.innerHTML = "" + tabs[value][1] + ""; - } - } -} diff --git a/connectors/docs/latest/delta-flink/api/java/stylesheet.css b/connectors/docs/latest/delta-flink/api/java/stylesheet.css deleted file mode 100644 index 98055b22d6d..00000000000 --- a/connectors/docs/latest/delta-flink/api/java/stylesheet.css +++ /dev/null @@ -1,574 +0,0 @@ -/* Javadoc style sheet */ -/* -Overall document style -*/ - -@import url('resources/fonts/dejavu.css'); - -body { - background-color:#ffffff; - color:#353833; - font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; - font-size:14px; - margin:0; -} -a:link, a:visited { - text-decoration:none; - color:#4A6782; -} -a:hover, a:focus { - text-decoration:none; - color:#bb7a2a; -} -a:active { - text-decoration:none; - color:#4A6782; -} -a[name] { - color:#353833; -} -a[name]:hover { - text-decoration:none; - color:#353833; -} -pre { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; -} -h1 { - font-size:20px; -} -h2 { - font-size:18px; -} -h3 { - font-size:16px; - font-style:italic; -} -h4 { - font-size:13px; -} -h5 { - font-size:12px; -} -h6 { - font-size:11px; -} -ul { - list-style-type:disc; -} -code, tt { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; - margin-top:8px; - line-height:1.4em; -} -dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; -} -table tr td dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - vertical-align:top; - padding-top:4px; -} -sup { - font-size:8px; -} -/* -Document title and Copyright styles -*/ -.clear { - clear:both; - height:0px; - overflow:hidden; -} -.aboutLanguage { - float:right; - padding:0px 21px; - font-size:11px; - z-index:200; - margin-top:-9px; -} -.legalCopy { - margin-left:.5em; -} -.bar a, .bar a:link, .bar a:visited, .bar a:active { - color:#FFFFFF; - text-decoration:none; -} -.bar a:hover, .bar a:focus { - color:#bb7a2a; -} -.tab { - background-color:#0066FF; - color:#ffffff; - padding:8px; - width:5em; - font-weight:bold; -} -/* -Navigation bar styles -*/ -.bar { - background-color:#4D7A97; - color:#FFFFFF; - padding:.8em .5em .4em .8em; - height:auto;/*height:1.8em;*/ - font-size:11px; - margin:0; -} -.topNav { - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.bottomNav { - margin-top:10px; - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.subNav { - background-color:#dee3e9; - float:left; - width:100%; - overflow:hidden; - font-size:12px; -} -.subNav div { - clear:left; - float:left; - padding:0 0 5px 6px; - text-transform:uppercase; -} -ul.navList, ul.subNavList { - float:left; - margin:0 25px 0 0; - padding:0; -} -ul.navList li{ - list-style:none; - float:left; - padding: 5px 6px; - text-transform:uppercase; -} -ul.subNavList li{ - list-style:none; - float:left; -} -.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { - color:#FFFFFF; - text-decoration:none; - text-transform:uppercase; -} -.topNav a:hover, .bottomNav a:hover { - text-decoration:none; - color:#bb7a2a; - text-transform:uppercase; -} -.navBarCell1Rev { - background-color:#F8981D; - color:#253441; - margin: auto 5px; -} -.skipNav { - position:absolute; - top:auto; - left:-9999px; - overflow:hidden; -} -/* -Page header and footer styles -*/ -.header, .footer { - clear:both; - margin:0 20px; - padding:5px 0 0 0; -} -.indexHeader { - margin:10px; - position:relative; -} -.indexHeader span{ - margin-right:15px; -} -.indexHeader h1 { - font-size:13px; -} -.title { - color:#2c4557; - margin:10px 0; -} -.subTitle { - margin:5px 0 0 0; -} -.header ul { - margin:0 0 15px 0; - padding:0; -} -.footer ul { - margin:20px 0 5px 0; -} -.header ul li, .footer ul li { - list-style:none; - font-size:13px; -} -/* -Heading styles -*/ -div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList ul.blockList li.blockList h3 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList li.blockList h3 { - padding:0; - margin:15px 0; -} -ul.blockList li.blockList h2 { - padding:0px 0 20px 0; -} -/* -Page layout container styles -*/ -.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { - clear:both; - padding:10px 20px; - position:relative; -} -.indexContainer { - margin:10px; - position:relative; - font-size:12px; -} -.indexContainer h2 { - font-size:13px; - padding:0 0 3px 0; -} -.indexContainer ul { - margin:0; - padding:0; -} -.indexContainer ul li { - list-style:none; - padding-top:2px; -} -.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { - font-size:12px; - font-weight:bold; - margin:10px 0 0 0; - color:#4E4E4E; -} -.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { - margin:5px 0 10px 0px; - font-size:14px; - font-family:'DejaVu Sans Mono',monospace; -} -.serializedFormContainer dl.nameValue dt { - margin-left:1px; - font-size:1.1em; - display:inline; - font-weight:bold; -} -.serializedFormContainer dl.nameValue dd { - margin:0 0 0 1px; - font-size:1.1em; - display:inline; -} -/* -List styles -*/ -ul.horizontal li { - display:inline; - font-size:0.9em; -} -ul.inheritance { - margin:0; - padding:0; -} -ul.inheritance li { - display:inline; - list-style:none; -} -ul.inheritance li ul.inheritance { - margin-left:15px; - padding-left:15px; - padding-top:1px; -} -ul.blockList, ul.blockListLast { - margin:10px 0 10px 0; - padding:0; -} -ul.blockList li.blockList, ul.blockListLast li.blockList { - list-style:none; - margin-bottom:15px; - line-height:1.4; -} -ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { - padding:0px 20px 5px 10px; - border:1px solid #ededed; - background-color:#f8f8f8; -} -ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { - padding:0 0 5px 8px; - background-color:#ffffff; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { - margin-left:0; - padding-left:0; - padding-bottom:15px; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { - list-style:none; - border-bottom:none; - padding-bottom:0; -} -table tr td dl, table tr td dl dt, table tr td dl dd { - margin-top:0; - margin-bottom:1px; -} -/* -Table styles -*/ -.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { - width:100%; - border-left:1px solid #EEE; - border-right:1px solid #EEE; - border-bottom:1px solid #EEE; -} -.overviewSummary, .memberSummary { - padding:0px; -} -.overviewSummary caption, .memberSummary caption, .typeSummary caption, -.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { - position:relative; - text-align:left; - background-repeat:no-repeat; - color:#253441; - font-weight:bold; - clear:none; - overflow:hidden; - padding:0px; - padding-top:10px; - padding-left:1px; - margin:0px; - white-space:pre; -} -.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, -.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, -.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, -.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, -.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, -.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, -.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, -.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { - color:#FFFFFF; -} -.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, -.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - padding-bottom:7px; - display:inline-block; - float:left; - background-color:#F8981D; - border: none; - height:16px; -} -.memberSummary caption span.activeTableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#F8981D; - height:16px; -} -.memberSummary caption span.tableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#4D7A97; - height:16px; -} -.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { - padding-top:0px; - padding-left:0px; - padding-right:0px; - background-image:none; - float:none; - display:inline; -} -.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, -.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { - display:none; - width:5px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .activeTableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .tableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - background-color:#4D7A97; - float:left; - -} -.overviewSummary td, .memberSummary td, .typeSummary td, -.useSummary td, .constantsSummary td, .deprecatedSummary td { - text-align:left; - padding:0px 0px 12px 10px; -} -th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, -td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ - vertical-align:top; - padding-right:0px; - padding-top:8px; - padding-bottom:3px; -} -th.colFirst, th.colLast, th.colOne, .constantsSummary th { - background:#dee3e9; - text-align:left; - padding:8px 3px 3px 7px; -} -td.colFirst, th.colFirst { - white-space:nowrap; - font-size:13px; -} -td.colLast, th.colLast { - font-size:13px; -} -td.colOne, th.colOne { - font-size:13px; -} -.overviewSummary td.colFirst, .overviewSummary th.colFirst, -.useSummary td.colFirst, .useSummary th.colFirst, -.overviewSummary td.colOne, .overviewSummary th.colOne, -.memberSummary td.colFirst, .memberSummary th.colFirst, -.memberSummary td.colOne, .memberSummary th.colOne, -.typeSummary td.colFirst{ - width:25%; - vertical-align:top; -} -td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { - font-weight:bold; -} -.tableSubHeadingColor { - background-color:#EEEEFF; -} -.altColor { - background-color:#FFFFFF; -} -.rowColor { - background-color:#EEEEEF; -} -/* -Content styles -*/ -.description pre { - margin-top:0; -} -.deprecatedContent { - margin:0; - padding:10px 0; -} -.docSummary { - padding:0; -} - -ul.blockList ul.blockList ul.blockList li.blockList h3 { - font-style:normal; -} - -div.block { - font-size:14px; - font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; -} - -td.colLast div { - padding-top:0px; -} - - -td.colLast a { - padding-bottom:3px; -} -/* -Formatting effect styles -*/ -.sourceLineNo { - color:green; - padding:0 30px 0 0; -} -h1.hidden { - visibility:hidden; - overflow:hidden; - font-size:10px; -} -.block { - display:block; - margin:3px 10px 2px 0px; - color:#474747; -} -.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, -.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, -.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { - font-weight:bold; -} -.deprecationComment, .emphasizedPhrase, .interfaceName { - font-style:italic; -} - -div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, -div.block div.block span.interfaceName { - font-style:normal; -} - -div.contentContainer ul.blockList li.blockList h2{ - padding-bottom:0px; -} diff --git a/connectors/docs/latest/delta-standalone/api/java/allclasses-frame.html b/connectors/docs/latest/delta-standalone/api/java/allclasses-frame.html deleted file mode 100644 index 2cd19b9c6b3..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/allclasses-frame.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - -All Classes (Delta Standalone 0.6.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/latest/delta-standalone/api/java/allclasses-noframe.html b/connectors/docs/latest/delta-standalone/api/java/allclasses-noframe.html deleted file mode 100644 index 20beac65d20..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/allclasses-noframe.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - -All Classes (Delta Standalone 0.6.0 JavaDoc) - - - - - -

All Classes

-
- -
- - diff --git a/connectors/docs/latest/delta-standalone/api/java/constant-values.html b/connectors/docs/latest/delta-standalone/api/java/constant-values.html deleted file mode 100644 index 721d086fa0a..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/constant-values.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - -Constant Field Values (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Constant Field Values

-

Contents

- -
-
- - -

io.delta.*

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/deprecated-list.html b/connectors/docs/latest/delta-standalone/api/java/deprecated-list.html deleted file mode 100644 index f6209b0bd56..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/deprecated-list.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - -Deprecated List (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Deprecated API

-

Contents

- -
-
- - - -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/help-doc.html b/connectors/docs/latest/delta-standalone/api/java/help-doc.html deleted file mode 100644 index dcd95e0284e..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/help-doc.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - -API Help (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

How This API Document Is Organized

-
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
-
-
- -This help file applies to API documentation generated using the standard doclet.
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/index-all.html b/connectors/docs/latest/delta-standalone/api/java/index-all.html deleted file mode 100644 index be58d05fb14..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/index-all.html +++ /dev/null @@ -1,1519 +0,0 @@ - - - - - -Index (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
A B C D E F G H I J L M N O P R S T U V W  - - -

A

-
-
Action - Interface in io.delta.standalone.actions
-
-
A marker interface for all actions that can be applied to a Delta table.
-
-
add(StructField) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new field.
-
-
add(String, DataType) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new nullable field with no metadata.
-
-
add(String, DataType, boolean) - Method in class io.delta.standalone.types.StructType
-
-
Creates a new StructType by adding a new field with no metadata.
-
-
AddCDCFile - Class in io.delta.standalone.actions
-
-
A change file containing CDC data for the Delta version it's within.
-
-
AddCDCFile(String, Map<String, String>, long, Map<String, String>) - Constructor for class io.delta.standalone.actions.AddCDCFile
-
 
-
AddFile - Class in io.delta.standalone.actions
-
-
Represents an action that adds a new file to the table.
-
-
AddFile(String, Map<String, String>, long, long, boolean, String, Map<String, String>) - Constructor for class io.delta.standalone.actions.AddFile
-
 
-
AddFile.Builder - Class in io.delta.standalone.actions
-
-
Builder class for AddFile.
-
-
And - Class in io.delta.standalone.expressions
-
-
Evaluates logical expr1 AND expr2 for new And(expr1, expr2).
-
-
And(Expression, Expression) - Constructor for class io.delta.standalone.expressions.And
-
 
-
ArrayType - Class in io.delta.standalone.types
-
-
The data type for collections of multiple values.
-
-
ArrayType(DataType, boolean) - Constructor for class io.delta.standalone.types.ArrayType
-
 
-
- - - -

B

-
-
BinaryComparison - Class in io.delta.standalone.expressions
-
-
A BinaryOperator that compares the left and right Expressions and evaluates to a - boolean value.
-
-
BinaryExpression - Class in io.delta.standalone.expressions
-
-
An Expression with two inputs and one output.
-
-
BinaryOperator - Class in io.delta.standalone.expressions
-
-
A BinaryExpression that is an operator, meaning the string representation is - x symbol y, rather than funcName(x, y).
-
-
BinaryType - Class in io.delta.standalone.types
-
-
The data type representing byte[] values.
-
-
BinaryType() - Constructor for class io.delta.standalone.types.BinaryType
-
 
-
BooleanType - Class in io.delta.standalone.types
-
-
The data type representing boolean values.
-
-
BooleanType() - Constructor for class io.delta.standalone.types.BooleanType
-
 
-
build() - Method in class io.delta.standalone.actions.AddFile.Builder
-
-
Builds an AddFile using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
-
Builds a CommitInfo using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.JobInfo.Builder
-
-
Builds a JobInfo using the provided parameters.
-
-
build() - Method in class io.delta.standalone.actions.Metadata.Builder
-
-
Builds a Metadata using the provided parameters.
-
-
build() - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
builder(String, Map<String, String>, long, long, boolean) - Static method in class io.delta.standalone.actions.AddFile
-
 
-
Builder(String, Map<String, String>, long, long, boolean) - Constructor for class io.delta.standalone.actions.AddFile.Builder
-
 
-
builder() - Static method in class io.delta.standalone.actions.CommitInfo
-
 
-
Builder() - Constructor for class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
builder(String) - Static method in class io.delta.standalone.actions.JobInfo
-
 
-
Builder(String) - Constructor for class io.delta.standalone.actions.JobInfo.Builder
-
 
-
builder() - Static method in class io.delta.standalone.actions.Metadata
-
 
-
Builder() - Constructor for class io.delta.standalone.actions.Metadata.Builder
-
 
-
builder() - Static method in class io.delta.standalone.types.FieldMetadata
-
 
-
Builder() - Constructor for class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
ByteType - Class in io.delta.standalone.types
-
-
The data type representing byte values.
-
-
ByteType() - Constructor for class io.delta.standalone.types.ByteType
-
 
-
- - - -

C

-
-
children() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
children() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
children() - Method in class io.delta.standalone.expressions.In
-
 
-
children() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
children() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
CloseableIterator<T> - Interface in io.delta.standalone.data
-
-
An Iterator that also implements the Closeable interface.
-
-
clusterId(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
Column - Class in io.delta.standalone.expressions
-
-
A column whose row-value will be computed based on the data in a RowRecord.
-
-
Column(String, DataType) - Constructor for class io.delta.standalone.expressions.Column
-
 
-
column(String) - Method in class io.delta.standalone.types.StructType
-
-
Creates a Column expression for the field with the given fieldName.
-
-
commit(Iterable<T>, Operation, String) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Modifies the state of the log by adding a new commit that is based on a read at the table's - latest version as of this transaction's instantiation.
-
-
CommitInfo - Class in io.delta.standalone.actions
-
-
Holds provenance information about changes to the table.
-
-
CommitInfo(Optional<Long>, Timestamp, Optional<String>, Optional<String>, String, Map<String, String>, Optional<JobInfo>, Optional<NotebookInfo>, Optional<String>, Optional<Long>, Optional<String>, Optional<Boolean>, Optional<Map<String, String>>, Optional<String>) - Constructor for class io.delta.standalone.actions.CommitInfo
-
 
-
CommitInfo(Optional<Long>, Timestamp, Optional<String>, Optional<String>, String, Map<String, String>, Optional<JobInfo>, Optional<NotebookInfo>, Optional<String>, Optional<Long>, Optional<String>, Optional<Boolean>, Optional<Map<String, String>>, Optional<String>, Optional<String>) - Constructor for class io.delta.standalone.actions.CommitInfo
-
 
-
CommitInfo.Builder - Class in io.delta.standalone.actions
-
-
Builder class for CommitInfo.
-
-
CommitResult - Class in io.delta.standalone
-
- -
-
CommitResult(long) - Constructor for class io.delta.standalone.CommitResult
-
 
-
ConcurrentAppendException - Exception in io.delta.standalone.exceptions
-
-
Thrown when files are added that would have been read by the current transaction.
-
-
ConcurrentAppendException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentAppendException
-
 
-
ConcurrentDeleteDeleteException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the current transaction deletes data that was deleted by a concurrent transaction.
-
-
ConcurrentDeleteDeleteException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentDeleteDeleteException
-
 
-
ConcurrentDeleteReadException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the current transaction reads data that was deleted by a concurrent transaction.
-
-
ConcurrentDeleteReadException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentDeleteReadException
-
 
-
ConcurrentTransactionException - Exception in io.delta.standalone.exceptions
-
-
Thrown when concurrent transaction both attempt to update the same idempotent transaction.
-
-
ConcurrentTransactionException(String) - Constructor for exception io.delta.standalone.exceptions.ConcurrentTransactionException
-
 
-
configuration(Map<String, String>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
contains(String) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
containsNull() - Method in class io.delta.standalone.types.ArrayType
-
 
-
copyBuilder() - Method in class io.delta.standalone.actions.Metadata
-
 
-
createdTime(Long) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
createdTime(Optional<Long>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
- - - -

D

-
-
dataType() - Method in class io.delta.standalone.expressions.Column
-
 
-
dataType() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
dataType() - Method in class io.delta.standalone.expressions.Literal
-
 
-
dataType() - Method in interface io.delta.standalone.expressions.Predicate
-
 
-
DataType - Class in io.delta.standalone.types
-
-
The base type of all io.delta.standalone data types.
-
-
DataType() - Constructor for class io.delta.standalone.types.DataType
-
 
-
DateType - Class in io.delta.standalone.types
-
-
A date type, supporting "0001-01-01" through "9999-12-31".
-
-
DateType() - Constructor for class io.delta.standalone.types.DateType
-
 
-
DecimalType - Class in io.delta.standalone.types
-
-
The data type representing java.math.BigDecimal values.
-
-
DecimalType(int, int) - Constructor for class io.delta.standalone.types.DecimalType
-
 
-
DeltaConcurrentModificationException - Exception in io.delta.standalone.exceptions
-
-
The basic class for all Delta Standalone commit conflict exceptions.
-
-
DeltaConcurrentModificationException(String) - Constructor for exception io.delta.standalone.exceptions.DeltaConcurrentModificationException
-
 
-
DeltaLog - Interface in io.delta.standalone
-
-
Represents the transaction logs of a Delta table.
-
-
DeltaScan - Interface in io.delta.standalone
-
-
Provides access to an iterator over the files in this snapshot.
-
-
DeltaStandaloneException - Exception in io.delta.standalone.exceptions
-
-
Thrown when a query fails, usually because the query itself is invalid.
-
-
DeltaStandaloneException() - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
DeltaStandaloneException(String) - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
DeltaStandaloneException(String, Throwable) - Constructor for exception io.delta.standalone.exceptions.DeltaStandaloneException
-
 
-
deltaToParquet(StructType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, Boolean) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, ParquetSchemaConverter.ParquetOutputTimestampType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
deltaToParquet(StructType, Boolean, ParquetSchemaConverter.ParquetOutputTimestampType) - Static method in class io.delta.standalone.util.ParquetSchemaConverter
-
-
:: DeveloperApi ::
-
-
description(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
DoubleType - Class in io.delta.standalone.types
-
-
The data type representing double values.
-
-
DoubleType() - Constructor for class io.delta.standalone.types.DoubleType
-
 
-
- - - -

E

-
-
engineInfo(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.AddFile
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Format
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.JobInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Metadata
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.Protocol
-
 
-
equals(Object) - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.Column
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.Literal
-
 
-
equals(Object) - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
equals(Object) - Method in class io.delta.standalone.types.ArrayType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.DataType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.DecimalType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
equals(Object) - Method in class io.delta.standalone.types.MapType
-
 
-
equals(Object) - Method in class io.delta.standalone.types.StructField
-
 
-
equals(Object) - Method in class io.delta.standalone.types.StructType
-
 
-
EqualTo - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 = expr2 for new EqualTo(expr1, expr2).
-
-
EqualTo(Expression, Expression) - Constructor for class io.delta.standalone.expressions.EqualTo
-
 
-
equivalent(DataType) - Method in class io.delta.standalone.types.DataType
-
 
-
equivalent(DataType) - Method in class io.delta.standalone.types.DecimalType
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.Column
-
 
-
eval(RowRecord) - Method in interface io.delta.standalone.expressions.Expression
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.In
-
-
This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide.
-
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.IsNotNull
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.IsNull
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.Literal
-
 
-
eval(RowRecord) - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
executionTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to execute the entire operation.
-
-
Expression - Interface in io.delta.standalone.expressions
-
-
An expression in Delta Standalone.
-
-
- - - -

F

-
-
False - Static variable in class io.delta.standalone.expressions.Literal
-
 
-
FieldMetadata - Class in io.delta.standalone.types
-
-
The metadata for a given StructField.
-
-
FieldMetadata.Builder - Class in io.delta.standalone.types
-
-
Builder class for FieldMetadata.
-
-
FileAction - Interface in io.delta.standalone.actions
-
-
Generic interface for Actions pertaining to the addition and removal of files.
-
-
FloatType - Class in io.delta.standalone.types
-
-
The data type representing float values.
-
-
FloatType() - Constructor for class io.delta.standalone.types.FloatType
-
 
-
Format - Class in io.delta.standalone.actions
-
-
A specification of the encoding for the files stored in a table.
-
-
Format(String, Map<String, String>) - Constructor for class io.delta.standalone.actions.Format
-
 
-
Format() - Constructor for class io.delta.standalone.actions.Format
-
 
-
format(Format) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
forTable(Configuration, String) - Static method in interface io.delta.standalone.DeltaLog
-
-
Create a DeltaLog instance representing the table located at the provided - path.
-
-
forTable(Configuration, Path) - Static method in interface io.delta.standalone.DeltaLog
-
-
Create a DeltaLog instance representing the table located at the provided - path.
-
-
fromJson(String) - Static method in class io.delta.standalone.types.DataType
-
-
Parses the input json into a DataType.
-
-
- - - -

G

-
-
get(String) - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
get(String) - Method in class io.delta.standalone.types.StructType
-
 
-
getActions() - Method in class io.delta.standalone.VersionLog
-
 
-
getActionsIterator() - Method in class io.delta.standalone.VersionLog
-
 
-
getAllFiles() - Method in interface io.delta.standalone.Snapshot
-
 
-
getAppId() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getBigDecimal(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.math.BigDecimal.
-
-
getBinary(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as binary (byte array).
-
-
getBoolean(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive boolean.
-
-
getByte(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive byte.
-
-
getCatalogString() - Method in class io.delta.standalone.types.DataType
-
 
-
getChanges(long, boolean) - Method in interface io.delta.standalone.DeltaLog
-
-
Get all actions starting from startVersion (inclusive) in increasing order of - committed version.
-
-
getChild() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
getClusterId() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getCommitInfoAt(long) - Method in interface io.delta.standalone.DeltaLog
-
 
-
getConfiguration() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getCreatedTime() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getDataType() - Method in class io.delta.standalone.types.StructField
-
 
-
getDate(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.sql.Date.
-
-
getDeletionTimestamp() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getDescription() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getDouble(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive double.
-
-
getElementType() - Method in class io.delta.standalone.types.ArrayType
-
 
-
getEngineInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getEntries() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
getFieldNames() - Method in class io.delta.standalone.types.StructType
-
 
-
getFields() - Method in class io.delta.standalone.types.StructType
-
 
-
getFiles() - Method in interface io.delta.standalone.DeltaScan
-
-
Creates a CloseableIterator over files belonging to this snapshot.
-
-
getFloat(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive float.
-
-
getFormat() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getId() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getInputPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getInt(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive int.
-
-
getIsBlindAppend() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getIsolationLevel() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getJobId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getJobInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getJobName() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getJobOwnerId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getKeyType() - Method in class io.delta.standalone.types.MapType
-
 
-
getLastUpdated() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getLeft() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
getLength() - Method in interface io.delta.standalone.data.RowRecord
-
 
-
getList(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.util.List<T> object.
-
-
getLong(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive long.
-
-
getMap(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
-
-
getMetadata() - Method in interface io.delta.standalone.Snapshot
-
 
-
getMetadata() - Method in class io.delta.standalone.types.StructField
-
 
-
getMetrics() - Method in class io.delta.standalone.Operation
-
 
-
getMinReaderVersion() - Method in class io.delta.standalone.actions.Protocol
-
 
-
getMinWriterVersion() - Method in class io.delta.standalone.actions.Protocol
-
 
-
getModificationTime() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getName() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getName() - Method in class io.delta.standalone.Operation
-
 
-
getName() - Method in class io.delta.standalone.types.StructField
-
 
-
getNotebookId() - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
getNotebookInfo() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperation() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperationMetrics() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOperationParameters() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getOptions() - Method in class io.delta.standalone.actions.Format
-
 
-
getParameters() - Method in class io.delta.standalone.Operation
-
 
-
getPartitionColumns() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getPartitionValues() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getPath() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getPath() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getPath() - Method in interface io.delta.standalone.actions.FileAction
-
 
-
getPath() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getPath() - Method in interface io.delta.standalone.DeltaLog
-
 
-
getPrecision() - Method in class io.delta.standalone.types.DecimalType
-
 
-
getProvider() - Method in class io.delta.standalone.actions.Format
-
 
-
getPushedPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getReadVersion() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getRecord(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a RowRecord object.
-
-
getResidualPredicate() - Method in interface io.delta.standalone.DeltaScan
-
 
-
getRight() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
getRunId() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getScale() - Method in class io.delta.standalone.types.DecimalType
-
 
-
getSchema() - Method in class io.delta.standalone.actions.Metadata
-
 
-
getSchema() - Method in interface io.delta.standalone.data.RowRecord
-
 
-
getShort(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a primitive short.
-
-
getSimpleString() - Method in class io.delta.standalone.types.ByteType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.DataType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.IntegerType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.LongType
-
 
-
getSimpleString() - Method in class io.delta.standalone.types.ShortType
-
 
-
getSize() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getSize() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getSize() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getSnapshotForTimestampAsOf(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Travel back in time to the latest Snapshot that was generated at or before - timestamp.
-
-
getSnapshotForVersionAsOf(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Travel back in time to the Snapshot with the provided version number.
-
-
getStats() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getString(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a String object.
-
-
getTags() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
getTags() - Method in class io.delta.standalone.actions.AddFile
-
 
-
getTags() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
getTimestamp() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getTimestamp(String) - Method in interface io.delta.standalone.data.RowRecord
-
-
Retrieves value from data record and returns the value as a java.sql.Timestamp.
-
-
getTreeString() - Method in class io.delta.standalone.types.StructType
-
 
-
getTriggerType() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
getTypeName() - Method in class io.delta.standalone.types.DataType
-
 
-
getUserId() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getUserMetadata() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getUserMetadata() - Method in class io.delta.standalone.Operation
-
 
-
getUserName() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getValueType() - Method in class io.delta.standalone.types.MapType
-
 
-
getVersion() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
getVersion() - Method in class io.delta.standalone.actions.SetTransaction
-
 
-
getVersion() - Method in class io.delta.standalone.CommitResult
-
 
-
getVersion() - Method in interface io.delta.standalone.Snapshot
-
 
-
getVersion() - Method in class io.delta.standalone.VersionLog
-
 
-
getVersionAtOrAfterTimestamp(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Returns the latest version that was committed at or after timestamp.
-
-
getVersionBeforeOrAtTimestamp(long) - Method in interface io.delta.standalone.DeltaLog
-
-
Returns the latest version that was committed before or at timestamp.
-
-
GreaterThan - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 > expr2 for new GreaterThan(expr1, expr2).
-
-
GreaterThan(Expression, Expression) - Constructor for class io.delta.standalone.expressions.GreaterThan
-
 
-
GreaterThanOrEqual - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 >= expr2 for new GreaterThanOrEqual(expr1, expr2).
-
-
GreaterThanOrEqual(Expression, Expression) - Constructor for class io.delta.standalone.expressions.GreaterThanOrEqual
-
 
-
- - - -

H

-
-
hashCode() - Method in class io.delta.standalone.actions.AddFile
-
 
-
hashCode() - Method in class io.delta.standalone.actions.CommitInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Format
-
 
-
hashCode() - Method in class io.delta.standalone.actions.JobInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Metadata
-
 
-
hashCode() - Method in class io.delta.standalone.actions.NotebookInfo
-
 
-
hashCode() - Method in class io.delta.standalone.actions.Protocol
-
 
-
hashCode() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.BinaryExpression
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.Column
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.Literal
-
 
-
hashCode() - Method in class io.delta.standalone.expressions.UnaryExpression
-
 
-
hashCode() - Method in class io.delta.standalone.types.ArrayType
-
 
-
hashCode() - Method in class io.delta.standalone.types.DataType
-
 
-
hashCode() - Method in class io.delta.standalone.types.DecimalType
-
 
-
hashCode() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
hashCode() - Method in class io.delta.standalone.types.MapType
-
 
-
hashCode() - Method in class io.delta.standalone.types.StructField
-
 
-
hashCode() - Method in class io.delta.standalone.types.StructType
-
 
-
- - - -

I

-
-
id(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
In - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is in exprList for new In(expr, exprList).
-
-
In(Expression, List<? extends Expression>) - Constructor for class io.delta.standalone.expressions.In
-
 
-
IntegerType - Class in io.delta.standalone.types
-
-
The data type representing int values.
-
-
IntegerType() - Constructor for class io.delta.standalone.types.IntegerType
-
 
-
io.delta.standalone - package io.delta.standalone
-
 
-
io.delta.standalone.actions - package io.delta.standalone.actions
-
 
-
io.delta.standalone.data - package io.delta.standalone.data
-
 
-
io.delta.standalone.exceptions - package io.delta.standalone.exceptions
-
 
-
io.delta.standalone.expressions - package io.delta.standalone.expressions
-
 
-
io.delta.standalone.types - package io.delta.standalone.types
-
 
-
io.delta.standalone.util - package io.delta.standalone.util
-
 
-
isBlindAppend(Boolean) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.AddCDCFile
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.AddFile
-
 
-
isDataChange() - Method in interface io.delta.standalone.actions.FileAction
-
 
-
isDataChange() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
isExtendedFileMetadata() - Method in class io.delta.standalone.actions.RemoveFile
-
 
-
IsNotNull - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is not null for new IsNotNull(expr).
-
-
IsNotNull(Expression) - Constructor for class io.delta.standalone.expressions.IsNotNull
-
 
-
IsNull - Class in io.delta.standalone.expressions
-
-
Evaluates if expr is null for new IsNull(expr).
-
-
IsNull(Expression) - Constructor for class io.delta.standalone.expressions.IsNull
-
 
-
isNullable() - Method in class io.delta.standalone.types.StructField
-
 
-
isNullAt(String) - Method in interface io.delta.standalone.data.RowRecord
-
 
-
isolationLevel(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
isWriteCompatible(StructType) - Method in class io.delta.standalone.types.StructType
-
-
Whether a new schema can replace this existing schema in a Delta table without rewriting data - files in the table.
-
-
- - - -

J

-
-
jobInfo(JobInfo) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
JobInfo - Class in io.delta.standalone.actions
-
-
Represents the Databricks Job information that committed to the Delta table.
-
-
JobInfo(String, String, String, String, String) - Constructor for class io.delta.standalone.actions.JobInfo
-
 
-
JobInfo.Builder - Class in io.delta.standalone.actions
-
-
Builder class for JobInfo.
-
-
jobName(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
jobOwnerId(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
- - - -

L

-
-
LeafExpression - Class in io.delta.standalone.expressions
-
-
An Expression with no children.
-
-
length() - Method in class io.delta.standalone.types.StructType
-
 
-
LessThan - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 < expr2 for new LessThan(expr1, expr2).
-
-
LessThan(Expression, Expression) - Constructor for class io.delta.standalone.expressions.LessThan
-
 
-
LessThanOrEqual - Class in io.delta.standalone.expressions
-
-
Evaluates expr1 <= expr2 for new LessThanOrEqual(expr1, expr2).
-
-
LessThanOrEqual(Expression, Expression) - Constructor for class io.delta.standalone.expressions.LessThanOrEqual
-
 
-
Literal - Class in io.delta.standalone.expressions
-
-
A literal value.
-
-
LongType - Class in io.delta.standalone.types
-
-
The data type representing long values.
-
-
LongType() - Constructor for class io.delta.standalone.types.LongType
-
 
-
- - - -

M

-
-
MapType - Class in io.delta.standalone.types
-
-
The data type for Maps.
-
-
MapType(DataType, DataType, boolean) - Constructor for class io.delta.standalone.types.MapType
-
 
-
markFilesAsRead(Expression) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Mark files matched by the readPredicate as read by this transaction.
-
-
Metadata - Class in io.delta.standalone.actions
-
-
Updates the metadata of the table.
-
-
Metadata(String, String, String, Format, List<String>, Map<String, String>, Optional<Long>, StructType) - Constructor for class io.delta.standalone.actions.Metadata
-
 
-
metadata() - Method in interface io.delta.standalone.OptimisticTransaction
-
 
-
Metadata.Builder - Class in io.delta.standalone.actions
-
-
Builder class for Metadata.
-
-
MetadataChangedException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the metadata of the Delta table has changed between the time of read - and the time of commit.
-
-
MetadataChangedException(String) - Constructor for exception io.delta.standalone.exceptions.MetadataChangedException
-
 
-
Metrics() - Constructor for class io.delta.standalone.Operation.Metrics
-
 
-
- - - -

N

-
-
name(String) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
name() - Method in class io.delta.standalone.expressions.Column
-
 
-
Not - Class in io.delta.standalone.expressions
-
-
Evaluates logical NOT expr for new Not(expr).
-
-
Not(Expression) - Constructor for class io.delta.standalone.expressions.Not
-
 
-
notebookInfo(NotebookInfo) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
NotebookInfo - Class in io.delta.standalone.actions
-
-
Represents the Databricks Notebook information that committed to the Delta table.
-
-
NotebookInfo(String) - Constructor for class io.delta.standalone.actions.NotebookInfo
-
 
-
nullSafeEval(Object, Object) - Method in class io.delta.standalone.expressions.And
-
 
-
nullSafeEval(Object) - Method in class io.delta.standalone.expressions.Not
-
 
-
nullSafeEval(Object, Object) - Method in class io.delta.standalone.expressions.Or
-
 
-
NullType - Class in io.delta.standalone.types
-
-
The data type representing null values.
-
-
NullType() - Constructor for class io.delta.standalone.types.NullType
-
 
-
numAddedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files added.
-
-
numConvertedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of parquet files that have been converted.
-
-
numCopiedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows copied in the process of deleting files.
-
-
numDeletedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows removed.
-
-
numFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files written.
-
-
numOutputBytes - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Size in bytes of the written contents.
-
-
numOutputRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows written.
-
-
numRemovedFiles - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files removed.
-
-
numSourceRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows in the source table.
-
-
numTargetFilesAdded - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number files added to the sink(target).
-
-
numTargetFilesRemoved - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of files removed from the sink(target).
-
-
numTargetRowsCopied - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of target rows copied.
-
-
numTargetRowsDeleted - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows deleted in the target table.
-
-
numTargetRowsInserted - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows inserted into the target table.
-
-
numTargetRowsUpdated - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows updated in the target table.
-
-
numUpdatedRows - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Number of rows updated.
-
-
- - - -

O

-
-
of(int) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(boolean) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(byte[]) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(Date) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(BigDecimal) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(double) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(float) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(long) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(short) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(String) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(Timestamp) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
of(byte) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
ofNull(DataType) - Static method in class io.delta.standalone.expressions.Literal
-
 
-
open() - Method in interface io.delta.standalone.Snapshot
-
-
Creates a CloseableIterator which can iterate over data belonging to this snapshot.
-
-
operation(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
Operation - Class in io.delta.standalone
-
-
An operation that can be performed on a Delta table.
-
-
Operation(Operation.Name) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>, Map<String, String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation(Operation.Name, Map<String, String>, Map<String, String>, Optional<String>) - Constructor for class io.delta.standalone.Operation
-
 
-
Operation.Metrics - Class in io.delta.standalone
-
-
Some possible operation metrics and their suggested corresponding operation types.
-
-
Operation.Name - Enum in io.delta.standalone
-
-
Supported operation types.
-
-
operationMetrics(Map<String, String>) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
operationParameters(Map<String, String>) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
OptimisticTransaction - Interface in io.delta.standalone
-
-
Used to perform a set of reads in a transaction and then commit a set of updates to the - state of the log.
-
-
Or - Class in io.delta.standalone.expressions
-
-
Evaluates logical expr1 OR expr2 for new Or(expr1, expr2).
-
-
Or(Expression, Expression) - Constructor for class io.delta.standalone.expressions.Or
-
 
-
outputTimestampTypeDefault - Static variable in class io.delta.standalone.util.ParquetSchemaConverter
-
 
-
- - - -

P

-
-
ParquetSchemaConverter - Class in io.delta.standalone.util
-
-
:: DeveloperApi ::
-
-
ParquetSchemaConverter.ParquetOutputTimestampType - Enum in io.delta.standalone.util
-
-
:: DeveloperApi ::
-
-
partitionColumns(List<String>) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
Predicate - Interface in io.delta.standalone.expressions
-
-
An Expression that defines a relation on inputs.
-
-
Protocol - Class in io.delta.standalone.actions
-
-
Used to block older clients from reading or writing the log when backwards - incompatible changes are made to the protocol.
-
-
Protocol(int, int) - Constructor for class io.delta.standalone.actions.Protocol
-
 
-
ProtocolChangedException - Exception in io.delta.standalone.exceptions
-
-
Thrown when the protocol version has changed between the time of read and the time of commit.
-
-
ProtocolChangedException(String) - Constructor for exception io.delta.standalone.exceptions.ProtocolChangedException
-
 
-
putBoolean(String, boolean) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putBooleanArray(String, Boolean[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putDouble(String, double) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putDoubleArray(String, Double[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putLong(String, long) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putLongArray(String, Long[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putMetadata(String, FieldMetadata) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putMetadataArray(String, FieldMetadata[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putNull(String) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putString(String, String) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
putStringArray(String, String[]) - Method in class io.delta.standalone.types.FieldMetadata.Builder
-
 
-
- - - -

R

-
-
readVersion(Long) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
readVersion() - Method in interface io.delta.standalone.OptimisticTransaction
-
 
-
readWholeTable() - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Mark the entire table as tainted (i.e.
-
-
references() - Method in class io.delta.standalone.expressions.Column
-
 
-
references() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
references() - Method in class io.delta.standalone.expressions.LeafExpression
-
 
-
remove() - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(long) - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(boolean) - Method in class io.delta.standalone.actions.AddFile
-
 
-
remove(long, boolean) - Method in class io.delta.standalone.actions.AddFile
-
 
-
RemoveFile - Class in io.delta.standalone.actions
-
-
Logical removal of a given file from the reservoir.
-
-
RemoveFile(String, Optional<Long>, boolean, boolean, Map<String, String>, Optional<Long>, Map<String, String>) - Constructor for class io.delta.standalone.actions.RemoveFile
-
-
Deprecated. -
RemoveFile should be created from AddFile.remove() instead.
-
-
-
rewriteTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to rewrite the matched files.
-
-
RowRecord - Interface in io.delta.standalone.data
-
-
Represents one row of data containing a non-empty collection of fieldName - value pairs.
-
-
runId(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
- - - -

S

-
-
scan() - Method in interface io.delta.standalone.Snapshot
-
 
-
scan(Expression) - Method in interface io.delta.standalone.Snapshot
-
 
-
scanTimeMs - Static variable in class io.delta.standalone.Operation.Metrics
-
-
Time taken to scan the files for matches.
-
-
schema(StructType) - Method in class io.delta.standalone.actions.Metadata.Builder
-
 
-
SetTransaction - Class in io.delta.standalone.actions
-
-
Sets the committed version for a given application.
-
-
SetTransaction(String, long, Optional<Long>) - Constructor for class io.delta.standalone.actions.SetTransaction
-
 
-
ShortType - Class in io.delta.standalone.types
-
-
The data type representing short values.
-
-
ShortType() - Constructor for class io.delta.standalone.types.ShortType
-
 
-
snapshot() - Method in interface io.delta.standalone.DeltaLog
-
 
-
Snapshot - Interface in io.delta.standalone
-
-
Snapshot provides APIs to access the Delta table state (such as table metadata, active - files) at some version.
-
-
startTransaction() - Method in interface io.delta.standalone.DeltaLog
-
-
Returns a new OptimisticTransaction that can be used to read the current state of the - log and then commit updates.
-
-
stats(String) - Method in class io.delta.standalone.actions.AddFile.Builder
-
 
-
StringType - Class in io.delta.standalone.types
-
-
The data type representing String values.
-
-
StringType() - Constructor for class io.delta.standalone.types.StringType
-
 
-
StructField - Class in io.delta.standalone.types
-
-
A field inside a StructType.
-
-
StructField(String, DataType) - Constructor for class io.delta.standalone.types.StructField
-
-
Constructor with default nullable = true.
-
-
StructField(String, DataType, boolean) - Constructor for class io.delta.standalone.types.StructField
-
 
-
StructField(String, DataType, boolean, FieldMetadata) - Constructor for class io.delta.standalone.types.StructField
-
 
-
StructType - Class in io.delta.standalone.types
-
-
The data type representing a table's schema, consisting of a collection of - fields (that is, fieldName to dataType pairs).
-
-
StructType() - Constructor for class io.delta.standalone.types.StructType
-
 
-
StructType(StructField[]) - Constructor for class io.delta.standalone.types.StructType
-
 
-
- - - -

T

-
-
tableExists() - Method in interface io.delta.standalone.DeltaLog
-
 
-
tags(Map<String, String>) - Method in class io.delta.standalone.actions.AddFile.Builder
-
 
-
timestamp(Timestamp) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
TimestampType - Class in io.delta.standalone.types
-
-
The data type representing java.sql.Timestamp values.
-
-
TimestampType() - Constructor for class io.delta.standalone.types.TimestampType
-
 
-
toJson() - Method in class io.delta.standalone.types.DataType
-
 
-
toPrettyJson() - Method in class io.delta.standalone.types.DataType
-
 
-
toString() - Method in class io.delta.standalone.expressions.BinaryOperator
-
 
-
toString() - Method in class io.delta.standalone.expressions.Column
-
 
-
toString() - Method in interface io.delta.standalone.expressions.Expression
-
 
-
toString() - Method in class io.delta.standalone.expressions.In
-
 
-
toString() - Method in class io.delta.standalone.expressions.IsNotNull
-
 
-
toString() - Method in class io.delta.standalone.expressions.IsNull
-
 
-
toString() - Method in class io.delta.standalone.expressions.Literal
-
 
-
toString() - Method in class io.delta.standalone.expressions.Not
-
 
-
toString() - Method in enum io.delta.standalone.Operation.Name
-
 
-
toString() - Method in class io.delta.standalone.types.FieldMetadata
-
 
-
triggerType(String) - Method in class io.delta.standalone.actions.JobInfo.Builder
-
 
-
True - Static variable in class io.delta.standalone.expressions.Literal
-
 
-
txnVersion(String) - Method in interface io.delta.standalone.OptimisticTransaction
-
 
-
- - - -

U

-
-
UnaryExpression - Class in io.delta.standalone.expressions
-
-
An Expression with one input and one output.
-
-
update() - Method in interface io.delta.standalone.DeltaLog
-
-
Bring DeltaLog's current Snapshot to the latest state if there are any new - transaction logs.
-
-
updateMetadata(Metadata) - Method in interface io.delta.standalone.OptimisticTransaction
-
-
Records an update to the metadata that should be committed with this transaction.
-
-
USER_DEFAULT - Static variable in class io.delta.standalone.types.DecimalType
-
 
-
userId(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
userMetadata(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
userName(String) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
- - - -

V

-
-
value() - Method in class io.delta.standalone.expressions.Literal
-
 
-
valueContainsNull() - Method in class io.delta.standalone.types.MapType
-
 
-
valueOf(String) - Static method in enum io.delta.standalone.Operation.Name
-
-
Returns the enum constant of this type with the specified name.
-
-
valueOf(String) - Static method in enum io.delta.standalone.util.ParquetSchemaConverter.ParquetOutputTimestampType
-
-
Returns the enum constant of this type with the specified name.
-
-
values() - Static method in enum io.delta.standalone.Operation.Name
-
-
Returns an array containing the constants of this enum type, in -the order they are declared.
-
-
values() - Static method in enum io.delta.standalone.util.ParquetSchemaConverter.ParquetOutputTimestampType
-
-
Returns an array containing the constants of this enum type, in -the order they are declared.
-
-
version(Long) - Method in class io.delta.standalone.actions.CommitInfo.Builder
-
 
-
VersionLog - Class in io.delta.standalone
-
-
VersionLog is the representation of all actions (changes) to the Delta Table - at a specific table version.
-
-
VersionLog(long, List<Action>) - Constructor for class io.delta.standalone.VersionLog
-
 
-
- - - -

W

-
-
writeLegacyParquetFormatDefault - Static variable in class io.delta.standalone.util.ParquetSchemaConverter
-
 
-
-A B C D E F G H I J L M N O P R S T U V W 
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/index.html b/connectors/docs/latest/delta-standalone/api/java/index.html deleted file mode 100644 index 404da2cafec..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - -Delta Standalone 0.6.0 JavaDoc - - - - - - - - - -<noscript> -<div>JavaScript is disabled on your browser.</div> -</noscript> -<h2>Frame Alert</h2> -<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/CommitResult.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/CommitResult.html deleted file mode 100644 index 23a8c2f0357..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/CommitResult.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - -CommitResult (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class CommitResult

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      CommitResult(long version) 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - -
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      longgetVersion() 
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CommitResult

        -
        public CommitResult(long version)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the table version that was committed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/DeltaLog.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/DeltaLog.html deleted file mode 100644 index 2e382c27f63..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/DeltaLog.html +++ /dev/null @@ -1,542 +0,0 @@ - - - - - -DeltaLog (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface DeltaLog

-
-
-
-
    -
  • -
    -
    -
    public interface DeltaLog
    -
    Represents the transaction logs of a Delta table. It provides APIs to access the states of a - Delta table. -

    - You can use the following code to create a DeltaLog instance. -

    
    -   Configuration conf = ... // Create your own Hadoop Configuration instance
    -   DeltaLog deltaLog = DeltaLog.forTable(conf, "/the/delta/table/path");
    - 
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        snapshot

        -
        Snapshot snapshot()
        -
        -
        Returns:
        -
        the current Snapshot of the Delta table. You may need to call - update() to access the latest snapshot if the current snapshot is stale.
        -
        -
      • -
      - - - -
        -
      • -

        update

        -
        Snapshot update()
        -
        Bring DeltaLog's current Snapshot to the latest state if there are any new - transaction logs.
        -
        -
        Returns:
        -
        the latest snapshot after applying the new transaction logs.
        -
        -
      • -
      - - - -
        -
      • -

        getSnapshotForVersionAsOf

        -
        Snapshot getSnapshotForVersionAsOf(long version)
        -
        Travel back in time to the Snapshot with the provided version number.
        -
        -
        Parameters:
        -
        version - the snapshot version to generate
        -
        Returns:
        -
        the snapshot at the provided version
        -
        Throws:
        -
        IllegalArgumentException - if the version is outside the range of available - versions
        -
        -
      • -
      - - - -
        -
      • -

        getSnapshotForTimestampAsOf

        -
        Snapshot getSnapshotForTimestampAsOf(long timestamp)
        -
        Travel back in time to the latest Snapshot that was generated at or before - timestamp.
        -
        -
        Parameters:
        -
        timestamp - the number of milliseconds since midnight, January 1, 1970 UTC
        -
        Returns:
        -
        the snapshot nearest to, but not after, the provided timestamp
        -
        Throws:
        -
        RuntimeException - if the snapshot is unable to be recreated
        -
        IllegalArgumentException - if the timestamp is before the earliest possible - snapshot or after the latest possible snapshot
        -
        -
      • -
      - - - -
        -
      • -

        startTransaction

        -
        OptimisticTransaction startTransaction()
        -
        Returns a new OptimisticTransaction that can be used to read the current state of the - log and then commit updates. The reads and updates will be checked for logical conflicts - with any concurrent writes to the log. -

        - Note that all reads in a transaction must go through the returned transaction object, and not - directly to the DeltaLog otherwise they will not be checked for conflicts.

        -
        -
        Returns:
        -
        a new OptimisticTransaction.
        -
        -
      • -
      - - - -
        -
      • -

        getCommitInfoAt

        -
        CommitInfo getCommitInfoAt(long version)
        -
        -
        Parameters:
        -
        version - the commit version to retrieve CommitInfo
        -
        Returns:
        -
        the CommitInfo of the commit at the provided version.
        -
        -
      • -
      - - - -
        -
      • -

        getPath

        -
        org.apache.hadoop.fs.Path getPath()
        -
        -
        Returns:
        -
        the path of the Delta table.
        -
        -
      • -
      - - - -
        -
      • -

        getChanges

        -
        java.util.Iterator<VersionLog> getChanges(long startVersion,
        -                                          boolean failOnDataLoss)
        -
        Get all actions starting from startVersion (inclusive) in increasing order of - committed version. -

        - If startVersion doesn't exist, return an empty Iterator.

        -
        -
        Parameters:
        -
        startVersion - the table version to begin retrieving actions from (inclusive)
        -
        failOnDataLoss - whether to throw when data loss detected
        -
        Returns:
        -
        an Iterator of VersionLogs starting from startVersion
        -
        Throws:
        -
        IllegalArgumentException - if startVersion is negative
        -
        IllegalStateException - if data loss detected and failOnDataLoss is true
        -
        -
      • -
      - - - -
        -
      • -

        getVersionBeforeOrAtTimestamp

        -
        long getVersionBeforeOrAtTimestamp(long timestamp)
        -
        Returns the latest version that was committed before or at timestamp. If no version - exists, returns -1. - - Specifically: -
          -
        • if a commit version exactly matches the provided timestamp, we return it
        • -
        • else, we return the latest commit version with a timestamp less than the - provided one
        • -
        • If the provided timestamp is less than the timestamp of any committed version, - we throw an error.
        • -
        .
        -
        -
        Parameters:
        -
        timestamp - the number of milliseconds since midnight, January 1, 1970 UTC
        -
        Returns:
        -
        latest commit that happened before or at timestamp.
        -
        Throws:
        -
        IllegalArgumentException - if the timestamp is less than the timestamp of any committed - version
        -
        -
      • -
      - - - -
        -
      • -

        getVersionAtOrAfterTimestamp

        -
        long getVersionAtOrAfterTimestamp(long timestamp)
        -
        Returns the latest version that was committed at or after timestamp. If no version - exists, returns -1. - - Specifically: -
          -
        • if a commit version exactly matches the provided timestamp, we return it
        • -
        • else, we return the earliest commit version with a timestamp greater than the - provided one
        • -
        • If the provided timestamp is larger than the timestamp of any committed version, - we throw an error.
        • -
        .
        -
        -
        Parameters:
        -
        timestamp - the number of milliseconds since midnight, January 1, 1970 UTC
        -
        Returns:
        -
        latest commit that happened at or before timestamp.
        -
        Throws:
        -
        IllegalArgumentException - if the timestamp is more than the timestamp of any committed - version
        -
        -
      • -
      - - - -
        -
      • -

        tableExists

        -
        boolean tableExists()
        -
        -
        Returns:
        -
        Whether a Delta table exists at this directory.
        -
        -
      • -
      - - - -
        -
      • -

        forTable

        -
        static DeltaLog forTable(org.apache.hadoop.conf.Configuration hadoopConf,
        -                         String path)
        -
        Create a DeltaLog instance representing the table located at the provided - path.
        -
        -
        Parameters:
        -
        hadoopConf - Hadoop Configuration to use when accessing the Delta table
        -
        path - the path to the Delta table
        -
        Returns:
        -
        the DeltaLog for the provided path
        -
        -
      • -
      - - - -
        -
      • -

        forTable

        -
        static DeltaLog forTable(org.apache.hadoop.conf.Configuration hadoopConf,
        -                         org.apache.hadoop.fs.Path path)
        -
        Create a DeltaLog instance representing the table located at the provided - path.
        -
        -
        Parameters:
        -
        hadoopConf - Hadoop Configuration to use when accessing the Delta table
        -
        path - the path to the Delta table
        -
        Returns:
        -
        the DeltaLog for the provided path
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/DeltaScan.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/DeltaScan.html deleted file mode 100644 index fd90b26bdc0..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/DeltaScan.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - -DeltaScan (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface DeltaScan

-
-
-
-
    -
  • -
    -
    -
    public interface DeltaScan
    -
    Provides access to an iterator over the files in this snapshot. -

    - Typically created with a read predicate Expression to let users filter files. Please note - filtering is only supported on partition columns and users should use - getResidualPredicate() to check for any unapplied portion of the input - predicate.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        getInputPredicate

        -
        java.util.Optional<Expression> getInputPredicate()
        -
        -
        Returns:
        -
        the input predicate passed in by the user
        -
        -
      • -
      - - - -
        -
      • -

        getPushedPredicate

        -
        java.util.Optional<Expression> getPushedPredicate()
        -
        -
        Returns:
        -
        portion of the input predicate that can be evaluated by Delta Standalone using only - metadata (filters on partition columns). Files returned by getFiles() are - guaranteed to satisfy the pushed predicate, and the caller doesn’t need to apply them - again on the returned files.
        -
        -
      • -
      - - - -
        -
      • -

        getResidualPredicate

        -
        java.util.Optional<Expression> getResidualPredicate()
        -
        -
        Returns:
        -
        portion of the input predicate that may not be fully applied. Files returned by - getFiles() are not guaranteed to satisfy the residual predicate, and the - caller should still apply them on the returned files.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html deleted file mode 100644 index 772a1f97e92..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Operation.Metrics.html +++ /dev/null @@ -1,683 +0,0 @@ - - - - - -Operation.Metrics (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class Operation.Metrics

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    Operation
    -
    -
    -
    -
    public static class Operation.Metrics
    -extends Object
    -
    Some possible operation metrics and their suggested corresponding operation types. - These are purely exemplary, and users may use whichever metrics best fit their application.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Field Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Fields 
      Modifier and TypeField and Description
      static StringexecutionTimeMs -
      Time taken to execute the entire operation.
      -
      static StringnumAddedFiles -
      Number of files added.
      -
      static StringnumConvertedFiles -
      Number of parquet files that have been converted.
      -
      static StringnumCopiedRows -
      Number of rows copied in the process of deleting files.
      -
      static StringnumDeletedRows -
      Number of rows removed.
      -
      static StringnumFiles -
      Number of files written.
      -
      static StringnumOutputBytes -
      Size in bytes of the written contents.
      -
      static StringnumOutputRows -
      Number of rows written.
      -
      static StringnumRemovedFiles -
      Number of files removed.
      -
      static StringnumSourceRows -
      Number of rows in the source table.
      -
      static StringnumTargetFilesAdded -
      Number files added to the sink(target).
      -
      static StringnumTargetFilesRemoved -
      Number of files removed from the sink(target).
      -
      static StringnumTargetRowsCopied -
      Number of target rows copied.
      -
      static StringnumTargetRowsDeleted -
      Number of rows deleted in the target table.
      -
      static StringnumTargetRowsInserted -
      Number of rows inserted into the target table.
      -
      static StringnumTargetRowsUpdated -
      Number of rows updated in the target table.
      -
      static StringnumUpdatedRows -
      Number of rows updated.
      -
      static StringrewriteTimeMs -
      Time taken to rewrite the matched files.
      -
      static StringscanTimeMs -
      Time taken to scan the files for matches.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Metrics() 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        numFiles

        -
        public static final String numFiles
        -
        Number of files written. - - Usually used with the WRITE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numOutputBytes

        -
        public static final String numOutputBytes
        -
        Size in bytes of the written contents. - - Usually used with WRITE, STREAMING_UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numOutputRows

        -
        public static final String numOutputRows
        -
        Number of rows written. - - Usually used with WRITE, STREAMING_UPDATE, MERGE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numAddedFiles

        -
        public static final String numAddedFiles
        -
        Number of files added. - - Usually used with STREAMING_UPDATE, DELETE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numRemovedFiles

        -
        public static final String numRemovedFiles
        -
        Number of files removed. - - Usually used with STREAMING_UPDATE, DELETE, DELETE_PARTITIONS, TRUNCATE, - UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numDeletedRows

        -
        public static final String numDeletedRows
        -
        Number of rows removed. - - Usually used with the DELETE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numCopiedRows

        -
        public static final String numCopiedRows
        -
        Number of rows copied in the process of deleting files. - - Usually used with DELETE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        executionTimeMs

        -
        public static final String executionTimeMs
        -
        Time taken to execute the entire operation. - - Usually used with DELETE, DELETE_PARTITIONS, TRUNCATE, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        scanTimeMs

        -
        public static final String scanTimeMs
        -
        Time taken to scan the files for matches. - - Usually used with DELETE, DELETE_PARTITIONS, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        rewriteTimeMs

        -
        public static final String rewriteTimeMs
        -
        Time taken to rewrite the matched files. - - Usually used with DELETE, DELETE_PARTITIONS, MERGE, UPDATE operations.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numConvertedFiles

        -
        public static final String numConvertedFiles
        -
        Number of parquet files that have been converted. - - Usually used with the CONVERT operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numSourceRows

        -
        public static final String numSourceRows
        -
        Number of rows in the source table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsInserted

        -
        public static final String numTargetRowsInserted
        -
        Number of rows inserted into the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsUpdated

        -
        public static final String numTargetRowsUpdated
        -
        Number of rows updated in the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsDeleted

        -
        public static final String numTargetRowsDeleted
        -
        Number of rows deleted in the target table. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetRowsCopied

        -
        public static final String numTargetRowsCopied
        -
        Number of target rows copied. - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetFilesAdded

        -
        public static final String numTargetFilesAdded
        -
        Number files added to the sink(target). - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numTargetFilesRemoved

        -
        public static final String numTargetFilesRemoved
        -
        Number of files removed from the sink(target). - - Usually used with the MERGE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      - - - -
        -
      • -

        numUpdatedRows

        -
        public static final String numUpdatedRows
        -
        Number of rows updated. - - Usually used with the UPDATE operation.
        -
        -
        See Also:
        -
        Constant Field Values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Metrics

        -
        public Metrics()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Operation.Name.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Operation.Name.html deleted file mode 100644 index 40c76a09f83..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Operation.Name.html +++ /dev/null @@ -1,589 +0,0 @@ - - - - - -Operation.Name (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Enum Operation.Name

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable, Comparable<Operation.Name>
    -
    -
    -
    Enclosing class:
    -
    Operation
    -
    -
    -
    -
    public static enum Operation.Name
    -extends Enum<Operation.Name>
    -
    Supported operation types.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Enum Constant Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Enum Constants 
      Enum Constant and Description
      ADD_COLUMNS -
      Recorded when columns are added.
      -
      CHANGE_COLUMN -
      Recorded when columns are changed.
      -
      CONVERT -
      Recorded when converting a table into a Delta table.
      -
      CREATE_TABLE -
      Recorded when the table is created.
      -
      DELETE -
      Recorded while deleting certain partitions.
      -
      MANUAL_UPDATE 
      MERGE -
      Recorded when a merge operation is committed to the table.
      -
      REPLACE_COLUMNS -
      Recorded when columns are replaced.
      -
      REPLACE_TABLE -
      Recorded when the table is replaced.
      -
      SET_TABLE_PROPERTIES -
      Recorded when the table properties are set.
      -
      STREAMING_UPDATE -
      Recorded during streaming inserts.
      -
      TRUNCATE -
      Recorded when truncating the table.
      -
      UNSET_TABLE_PROPERTIES -
      Recorded when the table properties are unset.
      -
      UPDATE -
      Recorded when an update operation is committed to the table.
      -
      UPGRADE_PROTOCOL -
      Recorded when the table protocol is upgraded.
      -
      UPGRADE_SCHEMA -
      Recorded when the table schema is upgraded.
      -
      WRITE -
      Recorded during batch inserts.
      -
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - -
      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      StringtoString() 
      static Operation.NamevalueOf(String name) -
      Returns the enum constant of this type with the specified name.
      -
      static Operation.Name[]values() -
      Returns an array containing the constants of this enum type, in -the order they are declared.
      -
      -
        -
      • - - -

        Methods inherited from class Enum

        -compareTo, equals, getDeclaringClass, hashCode, name, ordinal, valueOf
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -getClass, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Enum Constant Detail

      - - - -
        -
      • -

        WRITE

        -
        public static final Operation.Name WRITE
        -
        Recorded during batch inserts.
        -
      • -
      - - - -
        -
      • -

        STREAMING_UPDATE

        -
        public static final Operation.Name STREAMING_UPDATE
        -
        Recorded during streaming inserts.
        -
      • -
      - - - -
        -
      • -

        DELETE

        -
        public static final Operation.Name DELETE
        -
        Recorded while deleting certain partitions.
        -
      • -
      - - - -
        -
      • -

        TRUNCATE

        -
        public static final Operation.Name TRUNCATE
        -
        Recorded when truncating the table.
        -
      • -
      - - - -
        -
      • -

        CONVERT

        -
        public static final Operation.Name CONVERT
        -
        Recorded when converting a table into a Delta table.
        -
      • -
      - - - -
        -
      • -

        MERGE

        -
        public static final Operation.Name MERGE
        -
        Recorded when a merge operation is committed to the table.
        -
      • -
      - - - -
        -
      • -

        UPDATE

        -
        public static final Operation.Name UPDATE
        -
        Recorded when an update operation is committed to the table.
        -
      • -
      - - - -
        -
      • -

        CREATE_TABLE

        -
        public static final Operation.Name CREATE_TABLE
        -
        Recorded when the table is created.
        -
      • -
      - - - -
        -
      • -

        REPLACE_TABLE

        -
        public static final Operation.Name REPLACE_TABLE
        -
        Recorded when the table is replaced.
        -
      • -
      - - - -
        -
      • -

        SET_TABLE_PROPERTIES

        -
        public static final Operation.Name SET_TABLE_PROPERTIES
        -
        Recorded when the table properties are set.
        -
      • -
      - - - -
        -
      • -

        UNSET_TABLE_PROPERTIES

        -
        public static final Operation.Name UNSET_TABLE_PROPERTIES
        -
        Recorded when the table properties are unset.
        -
      • -
      - - - -
        -
      • -

        ADD_COLUMNS

        -
        public static final Operation.Name ADD_COLUMNS
        -
        Recorded when columns are added.
        -
      • -
      - - - -
        -
      • -

        CHANGE_COLUMN

        -
        public static final Operation.Name CHANGE_COLUMN
        -
        Recorded when columns are changed.
        -
      • -
      - - - -
        -
      • -

        REPLACE_COLUMNS

        -
        public static final Operation.Name REPLACE_COLUMNS
        -
        Recorded when columns are replaced.
        -
      • -
      - - - -
        -
      • -

        UPGRADE_PROTOCOL

        -
        public static final Operation.Name UPGRADE_PROTOCOL
        -
        Recorded when the table protocol is upgraded.
        -
      • -
      - - - -
        -
      • -

        UPGRADE_SCHEMA

        -
        public static final Operation.Name UPGRADE_SCHEMA
        -
        Recorded when the table schema is upgraded.
        -
      • -
      - - - -
        -
      • -

        MANUAL_UPDATE

        -
        public static final Operation.Name MANUAL_UPDATE
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        values

        -
        public static Operation.Name[] values()
        -
        Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
        -for (Operation.Name c : Operation.Name.values())
        -    System.out.println(c);
        -
        -
        -
        Returns:
        -
        an array containing the constants of this enum type, in the order they are declared
        -
        -
      • -
      - - - -
        -
      • -

        valueOf

        -
        public static Operation.Name valueOf(String name)
        -
        Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.)
        -
        -
        Parameters:
        -
        name - the name of the enum constant to be returned.
        -
        Returns:
        -
        the enum constant with the specified name
        -
        Throws:
        -
        IllegalArgumentException - if this enum type has no constant with the specified name
        -
        NullPointerException - if the argument is null
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Overrides:
        -
        toString in class Enum<Operation.Name>
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Operation.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Operation.html deleted file mode 100644 index 6bbc2c00f06..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Operation.html +++ /dev/null @@ -1,442 +0,0 @@ - - - - - -Operation (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class Operation

-
-
- -
-
    -
  • -
    -
    -
    public final class Operation
    -extends Object
    -
    An operation that can be performed on a Delta table. -

    - An operation is tracked as the first line in delta logs, and powers DESCRIBE HISTORY for - Delta tables. -

    - Operations must be constructed using one of the Operation.Name types below. - As well, optional Operation.Metrics values are given below.

    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class Operation.Metrics -
      Some possible operation metrics and their suggested corresponding operation types.
      -
      static class Operation.Name -
      Supported operation types.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      Operation(Operation.Name name) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters, - java.util.Map<String,String> metrics) 
      Operation(Operation.Name name, - java.util.Map<String,String> parameters, - java.util.Map<String,String> metrics, - java.util.Optional<String> userMetadata) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - - - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        -
      • -
      - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters,
        -                 @Nullable
        -                 java.util.Map<String,String> metrics)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        metrics - Any relevant operation metrics. See Operation.Metrics for suggested keys.
        -
        -
      • -
      - - - -
        -
      • -

        Operation

        -
        public Operation(@Nonnull
        -                 Operation.Name name,
        -                 @Nullable
        -                 java.util.Map<String,String> parameters,
        -                 @Nullable
        -                 java.util.Map<String,String> metrics,
        -                 @Nonnull
        -                 java.util.Optional<String> userMetadata)
        -
        -
        Parameters:
        -
        name - The Operation.Name of the operation.
        -
        parameters - Any relevant operation parameters, where values are JSON-encoded.
        -
        metrics - Any relevant operation metrics. See Operation.Metrics for suggested keys.
        -
        userMetadata - Optional additional user metadata.
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getName

        -
        @Nonnull
        -public Operation.Name getName()
        -
        -
        Returns:
        -
        operation name
        -
        -
      • -
      - - - -
        -
      • -

        getParameters

        -
        @Nullable
        -public java.util.Map<String,String> getParameters()
        -
        -
        Returns:
        -
        operation parameters
        -
        -
      • -
      - - - -
        -
      • -

        getMetrics

        -
        @Nullable
        -public java.util.Map<String,String> getMetrics()
        -
        -
        Returns:
        -
        operation metrics
        -
        -
      • -
      - - - -
        -
      • -

        getUserMetadata

        -
        @Nonnull
        -public java.util.Optional<String> getUserMetadata()
        -
        -
        Returns:
        -
        user metadata for this operation
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html deleted file mode 100644 index b5522fd3a6f..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/OptimisticTransaction.html +++ /dev/null @@ -1,405 +0,0 @@ - - - - - -OptimisticTransaction (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface OptimisticTransaction

-
-
-
-
    -
  • -
    -
    -
    public interface OptimisticTransaction
    -
    Used to perform a set of reads in a transaction and then commit a set of updates to the - state of the log. All reads from the DeltaLog MUST go through this instance rather - than directly to the DeltaLog otherwise they will not be checked for logical conflicts - with concurrent updates. -

    - This class is not thread-safe.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        commit

        -
        <T extends ActionCommitResult commit(Iterable<T> actions,
        -                                       Operation op,
        -                                       String engineInfo)
        -
        Modifies the state of the log by adding a new commit that is based on a read at the table's - latest version as of this transaction's instantiation. In the case of a conflict with a - concurrent writer this method will throw an exception. -

        - Note: any AddFile with an absolute path within the table - path will be updated to have a relative path (based off of the table path). Because of this, - be sure to generate all RemoveFiles using - AddFiles read from the Delta Log (do not use the - AddFiles created pre-commit.)

        -
        -
        Type Parameters:
        -
        T - A derived class of Action. This allows, for example, both a - List<Action> and a List<AddFile> to be accepted.
        -
        Parameters:
        -
        actions - Set of actions to commit.
        -
        op - Details of operation that is performing this transactional commit.
        -
        engineInfo - String used to identify the writer engine. It should resemble - "{engineName}/{engineVersion}", with dashes in place of whitespace. - For example, "Flink-Connector/1.1.0".
        -
        Returns:
        -
        a CommitResult, wrapping the table version that was committed.
        -
        -
      • -
      - - - -
        -
      • -

        markFilesAsRead

        -
        DeltaScan markFilesAsRead(Expression readPredicate)
        -
        Mark files matched by the readPredicate as read by this transaction. -

        - Please note filtering is only supported on partition columns, thus the files matched - may be a superset of the files in the Delta table that satisfy readPredicate. Users - should use DeltaScan.getResidualPredicate() to check for any unapplied portion of the - input predicate. -

        - Internally, readPredicate and the matched readFiles will be used to determine - if logical conflicts between this transaction and previously-committed transactions can be - resolved (i.e. no error thrown). -

        - For example: -

          -
        • This transaction TXN1 reads partition 'date=2021-09-08' to perform an UPDATE and tries - to commit at the next table version N.
        • -
        • After TXN1 starts, another transaction TXN2 reads partition 'date=2021-09-07' and - commits first at table version N (with no other metadata changes).
        • -
        • TXN1 sees that another commit won, and needs to know whether to commit at version N+1 - or fail. Using the readPredicates and resultant readFiles, TXN1 can see - that none of its read files were changed by TXN2. Thus there are no logical conflicts and - TXN1 can commit at table version N+1.
        • -
        -
        -
        Parameters:
        -
        readPredicate - Predicate used to determine which files were read.
        -
        Returns:
        -
        a DeltaScan containing the list of files matching the pushed portion of the - readPredicate.
        -
        -
      • -
      - - - -
        -
      • -

        updateMetadata

        -
        void updateMetadata(Metadata metadata)
        -
        Records an update to the metadata that should be committed with this transaction. - -

        - Use Metadata.copyBuilder() to build a new Metadata instance based on the - current table metadata. For example: - -

        
        - Metadata newMetadata = optimisticTransaction.metadata().copyBuilder()
        -     .schema(newSchema)
        -     .build();
        - optimisticTransaction.updateMetadata(newMetadata);
        - 
        - -

        - IMPORTANT: It is the responsibility of the caller to ensure that files currently - present in the table are still valid under the new metadata.

        -
        -
        Parameters:
        -
        metadata - The new metadata for the delta table.
        -
        -
      • -
      - - - -
        -
      • -

        readWholeTable

        -
        void readWholeTable()
        -
        Mark the entire table as tainted (i.e. read) by this transaction.
        -
      • -
      - - - -
        -
      • -

        txnVersion

        -
        long txnVersion(String id)
        -
        -
        Parameters:
        -
        id - transaction id
        -
        Returns:
        -
        the latest version that has committed for the idempotent transaction with given - id.
        -
        -
      • -
      - - - -
        -
      • -

        metadata

        -
        Metadata metadata()
        -
        -
        Returns:
        -
        the metadata for this transaction. The metadata refers to the metadata of the table's - latest version as of this transaction's instantiation unless updated during the - transaction.
        -
        -
      • -
      - - - -
        -
      • -

        readVersion

        -
        long readVersion()
        -
        -
        Returns:
        -
        The table version that this transaction is reading from.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Snapshot.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Snapshot.html deleted file mode 100644 index e05e4af5b2b..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/Snapshot.html +++ /dev/null @@ -1,320 +0,0 @@ - - - - - -Snapshot (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Interface Snapshot

-
-
-
-
    -
  • -
    -
    -
    public interface Snapshot
    -
    Snapshot provides APIs to access the Delta table state (such as table metadata, active - files) at some version. -

    - See Delta Transaction Log Protocol - for more details about the transaction logs.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        scan

        -
        DeltaScan scan(Expression predicate)
        -
        -
        Parameters:
        -
        predicate - the predicate to be used to filter the files in this snapshot.
        -
        Returns:
        -
        a DeltaScan of the files in this snapshot matching the pushed portion of - predicate
        -
        -
      • -
      - - - -
        -
      • -

        getAllFiles

        -
        java.util.List<AddFile> getAllFiles()
        -
        -
        Returns:
        -
        all of the files present in this snapshot
        -
        -
      • -
      - - - -
        -
      • -

        getMetadata

        -
        Metadata getMetadata()
        -
        -
        Returns:
        -
        the table metadata for this snapshot
        -
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        long getVersion()
        -
        -
        Returns:
        -
        the version for this snapshot
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/VersionLog.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/VersionLog.html deleted file mode 100644 index cb7c38cbfe2..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/VersionLog.html +++ /dev/null @@ -1,315 +0,0 @@ - - - - - -VersionLog (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone
-

Class VersionLog

-
-
- -
-
    -
  • -
    -
    -
    public class VersionLog
    -extends Object
    -
    VersionLog is the representation of all actions (changes) to the Delta Table - at a specific table version.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      VersionLog(long version, - java.util.List<Action> actions) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        VersionLog

        -
        public VersionLog(long version,
        -                  @Nonnull
        -                  java.util.List<Action> actions)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the table version at which these actions occurred
        -
        -
      • -
      - - - -
        -
      • -

        getActions

        -
        @Nonnull
        -public java.util.List<Action> getActions()
        -
        -
        Returns:
        -
        an unmodifiable List of the actions for this table version
        -
        -
      • -
      - - - -
        -
      • -

        getActionsIterator

        -
        @Nonnull
        -public io.delta.storage.CloseableIterator<Action> getActionsIterator()
        -
        -
        Returns:
        -
        an CloseableIterator of the actions for this table version. This method is - preferred for memory efficient iteration through the action list.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Action.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Action.html deleted file mode 100644 index d522999e987..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Action.html +++ /dev/null @@ -1,189 +0,0 @@ - - - - - -Action (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Interface Action

-
-
-
-
    -
  • -
    -
    All Known Subinterfaces:
    -
    FileAction
    -
    -
    -
    All Known Implementing Classes:
    -
    AddCDCFile, AddFile, CommitInfo, Metadata, Protocol, RemoveFile, SetTransaction
    -
    -
    -
    -
    public interface Action
    -
    A marker interface for all actions that can be applied to a Delta table. - Each action represents a single change to the state of a Delta table. -

    - You can use the following code to extract the concrete type of an Action. -

    
    -   List<Action> actions = ...
    -   actions.forEach(x -> {
    -       if (x instanceof AddFile) {
    -          AddFile addFile = (AddFile) x;
    -          ...
    -       } else if (x instanceof AddCDCFile) {
    -          AddCDCFile addCDCFile = (AddCDCFile)x;
    -          ...
    -       } else if ...
    -   });
    - 
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html deleted file mode 100644 index 22b4d8ea678..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/AddCDCFile.html +++ /dev/null @@ -1,371 +0,0 @@ - - - - - -AddCDCFile (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddCDCFile

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action, FileAction
    -
    -
    -
    -
    public final class AddCDCFile
    -extends Object
    -implements FileAction
    -
    A change file containing CDC data for the Delta version it's within. Non-CDC readers should - ignore this, CDC readers should scan all ChangeFiles in a version rather than computing - changes from AddFile and RemoveFile actions.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      AddCDCFile(String path, - java.util.Map<String,String> partitionValues, - long size, - java.util.Map<String,String> tags) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AddCDCFile

        -
        public AddCDCFile(@Nonnull
        -                  String path,
        -                  @Nonnull
        -                  java.util.Map<String,String> partitionValues,
        -                  long size,
        -                  @Nullable
        -                  java.util.Map<String,String> tags)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        @Nonnull
        -public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be added to the table. If it's a - relative path, it's relative to the root of the table. Note: the path is encoded and - should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nonnull
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public long getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being added or removed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html deleted file mode 100644 index 9addaa2f37a..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/AddFile.Builder.html +++ /dev/null @@ -1,317 +0,0 @@ - - - - - -AddFile.Builder (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddFile.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    AddFile
    -
    -
    -
    -
    public static final class AddFile.Builder
    -extends Object
    -
    Builder class for AddFile. Enables construction of AddFiles with default - values.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Builder(String path, - java.util.Map<String,String> partitionValues, - long size, - long modificationTime, - boolean dataChange) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder(String path,
        -               java.util.Map<String,String> partitionValues,
        -               long size,
        -               long modificationTime,
        -               boolean dataChange)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        tags

        -
        public AddFile.Builder tags(java.util.Map<String,String> tags)
        -
      • -
      - - - -
        -
      • -

        build

        -
        public AddFile build()
        -
        Builds an AddFile using the provided parameters. If a parameter is not provided - its default values is used.
        -
        -
        Returns:
        -
        a new AddFile with the properties added to the builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html deleted file mode 100644 index 4bae13156fb..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/AddFile.html +++ /dev/null @@ -1,581 +0,0 @@ - - - - - -AddFile (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class AddFile

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action, FileAction
    -
    -
    -
    -
    public final class AddFile
    -extends Object
    -implements FileAction
    -
    Represents an action that adds a new file to the table. The path of a file acts as the primary - key for the entry in the set of files. -

    - Note: since actions within a given Delta file are not guaranteed to be applied in order, it is - not valid for multiple file operations with the same path to exist in a single version.

    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Add File and Remove File
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class AddFile.Builder -
      Builder class for AddFile.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      AddFile(String path, - java.util.Map<String,String> partitionValues, - long size, - long modificationTime, - boolean dataChange, - String stats, - java.util.Map<String,String> tags) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        AddFile

        -
        public AddFile(@Nonnull
        -               String path,
        -               @Nonnull
        -               java.util.Map<String,String> partitionValues,
        -               long size,
        -               long modificationTime,
        -               boolean dataChange,
        -               @Nullable
        -               String stats,
        -               @Nullable
        -               java.util.Map<String,String> tags)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove()
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with - deletionTimestamp = System.currentTimeMillis()
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(long deletionTimestamp)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - deletionTimestamp
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(boolean dataChange)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - dataChange flag
        -
        -
      • -
      - - - -
        -
      • -

        remove

        -
        @Nonnull
        -public RemoveFile remove(long deletionTimestamp,
        -                                  boolean dataChange)
        -
        -
        Returns:
        -
        the corresponding RemoveFile for this file, instantiated with the given - deletionTimestamp value and dataChange flag
        -
        -
      • -
      - - - -
        -
      • -

        getPath

        -
        @Nonnull
        -public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be added to the table. If it's a - relative path, it's relative to the root of the table. Note: the path is encoded and - should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nonnull
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public long getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getModificationTime

        -
        public long getModificationTime()
        -
        -
        Returns:
        -
        the time that this file was last modified or created, as - milliseconds since the epoch
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being created. When - false the file must already be present in the table or the records in the - added file must be contained in one or more remove actions in the same version
        -
        -
      • -
      - - - -
        -
      • -

        getStats

        -
        @Nullable
        -public String getStats()
        -
        -
        Returns:
        -
        statistics (for example: count, min/max values for columns) - about the data in this file as serialized JSON
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - -
        -
      • -

        builder

        -
        public static AddFile.Builder builder(String path,
        -                                      java.util.Map<String,String> partitionValues,
        -                                      long size,
        -                                      long modificationTime,
        -                                      boolean dataChange)
        -
        -
        Returns:
        -
        a new AddFile.Builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html deleted file mode 100644 index fcbafc8d446..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.Builder.html +++ /dev/null @@ -1,481 +0,0 @@ - - - - - -CommitInfo.Builder (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class CommitInfo.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    CommitInfo
    -
    -
    -
    -
    public static final class CommitInfo.Builder
    -extends Object
    -
    Builder class for CommitInfo. Enables construction of CommitInfos with - default values.
    -
  • -
-
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html deleted file mode 100644 index 937dcada860..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/CommitInfo.html +++ /dev/null @@ -1,706 +0,0 @@ - - - - - -CommitInfo (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class CommitInfo

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public class CommitInfo
    -extends Object
    -implements Action
    -
    Holds provenance information about changes to the table. This CommitInfo - is not stored in the checkpoint and has reduced compatibility guarantees. - Information stored in it is best effort (i.e. can be falsified by a writer).
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Commit Provenance Information
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Nested Class Summary

      - - - - - - - - - - -
      Nested Classes 
      Modifier and TypeClass and Description
      static class CommitInfo.Builder -
      Builder class for CommitInfo.
      -
      -
    • -
    - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      CommitInfo(java.util.Optional<Long> version, - java.sql.Timestamp timestamp, - java.util.Optional<String> userId, - java.util.Optional<String> userName, - String operation, - java.util.Map<String,String> operationParameters, - java.util.Optional<JobInfo> jobInfo, - java.util.Optional<NotebookInfo> notebookInfo, - java.util.Optional<String> clusterId, - java.util.Optional<Long> readVersion, - java.util.Optional<String> isolationLevel, - java.util.Optional<Boolean> isBlindAppend, - java.util.Optional<java.util.Map<String,String>> operationMetrics, - java.util.Optional<String> userMetadata) 
      CommitInfo(java.util.Optional<Long> version, - java.sql.Timestamp timestamp, - java.util.Optional<String> userId, - java.util.Optional<String> userName, - String operation, - java.util.Map<String,String> operationParameters, - java.util.Optional<JobInfo> jobInfo, - java.util.Optional<NotebookInfo> notebookInfo, - java.util.Optional<String> clusterId, - java.util.Optional<Long> readVersion, - java.util.Optional<String> isolationLevel, - java.util.Optional<Boolean> isBlindAppend, - java.util.Optional<java.util.Map<String,String>> operationMetrics, - java.util.Optional<String> userMetadata, - java.util.Optional<String> engineInfo) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        CommitInfo

        -
        public CommitInfo(@Nonnull
        -                  java.util.Optional<Long> version,
        -                  @Nullable
        -                  java.sql.Timestamp timestamp,
        -                  @Nonnull
        -                  java.util.Optional<String> userId,
        -                  @Nonnull
        -                  java.util.Optional<String> userName,
        -                  @Nullable
        -                  String operation,
        -                  @Nullable
        -                  java.util.Map<String,String> operationParameters,
        -                  @Nonnull
        -                  java.util.Optional<JobInfo> jobInfo,
        -                  @Nonnull
        -                  java.util.Optional<NotebookInfo> notebookInfo,
        -                  @Nonnull
        -                  java.util.Optional<String> clusterId,
        -                  @Nonnull
        -                  java.util.Optional<Long> readVersion,
        -                  @Nonnull
        -                  java.util.Optional<String> isolationLevel,
        -                  @Nonnull
        -                  java.util.Optional<Boolean> isBlindAppend,
        -                  @Nonnull
        -                  java.util.Optional<java.util.Map<String,String>> operationMetrics,
        -                  @Nonnull
        -                  java.util.Optional<String> userMetadata)
        -
      • -
      - - - -
        -
      • -

        CommitInfo

        -
        public CommitInfo(@Nonnull
        -                  java.util.Optional<Long> version,
        -                  @Nullable
        -                  java.sql.Timestamp timestamp,
        -                  @Nonnull
        -                  java.util.Optional<String> userId,
        -                  @Nonnull
        -                  java.util.Optional<String> userName,
        -                  @Nullable
        -                  String operation,
        -                  @Nullable
        -                  java.util.Map<String,String> operationParameters,
        -                  @Nonnull
        -                  java.util.Optional<JobInfo> jobInfo,
        -                  @Nonnull
        -                  java.util.Optional<NotebookInfo> notebookInfo,
        -                  @Nonnull
        -                  java.util.Optional<String> clusterId,
        -                  @Nonnull
        -                  java.util.Optional<Long> readVersion,
        -                  @Nonnull
        -                  java.util.Optional<String> isolationLevel,
        -                  @Nonnull
        -                  java.util.Optional<Boolean> isBlindAppend,
        -                  @Nonnull
        -                  java.util.Optional<java.util.Map<String,String>> operationMetrics,
        -                  @Nonnull
        -                  java.util.Optional<String> userMetadata,
        -                  @Nonnull
        -                  java.util.Optional<String> engineInfo)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getVersion

        -
        @Nonnull
        -public java.util.Optional<Long> getVersion()
        -
        -
        Returns:
        -
        the log version for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getTimestamp

        -
        @Nullable
        -public java.sql.Timestamp getTimestamp()
        -
        -
        Returns:
        -
        the time the files in this commit were committed
        -
        -
      • -
      - - - -
        -
      • -

        getUserId

        -
        @Nonnull
        -public java.util.Optional<String> getUserId()
        -
        -
        Returns:
        -
        the userId of the user who committed this file
        -
        -
      • -
      - - - -
        -
      • -

        getUserName

        -
        @Nonnull
        -public java.util.Optional<String> getUserName()
        -
        -
        Returns:
        -
        the userName of the user who committed this file
        -
        -
      • -
      - - - -
        -
      • -

        getOperation

        -
        @Nullable
        -public String getOperation()
        -
        -
        Returns:
        -
        the type of operation for this commit. e.g. "WRITE"
        -
        -
      • -
      - - - -
        -
      • -

        getOperationParameters

        -
        @Nullable
        -public java.util.Map<String,String> getOperationParameters()
        -
        -
        Returns:
        -
        any relevant operation parameters. e.g. "mode", "partitionBy"
        -
        -
      • -
      - - - -
        -
      • -

        getJobInfo

        -
        @Nonnull
        -public java.util.Optional<JobInfo> getJobInfo()
        -
        -
        Returns:
        -
        the JobInfo for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getNotebookInfo

        -
        @Nonnull
        -public java.util.Optional<NotebookInfo> getNotebookInfo()
        -
        -
        Returns:
        -
        the NotebookInfo for this commit
        -
        -
      • -
      - - - -
        -
      • -

        getClusterId

        -
        @Nonnull
        -public java.util.Optional<String> getClusterId()
        -
        -
        Returns:
        -
        the ID of the cluster used to generate this commit
        -
        -
      • -
      - - - -
        -
      • -

        getReadVersion

        -
        @Nonnull
        -public java.util.Optional<Long> getReadVersion()
        -
        -
        Returns:
        -
        the version that the transaction used to generate this commit is reading from
        -
        -
      • -
      - - - -
        -
      • -

        getIsolationLevel

        -
        @Nonnull
        -public java.util.Optional<String> getIsolationLevel()
        -
        -
        Returns:
        -
        the isolation level at which this commit was generated
        -
        -
      • -
      - - - -
        -
      • -

        getIsBlindAppend

        -
        @Nonnull
        -public java.util.Optional<Boolean> getIsBlindAppend()
        -
        -
        Returns:
        -
        whether this commit has blindly appended without caring about existing files
        -
        -
      • -
      - - - -
        -
      • -

        getOperationMetrics

        -
        @Nonnull
        -public java.util.Optional<java.util.Map<String,String>> getOperationMetrics()
        -
        -
        Returns:
        -
        any operation metrics calculated
        -
        -
      • -
      - - - -
        -
      • -

        getUserMetadata

        -
        @Nonnull
        -public java.util.Optional<String> getUserMetadata()
        -
        -
        Returns:
        -
        any additional user metadata
        -
        -
      • -
      - - - -
        -
      • -

        getEngineInfo

        -
        @Nonnull
        -public java.util.Optional<String> getEngineInfo()
        -
        -
        Returns:
        -
        the engineInfo of the engine that performed this commit. It should be of the form - "{engineName}/{engineVersion} Delta-Standalone/{deltaStandaloneVersion}"
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html deleted file mode 100644 index 9ccdfb1e037..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/FileAction.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - -FileAction (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Interface FileAction

-
-
-
-
    -
  • -
    -
    All Superinterfaces:
    -
    Action
    -
    -
    -
    All Known Implementing Classes:
    -
    AddCDCFile, AddFile, RemoveFile
    -
    -
    -
    -
    public interface FileAction
    -extends Action
    -
    Generic interface for Actions pertaining to the addition and removal of files.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        String getPath()
        -
        -
        Returns:
        -
        the relative path or the absolute path of the file being added or removed by this - action. If it's a relative path, it's relative to the root of the table. Note: the path - is encoded and should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        boolean isDataChange()
        -
        -
        Returns:
        -
        whether any data was changed as a result of this file being added or removed.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Format.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Format.html deleted file mode 100644 index 325015096a2..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Format.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - -Format (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Format

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - - - - -
      Constructors 
      Constructor and Description
      Format() 
      Format(String provider, - java.util.Map<String,String> options) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Format

        -
        public Format(String provider,
        -              java.util.Map<String,String> options)
        -
      • -
      - - - -
        -
      • -

        Format

        -
        public Format()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getProvider

        -
        public String getProvider()
        -
        -
        Returns:
        -
        the name of the encoding for files in this table
        -
        -
      • -
      - - - -
        -
      • -

        getOptions

        -
        public java.util.Map<String,String> getOptions()
        -
        -
        Returns:
        -
        an unmodifiable Map containing configuration options for - the format
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html deleted file mode 100644 index e4439d6fd46..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.Builder.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - -JobInfo.Builder (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class JobInfo.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    JobInfo
    -
    -
    -
    -
    public static class JobInfo.Builder
    -extends Object
    -
    Builder class for JobInfo. Enables construction of JobInfos with default - values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder(String jobId)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - - - - - - - - - -
        -
      • -

        jobOwnerId

        -
        public JobInfo.Builder jobOwnerId(String jobOwnerId)
        -
      • -
      - - - -
        -
      • -

        triggerType

        -
        public JobInfo.Builder triggerType(String triggerType)
        -
      • -
      - - - -
        -
      • -

        build

        -
        public JobInfo build()
        -
        Builds a JobInfo using the provided parameters. If a parameter is not provided - its default values is used.
        -
        -
        Returns:
        -
        a new JobInfo with the properties added to the builder
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html deleted file mode 100644 index 5b8235bc7e2..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/JobInfo.html +++ /dev/null @@ -1,402 +0,0 @@ - - - - - -JobInfo (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class JobInfo

-
-
- -
-
    -
  • -
    -
    -
    public class JobInfo
    -extends Object
    -
    Represents the Databricks Job information that committed to the Delta table.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        JobInfo

        -
        public JobInfo(String jobId,
        -               String jobName,
        -               String runId,
        -               String jobOwnerId,
        -               String triggerType)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getJobId

        -
        public String getJobId()
        -
      • -
      - - - -
        -
      • -

        getJobName

        -
        public String getJobName()
        -
      • -
      - - - -
        -
      • -

        getRunId

        -
        public String getRunId()
        -
      • -
      - - - -
        -
      • -

        getJobOwnerId

        -
        public String getJobOwnerId()
        -
      • -
      - - - -
        -
      • -

        getTriggerType

        -
        public String getTriggerType()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html deleted file mode 100644 index 23ffbf7b208..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Metadata.Builder.html +++ /dev/null @@ -1,408 +0,0 @@ - - - - - -Metadata.Builder (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Metadata.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    Metadata
    -
    -
    -
    -
    public static final class Metadata.Builder
    -extends Object
    -
    Builder class for Metadata. Enables construction of Metadatas with default - values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Builder

        -
        public Builder()
        -
      • -
      -
    • -
    - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html deleted file mode 100644 index 198d944828b..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Metadata.html +++ /dev/null @@ -1,530 +0,0 @@ - - - - - -Metadata (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Metadata

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public final class Metadata
    -extends Object
    -implements Action
    -
    Updates the metadata of the table. The first version of a table must contain - a Metadata action. Subsequent Metadata actions completely - overwrite the current metadata of the table. It is the responsibility of the - writer to ensure that any data already present in the table is still valid - after any change. There can be at most one Metadata action in a - given version of the table.
    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Change Metadata
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Metadata

        -
        public Metadata(@Nonnull
        -                String id,
        -                @Nullable
        -                String name,
        -                @Nullable
        -                String description,
        -                @Nonnull
        -                Format format,
        -                @Nonnull
        -                java.util.List<String> partitionColumns,
        -                @Nonnull
        -                java.util.Map<String,String> configuration,
        -                @Nonnull
        -                java.util.Optional<Long> createdTime,
        -                @Nullable
        -                StructType schema)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getId

        -
        @Nonnull
        -public String getId()
        -
        -
        Returns:
        -
        the unique identifier for this table
        -
        -
      • -
      - - - -
        -
      • -

        getName

        -
        @Nullable
        -public String getName()
        -
        -
        Returns:
        -
        the user-provided identifier for this table
        -
        -
      • -
      - - - -
        -
      • -

        getDescription

        -
        @Nullable
        -public String getDescription()
        -
        -
        Returns:
        -
        the user-provided description for this table
        -
        -
      • -
      - - - -
        -
      • -

        getFormat

        -
        @Nonnull
        -public Format getFormat()
        -
        -
        Returns:
        -
        the Format for this table
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionColumns

        -
        @Nonnull
        -public java.util.List<String> getPartitionColumns()
        -
        -
        Returns:
        -
        an unmodifiable java.util.List containing the names of - columns by which the data should be partitioned
        -
        -
      • -
      - - - -
        -
      • -

        getConfiguration

        -
        @Nonnull
        -public java.util.Map<String,String> getConfiguration()
        -
        -
        Returns:
        -
        an unmodifiable java.util.Map containing configuration - options for this metadata
        -
        -
      • -
      - - - -
        -
      • -

        getCreatedTime

        -
        @Nonnull
        -public java.util.Optional<Long> getCreatedTime()
        -
        -
        Returns:
        -
        the time when this metadata action was created, in milliseconds - since the Unix epoch
        -
        -
      • -
      - - - -
        -
      • -

        getSchema

        -
        @Nullable
        -public StructType getSchema()
        -
        -
        Returns:
        -
        the schema of the table as a StructType
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html deleted file mode 100644 index acf02964307..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/NotebookInfo.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - -NotebookInfo (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class NotebookInfo

-
-
- -
-
    -
  • -
    -
    -
    public class NotebookInfo
    -extends Object
    -
    Represents the Databricks Notebook information that committed to the Delta table.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      NotebookInfo(String notebookId) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        NotebookInfo

        -
        public NotebookInfo(String notebookId)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getNotebookId

        -
        public String getNotebookId()
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html deleted file mode 100644 index 5a3497503e7..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/Protocol.html +++ /dev/null @@ -1,345 +0,0 @@ - - - - - -Protocol (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class Protocol

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Action
    -
    -
    -
    -
    public final class Protocol
    -extends Object
    -implements Action
    -
    Used to block older clients from reading or writing the log when backwards - incompatible changes are made to the protocol. Readers and writers are - responsible for checking that they meet the minimum versions before performing - any other operations. -

    - Since this action allows us to explicitly block older clients in the case of a - breaking change to the protocol, clients should be tolerant of messages and - fields that they do not understand.

    -
    -
    See Also:
    -
    Delta Transaction Log Protocol: Protocol Evolution
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      Protocol(int minReaderVersion, - int minWriterVersion) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Protocol

        -
        public Protocol(int minReaderVersion,
        -                int minWriterVersion)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getMinReaderVersion

        -
        public int getMinReaderVersion()
        -
        -
        Returns:
        -
        the minimum version of the Delta read protocol that a client must implement in order - to correctly read this table
        -
        -
      • -
      - - - -
        -
      • -

        getMinWriterVersion

        -
        public int getMinWriterVersion()
        -
        -
        Returns:
        -
        the minimum version of the Delta write protocol that a client must implement in order - to correctly write this table
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html deleted file mode 100644 index 0c2da044a82..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/RemoveFile.html +++ /dev/null @@ -1,471 +0,0 @@ - - - - - -RemoveFile (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class RemoveFile

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      RemoveFile(String path, - java.util.Optional<Long> deletionTimestamp, - boolean dataChange, - boolean extendedFileMetadata, - java.util.Map<String,String> partitionValues, - java.util.Optional<Long> size, - java.util.Map<String,String> tags) -
      Deprecated.  -
      RemoveFile should be created from AddFile.remove() instead.
      -
      -
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        RemoveFile

        -
        @Deprecated
        -public RemoveFile(@Nonnull
        -                              String path,
        -                              @Nonnull
        -                              java.util.Optional<Long> deletionTimestamp,
        -                              boolean dataChange,
        -                              boolean extendedFileMetadata,
        -                              @Nullable
        -                              java.util.Map<String,String> partitionValues,
        -                              @Nonnull
        -                              java.util.Optional<Long> size,
        -                              @Nullable
        -                              java.util.Map<String,String> tags)
        -
        Deprecated. RemoveFile should be created from AddFile.remove() instead.
        -
        Users should not construct RemoveFiles themselves, and should instead use one - of the various AddFile.remove() methods to instantiate the correct RemoveFile - for a given AddFile instance.
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPath

        -
        public String getPath()
        -
        -
        Specified by:
        -
        getPath in interface FileAction
        -
        Returns:
        -
        the relative path or the absolute path that should be removed from the table. If it's - a relative path, it's relative to the root of the table. Note: the path is encoded - and should be decoded by new java.net.URI(path) when using it.
        -
        -
      • -
      - - - -
        -
      • -

        getDeletionTimestamp

        -
        public java.util.Optional<Long> getDeletionTimestamp()
        -
        -
        Returns:
        -
        the time that this file was deleted as milliseconds since the epoch
        -
        -
      • -
      - - - -
        -
      • -

        isDataChange

        -
        public boolean isDataChange()
        -
        -
        Specified by:
        -
        isDataChange in interface FileAction
        -
        Returns:
        -
        whether any data was changed as a result of this file being removed. When - false the records in the removed file must be contained in one or more add - actions in the same version
        -
        -
      • -
      - - - -
        -
      • -

        isExtendedFileMetadata

        -
        public boolean isExtendedFileMetadata()
        -
        -
        Returns:
        -
        true if the fields partitionValues, size, and tags are - present
        -
        -
      • -
      - - - -
        -
      • -

        getPartitionValues

        -
        @Nullable
        -public java.util.Map<String,String> getPartitionValues()
        -
        -
        Returns:
        -
        an unmodifiable Map from partition column to value for - this file. Partition values are stored as strings, using the following formats. - An empty string for any type translates to a null partition value.
        -
        See Also:
        -
        Delta Protocol Partition Value Serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSize

        -
        public java.util.Optional<Long> getSize()
        -
        -
        Returns:
        -
        the size of this file in bytes
        -
        -
      • -
      - - - -
        -
      • -

        getTags

        -
        @Nullable
        -public java.util.Map<String,String> getTags()
        -
        -
        Returns:
        -
        an unmodifiable Map containing metadata about this file
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html deleted file mode 100644 index 255b82e4f0c..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/SetTransaction.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - -SetTransaction (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.actions
-

Class SetTransaction

-
-
- -
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      SetTransaction(String appId, - long version, - java.util.Optional<Long> lastUpdated) 
      -
    • -
    - - -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        SetTransaction

        -
        public SetTransaction(@Nonnull
        -                      String appId,
        -                      long version,
        -                      @Nonnull
        -                      java.util.Optional<Long> lastUpdated)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getAppId

        -
        @Nonnull
        -public String getAppId()
        -
        -
        Returns:
        -
        the unique identifier for the application performing the transaction
        -
        -
      • -
      - - - -
        -
      • -

        getVersion

        -
        public long getVersion()
        -
        -
        Returns:
        -
        the application-specific numeric identifier for this transaction
        -
        -
      • -
      - - - -
        -
      • -

        getLastUpdated

        -
        @Nonnull
        -public java.util.Optional<Long> getLastUpdated()
        -
        -
        Returns:
        -
        the time when this transaction action was created, in milliseconds since the Unix - epoch
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html deleted file mode 100644 index f62d1161a0a..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/package-frame.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -io.delta.standalone.actions (Delta Standalone 0.6.0 JavaDoc) - - - - - -

io.delta.standalone.actions

-
-

Interfaces

- -

Classes

- -
- - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html deleted file mode 100644 index b973efe8d97..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/package-summary.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - -io.delta.standalone.actions (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.actions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html deleted file mode 100644 index 71a21c180f4..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/actions/package-tree.html +++ /dev/null @@ -1,156 +0,0 @@ - - - - - -io.delta.standalone.actions Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.actions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html deleted file mode 100644 index 89a9418829e..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/CloseableIterator.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - -CloseableIterator (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.data
-

Interface CloseableIterator<T>

-
-
-
-
    -
  • -
    -
    All Superinterfaces:
    -
    AutoCloseable, java.io.Closeable, java.util.Iterator<T>
    -
    -
    -
    -
    public interface CloseableIterator<T>
    -extends java.util.Iterator<T>, java.io.Closeable
    -
    An Iterator that also implements the Closeable interface. The caller - should call Closeable.close() method to free all resources properly after using the iterator.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from interface java.util.Iterator

        -forEachRemaining, hasNext, next, remove
      • -
      -
        -
      • - - -

        Methods inherited from interface java.io.Closeable

        -close
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html deleted file mode 100644 index b1a9bdc18ac..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/RowRecord.html +++ /dev/null @@ -1,682 +0,0 @@ - - - - - -RowRecord (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.data
-

Interface RowRecord

-
-
-
-
    -
  • -
    -
    -
    public interface RowRecord
    -
    Represents one row of data containing a non-empty collection of fieldName - value pairs. - It provides APIs to allow retrieval of values through fieldName lookup. For example, - -
    
    -   if (row.isNullAt("int_field")) {
    -     // handle the null value.
    -   } else {
    -     int x = getInt("int_field");
    -   }
    - 
    -
    -
    See Also:
    -
    StructType, -StructField
    -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Abstract Methods 
      Modifier and TypeMethod and Description
      java.math.BigDecimalgetBigDecimal(String fieldName) -
      Retrieves value from data record and returns the value as a java.math.BigDecimal.
      -
      byte[]getBinary(String fieldName) -
      Retrieves value from data record and returns the value as binary (byte array).
      -
      booleangetBoolean(String fieldName) -
      Retrieves value from data record and returns the value as a primitive boolean.
      -
      bytegetByte(String fieldName) -
      Retrieves value from data record and returns the value as a primitive byte.
      -
      java.sql.DategetDate(String fieldName) -
      Retrieves value from data record and returns the value as a java.sql.Date.
      -
      doublegetDouble(String fieldName) -
      Retrieves value from data record and returns the value as a primitive double.
      -
      floatgetFloat(String fieldName) -
      Retrieves value from data record and returns the value as a primitive float.
      -
      intgetInt(String fieldName) -
      Retrieves value from data record and returns the value as a primitive int.
      -
      intgetLength() 
      <T> java.util.List<T>getList(String fieldName) -
      Retrieves value from data record and returns the value as a java.util.List<T> object.
      -
      longgetLong(String fieldName) -
      Retrieves value from data record and returns the value as a primitive long.
      -
      <K,V> java.util.Map<K,V>getMap(String fieldName) -
      Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
      -
      RowRecordgetRecord(String fieldName) -
      Retrieves value from data record and returns the value as a RowRecord object.
      -
      StructTypegetSchema() 
      shortgetShort(String fieldName) -
      Retrieves value from data record and returns the value as a primitive short.
      -
      StringgetString(String fieldName) -
      Retrieves value from data record and returns the value as a String object.
      -
      java.sql.TimestampgetTimestamp(String fieldName) -
      Retrieves value from data record and returns the value as a java.sql.Timestamp.
      -
      booleanisNullAt(String fieldName) 
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        getLength

        -
        int getLength()
        -
        -
        Returns:
        -
        the number of elements in this RowRecord
        -
        -
      • -
      - - - -
        -
      • -

        isNullAt

        -
        boolean isNullAt(String fieldName)
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        whether the value of field fieldName is null
        -
        -
      • -
      - - - -
        -
      • -

        getInt

        -
        int getInt(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive int.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive int
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getLong

        -
        long getLong(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive long.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive long
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getByte

        -
        byte getByte(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive byte.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive byte
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getShort

        -
        short getShort(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive short.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive short
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBoolean

        -
        boolean getBoolean(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive boolean.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive boolean
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getFloat

        -
        float getFloat(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive float.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive float
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getDouble

        -
        double getDouble(String fieldName)
        -
        Retrieves value from data record and returns the value as a primitive double.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a primitive double
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getString

        -
        String getString(String fieldName)
        -
        Retrieves value from data record and returns the value as a String object.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a String object. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBinary

        -
        byte[] getBinary(String fieldName)
        -
        Retrieves value from data record and returns the value as binary (byte array).
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as binary (byte array). null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getBigDecimal

        -
        java.math.BigDecimal getBigDecimal(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.math.BigDecimal.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.math.BigDecimal. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getTimestamp

        -
        java.sql.Timestamp getTimestamp(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.sql.Timestamp.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.sql.Timestamp. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getDate

        -
        java.sql.Date getDate(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.sql.Date.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as java.sql.Date. null only if - null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - if field is not nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getRecord

        -
        RowRecord getRecord(String fieldName)
        -
        Retrieves value from data record and returns the value as a RowRecord object.
        -
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a RowRecord object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any nested field, if that field is not - nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getList

        -
        <T> java.util.List<T> getList(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.util.List<T> object.
        -
        -
        Type Parameters:
        -
        T - element type
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a java.util.List<T> object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any element field, if that field is not - nullable and null data value read
        -
        -
      • -
      - - - -
        -
      • -

        getMap

        -
        <K,V> java.util.Map<K,V> getMap(String fieldName)
        -
        Retrieves value from data record and returns the value as a java.util.Map<K, V> - object.
        -
        -
        Type Parameters:
        -
        K - key type
        -
        V - value type
        -
        Parameters:
        -
        fieldName - name of field/column, not null
        -
        Returns:
        -
        the value for field fieldName as a java.util.Map<K, V> object. - null only if null value read and field is nullable.
        -
        Throws:
        -
        IllegalArgumentException - if fieldName does not exist in this schema
        -
        ClassCastException - if data type does not match
        -
        NullPointerException - for this field or any key/value field, if that field is not - nullable and null data value read
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/package-frame.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/package-frame.html deleted file mode 100644 index 19a5bc55aad..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -io.delta.standalone.data (Delta Standalone 0.6.0 JavaDoc) - - - - - -

io.delta.standalone.data

-
-

Interfaces

- -
- - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/package-summary.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/package-summary.html deleted file mode 100644 index 3963c9c8181..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/package-summary.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - -io.delta.standalone.data (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.data

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/package-tree.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/package-tree.html deleted file mode 100644 index 4c7d7c14707..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/data/package-tree.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - -io.delta.standalone.data Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.data

-Package Hierarchies: - -
-
-

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html deleted file mode 100644 index 847f9008dfe..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentAppendException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentAppendException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentAppendException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentAppendException
    -extends DeltaConcurrentModificationException
    -
    Thrown when files are added that would have been read by the current transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentAppendException

        -
        public ConcurrentAppendException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html deleted file mode 100644 index 6c66c07690e..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentDeleteDeleteException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentDeleteDeleteException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentDeleteDeleteException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the current transaction deletes data that was deleted by a concurrent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentDeleteDeleteException

        -
        public ConcurrentDeleteDeleteException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html deleted file mode 100644 index 7b4893a3a46..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentDeleteReadException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentDeleteReadException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentDeleteReadException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the current transaction reads data that was deleted by a concurrent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentDeleteReadException

        -
        public ConcurrentDeleteReadException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html deleted file mode 100644 index cae00d0cf62..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ConcurrentTransactionException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ConcurrentTransactionException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ConcurrentTransactionException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ConcurrentTransactionException
    -extends DeltaConcurrentModificationException
    -
    Thrown when concurrent transaction both attempt to update the same idempotent transaction.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ConcurrentTransactionException

        -
        public ConcurrentTransactionException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html deleted file mode 100644 index f6680fd0a91..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.html +++ /dev/null @@ -1,275 +0,0 @@ - - - - - -DeltaConcurrentModificationException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class DeltaConcurrentModificationException

-
-
- -
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DeltaConcurrentModificationException

        -
        public DeltaConcurrentModificationException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html deleted file mode 100644 index 00afec7e197..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/DeltaStandaloneException.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - -DeltaStandaloneException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class DeltaStandaloneException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class DeltaStandaloneException
    -extends RuntimeException
    -
    Thrown when a query fails, usually because the query itself is invalid.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException()
        -
      • -
      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException(String message)
        -
      • -
      - - - -
        -
      • -

        DeltaStandaloneException

        -
        public DeltaStandaloneException(String message,
        -                                Throwable cause)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html deleted file mode 100644 index 4ee39b52074..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/MetadataChangedException.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - -MetadataChangedException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class MetadataChangedException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class MetadataChangedException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the metadata of the Delta table has changed between the time of read - and the time of commit.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MetadataChangedException

        -
        public MetadataChangedException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html deleted file mode 100644 index 7acc33a483f..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/ProtocolChangedException.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - -ProtocolChangedException (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.exceptions
-

Class ProtocolChangedException

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable
    -
    -
    -
    -
    public class ProtocolChangedException
    -extends DeltaConcurrentModificationException
    -
    Thrown when the protocol version has changed between the time of read and the time of commit.
    -
    -
    See Also:
    -
    Serialized Form
    -
    -
  • -
-
-
-
    -
  • - - - -
      -
    • - - -

      Method Summary

      -
        -
      • - - -

        Methods inherited from class Throwable

        -addSuppressed, fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
      • -
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ProtocolChangedException

        -
        public ProtocolChangedException(String message)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html deleted file mode 100644 index e58d232e76e..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/package-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -io.delta.standalone.exceptions (Delta Standalone 0.6.0 JavaDoc) - - - - - -

io.delta.standalone.exceptions

-
-

Exceptions

- -
- - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html deleted file mode 100644 index 239b16ca4a3..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/package-summary.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - -io.delta.standalone.exceptions (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.exceptions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html deleted file mode 100644 index fa01da95f4d..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/exceptions/package-tree.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - -io.delta.standalone.exceptions Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.exceptions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/And.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/And.html deleted file mode 100644 index b78fdff2db6..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/And.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - -And (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class And

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class And
    -extends BinaryOperator
    -implements Predicate
    -
    Evaluates logical expr1 AND expr2 for new And(expr1, expr2). -

    - Requires both left and right input expressions evaluate to booleans.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object leftResult,
        -                           Object rightResult)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html deleted file mode 100644 index 1788e4814c0..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/BinaryComparison.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - -BinaryComparison (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryComparison

-
-
- -
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html deleted file mode 100644 index 5eafd62a25a..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/BinaryExpression.html +++ /dev/null @@ -1,340 +0,0 @@ - - - - - -BinaryExpression (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryExpression

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    BinaryOperator
    -
    -
    -
    -
    public abstract class BinaryExpression
    -extends Object
    -implements Expression
    -
    An Expression with two inputs and one output. The output is by default evaluated to null - if either input is evaluated to null.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - - - - - -
        -
      • -

        eval

        -
        public final Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html deleted file mode 100644 index 9723eaf4be8..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/BinaryOperator.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - -BinaryOperator (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class BinaryOperator

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    And, BinaryComparison, Or
    -
    -
    -
    -
    public abstract class BinaryOperator
    -extends BinaryExpression
    -
    A BinaryExpression that is an operator, meaning the string representation is - x symbol y, rather than funcName(x, y). -

    - Requires both inputs to be of the same data type.

    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Column.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Column.html deleted file mode 100644 index 46438187fa7..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Column.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - -Column (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Column

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        Column

        -
        public Column(String name,
        -              DataType dataType)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        name

        -
        public String name()
        -
      • -
      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        dataType

        -
        public DataType dataType()
        -
        -
        Returns:
        -
        the DataType of the result of evaluating this expression.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        public java.util.Set<String> references()
        -
        -
        Specified by:
        -
        references in interface Expression
        -
        Overrides:
        -
        references in class LeafExpression
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Specified by:
        -
        equals in class LeafExpression
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html deleted file mode 100644 index d99432055b3..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/EqualTo.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -EqualTo (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class EqualTo

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html deleted file mode 100644 index 18acb401378..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Expression.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - -Expression (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Interface Expression

-
-
-
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        Object eval(RowRecord record)
        -
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        dataType

        -
        DataType dataType()
        -
        -
        Returns:
        -
        the DataType of the result of evaluating this expression.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        String toString()
        -
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        default java.util.Set<String> references()
        -
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        java.util.List<Expression> children()
        -
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html deleted file mode 100644 index 996d8a44db3..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThan.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -GreaterThan (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class GreaterThan

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html deleted file mode 100644 index dc185ae3fdf..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/GreaterThanOrEqual.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -GreaterThanOrEqual (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class GreaterThanOrEqual

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class GreaterThanOrEqual
    -extends BinaryComparison
    -implements Predicate
    -
    Evaluates expr1 >= expr2 for new GreaterThanOrEqual(expr1, expr2).
    -
  • -
-
-
- -
-
-
    -
  • - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/In.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/In.html deleted file mode 100644 index 710292c93cb..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/In.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - -In (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class In

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class In
    -extends Object
    -implements Predicate
    -
    Evaluates if expr is in exprList for new In(expr, exprList). True if - expr is equal to any expression in exprList, else false.
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Summary

      - - - - - - - - -
      Constructors 
      Constructor and Description
      In(Expression value, - java.util.List<? extends Expression> elems) 
      -
    • -
    - -
      -
    • - - -

      Method Summary

      - - - - - - - - - - - - - - - - - - -
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethod and Description
      java.util.List<Expression>children() 
      Booleaneval(RowRecord record) -
      This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide.
      -
      StringtoString() 
      -
        -
      • - - -

        Methods inherited from class Object

        -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • -
      - - -
    • -
    -
  • -
-
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        In

        -
        public In(Expression value,
        -          java.util.List<? extends Expression> elems)
        -
        -
        Parameters:
        -
        value - a nonnull expression
        -
        elems - a nonnull, nonempty list of expressions with the same data type as - value
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Boolean eval(RowRecord record)
        -
        This implements the IN expression functionality outlined by the Databricks SQL Null - semantics reference guide. The logic is as follows: -
          -
        • TRUE if the non-NULL value is found in the list
        • -
        • FALSE if the non-NULL value is not found in the list and the list does not contain - NULL values
        • -
        • NULL if the value is NULL, or the non-NULL value is not found in the list and the - list contains at least one NULL value
        • -
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        See Also:
        -
        NULL Semantics
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html deleted file mode 100644 index 79e9ed4d053..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/IsNotNull.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - -IsNotNull (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class IsNotNull

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        IsNotNull

        -
        public IsNotNull(Expression child)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Overrides:
        -
        eval in class UnaryExpression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html deleted file mode 100644 index 67fc13cad0c..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/IsNull.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - -IsNull (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class IsNull

-
-
- -
- -
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Overrides:
        -
        eval in class UnaryExpression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html deleted file mode 100644 index edbdfbd9846..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/LeafExpression.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - -LeafExpression (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LeafExpression

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        references

        -
        public java.util.Set<String> references()
        -
        -
        Specified by:
        -
        references in interface Expression
        -
        Returns:
        -
        the names of columns referenced by this expression.
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public abstract boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public abstract int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html deleted file mode 100644 index f7cef3225d0..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/LessThan.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -LessThan (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LessThan

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html deleted file mode 100644 index 2ba911f9de1..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/LessThanOrEqual.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - -LessThanOrEqual (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class LessThanOrEqual

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html deleted file mode 100644 index 51726167930..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Literal.html +++ /dev/null @@ -1,617 +0,0 @@ - - - - - -Literal (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Literal

-
-
- -
- -
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Not.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Not.html deleted file mode 100644 index 59d7db9f3bc..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Not.html +++ /dev/null @@ -1,324 +0,0 @@ - - - - - -Not (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Not

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class Not
    -extends UnaryExpression
    -implements Predicate
    -
    Evaluates logical NOT expr for new Not(expr). -

    - Requires the child expression evaluates to a boolean.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object childResult)
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Specified by:
        -
        toString in interface Expression
        -
        Overrides:
        -
        toString in class Object
        -
        Returns:
        -
        the String representation of this expression.
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Or.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Or.html deleted file mode 100644 index cce2be15095..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Or.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - -Or (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class Or

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression, Predicate
    -
    -
    -
    -
    public final class Or
    -extends BinaryOperator
    -implements Predicate
    -
    Evaluates logical expr1 OR expr2 for new Or(expr1, expr2). -

    - Requires both left and right input expressions evaluate to booleans.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        nullSafeEval

        -
        public Object nullSafeEval(Object leftResult,
        -                           Object rightResult)
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html deleted file mode 100644 index 9c885fb7dfc..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/Predicate.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - -Predicate (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Interface Predicate

-
-
-
- -
-
- -
-
-
    -
  • - - -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html deleted file mode 100644 index 8a24bf0b989..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/UnaryExpression.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - -UnaryExpression (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.expressions
-

Class UnaryExpression

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    Expression
    -
    -
    -
    Direct Known Subclasses:
    -
    IsNotNull, IsNull, Not
    -
    -
    -
    -
    public abstract class UnaryExpression
    -extends Object
    -implements Expression
    -
    An Expression with one input and one output. The output is by default evaluated to null - if the input is evaluated to null.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - - - - - -
        -
      • -

        eval

        -
        public Object eval(RowRecord record)
        -
        -
        Specified by:
        -
        eval in interface Expression
        -
        Parameters:
        -
        record - the input record to evaluate.
        -
        Returns:
        -
        the result of evaluating this expression on the given input RowRecord.
        -
        -
      • -
      - - - -
        -
      • -

        children

        -
        public java.util.List<Expression> children()
        -
        -
        Specified by:
        -
        children in interface Expression
        -
        Returns:
        -
        a List of the immediate children of this node
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html deleted file mode 100644 index bdd0dca1c10..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/package-frame.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - -io.delta.standalone.expressions (Delta Standalone 0.6.0 JavaDoc) - - - - - -

io.delta.standalone.expressions

-
-

Interfaces

- -

Classes

- -
- - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html deleted file mode 100644 index fbdf9480cc0..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/package-summary.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - -io.delta.standalone.expressions (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.expressions

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html deleted file mode 100644 index e6a051f5e57..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/expressions/package-tree.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - -io.delta.standalone.expressions Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.expressions

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/package-frame.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/package-frame.html deleted file mode 100644 index 7803fe6c692..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/package-frame.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -io.delta.standalone (Delta Standalone 0.6.0 JavaDoc) - - - - - -

io.delta.standalone

-
-

Interfaces

- -

Classes

- -

Enums

- -
- - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/package-summary.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/package-summary.html deleted file mode 100644 index e5d6f70e86a..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/package-summary.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - -io.delta.standalone (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/package-tree.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/package-tree.html deleted file mode 100644 index 8fabe4bf2ac..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/package-tree.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - -io.delta.standalone Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html deleted file mode 100644 index 2d6891aec8b..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/ArrayType.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - -ArrayType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ArrayType

-
-
- -
-
    -
  • -
    -
    -
    public final class ArrayType
    -extends DataType
    -
    The data type for collections of multiple values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ArrayType

        -
        public ArrayType(DataType elementType,
        -                 boolean containsNull)
        -
        -
        Parameters:
        -
        elementType - the data type of values
        -
        containsNull - indicates if values have null value
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getElementType

        -
        public DataType getElementType()
        -
        -
        Returns:
        -
        the type of array elements
        -
        -
      • -
      - - - -
        -
      • -

        containsNull

        -
        public boolean containsNull()
        -
        -
        Returns:
        -
        true if the array has null values, else false
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html deleted file mode 100644 index adf625372b1..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/BinaryType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -BinaryType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class BinaryType

-
-
- -
-
    -
  • -
    -
    -
    public final class BinaryType
    -extends DataType
    -
    The data type representing byte[] values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BinaryType

        -
        public BinaryType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html deleted file mode 100644 index bb669dadca5..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/BooleanType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -BooleanType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class BooleanType

-
-
- -
-
    -
  • -
    -
    -
    public final class BooleanType
    -extends DataType
    -
    The data type representing boolean values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        BooleanType

        -
        public BooleanType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/ByteType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/ByteType.html deleted file mode 100644 index 3cc69db2531..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/ByteType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -ByteType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ByteType

-
-
- -
-
    -
  • -
    -
    -
    public final class ByteType
    -extends DataType
    -
    The data type representing byte values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ByteType

        -
        public ByteType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DataType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DataType.html deleted file mode 100644 index 60a64b5f51a..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DataType.html +++ /dev/null @@ -1,418 +0,0 @@ - - - - - -DataType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DataType

-
-
- -
- -
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DataType

        -
        public DataType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        fromJson

        -
        public static DataType fromJson(String json)
        -
        Parses the input json into a DataType.
        -
        -
        Parameters:
        -
        json - the String json to parse
        -
        Returns:
        -
        the parsed DataType
        -
        -
      • -
      - - - -
        -
      • -

        getTypeName

        -
        public String getTypeName()
        -
        -
        Returns:
        -
        the name of the type used in JSON serialization
        -
        -
      • -
      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      - - - -
        -
      • -

        getCatalogString

        -
        public String getCatalogString()
        -
        -
        Returns:
        -
        a String representation for the type saved in external catalogs
        -
        -
      • -
      - - - -
        -
      • -

        toJson

        -
        public String toJson()
        -
        -
        Returns:
        -
        a JSON String representation of the type
        -
        -
      • -
      - - - -
        -
      • -

        toPrettyJson

        -
        public String toPrettyJson()
        -
        -
        Returns:
        -
        a pretty (i.e. indented) JSON String representation of the type
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        equivalent

        -
        public boolean equivalent(DataType dt)
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DateType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DateType.html deleted file mode 100644 index d35f098e02a..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DateType.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - -DateType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DateType

-
-
- -
-
    -
  • -
    -
    -
    public final class DateType
    -extends DataType
    -
    A date type, supporting "0001-01-01" through "9999-12-31". - Internally, this is represented as the number of days from 1970-01-01.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DateType

        -
        public DateType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html deleted file mode 100644 index 1846bce210b..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DecimalType.html +++ /dev/null @@ -1,398 +0,0 @@ - - - - - -DecimalType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DecimalType

-
-
- -
-
    -
  • -
    -
    -
    public final class DecimalType
    -extends DataType
    -
    The data type representing java.math.BigDecimal values. - A Decimal that must have fixed precision (the maximum number of digits) and scale (the number - of digits on right side of dot). - - The precision can be up to 38, scale can also be up to 38 (less or equal to precision). - - The default precision and scale is (10, 0).
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Field Detail

      - - - -
        -
      • -

        USER_DEFAULT

        -
        public static final DecimalType USER_DEFAULT
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DecimalType

        -
        public DecimalType(int precision,
        -                   int scale)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getPrecision

        -
        public int getPrecision()
        -
        -
        Returns:
        -
        the maximum number of digits of the decimal
        -
        -
      • -
      - - - -
        -
      • -

        getScale

        -
        public int getScale()
        -
        -
        Returns:
        -
        the number of digits on the right side of the decimal point (dot)
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - - - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html deleted file mode 100644 index 4a13d918211..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/DoubleType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -DoubleType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class DoubleType

-
-
- -
-
    -
  • -
    -
    -
    public final class DoubleType
    -extends DataType
    -
    The data type representing double values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        DoubleType

        -
        public DoubleType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html deleted file mode 100644 index 7e8fa6f4b5a..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.Builder.html +++ /dev/null @@ -1,441 +0,0 @@ - - - - - -FieldMetadata.Builder (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FieldMetadata.Builder

-
-
- -
-
    -
  • -
    -
    Enclosing class:
    -
    FieldMetadata
    -
    -
    -
    -
    public static class FieldMetadata.Builder
    -extends Object
    -
    Builder class for FieldMetadata.
    -
  • -
-
-
- -
-
- -
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html deleted file mode 100644 index 0e140a67cac..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/FieldMetadata.html +++ /dev/null @@ -1,368 +0,0 @@ - - - - - -FieldMetadata (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FieldMetadata

-
-
- -
-
    -
  • -
    -
    -
    public final class FieldMetadata
    -extends Object
    -
    The metadata for a given StructField.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getEntries

        -
        public java.util.Map<String,Object> getEntries()
        -
        -
        Returns:
        -
        list of the key-value pairs in this FieldMetadata
        -
        -
      • -
      - - - -
        -
      • -

        contains

        -
        public boolean contains(String key)
        -
        -
        Parameters:
        -
        key - the key to check for
        -
        Returns:
        -
        True if this contains a mapping for the given key, False otherwise
        -
        -
      • -
      - - - -
        -
      • -

        get

        -
        public Object get(String key)
        -
        -
        Parameters:
        -
        key - the key to check for
        -
        Returns:
        -
        the value to which the specified key is mapped, or null if there is no mapping for - the given key
        -
        -
      • -
      - - - -
        -
      • -

        toString

        -
        public String toString()
        -
        -
        Overrides:
        -
        toString in class Object
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      - - - - -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/FloatType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/FloatType.html deleted file mode 100644 index a0970a04324..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/FloatType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -FloatType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class FloatType

-
-
- -
-
    -
  • -
    -
    -
    public final class FloatType
    -extends DataType
    -
    The data type representing float values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        FloatType

        -
        public FloatType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html deleted file mode 100644 index d058547061f..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/IntegerType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -IntegerType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class IntegerType

-
-
- -
-
    -
  • -
    -
    -
    public final class IntegerType
    -extends DataType
    -
    The data type representing int values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        IntegerType

        -
        public IntegerType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/LongType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/LongType.html deleted file mode 100644 index e5ac397ab63..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/LongType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -LongType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class LongType

-
-
- -
-
    -
  • -
    -
    -
    public final class LongType
    -extends DataType
    -
    The data type representing long values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        LongType

        -
        public LongType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/MapType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/MapType.html deleted file mode 100644 index 0dd7d326952..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/MapType.html +++ /dev/null @@ -1,364 +0,0 @@ - - - - - -MapType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class MapType

-
-
- -
-
    -
  • -
    -
    -
    public final class MapType
    -extends DataType
    -
    The data type for Maps. Keys in a map are not allowed to have null values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        MapType

        -
        public MapType(DataType keyType,
        -               DataType valueType,
        -               boolean valueContainsNull)
        -
        -
        Parameters:
        -
        keyType - the data type of map keys
        -
        valueType - the data type of map values
        -
        valueContainsNull - indicates if map values have null values
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getKeyType

        -
        public DataType getKeyType()
        -
        -
        Returns:
        -
        the data type of map keys
        -
        -
      • -
      - - - -
        -
      • -

        getValueType

        -
        public DataType getValueType()
        -
        -
        Returns:
        -
        the data type of map values
        -
        -
      • -
      - - - -
        -
      • -

        valueContainsNull

        -
        public boolean valueContainsNull()
        -
        -
        Returns:
        -
        true if this map has null values, else false
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/NullType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/NullType.html deleted file mode 100644 index 3de7d0fb08d..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/NullType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -NullType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class NullType

-
-
- -
-
    -
  • -
    -
    -
    public final class NullType
    -extends DataType
    -
    The data type representing null values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        NullType

        -
        public NullType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/ShortType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/ShortType.html deleted file mode 100644 index 883c4cb48de..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/ShortType.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - -ShortType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class ShortType

-
-
- -
-
    -
  • -
    -
    -
    public final class ShortType
    -extends DataType
    -
    The data type representing short values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        ShortType

        -
        public ShortType()
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getSimpleString

        -
        public String getSimpleString()
        -
        -
        Overrides:
        -
        getSimpleString in class DataType
        -
        Returns:
        -
        a readable String representation for the type
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/StringType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/StringType.html deleted file mode 100644 index 100db722eb7..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/StringType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -StringType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StringType

-
-
- -
-
    -
  • -
    -
    -
    public final class StringType
    -extends DataType
    -
    The data type representing String values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StringType

        -
        public StringType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/StructField.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/StructField.html deleted file mode 100644 index e1de1f68793..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/StructField.html +++ /dev/null @@ -1,416 +0,0 @@ - - - - - -StructField (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StructField

-
-
- -
-
    -
  • -
    -
    -
    public final class StructField
    -extends Object
    -
    A field inside a StructType.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType)
        -
        Constructor with default nullable = true.
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        -
      • -
      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType,
        -                   boolean nullable)
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        nullable - indicates if values of this field can be null values
        -
        -
      • -
      - - - -
        -
      • -

        StructField

        -
        public StructField(String name,
        -                   DataType dataType,
        -                   boolean nullable,
        -                   FieldMetadata metadata)
        -
        -
        Parameters:
        -
        name - the name of this field
        -
        dataType - the data type of this field
        -
        nullable - indicates if values of this field can be null values
        -
        metadata - metadata for this field
        -
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        getName

        -
        public String getName()
        -
        -
        Returns:
        -
        the name of this field
        -
        -
      • -
      - - - -
        -
      • -

        getDataType

        -
        public DataType getDataType()
        -
        -
        Returns:
        -
        the data type of this field
        -
        -
      • -
      - - - -
        -
      • -

        isNullable

        -
        public boolean isNullable()
        -
        -
        Returns:
        -
        whether this field allows to have a null value.
        -
        -
      • -
      - - - -
        -
      • -

        getMetadata

        -
        public FieldMetadata getMetadata()
        -
        -
        Returns:
        -
        the metadata for this field
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class Object
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class Object
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/StructType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/StructType.html deleted file mode 100644 index 38004e5ea62..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/StructType.html +++ /dev/null @@ -1,559 +0,0 @@ - - - - - -StructType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class StructType

-
-
- -
-
    -
  • -
    -
    -
    public final class StructType
    -extends DataType
    -
    The data type representing a table's schema, consisting of a collection of - fields (that is, fieldName to dataType pairs).
    -
    -
    See Also:
    -
    StructField
    -
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        StructType

        -
        public StructType()
        -
      • -
      - - - -
        -
      • -

        StructType

        -
        public StructType(StructField[] fields)
        -
      • -
      -
    • -
    - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        add

        -
        public StructType add(StructField field)
        -
        Creates a new StructType by adding a new field. - -
        
        - StructType schema = new StructType()
        -     .add(new StructField("a", new IntegerType(), true))
        -     .add(new StructField("b", new LongType(), false))
        -     .add(new StructField("c", new StringType(), true))
        - 
        -
        -
        Parameters:
        -
        field - The new field to add.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        add

        -
        public StructType add(String fieldName,
        -                      DataType dataType)
        -
        Creates a new StructType by adding a new nullable field with no metadata. - -
        
        - StructType schema = new StructType()
        -     .add("a", new IntegerType())
        -     .add("b", new LongType())
        -     .add("c", new StringType())
        - 
        -
        -
        Parameters:
        -
        fieldName - The name of the new field.
        -
        dataType - The datatype for the new field.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        add

        -
        public StructType add(String fieldName,
        -                      DataType dataType,
        -                      boolean nullable)
        -
        Creates a new StructType by adding a new field with no metadata. - -
        
        - StructType schema = new StructType()
        -     .add("a", new IntegerType(), true)
        -     .add("b", new LongType(), false)
        -     .add("c", new StringType(), true)
        - 
        -
        -
        Parameters:
        -
        fieldName - The name of the new field.
        -
        dataType - The datatype for the new field.
        -
        nullable - Whether or not the new field is nullable.
        -
        Returns:
        -
        a StructType with the added field
        -
        -
      • -
      - - - -
        -
      • -

        getFields

        -
        public StructField[] getFields()
        -
        -
        Returns:
        -
        array of fields
        -
        -
      • -
      - - - -
        -
      • -

        getFieldNames

        -
        public String[] getFieldNames()
        -
        -
        Returns:
        -
        array of field names
        -
        -
      • -
      - - - -
        -
      • -

        length

        -
        public int length()
        -
        -
        Returns:
        -
        the number of fields
        -
        -
      • -
      - - - -
        -
      • -

        get

        -
        public StructField get(String fieldName)
        -
        -
        Parameters:
        -
        fieldName - the name of the desired StructField, not null
        -
        Returns:
        -
        the link with the given name, not null
        -
        Throws:
        -
        IllegalArgumentException - if a field with the given name does not exist
        -
        -
      • -
      - - - -
        -
      • -

        column

        -
        public Column column(String fieldName)
        -
        Creates a Column expression for the field with the given fieldName.
        -
        -
        Parameters:
        -
        fieldName - the name of the StructField to create a column for
        -
        Returns:
        -
        a Column expression for the StructField with name fieldName
        -
        -
      • -
      - - - -
        -
      • -

        getTreeString

        -
        public String getTreeString()
        -
        -
        Returns:
        -
        a readable indented tree representation of this StructType - and all of its nested elements
        -
        -
      • -
      - - - -
        -
      • -

        equals

        -
        public boolean equals(Object o)
        -
        -
        Overrides:
        -
        equals in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        hashCode

        -
        public int hashCode()
        -
        -
        Overrides:
        -
        hashCode in class DataType
        -
        -
      • -
      - - - -
        -
      • -

        isWriteCompatible

        -
        public boolean isWriteCompatible(StructType newSchema)
        -
        Whether a new schema can replace this existing schema in a Delta table without rewriting data - files in the table. -

        - Returns false if the new schema: -

          -
        • Drops any column that is present in the current schema
        • -
        • Converts nullable=true to nullable=false for any column
        • -
        • Changes any datatype
        • -
        -
        -
        Parameters:
        -
        newSchema - the new schema to update the table with
        -
        Returns:
        -
        whether the new schema is compatible with this existing schema
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html deleted file mode 100644 index 2f01741714b..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/TimestampType.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - -TimestampType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.types
-

Class TimestampType

-
-
- -
-
    -
  • -
    -
    -
    public final class TimestampType
    -extends DataType
    -
    The data type representing java.sql.Timestamp values.
    -
  • -
-
-
- -
-
-
    -
  • - -
      -
    • - - -

      Constructor Detail

      - - - -
        -
      • -

        TimestampType

        -
        public TimestampType()
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/package-frame.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/package-frame.html deleted file mode 100644 index d5f3e36f964..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/package-frame.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -io.delta.standalone.types (Delta Standalone 0.6.0 JavaDoc) - - - - - -

io.delta.standalone.types

-
-

Classes

- -
- - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/package-summary.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/package-summary.html deleted file mode 100644 index 849f04a7eda..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/package-summary.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - -io.delta.standalone.types (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.types

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/package-tree.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/package-tree.html deleted file mode 100644 index cae0ec00899..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/types/package-tree.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - -io.delta.standalone.types Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.types

-Package Hierarchies: - -
-
-

Class Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html deleted file mode 100644 index bc45cd377f1..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.ParquetOutputTimestampType.html +++ /dev/null @@ -1,365 +0,0 @@ - - - - - -ParquetSchemaConverter.ParquetOutputTimestampType (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.util
-

Enum ParquetSchemaConverter.ParquetOutputTimestampType

-
-
- -
-
    -
  • -
    -
    All Implemented Interfaces:
    -
    java.io.Serializable, Comparable<ParquetSchemaConverter.ParquetOutputTimestampType>
    -
    -
    -
    Enclosing class:
    -
    ParquetSchemaConverter
    -
    -
    -
    -
    public static enum ParquetSchemaConverter.ParquetOutputTimestampType
    -extends Enum<ParquetSchemaConverter.ParquetOutputTimestampType>
    -
    :: DeveloperApi :: -

    - Represents Parquet timestamp types. -

      -
    • INT96 is a non-standard but commonly used timestamp type in Parquet.
    • -
    • TIMESTAMP_MICROS is a standard timestamp type in Parquet, which stores number of - microseconds from the Unix epoch.
    • -
    • TIMESTAMP_MILLIS is also standard, but with millisecond precision, which means the - microsecond portion of the timestamp value is truncated.
    • -
    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        values

        -
        public static ParquetSchemaConverter.ParquetOutputTimestampType[] values()
        -
        Returns an array containing the constants of this enum type, in -the order they are declared. This method may be used to iterate -over the constants as follows: -
        -for (ParquetSchemaConverter.ParquetOutputTimestampType c : ParquetSchemaConverter.ParquetOutputTimestampType.values())
        -    System.out.println(c);
        -
        -
        -
        Returns:
        -
        an array containing the constants of this enum type, in the order they are declared
        -
        -
      • -
      - - - -
        -
      • -

        valueOf

        -
        public static ParquetSchemaConverter.ParquetOutputTimestampType valueOf(String name)
        -
        Returns the enum constant of this type with the specified name. -The string must match exactly an identifier used to declare an -enum constant in this type. (Extraneous whitespace characters are -not permitted.)
        -
        -
        Parameters:
        -
        name - the name of the enum constant to be returned.
        -
        Returns:
        -
        the enum constant with the specified name
        -
        Throws:
        -
        IllegalArgumentException - if this enum type has no constant with the specified name
        -
        NullPointerException - if the argument is null
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html deleted file mode 100644 index 08853b0bf9b..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/ParquetSchemaConverter.html +++ /dev/null @@ -1,417 +0,0 @@ - - - - - -ParquetSchemaConverter (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - - -
-
io.delta.standalone.util
-

Class ParquetSchemaConverter

-
-
- -
-
    -
  • -
    -
    -
    public final class ParquetSchemaConverter
    -extends Object
    -
    :: DeveloperApi :: -

    - Converter class to convert StructType to Parquet MessageType.

    -
  • -
-
-
- -
-
-
    -
  • - - - -
      -
    • - - -

      Method Detail

      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   Boolean writeLegacyParquetFormat)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        writeLegacyParquetFormat - Whether to use legacy Parquet format compatible with Spark - 1.4 and prior versions when converting a StructType to a Parquet - MessageType. When set to false, use standard format defined in parquet-format - spec.
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   ParquetSchemaConverter.ParquetOutputTimestampType outputTimestampType)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        outputTimestampType - which parquet timestamp type to use when writing
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      - - - -
        -
      • -

        deltaToParquet

        -
        public static org.apache.parquet.schema.MessageType deltaToParquet(StructType schema,
        -                                                                   Boolean writeLegacyParquetFormat,
        -                                                                   ParquetSchemaConverter.ParquetOutputTimestampType outputTimestampType)
        -
        :: DeveloperApi :: -

        - Convert a StructType to Parquet MessageType.

        -
        -
        Parameters:
        -
        schema - the schema to convert
        -
        writeLegacyParquetFormat - Whether to use legacy Parquet format compatible with Spark - 1.4 and prior versions when converting a StructType to a Parquet - MessageType. When set to false, use standard format defined in parquet-format - spec.
        -
        outputTimestampType - which parquet timestamp type to use when writing
        -
        Returns:
        -
        schema as a Parquet MessageType
        -
        Throws:
        -
        IllegalArgumentException - if a StructField name contains invalid character(s)
        -
        -
      • -
      -
    • -
    -
  • -
-
-
- - -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/package-frame.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/package-frame.html deleted file mode 100644 index 5b17e834881..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/package-frame.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -io.delta.standalone.util (Delta Standalone 0.6.0 JavaDoc) - - - - - -

io.delta.standalone.util

-
-

Classes

- -

Enums

- -
- - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/package-summary.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/package-summary.html deleted file mode 100644 index 881cf804146..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/package-summary.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - -io.delta.standalone.util (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Package io.delta.standalone.util

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/package-tree.html b/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/package-tree.html deleted file mode 100644 index 58b5db2b321..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/io/delta/standalone/util/package-tree.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - -io.delta.standalone.util Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For Package io.delta.standalone.util

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/overview-frame.html b/connectors/docs/latest/delta-standalone/api/java/overview-frame.html deleted file mode 100644 index 9d4a3837ad2..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/overview-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Overview List (Delta Standalone 0.6.0 JavaDoc) - - - - - -
All Classes
-
-

Packages

- -
-

 

- - diff --git a/connectors/docs/latest/delta-standalone/api/java/overview-summary.html b/connectors/docs/latest/delta-standalone/api/java/overview-summary.html deleted file mode 100644 index a35ec24f7f5..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/overview-summary.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - -Overview (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Packages 
PackageDescription
io.delta.standalone 
io.delta.standalone.actions 
io.delta.standalone.data 
io.delta.standalone.exceptions 
io.delta.standalone.expressions 
io.delta.standalone.types 
io.delta.standalone.util 
-
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/overview-tree.html b/connectors/docs/latest/delta-standalone/api/java/overview-tree.html deleted file mode 100644 index 54f74fc44ae..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/overview-tree.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -Class Hierarchy (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Hierarchy For All Packages

-Package Hierarchies: - -
-
-

Class Hierarchy

- -

Interface Hierarchy

- -

Enum Hierarchy

- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/package-list b/connectors/docs/latest/delta-standalone/api/java/package-list deleted file mode 100644 index be387bb5e0f..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/package-list +++ /dev/null @@ -1,7 +0,0 @@ -io.delta.standalone -io.delta.standalone.actions -io.delta.standalone.data -io.delta.standalone.exceptions -io.delta.standalone.expressions -io.delta.standalone.types -io.delta.standalone.util diff --git a/connectors/docs/latest/delta-standalone/api/java/script.js b/connectors/docs/latest/delta-standalone/api/java/script.js deleted file mode 100644 index b3463569314..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/script.js +++ /dev/null @@ -1,30 +0,0 @@ -function show(type) -{ - count = 0; - for (var key in methods) { - var row = document.getElementById(key); - if ((methods[key] & type) != 0) { - row.style.display = ''; - row.className = (count++ % 2) ? rowColor : altColor; - } - else - row.style.display = 'none'; - } - updateTabs(type); -} - -function updateTabs(type) -{ - for (var value in tabs) { - var sNode = document.getElementById(tabs[value][0]); - var spanNode = sNode.firstChild; - if (value == type) { - sNode.className = activeTableTab; - spanNode.innerHTML = tabs[value][1]; - } - else { - sNode.className = tableTab; - spanNode.innerHTML = "" + tabs[value][1] + ""; - } - } -} diff --git a/connectors/docs/latest/delta-standalone/api/java/serialized-form.html b/connectors/docs/latest/delta-standalone/api/java/serialized-form.html deleted file mode 100644 index 7993145a0f9..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/serialized-form.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - -Serialized Form (Delta Standalone 0.6.0 JavaDoc) - - - - - - - - -
- - - - - - - -
- - -
-

Serialized Form

-
-
- -
- -
- - - - - - - -
- - - - diff --git a/connectors/docs/latest/delta-standalone/api/java/stylesheet.css b/connectors/docs/latest/delta-standalone/api/java/stylesheet.css deleted file mode 100644 index 98055b22d6d..00000000000 --- a/connectors/docs/latest/delta-standalone/api/java/stylesheet.css +++ /dev/null @@ -1,574 +0,0 @@ -/* Javadoc style sheet */ -/* -Overall document style -*/ - -@import url('resources/fonts/dejavu.css'); - -body { - background-color:#ffffff; - color:#353833; - font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; - font-size:14px; - margin:0; -} -a:link, a:visited { - text-decoration:none; - color:#4A6782; -} -a:hover, a:focus { - text-decoration:none; - color:#bb7a2a; -} -a:active { - text-decoration:none; - color:#4A6782; -} -a[name] { - color:#353833; -} -a[name]:hover { - text-decoration:none; - color:#353833; -} -pre { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; -} -h1 { - font-size:20px; -} -h2 { - font-size:18px; -} -h3 { - font-size:16px; - font-style:italic; -} -h4 { - font-size:13px; -} -h5 { - font-size:12px; -} -h6 { - font-size:11px; -} -ul { - list-style-type:disc; -} -code, tt { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; - margin-top:8px; - line-height:1.4em; -} -dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - padding-top:4px; -} -table tr td dt code { - font-family:'DejaVu Sans Mono', monospace; - font-size:14px; - vertical-align:top; - padding-top:4px; -} -sup { - font-size:8px; -} -/* -Document title and Copyright styles -*/ -.clear { - clear:both; - height:0px; - overflow:hidden; -} -.aboutLanguage { - float:right; - padding:0px 21px; - font-size:11px; - z-index:200; - margin-top:-9px; -} -.legalCopy { - margin-left:.5em; -} -.bar a, .bar a:link, .bar a:visited, .bar a:active { - color:#FFFFFF; - text-decoration:none; -} -.bar a:hover, .bar a:focus { - color:#bb7a2a; -} -.tab { - background-color:#0066FF; - color:#ffffff; - padding:8px; - width:5em; - font-weight:bold; -} -/* -Navigation bar styles -*/ -.bar { - background-color:#4D7A97; - color:#FFFFFF; - padding:.8em .5em .4em .8em; - height:auto;/*height:1.8em;*/ - font-size:11px; - margin:0; -} -.topNav { - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.bottomNav { - margin-top:10px; - background-color:#4D7A97; - color:#FFFFFF; - float:left; - padding:0; - width:100%; - clear:right; - height:2.8em; - padding-top:10px; - overflow:hidden; - font-size:12px; -} -.subNav { - background-color:#dee3e9; - float:left; - width:100%; - overflow:hidden; - font-size:12px; -} -.subNav div { - clear:left; - float:left; - padding:0 0 5px 6px; - text-transform:uppercase; -} -ul.navList, ul.subNavList { - float:left; - margin:0 25px 0 0; - padding:0; -} -ul.navList li{ - list-style:none; - float:left; - padding: 5px 6px; - text-transform:uppercase; -} -ul.subNavList li{ - list-style:none; - float:left; -} -.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { - color:#FFFFFF; - text-decoration:none; - text-transform:uppercase; -} -.topNav a:hover, .bottomNav a:hover { - text-decoration:none; - color:#bb7a2a; - text-transform:uppercase; -} -.navBarCell1Rev { - background-color:#F8981D; - color:#253441; - margin: auto 5px; -} -.skipNav { - position:absolute; - top:auto; - left:-9999px; - overflow:hidden; -} -/* -Page header and footer styles -*/ -.header, .footer { - clear:both; - margin:0 20px; - padding:5px 0 0 0; -} -.indexHeader { - margin:10px; - position:relative; -} -.indexHeader span{ - margin-right:15px; -} -.indexHeader h1 { - font-size:13px; -} -.title { - color:#2c4557; - margin:10px 0; -} -.subTitle { - margin:5px 0 0 0; -} -.header ul { - margin:0 0 15px 0; - padding:0; -} -.footer ul { - margin:20px 0 5px 0; -} -.header ul li, .footer ul li { - list-style:none; - font-size:13px; -} -/* -Heading styles -*/ -div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList ul.blockList li.blockList h3 { - background-color:#dee3e9; - border:1px solid #d0d9e0; - margin:0 0 6px -8px; - padding:7px 5px; -} -ul.blockList ul.blockList li.blockList h3 { - padding:0; - margin:15px 0; -} -ul.blockList li.blockList h2 { - padding:0px 0 20px 0; -} -/* -Page layout container styles -*/ -.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { - clear:both; - padding:10px 20px; - position:relative; -} -.indexContainer { - margin:10px; - position:relative; - font-size:12px; -} -.indexContainer h2 { - font-size:13px; - padding:0 0 3px 0; -} -.indexContainer ul { - margin:0; - padding:0; -} -.indexContainer ul li { - list-style:none; - padding-top:2px; -} -.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { - font-size:12px; - font-weight:bold; - margin:10px 0 0 0; - color:#4E4E4E; -} -.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { - margin:5px 0 10px 0px; - font-size:14px; - font-family:'DejaVu Sans Mono',monospace; -} -.serializedFormContainer dl.nameValue dt { - margin-left:1px; - font-size:1.1em; - display:inline; - font-weight:bold; -} -.serializedFormContainer dl.nameValue dd { - margin:0 0 0 1px; - font-size:1.1em; - display:inline; -} -/* -List styles -*/ -ul.horizontal li { - display:inline; - font-size:0.9em; -} -ul.inheritance { - margin:0; - padding:0; -} -ul.inheritance li { - display:inline; - list-style:none; -} -ul.inheritance li ul.inheritance { - margin-left:15px; - padding-left:15px; - padding-top:1px; -} -ul.blockList, ul.blockListLast { - margin:10px 0 10px 0; - padding:0; -} -ul.blockList li.blockList, ul.blockListLast li.blockList { - list-style:none; - margin-bottom:15px; - line-height:1.4; -} -ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { - padding:0px 20px 5px 10px; - border:1px solid #ededed; - background-color:#f8f8f8; -} -ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { - padding:0 0 5px 8px; - background-color:#ffffff; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { - margin-left:0; - padding-left:0; - padding-bottom:15px; - border:none; -} -ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { - list-style:none; - border-bottom:none; - padding-bottom:0; -} -table tr td dl, table tr td dl dt, table tr td dl dd { - margin-top:0; - margin-bottom:1px; -} -/* -Table styles -*/ -.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { - width:100%; - border-left:1px solid #EEE; - border-right:1px solid #EEE; - border-bottom:1px solid #EEE; -} -.overviewSummary, .memberSummary { - padding:0px; -} -.overviewSummary caption, .memberSummary caption, .typeSummary caption, -.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { - position:relative; - text-align:left; - background-repeat:no-repeat; - color:#253441; - font-weight:bold; - clear:none; - overflow:hidden; - padding:0px; - padding-top:10px; - padding-left:1px; - margin:0px; - white-space:pre; -} -.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, -.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, -.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, -.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, -.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, -.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, -.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, -.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { - color:#FFFFFF; -} -.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, -.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - padding-bottom:7px; - display:inline-block; - float:left; - background-color:#F8981D; - border: none; - height:16px; -} -.memberSummary caption span.activeTableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#F8981D; - height:16px; -} -.memberSummary caption span.tableTab span { - white-space:nowrap; - padding-top:5px; - padding-left:12px; - padding-right:12px; - margin-right:3px; - display:inline-block; - float:left; - background-color:#4D7A97; - height:16px; -} -.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { - padding-top:0px; - padding-left:0px; - padding-right:0px; - background-image:none; - float:none; - display:inline; -} -.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, -.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { - display:none; - width:5px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .activeTableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - float:left; - background-color:#F8981D; -} -.memberSummary .tableTab .tabEnd { - display:none; - width:5px; - margin-right:3px; - position:relative; - background-color:#4D7A97; - float:left; - -} -.overviewSummary td, .memberSummary td, .typeSummary td, -.useSummary td, .constantsSummary td, .deprecatedSummary td { - text-align:left; - padding:0px 0px 12px 10px; -} -th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, -td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ - vertical-align:top; - padding-right:0px; - padding-top:8px; - padding-bottom:3px; -} -th.colFirst, th.colLast, th.colOne, .constantsSummary th { - background:#dee3e9; - text-align:left; - padding:8px 3px 3px 7px; -} -td.colFirst, th.colFirst { - white-space:nowrap; - font-size:13px; -} -td.colLast, th.colLast { - font-size:13px; -} -td.colOne, th.colOne { - font-size:13px; -} -.overviewSummary td.colFirst, .overviewSummary th.colFirst, -.useSummary td.colFirst, .useSummary th.colFirst, -.overviewSummary td.colOne, .overviewSummary th.colOne, -.memberSummary td.colFirst, .memberSummary th.colFirst, -.memberSummary td.colOne, .memberSummary th.colOne, -.typeSummary td.colFirst{ - width:25%; - vertical-align:top; -} -td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { - font-weight:bold; -} -.tableSubHeadingColor { - background-color:#EEEEFF; -} -.altColor { - background-color:#FFFFFF; -} -.rowColor { - background-color:#EEEEEF; -} -/* -Content styles -*/ -.description pre { - margin-top:0; -} -.deprecatedContent { - margin:0; - padding:10px 0; -} -.docSummary { - padding:0; -} - -ul.blockList ul.blockList ul.blockList li.blockList h3 { - font-style:normal; -} - -div.block { - font-size:14px; - font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; -} - -td.colLast div { - padding-top:0px; -} - - -td.colLast a { - padding-bottom:3px; -} -/* -Formatting effect styles -*/ -.sourceLineNo { - color:green; - padding:0 30px 0 0; -} -h1.hidden { - visibility:hidden; - overflow:hidden; - font-size:10px; -} -.block { - display:block; - margin:3px 10px 2px 0px; - color:#474747; -} -.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, -.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, -.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { - font-weight:bold; -} -.deprecationComment, .emphasizedPhrase, .interfaceName { - font-style:italic; -} - -div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, -div.block div.block span.interfaceName { - font-style:normal; -} - -div.contentContainer ul.blockList li.blockList h2{ - padding-bottom:0px; -} diff --git a/connectors/examples/build.sbt b/connectors/examples/build.sbt deleted file mode 100644 index da1d7d075e2..00000000000 --- a/connectors/examples/build.sbt +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (2021) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -name := "examples" -organization := "com.examples" -organizationName := "examples" - -scalaVersion := "2.12.18" -version := "0.1.0" - -lazy val commonSettings = Seq( - crossScalaVersions := Seq("2.13.16", "2.12.18", "2.11.12"), - resolvers += Resolver.mavenLocal, - libraryDependencies ++= Seq( - "io.delta" %% "delta-standalone" % getStandaloneVersion(), - "org.apache.hadoop" % "hadoop-client" % "3.1.0" - ) -) - -def getStandaloneVersion(): String = { - val envVars = System.getenv - if (envVars.containsKey("STANDALONE_VERSION")) { - val version = envVars.get("STANDALONE_VERSION") - println("Using Delta version " + version) - version - } else { - "0.6.0" - } -} - -lazy val extraMavenRepo = sys.env.get("EXTRA_MAVEN_REPO").toSeq.map { repo => - resolvers += "Delta" at repo -} - -lazy val convertToDelta = (project in file("convert-to-delta")) settings ( - name := "convert", - scalaVersion := "2.12.18", - commonSettings, - extraMavenRepo -) - -lazy val helloWorld = (project in file("hello-world")) settings ( - name := "hello", - scalaVersion := "2.12.18", - commonSettings, - extraMavenRepo -) - -val flinkVersion = "1.16.1" -val flinkHadoopVersion = "3.1.0" -lazy val flinkExample = (project in file("flink-example")) settings ( - name := "flink", - scalaVersion := "2.12.18", - commonSettings, - extraMavenRepo, - resolvers += Resolver.mavenLocal, - libraryDependencies ++= Seq( - "io.delta" % "delta-flink" % getStandaloneVersion(), - "io.delta" %% "delta-standalone" % getStandaloneVersion(), - "org.apache.flink" % "flink-parquet" % flinkVersion, - "org.apache.flink" % "flink-table-common" % flinkVersion, - "org.apache.flink" % "flink-connector-files" % flinkVersion, - "org.apache.hadoop" % "hadoop-client" % flinkHadoopVersion, - - // Log4j runtime dependencies - "org.apache.logging.log4j" % "log4j-slf4j-impl" % "2.12.1" % "runtime", - "org.apache.logging.log4j" % "log4j-api" % "2.12.1" % "runtime", - "org.apache.logging.log4j" % "log4j-core" % "2.12.1" % "runtime", - - // Below dependencies are needed only to run the example project in memory - "org.apache.flink" % "flink-clients" % flinkVersion % "test", - "org.apache.flink" % "flink-table-runtime" % flinkVersion - ) -) diff --git a/connectors/examples/build/sbt b/connectors/examples/build/sbt deleted file mode 100755 index e2b247e35c8..00000000000 --- a/connectors/examples/build/sbt +++ /dev/null @@ -1,183 +0,0 @@ -#!/usr/bin/env bash - -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# -# This file contains code from the Apache Spark project (original license above). -# It contains modifications, which are licensed as follows: -# - -# -# Copyright (2020-present) The Delta Lake Project Authors. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - - -# When creating new tests for Spark SQL Hive, the HADOOP_CLASSPATH must contain the hive jars so -# that we can run Hive to generate the golden answer. This is not required for normal development -# or testing. -if [ -n "$HIVE_HOME" ]; then - for i in "$HIVE_HOME"/lib/* - do HADOOP_CLASSPATH="$HADOOP_CLASSPATH:$i" - done - export HADOOP_CLASSPATH -fi - -realpath () { -( - TARGET_FILE="$1" - - cd "$(dirname "$TARGET_FILE")" - TARGET_FILE="$(basename "$TARGET_FILE")" - - COUNT=0 - while [ -L "$TARGET_FILE" -a $COUNT -lt 100 ] - do - TARGET_FILE="$(readlink "$TARGET_FILE")" - cd $(dirname "$TARGET_FILE") - TARGET_FILE="$(basename $TARGET_FILE)" - COUNT=$(($COUNT + 1)) - done - - echo "$(pwd -P)/"$TARGET_FILE"" -) -} - -if [[ "$JENKINS_URL" != "" ]]; then - # Make Jenkins use Google Mirror first as Maven Central may ban us - SBT_REPOSITORIES_CONFIG="$(dirname "$(realpath "$0")")/sbt-config/repositories" - export SBT_OPTS="-Dsbt.override.build.repos=true -Dsbt.repository.config=$SBT_REPOSITORIES_CONFIG" -fi - -. "$(dirname "$(realpath "$0")")"/sbt-launch-lib.bash - - -declare -r noshare_opts="-Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy" -declare -r sbt_opts_file=".sbtopts" -declare -r etc_sbt_opts_file="/etc/sbt/sbtopts" - -usage() { - cat < path to global settings/plugins directory (default: ~/.sbt) - -sbt-boot path to shared boot directory (default: ~/.sbt/boot in 0.11 series) - -ivy path to local Ivy repository (default: ~/.ivy2) - -mem set memory options (default: $sbt_mem, which is $(get_mem_opts $sbt_mem)) - -no-share use all local caches; no sharing - -no-global uses global caches, but does not use global ~/.sbt directory. - -jvm-debug Turn on JVM debugging, open at the given port. - -batch Disable interactive mode - - # sbt version (default: from project/build.properties if present, else latest release) - -sbt-version use the specified version of sbt - -sbt-jar use the specified jar as the sbt launcher - -sbt-rc use an RC version of sbt - -sbt-snapshot use a snapshot version of sbt - - # java version (default: java from PATH, currently $(java -version 2>&1 | grep version)) - -java-home alternate JAVA_HOME - - # jvm options and output control - JAVA_OPTS environment variable, if unset uses "$java_opts" - SBT_OPTS environment variable, if unset uses "$default_sbt_opts" - .sbtopts if this file exists in the current directory, it is - prepended to the runner args - /etc/sbt/sbtopts if this file exists, it is prepended to the runner args - -Dkey=val pass -Dkey=val directly to the java runtime - -J-X pass option -X directly to the java runtime - (-J is stripped) - -S-X add -X to sbt's scalacOptions (-S is stripped) - -PmavenProfiles Enable a maven profile for the build. - -In the case of duplicated or conflicting options, the order above -shows precedence: JAVA_OPTS lowest, command line options highest. -EOM -} - -process_my_args () { - while [[ $# -gt 0 ]]; do - case "$1" in - -no-colors) addJava "-Dsbt.log.noformat=true" && shift ;; - -no-share) addJava "$noshare_opts" && shift ;; - -no-global) addJava "-Dsbt.global.base=$(pwd)/project/.sbtboot" && shift ;; - -sbt-boot) require_arg path "$1" "$2" && addJava "-Dsbt.boot.directory=$2" && shift 2 ;; - -sbt-dir) require_arg path "$1" "$2" && addJava "-Dsbt.global.base=$2" && shift 2 ;; - -debug-inc) addJava "-Dxsbt.inc.debug=true" && shift ;; - -batch) exec /dev/null) - if [[ ! $? ]]; then - saved_stty="" - fi -} - -saveSttySettings -trap onExit INT - -run "$@" - -exit_status=$? -onExit diff --git a/connectors/examples/build/sbt-launch-lib.bash b/connectors/examples/build/sbt-launch-lib.bash deleted file mode 100755 index ff71f1be58d..00000000000 --- a/connectors/examples/build/sbt-launch-lib.bash +++ /dev/null @@ -1,189 +0,0 @@ -#!/usr/bin/env bash -# - -# A library to simplify using the SBT launcher from other packages. -# Note: This should be used by tools like giter8/conscript etc. - -# TODO - Should we merge the main SBT script with this library? - -if test -z "$HOME"; then - declare -r script_dir="$(dirname "$script_path")" -else - declare -r script_dir="$HOME/.sbt" -fi - -declare -a residual_args -declare -a java_args -declare -a scalac_args -declare -a sbt_commands -declare -a maven_profiles - -if test -x "$JAVA_HOME/bin/java"; then - echo -e "Using $JAVA_HOME as default JAVA_HOME." - echo "Note, this will be overridden by -java-home if it is set." - declare java_cmd="$JAVA_HOME/bin/java" -else - declare java_cmd=java -fi - -echoerr () { - echo 1>&2 "$@" -} -vlog () { - [[ $verbose || $debug ]] && echoerr "$@" -} -dlog () { - [[ $debug ]] && echoerr "$@" -} - -acquire_sbt_jar () { - SBT_VERSION=`awk -F "=" '/sbt\.version/ {print $2}' ./project/build.properties` - URL1=https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/${SBT_VERSION}/sbt-launch.jar - JAR=build/sbt-launch-${SBT_VERSION}.jar - - sbt_jar=$JAR - - if [[ ! -f "$sbt_jar" ]]; then - # Download sbt launch jar if it hasn't been downloaded yet - if [ ! -f "${JAR}" ]; then - # Download - printf "Attempting to fetch sbt\n" - JAR_DL="${JAR}.part" - if [ $(command -v curl) ]; then - curl --fail --location --silent ${URL1} > "${JAR_DL}" &&\ - mv "${JAR_DL}" "${JAR}" - elif [ $(command -v wget) ]; then - wget --quiet ${URL1} -O "${JAR_DL}" &&\ - mv "${JAR_DL}" "${JAR}" - else - printf "You do not have curl or wget installed, please install sbt manually from http://www.scala-sbt.org/\n" - exit -1 - fi - fi - if [ ! -f "${JAR}" ]; then - # We failed to download - printf "Our attempt to download sbt locally to ${JAR} failed. Please install sbt manually from http://www.scala-sbt.org/\n" - exit -1 - fi - printf "Launching sbt from ${JAR}\n" - fi -} - -execRunner () { - # print the arguments one to a line, quoting any containing spaces - [[ $verbose || $debug ]] && echo "# Executing command line:" && { - for arg; do - if printf "%s\n" "$arg" | grep -q ' '; then - printf "\"%s\"\n" "$arg" - else - printf "%s\n" "$arg" - fi - done - echo "" - } - - "$@" -} - -addJava () { - dlog "[addJava] arg = '$1'" - java_args=( "${java_args[@]}" "$1" ) -} - -enableProfile () { - dlog "[enableProfile] arg = '$1'" - maven_profiles=( "${maven_profiles[@]}" "$1" ) - export SBT_MAVEN_PROFILES="${maven_profiles[@]}" -} - -addSbt () { - dlog "[addSbt] arg = '$1'" - sbt_commands=( "${sbt_commands[@]}" "$1" ) -} -addResidual () { - dlog "[residual] arg = '$1'" - residual_args=( "${residual_args[@]}" "$1" ) -} -addDebugger () { - addJava "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=$1" -} - -# a ham-fisted attempt to move some memory settings in concert -# so they need not be dicked around with individually. -get_mem_opts () { - local mem=${1:-2048} - local perm=$(( $mem / 4 )) - (( $perm > 256 )) || perm=256 - (( $perm < 4096 )) || perm=4096 - local codecache=$(( $perm / 2 )) - - echo "-Xms${mem}m -Xmx${mem}m -XX:ReservedCodeCacheSize=${codecache}m" -} - -require_arg () { - local type="$1" - local opt="$2" - local arg="$3" - if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then - echo "$opt requires <$type> argument" 1>&2 - exit 1 - fi -} - -is_function_defined() { - declare -f "$1" > /dev/null -} - -process_args () { - while [[ $# -gt 0 ]]; do - case "$1" in - -h|-help) usage; exit 1 ;; - -v|-verbose) verbose=1 && shift ;; - -d|-debug) debug=1 && shift ;; - - -ivy) require_arg path "$1" "$2" && addJava "-Dsbt.ivy.home=$2" && shift 2 ;; - -mem) require_arg integer "$1" "$2" && sbt_mem="$2" && shift 2 ;; - -jvm-debug) require_arg port "$1" "$2" && addDebugger $2 && shift 2 ;; - -batch) exec - - - - - 4.0.0 - - org.example - convert-to-delta - 1.0-SNAPSHOT - - - 1.8 - 1.8 - "" - 2.12 - 0.5.0 - - - - - staging-repo - ${staging.repo.url} - - - - - - io.delta - delta-standalone_${scala.version} - ${standalone.version} - - - - org.apache.hadoop - hadoop-client - 3.1.0 - - - - org.apache.parquet - parquet-hadoop - 1.10.1 - - - diff --git a/connectors/examples/convert-to-delta/src/main/java/example/ConvertToDelta.java b/connectors/examples/convert-to-delta/src/main/java/example/ConvertToDelta.java deleted file mode 100644 index baf571db9f4..00000000000 --- a/connectors/examples/convert-to-delta/src/main/java/example/ConvertToDelta.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (2021) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package example; - -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import io.delta.standalone.DeltaLog; -import io.delta.standalone.Operation; -import io.delta.standalone.OptimisticTransaction; -import io.delta.standalone.Snapshot; -import io.delta.standalone.actions.AddFile; -import io.delta.standalone.actions.Metadata; -import io.delta.standalone.data.CloseableIterator; -import io.delta.standalone.data.RowRecord; -import io.delta.standalone.types.*; - -import org.apache.commons.io.FileUtils; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.FileStatus; -import org.apache.hadoop.fs.FileSystem; -import org.apache.hadoop.fs.Path; - -/** - * Demonstrates how the Delta Standalone library can be used to convert a parquet table - * (i.e., a directory of parquet files) into a Delta table by writing the list of parquet files - * as a Delta log in the directory. - * - * To generate your own parquet files for the example, see resources/generateParquet.py - * - * To run with Maven: - * - cd connectors/examples/convert-to-delta - * - mvn package exec:java -Dexec.cleanupDaemonThreads=false -Dexec.mainClass=example.ConvertToDelta - * - * To run with SBT: - * - cd connectors/examples - * - build/sbt "convertToDelta/runMain example.ConvertToDelta" - * - If you encounter any sort of errors like - * ``` - * sbt.ResolveException: unresolved dependency: javax.servlet#javax.servlet-api;3.1.0 - * ``` - * then clear your ~/.ivy2/cache/io.delta - * - * To run with IntelliJ: - * - make sure that this `convert-to-delta` folder is marked as a Module in IntelliJ. - * e.g. File > Project Structure... > Modules > '+' > Import Module > - * Create module from existing sources - * - * - then, mark the parent `java` folder as Sources Root. - * e.g. right click on `java` > Mark Directory as > Sources Root - * - * - then, import `pom.xml` as a Maven project. - * e.g. right click on `pom.xml` > Add as Maven Project - * - * Find the converted table in: target/classes/$targetTable - */ -public class ConvertToDelta { - - private static void convertToDelta(Path sourcePath, Path targetPath, - StructType sourceSchema) throws IOException { - - Configuration conf = new Configuration(); - DeltaLog log = DeltaLog.forTable(conf, targetPath); - - if (log.snapshot().getVersion() > -1) { - // there is already a non-empty targetPath/_delta_log - System.out.println("The table you are trying to convert is already a delta table"); - return; - } - - // ---------------------- Generate commit actions ------------------------ - - if (DeltaLog.forTable(conf, sourcePath).snapshot().getVersion() > -1) { - // the parquet data files are already part of a delta table - System.out.println("The table you are trying to convert is already a delta table"); - return; - } - FileSystem fs = sourcePath.getFileSystem(conf); - - // find parquet files - List files = Arrays.stream(fs.listStatus(sourcePath)) - .filter(f -> f.isFile() && f.getPath().getName().endsWith(".parquet")) - .collect(Collectors.toList()); - - // generate AddFiles - List addFiles = files.stream().map(file -> { - return new AddFile( - // if targetPath is not a prefix, relativize returns the path unchanged - targetPath.toUri().relativize(file.getPath().toUri()).toString(), // path - Collections.emptyMap(), // partitionValues - file.getLen(), // size - file.getModificationTime(), // modificationTime - true, // dataChange - null, // stats - null // tags - ); - }).collect(Collectors.toList()); - - Metadata metadata = Metadata.builder().schema(sourceSchema).build(); - - // ---------------------- Commit to Delta log -------------------------- - - OptimisticTransaction txn = log.startTransaction(); - txn.updateMetadata(metadata); - txn.commit(addFiles, new Operation(Operation.Name.CONVERT), "local"); - } - - public static void main(String[] args) throws IOException, URISyntaxException { - - // ---------------------- User configuration (input) ---------------------- - - final String sourceTable = "external/sales"; - - final String targetTable = "external/sales"; - - final StructType sourceSchema = new StructType() - .add("year", new IntegerType()) - .add("month", new IntegerType()) - .add("day", new IntegerType()) - .add("sale_id", new StringType()) - .add("customer", new StringType()) - .add("total_cost", new FloatType()); - - // ---------------------- Internal file system configuration ---------------------- - - // look for target table - URL targetURL = ConvertToDelta.class.getClassLoader().getResource(targetTable); - if (targetURL == null) { - // target directory does not exist, create it (relative to package location) - java.nio.file.Path rootPath = Paths.get(ConvertToDelta.class.getResource("/").toURI()); - FileUtils.forceMkdir(new File(rootPath.toFile(), targetTable)); - } - - final Path sourcePath = new Path(ConvertToDelta.class.getClassLoader().getResource(sourceTable).toURI()); - final Path targetPath = new Path(ConvertToDelta.class.getClassLoader().getResource(targetTable).toURI()); - - // -------------------------- Convert table to Delta --------------------------- - - convertToDelta(sourcePath, targetPath, sourceSchema); - - // ---------------------------- Verify conversion ---------------------------------- - - // read from Delta Log - DeltaLog log = DeltaLog.forTable(new Configuration(), targetPath); - Snapshot currentSnapshot = log.snapshot(); - StructType schema = currentSnapshot.getMetadata().getSchema(); - - System.out.println("current version: " + currentSnapshot.getVersion()); - - System.out.println("number data files: " + currentSnapshot.getAllFiles().size()); - - System.out.println("data files:"); - CloseableIterator dataFiles = currentSnapshot.scan().getFiles(); - dataFiles.forEachRemaining(file -> System.out.println(file.getPath())); - dataFiles.close(); - - System.out.println("schema: "); - System.out.println(schema.getTreeString()); - - System.out.println("first 5 rows:"); - CloseableIterator iter = currentSnapshot.open(); - try { - int i = 0; - while (iter.hasNext() && i < 5) { - i++; - RowRecord row = iter.next(); - int year = row.isNullAt("year") ? null : row.getInt("year"); - int month = row.isNullAt("month") ? null : row.getInt("month"); - int day = row.isNullAt("day") ? null : row.getInt("day"); - String sale_id = row.isNullAt("sale_id") ? null : row.getString("sale_id"); - String customer = row.isNullAt("customer") ? null : row.getString("customer"); - float total_cost = row.isNullAt("total_cost") ? null : row.getFloat("total_cost"); - System.out.println(year + " " + month + " " + day + " " + sale_id + " " + customer + " " + total_cost); - } - } finally { - iter.close(); - } - } -} diff --git a/connectors/examples/convert-to-delta/src/main/resources/external/sales/._SUCCESS.crc b/connectors/examples/convert-to-delta/src/main/resources/external/sales/._SUCCESS.crc deleted file mode 100644 index 3b7b044936a890cd8d651d349a752d819d71d22c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 PcmYc;N@ieSU}69O2$TUk diff --git a/connectors/examples/convert-to-delta/src/main/resources/external/sales/.part-00000-64c688b3-46cc-44c9-86a4-d1f07a3570c1-c000.snappy.parquet.crc b/connectors/examples/convert-to-delta/src/main/resources/external/sales/.part-00000-64c688b3-46cc-44c9-86a4-d1f07a3570c1-c000.snappy.parquet.crc deleted file mode 100644 index 193fbb5caeffe511674bf874fe6beacd0a152f5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2504 zcmV;(2{-m*a$^7h00ID$E}{j-`YAC$icvm7ywpF4_G{oN1aut%}IA zf@95oCG;GU+#k%z(I`6j-%_9FajEXFm7in_Ym;iiO*Ss?y$zjnS?f6nO}y)C!|V1Q z=HHcM8OK8e1_kf@V9rDPFGbAXUJvX@isY0Lb%OFvf16c={9HJ*s#QyMQ8UXMY`~?> z|1vi*$}GhQ-Lr?|*AMANPI+pQ`@qbh+E52Z-tiqK{-kygl)MM%Z1@<+z)>L8S8Un7 z)9hDIk@O9hb)}lhYgkIkjnF#rg$mDh8#`J%x5RT5{%va`|9f(K%6?hyMt30yVUZcRR z`WPU$k7jivijP7~2319Qt%PW@**1|yd@azqb`>+8BIV&j8Lx92XcQamHJ-*92pKNB zjsRd#2UNU!}IplaX5enOvV&CvE?{#_N^2%tY#Q z7`}IDa^aN62P{c~l)%ENBExV-EWeVri{Bs1VW_B0focp*UVVT%gyam%vmVBesZ!WM z2X<4ZCf!R8=A~HoG!6flj~znmM8Y%*#N!_k#qMGG-5aDHgf3jGyRMOuC|X>!ea zAm*hrRD|v7bJr9M3%HELc0T5V-Bkx9bmE8?0I)KrtdNjijLu|T=+haOvgG!rt}H5p z>C;@sC=&j1sWdUwcnL6_7_A9GJN<4x)nq zo07c@*7`f#x{=_SO4j`bXAsltkIwk}rS}84LbxwNGEKl;!?V1hDUEp>HFz@q_$i*w z-WA5iP}{*D(56Y0f_zU#LEcGDN+RL{YN77Hr> z!SIgu;T|Q!ymmYv8qa`&jbV~bf@4x%5S)Q*W(wmJ8`fdVfc1wTPnrq}(v$nW zY~c%8odF*hne=2FM;P8nsmL8Wsov|6yK}eeXf*c)TQ>mXZXWK4;VR?94IFVrp0hDg zgv-;6iY|7}+%EF-AnL&)1G(^|I#t}HS&4CRZV5*B80eRSqOUkkcm1&v&=ZHUmPXXL z)HA|j#(W_)V5RxQ;~_kMv4IJ(<~rc_#MyO7$I~vI-&4j_V}L@%KGx^am7~G?3A*Re z(ffDeEXPG)Cfnghn`L_*F?b6<#RDw{zdPqMz<|FTtEv1R=QB>`&kVcZbqxG3aM{7b zxo42m#VlDcGVOw;}M64}Yx1H8`70+T|9s;0wTDP`EiL?WTM)8y4MC@}{N+(O^xaE$x z-&i9X%NO1Tq^W;bC;xyr@N{N|_!FLQL(=My47mO1yWjURG z0OIWce5z8RH)KvmMB&ZEbvjoE(@mIR7m2tiBFf0(U>4W5fFF1oJGteH0xQA-Gqb@s ziahl;lhuJbGTctkMzM~8WZhE$vuU=UgqnhbMV7Y%m7CxpPQ za6%sugOU_{yV*f2b?l2;D@U;=56hSpVH^^8ZJoPny{Khp@6Fj`>-ZPzT+#ikEaq+5 z7t)kx1k?QziacaU01TK}zUQIJW(>X10wC-?KNnVt=95jnPudyce>Wk#iK)71MP8hh_g%uc9bq;N}*n^VaUdkgNa1;xGBif3W@GDeQP z`l)OOXn)*J`7r_wU8;-EZww-S8qxloWgn;!gbv+G2P={4t0h*M6yO-7nQ5VdDVjC( zEWagZ-*eb{a>4fQ3GNcaH~c2K18DT#^H>p(nxH$|H^{kihx+a*FM1Q{IDXY6_%d1# z5PO{>`bY}fA72j7AgTb}0kV(C!663SRXg+~lLZ=nsI|2wVYBV0BQ+kt zb3-UI*e<CMUDH3_%=9lnF~%)b-|}$a9Cc#H6BbWz@DZ@x;x|os-cGMD&kcD^lW( z#-Las&$B9XUOV?DbqWjRv%@WiQ^*SAmlbas@9 STdjUHwFA`%Z+^XIolJ2GrrPuX diff --git a/connectors/examples/convert-to-delta/src/main/resources/external/sales/.part-00000-71b51e51-8746-425f-8e20-41dc771a1b47-c000.snappy.parquet.crc b/connectors/examples/convert-to-delta/src/main/resources/external/sales/.part-00000-71b51e51-8746-425f-8e20-41dc771a1b47-c000.snappy.parquet.crc deleted file mode 100644 index 833d4a9e30bef4be2bd0ad1a3bc6fe75005e6e8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2500 zcmV;#2|M;u%fga+;m_GtT^?BC}ct)yu5povy>?|G1Ne#Y&OV?voz)bvs_MW)EarX-3q}^ zy#VV*(m&w<^P!5-*(7huQ)_qB1rO#->PKC5x^{81IgA)~rjQP(;|jslpUo>^Lv^+% zQ6us@S!oY9IEOlMiUN&qPQ6E?qsv{GCi{9`$k{@tf$`><*)SD8Aap|>j*K5;QgMdn zO#h;0(`z=y+HoPuEVEpC@#d3r0kI$+VLaLx)@>dm6*_|<=W>LF#@7(E400r!G0G3= z@p4OlprWjA%(`im3z$TMCnv`4nDR0mLqj&At-G&9!L2=o_G^K)n_3&-^$HIbAL@kD zHR4CfVtK%{W9>atr=O01ApE+QSLi_2hB;GmCdgFBR~GpsWTWPMjh)DxWm-x`mOy!; z*51vOCo=UTz@K6<^XXA|qaSU8t*6Usw4$)?z01%XnK6zd6{cF`K1iCNg}tN;drwR$tViF* ztqhV!lzvn|ZPhswnE||o&lM3<>l5YzTw4CS;5anZ-0vZ>YdY#VdWjZ;YgM6yQ^CNV ztf+Zd3;XY?g*rwJZzt_JPByd4CQWx}t98LDEEvE7eU97lJBKr4ThhA^QPMnSr}U5~ zxq3g|GYO2EKh3g-18HKU5fMVDj-v2MSiMx)33#&VJ1Y1GR%rG+euLR2d$F6+uk?kM z31|*WTcncpVAN|+U4e89Jnub&-9D|b%K<5Wnk4KBZe)Olsx%22x2w-Ngc8il)_nX# z@>+o1v3ZLu4dT1=&wh!wV zupJ1J^x%mr_F5`RB$9i(5#J5dzpi8=w)>@-<&N!;UcH3av)1$nbZ_PlQDHFQmN|6S zQ8)0?{Q2cfncyj})BbyU9w|B(2!S1Fxi5Xw_n|_b2cZNuXk2mwO$hgWKCWokTaXtr z_!s>=Y)q1(f(9I{o4;Ijh)lD;`G5^$ioWILF%NA_9_(Z0}So4ixzYXG28MXGcJOJ%rt{z$29M@f+=b#d01Y$+fbh89OxaVmN{l<$r^r&VoGE@V`_NxtCECu4y7B1YNDLnVA7kgV z!E{mcQ~t=Iq1vu*Ev=;*BouBy7+Ypm60H-;p!}#xA`V6S_lDa}%+O~JeApdk?$F!OO z^M5!bAhs#}gPRCv_a*=S1D?ql5qQiKA$JZyJRx(BEX5WGCg zIQjld+FCh_-ClGm|5Y{Y`mO(x(!dnkx`%3f5Q0W!hL1hTSr^YW7+Hu04D`AoLUS(j zL!cPh;kpu%6bv!p>g-R0++GdMw=lo5&NlW19}eI5f56rlXGoKIv)6^dqOX18q_N}M z!XT)KZxzbGt(iS6bhh6siy7@UM&Ieq35hP`J9nf}t=cef-Z^NGc0>H3(V+Pv&{juQ z?gT=y@6pU>sNmud`{f6x2V(}qV9>tAKA3=|9!+~mvcfK0 z5t3AB)}iwcf|g1TN{}xQdl&Az8KkoS(Yd2?$MpW$S7}!vWla9nK-hu}uBvQEH1$vl znb}6}-({6{#>Jd%k*&!SP(juQX{616ui<15OM;Y?C8du4r3)}UUgo)sBsR-Cy%a5H zp*8X@ShO+BeGT>8^>2v$>cg<07*4yOE3a=auMH#`$6KL6)K>cGjkwa{W|-qy7jKl( zBIjc-u38kCUtpU~;6uln0&0V;us$QQAjp^NNS(7J41PI~%RFX)?VaD4?yE+MMJaWj zLXFA93HDnCBQ$c?ANQ4S2K=9yf6vqE3Bq1Uj$7ERE8pK=og=tNQ6~&6hFvhw#q^d& zF+$0&Ynq6?4ie~|$Q@ig7X4xy_Lbw$QN6jTGou^YV%%70AZmgwz)<|geYSXkNBjr# zICpSr+4?UjoETTjdKe248Y9vbY>H49ue~*mP(i0PZ07j1aeD_;B3V-%dCpQc2$`u2 z)(7pfY9i@3y)9`A+pnv2pqV#H1dZ#%s^E{I?W@1sM~9CobR7R>FhMto^xmtI_1qs@XBF O-!6RiW*PyNWXY&_q}Pi8 diff --git a/connectors/examples/convert-to-delta/src/main/resources/external/sales/.part-00000-c4f4550a-83d5-4c35-bdb6-9f8bd1a9d154-c000.snappy.parquet.crc b/connectors/examples/convert-to-delta/src/main/resources/external/sales/.part-00000-c4f4550a-83d5-4c35-bdb6-9f8bd1a9d154-c000.snappy.parquet.crc deleted file mode 100644 index bf059b2f012c531f7c32c4e7b1bf49e2bfdf8792..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2500 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

Xy(Zl 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

(o~av1eWKBoZHv2lhr3x2zfF zzzIXeF4Vx{PPsr{&gD5T!Nx}_XmYj3k!L_zKFX0-^y{3Am?w-|%g^7T1@I-;ln3u>O93*f z$?FG+BNWg$dwNTXAp-2uNxk6sP_wn#s&R4C!}2!+b^JAUt9`Fd;zqGPazwe=tP_F@ z`cA}KLP8CWBG9%XTIWE#ro7Xj_-I`g@Y=H#uK2=BK*jP7jfsB@VR*fPmK+MBjL(=h5hYdrf~Ur@*44uQL`O#{PV4I$cJ$y-}@P%%O#l4cce_Ws>9vh~8K#(B>2YscD{ z-S8bJu#J(s(5ygQTT-@v+8{&MzAGMKGt6bIwS|gU$u{O#%oiPnj6j>8b~tIwO3uNsq0UNW zycTBLHn#7-0ALFjnnAK4XX3%S`d|lTkzskrg559cVb5iNpI{7Eez!xzgKEQI_`Hb= zl_>!{td#+ohztlH>?91+1et`eyz~?WhmGJ2=X{$qYK(ZGK8UY7$Vva$led_}4`2wi z%NdEB{Ru9jS3)5?vX8^SY&kq6;ZZaT42q0a0)6D}Q-G825+T*uh>@9r^O;IGibrC=R%UJ|qK+U)GWjV4<{R@+DY=$Z3DS7m^n-70U_L zhf&@~&oBvt`l?RHl&?NW8$uyT<&STd@R_wZZS0M1EYxX2axq_~a|UMN;j4{SJ~IZ( z50!-}g@X=T*Y48k-~b=buWNX^WbM?HIy04{?v$M8D8?KFdREuC0r}_Wa54;L;205= zk6}QAc`XjrO4fJQoPzVY@bNGeB-y>H8QyBio~UtVPY;s@6`wO2Y-mbxjV`As6r9*e zrJ6V;&)OrezrBYyfHOLnU*goqHV7T-per-JY>%AYvX?!NKaSCK8((~w53jOk68YyL z`R0Bq70aVP8-$q3-#&w~n#(72tmLw+Rl>=isRh=`Jgp`IoD1c9sLdfi%0rU+wD)LZ z?2C2{g5z9+pj~*WeA?ZfX1Md<;=XBTFh?wLAQzF4%ePM|1M>A;2axzNHk?`dG)1TWM{~0 zJe*P!!$dvEE@ki6E9VTx9iqsyMZZ-`ER!IBaE^Z`7%>bGlox(I3c`xuA zKj|um-d3rrlL7TQa2~^w zw>h1ewlYmVP6Jp2PXGcL(~#eGHO?CtzA``}M;qC;(lPU*aWotrPbgJj8~#%ql2NJ7 zLF9a&Qts}cRmcY(s1YIOo)77W9E{VAs*}6@n{8AMb5OtJqv7w z0OqohcNt7#jX47`2PZU^6j=JsUL6+7v)A8rdJaP+BlRnvta-&~Ti!L?M)yQqbQU># z*aKo1v_6U%=Yyb$JTgu2QR3PdY(a0@9W|os zt@pMeCea9!zD)z42XLVV8}o^$zAO#$SL~ z-)wQwoBNv3xA^?!8!0W-#|^BJoZSS+!5Jg+oRE?I#)Z9dZMsIJ3=#Ue4l|f}eY3Dn zz?yycK)+LzB3$F)cn|U$4vfO!wc2_cu^(T#w|J5O<-6KFe&F9<-XocEq%@{zyciV4 z{G|~4?^Ls#<&Va;ddvy|S(URwetM*0sX=;9n`UNAjtj7iM2ZUxC6v8dB&QL#m^)sY zHkeV#GNf4uAB-WjByG&!gQ-$e%;PsIL2Kd+%lha`JN$tJoW-GRq7U)SXZ0>eA)GB>${A`=IebBIl=*6XaIzV&Iwvs zKJq&?DB_K!)^=FvCOmpIQkU#o3iYNA4EGuv7$xVy* zyrGHD-+_5-bBGZqEqZv+ILA+&m~?NOz^6&2v))N6`_zlOBuh>gXFUDVY!iNkBU$LX z*fSrV))@Se^Sv6!-7ZwzjnfsowK+hGPV>hJvW$Dl4-)qFU6f7^k-}iA&S7H&kgkX% zLAa?CXCnFjT^MPY;P*Ga%r}0nr2}{Xp)&>pUP_#1pd%nA)X^%DHTh3C6(~N}4tMxd zfnXDCr+>4F7l)&x2fMJgy5Eg-12`U&sG~$+k2x!r$ zRijoVdQsG>s9kWW61}uRf7WQPmDaCqV!!rAdu^j$+f=Xi`#ib7f7*u%$;{{TUe0-) z*CKC?HdL_RmtZU-eoTz*K6p5^_V^1%v8$=9RN9boAzUzb3C&w25; zf^C4kXu)nFq%G@#1%aD#x65?ziH99#oU})}i8JL)=2}4wF z*(%{S$*uu|26M0# zEla^xM88H;3gnBL7%R!(2){v-B&U?jdh09)ODiLt6}kwq+RHF#hSMH)_i=e(8=M9u zP~J@ksZ|(O;4eYLiGnyAmH(ay@Cz`dM#7q6pwyJpQFyLYiC-8NHdQ$2M!N29PAy(WpkBKRK(X<>0Nww&&bjF;pCxL7li>Vq)v0o}b z1qw{dLyH&4$f89EN|eE7uTGhNoXHHIW+3kFsD!74Kwce7|6^2t8_%ifQrI7(J*ag+ z2h%aL)y41vnY|n_C~Z4EIss_pus7{2nnep7%rG#Kb&{b0!hQZkwLJ=Ml8@l`r44Fz zb4wMY+bFJ99$*LfX<(=)FLH2|=A|TxJyl5F-(p7z{h=*)tjH&YAIK0F%N5`;ii})?ovLMWu@k=; z

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 -HSYpzFLJ0hU7=h+z_t?zOpZ@)et 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 z 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 diff --git a/connectors/examples/convert-to-delta/src/main/resources/external/sales/part-00000-71b51e51-8746-425f-8e20-41dc771a1b47-c000.snappy.parquet b/connectors/examples/convert-to-delta/src/main/resources/external/sales/part-00000-71b51e51-8746-425f-8e20-41dc771a1b47-c000.snappy.parquet deleted file mode 100644 index 0219ea07b4cbdc2f05755c29bd662b8364d344fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318646 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≠jP!h@lWDhqRKD{pdZ8oog zB?@V`p6fkmEY8BDu17yGfSZ9!?^(}TCdHr3T zb+NiaWM*}8ArB^PVSt%AEskenyjCl!Em?%9W%1^Ox}@ye+3;H%lDP5sKVI3ws<2H% z!FUyGMyZJUmqj*IwuI-GCv-pK*RJ7xjG`1*)*}J{#u0n}I40b(CdONLLh*WD(s6Qs zWVJ(fA`v|0i=n5ERF!vHk=nn{ zj0VNuyh5-Oet4X5lw8bIR!n9%_I`I&crH4fUf4Q7+8V7|QGq0(CbeDj_k+{#jsdbV zMEy?YUg3uA`8mf+bFRJnYWT=-#tIcU&q|GstV zKtY(vL9S$D;pq0X2Gg&8$wmxZPw#$y3uZ)q;8PMBO- zc(mIqbD%t=5rq?(WogC2(^H3!WHm#qTPA)zUWcYkt=hyneF={uxHd6dJGZb(0q&ML zTuKn=MSD!}InQD=xyJ)wlOF_S`pM&23OrM`FxRi$I=Z~X+0Koiy>Q_iS&{N9ntFvH zQzc3R*dgbbaJev!ili<9^Vf-9Et18pSmF6{Ej0iLj$YlzGc4&_b;6ez#F!Sz! zEC+~QQN*L|WB9wYlw*s>rx^`Pswws*%}^`K`lI=jO+MR}=YDltJRgr4dLW3KWpHD# z{FYuxQxECJw}*sYbUGVuOkD#SOm>}w;htSRjpxrYA~zw4-4Y#SBkXl*;H*MX_0cAX z&Zqx$rx6t1W9Tdk-`p9_Wb!U&EmbRX{$^$-LNwVw98M2_>uWZHjz4^HrHEjK(~V=I zAI#ZQD_l}**nw$CmOJ=kt5OCVm2e(!F@{Dwm@GJ0fOmNMhjKd|wJkhfb({mh84_N9 zSNO_0^A1c-G(Ak`$pvfp-sQXx(92moPsZI79ii*niq5^5YBUCM*&e>vFnRG8pBPU_ z-iFft`lc*qC-5@doB{Am&g7|@=+n9($2xZvhvo9bOjJ(#W;n6kZ<>YEV99Atv>E;pJ~id=L@Bqg7L!`U z!NAGriOR+Bp{)rZ@tW0=L()#?a+F<^OkL;jXX!dr%-82h;T<$gTJ!i5QNlf1?VFx( z=^Gs#%qC#iSx1Z^x}Uo3ry&6iwIG^V6_(Iq5zUlDNY;*r^Gx)8g92I8lz)lHbUOZONiSn(WS` z^7$S}HJc$2xtb`vAQs^GRR?tD0)C&zSALX%rxXB56wwmkN zpuf7XHBE@1cmKofdgk!em!=_Y75OPENTJm%?x$|J?$(mWg}Q(Z??1k2g_Zivde7*k zWO!gzF}nDG*zv*6u7s_;Z`204KV^~4Rdf3W(p?W8!nT3!dFzZap7}i_OsN<%j6z~1 z8cx|(G9O%=@0yDQa+Umb|< zbc~7EBjtdY?oXwy^rv{)r?SxUNbLEerDB21iLmb|DwlIX9~2v6inaqJ0AVdO*E7i+TO`ZSjCa6L14Qv!UI z+>tck3=fWFL3*^ixl^NrR`g9H;U71IU%4?7(8A{@vPjQp4`E?VdX_<6=L9t+7V2F0 zue_?8Wi8%R02U$MW4GNntw;wb)(xl*W)C-Yld`E>;iyw%6baWwM6${q zmNY{w_FakLR_5T!aOj?*MqEcZsw{o#<|LNhB%{@x33u7&8jjjCg#vy8)*J@g&t_4F zjIsMJ@6M8W8^RG)#6EE(e05t%L5XUPL7*^u-J0DqS)d~Vo%Gu+%a{KO0J3YuPZhmPpYKe}n2|dF;c5>U|7ex>^{9Xw!(Pkt^TYdNyynK~S4vSkHB>v&T{A9;akBW9`hw3bt%`p}ve#T5=@Lg*~@3{GIFnJAa2f z(%2X?ocl|7pH#emXQ+7!&MvGK;@Ns(j*&OAem+-F%s{ zFJ>TLyGfG_whXcOA3DX*Nx*a&E9oyH17fU@#0Ut}_ve*CY?_9{Z|^j=o?~q!9XE+! z69cKCS?#cJ53vZsK=|~I0k{zS&Qpr)PI{CYs!mvXyQ*_$n@`2b%%B`moO~V`uoCA+ z48V}H!m5mMvCY*Lr3g4KT8vOFY+R^TBpbeclm547ZsIEi5RHkRy5)3D7D+v`Zsp+7 zBS2K&UKdZ_A15l7D4wYiFVhTnlK;2TJwWiR`)G&$5vOnR*2HKfd@{xk5f3pii)M#8 zQOu3ZraeR0cu_BBUIL#!PzZbPN;^w*7w;4#xHOA+%x5zky|-s%@pL#-?-@JM!}SGJ z#l40%p0Fo3=QFnp6U_ZX!4Ey#R8jJ)h(mdQNMPlGEn((HheZ9x4z7Kzzq$M{5xl)Rb$y2+1>V-l6Htmb9RLA}rr&SxRA8^%f zXI$C~#qh_=V-RQfzHO`+E#FZ@1Hul1{fBR?N@Jnhg@3n(j#)C5={#}bNUm7VM}iwT zFYJyYva7FH{7_sz2TYEr=-3S97Vc2tN=u)cjdZMz!Lb?&7`1DF9D?GMose^$i}UZ;({dci^Ucm7tS$H1yx20!@H(p6n;4b(b(Tp-CHs z&keXje%Xki9**3sIqE6%G4r*MGFYJ+AMv0n-I*ee8_j%VRRUl1+zwyn;O0_Ul?w#+ zW6kgzQ;&`tW4d9aqY4ufvGi0aB!MHP@am@OEEM@M;77^ zd@6^+rnx|`=FT#i#OHGzK!?z`?TpOoJ-P-{6m@ZA+>eaCc>2U&C(L9&h-=)cUdy$< z(WPNF7b->VR=4{66>k?jACvb^yizScF_YqeG~EAS9{g#tB{U+<{lXsIAiqyVocCJp zTV>zBqg3R8Wb7udY1o!YIKV%;CK*$z9~?`NXXVpFibNer z-PK-iWy%jGVGrSjU7@?xhr3xln>)U?L`jRo37dk_o?LtJ)9{B*_}e?FZQ#hLCmmHf z{27e*9|Pf&F$hv2>h}HKz(7l0w-^Gm~uIGj9&(TS4rr>nV88KA8(as|$SCx^T9Kl1mU!s)i2;NgIG za{R`esgXol=%T9}7QHetJknbo=Pm&8sNx@W%vllYCm0&|Oh38P;q!cDP zpZx2Vyt|Z9R9C(WB9@VlE%A~7yB}#EepodGo#p97!7|c*ai5!k2LR2>;=g5m7Gzll z2t$?VV}fSF)y2;YSO7}$JTLk>mInm5dtptSH85y1QeV~+c+L- zn{4Ut_ZMvha2lCQ?pzU=!ehYFqmR-!N?P)$@3}F>Z+;{^^N36aKa^5uJHwlpI&g3` z$i;K)85MwvI{Yj1=dJtF1~Z0+PWcV%Ox95ubX_VkTZN*iHP?4^;95%Y=eG#kY=a(qW&eusTiY#=tAk;3JKlYCSm7TH15!D+PagMuUo0)& zjPn%jnyw{yQM$y#H`y13{$t--kS`t<)j8v!`2VZ}CJW>v+zekLc-|(2yc<5S3#yq_ zXChICZ*6&D9HyXRCti)=Cs(Jk(d(Gh;>%T-wc6@8R`oRYpDCe58A&KW4Jh(Wf!Tz2 z%kGnEg!AQ|K&jndjM|LwJDU?!Er0Z2n0ifUt`0lu0~CNYCl3(q@Tn9x)k=8phVXn1 zlpev;@vV;N!iZBILR@(ZCz|bmM;(A?MyC&>g%&rXxwl& zli!==E~S_Yn>ONcBZqgw>u#cR*6h^7&-8iSU1^9w$bAnCv0@?3(&b1v=_@}NKi{T4 z;5d}#jW5lzF-GkOH?13p0t-e5=IBe$X2EE55K&zd+SX%;)LqIw1T)@38%kv?4JL|0hrSi&W}kjm4q@C;UddG?5LpvQs@4r6H zzo9ehe9tyOSq4O-kzV(~wc*m5aR4PQB10rPX)LSq+@e$)?xD5t!3N~xxsv1JD-Zfa z`3Fj~=xSVunY%<}9Qxzj*)nLMe|<}M_nvUq!!iAaVgUb5Spx_s6(zGWYqT(^6h8U# z*m152jE@}8cWg$oyL8pi06w5GBFpYS4TSG$PSi`>84YaOWRlIOcqKnq8alA6;l?hvX`g->tbP^L~pFzp+EKv0{4vi}0mV?!o?t-1ZxJBm^|sz9dMIeY`(=i}EqW|yz_ zSdu%C;3CNM?8X7C8^$>J4MLo2d5lD2+iG|$8;%aB*+mBb@DWK#y@~(ZN-HbsER5+P?S|pZwI#;a&He%9&cf zW;8-NGY(t;{XMbV*kytf*2NsEhZs6>5R_RK)jkJ@hoYl`_KBO4X>Pd~s~S|RZ3Sy9 zrtww6g9E(>sXr}{iB~5hC-~5qJT<|Jnd#XA;*UbTRbM(yLKeL@nzcTC!~GK}*86mt ziPqfw|5CFMRbwOJXq(4WNTGeGPZOD9f>guTHl}8)?b@e~C-FJL=Yk?mE3aMoCER7{bS)WR<&^A1at zxRLNF30A6#2XBmxW-o^Q9D9o-N4s#}mL&8=!gb6R`vJe5!2t*_%Uu(Rve`Bx7X)nr zj95M&Svpnrr=#e^$%mkXnAGXKcsk8Oq&wF891QiXH+dN|V@!`B@pSG6)U)9~P519h zvBH_nomelu%>4VF1kKyiMbi?jN#47;y`w{z`=t4v5N(V%Y*&0g6D~b$!lz3Sp~NF2 z3!yWn411YBWl6b4Ko{j57Ea7q)zDvA8U8*M zUcHtaz9yA=mENA*u>&MX+L!2%Z2?;eDE>cW^6DB)<@U**0X}Nc))yjkIIS?4N@fnc ztVk&~H--~ed*69s@bI@LGkatt{dOLZW0OvZ3zYipeKk)?*b>6u=5X+kMEFxUgyD5SZ*C@bFd zAnE_!r2~kXC>`{dvtj>D%;m$Q*-6C&C{|wuv%wb`4nOWo;keF)!-KpkjF=wkX^D7E zK{^RUHxn`cbddg6G3St_q`(j^KDvh7`Oy-{nA5T*R4gZjzQ*^ZH+@8YFpSzX;70$GW%*rUR ztwBE0zFZz*SS;Rb_~89q8FVb8p>uCytdjYKatgJO3s<>yfEAS@TjvtX^<(|aOOygv z22%EKBRtL#&WFi8fRl!FoezCF2+u%g>{XTh(?PhsEI zgdDK{zDdX!=O+}^2A1mN4DUwQzWFN@QLvnq@s`bT`Z*j%S0f{^fa@a_b-9K$Qz?V- z8kxA|ue`fmDr`Bd%E#cXJ=ZTe>jc(Kg-^aJf!qQfEn-h2uI?}5gX`rDT~40O3fUG- z6JGTIuv{ZG8m`96Vc!F3gGFoMwM%hS{O3YuIu5ssGvO6=rM_}IUqw}OmxuMQ>K{+g z+urt&RrKpc&pK&m`B6o}`EeHsD<_rYffcC=@H3P)CWhOYD|b5{FGQhJ3DAfJs(>A< z@-;{bF$#CDNkyUQ{O{UwTrl3TRu4bRgVgNz_LHSN8YkPmX86m#%yc##M=I6u+WQ5D zDUr=_+UU3HpJ#`zeG#kh7#M4Z3?Vu<&K$7NValg{mn*ypXl@rT4a6WZ_$bE|8g`LTXzZRfsMwhRuXey+TcJ zIL@%RFSTH8x#E3J^jhX+Yhu0g&Kok9Z**>qGT0e@`ee%Zv4nl zgPw>qgmde9TJy_8V?&8v4Ld|yY;|O}jbc<5eS>VCncR?(puKPP@^cEmc~gqJb%k7Q zG<~@9Zu{(g6cFbJ4G? zXFG%pi#$wvU}1;rWK%vO=-tf66g2$L+rs}4&6Ybimc`s~pNI3Y$i4dNl0V?Xuw`mA z!tZSee|<;KEJc#BJ1muzjl%KJtx*L&BT=00#GTmxHGb8VC07Xa!pCk)nXuP04(t0; zJP9fPJBmej8ZYAK50QI}|aw4*bx=&ARQhtqqD6*wWSMR%lc@68YzMs8Bd!;M=b z%+7llWaBK3$lTw&Jw@b;zgK`J(ouqk1;WnkDEKHKTA`R<+L0GQgGy||P{hN-CUgAG zKZk0Shd{yDhEKdTPXR__Qtuuk?dV*5RK`It_ zzO#}^uDbZKqIolc3cNPFxG#x;Wt3=RV4cO8E0j@@q4=_wF2AYZl!yGe@(x^|EGzG) z^MHlf=82vJ-Ph?gdCd)g+GVLKY+>=Gsgcz#_ocvn<7*;k^!8U7&1Sxm3bX6+jBzSU zWDi)8rablTHIIho%l)nQ0%{#hJRU~M?mUJfpP1ETAtt19%`1j!``2VAQv711m_|8=SQN;yOBiNOyEF9Y%UbBiPi9gLVg`g<> zh+bTAVcmT34cXb~E!GX6N=f>Ry!5f~l~sib(@gz5I@fxbEC`!yEArBh?dB^2GF^{| zSl|x^mb6}b)+Rjsci)|Grj6d>Ypq{{H{1#@e<@NGKs9{3?|sck3Cdm{i`y=DpfHv5 z6BJtD1vgmC*zLQpClzCb!v1wh)Q?zxa?#<1KY;mS54vNUOiVfd!RBO|-mk_>aikj# zBYR9qJ1le2tJ-6I&Go=XwA{U~Oi)PSyH&%X5k3?M_o!QUuT45ZpE=@~bK;=yjfJn@ zw+F0b{5xyd#EGBTg-K33cNOc^7`U60Uv7kT6EdK73ExdpoXJBp+BF-&{>@47DcnBJ=0CJTBa*w&$7f=;GWlm7&2tZB_C4TvB97u18}`!k^WWga4DgAN zb% z$YMCCCj7fK;ifyoOfhWQ;~PA?JjL{>9lrZe?#LTUuwCOiTg$O?Du_%qxS-M2x?x8U z7Vru`zS4ctd64P|xz+6B?EY}zWuR!!5rf2B4dfwW*q7<<2zP6{I!Gkz6sZe4%;Wg< zGT2fMQ*E7MY|qKDzWA90z~#cm0!KvX_%~4g!IU}Po zY0nBf*~HuA2Z1BC&NrL&8&h#=IHI=`}bLZf3VZl zGWpVYG)%9Q&gH|XD~QBF7PN@r&fVetx8vA!GE=*E*|(7In3)FL#G5zfOLHf|D0P&k zfkCl;Pw{c;hWF49wYyJ;j~ZF zc{Jf*II>tt-0q*4x<<@5zX^YSKvOI8 zUJirQ6{hz%^z-MXqyzMbe3@B`1{h_*wfibV9{hK6bu7=!AwDsqD!9stl56sx08!Q4 z`AtBIk8(%teJ(TpaKf5ixC2r(U}s@;&9W=ZL_=PpxJLNyI*4C|;vr3iLn3%(S&DaF zJACuDp3d%b(to)s>-L5-zp~qA{ZNz-Tp3QHeTR3gNg~MazZ~uIcqIE>2kIu}a@KE( zVAVZuie36YuS}|%a^u^xaFIEU=06VGh*wiRvx|Rh`F?s^(M^i_88!213h;g#Gy++nF_A0WGZ9+>4)+u}j(;$vA$2pn zBsS5-6~+W+HuZ4*fudFcYk{(IFh9WQO>w6Mu7}MleZL=%C?j6jWjh|ZIjuzH+P#os z(GruID{E2^yKb0%DAFBcRu80=NmL_zWYVWn$+#8=wx_A4%&}2?eXQEzUDpOUZIg<_ z=kw^}u*x}Aphd(Wq09u-Q&@6;8Xb(4$v4syGhjhBU8CVg!Am^8GW5OCBmYArrttV! z+Huq!$t7Lt(F>_NcX2W5pv8t_l=Eu9;qq^}H9+PZfu_Uyy*I>RvMT@H@cs~s#y406 z+G9GlPG$cA^c>86JxKWOw$QUv$B>NGhWWRqyJPX^4&Gg&FONw`+Jk21=))8D=~k6P z(y&yzoE)O{jxMhf{&IIJTGWSW_MkE0IEBPl54ACK*p`~cQu!#BLX^SdgGVx8BTzRjvoxK8_bgOaApdxeO!gKZfSUx^Z*KGN(-;5 z{R$O>%Ug>|ihrj@6P;WK8{YG9=7mBY&Scohs$+MWx2ctR{{!Ee@lF-0;jeB;Xz|fC znySX;Bod=3!fciLY_4h;WAa*$DArO2|24cRm<2>%Hs3l2T?xB?Z6LPHaoF z(pOx4ZunaJj4;^aQ;lEH!l8J`Zcf?~Rh8(&smCG)KTN5T;#VrN*4eqV$@)uvv z^sQUWDhey*#^TMHbAwq9HyFC1u`^sKA(DklcWV;u*KT|A2ad9Gaq&`uej#~}GRf05 zPJ!R_Um(Ckf^WN4emX?>DD~$vZv95@p)vF@t za&AX>@@0kSk?e??3yr&bTDhZZjH}Ql(i{H@50L=zMb$twvy)e>?h6Y z|GD^)Tb&a<(X-QJ(usAnrZ(jxwfkK7&gPgzUkyEP@sN&g4AGX7vw9h;EU^092DxAnH}NjSqDsvI3slB z;#9BEzFrRy&)Ot)ypCn_75Ns%nv+%nJYw@ zq4jpV{ynX}=?(M$-Ri!hP6vUaW2}j2kzZ~G0es|q=rA{H3;$;#8Ku=8i#oFt#`pR| zf59BscZIgNy7m{dz7t(T*!?KEHkvg3qgtQ33@8+~kMJ1JoLN!eBgNvumpi`m;zHVH zX^w%4&02xt>w3!jrxMQax8c2b$eHq-V5sobN5efUieONeItO979imfEUPiU?$U;l6P|cS>sZRPYc#z3u@rA|M4K&E{rfBNh(X3Ku8WXRZt8XMDEQYy zVg7L<##u}q_uT88VDgy26ew1e=y_u`Q6FMhJ5I{m5(qC>)@GgG@xWux#Tt>zR8jxe zkhfrP_PJGI=E=;#$V+{k;TuTSEHrm?W0H;|Tz5;DSQg$l>En3r?|pT_^bH1K5d6zb zOvF&NbN8+%7vaioHJ^NKkv>x~LwKG`-jM{Zg~to98KCBw{xmMAX6AiErE9?v0(9it zWR9%Pa?XgN+GE#;`+gzeVfQ`a0$iC*!LCWRZ|Uo~GpyW?F6KCzgASUQ6QPoTrm)VU zfw}Cd(Y`Ai(r77-?g_*wV~w5;`$gCP+079+{*|0NC%3STOPS%Si# z^-iZaZdNm&PKRZ;=bGbbGZOAa7kD?Fdc@g;$c)|i;2R41Z=xy2v@9_Hu#m?Z;(-vw zs^Q^DK6DJ6!e1AB`}J>gTIAVtsW)RxUK~~=$NZ)PPes{gITv2JD$9VGVAV|N=i596 z-5WZ?g9mnV{;G~qz}Y|Iq*`8m#Dj?G5huP-95J8FcDjOJao#rrM;voqPob%QaXF%)jUt6I1L_1~v zVm?55W@K5rK^5~@oIYLnIZ7TYX-h$e1(<5jDKboGf%z~Sz`qG?x5;+!P^#ef@ipo+ zmY(H?8Q*#O=AL@)*(Yp%qIM^*-8D?cYa5g_}+2FN`cEnRa`pW9Z46mwOZ6 z-;hob~F5+@pv(D_GKqg&4FiceZZ+UG2Jsd-!=3{;SN7*G+hp#eqGkLVU^o^r9=(u z*mYDI)lqtw9X~Y%*UiUxS>n>ZeXq~rCHcSbdnd-MxRaOS$*MX+A(BrX=9j&PuaQ(pP3?#_Z-8D zS@tw|+qB;N?nvy>-#AT7n^(8>%n;CmtPl}y%|`C>jVI<+KmRt+nhNLc2%oyAU_29FL19~g^?WkzprDW%v>aa7pmm_PN(yilH+2@2rCZn^j8e2{MV&`pxm`e&awU(j#$5<=S9lAw5Q}Q<0Kq@q4uE*4fOvJ;EcKQru(5!uO|>aiDXw zFJ1x$6I{nwJ%+?Obc9;#@R79l3)I|_vIghgmO1@Iq={h7@D;&jMn?nc@)ps}^Wllc z6iDj7JJdAh0*IOUPz>2U%GmI?>#ehw1b^o<4}iPQPeu;KA2$o&0;6`V-ub-GKf$fR z7_}6?dObXP8|s$nk!A~D4=EutjVHmfE?gW)#sc)X zt^t$s7`&wO54Y-KGw<5WfW_@DT)ZVZvr{eO%aJW%^#8-#5}ZpP>C4#87TD$Jd6HZyAVj zqcQt?b|g2G!&O5~B--_fa!EHBf|1w%%7ia-`v%fe-f#z3rad7Y^O-lr4ZUO;K1Teh z*C-b%;q}WsuK#>zi|k6bzPc!iq8JJVwy*u zNTGkqq4e5NEN zEjQ$&`UgzBTc5-5!}GL68o5&v1!uzt_Jt4hDC#wZd0!b z@=Tglw;{}^8UKl^K6#XYG;k_OUN0Jca#3Q;jPgxfjBCpLDH{on3%N2@c+7~^{%|xS zMq;c$%`XCp=I-FIW9ZoH^6nHbb|m~{D2mDB5&M-pqtDkz60_C*d_t4-=BI1?;z!Gnf%{*n_CneK4Bi$xX~*9`XNi8 zyWaCLdH1ot@KXQs?pvHJx$~eRE=rLzh7o)Y;b0qV0B)>wW6F)$ zjCzwbOZ~`F7a5#HS4gB!5iy;KCd>8Cw}m#P9SqkYY!k|#XF zr2ZBwY-)u-*o67*-)=5YLb78htL!&RqZz|t0xO)`7Ow1PfJns40WWImu@Xh==925u zu0H_aXg5LUxxsLqjDc=z7yBg!a*XN|qwR^mn|R7&npvf-$4LM3z9Q0vh&vxT z6n?p%>VzE&h293o;ZtbALWRf-qf&?xzTW#YQCObVoO{b>`u(C`3=t$f-r(hz){c8F zfBc4Fj4p;$weV}hVZ#6zM6>nW&ah^aVN9A-DJp`o)}zgkF=ygH^2@1dm7s8yJy5@&b`AG{;Q&8zaFaVlS+vG8brG>l=uO{Vxn zW=9+EM{|$JFp8DPsbMTsD$Km1sNhd9@1SV=V;Hc{s>QHF+qg(21TdMR?gT>m^OKZ3 zmGGH0;g+Ekr;T>_{9IppQyShWv{jC6scCnkGp6G@AGaB~t` z6dv2GXZ^hlQvg2&&D1Bn;w`-;i_TH5&KfDu$RJUzsY&fqqzn2{c) ziuXnx(XU;RP$$0s%?`~!xHoFE+9MdfhO$HsJPeNPgTk8e8y98Xaep4LEnTE_@!{Ts z^h{=;yyDz%C%vi9H=GwY-4VW_P{e=-#S+SZ>%zUPHSmpaKfCjLC%#hr|46zQ__*sj zU-${8>$FXOold9IAx+DqP3V+1Fqd2=Kp}yawosrTmmngY$;?ntpxi46G(aJMLQuha zK^xp^K}8gGD=xdOE?V^LTHV81*Il>OWw*#t>+Vsz?!)@Le?8CZJf5S3Waj_>UB2JX z_j6&Hq*4%m;qHnB-#5;p8yUUaw?DW(5vgZqUfhl15uFQBGBdfv)a?mc=y2@}*2l_( zO>3gWkz9+@uLi?fp6=uY(ZmlLJJ545r?2rS zkD2U3RC~kj>q6tfEY7%XJQyAiByM9(j%;QGstJ|SnE`jiW z9|gr5>-|}Xa(~m>zSiHxnm}{B;F5LwlYG&T3yQA0LTaM{Ys&b@*~MQ9k0xfJakE9H zFs!*csqk*fTN*avLVoj88Y1OgrO~lzWds32c~;~$Wv>r=-jOvtj`jj!;JsM|5?SN1 zqkDY9G4k0L>=uO0WlbUK#ywzS z%7B84MCt$C%Y4zbH_6rOXVHD7VQicV{eGb(yzs0n=YFkFBP_kYn{6hZE@CHPxsfV- z^UbaVl_KeQgdx8DfwZ9Ke!uZwm$zef(NXxtrE^;Prp}3_P6xVugdz?$I%&AXa+V4m zdpc2{hZ&??v8cQe?N+X70$drdN_V+TV~I?Boq{jXp#4jYMC8QUF*Hwx5yFl z{LK*|)d=t0(5CnveqT6rd|0vsWYG*4Un6rx{zp{CoN9)h*)Xy~s#xEK=bB?=WfQ5AgnD6V*U4p6SbHt9JO1~3@Z^-Gl0a@5E#sruH#6_ zWC#s2gf;C0@GpZZ;88o5nQHhI{UyKgMt$3Xq^XC3>xo55j$3;D)`bRgkpZR?(fv_~ za=>NxtXDLD+cDS@nfmnffqhC z{WfZrTvzpd=8GPnt|z)(ElD%og%km7LjrMt@xh*?p)w-)%oq;ywfDFAyI0N)J4@ZP zc9A;7I*agn>W|?k`LOH~IxwGl=IZd9dExMKLTgoAX2W?nc93McJ^n$=G~4jxZ>eWl zfo?J|4NG( zd56sI?qgz@9jE7HjjP7Q!D5*^LNbp@%+aibl}p)~_0x$rs(GOr^VX>h1H zaui!SmLe@95p6x#k@Ulrp^>+uCg;%I31|coO_IwsCS!78*QWLMke8-v;Nm5%00pKl z^D0e^?&XD_orzStcCA`9s#DBsG!;5m<0KSBv@q}R?r7Se4WGP6Ro*htv&l*Ht4nDG z3kXeNYBaS7fK?3}pY#|GuqU8B!O@tR<4`6 zLx(|#-`JLnJ@2OsDv=`O2_V2JZs8KY>J$)-i8%9=*Z1ooAdCj&A88r0nEk~o+Tid% zxXR!C@_QLyQUlKwoKuTti*BTbGCHOSs8b#qiM0s7jJwYsf_8{6<7vX#(t zyZ4ZKK*Sl^3{gDhdumgXsi)Gf4ycoUw;3+Y6zdpe{2M(<5L{WrVfezL1h^#p*LpgR zPB5Qk=*D_0M?F~y+h%6ew0(oC_p{y~4F8r6?_U~zT6R?0`ZP#$lvcIZx$~I*?T&1? zSUTufk6hX|pnE!5bI=HTXLalbk2@mETa!q;-pHmC!th7iP|PPuvy>)h&7LkPscOEY z3$dv#y*qL#4$S3esfhi3yS8-vAIWsK#-q4;E<18|jD6wBv!WY1--GI*qz=Ab@0eJq z2Ih(@Gr%)l^b{D&FzH}asge(Yvwdm#|YpmopuGz}rc_mOfN zFk|;JvJ51GcyWc#oYYCi0GNmI|9jRkSq=ZYA3(Y%!S@A<#`Gxs&k0E!S6lom^bDN# zsE(**d3whdldpBybvp*>Q0RxPp~ev$XhxI{JYzpT%bx>5snHd2k)nQhIf_UOijuU3 zPp_C8WYnz0W@R`Oe%-WyU!E6UpV=~G;ko1Pemvo%;~pB-Hv1NB`>mULbAfUrPX4#f z@et?FAj>HXzM4(5G=xNkZ!bxa$XBbs2-n|}*XYOCUq(!gSBKk`)fiQ4+_67Pt#=eD z$%*_NmC?Ody*CJ<%j1l>+XR6qmIYG6WpmDWl}68fj_Fs^EWnONbF_u4kWR4!?m;9+ zVn^GcDVmU87ws!r`Wa&AfWpna;l-74N`x=?0J;VvfDdPBfu+S&U)_{m(gZR`mzuSggWhwK`&Zt!F?wK>)8rWj(96vKFujghTUhxuG& z{Z3ryzYNvFo5zPgoEomVTNa*OOh;wBt)%ndV4*F?^L0|}RiBY72_!bNEeKi8>f(io z;-|L9EC01SnI&*9ITfFi3qv#fL#}m8cxa*T{#%Aa6{ag_ms;%9L$h1<8T_ldrmw<$pM`qu#BMm5x;it?tjCcw?gjcakcxl*}7=w_l zC^AYbLNhquDfgrz>*TorL{-7f%kbO_ zsbCL%*R=2qjXaz2&KMAcCUZDS&7WJ8L|Rq3d~P25Ys1He02H;n31%@&pBb6x&t2*O zn>U=Khcs(ib4AC74}_L^?a=I@@K@)l-7Spd9sc9eB^>yd&utmNdAAGhxHi1!8oj1D z7G!sH1?g`6^-22U?1I-|b|%^Hj&~nVGB+CV$LE=sWq9O`Vpw zCsixO2^7bgHjDV7jfv>r{JlAjT^WS0Z!Pd)G$zCu)ilxbF|4YDJ36{0I5<+G7=-tg z?goj~n5{SbWJwHSiX1q$$aql(VgqsuI>5A$E%*7J`Ei0hxol*=h4Rp~-Gtp}w8o&# zOks1@A~9T|iQLSy+zUCiJ=89TaFSq$KNLFFCejEW93R7J7vY+vHWGF)9x^tffa(iB z>tMPWN6W=}b$e=eneD(R_biK=9h;rx|IZ{YPW2Yz7Vor`$dx#<$~Br9^+q?$aSJy( zCMNUlb!Pv1FBN9tq>#O`P36A5vm5AX?1U{_dR=M&Uuy-Y!z#tK6HjEEcI_d#F9t4) zz&gd(N7bFCh2hHSQK!X(462h|8E$+(1-Cn6I_M?C=miM-u0<6jR_{9O*rl_i^;Y)DYtp zu>j%UtL@_0W6(M!KPkCe;bWV-vPrkRvh6Oa+x65r|CKU1}qW$6L zD}>>)JRr!Qy)^vO(h=|9;NopbVl7sO=SGb*vi`v};=r5%L@%%I4nLZZq$Y_&3_M5I zp~1bA;g^@$Wr#yz;fFGN=I0z3g@G8j5YGI#OEN45Z z!@FmOw=%Q=cFHwu!`Q%vFXRlua4*x=4n@|y{3Hp)O6(qVEd+1<^V3rj2V;*8i#s{0@46w|5-10yY8 zn&2pa&6YNr;W!vBdN6#gXsAf}4sznSE`ZGidE)$QH-~@8>CmxmM?fXJPl#To=|>>c zaaR4u54wRTXC@71)eT3MMA=k6FQdqH75;WcH|HId7n_p;mtMB2%MR`JOEyz|nWp{+ zB{yiQZmRAi&uln850x$s0J^~p;rGLl4^&!GiC%gnE~tP;Ugh#g!2**-9lkw7hw#?f zAu-daUDTk9scLW z@WBhoR&3v)@Fz}~I=*!*1AsU0V?qp72|3d@(+PD3fdPnpD>WJ$#OwJL{AMatl>3dT07Gp>+s zPd*VGLsx|jOW48j<<^TWIv-FHLpA{nLV6-fh8ggjY6( zQora7jTIL3mgBij^BL=nL*;xrK0;vigAY00!ta+x9_i-gGXKJHv%;C%T`c_!k;DSI zo>a#lpQ1ZGIAuoM%TAL9iIdDi90b}MNDfcj{iJC>^0u%O&&Qt?0O)9Bp?3# zL*cYj!E)2{-poUbl69lxVz_5+7M(6%Tb6(Pp}TQ@_=pi?4TMXfF5!#s zX{VZ~hRu(QFGIkIMB`*`K$dZVT%$KUJ3k!0OHcy?oA7uwjHlS!m!;byeGi1s3vAKn zIo@l7_%q>7nY4OEzo%S&^YgCX#Yuo0pk5s#|lPqSj|J)@@2b| znt6JPpWW0}8JODFW_RpKc(SzzI??i?!fB}Ez;uDd5UoYC9hyb6lt?9d;SzgDD6pzQ z&RQi?SkMGay3Tr-IydK*8S2FSl1>I$6`)IlZV$VgFJ}{R1)=*2vk`8<$D9mi8Lv3%K=M74 z=z`7gwdLVs+xacKG5`C*@nrayQ+)1a_W?@|cXe$JpSU1AFlkKBzjrtTv9g%jhp;|pe5(;2Kh>yfWSU_K^O!zW31a9VjJ$}O&;wd9q_+d-|g|>NtR*9nU;6@>s=>@ zRioE>U*wwhjQCEPj zXP-)K2f|*$a-M09N$pTL>y!wA*Vc_eUr24Zx}_+N(4l+HnPEF4z)Ck9k4Qz!G?>}i zhYlt0F6_E3R)OND{`vZ71x9Q#z~Ej;%n&O02_RnezuXYrHd*X&l0Chy_`2biX4h_d z5N-pTyQWH5q+$9R?_`HK=t@{{ljfieh&Cq`US8ibnIAITOf!|MtFqhNbxw5-|g$R58=BY!TGi`a|Y5&wN?Tt0?N_C(R8Y+yB0$HvHo``vrO-kz*BDF(T;?r77P ze7ZrIU{&@PJHYdP52gMi)v2bY+g4nBt-`70#@2li z!I_q51KDrtkQYP4lVxgwmTdZQkrVk(t6KAnxe$=+UC*~PMsAOpMceOU93weUA_q%u zRGMoKx3g7kO#Kz~WCKyAT+CXnYiaoIT(E^`k#(baa~L_OC9VMO-FZn&1J`)RK)0v~ zcqRrE&ihK|`8k&-`MN_DXKspKglHK0am6B%me%q1tBmGcdNL+ZyEa5iEta;D+)pVO z)zlFN!YAJarLTqiA2JE)TE=C&4VEzLgHdScE!WEEo7&B!8r)gE?6k0PUD)4e8*E?I ziGgp>3PGBi=SQ2B}X8L7l5Ru}nyJ`m20Qv@G#UV>H`89j}YEcCZ^gO8Gr z)M^5Yz=>y<0m$)G$^#M^QF|6ZitBGo4N3Vb6I&yiH}w= z|8}}Nrg>@{m=PNm#$RgJotMJS(@6TaZOjr^!2t^4iHBNsNvyP%A4+xeGc$(f$yD08 zubZ%fBgqgNZTQd6IW2y)C12%Mp&!$!G{TP_Ted09NL9*W2r-N7h1KEvrx*b#I?|m6 zq;6BnrX#aOo8T{z?gnI>=yCP)aqyRF2#?ck2g5=B^m z!HigKLZuMAh8&P(z`T`ahL8q@Z5Y7-FWz;>?|{hJ$(_mPObqr19G zk%*`Q2S{u(SRW7+;XU)1P$ouCWEeG!xEiKrz}m+$iT7CbZ%!o;p~Lu<(b+8ix;9Kb zPMgia)>{ptJ2qX}-p{fl+?7$29NHRtfUy(W9T-Nzk0hTWy+}?C)+T-VoHd-t9}lTUyNPH^>=CNGg)M zDU1CRlj2jTqUcb;FZ@Ia`Jx%_+6uld6g&3MiQom@1&ZHT-_(}y#WT>_LiT-Wi9UF@ z;js(742h)blj0rNz~{SYZwqjX_dR`7=M92#>8wDAD6vr5rJ8 zG@~Lm&rDtxgX&Fy+1^|Z53ug{%o1ZtXz<%P@gaTn%*^3g;f5~TE+2UVq6iftTOY=k zXQSj4r_B@{DELJXo3q@(^0DnSU|XWu;LGzcU&1q&@Qo8lB5ec_(ZaU}QLQj>Bp=nX^LXm~d~2Z+wgM&G*Jd!cDBH z+PXHgC%V-|8^lojP$a9XF~Y|8YpW(d%XqGqs?L3QV^Ue})M(zGfGmaK`yEq~+WBF9 zx|0stm0H25JuPM#zw_?Yp# zKk00vUD~)fQVKtmZF7hJ__>f$bv25jc+(<0m2KhpMeZ$pY_7Fu1FxH?^~F%X%dx>y z7;Sc5%+^JWxSQ8IIe%!3liYZ9#u`4*DFGb50;Z%+YOw_v@G#Jex0;1Z;vh&`IzGM z&8<=2v*wZ$_#V*rz=zAZldL@=E9w+u&JG=y^$EjR%vkhjy%!r zP!r0|;W(-|)}9&%cVJq45T;B`=I}X|@c^iekszyZ=TjKM%O7Q0Q4PP(wEm??6j2=j z?J)kn@UwO8jOvRt;;viTz5AKXFzh<@+`KT`x!!xrIMg8^Go-Ac5Hy9x; z^J7bQNNY3}e*5mQ?;D=Y*2f~CRtU$R(@rW|qCK2jrCh^}^tg`?D`gy2|Il4mW6--9 z)o1pv)v^qP<0C(L?TNIjIh{tXlmOR zPCwonO|(n@)lc};(a@dXs6QNy;dOcx?s;Y?)G1Z*G&~cJo)S%r##hGme#WsVwr|Zu zFygjOo*Zo zYWUQg)M!scCLWhX>*hN9ozb9=%c-$^2UiKL!a&!sdmZRD2JYqAoldxOsHaIqYhotdBWct^QP<^G9A-t_UNm_@EW0YPAU$_rF z00QzYC6+V*CaD{eB+VY-U#}*{Wpl)_jJwO_30kw%cMw<}4r@OGzOsN1R=WG09AgHY zmE!qZ6DFJCf6huheZl%ZT?iBsWKh-uQyBOZW*S~bRZs9gC&%5_vITt(x}weGUr&eT z=dhLLbR&_mr8W&l?N9m4rIGNJ%ks1!jVcO{p>XD4cV~a}dZvU5SDYLR9|7nSdxyi< z?@y916&fAGNl)yLL+o#avb~aZkZkW{t!g`nO;<{mN@J@FQCM~FuCT7pA9-?RSh8jO za@@jdxZ^?p@>eHC8>+uSBbY2OjZH~s^xCWZ>>n@95#NFn2~e2x=U9QWhby|~9y~c* zaB-xpCj6pWxcJ?1-(PrzSs+nC7<(q|b{5&&y3aX@@i%!wt zhjuLpKMzT>7n8OTL#W}W*qfWGiUhCuiS1J+OKK!h^tTs!EmY^HrPx|oBfZk|Y6+*BOl-YZ(F zt^1gNqPZWdH+{t3&~g0fYC#kWmL0gTCHZ!l+=+Q7sy#+y<+?VqcKM&WoiTBE@hpjO zsBRtm&dEX6eRA51@EJ^dfMq7PE>9II``l?!t8JTThwqkK>%>ga6*DczBqp|xJ`I_@ zaDbTIMNF)D*tOU|7KOE{kUW_W0HFJnX9B=6HR5?qrxqDg68TuGqt#F(=$~8x~jB%c+)Y z!!uo-a`eV{hz#sq&`P~O5Y8G8UD4=C=iwy0|5+C1))!Anby>O2Jv2Ik-&E|3=c}-m z-jL}J*Xiz2dSsb}A2MRUyPGc%TPX8?;;TjBr4>F#<-%^R^QP(=R+Ii*_?Pv}W5RgS zmP;%UvH^M2-RTu$e0|fobX3TgVa-XU)Kgz_(63FI%18D#Td%R9L+jgW#cBIcc8pk- zpOm`l-u1dB9zJ%q2$y;hOsPdcK4$q%9S}BM2Ot8~9e2U$=yY7$N=EZ>^xYUsZBMvo zYeGmV^OuK%WeY2NUHIC$3iZa+Eio=2v;VO)Jz`z4{*&9M1U$K`b6qynANt!#Gls$& zw`UH!59Ph}gu~mMfG^A)|9nKpIPe;ERjr2pj$8uKvSfCUNwn!UG$zNLh}*!sF>Jq+ zSuMpC)17QLn7B|@JQxnXxnP`Ev#v9tY~nc><&--egUad(lYku5R6Q&;rf(^6|} z55M`_@c#6O$n$^&Ud&t|BM({$DVLecT*g?0U6JcY5TglAoJDMGvXXxpIQ4CG;aw+ z&G1*znP~YEUI5kb#lPYtBU53(g#Q0U*-u=OAUOYP^DDzY%nbi$W(=eRqQ}p7uueX5jKf-%6`gjAqnw16^8mYX zAaR7PDZT{T+)AwGv$TRdCN01<;b1rA`LSUwGXg5bx$T2mkj$Rtc?|o0G%bIjfBXe+ zgE7*;)Q^E;gbFpOGMU|L@)B)D7m2WK)RsjZXns+|aqq6Df%*=Nhd1W?Af|XV>}pYG z1&pS0T{-Mq(#?iD@_&}eQ)f9arnD<##c?_iL>p6w7On~RqQA&VSeVIP*N$RPTdmz`DRCz66ScmHqa;v z^QGsvIT!mSxw}U8!>byHUJ4&u_sYT4%wDa+`&NgQW1UhRjEd^j)@j+I$ACc7ao97l zLs3HsySQ8>!kZgXH;$!ADKrV;>9rYtq{TyDj+~mK?a}}1``^^$r2h0!v<7-Y{$_8M z>2%HX0IG*24+)wcNqD#1l8qjgwslB!Ey{057(}CJsP}GpD591>zd8C29K4blHD7B) zsLZ~d{^4cs5?2(@+atYE;lKNRj=p79j zzWY``xnV|_VmnwWcI5tY{5Ai>)(=PO=*~s$G2Aj-vQ(Ov8Wep3qbrkJ9{#9sdD>bc z?GM*wBinsx_sIV>T5MKzE3Q*eP$As2P}#P>D*n$(aaY&~;euOKaXjVNs5i|iU?>?v z2zH(fED-Zwc{1K@DyFa?GuoceSfp;!6w$xzU>y2<@_Pht_?V0>L910Wyzmrc7WZOt;XP^WQm*6S zrjulCrjD*%F`x|v(2)STY(M#tuH7Evzg`jEJTEdj1TUBSTla;RvN`uFU9)N;Q)thd z$=IjpGvH@ag4+`DgnG@yq7ja(p%m=?C|P15T)V728rDa3UG%4#`ddzIn0H)tWo@M< zrsqrM`AGc^6qLf*;co}qoPa01oJC4+){3=76RVwNMoRa`?qDrJ6@xs#s*vlfR@o@K zE;?S|qH9r~w3$OpdCY9RG4d5F@6v1Gl+3om*Y9D|nHKNYUnn0+gqP81^o19rXZdJF z0y#fasXyBiG2tyc{F^U4iF|<6SP0*nuNB~mP1jpNlN`!qE7=D4h)+p)Y*h2G&qGq; z-jvt(vE|T9qp1?K^@Zne3f1{o3gT-;tAt^(2&QCa%b$p`GwJ6$yIWdXSUwDdCyu%E zE;&7FhW_#F@Rgx_easT}3!`nsh8a0V)l87ssia>dl21_r}q+;W+*=;nLH|3{qq7ONce@U=3Xk9o1vK!v1^1r8A%imxq5n zRa8!;zNoTE6W$zP$=(PTEwuwce!u7xtsCaw>%&}%%s`BgTpH5CIlROc7PKo&%CG`h z?#9fRuPso5#qf#PUF;l)-Z-iLLi(to<)q=aeYF$^51>im5 z&V-B6voL|fw6*T6{Gx8i>Hs2pG!nUMNE^qOoKNs^r=|r?nu&%#dnXqNn2jk}l+IPx zj=a`gWBtR{Erv?>c(I(PXLM?qYhp=E-a+DR2vP;_v~}eYID+u}FXTNEYM}wtTxC)L99iUK8$W51Vt;-_F8BfWY$`gVCCel`EhNsbT3^ZSKOaK1B1iVZ;-C^Vaa_dU)5gEv7G))%9i02Q{W* zE`j(Hgn&y^(;F@2)c#|%(k(lgrwE5CGEfmDaqylrT88U1e0d#-nmv`;d`*nImbWPi zn$oRNrQgsO;-*o1ZtE1=gj(t8m z{PNvl(~V*GSwi4?d1Tj_#{hs;QpMLJiue!9x|L>q4Kof`)Q+oj(KT2I#ZdnnySkZ; zK*#v~>U;9zf6l`?j`wzcJ07?{It30cOa|A?6KRC6r%Xb+ei=~3oq!BGfBdp;{x3iPM@A_$ zr@*=WwT_Kr(T;Gexb1$w;k6-ps^x0Ek1plL`O*AUlxQMV}Lv zHmn79(CfnU<;L1hoChR(1dwaLYI`Z@?s~>(Im~-7+Ybw^_mv+`hRc7DmDEO(XxJaU z01w_8?y$(&*q8Cp!p#ZPdypV0m;rAaI2^BEak{74XPwxW;Q1j+kK`ySPW{% z>w)%$`gsXku52n*CfWNDq5On_g)y0fht>{@rs#(?Rga;&AgQXD%_FvEXt z4KKVH5_96O|JFre&!^bwa1L~x4J{ki`}8~0t7o>cyUfo{kW+^pAMoOKJZB(O3jg$S zW_L9Bxa{_+BjJbJVv@8}w2SA2AI!@3Bi~ZnQ;dbry}#3U0`u4ryE|lphMuc{>lEos z@T<`spj(4Xt%^riO>Lbs^*g5c^YhFo26?yYJqkUOS#JY_hSBnrTF}-#`Y@E~?Qv}T z@$)6d)C>mm{N^F~?9$_L(lg%)u<0VVxgaTBbTkVyyAY%J!0dLIgsH*FdMgAPsgu{} zXQS=FEh1P8C6?6WrgS2U7l!2jk`-gjjZ+rgv<499%c&)^8i%{lL9tYH%OXX|J_f?g z(LG{QL$gzgp%$ksN$s1FG$o_t&C#a6T(-t$Z0Iy25HO&YZn<>oM$sp%SRiuI*bd)i zdc@A&6@wQXQaHBZ?rRzQZ?lmk=?_z#}EHzv` z7alXjyf#i%H>X5DB0w=Tl8Vr%E;{^pOaI8ve4E?_VgK52@n0eanz>y#FTu_>Tzb(P zTho|0Q5je)x2aH(0m|X;pR@u`_+fjrh77-^TWZAC()38Ymu33ynNcN>_;7Zh2w7F) zbX^5dd394a@?^E@;sJi1_&{p=XC&f?s(M73-;~??xhU<;AGL z*z(RW@qURZoDUI}8V?`HSIujcq~KvDUyHk~r>LWJTOYbRjTL1y+}OkMvdA?v9JoH5 z-3g+zLa#bIlEF;028N8DKOQzeAEB17*PIbs(lPe9T0V3QJsq(tk*7GTL5}zJY7}Pt z_dq-DLjR%B)Jqq33nrol@PEp(CHwRhP0p@Vh-^s>fT)qOscSCIGUu$Rd?iqD9vPb^;6~{D(gEZJUV=3mnxtB~Huwa!KcR&?jRZ_GPjkWnbBbQ!t}9YwTx$ zTMc{L6;v-Qq_z>mG?L)Rqja2jx7t@jH2Cct*(3#gwN?{B7_C{NGR^dL%cbs+ESuJF zcehYK;buJxGkY}eOg@vvB%vwLNGA$Hp9R?xM8 zt0vd;C4?3k==|)&*yn8jej6L|mNf5WgWP_e^?nTt{VfI9wZ%e{;>I)w!wNT(R5Odq&oTjHQ|j6=uT!T z>al+RQR;4qz;Emi6O$`YxUl<4gAjQ;Hr$P_uM~*{$?*4AncAg28Aj`T5!;Clo8hZ> za_UR-vP8i5+STlP)m@;GX#_STcePeBCECPf16Y$eP;sa*r5cw$H1v3Avz0TaI!Y=)*=DSZB1%jxZfc6EI%Ji!aE z{@Nr$qyz1TpJc9pW9H&(-6xYxq>b-XzU|p)Xmb2__;FVvN&2mO6V6t44)V?v{Qbpf z^_sSm8^!*vD^j~BfPB?(UFh~)7)DZ~4s?B#AjP0XNst=q48K1uDcS*J?+=M+U-#VN zNb@VMI~vaZxbL&!sn9%!4WOxBciIR~7DPCGNNrQ;$o)ll?il&-RLU;A(&)I75C1-p zHvOvL&3x^V%#j)3*Jjvpt}T1cwUD{KDPdc(5qg_@M;%hP%#-|S@szM4Q;jEM4b*au z9eQS;YqlPa-_kPFkzHx(b}%f<#<|ns&-kZ>n1^-3LUV|*P^V8sBv{oBj2-JbBq%`j z7F~D_e=4RfLjLR)R{qV*8U9g$h15C}*5DyDU*9T- zMXF8lEMb)S@W;sTeqk(uSP?G&Fh)z`jic?{uZpSjWr0zC5y&SvkW>LtfSl=NHY!82Uo(IrRqgQKXcxp#Gnh^uvcbX_nO=}rjmX)1X4R6~SGV8*|6=B== z!mnS+s>&KHh^M}r*>!$6j@T)bv$-;UGlhh~WPU_?#4+6ay=Qdn+t&>|$DY8TuN;e( z-rvMj1i4-QubpD&`mw7WxU+~y3QTFH7PrpTGGI8)3aQK6F~J+*cQ;V8C28hk9uW+X zMae8n^_i})<41YQ-#S@W3@76JgLhUK9JwI+^WhtvC9*-RN=!WbW4jRIqRfy;ZM-kl zQrSB$g~-I9*qbWMk*QJYlNennFWzO^I?PlgPGMtBhDu?V4}UcLTZMr$)z`qZeUa$+ zn;XJUzT@2v#~4}0B1p$%*fB?dami3-qL}7+fm#I#8X{!6UpFeTPKikb3a#l^Yz?9A{=4q(W3s<7%h43}_mXIOYn7GoM`63IQ= zQhjAOsmXH)zVTuB?uHV#fKGI8sSGL@(Iv*o5@I`LQ z8%n6ncWw#4q-w_IUz9pnQSId~^%6F{l!jVIPu&y#{?$#u{a8R_q=wOVVKu40q0afI zLiY!)o;ycUlga4R!gJ2_fo05z(Ff$ZxoD#T7s5Z!u+sne!8eX3`=KkP)ZgFX!EL#A zMU4*>P!(~Ehx-9f^oPxWkDd7npqBdK?O=4=R?!!ITYn+9~NmOj$&l zeOQJN4HSP9S33xAPiLY6{~qlVG&tY@Ora!NoL0r+ZiF3AXJouxhymYR!l!0<=NxiU zA0X_$F%9{N@cx%(n8t=5on>PiD)xu&HPKzT+xT}9s?VhDZRDv6O>;>+~M0eH}#(3POXZ3J;>(xC&SwJ#?zq@u0GvE<;E87s<&_; zA_FYzqCjnP0yxOqKX6+ zuD+#{E}~&vVjz{uQ)J0|){aM-99teM-IwGa>%cm$H-_3{d&-m3 z_3T+p!CHo@-;4UQ+n*EMq8P0iGE2v5q<*v~23%6x<7j=(FM8SAyjzft_asgj;x54= z>PJ(TEkyW9^_Du>`4i0c7c+@wOEYzEf0Bj?nzSn?A0baj96j1G%xdBKhckOp;V?`8 zXr9RFPiYa4M94xa?yKe;ldaHf>+gs zPKB`3b!@0(Gsm*7O)TA{E%b%I?(-4vxhRD^`qeoREZcG@EV+gHV{^?FK;BsClzOUG z?;A_4O@;sa4#m=(GpS@#ln{eHvxWA9&Rm1T@t}LI)X;lH9ftcpIhd z`CB4$KDSlfwBg5`jub}qaPD^g+>FXo$%w!I=6J9CiQ~iHU1)s7wNL?YaZRyxUrfUN z*#Dy8!}F5`!L#5DctM;%@8|aj9Od9q2w(eOw4PYff_ij0nPoBEe&R{ksevFMHVz+n z$%Y>#ke~*`TT8hdQd$glZHluM4DfJVp_54)cUHD8M`m|Jrp7Qck(^S)C&$L+@J*_1 zibNDc-FpoyIbO+~mn3={eW{7-gN(ph*QBR(?&DBmT@+!zj+TFwDeul`0(l+NLK3Gx zB*Kf=gmMPK5aeG>eP%O@zbJY2I+tG@CU1;(3gMrIO?)IQ9ZUBayaM65luE>)w;kUG zEhZQvgvTz!;j9w_L^yD4FqJsTNpR%6aN7k+^ZT}FkQ$(#onL4vN9Ie+>HhPV=q(#Y z`Z{!?mCMuhehwl8(|_Gk>0xP23}AxAM4as}Ap&f&J7`y zw@oPBB^erx_G&^o3>eP65e|3ekibjCI%EA0zo5&aaz>=&cth>nS3NG=yV$z#)DoIO zU~p~VtVdN4(B1+!F#Sl<=Yq35PjFFY5G4jD5%U2HReq=3 z6UJK_)AGk`Jl^_HIHRA}r5b+AzOXS1C34s&d6rgIZ|y|J@QzsTeX1IJmfT)%d{#9Y zbBr-fc7^Xg87~|!!S?^JMi^ce-i$i6!fK9Qs^(qe6W zI{fmYym2ZJ5Tmg)xU(f$MU5EjdNBO>PPN)?nKq4D%aS}&D;Y^&UE=)CEm>HCz9HIl z9eS&!IJHldfh&edMirI65Dkpds07g*{(|?oZ4M@-T*hwx2cH32r7m3%woV@@mSrP~qi#?RC%{(9?~j4u7#v8$yEx3xR@xYWrq^j?IgrL)R;FM7MJ%oBW{M$%veNr7vsl zFw{VITXtUSj&2?ybRE&~JACTws2CW%bNt`i+#U~wb_3Y4clw9s6b^F|TmG`;5zZ0_uWP_wJyLAgPJBmP9 z@Q-2lu$wKl;Jx9vtCHko_@>u=qJ@IFAcIn+3676Qd@d1ho23l2!UsMdxd%Pxb1(Yt zWvS(7M2-PM-@NO)F_3WcabWAAv=Ys9%Z!9;BCG>Agx0x2#OaAuw6F$s+21{8cb5jn zRv$Ikqb>t%6NCPN;(X(wrX zJ+pCPY#+5~H_$nUW>*}(Y`mUxGWmkr_@&FkC5hEr!`Gt@W$sEQgz-S)%HtYMJ^uei z?$$RNI;c!bnl&Ws_B=J_9S%HVuf7;m(G+b`PH z6Y=|Tb?KnMq~t)>?3qym?#x%&K&B4d5kB~&1Muz})11Ym_w795gM8{i9iQ=7|4r=< z3ub0h_nG^b!Q%sqau?+NNx&kBDvn|P2A3WV({^DfMquHBTf??_qIcd^3imydMXWOh zV#>TceEK9-@i@<{ZHA`a*P2g6yPDx0B*}2MmI!nGv3KtsodXqNTye)#YksEI{Hccd@jc@=66q8iT4CAkj1FX&F`hv?!B1xd)^Uo?;|sCZcI}f zCCwg9)w3JYRqL`mn0hekfwttwCx*vVBB~rB=aLYffqM6mPb2Ywq>LGWmhs7<4dD$i zf@Y_Vk5z3(8?8d+7}>{-0M%44nF^A|Vza~jqsvEuu#@G!(3bdf)o76~7z9)gVT8BD z(Z*PfMnhh19d5|$^Vsk6&jrhR$#y?P1LIyU330A&2)~MFUZt`nbM;TTMBPj3I@Aj@)#)QjK5KP;w9j(jP^|afg_a5z*Ct)pW`}(m5T!>l%>nPS@zH5xe=4xV|rK$#jQh!X_GFkBy z9i4uWde2WWtfRs=y2l*y=?oKUjqcVh9-ILg6K6JH7H-{RLDq8nu)+3mY zX53C0^HWI3Fr$cAC+IF1)Cn$`w&lor+*!U0pl2)#e^n+I3cUOQF%TrZO|PqQ?BnbG z8vMsOS24}^a~=o%y9YBUnl@Gv-bnXIVq%c~S)!tD$Roy!vG6daU=5U12xjIwmDU}j z##a392ie%N1pz}f*>xDsj`YhrjrM0007k=-Ev~sjD6H?_!WxVnf!g^gvZv^~ySba-(( zyDYmuE__eTrfxEK;OpVduoEZ#?6Zvh`xJQb!J~dhcUg7?_%kD;r(0nnDtpn3Df3Ew z)!xYoZ#lxcLIywq-l6qOA*qk?&>FQt{_K4{yC=9xvN=N>y(iJH(XeXRU7J(gNE@ye~vb>YyM7MnU)qxMPZMMQLsWE{1)rnr7I_#nvzK z+`BeSRBJ;LWaLLuviXaai=BUL^v%>0)2i-s9Vrk1APB25aW{sRWrq~Z9K=}@ZH zp4Q& zA}WL3)x$ZroAbvf8+mJkXb6A2isA#7_wT|Ro9c>H;*ww{(a9a3#vd+L_I}*%x6UwT zu{XfYtvimaFBR3@>Tsn_JPZ*$nYVcJC?qaAqdNs%{AiL7eKcs6sw19Xx^Y}^k1)zM z&6UUKsk-+boN(k(fw|SVFnUf?1rety@HzSr1WSHBcR|tP&cadX`lH zQQ>VbcjNla6ACa>^_nBKB+f)_Rj98G;T`4aR5s+3aCHcJ^lpUUi^;es5Oz?{+fgI(9u=S)Hnpt zW;5@>9~+8V196AiCN{}$=^)|vhXwCSMr z=?1JTs6(T%?S)R*d_nXF%2{I69uY2UtS7kCmqOInGImS%G>AzT8&cW3EWIfo+Jd@Uk&T zYd*?hO*`HB>k<>{IeszDSfg!+!;sg4w`BZ|ERPlC#SZSwkMb64z~C(cj}aQq}Lv! zzbP-q*Qydy4sDxQVR6*FUuT0ovS$@oCsu|SY|vf67KmtKLVkh7WM?hR(oN|+QfgS3 zMlAl98lSRC&!&xhL+}BqQ+S5?DOLbZWCdnv{ApJA_=wZ@t*R4pOB^xw#LBgmz2pUn z6|5j*$`a$>{^Gi=mxyUIA9wtZNtALfcvxmpXrfy1V)(#x1o_JJ6*?62SM``Oar}it z%Ng{U8Al%f)!c4W9#$7gIfjjb+=vR>j>?8|vmRpTOO6lNmtD4kPu-vM5E-r?>U zE;TuHF`EJH#$4~=i3vQEV&tgPxq(bXs(JA2@cj_j&-US}2A*-I_*X5j0*rTJI^!Nz zYXf4wI*mJJdKL<=Z_W1)sf+l!`K-bh*D8|zW!Id)Zuy(H^-bSlIMLQu9g*fXb!4qW zN@wP_bmR{?)tLmmv1>C0J6y?)|yk;IGn=_v+B_@p**m9tEQ~n9RIil z%d*Idvq?BkG^(d`nymX^5-*0?hu}j@J%QIaSQ**B%D0SCX#$dCOg+XEJqIV)bW8SN ztmdM#qu9SWSv@fWG}p80s?ZP5a&Ee2(exUxOolrXolr)LkNfZAGh~xh5e}3|{mhg- z0jH+gQ@5n;^IE($6Irr@X3XCdMyR!jVHee@-ZW278$6UWCM?Kl?u4za9*v0;LZ0(85_Z@40j4s#S3Fj^28$}wPcQNHl)PwhSj>HcUiIV+b)(cr-@HKtBa}vv2P~M?dUR#y6v^`rzuL zd2vjG3M`ML;71yby)ROo_fG9gdsU`9>qdv|ICZw0Pq7kfn9|5mXvX(u$qH94OBi9h zAZ@nJ1GGlKyw=Y!sj@dzTG}-JAJ7d1`Tkdr>`m1)qZhkZBgPb}?8e=Ft{ ztkeevyLNYK(ftrIK-P$ZBvKBx@~f{=cy+f$#`z3x$yYZHUFPVjQ|Fnyj%6am(rJy1FZF0Bz>fUP>Eu%J1rW` z)kh~Hdr`*;OwpMr`4x+_0nTqmmd13N+{UyGc_%l+#$UQQEpS7;K8b~mft z!oa$%6D1^dpdSn+dO-Gph!iFgLb;FN#c@+8l&0+?JyR@%OiD;$)if5%2==Vqw%m-F zcn7B8DE=OYjTIQj_KM%*CJbL}&#^i)`D0`F%E1--kjS3U9ngU!r>}LoE56jN3hrnC zFG<|>lcaiWG)CSg3I*z;+lh4R@6OBvS!z%bGtVY-l16yWp&qnMx;IKUNKj37DoZ zm6@F&RcyP`(CX0%EeLyIxR;2`|MF0#^G!7HUIaJslsew?`W=0qABWeAd z#T$bXoU)}z;a0*}EqcbWk*&VGEOcemlUauf-;#>s!jk~7>dEZi;pBS9nd%*00CC}6 zB;>)q+fOP|E2aJ}h!2gjx!JLvj$#F+@c>IhMnHqB6KSA?2+8W%obiRQBt50NOwP0% zUSsm`m9%%3=Fn0eYL0&v@pJFmlrFA#3&#HnAlZJ*$T~^n0|tWTX-qV>W5yB?d#m>8AX-7RIDa*pM`1UUWliD-&FuT5V!^#A zT+*e)x~`l#I1}T~v{rmkZ@u*fptSKtjqjlsG#EZPyWP7i_iS24rh+n}iedq3PYv>M zer`5;joe$(3Krgt;dffN86{hHb$mgHb#b6&)nGsSUJZH(+% z&p*qdXq;Ptt(M^r>}ygxW~ZTRW)Y`~wFaSX?f9H%I3Tt8aPpfe^U)_(udio3&1^0_Kx( zaL_mY!deBBg{a*H7y3u0q5R}E(?yw;Ix{ng`rd4qi6E)x@&_=kOpY>}XQh#{*%icW z+!`W&G>^$9^BO^}P+IZAU`K9#w+4;Ltm~qjI*4Aa#0hVozM_{nNHmEvq&SGZVOBH# zaGXL^!`k`l+4=(8TxlMV#mWWLF_K#W+#hI0Je6F=Q%YOAZkh0_`MC%KR<*6A9tk?; z*p6HVhcoG-D6;HxmTs?QIthF|%7(CqnQe5|-b^&gKp=HcuaQk|q-_zU}s&Vp$7)J%;@H1$yHA4f(yZDxP zu8^|&LKTJJ`hKXSgB#z=Wm@#C>wPE(D;(PHU`4PVU-gATKVDf8o%w77=kZu0(s@RH z7^g}J({|3=qPToq-29c(r#{n;kW*N_zm4$cm$ODSWf(Pz3iX)!Uy~|`v{@Kg($=Uf z8}6?9e^>R|JT?zZUq$2WeWPSEHu3-!K+Cct6Y6v2n`WM?L?Jb|qaEJU7e1Q6(l#hy zfj_4A?vE)ybcL0W72*}qO3JRBiHqU~MSokR8>}f+%yX%wcFj3GrfAz@^y>}N19IW# z=SDdHDRN~st0yM$# z(~gh`fEYP4!$w-StOt*2fUj!>L#wV}b>*SZfX}jvvNs zPvNO7!CQ@uUDqLN_ocJnd8ff08cxYo8206<$mmtDY}8fm zaDp3MTi4sOq^xy#`m}v3j3r50U=lvU)DfS3cLy}lBJ-d0hMxTDQJ1LIQ!5`DjXKM7 zXP)kIA$G4IuH@KxMJOjj}iX=c^z+rgf^Ph^{Le1}YC%a&T&yR`CDu%{iAS z8>yK(Jd6cl_z^NX?a;NBE5ASOV0mz5Ocpx-V210MAKMl8LCct;TF6 zt%!11rHu^P5YvZIQ?Kl73HQy&n%g{WyPMnQG;`xDyutbIQ0 zeI1|;0>TW&^D`P482Mz&*#A$`y}(I**Z0DotrHz!_%RH_Ff79|3$ri_yD*o%%yLO~ z2_&14gw37YnY~G(Nrjm4RWz9iJeYDsfEoy6_o>ZboOZ2ItwhEp` zNj+B7)}p?w&-=%7Uaw;{klmU8|9AO*Ki|(~>V&_NnUjmdJGf$r-%Q99a^{zaT<2C0 zD)bFrR`C@FraHf$B;okPoRlh|bpol$z_C%4wCye)+nvf6N?hnlMj|G3}J9A3%iFU;ow<46iVigei-eG zYLKectQXW9J~%%)*xGuLhXtDLwgqW->^KJyyNR%HYUb9W=EAxk7~cv|#ujSSba&Mw zhp#iX(BktEkn?F)Z|P1#3Ud%?tjlwcBqrPTP$l92xG)6U4Thb?#Q5?H^GZe@Hkpok z=5VSuIr&OexJE6!KdUO3xc+pG=}t?3f1{i~zCsdHr^026OOU6STRYJAvZh?{6AS1rMJ>ZY2pz)xB>g)58 zNauTU`_WC>V`8UJfN?G!2#wV|hXcJ!SiT_RALA44PL0yl4uO6I^chMkK2grPc2z(; zMpjOGULyxH*Tw!0gbz^_Wb24kyy6jt`!TN1VL}Xs4|ZNBnZseAKGw1h=sl|LEG~E% zv8i;$@9qrW;((goq9cc{xZw5E1KNpZW9!9||3oV=s|o)yKiS*2?`?)85PU;f?H}9s z_ThHI@tWCk+xv3z!tIDxP6L5pjM0S%6c?Qu5pw&&4g@bBoM}at}0e;}X`X47I zUp~5##DISxWI-`ve=-_bVgIWPG(bXAS;X}3KY%;3c1{^QWdfo67EwNLBlryL8)Ib+ zx!pdbSil+1WHlNFQIVoVhk5hHSsI!Hv_T(WrEzV1OZTq=pt1j^nP2 zp{}zGD#s-`I7iUwpNT@ri}N)w?od#La~6O0`2=T7CyS#=*Q`>DEtKG7fE7-HVaUY3 zw{#t6Xhx)dR%CcH8YjJTK5lKavT333Pr(fM7F8zsha)nw%4w)8b@28n;CMjpHrFmh z!lAC?oPQv}%x%rY!w*(m2Te3K!2eg5nZS|Y4C3lbFZq|zNRcpg(pZ?yAjw2x+g%F^ z#^mskNum@H%L7CEx}(tGczXdsLenH=aE_j15+v@6Uv|nY5(N*8rdPs8+P9NG%y@G| z_yQ+?|8H<=lmLLR3~ln%>>bh596!@-dWq0$Dgud`s68!4h1ag!Jw|pC$d}>uO@jB_ zyDZ7fU1D;W*>m)?`09KzIG6JcOJcE;5IE+0c+LjIK{97wmwA>MtdvFIP}qco-Z(kD z^&gXNia%S1&o!W6$hhL|YC_un&ZXJI9c3d$WLeF|L`W`0#wR~a40IkYRAG_s1)Qr< z#}%B;tpGn_PQX^6uGViU6_gb!Q$7+UjK1?JB$i(C8#5ob0NyHqavS0++_B*G8h1tTVr5Gi<)*#=@PejPbH0m zG<5Q1c7);t{|-kZe>Ba6MyU$kw6n19BaVvG{@WGoHMKcYLxZ-(;k?^ac0>^t z?z`ImDy?0sLfYSn|XLv8oOuJEFMe~!4 zwce<)Qkx7bDt^+}S0QJE&LlKS5Jh6p>@3Vtp3`st{}$(!+^ER};1Jq3pm9+~8@*k# zH%VmlT zN4Qo9J-8kUc*GrlvU-*O;nA zbIe`c9_thH@ah#@TwB7jRM;m<1f9e^3t1KOh@hhhGvNeG8XZ>98zVK(aYhW2E~s4f zB$o{DxSx}9gEB{pJNzTu6hJmh9cZ?H!%`xG`I}`vmG&gGb#$K1=t9Juy>71I4^b`X zu*U`f7D}Ks0C{nkZqSG^ysDHWKpf2$VnoxpTKK<}qJcU{p*sD_#hfDE1SAZtB>kHn z*_)W08QXUZRVm_JWLYnq1)1uq$c?-NwmqXY)f`@$_LUMK<+Mnw&=N-oy)|&HUdEGLd+$|;p zFjWjH+%ScPh8Sox-TB@UhAqAo|M!=x&XzZ|^8?2l0F|f({mA9*xOZNE)ebAm642JJ@x}{hH<~#N>0HgOcT*Po3&Z6YG2#1bUcyI0JRNS1YvEV3 zOJFD6ut5qBP1`HXnU`@JD_T!b-Aem;vcf}vt0ABjfhm zJ^J2KDT<>|2qzk5-Y`Qj%4jvwFNpFUaToQi`zih4WA*wFfutB=qFjbgVZpMpd4lC^ z5A}z?T~&$<^cZYx>R?)gSw$ZKB(MzguC3GSGRBqG#x+$jM$`S*oZcvNfvMq;^MeN5 z0UAn+9I2SESmDNoM!oHoI$Y80*muFi1oMu@6WthFHR=eFMK|5jUY5C@qaM2N`Y+pK zz1*B8{$QCoWMth^T5=NsuWC!|7NtI!4aY`s=uq3OCBfJX9kGUIjd4;FzmiH>?BSUL zH(eH1aK-TEdQLA!hqUj(eNFaKVNWB6YNDD9&E=OaqR4tNH)j!5ms^HLQhzLR07Du%i*zjq0PvYEe+nV%Da)Wh{FvkwbX(B$e?3=<5v$^+3-oU($$ z$Nv$crXkb|n;wQE3uTJSI-AH3dqkiGQ0-s@UdN)15E=bMI0B_{9>&1+FRy4j)uTsH z2SxtNr54IL@G8c0Sh4Q%7|C24x@JdlN&zINp%G@av-ODqen0Ch2y@Xv4TRn$$;sL? z8GYVIyZpyX-BNeTUW|SkBsUcPq3oZ&KgU~Ox;EbVlSFUZYgLC(5((BClDw4l>dcFr z7BgNgzrva2R<9W#;W6=D4C-bX32-$9pML&u#%(+?vF|okL?cHNc)|>1vujFZGNyj{ zW6OIO6LM4YG+?Bj;zlo=!I6vB9!CwYg%=lh7K+dp=8rfY`xuJ4{3wS)#lDU%T(jCL-L+OVaj9vjf%-zbIFCPebXIGTiQQs~I z*cz?3Koefywk`$o2huE;n&Evbu={*nH~tX7(5R)R1Cbl%MSZW7=e zD5^<4zPf-FixS*?`WP!tF$+~I<;?P!GuR*gxGZ=kwn1pmh8q(D+03k+yd`iU&|r+$ zo#z;>UM_+$Ym5x)LZc4&q+ zojcg+Ijm!1wox8!@nb94e_mLeQ`uw2@J#p4=wTb-QMGE3X&zq{2Om7>vOSTYZ zM8RlOO(`T{GPYfNS4)*tt9bCgnq5R>QzAexk1^vBc&42T6AQ`dQO25hX`Xs)dDR7Jl z5ENzdi*n%&;pvOs*mq+RB=&}GlSBQ;r0}8Y$;%V17wt*4bQnpSq4aqp6|)Dmtji77 zcarUJjc2R*E4I49b!$=5{V*I^RZRqFm$k8mj`R0AF56QE@cR62s|KW#C9krjIdU{j z<YAeEDJX=H1bY0 zBKIhDs9?wbN#;TFJ&@x=_won>l~%^FH9*ZO=A(;#qLja(Yvz>P1UQLXhG6m&P0BTB zF7atUT3r8B+rKCJ84PFm9cfXnS{%Zn_>c-~ohSb~r%a+Ox!yIUmrt`U(A!LB=dTI3 z%_>C7DcWMFt_~kx#m>Ch>foC4-+8+d_s{J-tBV5fgAH zE39J+^An>(-7@|+l(TA~zq8b1(gv9zGQr1Y@0jyneZsJ|#w#J|AsnbxEN@*7<~paV z6U4t>@%e!qF`&`8KpFFqCgo`&d~Ut{$ynsF!}Q6`?63M*0GKs&yG$SL4a>VL{8$H- zO4|AISEuKBG9fd<6?{Xg=ahY8n>yswL6bJ-IN&8S~tust`6vj`#1(Asj!qBRb%= zX5LyhdBE^B`sVW2ol|v_D}+ZPz>vx_bZ9%QgWSEcScd^>xZ_(zZAJ}`#Ee04bA|%A z81%OK8P~v#^E5uM>@8c}QZj5iC*&$3|CVhGX^VnC4^Rox5Z$4s=YkxbCtr-lop^D; zTREE^0>n8M@^vIxN5E5S!jkn8bN1~V=2vY%>H0J_fY-**##OhJqd-ZcO&EaQ+Oofp z6q@04xciK#3uX@1&M;Y`A8)2x} z`H5kOCy7X;W4Wr~ri0<-48YirLA*3K9biiA$~97nGACe-DO#<6)*drlWBl-BOr5-B zt9aQw>IlD-QYM1LCOOjL(qQA-$OEnKMt$>&d1VXL@i=}=I)#vxJNCKa zuo0r&a8E(@e_Ho5&@_XQbE_j`wGqg{}9< zv3EO-k5nr}NsuxT>k~r^jrcFKV#Igkz8Bp-Cc}4@pbsc8sxyJ3)xk`wqAVdu8*YIgQhD96>?xahk|3 zzS7Uv#Uld%)MC67&XzJ}70!=?8LV#iA(moj)*>q^x@^N6%c@~vqW^!?@vmN+Jn7)4J5QjoS)y&y~QO{R!YtEy1yy(XpV z6GS)(x>%AnO=^T|3NQfU!L^LF!_T|4A12Lcd;phefkq>zx#RNGaHtJ-e#dEr&ozGT zbOss}zhae6Fd^7}C6B{uW)i_oMu5DC1cR45*hXm_<`a%hA?TvH|2c zQX3}Etta2d?TWz?OrbVNE^Yfl27ljxty$dY2O(z|p|hOE^cKUW7~~sM4S%#~r)Jgd zihqxy;J-~Z0dihJt@?^09=?JEW?tL}-;m8!VNt!cn{DG@XlU;8ht^bdbeLZH3YW>n z`QczQxd~2zg)5*#FiS;6+vFpO+SH#?puKrO*e{j+`b91;r+K6KE zV}nW5-cyTn##rWa-fB$xF$?)&jO5@76Q1nYpDE&xYk5_RA6f@QOj=@pxtXc#c=!U8 zQmfR2w#){1)Uw}Q>8}2h4mMZeJF?HxWoJ!Y5u{_u7v@A0kN&|JQztN0fS2(+=+xG{ zFN^i#_?cz^L!L&$Nw_$BL)0*&CG&g=moOy*$@szQz_VyKUo{6ZcVQMMbWpw)Hy%cdK zgLU6)@kT;=7Vj`CBz%o&KgY?km1D1|{N;JgpLICNx9{#u>vKt>tFgg?IRtB_M)-%6 z`q^P-R(1Xg!zDllx)NeXJ;s^tu={7enHl1RR0Tl5m_@01XM>Dij`hF_091a7vZ@X- zBXtRHx?=ws;bHX<7N^l49QPfgA_pA&p4PaD5<#Ju$?k(ObNOpmB;}^;E~X=IAnY2# zHYJcU4B;U#z?L|tF16Vhomw`#w@A$PB!8AFyX7SvI?`i;8D<^4A89=1bk##;F)B?_ zW1{}_KmV!F&Pnq6*)U#BI0|sdd-R}MfW7-Lj435qZ}sO#(Ho=Ag=0r`qc#9qtJ8)- zAy$lscW+Fa!iYqimt$>8ksLl*^kzmE$sFMpGdjTJ|Dy{kI~i9eC*bNbVLs1tK62X-g9fx z%w5M(cikJ4SA-viqSi5rvoI=MPzN@NE{e1<_L59m+79P5N#1?f!mu-<5`}tn`Eyp> zze1mc1uVU&Kwqe^9SWPTO8I#12CZFqvD=5=xzyd7S(P#K$BEv_F}NSO2SK@s$N{0M z*Y#TmH-%UCT<563`!Hh!T9{gck+I`<7pc^Y?7JS2v@RPF5dFYzZwI@L7CrrI!Lq!y>Ili$&_YK0u z-*2`p0rh0}+@&LlDOwVRS}kXAifEiaupF@h2T5r^y#)_A`}gy6xC*G|*)^jX^>=GJ zf4rHYBe4?KE=W4i4zEZw_B9GoaU1hoHm!~G>U5OhC|*9hIecqP%rxp30R^-8oooqL zg#N|Gk@w*Ci40O@g4cW~W#ZpI@^j)ovWjrWI(KFxFQW_U7U6~F)`)-E`+n};uJAYQ zMMMYcxz^zGnru@fkK9*IqB)J45jyh2?0K}xrjss2ZZLb(;^yhU#%-UWku@oHf%}@_ zvXM~VkU?gId}U^37%mJnov#?BF1l#KwQOnFTXtXnwl@(|?lgZ;>KF|RIPUPzQ@qky z1pn=DOd3VnjTXBiGR8w|D;L?M+VphVdZ$_ACK3(K2dP$GxforezrBLpXm8tBW6ytC zM|eY}fc1^eJrQo2_w>#jI#gt@)}q(EV5g~xnHAwDG+3zVcyS6H23#>}O0UtAgq@h5 zR63Y3LIA2o*_xj8lzhZeg)%zo=*{+|ob@H^gZthVJq-LRwH?Z`Xwq8t|5=%Zdsd6IH{e zp{mWoe@;zh-v3}DjUqNEsGW3ZWJgZJPA(Q+=?ZxfREFW<(3T!fvv39k4T8=5nGF?= zA>at($*F;n$BIg49Ahi*VGhy!u7}2-$%KEJQ@};CW(IgyN|(XVl#UktO53g#{y09p zwW>Rh?qS_qwNm@fga>Lpuvdaj6n!vF_^%}nB=cZhLO9hC7H%DmYFJ^4&@R2cN{9h* z&;Cp}k%1kmJTM#Pni4m{j&%~B%kCBLT@TTB*&fR2aK(HTqn-7_qG${Dww@Gzg-H%O zuxi_T@|gui16?Xd7F*w1>CK*y&k(sD-yVXd>H9svxj& z?0e^ksv&GP*3O?=9Cj_qMPF$(*Mh5|U0zoUQN66pm}t~#9$nqb1ivZK9C}8G4u)ZE zF~_pot4{GKw4^T`zviMRJAggw(0msk_f8A83OhjLz_{k)HvREL%Ji-CGbs$sEGuV? z|JoiR7wx8-8F5}5X6G);Ooe0@njX*W(QU_)I?mHn8UtZP7aV|G6*f;q;*}zA8E*}0 zj^n4U==}_C6jiNA^k7k1!;_c3wk$|$8}CP<{p_p~R1htRYxe##g>kYgCw{o2ozBOo z$s=!td(tICbT%m1E8?e>-w|BBQNW@SLu*cw#naUXsyRD`UOeu?uI6Xn7n4BtE=l=$ z&clLo5shOiyklE(Qk?pHy*??dd)%xAz>wG$_8?@(^bZ*elM*Hd#-(~<>I%gQYiD_< zdzW0t@h;i{A^D=RRoS_?%c;v_@+S@y8W~LD*sM#JSqZ>1Z4{@F{Ob`HOEDVJQrHiL zm*xca`^uDKTYC(O3D*cIr!|S00gm+)j>cKA1>+*Oxg!rYzKwzs+W_yXsdiV35Hu>X ztjD`njRClwedvs|FB0q`F?FyCfYhruXS-9MuBObp%#b&a=)#Wxqf6GpmRK?l zgumU+D19LGFNr+)hQOcQSqu%!jQhj=qe;7S)!Lb7-HmUIL0>ECC1->7%4oBze{RL^ zxHB&cBaHNF0-O)K%HhX1M7O^idch^r0NOI=1@wIF{&-k?&aOJyT>t;Na zD66I$qP`;pf*OrpXZk|0+_u8T&7nUr3JmjCMIN1c7lsg4c4ZhgII17KF6khB%@t`J z4XM#9bM7>U)8$-*6*ZRS0T!(H18pn2vWwR6vh$55D4kr(r4H)Sk+C;UfNMa8b0 zn?5JHi-q58PYiXR1+hUg>ETl0RWav%MaOW9e%J`+OhpAAM>hG7VgFIu()NU#?W#R5=>+vAr@LSn^!@5kI33*FlkBKheNip5>>WgGXg}MXmZ3GU?^qI8plsQ8l?9gSE7!E?$igU-`7^8N50uj9 zUh#2e_8oe_AtfTbmiFgl9yaO3uU2jXb^&?0wz%Y+l(Bi#oT!+F2W-M+gj zvp4>w=daG*GhZVz-QQjvwc(=wcD>%7y1s&A!E`WETlzXhb-53Q!n&K&WH^oR)0HVm z>(1ye zh|X7~3@W<9b&VMPGfTr$>uGEWa> zPmP7l_ONMtWdPU8l-hzC+8VQOZktmgsW!oMt%Z9s;nc?1U`79UwhTB5M^5FYiHKoO zYnSU3Dr9hzEKNmT#rx~>jPb+JME>Fs@U3CK_tNHwkMHj)D2DV+L*ch0MP)Ms1>MD= zY>p8C*;aU8hdQ|y(aTIB$#dZLxiNO(m2AQ=B1cWFB@NHk;|RV!s#XTbg3oj@fTYN6 z&Yx{6Zn(9Dk6cRVIj}qy+e4kJ$~dlUI?yc#@&`8L&~QMwzzKT+8>nXNps+~IFQG7@ z7UQF2jYPC?roPqHNzlsStG2{}EJ_T(k9z`IXvbsQ=uPaiq_<;Ijo(6A&I6 zJ^ggJtS5V7E^ibr(t^^7pxVX&u8E zW>}~XlcoO7x-0ON zqeXFL4E#(f=3ikY?F=cPh@Q5LLud}l0TI(~F)A9HLh~|7p`B+VLiO!DZTD-7tQE-B zMU?K4IE<24esX~Ff$m-D2Aja}k*eGqcg7+Nc!&N{ z_0oZ!l+ki{ODQtyre^*;JXZ=cH&<9zz;U8ed2hHoo3mvhb?wJ$qE`%NpWcx+$peNh zP7)4(;99fhR(M@!+Dv5P#X?z~OGFh7C$k5J!^B!Qx01}#XhS1&Pg~?JER>2v>_OE*wuUZuizK>MO z=-0SM(X=uA^U^T5rs658@5l&1nh#zr7U}feIFJ&6n&J7i(Wd;s0*TkC>r+B^*+e6W znH*`vGn1^6<{bJ-|zFfclJ00zdirlY3-;) zJ$GkgoGREd;$pWFhD})$NQreM=j%<#D@mk9Hn3d#;I7%oy6eD~N%}x3` zhtgD3{o$69NXelpW(A!2e7~O6#$q>SGN@XR5%AHf^km)eeT&-mgqN>p-s1FWKou8D z^ddH?l$cFj;t*pHcW1E=7=#HXwO>K=$Cf7sPoCvkPJJ4EI;O*w8>bG%TXWT2W?nFG zlUgk5@U80#PJZC$K<74x7Zwjo9B}%ndSYBkW?z`wryza@k_d;D@c07d>5&A~6}Lm8 zkXgB+z`$|y24h+ZAx1nLT{wsJXA|@MZYCtgK)(jY;rN>h_$rY#KuJfBOv_Sc4WhO9H<+LqC#^3?zzm z2=lLIho!=?j6Q1ak?@md%3wYWY%-nb>+d`cB+*4fSZ#`N2IcdCYy6sM2g6La5ts>W zIJgtXFXjUp^(;+D%x9I;oM;Ul2SB!+IJJy}>pD^JN@vP@} zZjBef8*zzI9Q0;`6SHWR6$DDk)_UJNwK@)QFL6Z|^(is5M&Z~}QC_X^60o%u9=|uu z-=Hu22Rf@jFzY`K1pg@o<2KJJV1$tgYS+uz6ICy4*LBfg)DwXzi(j71k5-+JdfI1i zOYyZ1r-#(-;V;{xMT5{Z6rgE(+We_XnRyZF6D281ejeLHi4?(Qw5Z6mhjohQC zie=dY9f=8+133zNlQqvJA|DO!O~uodRdroK+<)2t%Lgylqu+4UVtt)b^#(<519?&KgR_wii(lG+@9GgEl}C(l!G2( zIbXQ5EwYOpYq)-k@rW9}6pPb8LLz zCfjp=K5}J5Au5#rq3F#0s(SBoty8P8P#TM==p@hGk(eQ(!;X&afZbOEA{C0DWv*P zyg6)N-gYYdZNKOB%Y}*RzFz?I#TRD6!y8JIFeywzRG9Pq8B1T()Kl$YY-Q}V-X z#sZue?0RYoRGB#(<{1J9?@O|5og49mlZ-WqW+i`WwmEU_@CbCt4N-IpOu$o9jc2~}Pvka*nG`PikYR{~) z0A5-hK0VhI`@p>^l##3<%5->q13eWCk0SuG9`04RZFy{>_l$(I-Qn@RoLMX-NcKmF z|8q^3CN!~}6v(|U42p7ef-f5`LsFvoNu+=bXF@jZ?!Rk$_{^$AZ{CRi;R$8hOPgF* z$p87%*E72U;9=50XNJ535TJyZB~qQpk(#Yf&#D-$xC^88?m*{KuVBSu%ViaQE{hj9 z$*jmEfRPebz_GzdR4Lb<`*JvOPes8`=}&Oe=o8Q!lY;(y7T*;BDdY|gL~YpCTkhjb z#!{uym1i_mBivYyowx$e6ivdS{GfO(r{^TdysU|W6T5utoexTF zaset#!M+3Gr*-eNGIFF+pxaV~_MyeaQ>8gfQqjVk3&sA#bnAaX88g?$c;;8V)hk~U z2p<}ab-^-aM|1!Qe>%rB2R()$XFR{BBV(It;qFEG=zHNfuQ@YkqwhiXD@uMQbz4t| z%hp>wR81yOiCf8sWSkWs2RbNPyY3iBjxAu?RqNIOaLZA_9$Xe?*GqU@Xc_ix{!nKc z!D}cyzeQs<07GzET47Vm*=tU+sFMCNaLv(*_K;k}KCfeTWrWswKKI4Wxw<;T1g+L; z&&1&Lw|J#4sBB`yD*pabyanM!6abXImT*HX?cHNyuq`h+bEApAnO=v?Z_*==M~T#% zd-AEig5fniwglq23}*7D{m6z-4U~ZU{K$E;w2#i!Wzp=6 zd^zco*$v>!U%b@E{3;Z*J`@$*1Q$|Aov!rvAQ*V#T&wNEp(J7vfmo^6JS8;>N?(bpr~ zK3=BJM5ST2ATMuyB_<8Gkg!k{!)>b)Q&eMrFGS!V^`HZ|w1IU83Xh^tSG$p=KKp?izMVIJW!3 zkvoO68jsekkef28*d83Z$4?lTU7)6c#7V)NEm7QUXMZ_@m58E8@~7%$3KI>f5<5=2 z@mci$%`kgK=kLd9?eJ|0qWz+o!~{bi>aNZr#xo{T@6Zf(G|L96#c9qJxKAt<$##4kLOLL3s9b*5_r_m9#PYdeUATk8!zypi?M9pZ3D$@}-b zS!2F@S|_u-AxKpbt(cEnGgXR|tPkE?astANRmw57m6KO3x=S7T4=nAOF=|z&S=1Z2 zOH<9sn5a7*26B`M$mgNAo^*~R7As!ExtrsVySVAd*bY)=3=Xs0{!1V&#y(an$E^E0 z@JvjxXa=#3GV%{FQ?5z@WZ6>sxo5TtXx+IWf(IvWPY(9mv>C0YKW=P~aT-2BsF%>43MT+00 zBDYi=F#^%@qOPx0i8NP*4riGI^?kGDPYn~gL^L=`KLutCOb>>;uO3O2RbiY0$R@QC zzH{rtQRtDlDyj{j3KK*5LBBFQMZ<(w~H6x-!uz8jx3y3*rbAKJN0|09%R)u^$;CAh>fCDP^T%Z?XFdx z4!^sytzvFy7|}m+O^VCvHPz@rO1=jS(stJ-+s7VaIibN!-<<*ooA2u!#+Q_0Va6{B zMD+(d+N)g^CdzEw5O|z1nr2g#`poEE4~BoV1~k;H#v}^m&z9kIbS9x=%uoEIe&;aq zMwaAHJb^AU`kqw#+b&ebS<@Jf$JnLtiv?lL?e5GU796jporac%%!lV?u!LPjM=v)i znmLSb2}({yapD)p)4VC0`NNeA5;fM=N0vr?@P|ra^R;33?3{5vHcaQ7_Ue+P)%V;z zUe_yt&l|Og{uijX7kl9JnOFC7-_jWC#q!9iO{P<`Z za|FHV4T)CwSq00EuAJk(;YeAw#`)HjZ@Ul<&QCK6jM-TfT z^N8*b*R1lC3lBtE>~uJLSIK3MaVgn4e0YpL&VHSO>(On@+M~53=^zHt@ng6z zj?Ku~a*ut1@XCe_$)|hRgr4A>d~jQ&CDP1~-PwcB;i3~Sz&xq_{Odu}E;l9~?0ATs z6{-T??#)yTaTgV2XnIi@J9=C*8C->;f3DunWY(?%+&NZ-pl<9;k#`t zL#GWVb=@$~MD zPD~B*#G(rSSwElOSqsyYaG3xxJhH^c{Xd;4L+G&QDu>RS?~Cy0H-~Xp^Sc+3`^ptx zeezv1WB%TW8?cn!M2=n}Tr?B?3XctS9D{}EcC{?F9Fc*S>MGFD!tPN= zF?4V~hvS<@BW1uPkIj!YJiv>Qa=X--b_fn;Ke8Z=!NXtYcO!tav|#}5u)plpFC6!E zKD*o!s+L;UQ-f&c2v&2nUxh)3tzp3ng*X}qc7J|_8@RA6WUjRv_pdHVML`2(7}8F7 zW7Y*$S1E(F_m1MGIXln8g+~i02@(cfLOo<$NP3w2rc_fWhLM$-@fgBXh3*hL;B2-R zqN4+2((v6Ie5So6#g)gr?zI)tXRX%z+|3y6bnR=I=Gsaq@h1DC z882X1wswU-$)#kApzWl%z=qVSf~Fo7VlupXae{Avc`_UN@KdR{z@)PeXQKaIGyJ#F z@bZu;6Lm;_*V@pmg#UMS%1<}q@(6ZJ7YyM^1cyT3y>N=YzNVLf5dp9uoCW_Dx+8n@ z&WC!SZm3qq|9aJqV|SpnjJL8xCDqpMu&H9F)-1?@58h;6!DStvTkD<7f6VAA zQ76WihE2B2?V=jq{zRgm{Q}68?Iw_ED*PIG0@HUnbS?J1A6gN9y~#}B{Q9WGZcLv0 zP)e4f7O5Ovo?zRi$>EcCr0F&W^1C)cnt?f{elyQ{f?+{9*1Mbd{PfjF-kGT7_sq+9 zGY*+YkrrxR{HT{4&E|C#%((O}yn$al8;45ufqlP@e6wAR?BNyRUpMD)S{e3)N4p{t zo)!tLTy2Iuw_5S1>iGX65SA5SB%CZKvLEhXt2mzh!-Z)!*ofI1;GG*e3Nk5hBTxl$ zjOZsTU>Vgna%Ym2+BcR(jo@3kh=nLWLm#k|zW*hylRlWtA-8`~Gg)dR>pTt1>t zv&-vF$kFRVDq}utUKq*BG20aC056%!?(GX3Xj{VB+sZa7zbWQ~ET;Afy^kHOC)y8f zp%{&wBZDI+`{Bi*Jut<_G!J7Fxe3HFD|Tl9t3_$>L-Ue~8V=aoT)liHQJB1vfyvI} zUAqe0xskf3!nfSyIl}<*$ieXb1qHpCTHL67x3KQ*DMYU9=ps2&)zI0K zR#BL0#u@tg8=4r3S{^H(=yhD0bR|-;C$gu9!W)Le#ohKHtLGKrzJUEQI0yj@+c)b0 zV_-nGdb`cFo6C6B0=m#lf&{<*mPD-+-)KC0679e?{P^Wb^WpVTRQI22N~&_QG?S9N zfvFo7nd-zELAeoN=?}+uR>5HA-~=wJy@B=vZ{i4zBE23wp>cEPq;2?M^uMCSzkaA!_7( zsD*(mMt{2_&>mt+Z~G3M9Jb_fbsiWlI5(M&42Ho6FT0R7*{)^pswJIUh3;@DDo{=@ z$#`^b+#eRvtTg0O&U}#DmPRG$*#>H6J$yY{ZGLZc0jjC+@5`UrMF7TVDtxF5Eg|Mo zKXXeAnLYygQTKR7u(|!243-*ZNrP+O)X75F%x7Sn6sR~MYlz`Qt^G`oYnmBU_Nq9j z1~C1oBXkx0*L`zhWB$s@M5FUK9szLlD@9F6Q?PLOopGP~zK#$gp!q7i3}vw2B|t z&c4X*+YAI8&tABygdd^kMM)1AHs=p^S6DwXqRo1KyH)i5==T{vSp>7J?7@sm3 zzME>l@aEFABOlGpEohA4Cmt&Cwp7dUN#-5Yj1 zoFOnYR4!!&OGggnW9w9DYx+{Atl`W+yapMpL<)4@zIV5cd0M3`*07Rc82dO9VzzFg z9Rj*&GAHuYzBra~k9)dH!ojP<&vsYFwK?uECEXqr1wHbywLIu3r<0m}GAK)9oA&oa7CJA(J*1 zwcsHwD3fH(PYk!A5d$0%4KOVS^piNONGmd$T4E;qP+w^k{q1Mo#Jd*J#$YM@a&yc( zKOD0TaD+_}#>0yFOi?&z@E_Gi$y12S0>!Bi{S?;iC`LCWO!8K~+Ev6R_2sS8R|g0c z%HbfwSy949^Z6?Sii{gImA<3KgIUj!3`fQ7ft zPa!?LSV#-@?Q8p)AqN<6fuFNrA?r8@aeqNbA$WMmkz2uk6YMC5NZYWN3eCmHCNq2R zaknhN(`5VbPWC-h;p;1-0&ZYHVK!`Z?F{huqSBu`7e+#vFcQZ#JajAdh6}H^Z7gKx zCpBI-%t}Xzd4BhJ0sl?Kz~ki3b1cX^55^1dP35#bfR$U!S4*J#I1GMip-bu`3smV7 z;jRs#dQ&+%tegEASYq?`2pEug0|!%hgu*6{y`ZU&mvVXq%6+2^Ss=v$s%se*6YVGF zVk-7Cuk2JyOopp!D18Gar_^3e@KWzo*Kh&KOo!2oM78b_ zJAqqBH2z9GGp#kF+_^sduRFrczi&YP;&BvRq=SL5*i3~DV>qtLvqu>W;sm*Y8rL6< zb;OS^cWHj03l1>+`)%(i!_M$#I86?aV29o<7?>m1Se%e1rB-Pih80ivpZ5CbcPz>7 zp4(azANj8998QO~xq!rO#iVgL*yNt1BbL>2q8Sc>j*jRgExz9Ela6>VJqkvEI2ayD z)ihJ2$n3irZ8Ll7QL!dK&B^fnRZ%vpw|djY{NXz@lLo1^FzafgPSwNiMSkNuZbj9C zdcwxTUtc$K%Ea1%9DY#<*Mv)BqG~#}`0HL@Bss&iZw=~jdT0kA#q`JK7}-NNr{V@a zI44I6Ahzt}Lu4#=uKVZjpZ3lEa&4TJG;S#i;H89vmo~x+Pb9=TlmUQ}Cyexwg>Gjq zi<-`pQa>ru7xN*SWTBQ#`<9bzw;7u`I{60Q2W%qk&;Du-DwVbFd%P`^A)_>#`SE@m z{701}{NRwhpJteTJTcW?$)(j`tXseX*iE!7sJM`s;uPeCJjpe3WSB6uA;o2L?XPFz&-}{6-^P7Y0%)>{r5so+= z?GVn+NxH~B_gIE7O7r)3b1j6|sv>rk4X!Fu+owmuNMfCp9qn+(a_jzaS$nVeEJ zu%=Oo_holwQkv87;U|-|-th5TavC@BFCKKpb?TaUSG1CAOhky{V+Dl$sqpgE;ce|< z``qlYctICuQL<mlsf zRx;@m3kDhrzg|nP^z<=4Aee1o#}moc1lG!udr~|z!suh><}EPoQ2qL9LA&DcLRP*C zO68icFiG5P7xV~_iqpX_kMfrHms=(#UcLQ zld(qm{ECo$eYkL|A7-olawzROHC&!5c ziSrp=tXyK)9v1F8_wC3c{MjP?yI{3&^LmTj)W`H9y!(cf#wIc(SmK%pZx@Efj{OW{3rt@jMuP7VYx-ykxH9kv{U(YaPS?7AZsD zzA{?UuPc@(uLl|T)$ED>q_aPJeRyNF zRO5+6{K;hc__8uJGX4$|gEPSU zfZ>>kbJ-i0rg^Ngqo42FC7xADR>Lg^BC~$JgeNYJlEh+6!-Yq~KhDolYp{994sMB2 zyp-3`@$=9vNl^09w=#rqh8dX%En;bjQx9>mqY0kW z)}Q3UJ925G4=j)lR3_xb#KJ^<>l)fFUmBRoYV&%9Qs+%EIpufPv`$#7Y^$yE4cS}Y z8upLcGrxIvQVTI_JVlz^&c?}@_s%=9NvzM0-9Zo)Z9{-1@E;8#Nj}2S{$pj6f-3h6 zLp6ryUdh;4{1utyvWB5v)iC`?+n#ca1esvb(aXsxi4i@1ebTxpJkCaJBK-UwgOM_~ zcU>{~ue$FxUEQ6xCcVXv7Ew)uZeq>YhJ)l_1elu5c>_n5i)*$S!_}%z};bP<3^txhSlTpuX_G z_w7Fu{${mrvxH@{D?NJmpIw`EX@9U5uHKQTzmkf!ug+B1jg5COV@-X54x%S!=DcIr zqyA;;g@YWWDSZY#{bQ>_wa>ww6$%NwGdpeM$XX;LcX}Yc=Jlsj;qXj*e01EvQv>X0@za5MW2S> zb`)EHEp|#%?Z+QCU;v?Nx)~|jIlCPLX?a_{VQD(N>R{M@dD~$W6jeA3we5aW%!BCt z0PW~~3Os`Zak(;e3P;2(*2o30VSM!zoJ29{{sfbZ`a z4PPfjqF}TM*{X*hw=2>J7Q^l*{Ckftr*+;o`;yb;@$Lc#I*g8qd}T1~U*oBzZc6pz zfhIta^?e6O$Qe@_yxutk?|OMh)a$y3KeE9)_|$`bS=Y*Vt?b_7-~7P1r_z ze{8&J+0?r1@Ir=&h&O}bhqt8BeWt^6Pjwe^f@A0hPktk8o#Wp;za)G_^_;96&f3&0YM5!B>WXl1_t&YLo72k40D!-A7GmGW%oWE+o=_03BLT!IQ>WR-~Z@~?DN0uP8bU= z57oQF{wsMGU>k>j$>Vptd@-Uo)3omA_eWmjg^Cu_?e>(i-nqRQgc9Vu9~3i?nL!MrlwV!Qz&QQi_nQBO*^#q%x)kPR31r#UwO?$d(b}8Y zeQTrp(j~W%o6`^qHZmMLxln&K!C)R^^G1E(blCT{lA4;h4>~U#$0Pdl^+4Kc^t&%h z69Rn1AmDJ7$$8ke*ya9?NhUUU+qLi&=}{?D;E=t=hZyQ)k-IT!Tsh{G>4=kvU{CLT zBtd^&aA-~UJ1oqfo|x-zuYNM*mR*uG{bo+rS?v-dXlG>SzE36fWjhP0h&gB8KvyW% zhZZKWf)Yx!AMcl|lc3PCt72CHOHzp&Fx0{q<|kr0sI#ROo@OHJjnSWR;5+bCE;?2F z>ATC4`zENySu9M~&OPQCetZaiA$#bZ@K<>S^d6DaHJu-u-0Rcq7R$IDc!@ z%wvMH>mvM+8cQcMUH+=#i3fNn2_{_fA1bSolT8~FE)#+ zU@pDWtd4VWqK8a!w&}V2JX+-lP~Kv7qSdfa(+SABlT(s&=8^NYD*+2 zaTlFPP4+R4cn$!|P&B-_H4-U5-%AJ_=hXY($b}Kbpx!x;B4_J5e!{Yo5DH4{kS0#< z8u^Wne)Q^i`c(17Vl(oo7B^$La);(-hi^bQCO6b1Zv6NF5XItjPR}3mRJ%- zMH*X>%@6h%%wZ>BDw5&lFJ7KP@e1F5tA4OQ%zc6{!A)ptePP{WCe;k}8*I0cf3L%T zH~wVbMtU3xLqMRR)|bkFd$Vk;^NIG0>!Oy5Yuvf#P;Wpi_+V|n)y$7$W3uxYGB~EB zt=DHhAL($%Xf6CWg1WM&i4H}?Zj_SC*fbE~S60XVWbH7oLFp#9^k99G1L8wrwCBev zWXWPy+*c<$DFwriu5x93WpP=l#JN~U(SQF5#$Lp;x|H3Ik;P}v3=}3zZ8nFW>^B}(+w=09KKaMx3AF?N6oip5wxl&00kmtk_*c>Wk1eNEw~&4~ z96I{Ly{o{?`BQ&T#;s`B717LedJWN0btB+;x;pdF*3&(XHV`aiCu(N;V}eqtv-4$oh*l`i#~i_^&B&Z{fP82^DF+s8 zA6o%m=WCOai~9VlQk2|}bk%~IM;o*ID1Bn)Yfrj;m4d(KZW)LGqpLu)e zUX?vO7XI~s-*&~_4xqMNyo%)0orvZ9|J@y3A5QLe#GmMl$AbAuE&Os_3UfX`wxUSR z0J*b=nyaGk<}?^QJls=8qZ*91Z_Oe7PH2Avh0=8P;DJ#vgT-qGLWc^y)kzPu3k#bF zo!Jc82iEf*Ib2RI8|Kz$9bJF4CapGV<_qOA&8K?;!N|vs!i&wn2hehQD{F4t6pJ%p ztEk55{_LTZ5&`}(>goo==#BzeQ`2S&Lom>)h%r5_T5u|KzAk*34oNhsEj<|ic{^%8 z)k^<+?mr|~qpyChR>E_KNh5g6$q9S!F16HMlx;E>cVGybtxGrV&F|VAfyij9wm%>K zbU~V?TBJxS6%9n6sB2~b=oe;R3TZsp%td;lKltD_XN%%2et_F97m3sB#7I=S&bIB* z4l!lv3t!%l-_cbeYZPQn?WeOVwCm2Ue8ghDqEtdIny~uGRxjS2iCIv6Vev*7>&zYx z?!*mV=xgSNtKX7?^bPcnzi>9p?a@w7fn39v*D(UaPtGPA={M9gTTVj0QyTX4iYn>nY z_r$=yZfuwRIewtg;AZQb!n84k?jg*7g8)HA2kjc#w{X;6U$f61>^0Tk1#gryk#8<9 zLoqyFh+sW?=1-&c;0qnb7bt4e;k%DZS?|whZeewsRAA4KQ^r$wx)O)mr+yZT=z4g2 zpEh~N5{7;Hz;_nfoiZ`R_^vx3xV6sj@c8KquO0(~{d-^JuRi_S@XUKHt0TP*w5zw< zboC5J`EPv^UgEyA9+ zdI!H+oDzx@KKEhQZ+^5BsE3?99zHZ=3h?v3M04gopZem}URk*~s}lO}q}6GVI3PEM z-&v`DYjr`o4QLVe@&}ulm_&y`^WL;5*U9|umA3!4heG=!(OT%$+poEpp1iI2g{o(`N) z5~g~1RPy@F9=*e0+t&&bx9bQU;eoZX@w$%3Bf4u&c+k*P)<*soT& zBBkMk_xB|FuGztJ%ZAwcq3o&2Smaz~xW%GpTJ__In|S_kl%6R#Ns@Ss&pWcmJjFEM zOobZ(^ObhIQ4N@Vj{HDYpjcKuomlB-o$BSB?K9F?zF;aWKHkgx#MS;}SG#a7sl@y> zw;@|&G?||s*;6!-ouHc;Joj%APEhOjHD*qQ-%FtxMV~RlVF@Fk|5BCL$4}_SxemzPEAJ4qCY+JX4~lj%+TnP_~F^<=uhic8RHU0hG*Xw zj&WX{&+T9ZXxcQ9-SCHwY-^CYh25>i zmJ!KF3rz8WyJPl}l2_f+sU$`-a6#oW?L2PxU%8ohgcgn$>c}E;KRA87;;{XZ1=wK@%%=VQU{3cgFOuH zmhn}2KnKL9guQz9Ac{ELVN>{FPb6n=o5xd(xiUI8w&|j1l(zSFzb(b=DLl8D8C+5B zE__K3a6X$f%K65waOlZIYu`@S>>u9SSF?S|aJa8Zxu`jQN8apg{^TNu>7L#gsnTq( z7(SbKuoQL>9lCj=S&M-dNXCcaD~k^mtHSeZ3U$%Lj)(Bk_wsb|EIpYH$6`1l6JzA( ziD;&OI&XzN?{~ABi!?I;1{Q}$rY-wfHqMfMa$UIcwbuGuZ^{cBoE#$C3@6-w%9Ys7haKYD^D^2QJBz_B*9f2V=GL~UJAXxqgO0yZ=mDo5y)hp*0|LD2Z4rsS}F;Z5QH zBk5k?<1Wj5fhSA4PTT3rFioe^G?b(ybP5T~C36WBOrVui3Y2>VfzB-!5iOunMWKPM z1_i9RV!fwep?Iy!QH$4B7Psh8y6Yl!J!-Rxg05~?k89Oc&-d*)pY!o}FeEeo|9g3! z-}Ad%_j;c;F~JzC68>S7slo}62SngLn z{bM=7t7ew+2N0$^x`)he^@Q*<7WCm~35+>rb{J@dFe`24#F);JiWg-vILkDU2J*eqL0-^G8^s;zxh~t#yAw*0X9l+ys7(` z2?ufJDuzXw?WeQc*2)(cC)dM?18EdRjma26c1T_>MM8!YFVp%^FVYRBtj|X3;3Ybx z8{>=nniZFr8?$8QMQyL>=qpDJ-hp|}kv(g|ugZOVB9!9%=AgLt$$e)~TS!STk*WbIhqtJ6$sv2hm>Pzn-oP)95 zD(}3@5yK&yL9V+ACb)4fjWU7&DymV)C)T)E%JqHpio^Z)b+@9satq;>Yl7;z9j<$w zMZ3Fie8DQo4DMyIJFZ!d0d01P*b3fmAwh^5o*jAWc|=@xR*y2kK0PTitSPX{AAj_o z@adDHsn?;babZV&d;`%}xZy^N;r`PGH#vWi0w)FQ8kRtW6f9gL5(BO;LG#cAPTtn$ zBa6E6*#+Xzq8doz?W#+|Gq-2)X?*BPrh_1^6%KtYWUoxbx%z{{aVjQEB;2+RPoGaz z7`wQC?+_)sepNZCcZ=AxqHumRG2QWg31-H%1v)eJ3!oG$K0;p$U+>L)Wl;{0B6}LV z?}~pmlS!S$8P?AJpA2Khdi08=3;W=fZo*w!=kU49T~OuDEs<$_+bg=Q5AHHOTXqSo zC2Qd==v0>!dqaA9F5_0Qf6c(*r&6#R6+|+Hm*>>hN?T~(DdWYeCFD-SHA|&om`!AS z|7;>$unKpV8HeLyHQ>D%E+6X8hA%Rt4By(Uxb!10e;u};87k&KPAg(m8Am%6QPq0L zl)e3LUlGYc8{Xje^T3(tV+hJ9)Vu6lp9EG;3WpNIQX0P~?21`v7v4TlhsYWRV*)(A zH|1!-r2HNSxA4wIqzK?klDB9B`=;eF%=+!;uGyV3^f47UVR1;l!vssomb(j?kpNb+ ztC2?%?OTi@f?HGz=aj>*PZ-Q5Q7`E()7*TbrFs6bTzKiL4EAXxwb~m`G#KCc^{knb zAvDLS<>*WZH>FV6>a;eVpNL^y!{Lqo@!%C_D<0%V*==j#R5V-U?X@HP| zlu1&P9Bm3cTZSdWk#@5?TI1<#d<%T4kta2mBmydaZb?VI=YU168PkVud}m}I|7hDP zgcD{dltiS2F)`29g8JD*!fx@ztqE z(z$ncHA=J3X2pQ8K`VsoPU_#AEfsV|F*NmEVb^$6b!~sW5A~9ZF!785@9pq1qi<>A z9KqPU(h6kKaVxEi6y(hdqLVQu_eV1O77%4R(_;4Seph%rjrPV+**P5l5LG|i+cEj# z)@-E2n?#2r7XT8x>)oI1)7jxr>GwjKFQGs~`&ii-GEWdY3j* zvJrDaGC+gc>^SbKuBxjf-+>D>^utJ_p5klH!TcWFYnJ5xy6B8B@|vLP!9KucIJ5$- zCM-&IAx70ss4U)QBiJ$yEDebrkE-~WJJbzsONNB_d`U{M{OUlcZ9 zl)w;CAZA-7Nn@?XV-$wk3v1rsvy^_&TMS1Zm9_1rBm|XYg+jG$+OXOX?LT``oIato z{Ff8;XytWAIcuGGp8)yuqMh0Y%3kR1&zdY1!*QFVJLMHi!jTm$o>__ST{MI!B+Dym zf|}Lz^oi*UghgwE!jvuU^_g%!&xY?^a(zd=|Ke`3Y7+Zm zG8S=2zJ_+g<>=Rp95Rr1sr7WSVE=@`P!UK^R|H8vUHGfM_A zirEYTi}Gs{O20y=HX}_tJ-wae6?k)dS95shrZ`1UUmPiV5ru4q@$UXU6|}awFKpX9 zfPd5We@BY7o-OmjgQvJ+bQUL@y>5BCl{T1Ay4`xNLu7BNXKaz{%-3C(^K`ezf0$BT zVDm{E3gh5HXNFyA4AHHpSPL6Y!E|YIt6pS8C zqB;AGSG~WFgYc-Jze&uERs5b21;IX;&n!2}>F=)S*3*hn2+zz2D9QE2 zb!C<7d?fxdL2M;Cs2$B%A zD)owaZqsC>9)5i()>5RhBKMt@{)bF26JfYfqtLT2TI=3^W_ZP-@X$(9$6W`q_CM6Q z71CFAGz{HQ8s6E{RZ(c29j7|yZ8+vJ^1HhM3tX+v>pU`0D2TJxGb;c-eRi}X+LuqX zR1ABjtkkFo{p72oT!O$0ho|EEKeZry?z5{9$v`StG13#{I%++ZN3rXFotp!&%KHZQ zo4MC6j=HhYJjOLl*V(^)fa!K+|69TxW7;;phi-?_cITF?ik`Q1D|4`K$f;vm%z7_o z0(ImZr2oQQyfk&bS%aSG))VF&I0j3-xn#XvQt`iUTnN<`p8y2KaRGi9ENragyxZt1 zPM_hUkAcJ7R;lj(i+c^*n93DLa439yod4*)CT8MdHi$`sPO{~>LQX(}WjUR81;gOuznuRfXWK%)fF2)JI1q3^kZ!< zOxI|%9dqp(&~pM?GTO)@yYuh6i~-NQ*=BXo;7xOoOwYc|XM!s}u%>g)KuvTWqX`gF zX5-}vmOr6xw&IsEr>utXrm_3(5CgOBgT+cfj8MhfSr-$p_#_v`?pW>|LMXn#V`W}3D+Sy(U z7q1JgSF=CkztwgQU~3`!kQRmSFX*a6F-JV4FJ@KRy^h>ray*f6 zErf?oGuaG{)o!>_&zA0-q$mPI<4HI3%+;bJM8k}~E2+h)hyT5zqr7%^^y9c^Ns{|b zHC)8lqgC%qG0S#uy>}$m#1%o&T36^bKz8J#rn6lz88eC>4~Czw>+&_;@ot5gK21!{`}Tjjqj}#(hrxxf%7FzPjOLZa zvMr&$Hc|baLV)kWZHA(w2sY4hAzT%dLl!NVps2nNzBGkU)hzUnxz0Vk2f{!>^{=Y5 zb|~M-_QX^@4j)%@VrJ=wH!d7n`l^t4r6Gg`n0;MXd|twNl%9PpuVSdFl`#Kom-FKT>A$^AS_cz| z$#CDo@Z`NHkR#!m9c-x)u4D+^kyUTws>F(F_d{Gta9xoD6jFKe^r7&>>$41OkvXM3 zgojq!6sIoc`R(m}s~fVq`Sx@k7ZB)(dp=4tLlsdEbG9TDwBgoX$8e@&I7!FQ2!D5u z3R;gk)l&)*!*IzuPJHk$HDQW@!S^Q*_aYb zg&uZppGq-XP?Q=R*O6d|xJ|_7t=T|$>2yVo4JSOzR2Tl74eLJ{mM_ZMVrq8S)q}<= zdK@$GbG!q{l1uk${lbtOgb|Mz5L%S8IUtE0#Y&l63CG>2395!Se}pSZf+{b3Lh385 zSvrX}#Q$>oEjHBs(X@J-QyqlOUWQb%9NP{So4v*_(N?L@v-_OzY7D}#t2>M>7TGMH zlbn7Dd@>)F=Td~{O8wjt$#yWgJA1omNWS<%m-@(PCcilg>&oK_hAq2jJpG-6pY6pb z5^6w6+LzFF`xF>6OYi6!CIt_xUz>oh?)*&Ll{YOnh$!|P8P0m32)GL54>9cM6~e{r zggoQ$-)GDGJ`8Y#JxD6cquH>Z-J-BQBcxs-i7SbK!8Em(40g|1me_QgDjUFvKqJ){e_7JYKXki56G|S-`P9HG!HM!T41pH8;Yi0!?k%oeobY}+7%K%*TAf0-lWY7}gYq07R5 zMT?cAJZDtNGq*A&C3aMsyt(>(q8BpML_R2nN~G)TIV+qsU=jST8h$gO8hE^SO+G0r zyV!qO7uezxSub=`0#u!>305BU3qev#G& zLx^qahL7&QE?!PC6_3c3dDiI8=adK32n9Fp3*ol$NIRNc_DZ_}z=R%J2ah4Ido+@i zYqblH@-vfgotbF(ee0EAR&%tgnqTq%|DTJx%9DeK-2pyOc>L_hS=_iBH|D?v0)W^U zsJACh!3?K;XRgf|m@kCJdVP1V+ul(RB>R1$m#+(>naSGVSRe4wf?Ed z7o5mGgrGb6*MH`cW9;J_k2lsqdjIaj=v)Iyax|m?;|~@*Toy{1-H)2VVl-3><7)vD zsS-Dd(J-evP?QWI_fpTaa=TboO8bU=Y`GLc@PV@<)yB}M5H8;G)TZz|*l&2# z+&Dd(IXV2UyIZ9bM>qdE76I03M_vy#d@85TW_U5Wz&jE5MYS7hCM6Ab&Pw%Dxj1I| zbvH|!m@bc2fA-wj+xlpjDWD}-hM&`e`}2{^f9v%flFb%S@zD~KVStE%uHk|68MHXO zg=EHvb(teCvjGncb$*80w2}ESzl$bxh{N!f@CT4tBlNAUe<_FNicmn)1g*=yrz3`4 z>#+IXj?Q@kh+heRT<>^kclA$Z7kp7#+;hDvK5OGsj%+Ji>^Jy>iES*1tiF6K!C+GRev2)Yoy~aV* z$S-a%GHiy2zLcOT*1ek=uz+ETXH=!3eKSiij$TYl#V)g~l~WV0JKcVGRzh_6>kX+A z^rRV{IfEm|wp#2D4}K)&u(aL~c+scBpLgGmC8Z*XFDbQ|y`m z+ShRho(%KWhs9TUp1k8+U|kF6Y)OB3-TogOgZl@4>o=bk&c4M1yzYJ_f4$atY=(#( zNC!%dh1+^bO<1In!}OI@lB-W6e0br?O-LWctP$%DCvJ?D`_)TwST+2R-7yBt{mnJI z2c)-S$J-ypIWyra=R0lQb!v{dzQNl?2QsoN&gZxlp-~PO(wn~M;oLfI_z9fl4$v}- zQ`?W7lrs@?FN++~)Q*+>nu%?G^r_yY(ferlmt7tCm19{ail(#P|If5}&mZS#ACUBk z+u7ntlgUr`hHHhyOno<;2HfK+aDhQ5N3d=T-SAYB%lcmzCSt_TkKR?EU`om&GhEx3 z^}1DgrSRCP>_bf8Zulh7RWQ*J*AYLP^r!wVT9$qjwucUX7^@`g92W<|6g$ETFMq^} z`qg4JL%VaS|C(CYe>m!fO7;G~ME}3-soCTF<6BNosiM>szc`h3&c2%yqJF}r?lAQ= zhAyj)C5scQqkaQ2Kng!wZ`(v^-Q)K=>BZLe^@hKBm#B3MoIrm6#R98j9aIoTF5m6V ze|3r1{FT_S?0tPVB7&&KP)_i7GX8IA7Rvj793C(6PM39dsjcDGr9ESBSqJcC7exUb zf3@(d5_^1+qpKo-^F{7Yyyh5QL>>GW76{LVDzZ#As@6>$K0RIy&1+)T4bl@UM4Fs> zY3>2R0{hn`P0l9Mo8IJCoYfA$X#0PAZgAsPt1#37;q8vL)+>8NbtrGmzhdRNf;X%AoV^vGC{f zWJF-8?Wn|+pDQEsLmYkXcY=QUvau1?9QJ0><9IA$4~SD%l{ zq>EEi=TN);C`ieU3WH(gCZGq2TeN?wYj(mn4H-x4AMQitj!t*Y0{WORrOA)iLPxQEf_n*^a+Y!4nisJJxE; zFX#@BUZTA!r6*47#UAqp+06ANx@Ew^pVAY0oUkrh^$SXn%mej|9d4^KDoC4|IIFzy zVxI*%|1IgPbHD#$m6O{vEWV_pp4n3gzt40_JhCU#hlyBG75ja@UT zqT^;X-0|Kh7Mr-tr`ogKM8F6_>68e2A6hVz#DFb?aJD`1muuGJ?x8yYV=XU({t}n_ zV%1!nFUh3t?6C*Z=k$gPihSj`ERbeVJOJZ+ww@cWq&rjlaloH|;S>-Wr{KIL_h^zM;2GfFzz_G_!FCf;! z9XZjNdbF0=9Xay%tQRmr>k9QgPl?1^-Hmi(N1e?xN>z;OG(%}}saEh2Grigw^npvl zT}u!W@zGq)gGhR8J^?=AiRjt6upJxI?9L>W_HY6seo3n^?xEGJiRHL-^x0CBzu!hDihORTsYve<_|8?!Spe7&N$(Z z`=^fl&KvxSgCqP)N5p1E8N=E0x;4{G<}y3-NDKz{zS((0b zaUY}>4A7{ItT`I82&YOmb-H1lpf8JW z;?yu_eU^7jEn4JWv|v{Uv8CZC;YEFiLwN5$idWKv0*PAK7!J}_vqvyCX1;Uu5BGV- ze_l#tOcEVEZP4AAc_Ad$Ge?t#NkF<+-x-c9@td}0to!0jxc-W8-}%h_s?7{mA+w08 zmb^CR6XGv?cPwi3-u~7|M!0oGA3DO;Ka9hjHG=m%93wIRXq;4mvzy;W!@WXf+4Rek z^qSTFSHxFTI}riL{;jEVzI_*O0$I%YMo%Kif88{k=aA1NFxBN6t&vQxPL7?}m-vvc zWMARKL=|Gk)#=2bYc%XWH6da=>{(zJU$typ%C`L@1m%Qn;a8_c%KY|~Q~%Cc)NTMG z)cA6llG2#-qQZGj;}{SUvWoZ^+5;SoD{>1ayG0BPQqhL6tYv8?`eNZL%I0hq7o7Le zeJ0ydY1O2zg+ILOm;>UXkJ?cu^Fv`9TnszT;V0?KXOIF;?aj)L$zxuJu>lm`didgs zaP?coV{?4RY0MniLTO}Y)utkKWy1;bGy+iT!pFUkTi%$-)?|1^UkwR3&Bp${K1?E3 z9(Sf8Y1|nwVIDgY4NE}N`%c3cU2rGT~|~r$9gF`YMkC%Olo|c z)N(egJgEfDz=ydr#OA-+EpLsuyMCs?|1#z)`)s- z-WoOuBr;PnRV~91vfS`l-<2Qh;PYrdO)U*CyEh#E5TG115;Iml^@!FTOmchCa81f0>ct>TA06;s*v$xCk z=jQx^tx03W8_&nOL_MXl+X46Xj9+gp8n-NY_nS61Zsa`mHOc7Uj zCLwFKr!QLRzkA4k{I(u$T9l;|!?$gR+fM3rR_F}^w@c9aGnE58&o#0!a=g=!`y$yY{5r(Ft-q zpn4VO3#Z6XLg_Wr?>R7|Frv209CxSh()VyUccBM<*9~a15@?yF6r;{j{)dH#A#_8eGk?Ml&6zRG2|vC7rBqbgzRRNW{l@fcV}N@CERExDQ~m>4gWQXo zg@K`~(5R>1lV*6~R;!`}8Bw&suoSagv0R(^y0>@eI-L9gPIe>@bR(tk(|ZT^rW`Ja zpu*+sko=oNPbI5{LS01{K9_2a1_(klppo{bEUd|lEmIC}J`BsiU=jtlRj5DmkpFC4{Ghb0&!ui|MT=gul-BrzRFlL;E&dI`7~5%v}S3 z1op9f_+F0AH=!&nVc8vf5B8^FZx76NZj-W$HVu**E)b(Bvy(|JY%~1ris&dwNO5wq4S5W!-qg)aw^gt9F!vG~-*DZj%rXfl0%o9I;@Ve+ z|C>xy{kO{9om+B6Sr3!ORMB2eoE0v>>0xZzoi%Yv*v$`GAwzmwgia$*x5DXfiQWs` zu=8P2Q)M9Avm)|1vlY8ZW^FUQ?07GhAxS-~UzH&4h2AA%mdTMGp?E{}d=UYRv5_zo z{+?!z>SyMeQ7OmDuUX1uPlD|tE8FK`#}^zRd#-Z`9m(}s|7!XX|6b-mdLrE`*HE2- zCv?h<9kGt!yL^FnLj_2m<-{vT6xakIEaeWO_D2I7z}`^HzqiB?$>j+ID6)cD4c%@U z;=^jR5ZHkh{{>sZ&)+5-JQyH;`hotjL}afo?qg05=<{$kCwg0oHmc)FxUider_!G2 z}%C{!^|S<;d3Toyr!Y$?2| zFF|}2{^lPO22`2E(gBa#Jq80T{(lX|8(w3BGE8lTU%y=9l<8s&FD3qommzMkgqY}8 zy)kh6(5z3IQ6iM9G6&4twGERFR-qXxE0u>)NjG)v zc!E^-*@-4+NpKbv5O73(%t^e98Yx)usW6UC~Dji)4r7euD9 zskpwMEESF?c1f~cui-+8wU(UMM>88&bo;03*YKtlS{=U!5PayP7VtA^aZp0|!pFAs zZ=ZT~xH}{BcYH(WS))Hz0yRwo9!3TczEf( z383rF-*nFOk#M@1gj0qiEzbFE{F3MUe-l>ezbR_hx z-noAN;fSm6`}??H>ODtRh0d1(4npd^)_eZ53oU~ucxX9EJKGLFS)gHp zf_`(e1I-|7W?r_ebk-3dzlZ<6JbfAY<%eSxWgo2ShaeG1gqQ6%3#Fn#2woR1=rdzs zo@{g#zW!1LlU&ziR<{F-WDR!@>Y~1ad8{=)!t|=zWU`&fpXzXb{0&%iqr>T&QqdlC z?4&MJ&uvl!<&=dxn0v*=1D{AL>?GwyhSBoVQJ|nFM3p|`m8bTkK5af6d!CKKkc?=<@9f&NwFA!Q7u7BUMoeI#f559d3_|A?tOh|o;y%u+Q)CT2nG6&Q!+csD9i}g zkLyg<`E(nSN%X5~`0Lx*P&h&K_9o6Rmt=w@k=`>#*4vre_5fcRCru+_29W%D|H}2#J)~ zyF%0QF}V%*G%;rzVRCKk-}aq?F-E-x4cwEl2O3Ww?qf2C@L$0hy#7WJO5?ZV+C@oV zxbMwLy!M9RBcAgxhT1=Mv^#Ij92i#CGa&~SjfS7)S8k61THoj)^E<2sB5#|TX3&bm zs`bHfEb+TfIatag{d*%SJdq|(PU4I=!>jJ;Ms{JoO<0`cR#XLz8;+JJv%?Qbq*}S_+x&-aaio7?WQtE**5^b2nGNT3nbu$aim>E*O2umW!M8{L<1=fOvJPAVhA{ubom+a#W^9D7 zW(!%RVG?O!RDN%tm(Bi=+fUDyCpt>?-y&G2zjt~#dS`gg0%ov-xAo?W(%u=H4emA5 z5lKV=@9~Ejkc;p2NZujDM+-L~k1L&-zC3*SEh$+#%GcD0F=0w?fhYO={BTZBf{MH6 z@aw~Odb>z5bE~@acYBeOTZv-A0*)K^ACPN9MIVO&i(STd6w2hZ;X<`+i_f1X|cr3x`-@Pp-A~~+9OEU-h#&9;bcf( zk(2WqheZ{IE6+yb9&(=W4RT-Z$BFooAG%iIHoYdLduPMF+1#%-GW##|tKsOWQUqob z(J}-CLaKrwn9scM{&1AUUX{Ee{O#dhMwf0ySJm%76@Iol2?!bmWBZkhU!92I$cH{= zf|yP{mLqS#|0Du&9#pjF#tfBeKcy#SoJj@kcGz&K405I}MpkO;U%hgTco8_M3H+$X zOjCk@@X@%Cf2EbHU!HV0@{_&XKi+Xxc;PiPN1o9T`b zVt16WEI{&<6w?c%2KgvOt-5hE%wIyWZ`i6KYMyykK1b!}hGR;|!a5=7JP@4;<+YixOZg zS3Ut=SxX)sUOL6_@Z_Y0TnMkq@ZqE(N1eN84@Y7)9O++Qr2;IE^qNS(*o_W;Q1%3E z<`?+BIs$ILAmI-Yf<^by+Qmuip2=`cY(1`+n>n0{VFHs^+H)2=3-S~$3V8T^7yD3` ze2X%s+-7RY;etcy%h`dx@Qv_wfzO<3hhs@nO%<(_rg2{MWFvF9T{5bmgc!np1!lSmg@VmW?wB*xqE87o4Jf5zz&E1TE_?^zSK>QLu;*hTEfJM-X_Ipp;FoZm++^l z0nCUvG!>}iiQhU4{k?dTA1s4tR1{u+%M%%CHN)iE_g1D&S zO6d%3jJ@+M@caoJx_zFJO3#u16MolkDet%_)_|T(Gfce0TRMArU!$dBx5`F{2uuYi z>U)KmiB1(Vltpq=jW%gti>MJK>F zq$|YMIlT9dFvh*SMkC>kuy@Gs{IAT`Nsi+j6~p^K8UAn*k~B->t9+6d7R103el5*L zi9rKT9{^${O#Yagyko3mJUrhM{-K9>(!t&{vjnK-yG4W9eEQ(2F^YMeAG`QNT^!<1 zvCiAgm4~@I)$7lgytUGkB0!ZEUBvr?7Gfg4v^%dY79x#32H z5QO3I(>rlKcO)#fKfl|tgmd0U95Z&dC%dU9%-iJhd#`a)`fw^MrUgf%5q=#FewHmk za|kO=@-M!l2TzO=5Xm9pxUX2y`NUIuyWsZ^f3{CKAn7|6!@oZ@b95A;%ajr_86InE zp+~}#2g1*Wlc>X`v%B7uGLxA$hEWpB*$+Ypr(7tXWMhJ^giY!Vg z#OCa=dl<~NYkYB3CU3kjs&5mc;TQ@3+EWv3lfy%46mj&dL!a+f_zDY>Cgz2|lj9Gw zj;q6xds8(rC!?7SbhDi>W(>Twb=zr%&ClGdl7Ybriri)4CC?cYU(p}e+T@F!xsJ)5 z>$|jaU-*1Vih<4a)|ok5y6cl|`Bmg2F@kr~1Ki+}G>F6DukZFhaWgbKIs-{26#Ej8 z!}N6nKFdw0qwcq#zoHkP5ysLYBbaBy7)iCtd^wFYPRpc#hDLbD?EqcMV3Hzsl1sT9 zUelDZ$;;~S`H3PG%|zL@I5O;fmpcL_;2#_{J^#2a=}GfMPGt$(2-)jl8)qB6^0yR) zthP>;P8c=br++NYz|994UNpil-WMyrJLf0WUAnNrA#NhV$H1NJk+|_E~?CU}? zC$ti?#nFV2>J?eZ_vh8m&lBs7Z#Xt4IyfzltH==Bc-Hkhc^=LR8cDpU2Y--{+3qy5 zOt@k~)}FZo%n-a@OL$U}aaZ&le~S-v+dwab->}Jeh$q$y&U-{~TV&~%{kK1@kg6ye zIi$RK2j55PH`6t+3pkNC)wk2@58y)UAZ-ec(axownU5p40V_SfmBFPKn{o_ajp(Jl zh_Co!wVDyHaU77~%DIs^KGPj8OgJgtniJ%#0IV=R9(s9ywijcrsa>t$v4#$2#oB2{ zMMT@a{+^W4x5NLiAZw0?MC;Mb3(%Q(15bV!XpzQIWO6NB^LL$56fcmuiO=NEY)INU z6NrdW{&iN{kW=z>E3~_BTu{a1#zsAg;J<*PS*|-f^Z>j)_eAx zh$Tz{ymYZ@@!$mJF>B!PwY@0q<@B6;I_gi$io(W_L>Trpyos@MQ>OZ!*Yr>~oQIo4 z`27Juej~hpZ8+;1XbQdb2jiKkygvV|kp8K*-s{{;$1mzRQtYy! ztu$8S;iQ|Lr$az71uD}F;JN&7f9wNiNBRzY%bSrI)rgMd2njAd2ws7fGri*-B*0u< z__$Du;TdH1WL*b4bDD{R7qZ=7YSaXDGM-_W>`0HI}R=6HO>tfGL^hf>U4GivNEvqGunYyHw z4{;@T9`e@LIA;!CDs>xGPT*bUxTQ9BA+0EMnDS}}|LZm3`zywGBdaeld{2lf3A*Gc0@m3>S)DI|om8H*QGqd+}b@&r6 z58sH%7;oev75%)f^yy}5HE4Lprr~2;6Qqrin;pnf9y)D}s1DFjg+G6%l zUs@uifU66WEax*LXM#T5x~Q)uH<6v{o*Y&gky^=&)iglE%94wQv^!hgPx;HHEvG1{}~b>Y%m zx>1;;xAz^hSA6{q1lKgy_T z&syE3J-LzfC?A6a_j3iVX)$_@V%d#0e_?t|;zTw54{1BECv`c# z4u8h*7*H?LhWw7~{P6{DUw&(3a9>Hyok4IXfNH3|7hL8@5C@|U`tiRK1fG8(rjs-R z=lAXhyBxTQ!Gxh%I23cyHa<>?8G+SHZ-F)%0S|H}ZBRGUvzO_9!`4{$Mm^R0miOX& z@_edHZkzU`mUf4mC)HQ=7rIMSt-j7*zlsGGV|~7`NO6)g$ulnnzE)Ab@?B)hGvisz z_Bv!L{OcPfYCM0`C)m5%1>(k>{cU7a9=z1KA+4A#eErMxX8qgystnF`$qx8?cA+Xq z!vG_Iu;|l1#B*O!M`bpx3spUwcyC;dSrmOk9|Im^qU1pq_=-E_7vaw-@^XfOiHQayR#J%2*T6Qc|5L` z+f2aXp)mJuPHQ9K+cDE(PHO<48#sW1QB}F6jH93fcT6GL$}8R4=dk75DHp6eJb7~Z z-omk5k@462vLt!s`WwQlo1$t8;VOz)==7G?Mvg)c1ha+D78XVd$fk{v=$F4Use)yi zx2l^lgVENU^&lS%I2D-g(IT7ZMMMK-vWzGW&W88&2)Bu>@O179=wEu{#n_EAEqO<{ zay*u-eE;Bu1TTd$js0iyF<_Nzy!67UL*Y5*`HisuJNQnicc$pAjj)!!rpv_pt4qSy zS9TLCQ=g=N@tnQ&)l27K=8-Lhb$5hQ1~H#Adp{KBJei=L3+vBxWmGcz@)-3^d2T3s zuCK$3($h`GX8CoRVSy-$pL2 zm5`^N@^qfc`i2sdBFP zUufL4oa_rPjk?m`tc!ob#UJar-8Wigf4nQ4to1@sFag@(_wMZO@^||}Z74bmkzz*5gj@+|rGw&%HJL-p`icue0t`gRbr@rIP zucl|N2otaA<;86vi|#mYWx^QJT+Mg*k4w0j_D>OeR>Hx*^BZzY`XGe|Mytku&knE#19!4?t@fzui)kpGS0Y}`%WZjR|#J9$)shAaA?O3hqtZqB^R93 zA(XaDV#YJOyMe3G==?8>#&?sKbfcDIGl$#tj2u};!hg2Rw&06;wp{q;Z|Pu#5%;kl zjpqE7Ho0*Qnbu&;jMThwdMf?P^>l*%4e$f{M#0Q{+nyZONItr>BTf@5Q-YG0ermwy zYeYJ=1FrYM=XVcCL&fKmH z9v%?B-VXm~Nj$Gl6LIgtF2FJ59z_bzVM3jRNrtZ7|J;%y4nO>WlW_0Om~~e%y3B`@U)8gHK1o0oOg(nDbzb=dliQydNI;v%{yY8q z(eR$r3Ar0Z zpMA#P((z;MZLa@4c#F6B^ zImfS_#v>0)ZexCA))#Xu2XRP&U!@{9Yai;#=WM30a3$vUXnrPq;R1{)h9}PGVFl>k zbE6aY^mXKQ@G}%Qgbf};b7m}qj^D-Fbu8%RJ;hx|hT1k9%P{qr554=*q(ikH zs5zHFC@Bk{ z0BJDhQVdYt59}5TQAmZP(wRH*b>?4)GH#a`-3^J5wFBqUt0J8lD8P5CrTF{sO50e; zpqMt9H{gf`9URC0L+)~38y;8V&!OeUd^w(d@C}Y4J}Uzd6st&pfZjAr?BmaIF<^bB z`jL%^Y6E9-_t8ZZD0-MhE2bKS_;Xf7_1MM6-L&ra0UHhUXvgFnwH5oY-#If!)}h#Q zMU}k^NQt@iJX44?wLqS;TMA-Vuf$(RL($^tgBXfE>apZUt>|MGn35hER0#P(ZJ_hW zH1t_jMwlDpp?1>iA<5a_zLnw_(n0` zncLpN_Y}$|P?K^2DYpvs!=m)x3TlbbmH@%(KC@$@HG=JQAVsdXvaXdLHU(XKvbzIm+;v73KX3!hUbmB+=LA zj-NBIa}6mscxVo*hn&Z)7$5DmlXFUaE%AwHv^?CKK?zMJa8aRS8Chp&4PFs> zZj2UdMU;G|uHf=& zbubmE7boZDR=Y^*E++3h5_yaWo8t#zC=wtjO~h7Wp?FU*$KJ7lQY65{dv|LXwIi8D zMRH9(l}op8+W00qje~hiVf~a-1?xOooe9~Dj=v-IIk{<-i5F)OVaDQXMjTnps|8Z2 zGBYPiC{C`~D&A+3nB0UYKbp_?A6~6Zk7>6Bb$(1qkXSb-cjQts3Oh?wu7As$2Gfw? zq04HwOC+OhOBmSk)x62yE1{kH*dbHVAYw z#^JqEs<$DH)ioQY4QQYXdiuJ-o}Y^JGE~5bB9OK@N6Ps%8#Xv83%<91Svl#MnSrt@ zt@!?tjF{OD?b zugo7Xy2SGqiD9o6e#9_5cugzTx5@x(7#zuwR(dOxpNn>F@Ni$HRD|$Kg|DA7o?q<& zU~O1g5kYb36;-Hgn*i<6ZB_kU9pCMFIsZm&l*ntCx}LL_jm=N1FiM>wbKXA01@lwj zMzA<7Je3>Ptj`qhqmm>vRC6OBTz22orBBo5eq}$T;26yImi)1@Ezx=8au1z^TDFUm z!pX&P0x_t)HoqPEPn&g2SFS)eUiD_8u3gH2KZhmF@OWVVrU7;sSpEi*)tw!13!AGJ zt-{Pu>&w|DNwJdRf^a#~`6SmKhfV*&v8d)mQ7<`o3ht1S(`VY#jv<~@{1vq(i6@_) z0&5jF@}zyJ5@>DPW0Av>^5D%@D_`FEvej0V^A{o08m6FfMe>1SRPS&Fz9C!*%t-)E#XHu;R42Rkxh^#J-UBtgEbd# z84Msw5l|6rWTbnpJUp$>Za9*Vjh*ujVjGH$7zrB!IOwZTY58uslJ*qr5V4g06W2-V zv*?_oz6vU)x%}v4^xg%URSCvf{HE4fApD_YB1wyQI$|8H;^21s)3P@&#&c>;Z3GT> z=1@fWuRB{ECDu>pmLUNJ6+%OViN@&Eecf&xJWggIgz%D!+l|5PN7hylosH2j%iZ^i zXqW3T_sSSmVswsXQ$2RW+V@Qms}Ecy3`B{tN~~M|K?KD?wAPxtrT;@iO_z*U!bU!Z zn@PfTo7w+{FX)MEpG4~9V+RIC^o|TDOMkMlKRbbPjnZict653zxVkrG!qjG;p@o#$B!MU* zsfEr9hJ5@HBO#s|`P$QabNIkM3qjzBoupp&Nvic{`q1|Ygmpx7*XJE6O`;Ed5z6rR zQKHWT8AE5E8CTQo+!R}6T5tb26e^W*hMQBrZ#dcx4!O}HcL|q9r(c^p z;S`LLW0zvB%tx2*8Pt_CM3q(+)9CBtTi1E^RB%W`W)p5P(}8+zPHuGx3)#Pfs*r~- zaZhONJfLs0%7&q2{lor;ICNDzuGV@;DDila>l*o zr*Ph#@33{32KhG5P^tB)1F%3dnsX8`?9|+Kv1Vnq6U_=>93(HGv^hCr9;3^;=QJ6i zx{;l?u8L58B=7RQ@Li(TYN$}b6&IDEzp3n;K{ofa%0fs~{f3>WpkPR!rruJkc;a4S z|6f)Edl*F6RT^kn&IC+`*?sOcfqOnn=Sw!I2lS6#gsGcKJfc=e^Np$LZZ(eBu<@HW zV%U3m(YoC?=T5?}MHeyJQqO?H^B#$c4R*UDu?~*sn(zyGpTZJx_u9odTgIFkk&LU1 z;ke*|HusOk3nLmfx(OnozrCaP7-P$V?%%X?X2Kt;10LO-Dvwd(#A1HUZd@-Jr})GC zH>dVQO6%-p&eeQO3dNzsVUWu^iS@7G82`rpz3bd|EXuiXHuT~RHYgl5*fxAB5yMQs zl%Th5-IH2XN82ZAQJlL;#E8xz1hO6svHSmUY{ojj*A0nd14lX|nX*DA^D8$+<6XCo zvKWO~1sPW)3!aNnj06~4K=8U+!zf%nA^X18jHilk7{Q~>y2>y_eRt+Ci#x^NgH?MrX3qd z9~}pHX|l^kblNVrI2N3JMhb%?r9J0J&R4Ny6~nZ16EU1~bAmxbUAhGS!O5Nbj!BDv zgZu$$vcfqF*45mWN@ZCjh_3Wf)cCCDbKK$Zb&aY=^E{{&8qV7A^8kO!Pd$!X%G7vT z>(_L2y7=kg9Vm7PpK)+r1V@xYBuq-Urprj%EH1~!@wqkD1|jrub#=aZvH8pM`CJ~LW_6PZzMEk&beI%N6L zdkE$I?*tKK=ffb@AMY3G1tK8oic^HIs+ouIT?67%Mq0GeE~T%O!@*=W5}Qng&D*C1 z&w?LgQY~4tRS@MIZ61@xZdm=%`8B_*gV6;)!DDSodHhrBl$07wcb7c~Mxht4POi!8 z^x*OcIcmWE!!i}ol9P^lqXjjZaFR)7K$uBv;dJW4jc~9HYk_MC6jbgnkKMN0m6M^2 z-op373)ZC04vwj-ZDRLYTSpA$k(8SSP4eN&_gp!5z1larQaQ#AuE0&ovkf!uW3f*sh2Y`PZD>5aORo!6HCwnthg5#o^udGh_#P3p3F6M9y&6 zSs5wOjoG8=4L}c{9+REHSJ}8>a!q0j83+}jfJ$slD>sS)wV)m(f>W!VHzXZDm}9+9 zX6%b`JKdXFhX(5FYsysJ{+8>em7jBDb#zNm3Ik4K56ghoppOVYmL>`(qnt+d`K_y6 zxkA!#V#ds#YD`;ok#FsZv60O1-e=s13v3 zgJs2ExWDLn_uqmXdi{Wk%R@2T!q->E;WWfv9DA$6<|gGy7-rxG7sb2MkB zVdrx4h-Qilxi@>5n0?7Uh(4&(6zu7}(>@NZy*h~Q*PVuV>+k7C9iOl!p`C3J;h@;# z79hqsBdVrp%s4|0%|jia!5+2gi=)W&a9;Cu3!vR*%UT)VU_V<{qR+(|v4&Ym9xup4 z_ly0M6c7gk(=9YRiv#|y=WSQk{T_YHu`U$zy}kn{mIz9dECJD6uCT z-I7~mn!zv0X3=G9T4@Cw!f)1X2^KXh?Y`XWr>Jx|prpm*#Da6cKq@;V>_eiF?==a# z*fHU=b3Fsk8||TQ!ptg)Tpr_NV+K%*Zz;$&70Go$FH;Eh*JgiC#F3)i^qd7&rv{ zf%NKFfSAa+`x0H4#R-AWvX#kn>X}1<(YWAtsq6sYZ)JvTE(^dOg$su37bd0UR#t8j zJ_g~YM^cE>&X0uBTuH_C^6Uarsfz#0`v#FF(>b{zW8PeMCK$KPQvBn?mB2=ZBzSY^815+I^E0}N`;I)51>j}9gYn_A(Y z=CKuPPo#Vc^o8%t?W$LIz7>@Ll%45~4pa?Ws-EdE`5P<7^ehLwUu1=ddI%leJLj37 zQ^{fXeJ!&yH>8q@8eoNq$-^=4&{Gr9ap!2VSME%KeO7x-o;$1YbL6*2Zq0fE>Dk{} z{caWjul5d#xogXiR6mnz1w5bQ@VjnaiE20>$xEf5tr;f?ITDhMcrZK974KRTlnC7x zg3|fzEZ<({d$r-cz0oQX@nJYTetg!CSW1nZ)f~$aRZk=ox7TcC0n`}3JE=-=$%;?* z9L>fyFQ(;+z6|A&5hQ>wEE3OS*;fti65a{Un=TIz!d-!KSt_qRI_*+$ue#e?d^!Cw z(*O)rh-*>Kt>U(%kk*KD06oU_NHELkjw3v>lLr=3-U5#ttBuCCjSQ|(K#@wYMgA11 zHJb#H5tyWMcQ?p)oGcD9G$vY^Z6!b?{oBRA*QWk7 zc;pa!&A6dNWz@$g#vmwQQ1D}WQVFb8D6ct4aslEqasI>n&YYKH&uKfYV6PDS1EfEg z9b!cglX09j3ZSw0YWK_qd;omSMjY5Y`w!%FT>hI@Y*duRIz5(x)N3Xk2HIUp+u zYMw^)s|6GLV&0f-G-*<#p&)S|n%8r1X&)1)r~<(V+`Lo*1@_ej6EtCVK<0X$w^tlX ztk$eI^bPJaR$me2s|fRxxW*)=$;Q?vG1t$TmN`hMM2i~R`lVf{P7ll-AjA-_sr7BF z*(#_NQRROYY*K0=RdJ(GN|AdKE$L{BEG6>oG}ABRxP@Xe#YPm+YNJ8RX7m@lR?Ahb z1Qy8eno%UQpgX#J6Rm~?fYYHxcFB3c;8tNB*o3{-m`~W`V{bmY+8W>@ttvFHMnX_h z5)JEdxKX--RfloVqZB%kwgX;_1;Mt{X%e}6VohJFzd)}}EA;D-E~ zd8Q6)>H?m2&^xvi0D6TyRYJ8BQDXdLj3Z}-joVDcemca4Yi3zA(zZ;xV>a7lxksEM zf%P4|(eM?2DIzM01P^3hN1=W`eKp9hyaq%T9-hk%ek43H7f)quen)HkOyv#xKR$k= z93UT?$;wMKG#X8RwR^oQ6lCQ6+urc-f-a|3>gh8rk7TORaCbJrvBja!`Xt)GrIP}- z>!P>YJufWaswFEmn>6IjJJM98D8edTl}b2Sn_DmM+S0{*^R7%5#H|CZWX4kTyyOUd z@C1)mzr1qH0rc79!wYFnf^h`qU)XSh@Pp`>4I{CDN91U9^Jp-r38Mt_(eQIJ{mpcr zMt)Kcg7Wn_F&?~#hav$F|CL8#t^WMc)tZ`^D#km)H7e7yQXkyTw50`?(Q=Qb6H9w# zEa)f;lj*MzeV4-bLPr(tg`+nO_u-!CPHbgY!EG$PB!fYVE%xZcslg``c1y--8-{0^ zR&a;Ks^t{a>Q>V!t=%dvdt8zxesanb1A$>vN|k8B2w7$0i{#o`IktsZ&oyKWV7*)Z zx_}sBuKt4D$KvUxto1%*OiD*!?28kJ2qAXP0{AeXPme*q+{0Fu#*CSCDNhwxNOvs5 zdnd(tM-RuJ7zWmW`%hNqI47DkLbhH6B*btZJ}I(NewdAK#qmQHAvH7MTZU&?g6id}@PWB>lNlc4E)Z{87ZR&J#$C*Qi8iC*P}__yZ0?W51ht*WW(Jk~g>FBdoPE~} zkFMIt^ZVI}h^Dl+@=3^^b^_j@XsfYr!1%$>3f)c-V01`jeGPQMJMzujA6PQMc?p3AVyjZtCBARgwCK zHmpJ2`n3E?2%CcT1U4bM8yx#^U6#{w({%ra9XZ~ZWjBRxs~wepgT4B#m!t>q4Du*K zpoPrVK4xvSge{ZO(#ZIRA!8;3a#*id6y9+%eQ9-Vo|%M`D2CHlNsW6V%sBg*H3y25`S{&QA^`u;%!;SsF z$c>tZy3J7zE4$YBVx2@LRGwp-8=KfvJKBhhT14DbQa)WdbLd0@JHuD)fz_-*YR?Tz z7sSgzzM1O99IRH-w^KNp7)R67yavzrXLfNYJLKpy7}nqLrx`z(67-@kIIXYSFwmh? z|B0y}*w_>krqO5>>vJVhM70*>Y`D3%{p;sB3!dvHSaV%rR;)QVAmag@#s_VMr_$>cCD0I*7S$edqx)Z9w`PN#q<161 zHK150Amic1K0v*z68B@%5z!A z1VPIq4?Jxt*Aw>=JQB4ZA@FT|{hRPH-45uACGIjCmmhN&YlZh^2ehT;94L_a!K@Ry z?tpzbgJc^v&XrWd+u@io6`>JFL<6B+9pTH1qh`4gKHamE(Kk?9*&UAW@3xm@d#XnU zFnr9AY}0THv_63Ch?`1XHAQlo(Vqdjw}^Kt|gsCx)vx! z`ZsxPFQg-Vq~)fwp`71?hsR+4U=^U99N!2?AZ#SfGuz>JCna6TWeL90PpY9KXrkR! zTXk;Wg-s_7;f)&*6;)}jtPPo=MzrIAt7!o9777{W!N}e!7k^+rU6(e4jsz@bxzzIt4hcTWP~7=sMWOwD6YWsY&x*8(4d-=EPHw@I^4Fj z+S#q$Fj8bpw08~Jn>#)s-B{_2TN@dN#=*6*OUN_wdnk-|5)hf*z=3E>(!IYtc zwWqf;^g$%y%^Qu94%Y`0AUcLP$80`4?A9(EHdQO2Usy6DVkf&vAU-eF3}e+1gQ-TH zCZXF=5oOxn?{`~s0LfA}nrV1%$_yhdA@KR+KxB3yS126Aa4tqjZSL*LSG_zA){XGN z#gPLc1*ux8zXyeRJP}y}bqY2oHf|U!%R#nlhG~THS1G-61v+#1%_%xCa~ZZ2ib288 zvQ?KRWgge3_H_+6G94#R7~s}T>dj)bhd5I@a)(It4m7HEPqq2kuQRdIvZ4e;1(u?? zTA!>xwReJ8g1}LG8P(zDc3QHKSTXzOUaV%03MIu#)VizFp5!d5^%zgYUd@_>?3yvE zii^T1dZX;k6N?P&ZacfI9^J9n+ZC3CNKx<@C9Q#w?SJk<3N&D3BIay<^R)D}nO>}q zNV_fh8M2^BlsctnAzXVxs_I&(rMI2hhp!Qp(BkU$&L5!Xc8)5 zHfBHARchOc^dW+GNc#!o%k>wsAP^*kNjmoMWQ;~?2>@TQX6a# zez>qVhHSYp*a4L;b?w>SWo!^DD)N`F@4iVMcp!@;LHV!SAv?mrAavWw(5^k11$ z@`AvBEN)g6Y(X>zH$f7pWAQ*{4?4}{rPedItn5RfP|4%J^lVv@GRtw8|7mU)?Xshi zLk$$tM${_^v1+ti-yX|3C)sqP9*$y6njx5%0j|ZgB3qFTk34-i*RZd3$$n%+21iF> z&L4$~4Tlxc^kLF$13QYtr~ebyGVTSI(!Syl&yDV#3SB;`u(WDsYyb+4;$&}mS)=^Y z!;Vt`JCZwD|9^Cu{uL+?KDD^FP#uMK5*zG0rOPTmE)!lIx}j-+?b(a@@ixMujO1db z?$ypM`)`T5;pc|EO-XW)(@6_hN&f!jPRJnWHCkRMQ{V zd5nMKm@kuT&rH~HS|5W}$C*k#vuU8)!59r(|HQ!dVsH9kDlOjj->w#A1B3v-lhAvb1S^K z4`+_d8*n2!WneWU>FI@*(q7Wg%J{oTiL|=-5HZ{+2YONYXa8u43G`sSoZLWMW0c5h|JAcPWJ94zi5I3g>V8qx=Xg+P7GUZSBr3?-J+bX3$yCR9$S)|HXCGy@>N-2xhWClWyn{xhJ z<_4Jvd$bL=Mg=a}!7|hGW;sUB%|k zBhgLE!vW!lL1y}!aKp09Er29^N=HVq^8&}l@Dform;zo~D?>SkXvtB1c3${Xf^B=s z=BO9PztBt4-@r^@1&73-u8gSTn3VEoJxXZJuRLXrcqUa#5-G^Wn26NH{OgnSlnW zlc61$=cb4w>7$I1kA0$V}M4}BFImC#T*Zm01;_gL^&6}%*0D&gan0VPS~Be0uCk(eHu^Pq3@8kg}WJkfCF z;;D&fBrZBnAq#a9sxb^LB zjqwX|1X&!1)R2nSKwhO5#UwZofiq(WCt#n5*?pc!V3vsDR>PEZ~d%;>3 zgFDNT7P0e;ofE5Yb<8Lu1U1oD3R5T5g%&r;V()@}R~T7^U@y()5?x7gyw62X5;+kJ zpU2TmAy#bW(859pP1JG!fFO<#;&q5=)Fg3Ko#Sb*r&Wv2E55{aIa(GhZnPluA;N+b z9Zf`08%=ZmLkWP^i|;C!t%@xs#$O>lgGSdxn;d#8A`*`*7A|8SG+6YJB>eg9Xo)O{ zq0!V`I2VRR7s`b(5tHVq&!~evG!N=MJw40b)2JAd8jju)>e>njwc-jz{TQ}{(`?49 zNc*5#3`cJ;E*9s!zHh>3O@y=JxFU{aZ4yVa#_*0g?&=8KQY9h{Lt+8(btvq*6?5W^H~oYW#jv7y1c zfrkw*Ml367)*5&kv!e4Xu7+M-aoodrvSRsbhlM|$DBG}dMZY9WfzZ(&Bk|zDfW+6L z3KI^|DzFoGd9nRpkVPv336oH1tZtbCLbm*}v|(NhV?g-IMPHPM zv==oX*k|G0g!~PjF*G+XeEAVg6UVt5ETqw3NPnX&QrakI#!|%x>sNG##4|0Q2j|@p zQ2woo4_O08OqUU8LZ%ptH_R%>!V>35QGY_vx5HW&WEqk=CEW^{4l>Ld$`qsb-qNLU$;;yd^dT||!o zRY|nj!x|cuVtgc7#0(JtHX!JA1#~@8)1Z%R3rcP99$8OwIoyhK?YcxFn$P0>{!bHa zB9XVo0*NMJCbsdSh|XJT4xL5NwE`WNeFz;TSsc0bM(M7ufj(a@7YPN<*wAV4y){4+ zBE5cv#VFG;5(VzsQz4g&I1qo0T z)@rI7J7Gy9izfg=gV>ho5V8V1*d=>v#KtRN+9?i0BD8_i>lh%VfxbIrF5(Zm77*1u zXqm20i$_G%4q==Lesmv3{DW@2lp%TzietDh3fwT5)s7o;q46}tS1Vou>s*Av@Icxu zgr+A3O($AF?#@ z1X-ETT#vsco-)|m7$820f-5;cLISxIqD$O(6)oG4^JYg@+rWbb4MT8Fz*F=Zrg$I$ z&yAXWeWG(Coq-2!h#M;jB>C|`N9T*fWO1}Nqj8%WWxd2TZaUu;brswKh#BJ$8g`?i zSPmj9ggpeFcc}ExrB!gm+GhNQyF|sYv_@z_Qw#G#5X;BGS6p$b$VBqZ%Hb?3-WPas z;w6SdYgjC4AyBD+WAexnBf)~%Q8=tCv)%|N(69$W`6bSJd!bo4=;bt4an1>78iq*XkaU1q3V2OJ~TkY`-;^7qquNQqm~C@W>%68 zqOYi*KrJ?5E<*Tg;G8h(5wU3y$DRh;1}&P~7uIB0@x2h^vyjJ5R0{`Ou=>Os3=e8l zo9ObX^9mqrihv5?h9NBf%QUQGr)9qon}kU?r$CzyM%@dJ?|TqR_!pkn*GX7Kpzk8i z9Mc95)V(NMP`jy)1|9+^-oa*;a92SPo9Gcm?{YkhZ?faOGES-C(3+;`nhwUo;Ltj% zHJsIGAQc9dTWuij%1I)MgHktS8ZbT@_tq>Y!LNqdrh)W9kL(>w8CM0o%<&lm=#fDJijpkpD6TOM0Uk23Tc$2%Q$;uv{{ z*R-Z$8j9`kEYU{MK-mmt3Zd!?A3~|X*bj_vz=H}Acv>_Ms^oDuMYSN5@ZThr9=a~# zY=JIzNLZd>8W-k&?8JSD8{HRg6%XR0xU7x_YRV93)Ao8n1MlHt$#jsO$X<`O9Q4;{o7+TQ9HT!_6y&XL?2K8cJZu6UI8%mK zVABSiVZ{((I&P_5G$Xh4^{Dy52wYZVp>R|kN2QP<^5lCjLgQXbWDyyXR~A6h5Rn?W zWmJ735{`j*0z4>H$HVFIM%*$eMMJ~^p;b+kXb7=##-s8Q2bJ+R*3>}S0ChR2RKzwM zk#M9eaL@^P2eTR)%KJirFxJEy`kDZ(@pw$436ODU6~Q5zy%Dl}vZ%(y@eovL=n=}B z@UqujZ-h?<8Er&?(M=BvAT;WyC0HWMi<1s|9xHD#CJjTyXlCfFm=CB)2Y6@u1ag#bsNHNDtp#BKYR$ukQL0D(^YU9Vvxv?{;Av~32QSgs_Ahup! zgeo5OLXyHH^Z`Wmkq*JOfrvMhA{n7F3QIvmldyorG+mv__nbIRszvW$;_!+;|fj;?ihBtX5FIiG#s3 zlDld>Wf?;Wal#m(q*h_RAigp>6oKL#77ml*JTa=?v@7W_VG*q$5H?s7#vc-QLz*Hc z`f;Mz%9}{W&eB^bO^XL7IPplPY@+eL7F-DLqho^5O>WG5#KH~trzFlt*0N&}Jd63{DVTpsf=7tUVaJBlh8d3}&9@g13dE=EL=>?2!DvoAbWlxeVL=NUK!*hsBcZ83`kdjs zRxSFa;NC`UrvY(Vf{qq|O%vZ^$%-f|%8YQZ6bF0o`O(Y|_~KOv1p$nXsS!XC3o1!Xcd#M2G3D96$B#MyHsAn1(IP8p|!Y1Z8M`e7~$7S0=qel{<~@PrL0sC z(L*8-#}`oDLto0Hj)yOnA$SS=lAzgq5iLOc6Cg_2cn}Km_GPn^MOGP|*lC%HILU&M zkeCxS%d3E-4Z2x)prqeh4$%7w*MUAEC4>iw-v%N{5KrAjS|HVo0j?+X*RG{gK$aH4 z8@#dbQVPNch~+CyfsCqUf&)7Qytl9##K{Yq2nDG?U4)=@k;TKYP~sRr&3JyC8{J$m zOr3=+U)AC*rGTO7ZF+nBQA-}jU=M#SXOCCl}n{bb&;@d zKsF4`NieOLSjH8Oml&GKU^|4v$-WafH;X_X7Ff7Y71L19f!#gAAb6wUsJAZBPWWJ6 zj5iV#XasGDs0voy6h8q}K+rn$f9N-Y)gui7L=+0AdJ#(0!KI4WI~Lal-sn0lj@KC$ zshGHlE|>_$d#XzrVok|mh(lFq){Q+8a?sv5M1kr=^sK-FkHAnG3>FomjSG>qXzm!x z81;$zG#%8sVtc27AOJGCD6>N5=AJByPVozj6lmNNp74mrdlF>?orkETx-3pU(?s>y zjiX5w%G>bsxBRCF(n0DSNfI=u!)X|Olry3A6*dW8H2ia6D=Ush6E!ASsNn=AJ}D0$ zNqkCJB%;U!`yW@LEL8xnM{FwyMkS0n@$y2#mM?5QHav)&;t(>jo46r^u)8JfRPmR& zC?Jkj$M{I`B*Oe&Pb^7kDj2+h@lLsEPAqLfA8|DP_CjqLHae`l;wWguRus967fO6& z9gKFt%L!L8QU-bi6SlA@zd#d4RHpmlsHV5a8sP&x2+84v=|>~$Q^dnb;uKb9WqUi~-9V0L( zr#O+K_91@jv!c_(7z$m`J0F`Gte-HnMjkVpjF1V&nN#Eeara=4qETx{ORaF+%!;Th zg1fYW2d821#h?wW&{WIl>7qzN`Wd5XaGl^I{3|Me#U@r81iOqZ&8q|vE-igstgi_! z1&rEJ!3&rsJ;Nb%M8jRoB~dPneImLIOn^92gBU!9LQ)fDJdx6PP+y0y9u|OT`G^(Q zR&+|jFgOHAIdR$J0fHy(M#69dC;qHjgfJ%w{lL`m5uoFj00xQR5+%+{{1+d?iHrg+ z^-^PmtZ`Hm_mG}Jf;%TNgqj3Jl7xe8$YXj&wP@qKB?6`xosC7JrZ>j$AUlM!NyvJk zAPX4~3ygQgiyqadxFS$Sg_FPPG;|i_4)}3aUL<+&oK&+wG6vIwQSFCuYE8y=LW`vV< z#7|aCZPE0^G%e)Xk@H6m10(0L;IyWV2P1)iwj3yiL@y&$kZ8m%67uNc>O(w~CtevL z2}MDb9)cfUe6&Tq9Xx7rpWti>()9*t|AboCQ!(k4jX3#nV9s96B)#bAjpjC1Tm?N zC)|utRYE8zU>X$ho)hElqR|q{NsNc)DC>iZmJ`7>R7P$=*ujDek7X29qPqlghX&{( zfi6{8sMGXEXy^o@*ifLy2U1YJ_`tD?$6kEVkO#X*oF!UQCgH`2aJVo2g9cHelBkA6 zvnrHaV|FYLj^p4e88^Yj9f-FX4l3dG{*DJD{=A786U_X25sB289wDuP;EWF1+0oR2 zCfI7oVW-rshLyjLCuaKKi-)EN$Zlb?MIj-F0iGzxLB~}jNik3vJ!!NBnFQmR1RpX8 zW{zBMVl)!OchJ$rFbJ%}iE3RvdIoxSERE?InDPAj?+w)O;v4iE>2&cUx(2lO(djeO zq5$mmn@^N`z%_qySd)hdewGy(j)OP4@3HQp8GDb!W(gF zNayYfdl%~#yW3Re@oc)2H>VSAjz_zUDT%Odx)pO`k)2W~w`~4NDOx}+#KT0Y`%c3M z|Dsf`CCTG?jTHCA==%&YW-beMs`7EciE;yZ&$sI&Jk_kc{B)za?6Mnukk|{w6EZ}! zeE#*C3l4H6<&^A<4UIy|$Afa;T5b=di_m!W)WHmdUAZ9GH zBSE3^Mc-bxvoEx3g)*+1RTp-`te0DCSoH1%9~DAl%IBK3JURIptKvJKvREG1(rP1v zxsVx#oOX`xtf#4criuGkCih4$nDh3=#EaB($)7Blj#y`+V`h~i8+K{8arvHfQ@Ty^ zIazi~@~Y#n^BmujIAj4dy$Ksym?8-Jt)m5Zjqc6217Yg$vWMc*O zS)7EcmTJQ)3r`WQ?{&71Q(CCsoDAFb~o9VcQKvr=H^#Qk#zPK3r}S0_{}iX=~t%c zxO+HAv%QA$#g%8&y>m$yi*_sWmNTik@NpG>_4XI45_!lJ?3uKkA#!HIPJb@#l;gN& zveKN<<#QIkif=eBkixyUUZ3E6XqcW2!Mc{SdhhgE%{9n1siS(X{t-8t9W*2qy;K6pPsT}l6E~zmCEs*ViljcIcjC2w>J-C@s$;=CnT9g|b#=13vllxiQZ7R~uluP23`t)|ago+K7B9$%W^ zI7D?kz%t+1=A+qYHMh8zsUqZ=zFwyMwP?tPKkY`@!przJl@K#HCQocq3U3Rz#cbtpW}+|9hxU2l6CI$ zY;9m&_B#>f9KMpKp2t^e#z~iHTCC7Tzgn|vh|bHW*X&ez^zy2!GJ6#1IOlG%fu`7r zo-IkwW{zt3IqFXen6`%mTAt0W+-~f*nj2kCed#Ccz&vRg*efP#*Rn459W>5TW*z96 zM|~aEMt85Az2e|4Igq=0KQ8Qr*&T)!$u_A?={2QC_9(^aTv&GKN+YvxHP;jgu6xn3 z+oZv)%&{>u@v_AuIkgGSR4ztO{x=+*HI7y#)1jr z@=sQSoIH<4@;%q)?&E2+awj_8`{+wBkdR zND6_rpPeR_L%0sTiaw&OWi`+AR{I{$=nYfNt7Zw~3PS4AigL0u_6B31sUsPxE^#@< zS|cUmyQ*fD15d5Mkq(=D<*UJ;ZbwcOY1E53Rh2(uQ*#fS zB5q~lr)%|5JLV)iVk1-BKgP4{9cPNn&QG>AeIl=TJ4Lr)W^eh%z~UT(LT8b-7T=@A zt*yM9YDeQ`*A31+NS;prmR=rxZBpPITJj-nQ6AGE@l-6=&Snp zopb%K#o8JNHq9_=Xtq3WIK&>KYT~gYw=?bH3I|njd{U#aBdEG>Z6<&HItH7tN+lM# z?(Cg(PjV_--rOH+I}#yzL*(L#&_q)Wk?Gr}lc6hn7EBo~I{pRx({VQ2|e(@P?J>r&mBLVG&=1TC&wL@y?sG-kSap}kVe zjZx$d$5pypPAWozHy1W4MmvtJsBBKrh`Y}v{P0`;m7TfacgqB?`^Vmth6?TWa4=JsO=QcKuHv7&;CST1 z<{rsDu92rldX+h=lmhG)cO2fjY4=YuBlqZ4(+ZnBQK?$Bj%vGeUsU1*h_M6gj;Tz1 z7cUrZuQR%k@oF&qq0z-snE)~SvH*Lxh%e<1Yf{Pb>PPD67ERVWav#$3zM`+96p(g7 z!r)rsyQe#tZETCr%1^$W$jcK|GZfqrOCMML*7|0dc~vrLOYh_XTkC}urjrK31r_!k z8sepQmhUo!`LdqQKDu*I{?g1I%l%F%P2{xw&9b7~X#oDZ|5sgKax4lsDc zW>0>f`;bkMl@mH5R65a+xMhctulsliTTO%as0DLLtg77Z;M_08%p%5I4C`9rdD#TD z_VncPE}m`cf`w;tp zNlh2`Ju^3jtzzF6Z#I#nwkT!shPKH(aAvb{J+viKV)G(b(EK`{qwkqrZbnV^+|H6? z=Hz?GR&K8R#DUw^$2E~{M#Xgc&iymbdxdWpntI}t=nhF7bYK+06rX(7+AJn-1` z8H3fjn{pZ=ntE~kqxF0WZoS%%Wv-6gdVF}YCdTg7>>dU0unoyRMTgYoV&hdjdx_^e zMiup*$tl@i7EE~G>!Z0{T&vpF%7N4PAyaImZKQ!CV}c{!2GQ*|z4jMJ!;89jwX2;? z93n3MoALtYFCR+1vOSK=WNz%s{eZo`kv<;n(J%LtWt|yWYHl=oJfa9Hyc9QS+#*&S zdg!s(HDl8*UX4sTYvFZGBIL4QiI9h){DLFdy0$~k%nlp;10PCR74pdXM~X!_kl2?~ z96dTc)9YJjhj&Vn2>ZJ|$Wm!sDuJYQt@a)*R zTS|a`s0tFPmFAM#v(hQgn62xt+)a1)(RdaqTOO>b;OaZQPMNozcS5#dZ#z5vC3=0K zrDuv#nNlMoK^`5qqkRZw`&<;3lqIYM69bbhoC(mwPyhN5Ut zYsIwWVI_Zi(OJZb&)7Me{X(2fsm_vsSN)OGTh0i$w&a@nSMad+Sq*%ldI(gUyp|u+ zF}8T}j-Xms9@Bcp@}Kie<)S{y0e0?f>jD%uisX~+88nYmXM4xe#6Qwy){5#Y@z@^r zs?679+a;g0Dz$cDIlkTUzNYsHOP`k( zfl`nCk2ffJ#n$!^8T%*GsBCdYntR7NnYh`tYzBIbcn*o)%1xa1v{f8X&pZ<266IiU zpw#yAX%!D_O%eV7Hq67}WMUNiq7x5_uL5t9OQ6D~pB2Kh&;0_Ytt^=4_B zSdE)BGVk3#*(zwP9Kma7nAuRapuQohmg(hN`^7q~MSp|RJy}!N-T3@nZd%RNo zIKDHl(UH{oj7OwJME^1me}8-S2`{ylwv!B-=Lgb7^rf75Wfk9Ny_!vIN#ol^Pfkc8 zT4&3}O|ot|_f}a+UoA85aCG#sbvvOb4R%*ody9itADY?F?d%v($jjRzHO^6?t#gHA zV~11V)J&Yp19h3r3XXMeH5k(wdRbp6$)!wueXYVLkz1R4>aKFo(5_roiNOlN5AQP* z7wF#YRjN}yKv=iPik@Jx_I(>Gl8|+r$uf%1Wp9Yi=)82PP1UoQW1B;6J6EmTxt>&a zm#40$EBo}AahhoUvCuB7Uhi92^G@Gh`=oJ%O)&URdFj~}yZ#H6L+a@woSQ3B^kR)$lm&vgC#IS$8MzLIxB z$$p($lz{SmAL~U;H}l(cG9_D1C&UzxZY=1t4!xBU&e$V4pi$`GJtIYDLL9P}(o`G2 zCw@ksWC)=eY@Deo#HAA%qu*D5#iy%~{8nqL*DD=qyEBxYSI4r)(l}Vskh$CLlnsR%dxiaot&Fl~dCV4PS!dVlD$9=kfg&8=QtPW6 zjNJTsWq+j7>%xgFF?r<<(K@|^bfNP?D%ET1ZB+dP-jmWxo)@T~UG2|1AMm>Ej%s*7 z5Zyhiv2ex~z6Ki=5C1l~J4JShlivm}YT2n#ljGVVo@^%F9c`kRik~_9=#+jML#mPx!T~4zUOi7)W z9%3e&iaI==Be_!a7Yq-746neKhH&Tj;C4TYM~pJHjogAJ+-ycPC+&2#OrvS;TR4LM(^WNxfh zO=yEFE{k0S6?IUcm_%glrohKOhV&|Ce-kKMXy2@V&EU0508Wtk}pm0&LvJ zPp~WWz?g61Yn6}vFsM2!?jVo~b%*~t8+l!UJeI(jm9~CZ`I9rPz7h>3_GS;7yn5lJ zu6zGZ^G2xQa)3p~3g~p)IoGJ%1-lm57Dk$S!G+1JIaxIm>da2nuZ8!)jkTEL!F#E| zIW_oZA6*AbE(|kEq*5WvdS<-rd>@otJ+vXsX9y=5rLxzEX$ah+fp4>z~LV{(d;6=4l$R<+_En)O0}L@)}d!4l1mjTk@;xZvvaQ zsbL*kn_)OCn+W_tg~;zsGG&Zy;J(74wECzJw0^p`L>#PxLW48UO`Jxc!;g0x)71dD zwVfd#Xg?M7ZYQk#(-;KyO*3cLFJyqurpkIc`EGc^A=@{4r3CM__`7vY zneh482vdM<3rJ18O zCorZOT!&aIN}f^RP`2M^MuQ%ZUHl+=c4Hm*ud52t-Z26mt7nnv!sX9;$=zCI;H2)GOHrUgbWU^g{S`9owRD@y`C1ID zCH|69>;q7d@QS@VFCEUi9V{3jr$frO7`=%yGRQ?$h@KZ3fRbNkR?o8gK=9(no#%3U z;l}c0Q9|4R=$+sx9y&V&|DGo6a`m=CXxsS<>YLKwmHs(S>9%tCp7&ik^L--ZlkI(F(8Q0tb8N>fl@9x*cPSo#6S0 zt;?pU1N_+=4um@Ng6NqR*`F6WA=R8=_hnqiANF{bQv7=0OTw6`&87^n&@KJ#QPK>n z!HGF1;;NuL^~#qSJ!c51F}F*|Er+WsmTw<04T6PL*QKPr{a}Clk+kClYsfNIBgwRP zgJ5p8)EBNY7;=z)X!4o@c$RFq8W#qu8>4Rg=IaCRaeB7Hn-f59U>~P@I~7!Qv&Y*v z=D>?|LVS>M1a2>+UdrwAfl{_#m4mFYa7cO2=RJZW;JnVWDD-#(1Q*7?aW(IPvjg3R zgx>)0Y$$0plPrUC4XNb}4{-fg^Xu|VbisqORD&O7#c8z@zt zZRdDQ1)=j%bK@~X;9b=E%x$#=jLe0p?{Buls$uxHu$&h7ckfxr=b~;{m)Jk2dA$Pu zeyu)RUL6av4|C}m?|H#7bw>ZD?=5iZwSXVX=WY;w#;O+JJOmzrOuA2B*1*rx(_&|Q z^T8pu&`jWNE66qvmUB`O4zamP(!JaUlT3bJnsP4m_Cj%B_Wo686i+^ue%w#c7o}H3+UL zy_%~QDFx1}|C~0c4?&Bvw)gEvmGIldKz#mOHhg)-lo>gY1$PtWrW6vwq3=-Qk&i!y zVX({p-|D%1m|I|5d~&J_CPoi@4HO|m*0+OmL`nw)9aQ|~YC?rm)30KJZs)@c!=BWw ztQ7b+`SaZF?S0^RPGNCUq8nE2wk8H$qrxy}!tKEGNg!0Kd9zrL46Tp2?jQ1@z?I)w z$&8LIaB2Kxf&~j1STjgVznZdOU5I3Hi+%>^AGjASrP&VUaqa?~v1AyXjMA>sz5*=s z|AvACC=hEqxn;+N2FM$+PuAW%2x{p!meVMGU~|-B-@3wf2#s?X;k-kIa>iuOi#_?k z^~Xhp=}9jrZp|$peA)=TF*m5|wwA+{pE{fT83sVPZTK9c0vR^5x@cPo*TQe}&7%A= zZSZUH+XXj{0qFV7&Sr8cAHpWvBRXcfA>L>3hh-!g7E?nnrS%m-;$FiVx+gW@-Bjdr z=~f9?3%qY0(52wl{fOA_Mgix#j(-(tnP9%-funs^0TlhXKJ+EF46g7`GyghS3%2X| z-&ZdW!&J7&+o_dK7%n_=)Uc-z)W%*87UfeR=Oa(Yh8?X?v3&5>pRRfkwtqgH=FWaIw53U14OIbmiw0zF=Fn=B%R zU}Qvuqc@5SRUy9v_;*IZj^BPuKbgB=(DeoJTD1`LCmjQ1E)9VxM|OVX^D0<=b3>f| zQ5j?(tE%L+r$Ar&0hKJ6L)PsfHa6jH#Z>D|#!p}d- z+Jg7f-}raa5_%K}*Er~;iud43RfhfBx?~95azHxv0oIfD9e-G}slbr7;|z-;86uvR z9Cj(|hL{ruVlxDxQ|UaQ}zS_>Ca z(|*56>;%CTLCc(jRUkuF%#vg1gG*^Y2F7*D;r$J1j{XKJBzRd#p9^(>EmzbjMjxmk zH(ugE^mf61#b}3On^p+lsdQ-3xF7h)Bbo7dj$3Pmp7MT_0Xv53NRt=ZU|FU4>2OvP z?5Z{>R=C{_T-mxqcAG}<`EB}kz;-{p+yD0Rs7Vj}>%7)pwA2lGn}@l|sMT=X@_J%! zN;iBds9}GQF#zf)(mDfdR@vq9S$^8edvU}mo@y^(SjRm0ftM~hOLJwGP9Xiin(*P+)ML7%n zo!|%jnmB&F0W6|Y?$ilTK=|)(lUMm<2p#DaJpQ*E?w$&$N=|Bpvu|!IyY#ignEdeF zhXrNuPUi|!>A^mDk*^ioTGj;PX4s=E%n&aJ)l*wO>0$%-eBEcbv>QD@P`VG0CuIzIb`>r1|~ ztoPPvE5wz_INg*Oh6yE7W70<|eEs~@TV`7a6mz@oQ(4yqKFK`}zaCe^h32iVUThA5 zlPAjuR_j~gV5noIY-}S$WZu$Rxw=?Ldsa{@#zFyJ`^#;An7To8DO7yAyBAiUuM1jX zJ_$bt!+M6_w!wV;V=E6jGK96XZ&lya3ok`3&0Q;@Le$dAgS^lEzgExMnQi;pSlj`z@6;6r_!~f8n8I-(nhO5{!z5ZF$lws%`E0j$8!&gh zpf06UL0*dK%BwfS@Y_RH?73GiJgef*mBsUd(aoXn_tF)36_r7EcWWOcQ!_+vB@634@Zp=w-G{4-lWuHTc~!(=MNb6T+mES5sr9~u9w(<89-M9=%&<32bg`(>En zMGbtD-PGdzs2#>X&iPMTcYv^%A{XDER=BOaGE%A159T4G-6d87U=mXGW^#Q!e4XWs z`YG*A{IehR`Y&-mXHEX;SV(}Erh61@7J5MN-l@AS<-Ks3 zf$AClf&$lBpKkrT(gt1oZx?WyQov%{@0q!OeK2^&q1;xC49Q%aH#`4yz%7Hg^Oj?H zZh?bmhGi#6@Lx}VJ5B-JWPY74hY=_cUz8McZUd7~MUqCZis8|9W|`8hR9Lso=;Qe< zBe2Fi+sGT41(Al*+X6UpK>F$p*Q3x14eO2nY9&{~l0Kt6zF`?lN#O_$D7qA_Mc6h658tO%NGq(CyS)0_QbM7WqA>5FXTi zF@VwlgYP%DmYT%?>73$I9r+6IF%J*@BisjSnqkYkYA*pLgKVG>L0n=1k3xHbMk8Yf#v@8a^t>oaK9|VQeDsjZ(loavlpv?#0Nu; zB{!%rb?p9zsYBhM`$>KJb6gh$Y;7wZSHnJRmrH|K$}ntrc58akyaZN-n*z9d1|c?d zTS9_{>N%4@{*?44 ziMx4_t;_M^N#zjeT#94!w&(;|=-p?rsSQle+Z&$7dN3$7_U?Em8K%=~J>E|@gOB%= z=s%uAFygV6{P;@?7;lVt@`Jk-^e%^=S(a%AKI4A6DV20^xwah0{JjQDRLW9#?3$o( zAozs8Z4tEpo!h6cUJW;r9U~4 zetY#z{EERKl=~K*{5;zWWkI)ccVM{W`G@Ln1TIy9y&F|}%C-(t6w1w+6g%Kw`poZu zza6kXqHyu@mq8e9{n)cvtO;J;s$CK8qe4;C8LiJpyI|(Qg1Y#>YPf{9b2hij!RMNR z_Vk=2)aT#B9%znYl3zHJ3bv&lu^E1s;rOEX8*|);UpH)ioIBkH z-wy;dFG%OY;6lZG-oqwHyM1G*fg=n2Vx8_@DXfGdnW|A0{xW#@?x2QPKqLIQ!J=V} zb#BD*F#+BvTyz&5S6#Uh;c5J$iT>seSS4=Q{ETadKnK;iV<97;+ZA0)AyYs^^|Jid z-QCbpy=8ItXdl?ikM|zUZGx7VlbfCCs8IXX=4`Sz1#Z177~#M=_xHo@Hy^|(@Vww@ zU!gJ?R`Q!p|9nn`FFF@Vv(fEfIMv5f#*X!69hcQv-w{Z%Wvcb6?u4NXhDhq@FkE^p z^7|=E0a&xg@PrkX!TP`-&$X|lLnn8|`+a)N;Cr>zuNVK_Fs_3+Wr$y_W+mD3Y;A-? zl-jXVSIMv`*!2@TQ$5&=^l*B`QenGfJ~c+-t_wZyLTLn)r!5OVqa7)w|i zWOse3ko{9q<#L-L zCcXu7eLwnd>d1y>j)_0F8L9B%>q@x-;sJdxL`ff8TETlHk^bNBCTQ#VoGqQ032ppK zB}1>u;UyG=ISrEGx$%*s>}q|Ge&ue+L;4o@k+TqS?pX`S^v>TqHD3Y|pA_yr3cdml zLOU5#JImqm9+r^nTU%jvHL#7L+8qNfo{i0H=!c9G9OV-y`r&Pqdf7c2Y|4M?ds?fS0*jcz0ueyJ0|4o{((^9}5}ox&4(Os`t>Y?^qWoe2!qz&T0p> zjw_4D3ku*&!O_I)3a#+>(TyF~*!!X6MhL6b_jWj$VsHICqYF}EG#tx09f7Iblx>c? z3ie<0e9iT=3vxI{=TDlJ1KabE`k=#YV0Vq>eyVUcWQPfTv&TC8uz7p??G)@6*qh&| zE9Sy3?&00T4|73wY(E$jv;%QKe#(#_!}2Bp7n`GG82XhZtiJygWZtfQB-UL4%@14% zp~tPjf4b|z%2+2&U zuV3a+fN3OQDDz||Oq+{d-u)>Dh91_t9sS)6241T=ffc<#(%*5zN3IKAt8^X?;c5W# zq~hbvk88l?@AnsGvL!$@Qnank!{>j`bE#%$8!$cCSr|Tg1%6%cUlhDP0EElN2fr4& zK$mgT4T-v8NNWhp7GT1DjPN^p??Ep_1&35iic`T@>E!yq!Tr$R&*intqZ!ovKV|cm zVgGtDJ=lnM08mZDCviC%qVEl5)=wvc0M+l+R4(o}dXBp{yeq)=c7=RodKsva$3fMx z0cK^7z-nV5{QAYh+j@5x{+QFPy7MDWwCnk3i*zL%_%*Yu7xBrUjJDsiW?3MslXBzv zk5ZuaoMo-P+W|dUmHLKhmC#sO^zD&r0_Z=^zUBLy0uSnhl^bR$klngqIvY_7N>4Q< z;`a@L!w{>Q=5RaIy6p7)b|Vu8daYU#m@6UQ%z1X}yFqv@AJdy*Uk*S2Ms8!MZ--sA zSyyzu2SCvBn!YIO2<$!fE%nf$LdgB&a&zW)CzM(?$F8}T1E;2izE@WUXtkzIHodF` zp(;8TQd$Z;ateN@Al(c~LVOfCwiY=2@PpVBabNIBFf~j+UjU~q(^s{cd*Orlv!$wo z1CZBc;R$lp!0d8k7pr_H#F>e0%GzHGp{(s8pEfqafa3E;qb;Q6#rws3FtP8usGJZ-n!K)DdgCnMcV8(naMx_$hYl&uk z@meNaJrnoO)+Zj6pQK5@8@>YHGgK%=J@p`%{<`r3kqCc=bxFl}Eua#6TVPN+1Ne`Q zZbYC1s#W6Zo;vr#Qt|Hjbe@F81kwE+ePd=Yuv1S<}=V(e%7Kt|@h zRk+(ANaAqVTGJ4?X_x%5ux^8M1rFSS8;0TF-%SksKf6KuVARKThzHh19g%!V-vw^M ztOD->dti86JD$G*>&QDJDH5BzVV>$hUpn0Z=d=>G&1vKP7}K6&+1&$w!@Fx9E7U+g zLt}WAZ#h^uovo7m(+1Lp9Os<++91o6G}ZjF5Xz1VBmrv^sEn5yyR}due^#PQj%Ng_ zc5Mr1lOqH5S^3+%r+pyY{v+R8yBVxSS`8GIdO_pVOL4~agRu2h@|S4u0+{`t!`aTz z314n)+7)vKarE5733=NGpmsqxI_xhM-o>+iIq{(nHdtH!2+*W`e`EVIjIA)OP#)G7 zJO~isGs$dBhGs*lAyp*`IPvT~si#m5l`qpoN@goyrM1^ClbH(SpGpiIYgJHj>d#10 zU;{KZGh8ruUJMzQtP%H4HGyZg?@q>B9Z-1YS+4hsVaQzexuDEm2JWF5c`JrF@K}|@ z_0qpKSX=DAvTRZe7r2DtBX-xqD>>gkzqdZSC{JJDmb+Lq2l?E?T}|1*0k5B5_Vij^^hLy0FOhyZLQG{vCFmtTt-^0q0cb;5Qv`X=PQJ8}9>6wZU&fC+c8h%AwF-XL=!M1T`Sr zDDXs8O-%k|9z@K_P4$dihM%7Ha&h-5AY?1|<>*c_T=b}>HxFrq(Zv|gT}#d2W|{bw z(V-r8RH$v6y-S8;@|eQ&qYdI7yx}EG`@qCy{+vcu2^9H#P8R(*48~{ND?JLj;jQFH z(Ou?!P`U6ZKKNcHL@xR9ee}Y5<;+j7%EMJ~_U`E8yQ7hys}G8isVepoFRz*3l%+W}Q7 z9Mkx@WyPcq_I@hQ%Sx+)?$i~x14^Z!@xs`X??Vl^C%N|i8zw^{*QboNp%$2_GyT%n zRSg=?l5Q;qBteCz(CY1->7Znl*L+nLf8Qq)!1gH@9GdooC-&CE^VSm0;KL2TQEL>s zyRZ+GPdFUn((i=+rSQxA8m+K1Sh(Wp1q$qTWtS~dqQaRUY~e=iLy+`V-O<*rA0CGC z4;Zo4f{#rN+a4V%6xb-Z{Oq7WKfOnp9%nz0iRj4S7jYow^8J!ndOajuSNh8p+yfh) zALRTXIsz&GEc)*r#d_i4ww0^5YT$s}%%a=*Mks7BW3K1ygP&{`8hMB_yyLlc=3W)@ zP#ai3Jo?=Z@*CHmQVyyIQmowlT}{KVweayNLW2VDZO0gH{X(2OeQ|G{VHp_p50xee zw?R9RxiXj52mSo^BKv~6L2-Sd%Q@~QxXu2TL0Y*C?k@#1uxgTFYV^H?%)LHvYh!QK z{dfi5AF@en@fn0Oe$gggIcadaM)IOdL_N^^ic1kr0}x?KZCCE-2gf%8To0SuVB3dB zX+lICY2Kn z=j%m4dVLi%#Vy!s)OEqg4gm?bzH0DVrr@#&Yww zP7qSjyu)A=4m;Kji;lOpz_wb)TmZ`l zcS-JXYJe%ag}Y$acOs0$qb4AGWJteG}c>lz{wy zS=h;#e3fo!%w2N{KV1)l>1FJh$Lqk+r^=y5g9_I@51tv{(gm|0=7s@25J zR>-CATxe8B{KWgm(O=Oc5bt04vPrcZd}k_4u8(vM<79r^^z0zQ!}w{PLt2eAi1z@^40lfm?g!8NA$J8<5LIT^@Wch|Ct>bfjGns z&HMXqAa4K0ne)nEO&jQbFr~61E>SXj=5L&D4+QP`P&W|K38z?J=)FBd21)L7HLeZq z@V&agcmeqigJq>_u8tjWmFL#F<8oAJkBb=kUPA%HUkCn1hPMDYKhD7GVGfKA#vRd! z?SxOH;sw*hB4{}JP>H)a1I{s_Zn>Nc+hJVioy>C6vM-zKNdj9l2BaJo)Jkh&{ z<#;z#-^|Q6`WJKVfIev32S!)vYC(O+o8F7^!yu`pt9M4L9{e1m)>hs6p=jJJ z@IqA^R6ai@Ea{#AZ6C+-T8Gc!&*SmnG4_v@tA^~2y$$d%f8F>nD-{M`-L<%DnG3Zq z>He|0AW59Z!>h5bB`1141Zl7|tEpnL7i*{>b#aMDWF-xS?BbE+2h6}=DNliLaL)<1I&as)%`(JQLO zzUk0p&HpuEU;tjEOg@#C>xG}w{bG7&Tk!nt92m4~fr8=F5!DAMaH*xQtp(51661k{ z@%%nWiAr@5vrB-$pJ!C*FLi(~^`!opKU6r&rT9U+;UXLiJ2>seTM5i{4ID2w4a2C{ z*^m;c9BAy_I!7KQgR72ECUa;%WSx71?u{LgEU+-Wmm?o;|4HATqeg~!QtyU)cwe$8 z{_E(DOM|@~oQs+LrEs&9FGp=>BXo^jG19(w;r}Q)?|7=)KaA@kL`qSLM3jn>Qp&zG zBo(1lW?6}{H`%Ll1waAy`m^)-iQC6woZ+mrT8+{p)=%EgAAM8Wc#{i6mYt3x))yp=~(x!_v2-# zsFmTmPxi>6O`rDN&=184ne*#zUT(xm9==~$H5p)x$W{s9t--=7mFd*nD!kvi@oqiQ z=hb!x7j!stwjde7bh3)}tCnWjkJZBsSu9_dv-2 z@uxKIhLlb-M?w797rg@40$j)l)Ap|;_mM`-C!-cGXtHl(tp#jzY26#6568VyFhwj>VFFz&HW z{dj9FbZD|t8^uHL!78uTYE>`}U(P+tl}hFkTM^aVZPhrnN}Qtqi%RsVna6M6R6s7T zdvRPd2P2$ebDk8brDsf88BXjWIOb7SgV(c>CN{KiSiua$3avh?}!RoFiqreWU;{*0pa~Tz?BLjsNa{BIi8cS zkKZqxXhP-VXSdd=RUlye1*7&*F(Lw|7<`_Rd7R@_PafeU9L>I3RXNeC z4vs%6e#z*O|6h;c`{98q*5-l#AaGuLZBI!TfJ zJ4tTa=~byH4;U*@Ap4tVZ+OuGqZY`XceA|IoQAShccRzMTZ(UO@9{+1D$yoHbh-(+>t6;NJ)%SR?v}Qhxgf-D6W!7wRR@d4QPJjrOf=4Ej7}*gLzZE( z)9ohNpA22NmWgg2ysG`wNwQy9$wf^Y|7rsF+)g|C4nG{WEbV<(OG7jFlDGc9N*uc; zaq;`!atP1%ZPFAg!jE@1Rs7D>;dZ#99`|+)Y#5H*y)m2Up}$^fE0Vn|(dX@Cr*jkh zo!~tD8GE%<{k0C?^ImB2E!M(!Z9`vY(MvG zWNZYbR^TObVmdmytUur5X~oeRZL8Ph@4v-=WPbvC3zqf>tt~x4L1+E*$Ht1pAMZXl zkjB!A=10~Sk1S@QVZ&hNk#lq;$Bl1w+ggQie>?XR^XYh2vZr#%p&mhb%2m?m&U-* z-1GII=VJ2ntM3O-)}ZRFkHcA`93=5fIaGL1@Q$^{HQ`!GFk`|~yERD| zKdXIujdLr0hfVL<-k%QzZtvWn@g#)*C;wAXii&Hdqn@E6rPz7Yy=d|^;bCN)V(K3k zLZACz!|DQ}quMpPWIv7s^ZTEAbD~tRo?_rD3L<+?koHxJb*<2f5|nZXs>ip|*2|G! z>B#Gl_oqB+f?8PTozt7>phR7>7s;k!eY1<`i8IcK3geiqQFg^2ri;55tt+7^%yNi> z=)rNt?6w!^b(rxod8N0v9uh~D{TWw^alH6GL-ZR*7$wLZQj2nhQB}m~SHj`?zcUTi za%sf}m+}xNO)`h@S~Yt;DFE*Se$HrepI+EM^kf@rIZRg^{^$++pyj4+-?z7o@E^QI zalb_Tty5AA*9I!F>~QF{&9^2*YrYYeYO2G_?bM%-D#!ae#3N%Wkqfm`lr z_I(buNPPEXXfA^AUA9klX#FL=S-qC4e{?C1kF^gCcQ+yBQpj$7lLAz=?)q;vV-+IK zHFVrORSc?1efh}MYN+OaptA>MgClYNoY;T4nC;khwO}#>{>qCSBhg{7>#)&F-cEi_ zl55tBV^S}LzX<~gTkg|y{5=qxvGu~?>Iv%UOhP2ozk z)bGLX zziVxR$Z|Y1Xsad}D-w`3kXTdD9En%oHYIa?twpO8&v4kzOtQDL@~J9O;oR`zl;izi z7({LFz8_SM<#79iiLM4DZYz*xKNARUSCb3Jg6cp?`B9n2PD4RZmSZ2$5vBHsP6-#$ zux5o)z2|H*VuSYOZdxX~lI~TD8jngO>@C>I(;kbW1-m6zD!CuHHr7tZ7UFZYw2Oyy zJuYg8-Wubq#_u;Fl*l6LjiOcKS@LLsUM73pH0VVzY6XMSo4=-x3He`!Y>!Ap7jg^B&J7 z3!rglPNcLd2cy%kz9nU4;8<3#Lh@g79{Oa*z1d%c$6Wj5SabZbr}|=~e(qhYr|NCB zcyb+=vv#N*m@0+mc^Br#jrm}S1;yz?1C%FA{!M+T!LjO>-}Pp4z!dXr?^E^~#Eee3 z1YWO)*zL9Uo{Ut~eXzf2MRYz-3q@z`nM%~AJc*UwQ4QH)>>h(dwalDncOnpLl@3q@)juyqh?$5r~0Kyq=H&AfAZco9X_~O3Ub+IVk zm@52$=-{=u{`D1zPnh}i8NaRpI2mtL%f*Qs8p65c{4P9Nr&}dkhx@gz%C_3~ z5K*AWsNzjtuY{88Qn9r-Dd@e^-=zsz{BdiN9+sm$(s|{SauBXlY;I{@p&|AJB};Uu z0#|)%~p;?Z&FW%gL#_U0j!)@|46 zO3p>4K>*uUqFd4H9XB;SPlN@3aJsJ5}` z8K{|~SvTV>e|iNjo845qR87aD^3R(J&Q;^kNpTTvZ8HB<>uWNP=Rr*Tk%FEM4MTd~ zSu81z(2_mqpHFnFrzN$lC$Ci^i^gFaxX=KlMMaKJ=Nxc(`BA^k5Cyu4^#wV@_wl-; zN^VT{92nR46c|SY;B%DE)B(-A*qOFUvvVp9wL&E|Puh!7TwP&m(~<-m(|%(;PCCSf z_qduLX+q(|2d|Z^eAtEP^T=Gu#qpHgvI4J~u!}b5I7)c$6B`zFJqzm*9JqGUI)V6f zDWQ8@HcgvT)kN9u`6 zP=qA*G3nA_+RNwmi0C?Bnq_ZSk@KkOw%z`($I8IE#nb3zLK@2NC^WM?2siej|IQ))|a!&dCaw)AG~*tFSxvqChE6-sN>Y|Fs7Yl{=N ze=AZ-vy3c=Ugi3kPsWw#1D%5;2%4OQ6!oIz+9zr7Vawicl1_nK__|9cW5_)5^ZMBH zJydwarDnFr=3^*DW)0i781AN2IOQ2m+1DTA!_N3 zyVgg-Q?taph%+Ys8Lcw;mS-@YulGB1kLVLB1s>hbn|JemC^%*|J06% z7e2Hj7QE^~?GyLt;AA(65+ymBHjP`8l4ez4J@A|&%bbVRXWp#gZfqd?!D3CBdl}Za z_AE@&nozS|wkbQM0S;j=b!PnZkf&hoUi>Wu4!z5HclsN__w)09-N!|6@_hNygS#3! zmySd|)uTf&jP_OdA>livUDf7>?m;)UtA(S`4j1^=S}a^`#)52mHs^W@TD`TS7fv+e zIZvecRh4k?Ej)B;5T!w@v3EmPt2yDi0wbBKT%pHqXuqY7hUD3&?|-eOlYKMT?>^BL zt%DVJbGki*u;{15k(RBfRh2VwYpFo<<(lua;$+`+lo|`Vd=1IEIa*9CEfAEIiT*E% z=;{MG72^vP(71K~eZNo=M7>s)+lh~TeRZkNW4jm>{#1LBHdTd~>z5ASc1?ibe7}Ah zYZAl@~1`F{#yL8l- zW!N&TEhl+_FKaakuVYhiccP5wSnnMLJ7o*2!LcTB@?I0sWi8tet!ynv*BDFP#s_3y zXx7Q_{$7t=H71hZ&edb?rKR@+2a;Quxw5Ea-hk%SmpQkyk+}dnhV-cZ*ncUE`zxm@ z+Q$w~-qFp)28p_r0UuAaL@j+A+DUXi3YWw{Tm?FZ-lx{dq~mBDWi*@oUczlwb9`*R zxYDR}!@)WYzjnwiZdq^vcVSA|HGxn>t+D0bYD(Ux>DSk{H(kZ@biv;C?^Q66GK`jR z2*ls=UG7mr(co-apVRdx2l?N=9$DX959MD)H7>76zD!|s=VAT`=-l19HC&4dA+EhY zPZ6Dc-}TYuKr&bP_#CWmt-p(rPrJA|MH2DOXk4v{QilCzMP*6%DsVVKYdKLX2L=ZU zqrYq@#E!TspDCipucLqep?16$N{nlNUa-u-O0JWag>4lomywkZu;5_##enq4L z$HSsD4V3TUU+$9wS6cCX^~{B)K<68_;97Xp3YQIf#eut8v*)d163+e_ zaxvH(4YBJ?^^x*4T=vzpsf(_~iOsd{=PEN`tE*CU`DkBX2rGv3F}nKJ+EjxigrrL;>MYkH zRnARSpWg}ao9$_CyNAR?oky2NDiJrBtSa-J>>0rnleWn?;#azskMC$gPG7T;V4(bd$mGJb}-d!d|i$~Ijf9V&9$IW>QzBc89K_S0$# z7Mx1D6$EVHwm#-pZB+@@gi;yjnaW@;VQ@r>oCCAm+0`5*zg6#5mgQlU4I4MBTdg~Z z-pKOC*EXDd&V^TPHzq!>X5W+8+0*Gb+5e~cCgG*Lerd?;VpFL;B^zXkm9?>PS$2bn)5se;aVUmw7)_l5>P z;f6aU`csA<2V&^o?d;xe!UqpGDzJ;DfmG z{m7R30FdgxR^*w1srdOxE1i1m?_e^%mrFsZO@5a7*EDcOu4gWbt45JrJSWw@0sU6& z9s#3;c)ad{qR^^l@alB&hWn9yPGYpk^1BB-Bi+o^U&rF(yEDIT3Q)oGLsiAYG!vX5 z&Z~Oziy%=_(L+lhdDsc%YRcI{@HZb5Vj=l0WdUb1lVpypR@QM<_@2_Cd#^kSm$x0>lW>}b+oDDf1$g3MXg*9PXNo|ab4;;bZv)&$RKwR39x9MCNp<9Y7T&bK=@z)!3bj(cM5CB^^h&sC^bgcx zLI2f`U6$o&^4>QTS3~?Y&m?A-?X3`xKKw4@DHX+Aqwf6JLvoAm$B)=PAim5CAwhNj z1Vrvvs=Y#l|6dsm1sgznh6yE(+ULJsu0* zT@9NA9q;qkvoW=;rECYuBVefUipStnAj>nw0$-W&q-1Y3_y&{YwhB8mjz(ifJU!OVI^F(Ue4@vo>RxTlRaXSTX*^F%D zofC);^Ca%llR|WshqK>MDueR&i}c7>F-ZL5Y3O%07CHi(#>0HFpx1F>!7Eh<>i@}n z`8`5%Y|6Qp?0F+`Y)k!>E#8@6dh6$IZ%W5khGSt;9IfC?f81pTSpmI98lujJ{E=n(}k85;Ed(ozaBXdT@G!^eSo#aTAgoZ=y)_(5K&Vtg^4Uux&fz>$o+2P@&3*v#IrZvH*l%Nu?qm2as}Y0%=lLk^ z*jtY>%h&nJ_twv7c)3M&PJ=v`tZYl#cI&C= zN_i9alKAugrK&7e@sjgY=Bd{`mnv{}4(zzuP=~L+X72Wf<4`q6p{kwohmy?xmkX;O zBCGj~j6{3}yrflbWWQ;|%?%3mNkfF&Kc4^a)}<2Ujp?ml_9}V@iME#WJY;P>h_>s>FJe=Vnc;G-${aY?U6kkIVb>c1l^1bI12$YWqwUPUY== z@POnW3mGqtzn`v!gh$fdtsy};>-V33Ke_+c8kV}>`t1)!t+13wgol3`w(xR9mE6ax z(wM)H`+|M0ignc%f5JQFv~N+UfNrLf;-@FoxL~uJZFuS?21{P8{5hHex^Sn^^RJCy zet4;J$JSgVX>050P}1?eopWwa; zn+2T{qYEti(y=g|x}R0G5c9pQdgfB33NF-v-SzeteWe!sP&>Wh zFZq1zvnr|=vdvKpuE8P1nyUp}SaeLIv z6P4?=aDR1#{YLr&RE1pJ`P`S})Rv0-7N+trI&^B_WhaI72}B&cGu!|#{eZ$~W>>sD z?ik{tPr*5M7v;Ab((yBW-Q<-zqPv8~DgXYHiCba16E^w8_i>fc;uma0gU+AN??Usi zX|r6+W_db_x`)0=m#3h_Z&SE`I0awsOc?onuE!7ItY!Z`IzA{5zTzSrLpiE7UK0Ly zX>@hQ3ek&pMfiW0kf_A@(x%@|A+<0PT6PoIS`60>8K-y0)Z)^^fY@^F2vi%sIqoY< z!_+q}s!3u6Mhp}3o+lQ%UR>QHFCWnKsY;V#*o zlCfwIiBi8to=f=-eZ_CX#Gk4RqT7X46 zf=gM1BXG*!WxbW$drXEmq!Y6t%5CyrUv3szhVyij#k_dy|Oam-H2WH zc<*+l)Z;0;0c<*9^%_FwVZA@Vw?N+`9*T?99?lZYgI{sQHnd48b>As z-8}>oNj`mMm(cHrvQ+SLK5o$_`ddu=%ajLh1*m48K6tZXzPMdxVSULtb=e#nJ>9C2`~R8CcEXjSs^4Q6b_}3_v3P4#Yo7{WZV}$v(D2m z4Z6;e3-8p+@N(p%{y#Z77&2}-?umMU(G9Lc3YX&XT66yF9X1EiPb;tEYHv<0^ra+>oA2UGB)A}E${rD2cT3(h9zWA)?( z&5Fo81cgyNDc?zMmpY#A-A_e_-5tY8!sB|4{Cw4DUk3IcV<$N^h#s8ABm|&tL7(#(Eq+e7eeUvp#k(>Uy# zd6gMHQ3CpzVZR53|L0xe`si+<(CiE->62~6)2)^_NB2_^_=Ihb%lBHSEsxnz9J8RW zM43ED&Oz?08hlOp)d+Gj4`vl?#ff-v#n{7PSa~h=@;B*K2;Z;vydkat)2avmIjyRK z-o_*BisbY3Rky=7ZC^G9dS5+>Cw{uH663XvLFB%VaWqI%^2IhkhO^KA%Rti~p3*yp z<*>^O`=O9Qg|NrFy*s4hk%xwd5h#UyE@-* z&L;k4g6Cx$#cD9D)_&}%mj>gVHp%Kv&8V%eN$e8LM5%4V<$afnuvSLg<3I`V8LFSu z(?SZtwPu%trF8~=JxrdqGbFtg=al7HOL9>7TcoPdf{GB&7%k}y}IANKmUyBWPwjfCU$* zIwWisebz=;fMYInntnVS)w-3nyv3#1Qqn)orcHPjci|nE?$dDaOHoi-b1oiiYD?c2 zQw^4LPqvNrePHzZkJ&e)Y|vG|Zhc0$bcdCH zuAk+jnu)TtDOwbME~`OSWY=wXhPA_PP$$A)B)}>3K-n z{dm`ZW{pTLoT)s^MT57z|Gbi68R{imxsPox#~OQMhHv}mNasnuD^i?_kBa-OGBVSU zRcCg}#UmVdYqDKz-AFH0gAv1V(!Zd(jd4xsZ7LqC83td-DZ+&^Z}rT)e(tHHHZu*IW|*92dYj?H^>3B4ZXxm&=&v%#&)axlzC-OU>A4b@ zQD0scLPT(!ed1Ue_J}a)b=n3o-LieLB+g4ISQwP|@_3 z@$S_}(Fk7hTtd=tV*l@BL$^)7KY!@gvzVF`^Ny4`zG8DvnsJ6l} zN1TIeLo74|l=s{veLYe;#zcRIM4|udAGbg3abV$HYqnUF2APM-^5UyC&{*T3&EDLI zh5hb3)yO@mV9{=IY=LkTioNgZ-czvB&Z+KvDjFw;x2d!=)FZKDv3q-dEdG;l`Ca_C z8Xh~D+O7p%hgM~IaHmBxq@V7T`x9G_roAhrl5+ltcq)C~$d;TJpJMHfxYgo$=1HSn zJXN?58XqMZKyrYM+5g4KRbjvJnUgsfBbDn6{h5E>~bEZz%cKt zc?&t`6z7Yanch@m9p#(jo$5N0x1@d;>yCg?=R~5RGU3=1?dI3~B!2S_>x+vRX>yG8 z82Ah9cbqN6$vqk}OnlW)_;gc}eO(E(+HOrS1<*0%^4?-=HhDf6Y8NH!Tp@LwB=FFggB0o|*Vc>A%h;tBf_md35Lb*1md}&;I+ZZ_)rm9nm*s zEpe+&%;2Sx@$2(e0Y1>;D>t*4cKR(d5Jzk&TU_| zcRhcz;PkDIQJOIgtDn9ZQ79(-fR4}L#Ya|<>5bBkDon-U7snbpJc<8z=J&RmLp8+b zJ~BOGTY>G*W0I=Y*5bp@)c^L8oYz7Rj~G>f=nHq$q&~!zLP~wIbC__g-h5?ea_;#< z|50*I<})%k8kYY}Bz}zj4QHlSccS-Ptt_e+i6Oa&^cy2@TR=Hc@RK7p54xAx+XoaY zan{SL4Rge2%2b*7(4Gjxto6?n*0Ye*5vsp@Aajh4T;WF&Zs!}oG`*fV=LzZi5dR)yJWC_}EBmbF zZfAl|@~?2SdmX&{8ym9Z$UeO3S8U;{MzqFFbL=2_?u5SrvTL7Kq9TVqE%SN>@lpG> zM!m{`{fi8RUUQ<;w1r5#&Q1lxvCGbU)J(X{p6Xonk_O|tj?2q>nP8nU?rXY6eCk=| zfmG>M%-&45TPEkM$x5(ftq1YFj{Gua2&jXl{wAhaog z(}Hk@`^Enb4;1A?Oib8qf|7+miNyv@vL7;gJ+yy-7JM@vO>&&`LB81Ex5K}PpWz}i z6Gw76Z!V6!3nBU5b0l8eW<_$XTWH(7BOl_^=>b)(kTAr#U0cP>mV)HizQdQ;f^jit z+Qn7A3^IZ8i3bkT@N1@3Y-`j*B$QA^7-Q{Gv(z9G;7mj3&4=0#h!1REeBp=~(Y->_ zybVnclFwCf@@5f{Dl}I;R%jnq4E%I^H8Lvq-`JBa3R2klNHc2*>} zWPepTTWMc3+FzM(;7KdQKy1+;ex7Jxekc52zmQt#^CB$V-xV^H;Ei$1MNcUQ z;+wGXMnp1HV9%+7lhG@cNN!{9GO#U&V6%(l9nzNw<1WqvPE;hZ$QSedA&<~(|z zhkKddseG&??;REFE81m%u1xxu=mSZRem|~jMc!YExL8n(a0#^84l0?{(2z&Dw^jEW z;qlW>F}lSTVMJ|4ZvW|4?9|L?6Y3R3%|D9kHMs(OI`OlEljIqOq;Dyhk(_~G=X;-B zKQxf&uaiybqF{%U&^e>f23RWxUB5>9zwGun%y3nb`~QIb1haZJo*IOoS|a%~>DAv; zgM2IzepWtzpzJ<$t*&PoHj=qFBrnHhJQhdSO>@ z=?Q(`fT2gBuf7u9bd`5CSA#&kMPrj30EXJpSPfO~sw~2XLlR`9B{DLb{0kr5oHOV4J)nU1rh>-xu#gmp2h^`dGtJtB7XgS;rP%D|`r>b;a_= zvNmWB~=hMUE|5g1LScXAwxm%t^L@&L6{Li0?2q^RaxWf9Fj@P-Y-P)TTU?xX9 zc`e~Nyx9-me;RflcfJ;9WYF_5)$^m#rK6bW#-I3aH>o3`v%|k?tOYEQ@BcerK=j_D z!`cS^g(#b|&0qT~4zAUAQdg0A&@fY(J?DB8Jo;{_d?h}?dgUa+u%ryw9nHwr8l)jt za-k>U8_`+UNizwP`L^-GMGwD(c!aF>$ZFM42ld1J$rX(T{19LNJh`eFAM8GF%JInn zm(fSAzbeFU(9q0dUY!TU4M(>vUkF4)p@2dY%>uhtjhBW*)255CP}rjaHAj z;Nw_xXl^0N=Y@YsT4tDcK9w9bOyDPwq|CZV`5u>*aV_=UE_b+=wR*cJ?=j zUKU_?lGjYf13h)8-~6gfgJXU4;>WkK=-FuWy!T`d_C|E(-)1j{SoE~%>cC9=<(=Dl zMxqh+3uRPM^IB9eKKL2kOUD8Cbu;UoXeizg*+_k#j_Y+Fl|!9KPgLTv(mH)J6bBQ} zpKxC0lwWbD?Ca1W^h?vyHUy$Z?P44NRxhfwcNuE}+e?U49b36N! zu9Lm|THf|wY5$@j7r@J&y1oWRE~eUZEsZGFJ+#wojs^)v^G(Z1c`%Z*{@kWqi*)Z{ zTREOEgd94R+emcRSo?a@fwD4Ota!^V%~lVO@{aj?3MEMMJd)R%NI10jlGZUd2yb5Z ziVvi>bH`rFuRp^6*gid5!b9eqQ@oi+PLO`Di3}gLCaW||$z~U&uu);RmF=uWX*qoD zInNdsN*L{-Xiz4CCZ#Efz2L~P9JCiz!}MMm>@5pT4qFC+Jwy7*v{(bA zE{rrqRuO)l>DSjY#@VoIy(#V#p9s~R+!@YXX}Gd{$nWCnD17phe`WJI6@BxmzwQeX zUB+#vN!_p=cB{#K&L_F9-jAK89*(JS8-K+=eJ21i3@87~3ZTP8{?E%G;d12l1RuS+ z)PU#VCzcz@UeV2q#VwOL2zZ?IL29rP3>}dIqVK8r&=-@fJi}dx;Kl@zjN{6KOg8T)uBqT?k^^4F=Mp<@x!S~Az(39Er zyvm!3v}C2g=fqd@(0x9#`Vr}c^=|y@U*n6ssraOxp;XMzvQ5)W3BMX0&9H-+_+)O^ z{cUDk;p}7T%5$R`w}+7JsYcWvr^`m34Op@eefhkn9P^P}yI-@0lm3*vk;~Tgu*i-x%t)tV%*fephM#a! zTXLPf9~BTz?^f(6TMNQElWsJdM}w*J!`i3;!XwT~ZFMlugGRpB><4)Yg0h0*ek>Kh z>lG8btY`@yIdZfeA1lM32esO!B>zyt+kK&*@QjiLO>Z~lWMOc-mVi6yTW-s|Hsu=I zgdXATeeYC^@2Ls* zCU;o&_Rn%&NK7 znesK^nXcB`9-=R-O!wZ_ApIa3jErq=X z0?;;{&BZoZY}QecRB`(G@^Scf(=!pHqxd6Ltg%Gigkf!tp@);eB7D zLF>ufvqQKQ|LG0?_olcR+Eqir4lj!FqRX@An0=d~m6&_xSYgGN^}5tp1pvir)#Vp2U49#KA_(=w7=PG>ZE^-&N6qTPh;2 zW=T$Xb;k7{hC+n5Yz}|trW%7Hmme?ZkGn#@PWWdAtqSsQ%6*bb$@4w`aYjFja44dC zi`|)O;Jr)HZ%b|(9@B(w9wxcu)EBo5M4QX8ul0!EaC{y5HhUZj4$j3>%S+-6#2;pn z4e&gAj_}8wGTU?B5uL8m#NmKXFovrCiU;tPgZ7pyY&@h2s?YMfR@M+-nptgA$g^5> zu$Ufj8Z1Lv&Zom-gJk}E*DNM*um!{BFM_=v)L~X+Jbj8n=KJm)xiZ9WZFzTy?O2aD zxkvY_JCj}veM5`HpB-h8xW^IqHI7V8&{JaD!=_%fkX$7KH6@%7*zt7UFvRk znagox>4KVpW))u7G{^3be~6)}_Lfa1DflVISTk@g61=(1^x!hmCmQg4)vQ|(bS}(4 zTRm8ZPQ6T%3$5wcbnWWFyQj#xv#Gl=o4g)lyDf~y^%f?djRj+52__gDuJL%UEX@zaW0^ho`NF$UL&*{*l#Qwi;r8gm#&` zhU2}$6BVXF(xaa8dV+bL4ff}b6Wx3-x86)Q;ZXSBL?(6;J+8@&@+611f!s^) zqLxcZALWh$I~B5zMXr%pme@-4Gp$_<36(Xt+BYG(z(@4{TFxi0$^9u9GU0jEiH<VbV^tVsq|)m#rqV_GO7cuT z(`s_FP8m?Fv{+PHAzX-|WnAN5;@gLoD(FycP}Qd4%*yJ3`|oy0to16vI_Ct@i|3>9 zG=1Rik%~MxZ8vdMyWoovt-BMyPZADwwT_CxO+PrQ)`^P|-rb%zq*qQS9D3cS7_0Qj zc`Oug)Rx@K_lxw(*Emxk`}n@oqEH6L*aXV-Y)ZgNsr@hQU^803$?{1}6+!*!uX6wG zL|+_oj2TO!<6z+Djd@Zvu#H=FEW)=Gd%rEni#_*2+4k*0w^bT2kj*L_;av{{-y1UN zsTDX{qNsF*=+=-5Eyo?X#zR z+`?-i>z>4Ia_HD$C+ZD{4n8|)q>%sHsJjoM=G>4|L6Q7HL?bJ82XDoBl zE?g(P^Qkpb-Hk&LFn*D$wV$^d)gF&NYBOZO;k4qAKH0x>E6Z$Rr1G%mo+PiGKnzar zI69_Hc%R*72BONRG9a9|l(+9lGuhum8tq8W>XK4`3sDcDadl0IB10mq2i@0h&~Am2 zgq8f<#(4CPv97!RDHq?Otn{c+|x97ZxFy`D~s@Xy#y_$-ls~^@7 zea|SwJ=6~iarW}+ei>j|I;l?+z6*boOTU@kmV>|m1Qu&kXMr6Q zboGfm@`@(Cw94PKXW#=|24REIB{7L@?0$lJJ=SaCZK(^sT)S5;?&8k@Vp5^>hi$3KL&! zUOFgoXC>KxR94;*ohmLQ*-C{c7iqFrEf3k{;LFuxf4ndN}n1zav_Gkrgf);J`t8TVnMrRxZ+Dy1lIY zic}_!RdLmCAFqehxrw-k%XQd(<~MH{H5+@6a?fqrk_O*d6~1SbdZh9&TQcSnU0YA> zcT*JUMQC}Gaf|rodoxOp_enQnE$big`krg3rfavlT`k0{me|Ev?--*iHKzO!85TtW+|$p9nuOEl+X{b9KK${7BB0rSXEp(RD4z`Fw9j9hv(W z^0V%HW;Nk84>9xz0$v)tD2mCt~7#_FNq3_FS_Jxz|VN+5E zH-wY@@62kssWB=pG@grCTSf}d}By*d7o76MZEXsVy*MhgL&kBdXZ;#yfKmV z9KX5iAxZWr9;Z$3-g{9Id4JVM4)Zi<&Yj+Fd#4&1%!hxss;1#)i|D~m$4Fn}cPnoe zD%k;7C7f>9Q-_o-G;O=ZDh$(h`%SM+!5g^?T{+`burx%n8AJNxOzCMtvzoQlo6H%cHOoTg2 zn=^3eX#}k^UpmA+1Ln!P^oQhoL!t#ZX{&okZ^6K)w9?l_h|G^n<*LG2qaUF>SG zHpna7*E$;!ha=)Tw^8uVOsDCP8M#-xBDyPDlTmD%_ABCI3j`uQHEidoBOJJwpK2rN z-&<2YoY6xAw=Yk3-;tmR;9|35R)1gkw02 z^xGTx-}+OZ4%40V9NJtqB$mQP_*tv)mB~OYIj;=yvC(ScME9o#@&p`WuEs7(UE;cd z3JeWvf9u8n+|6-o3bnVwM2*CGC6dL^nC@MC{DlLfM1RL`;PP3!pT9} zu3kG0Vo%QT8Eqqa_gUev+5PEgcWm;#HA=&@2iqDC(l?^V$s;0Wn-1L{V=EkHA35KmNs zUa5uEfSuP_?S(*lrDd`09PTqH_~Xv*fW*Akh+T zUz)0c?}|->n(j?7n#P_Y8QKJv7A>Kl6YHTHPUKCTY=dB|@?1Px58_}RRbq%a2?bMb zzrYH392IemgEn#Lp3RCLLrD`}j|K;sH>nd;( zBAd59NB~Qv`J0OADN|5?yx0jG9OvBn{}jd$5g9f_Q>_& zRy`l+T*&QVx2l9*GJl3qXWTEOHdl6VqW%+o?)cON)WcV#qIw-efh)Y(=+RmgsMBy} zAFa=W`hh+LU+!v{U`X5$dlm^2551aLLNK4o%X}%NyBV~`E<0CzZif@k2I`~k)dG`w zV91AbP%qp!tuYx6pA2nl{?VksQw8mrrjPAV)>6CRIu#Fk zuNq{8)$2fnn`!ob1m@2#MElubKHx{I^0``5d>1}epuRn`z&3h|v!0X^ws$Wvhf_l@l43;jOSi&mkIS zlLnQPBC5aYtHFEe_r2p2xu|QGcvA6To}TRU83XiH^J#MqFwa**bM&SY!I>slrig6X z;qym7+tH8H#4o^unqxJowGwP~a)&<>w1NBs=ISJ$TDTD=nMC7+JUXY<)J)v3$TP0A zIjyw7*oWC)rqAjjkL>S{IFk}+WS3J6(X|7QQ^*-hd(k|{+fNG4teYj(@_jH$IS9R7{sC~{xECV#7+h_MBQ zB!k!{rCQk3Tgvh&XamzjzFVYPCeR7SKX|45ke@*ryMVsPrz1B_&uA6FD8K5W<+)~v zJGd0mF5L(t7cY(n+PZ^-y~ZPT%)RGEG)2)SwL-S6vT|%uCdhT4<1v4XbH`yT;bbx& z_|D{59Mq2UAg5GAEK?`so8(eY=;A(yYjUQJCLH3?3?9k;|NOO=A|+QHe5#^2B7Cs~ zl=-i;I()+(E>R6DHO#3OJd5p$tFDBv%&Y?ZlIYJH{LcR8B<4sZn2FxVU4^1}a&d#x z!SHiLa)p*K2F^2;+*TVcgzSXL*biFx?y2w1I)v}fuu>(@(QDP<&bausk`?#MXEkex zo6SsP3bQA`aaGy{X7!G9*>I4}Ah8> zpI%lZOpUJNIxqL9N8h;G9Pl0~J+XJU-FsJvI zB8^<#z7gD&+84Po$7>R*P0&q>e@?Exb^^cg`=IOlb+)VtbeOXm+x%+a8p%ic6ZqGB z(Z3{xSHi&IW!tE>OevUI{jhUI-;FD)m8q|51XLL+gz3JignNB&)rCteK%+a)Oz=fI z-0Aiy8+?!s&#UWVi^OdALvbAQ*2JT#Fef@4un zFz3ksuqmqnb5i9x_WlJa5N>33@&QRZB=eH_DC1sV^efA^L#n7>dvjIYG%AN!V2wJ9 ze_v+q>mx>mzE^MSBb2B=7KIp}i^ZJFn6t3PZ++wtE}I^2xAKOedLk2nM={_XJG65c zeN*!8)*o;DcnGsqD~SxD>9BjWxvLdFHwC}4j%hViLy(8*=Zom`?HsdHXg`XauMlcO zY0P2X*?T2K(HRNbBOV7=3o##O$WJ(p{{F*vlkV%$#R4~(PS*Uz7WmP{5K}%^1N`bV zd2-0V^!gAuLyKJhX8jyp!{QW(Ps!7{AP@+In=Xa3h3HdzYMY(*1baucKjtTlhr)a{ z5BbfYG&tzxA`O1&2jfhie!V7bfc~!BH%rGnft@O`UQgQxJVRd!%(4Z5T;gi)#1#7N z=^baDe253z=bIt?qPpO7GdJi|c?T>?iBIN;WI|}gd#}J!)B{;|_zQ?|-ilMb3r!tR zuC2=2{WTi|KWP|!GVTO^+KOMI;n=UZ&KpmH`@Ih{OqDEau@AXH*0psWLo9OGjPyK>RGzfD!Av!UiCu-qRnxkcCEc$sVKR&V0G;5CryDmXt8KB6hfcxT8cd5+-wbe^1s@W zbQHfYk&)!nKO5ks)2Eh47P$ZHI`wH;_$kyER9#g;f0&`A3DXLHDI70MkU1`ibMx$< zk(t4A@P6X>Mfa&4WM^2P`+BSseiuv9aQoT9%=2WmO`JQK$$HJbPM|+hpkz+xdKj?D zv#?QPkKH+g)?EYPLLeV%^RN~PgZCnHT30Vd!rCFdlOp$=;J%#0TtX1$Ko4d#8L6@V z@AhvN3w$rzypbC7#e2ENP}#N<`AYN!rnFil0kC%SlyK%5B8#Eg7 z$VqZkZU5qny!dpsNyf+ME9Kn$<6fEtHzh)Y)HrQnlct;1*wY1ub;_CJLtgt(k4WF2qWIfTZBO7%#Mg#v`2YY>WslU{K@L)#0 z>DL#K^x4~I2YsNK0ZO^%sCzZMBC?YTtp*2$I%2Lqr&|#s`fpKoFQ)<1 zi6c?>)v!lyx&K#&K@*TNoLTC^98q>ZbLVaBC6b_i-_XEW2CVj z-YX_^{HCvg;ps?ICfwKm_!#@2yIm91cTkk`PsTy^ekqTBPCYd99ga{c#QmGh3A&ZZ zI_x{t8h1n;!##9+Z=E<3+I6`qA3OekPHg7LSM~-sK9=Kgct5XrvJpu}#=*D_!4qGx z2I#CE7*;=70AJ*JUlZZyhhE-~WC3-tfzj-^u9OO35qX_nlotfkbvG>uWBkFgc|_3= zxuXP!|0Wx;BA+r>qmA0B1yc2-J~I%xfVX%KUt@YTd<^Bg${CpoLYDL=mNxT1FKO3i zRanSF&es94wQNuaes6?~5;vNgT0o>C=1F3bANoNuNheWf8QXf;B8K-`z`>zFl6KB2^$2~=>WBc}pleLijrI)vBG9PMFr{j{5yYRQm?o2k&kF;||_-BG`T6Uy7-jhKGH)B~& z*FukyYw3y}Vb{zm_a6o3dDre-{D!(9$8y89zGo@GduWL-RI&vq1Iu20FX;d|UE0lV^armQ7jddx0+o@%*sKBGMG@?zn~Lf9r9&{`yKd69D44BRzMXL&=kvdNi$lk1 z;o{N2OOog#y#LmdrUv=tBt7-qllbc?&kw7xcj0?!NZOkxI1E1U%38L~<9?)bT&?G2 z75sfN9lCf6^KGHwr!z-0Ak}8M(G1@!qK>Qa{g{W<%Mt2ILZ7FjdLmDUNB|H_JQvF- zD}?uvS7-mvk2o`6!ulV+Ya2X=v=1 zg8jPr&W$GdtTnJPOJ`=-+X4oqzfO($hF1NeI69peSm2&j zeu;CK*rB_hE}V3MOo6xJlgRJ1xOb${^-vDxj~vyWjm80KQ<|nLzEjC$$F2_kLf_ut z-8rENJ6IXzh(0(4AhU2v{cla0MUktdwCu9#JX-LmZ8s4 zDWD^o^=>%;^~y)13r%1g@|x=5?RE&<&FM-rFNc)82Vb7Peu&(;EYWMbq2NDW_tPD7 zG@LVLCoh^Bg8Octe0eJBJi?4joao1SFPrt5_jfUvK5FRPZmxmN^W*`E$UPz^>rN3y zf5Usdo_1Mlcd+xiNm+uaxd4v@aWgOElnsc9{}Z+c>$I=$3_{Tt^Z2aDEc(CqCSE!x zV9s5v|GK1wNFDN=seC0-mrTDqqnF|JfB#u!lWCSWEE`MO3+uN6eHF92_j*2@PAv2B z#k|GIIkVYnI#V!hU81TSi-Mlt??@h-wZrHZK`T{eGx+rx^^A{oAosfTF&#$(OnJUI zw?v74I4+^xLw6b=uWN;5i7*~CZxH+1U(bPTaeC&$LhSL|crSf*GX)NmUKQSdh3Cr0 z4$iw=VIX|49U94kyi?OGwOyQF2T~K|eJHRG%GEaVE#^sEX#T3Xe?^~4Gt2G`^qYTk zj<`milMD+p3g75xE#Tjm<3=+&sPDUpxd_taLDT1?M3+POeY}+*@%?%Ss3~lWMrPGP z;k_@r&{Z6Y@YS;{~nJ>=wJ z)W7nIq8nL448Yq*;_!@bJnUZiJNE=R)%4s~Z@Nce-sXGoR(*6loGj&DI?!nbiesdl z0=OTXz7#|ChAayvwSIIbC8JOH$q=+YNP%lHMoc-9<v z-85JOp+EEH9ltb#mwMyyE9ORE`MnvJ~^HpQ~@Wj1+^h+*%X&!*(!Qsdv6{9Cd^ZWd@DpB6yHaR?Uukg`e&W=S9Ed zK)a!V|HMt?;H}Sml{lUSf^4k}kC(IIs1w2WKz_{W-A(zh=#HF&D`WKxf11H|y*R=R z{oa9b`uxebPfA#-7-rgzgJbGui7#o(Ay;kv54}+tyhg-5d1n!};-a31+7Un~aQHk&d`ls?`Occ`;(a*`| z@SMOX2e$7TzcJB49)12;m>v)2XW8U96~^*l*+PPp*eD;?{9do<;=cZw8&RorNHUzJ zt^YlKt`Uygs9MdJ)q$tBqtjkN0q{+7Fh5lf1~K>L5?fn5$Lc?gr?mw^n|(;e_qsMX zaW9$sy-)-MGRI`bp`W3#S;cB@ARh1O!~Rj2qbCVHN>tZc1HHz1-eW7+>po)L9;jc5 z`_2E>0?D)B&KY}xJBLvRq_K?+z7z#4o;44MkUQP1_4`8qIQCL*oo1Z2ae|D}a<~ zR_51{4A^9oEsOd8Uf|8a7lB+YxU9`=!LVKel#a}uruU*DE;lT2^L{6s8lY^l^KSxs z-Lks8=|oWL5AHc_6%QM)tyACCV}5BlP{5U-7@pATj7adJ-{dsc1@~&?hG_rg5MIQ& z=DX=zv$rK68?DMyhyA8}KlvWKUPoRu(Tvv4izpb$nTT>emkwF=)=J~^*du89chMO2 z1|Hh$hk|;rH_z>IvN;jH?@}B8VC1-+?Swx^ zck9x!lMVJrWtp~#z3qTcZ;Q-VQVJnuOU30qaW4EKixBvboCW0sxzrVyZ#+sFvApa%y_pK(K)$~mQTVm2RX*?GdFK()P zNVP-!cNT`gFV%4VoQ9Wxc?G1dGSQ_S@dV?g^RzN$4cI@CM5w1*1_8f$l>71;u&44; z{qznY3Vm^_sJ>+Qqh&Hkgz=OYe+5v%X^yW=`nayfOLxXs>PuDAmgrt3AqsL_=hYTh_ze zr5DPjH)`Sh-_8FtS@Pgcc8{{ZM-51CpIdt}*#IkVq+U^4SHdZuV}D)Gp-zAO!re}0 zyL-E@Lf57@PMoj^T21x1Xf|ta{ zSgCM6`Mm%2^;expSlv03qngnUgd$tVbQ;4!MpD*D6f@>Td z7x4e9k(Bq=h;2Gl5}vTp!F|kfqNyYqMJvQ~ya-DFH z%GmQvwgKGtIp(I2Q#V67l~d~#4TJT(R)!bQU&r^pVZ0mpg+)G(zFz2r&5R2A_2gEl zR;ADrGi-*Rq^{Y*lIZU)r#hK2Tso2sf5urK&8Ds;*Ilg zQ?$q_#wKoW-y*|uoh2L9pHr6}#MVOb4TZu*gL7MpzvFC*( zctY`@mj7}An4UPM`8`h)?tT8b`s{f-RB^hbj*65(C{2dax?mD;A3hxU1O2HdSM74# za8ElKruK2ptOb_I*JJW>bV%txC=_%fe{G6A zD67_|YpThK>IB+Y)%{=YuAn%Xx0c6V z0I6%j?W7CHvs!yb`W5x#TG2L2ogVa$p4~8_M~-0n6ocu9&pz-sedv|{GxV9QuS&&; zVDG>i{Tt7Yb-*v7QyWKdero5F^ZD;m(Yv}h&-)tvoNG*hm6Is=9d11)ie)X`zxE4<74=rXtQGyl* z0_|Ic3E;F^pEmV00+i-ecdqn0f!XzFDc27o(8Ck-ShJuG(iY2p52s*W=vA2Wv4Q|# zHe*r|oDK)gC)w>L@gWc-_0=+q5V=zC{-pobsDTgFr|1RvaL;OayX`CP+e2Q27eP-p z6g;;oHx(!XwkbxU0nE7{IuLxci2fM%QX`^(`zeq<{nuCcxh`^G(wJ}Xb^^P`RjxSP zPj(0o_LSiF*qeBA!zHd5w1<@iX-i+gCauvCcVRE=FFJK_`a~TlkCW$qI^78kWNKUl zM+zW3@lFdxLJdgfsazT$tAN4ZQyB&WnEM>u(INsX*tg3sEywfcr>>!&6=M^;CI@w| zkLaHXQ@=~m-vKor^OESOia_cX5uf!tJjXMVuNqyhf;Sy8%e6T+sxM_av zy>P4pjhop-RCxXx_Wk0n#P_R9%J+>=kB~ROAhdWPJqnJLuYaWa90gi)Ex(t1Du9yt z^p_^&RMWPqTK3G~y*)geA9^GjNcyf>X9Q-#xrYbUg;6QMkbL*%rwn|@G&Jl~IW~Zg z*NG`zcJ$-!9A{=&$pJ^hn)qU)Qur1iW;*E;3=~llVimOwkZPWJN)GS&^2m&fXTMj2 zTDAMA&@Se>Ote0Q;<>QQA6;unmI0JA6?q#!I)IDixLh#yvp!CLM<_qs2I85^G52u} zb)9)u)<%L{!~OZ8uZM7dkWV|u_W<8XYc+rP7m#e^5XbiiEj*NiilYT>TRJwhJL?=cB1YLjEm-=4T|gg+1Sk?qe_3M|7Rs8aMm z4ENnTZ-s1h{5v4>Ps1RkSOL__$NhMB%@3p~zD10!B|wfmUBfn0HiVdMm5j@x{&6n< z{3{34tH`1FtF{C9(<*W}-3kPKzGAkY$S-i#N6D?N7&4}9Cpn55!S7wqU7b6q6GR(^ zo>iy???V$Aud;mM=fwa=1LP(}b2s#W`5VSU?fCnzc0nlRh&jG*vsYy$^N{0xdGLG+CGz@R z)i}@VBmk?R+tR@V=GM;BYW|%@AE#QWf++TPRq0;OCn@^>Ia57(0d>hTFaN=>8)dN1 zelo#IV|yt zW4`9&vL6M`Q9}Ha_#Umy|EcjEb+D>NVjV}`8kjTiU%r5SMIn{udc_PK*uO$Zbrkq(zoLZ7udQgTr5 zCi0@Wm;F2)O!?URPtV!|T=>0s!4~QsD;Wt9@7vraxiUaJOZKLK3UYiml)g6O zK4xjBnf@H^pT2G%hszI;S3M_W9)1DyG~5xBmB3i_wDg&2ozRUeQFsGRy2v0Pgc^v`qK>U z17h@#c3D%=pkIeW=-z8x3*4_lPThUn=j{y=aNCKsLDZ`kwvB7pKOJ>VGs?XR`Bk=JY22*d+m_haB^G4z>rzV2L23(Np==bz7lks~ernt+FPst8tV(;0+Z>M=J} zXAsbx2^WdKaZKnUk7v_hI2HXRnxe|XeQUY!F4kdm;$baNpR5s@)NO+2BVE z_qyNkwlHA7c#fbpoT;$nm1pkbf!1tod*RICX_%txj!}=%r=S?u{hST^-H9|$IC3CA-`jM)Z3fR3Syyh+Z`GhpoEj2? zy_RrVhVy_Sve#xPJi zJfsy|O&rO-A~#4e?NM?IK?ImqUSX6NiiXqjho$~uZ|GGA8JmFy+-H9?x_SI}K7=c9 zdc8S?yk|R-OtU8J+3exG?~gq}-1eFdB&h$gSMb-nBWETtU*R^VXE3CT#p}3`BhN`p zkwyJ3zL%){W_dC1lG!CNam5|`mq_W4+6R{bZ|9Am#;q2(x@-9?NG=y%sd-q@h*ZJO z*M;_hKQ*uxof_uPkONf&x*>xPTG6Mo_dP4M1I}-r(z=J-#BtgoTF-}Bz!dpCu;+I= za$SwJ?cO7|E%MYrN)qxOUo}Xc_=j9V`mH&3nQUl2X)XK__pP)q)hPPVN9>nrb~a@> z2-HG%_rGa2z?}3rcV!RW%S^t~ovFx=@FryIs?CDoF_!BJ9u)w$yuO7!D+Xec=*{gr zm@}*ECmOxn;*$h0n$IapC7aa0{3^{V>k5j;L8i` z#rwvE;E_%|9CbGZ#(aZZBXFNCtax~x5AO>x!#dv^hRAz6&h%GnrvvD>E@J6rG$dW- z$ZuMzgTp^k3#s`k;gUdbWyFVY;9?|yvV%U$XDkfHG!597T2r_A#0Ss!4O1!SM11c* zee&57{WZM`Jqr~#tHG;Ntn|TC>{*bvwoqfkeER35aJ4Yx3Va!S#&FjU==^o)#xO6M zm-O<3pC;yNR-fcv!aW_K?)luo^Vk!v8P>iNj(Nfxx<+DGaKFe!*lBKB1cbKf-8nuD zuzfJ_QI8UPEvt`E82rcv4x*#xCv7?*e7^OX2=1x2-re!(Xuv#~8-MfKJ2Rl(UU~C3 zvI=A>-?e^3U$4Veh&S%%It*Zih%~UtK&~mWLUCLNnK)=MPXYaPLC2ODwvmD z*pT{Z0h*n6&J`A+Uh(}}4#O49xw2)<*UZHMf1~Ch;;k?!SUaXWostQDEYh1-)^M(Q z(x4c5GZh%jQb$*XL|`X+TsD2I3jX+vW+!l0!Nr7;?rWGcu=7dJ3dcU${j=UeB`fXl zkRpLr4s~T`=f1}q$W8k*wwZleJq3G1xp0nu`e=xQkp~j zc|PU}z0X)t$DkV=iKcjo%MeX^~tCN&h%0|uQcwy zjPmRNLuJY?rYqst?!B11^bdKKhmft|=a%q4j}T#NH?Sg4*uTW?2d2^Dkr8+v%8yMt`;WvzGHLnd%X4MW zJ*;Q3dLHN5qz!5}r)JP!t^B*t69`+0UQw?q%3zYT&F7zU8hmN7Q+$GY{7*HS-+8DP zMrj-brX6nupUmykUg(E*zfPzNlAX|dqN`9wz7y0Ey3-ASGb!+fZKze6z` zt+0tqq^Ht#$hW?FIkXx3*F`sD%lA4U(4`TJdC^eCe(m;u zl<`3H!u^%FG4?>_d)7HhCqVC_;CQ5T8`yoh^PiV*C%C_VDgAmAeSnigRl1+6K<)%g zGyv*rE|S{!0PnHXk4>)jxllex$}%fd1AnHUAB|hA1dFx$Zld63pi=e{ieYJo0gPzQmUGhhsz?DAa9fh-1#TFE-UU>OJ~wt|XOrr{UbNKuc6e)dnWNGHbWJydb3Y zSWMVc{O?JRuZ1dCLuX>;TH!tH{aoSs{%E-!HXhn7@UN!AKvO8)OU(UvDvRj<`(6Z; zgsDEI%#pwsdpq_D@{@Fi99EMTJV0n)En53jE?A{@hEhi4z>4C+x0=CJ7+aSuf$C_` z_;+xpX`uro-z$ojVBe;LT_Lp(>OH>IUY%4`Y49MoJ1W+o3M!n>-5|271tB*F(y zOXyp6V4f+cb0`BJjZKcy*=+F1jVif+*#RzcT@R6qYKI3Rvl+SdmatSha5pI$@7tl) zCF+0}!aiHIRhkS9tt_MX!3dreCs-h1~M?XEi>-ISM*`7Q) zpUR0j`31^dQSy_`@ZW=Yu5Gyr7?C&T`YxJ{y*owA?6DQ#NRwRV#{UvhY@T1T3&5Ot z{TI?3FPq>4c}X*&Oegkf?wn6CZ2%EfsVpjuHsD$xl8zvD1J_Gqw`}qI^eN)_LD5bz zWRl8UlNrSOjQ@m!QJM$psqjlBAr+j3gZdRQZ+TXwaW+<-D(1LHP7|rJP)Xs6BMT? zLk|6AXG3ecM(7B69@dgv0FCEwzvY!^grB*@-Mi?|h?QMbTCiYim=rO~xFAOhqSMH;;OoxXrixl=mpD|aP;>uXy&4l|DQuC-*>vs5T9e*Mn-|+^#t>?T>ppN&vG;`Y$ z^PYSKmmnPdxau>*w(<2qG)cDdwxbx{*xWkp^}Y>Wf2&)vMEzCwZH$`Gmo)fvVtg!L z)C&xU=J)zMOJU{5MC2s;bSL#+70cbOfqq8&yOfw84EGKq+ooy;5{JDhr33WM2k8Bf zK)&mTL>p!en|4s?k~=wLTm=sVRjbx8H#=jt_nsN~WJd{gdrXiI{=@ZwSH<;osO@CE zU5=bY39~nf2k5(H@sA{~!F-37HrJ4NP$LxdZ5=-{;SFJj0y_onHG`!2{N9;k@o^%{a+Wh_mZl9>MXTUsZOWuV{63Hf5w>O_6h{3%6 zD!o9=(+0TD{F~u6ojLKegk;g$C%RQ3+T07uJM|a9k%%u`9n!Y%G zJr$;d>66>Fb71m*sOvs!75o;|JL&kZ9^x!CdHf*^c4ut))K4VCR{qaRbYjR^xwf$2 z^}+#^DK%BB(ceF3-SJo~s}0VTb?X;6RDoOk@W?I9f&6Q_VtQ{L_jsaQC2w%g_4%)% zsMtQx$8PK}0AXOONy8v0n@o;ypOi1g>wezG&fSXn+T2_t;z(pu;_5$bg=~Gup&xCaV z?~}`E*X?USBN2vDPQ?R*b5g_0L*lSZT`l$aN)AX_I}7V$&)NRz4;}7b%izXUhUjwa zSrUlo60YN^0PED-Mt0jVph;^ktV`MoyENsJ^(vikJ|wlry|M`T54?gWbC8F2*{68= zSvsVaQpKubKMK1;T4U;33Yfnc`|OJS3Y`O<&lqUh;g2#mkzKhDVCr#~{frg-4LeB5 z6|IA(QyX7Amg|7T`7=u|Uln}s`&@FJ5#PB2>-!YwtC76!*A`TbJ}>t79tjFnK$c(K zxiMV;qD--MJjhLyS>%)S9Z83=hLV9k)W^U6XCUMkoCNzm4VKMkFdw?~EZ$lV-{B!* zpIOM;(2tP)Qs1Bq=Imm`oUzZhDn$O~H*nb=0{9^unO!0gGU)H(o>L|@yu2?J`lWR0ADdLd8`oIsqxX_P zdN-)2A*&fu3VFy97g6Vph$5hoG=NHV)tti@vCmI1R}8w($@825iXV)T-P; zZ;F)nFV59uwg27uEZ_#Ly8lg_t!xEp*3`1$i7a@sllCT{)(2AR-|1!kO@b4iF8Mby zvmyJ2ERC{^Kd??|t(T+DYpzRl)b2L+qLEiyn*^6b;t0u`>-arv4{fU?UaiEu#4qyb zcddXm!B%C}s88SWTRV^E>Uc3z{yWUu#Kdey-`l`Fuw6u{D(b^$oa8P$f2)8PmFZtB zsM`~DxA1%1DuGBd4NqP+~c#h#U=~sBl4MHQDIGZ!mf&S|EEJ@Upl0(at zC$eI}yLEb!f1(vm?P`4bKgZ&IVtkt+ZxAGDZVwW><^rRWx)!Gi_I+}PoRh*F&5f2Y z`)_AEVK`rkWM-rp9krk;EL=Q!p^ zUmQM5tk?+|m*pDVxKrV5Yo2Q)>d>?dUsS7O+MueIVEX534V1^T-hQx!eq3(@6MLK! zR`o5$1vFYXfzcQC@Fy$&zT(2{N(wlG9a`7^ze@bWwu5hfMRaV>|ApxZY%A2tEI)N<9NUjt|* zB(0C^Hi1}6gwYVIKlIdbWk$MSuF+K_bPWCK$chXZXR3#ctDzn1-34&r+sCa>$iF%A zgFm`xu@(A-CqE9nMK1L7oeTBInR~;{Gi98g1?%3tbIj^G^#e3$1 z-rB=EYWP0w6i}%B!ioI@|Lktc-NAFn=kcS}UvA(h_qBr2Bf{M(ps}bG` zy}jIfvIb7|`za5j?L%_M@JdMUOV6hso|BgA9yr7Do8rYxwyWeGp>}@sJ6skNwh4*0=pFz+s zojO?9O7&*9PKDD!XWz~1mO{4voP8sIJFM%}+@QsIKD=anh1wtv=ERPWE;tmzBlGTT zC&^s+&+|mzm8k}htn(?P!o2m#D}r39pVNVWrB=`#r`hvx$ zXXnOSp*@BC_+(To3~X$Uog(Z62H)2Mi5*$sMJZ*qdlvJy7k=FNhrNwNnNRJXJC=jj z(|hvSglVweCFG)b82zLiTS;2}tx)$@xA*6%TCmU&4B-i`2Xh+Lnh_#B2p4$EoPmCa z?<#ab*Me{!QFzKaXJ-p?p=)Y6FAJcAszB-M(<-PT|MIkep#Xd$FBFKgHh`eP*ohD5 zQ@XP{2^&7UPJfM(I$Gu~mr@+{uG`8XC7vM@xZ)`A=Vr zR}}>Nu!)&sFAeqan`;fyxj;WPaj)!13H1Aql5(IAonu;}^eoN`q*5ENo5(tWpr@Sn z<=sjM6>a+5&y@y5o}@Ba$V*}Qgs~~^6c{)=(oBQz^~bh#!}ZbE{-|{VSbMF2^IZpKBx{f zP8&=kN2_XA!N(Q*!&UtYevVo}&Y!Ksz`7EU@>3aU<;;bpU^zDnaXdHVcPkA%tKiwg z<#XJlZg9@B`Q97DOrR`iUFXL=XvsU{YUYn+Fu^TkuUUleSF?+^Z%|?%%g~u0!G%e{ zV87rOK9mZSXDAkUFh@3j^h5N1E&6*BzIFb@IZI$*kg9N`1K@D8>@QvPEB+9#_mW3_ zhn6QMM@5$@Mg%k z9U5BO2wcL0z?dL`b6~9nW`*o`9Gj3M(MLTeiT*oVs$1a-!`SasRz&_=I~VuVeq!Su zZSdi6+I>^(x4V4W=E0HVGH}u$!4FCdm<9^{N-xOuXr94bmeHFJ<>eYnuFvK0N6VviMug$Rq`mYQWj zZzc8+#Ita08e?xGdF!tf)U|%^QJi^jI2TClgrA4=p|sxG&||EM=g-e7%lXba;O0m> zvwNZn2>GLq2~lc;<>@h+(e?uP6;Z zC2@eh=l}a++n(dxOLH~5xIQ8S+ArjcwqZ_KXuVDIWp5q?SCrmM&h>`<|3XPQ8jz=d z!~RDI>abL-r@SXu@m+Df!)7EQ2ze|s-VZUSbU}TE!{SFPfZ-ObI#AAmqp#K^l?}xE>{iG>#Uoh&q zr5d@p4OeR+?QN0zo8ETF7JMmq0)3(K^zE`eSJL49AL7Y)o;29=mVG_OjdSmr`M(lR)}{#L1zJd%&Rv^JgACbW#o5SQ@Tcw!k-Q^*bxn{fSkS?My&2M$O!L{;!?$%W@q?r_K0hFsm` zIm9v^>Rju-;eDt4s{k$gUfpbR-Z*W)Ji)#2e;|>i} z@!&wHR40;weSO3HVcM@TuR!i}O7u?@#AL>NU}wan!Ng<)?RbO^2vIR=3G3vY^%b_(;-t8!#;I2{t*|fT!~zzv3I2K*Y5$ z`2KP({0WSHcyu8X{<)gInYH49_iRk>|23q83ezx^*zXo_<7p-C?aKq5GyR!N-G1b zPl1#zca6aUd!^g+uQI;C9L7Iyw;fU3OB&e|Y568#4!&_b5$BI&yE8=b-koq`DYN`L z>h>Gu=5xJ@X|PJMK=;(W42UQQ=^{I-fV;%rH-H0klSSCJ}Wyq#k~eFuq!Hu7YA!j~Cj<>>z*6*mRHS2?*z(u%7K{fwXU& zgbm%EF!;t^r3LxavAfpy=P|!dX`ezQkN0HMTiauHOxPd)d&$hE6n*B`hqzCqV9tU+ zYkM%G4Ia%8-x&MP2jq7eiyY;O;Jw%#IoAWsfjNCUa|M0LA7f=7=b?{#OU3BJYt)$r zPcm42uW11VgH4vSyLir33r3HfZG_=x-)FZnqCuQwxv2X>I?l&YB63fg;h)&$IvY}) z1LSWpE1jqX!m+$zQtV|Fu(oOx#@t_n7q`%#G30fGaK!S>)Igd*i+;RU0Te`t{mwjr zJOJrO#081fp!!Yy+a_TJ%#OC??e`)_a;@UupZf)1-e0pHHHm%50(G9$KV2X#t&}tq zGT`J)Uqx7UJzQa=NnLY5?x|IRb;T{@e>Nx9N1dvJ?|Y^%*pRFJv+|*9@MsvEr9QJ! z^AmH=TY`Uw{w6?$wg`O}`Yi6N=R8iroayBEx~{Ox?T{$HGvTY>2K`j-;=68DkkHGt z=~$HqL%!wlL&(XRC5f~8irkSiwBDK|oBHXk*$^aK zw*Pmv4IGF~SUVoJfk(Lw137aI7(V_Fgs(#`U!n#5zKlr`0rcv zeY!`SiQkK~f8A`V6~LUADOD0y0S}h6lgyAKayom@Zsr>Hzb6cTX{u_57jy=DWyi8$ z?d|3dldc?i$0u|#KM(t0=gWh$SR;W!+x&l>eFa!m+uAM-BBCG-DqYecjUPx^APRy- zNC=V=QlcP|5)#tg-Q6JuT>^??5dw;WfLL%pcbt9hJ^y{~fB(&X9v5pa)|fHIoMXJ- z8?2(}hq}D6es%p^C#bB$+UCPDc&OAs;Tlv8L%Na?3Ees1eEBEGRl{cRO|eALR%`Kc&bDNgj?kurR)5Bp%re(yHI$ zXjX23QY*``r5O= zxi~37m87&{+R~UJ?6Gp&q%!Z@$`a?jLb#cAW)a2XeM~dxG9}{T>+DG^N>NB0Ism~cvuXoJ3AXz4Du9{cK1p*3n;^Y$+EyAUV8@rJq*plsP~26=9&9;~}gEmQ)Fx^11yLKbZ8EMtAV z90i+4+@91R4*JA%D)Kfr=3ekJ)G&Ul0P%RT8Kr~m@YGsh@pC~1>^eB_!jakx*%yP3 zT%-ts62J4b^frlbEB_QfZ)6F)Cm(J3ohNKcJf3EtYKlW0YK5j;|s<;UvYwPZ!w^KYNu9B*fK$jLT_yPRs`&Vf$j^Trc<16(E^{r&tLtRp@ z;=q!Pfbk_!2WTwJPdTG6k;APd_xjv&nB+(b%^~xKM-iuLtQy*&ImSKxt9BLMAB=YI z`CbU)Z))!PKSI92!a&_&)JZP6Dn zJ5=r%M-@a#Z{;HN+Ic$o&-JgNYex)E*Mbb{)o&)hK0=JWVF(>mt@`X33J2O&Qo*Bpb zm=WVOgALTh)mU5H%)z{pLx;07ZEXrcoL+sb`fvk81#ZedH%A`RStg6kT@A1a3~~WD zZ)yR_f{r&Ga5;8s!4UNY{$?#4$TpNI7%n(1x>HGKY_-E~9Lp1}hMa%`!O&7}adnf`>9D*7l@t25qx z(*TZor?}=Zmnc1=PU|^OEF?^`mi9&=?l5o&+BCyKgnrRJ+^QLM-&gLR;Y$aDsj`_N z#G8dv3ka_l=Y!_cUBlno>cB_a?&CRJN5u9}yUR0qgA{*xpWKcx@GN7dK0S%P>+AmK z7}5V_uUL%k%^rIo+j+=uhzfK0I%l?pv7UavM?*NxxriqhnnC#? zbK3h{T;I1jE$#^mfC+xH8|_UvuKNb4t#BR3*i7@NR8$4>O&?A0Oclc#CHV;G79;S z7x-0h2W7da*S5!kdxja*C)s*7D+MO1WFp z5y;PUyO8=?Fdf)q;|o}k7dUo<`^aBxoKUJNQu)ec8h)2DC6qb?;4yR*R67^Ey z@>_F`Za36-{GOSGqYr#cUFfBlKscp8t1icec*pz0q%yjh;C4{bD&|-_NGxf7`JFp^ zEAbBh^&iooJXI`2?b!n1N7i%2RdIf!vOJoD^@>@4`TFjeHh3`@si}bVV@iWO;daz> zmoe#(K0qFY+8o)LpGQhTXD&w^x^tntQo{J>i6Rg%4VmqE6bkp|bFI{ui-3A0jB&>t z>ctB7srw(r`U%J7rqgpB(BbY9L1xkkHM|fwg!qH@Qf6nRbO#W>ywOhL4tI=#H8c!QqUlWog1X_$*TH&DK^3bKX~H9*?Y=PU{H1ZR-&#<&2U#R!K)wUYW7bS*d)h!h~A#C`XmgXna z>Ar~>DUB(Fo0ODZAQuK)?7=iiX?G!qZ$OfdC9c%#IF0FkYz`Vmy!Zh<^p`fdF zkZI*m87zo=*nNHL$0ZP>cAh4ZLw)A^EE{C>*5;gokBm{)W1u<#N)USG9QMgnj2`!wozttoB> z?h-G-mAZ1!p9xeUF>8g>G`b5P(SKUn{}!`^Y&(2v>G|%!TL&r)$A{Or5f^h-IrBrd z8X9hCC(UEMZOyM)uL$chZ%*Qu?}NOdE#?BNQ--rzQwvp+1>p@ zy2zJ&>E$}p>4p8VCbmhG2mMy|5uQ^)-V^zk$Y-p`TWdIIE4x=O4=y(3mPueg?liOZ z*U>?rlmdZKP3s(>TV+bjDnfqmx%H8eJLoqg9US>09`Vax*RB%eqRuz!vrzWe7@%(9 zDF4OV4jM=0Cnl*e=OD1mOHmK?2x{c5Q6_mn@+Faqo3#^?Zi&^>A|BLb=aVpq`23=R z-E%3#S=iphFsKJ&p7ui#-LCB#$TbovdWOEI=^fF-%A4p{#GaE+M~Qi^bWN%08F6s+ zl=p_g+dAl|u3M|OsREgu?Mrf^R}!4Y10mXBPh z1Khi}+l(U%E?*mab)F?0jQsa8Mttc6gRqq^M&ek{Q&ria|M3R$wuUw%dz0 zGnueS8wkW*ye~r*0cQ)xf3@f}!ApyiDlN!Ek9|PAEq4|D=}qNN1^&nfdFQXUnYA%5 zyT50L0%;R0n;gFoey1Gy-}gd4aaMtWpIxb0Y7sCVS=(E0Ukom-mnZ0-q8>uU$B`Cu z7s3jpG^Ci(Z@^*k=n0b!m{;WWei@MtT&GE9!4G-xDUyc;9!0^Aa3wbZvrZT(YZgC^ z_20X6ZjP6y(;+ORxjdI598SOBi~EA>gIkT7Sz4H{#Zo-1>M&CY^HPD~_N2wYxKS#n zd>|T%^oCRpW3CPZ(M3jzfd+W;T+H`EGR|vnIusu1MqfgIc5YU|c39cdGp>E35w5HZ zEA4d8gN@Ff9i>aC^ZjuBvTX|DcKb8@E|sN1waxxB?vMPCFEf_uzKyvbGW7z>@+FXG z9o`%}(Fym}-H5`g3V~dPd!5e~`EFnCD@MNQ1c8|y_ry!};W!bqXXBS@P(3{G?cD(8 zJ5rgCtZ7xl&h#VWIRW)h_w!@h(XA91rm8KNa&LgrGoN-xB5#V}YM83)T0Z#GDLu4V zX@aycpZT$&au8B*vK%d{h7?I#1??`(!Txd2W3@dWdKt%!Em2oN#reKl_V^V@`oXUC z%`6kDeil(^;`4I4!zMerw;o1Kw-*Fz3z4_-{0Vb<2GoD%DT1nKI4nL#$%E@0u@6sF zblzCP2(RPwnO%tIFKgVOz*#Jw-(?#G`_BZpJVyNP;G&VzN%}VQ z|7e)sG0_BXs)kND*GB@~Yw><@gBF+7TVOrz5{a(DoBAq;POdN!KTe}%p?SGE$Y+doj}jJAW$)wp@f zfgD(|ot}5W`D6dRGaB?+Nia^!&2S+PbK{Cu$X^*(fzqv0L&KsOu#y!fz~d^AG~_a4MMCNnPV$Rn$Sj7z60 zMvxyz)OX;MWqK?arufl*!1b!*^&ZMN@k$sBFw)W^YKP^sbK&_~mEhPCNg{tK4z{>@ zlNh=0!$AgNa|>O}GYEax=S}Sc3`UB3B)Vfj{Y9`Z&n3)FxzM_E_)rQIUgSTBMjKlJnL9NoILBG9>3CpBRQw8 z*zLyolzW_fO{*l^D)WJaA;+;KEA*ZA<~!w$zAO(|c?GgRWx$8_yi9@2bSNaU zcz)|a5e!zaGSQ7>0sF6l;#;TDpL?3Xm+Wmhh%z19UnJBHXW;bN39Q#&@mJHcn!&oY zPQouCB5R1~)OtY>jyVItl-+yJA%6QKLDy>|19IAo4o9I+4(W}xNdkAwN&PWAUp~|X zwsB5#>!`Cz%9VNjFb?ykXAj){BG3$LJL9)#iz;Dne@V5=(G0k}HEWw%*$OW>U)6-5 ze#x)tPWzagBh=_P@C6T zfD?H+U^BsS=DA`NTt9JPp+>#|ZU;?CeM?S){fVMCt*-%F@7D?b?O4CxU+|G;9DP_ms7;(( zL>+?N>G)OhW?&@ji;X^u>j3urYA3$?a6@H#I+!L0>xGOHYbSC*TW)L*Eq4YOsjkj( zJ--Dd^U(sgmlHvDUrUyjRujDAaIQ-|mjfl-GdxsLh-0S`&M%^5Sd{uD z(%g^FFELdrbM#lUD5_(d7wLq-f{=uI4dj^!Zx_6By$PZ3q_u|7XCWo(+s8{KHL&OD zc)f{FF~l{PP`0!egK-hri1Rr5J0z4mX52tLr@5l$b!jU&9GY7%!+!9bEPz)m3w{6R zPUYNh2nJh=v*&C2%7NHTwQXp;1y+de?l16ZgVur_>TFyVPgT~5ZJ9^rI^}TU{OC`w zCzqkLkAS@Yh$Gkx?SI`J5Cq@NTM7b2<3Os}J;+L|0bXqlc=%=b(uL7w@9OtT=ydhA}kf8$gIo-r|1Mm4z zHzrqL!9`L9#ALPa+`Y>oEr=!Jv@YsR1mrn6GtkFX;;`|c8TNw)L(SmJSpU%T9UtD? z3@wLdRAN#i`4!4wbVZkI6La1&m1yqW|BiSP$L9KBfk>EpEaSOe zSqXP(_i^6QNQd;vcb#`?a2#aB8)d#g9zj{bTk3N3aZ(~qW)Z4|L=jP9y|#MLtlOUC zpbG-#sLrd4=#9*Ev#yo%f2PjyI0E&f#|*SmNWXM`m=-)%`v0T zmj+SWNy03|M}5R+B1+-AQYbNnNDR2`KXFk^`yMb2?Upb{p8*4!ySp_+Z-Mc?JLc7= zOJMiv*PE1wah~(mW9-YXa#-uB>bW#p}uv+&CeAr8>;ZBH@fRvUQzVE#FZc-qJUQO}GK^1Et6} z(G>OZ4Fi==4Y<5ex0sy885smabBiHAFlSUOGLB$yDj5(!b#iAK?g!gyE_q@XV0zdAY^$EN`x|4Ma>bAq-N0}dO&=*Fi z$kXUkTPx;oWq)+;On{FBE!=NWkCIzA!XsW342)WFJM|uWf?V8e`nkQ{Fq`L5J|-9e z>Ez0sFZMRV{?N8}^XT6~OK|nvZmgrV9raxMZV(0BOkaP9zs37PEbSv{=T4}!AfsYo z#XQ>cv<`B^m`h*(GAJK$<8Ya?zs}Di@9Zi?Azf)B6v$WFm?17bAwB~k_SG=pAmx&% zUj*&LV@fagY6B&&qoB2C4a7FN#u-VVuIp(MUA*7xd+vT) zM4AaaOP`4y`_UJY@b*xRuQTyI%s&+Iqr55#qoKg)v(ADGGz zl?=Vt3ROFLWZzB217YEnQ}4Ch;Y=1!NiVLK$7V0qN!)3M{l|CyX!Fj7#|hLLL1C!d z(R{#v1^FP4>cDCrBl>Y#nM|L?=Wb!JZ$=`UG%Q~%lO}wNc;>~H&sVWd61Z_;p!r@P zI9#Wj>>oycao-Oz##gz}wJF47$`c73=bla4JthQFkGF}{ z6CuS**J>U0sHc=D)c2&df_qwL*DIVqHh=eh(ix9D7lD%b=ZGhfaeZ$VV8l8P&6T2u z>6sAUDsk*!D|%l|JM0K8L7tYz@Gd5HIhiZ89YM$$rW(Ve{ zxN3gr=>VCV$*Qj%njx(8l}a>EHW?}t|>1lvsBP$QbjMIgf0j1)GP-gQpDdYogMCA{XUAE`Fm79;xa-}6#aBn zaNCAs&n&K&wGXQLsK0N6hv}ziLhB-7EntJlax)PU%Lw#_JS!n4T5QVcLN;7q^jo>) zg3pQ9spg&4b?|{Xq2niGI?#&WVl=o^3xf}%jkYv`A#5dD<0In3pVN2chNE8?t=pw_ zv4hC#w*((g(oW>5SwB9I*Z>bE__9gUZ^PD^$d9Rpn7gGvAv5Qf1upSF4i03ZUf+oR zkVRve%XLk<4C;T$ zIP;-T{q(NY2L{LwxIy0V>P$B34#*f!5; z&3ti@W*Ko7ee;}aIG;J#oM;{zkPZ{0Q7pUBpHke%l8g!K#{z4Fx%+V)p)RU^MGN)X zo2~oht6V=?L^+j7+9Q7^dT8cnaJUmc9}6$@`6-YV;jtkI;^;EuXjM)aBhF4i*sZU^Ng52l$=8T>)rXI_N?LQ(3xX@+b$n-X&mC3KfFetinik> z9xe5-{_)NMAGd0V|9pt|hZ~Md%_JKNtZR2nSM7dwH3Kdt87vttB*J&2`)g-;62S1} zo!flIc)fRQOFZ&Uf+s#E8D6r;ciyYSE%>AXV(JbHUPhh`MM>|;>OsWQgn|fup>M+@ z2jx-bp-wniVR1V?qXRrMy{9adkr!d3{W1*4dwdS{W_n{JJgbX8^XWb2@|AGkx9dk< zu5^Q=2=eWNz1UrQs$1c<+*#LW2?b919kI~F=e)RQ9B~?Xa?EKn`OGb6jJ{=w(T($n zV@Mo28?TK0J8?PabQ)thyb~EdAc*Uw)%aL0{fSgK@vKWnApmiQtj5Fw?IcK=2m zXKU15*LP`h8%QSrr#qPdE#li>6pom0f2)D-PJ_wORLDPM+4VwWPYZCGB`vMRG{FHS zGZIeTE+~GyNV=$V5t5W&HpOXRp4{5O?qqSipBf(Cr-M9s&ASilvK32#dvAQ1ICBBq zc1<&l`<@3psRU;jaeX2fDomL)+X4QkL_ZAR^NU+idZy@PATW?hD@7@0fdSd^>j6~N zh|5X*WI>-B`p2!8og#{$n4f5G7xFjwLwxx1n)2WWc{E)CSr>H4OL;u1y$|NccFok| zyoIZMi^}jj>K!K14W7Crf!;oq`V0Oz{>|UbWmO`-W;eOPh3lE{M0dpckWd#)?>lg@ z$*Bd3b@#~n7j*)Mtk-e**fz-Q&rWNXi~(0KI?ddv7I$5&nVa-mEOj5#SIc41{YQgCW95- zx?CPT`Xn8{$a*Tb6CCBv@erbZXwoD?$WI^rIP-}|vNjsfCn5cwUkF}Dsi!GG+;nI7q8!b4s}!z7D@HUq=3B zd~PmP{~_cb?Pt{x3h=b zkoW(Aq0^J18b(~-8Tz5$M2h~}SgJDCi=Fo$(we1L=|V8zAf7vzzf=7K9v7v5q(v2uG9*O&;@iKnxd0 z>8v>BDWwwhIc>*->@#QkgfaB*N`84D!LS9InWf2yi(9ZRu%z}8b#4R46V<{*D`8IU z$=D$JU$II%yK&vbTwBWejZDW3Sh}bsl01a#>VVv-%wMQ$@jPFDF0Tq2^>%KAze)rj z>%{$>MhWn?)jjj(F7&hK_|lY$xNb)D($zF3)OSz4W>Kb$fm=MiPp3%hp~`;A=hj}# zdH)vbWw=}ibvtiIrJ=6GI5A$f`~vEB2VB4BEhA5U=>XsRzFKGr$|<>W`VM$9^#@5R zWx}xsS)2y^n0xWv*poFj9d%R%yC`Ctp(%M}i-V{DhKj2~^zr`Gbn8~&Ct~zxZ(W=_ z^bq|4>?rKyTcRLxH$|V}yHwaE@bbpAT@&1P|Irj8*$Sqrt=5)_oiGt~e7&o-157UH zk(ee_BA=tK+D&WFgGU zWqtLC_k@sj-{d;OHppfu5n`e*0IqG-`t>@jKk_iX;YGgiYV@&3hFJG`VNMab5B)#4 zuG35#apQQE|7v)UD+u23oMKfm3xdj$&ddP%awyw0Nin`q1dCcO>b@=2pueUriNMzysuPG^r=Y$E6tHS`umu>#`VB> zw7voNduSKaW5lBdRld&dK+V2&Sk4oCctAX{T4(fXL@VO%RMgOcr$qsQO*M;{J$Zszgd?^^byAz5U zjL(DU;&#I-SDY-cq>$0Yb7vnH*gWs4iYOV!Z zw%1S0d?)}?b>XZm3R-Om^4MT(wjj-3|YS# zK9}_P)$dRf6+`K?YC|<;CiKo$KD)DZ9j;!Gekz0W<+A5i)^m&3z&HAH_f^zG9}Odu zTJ(>B+RRm2U({)jvzPXkWTwFhzfxn*yE%wEj(j+|ngI-(-KLXS6`+&+&5x|g2Uxog zYaYk-8WsI)&1_a8SPjk8$Rn=(X;%jUaaRSrfX}V-@ijm_t`POQ5^=oDe8w+JLC~$Q zzbaIpi}!Wa;KD*fIPOX(Rczk{Y0c3EXB2ATq^rJYJo+%yPik6~JU~9Z=AL^O^IO5} zyn}q2swSi#u?X|1j0ZmFN0rp%xlptFZ1F3^;b$D(OTS~i)LU4{;YE5dcv|lxjc$vE z2UTBRo@}iK9oMn22by(2V7PZDVPQ5TWF<jRHZ);>>bM1Js3xqQPQh+B*7kXCgDW*Q=9CW;|)fO9`7vN{I_g$;n6x%b7{b30p|W9+I|@k~X!Fmj1U^$qq^X z{$XY!!!N_1f7?Xyw@ESX@8A9^e{E)CSRywv=UyZ=RNJ}-W^*7Ij;ZBgN5l| zBk1>q{Cf!f^X|VN$qY8e#!!g8Mwx&ib3_pPA}14QJH zu_AKa!pYg%!Jdg!Qba;TjDShtKR)4n%~k}5)iqZO7ZE21HxWAv7gKXn7gMG|JebO)uNx zcKkyNAgfBVO9{h$6ZcG>^wpZ;}2_~*~@_^khbcKq+V$N&5r{<+os z^Bv|6uD{RO|Ks#s@+M$9_SXdywsT_t>k6}ri-=2zh_mxwcD1%OXO}RQHWNE!CM|1e zDkm#rDJyMiDj^{*BX-$BT*_QdLdIO$((;gnjJW`_Ee_}Z<9`BsQUZcgDyPN&7gyTa ArT_o{ diff --git a/connectors/examples/convert-to-delta/src/main/resources/external/sales/part-00000-c4f4550a-83d5-4c35-bdb6-9f8bd1a9d154-c000.snappy.parquet b/connectors/examples/convert-to-delta/src/main/resources/external/sales/part-00000-c4f4550a-83d5-4c35-bdb6-9f8bd1a9d154-c000.snappy.parquet deleted file mode 100644 index 802bc008a59c007ad96760905699d7a095144fc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318922 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

Nj6DL*fsbbl{8!3D~Sq>tR9+@Garqp&Un`R|Iye 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�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 sF&4nStB+jifVQ>dZ_M{rVTCb0#@VP-@}Jx89u; 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℞_KBn^7-xqcavMv>B+O>mF>G^2 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

A#nY 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 z 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 diff --git a/connectors/examples/convert-to-delta/src/main/resources/generateParquet.py b/connectors/examples/convert-to-delta/src/main/resources/generateParquet.py deleted file mode 100644 index d6dddf2ac15..00000000000 --- a/connectors/examples/convert-to-delta/src/main/resources/generateParquet.py +++ /dev/null @@ -1,24 +0,0 @@ -import pyspark -import uuid -import random - -""" -To generate example data: -1. Change `table_path` to desired location -2. If you don't have pyspark installed: `pip3 install pyspark` -3. Run the script: `python3 generateParquet.py` -""" - -table_path = "~/connectors/examples/convert-to-delta/src/main/resources/external/sales" -spark = pyspark.sql.SparkSession.builder.appName("test").getOrCreate() - -columns = ["year", "month", "day", "sale_id", "customer", "total_cost"] - -def generate_data(): - return [(y, m, d, str(uuid.uuid4()), str(random.randrange(10000) % 26 + 65) * 3, random.random()*10000) - for d in range(1, 29) - for m in range(1, 13) - for y in range(2000, 2021)] - -for _ in range(3): - spark.sparkContext.parallelize(generate_data()).toDF(columns).repartition(1).write.parquet(table_path, mode="append") diff --git a/connectors/examples/flink-example/README.md b/connectors/examples/flink-example/README.md deleted file mode 100644 index 9d31f53667b..00000000000 --- a/connectors/examples/flink-example/README.md +++ /dev/null @@ -1,173 +0,0 @@ -# Introduction -This is an example project that shows how to use `delta-flink` connector to read/write data from/to a Delta table using Apache Flink. - -# Delta Source -Examples for Delta Flink source are using already created Delta table that can be found under -"src/main/resources/data/source_table_no_partitions" folder. -The detailed description of this table can be found in its [README.md](src/main/resources/data/source_table_no_partitions/README.md) - -For Maven and SBT examples, if you wished to use Flink connector SNAPSHOT version, -you need to build it locally and publish to your local repository. You can do it using below code: -```shell -build/sbt standaloneCosmetic/publishM2 -build/sbt flink/publishM2 -``` - -### Local IDE -To run Flink example job reading data from Delta table from Local IDE -simply run class that contains `main` method from `org.example.source` package. - - For bounded mode: - - `org.example.source.bounded.DeltaBoundedSourceExample` class. - - `org.example.source.bounded.DeltaBoundedSourceUserColumnsExample` class. - - `org.example.source.bounded.DeltaBoundedSourceVersionAsOfExample` class. - -Examples for bound mode will terminate after reading all data from Snapshot. This is expected since those are examples of batch jobs. -The ConsoleSink out in logs can look something like log snipped below, where the order of log lines can be different for every run. -``` -org.utils.ConsoleSink [] - Delta table row content: f1 -> [f1_val15], f2 -> [f2_val15], f3 -> [15] -org.utils.ConsoleSink [] - Delta table row content: f1 -> [f1_val6], f2 -> [f2_val6], f3 -> [6] -org.utils.ConsoleSink [] - Delta table row content: f1 -> [f1_val19], f2 -> [f2_val19], f3 -> [19] -``` - -For rest of the examples for bounded mode, you will see similar logs but with different number of rows (depending on version used for `versionAsOf` option) -or different number of columns depending on used value in builder's `.columnNames(String[])` method. - - For continuous mode: - - `org.example.source.continuous.DeltaContinuousSourceExample` class. - - `org.example.source.continuous.DeltaContinuousSourceStartingVersionExample` class. - - `org.example.source.continuous.DeltaContinuousSourceUserColumnsExample` class. - -Examples for continuous mode will not terminate by themselves. In order to stop, you need to terminate the manually using `ctr + c` command. -This is expected since those are examples of streaming jobs that by design run forever. -The ConsoleSink out in logs can look something like log snipped below, where the order of log lines can be different for every run. -``` -org.utils.ConsoleSink [] - Delta table row content: f1 -> [f1_val6], f2 -> [f2_val6], f3 -> [6] -org.utils.ConsoleSink [] - Delta table row content: f1 -> [f1_val19], f2 -> [f2_val19], f3 -> [19] -org.utils.ConsoleSink [] - Delta table row content: f1 -> [f1_newVal_0], f2 -> [f2_newVal_0], f3 -> [0] -org.utils.ConsoleSink [] - Delta table row content: f1 -> [f1_newVal_1], f2 -> [f2_newVal_1], f3 -> [1] -``` -The example is constructed in a way, after few moments from finishing reading Delta table consent, new records will begin to be added to the table. -The Sink connector will read them as well. New records will have `newVal` for `f1` and `f2` column values. - -For rest of the examples for continuous mode, you will see similar logs but with different number of rows (depending on version used for `startingVersion` option) -or different number of columns depending on used value in builder's `.columnNames(String[])` method. - -### Maven -To run Flink example job reading data from Delta table from Maven, simply run: -```shell -> cd examples/flink-example/ -> -> mvn package exec:java -Dexec.cleanupDaemonThreads=false -Dexec.mainClass=org.example.source.bounded.DeltaBoundedSourceExample -Dstaging.repo.url={maven_repo} -Dconnectors.version={version} -``` - -In `-Dexec.mainClass` argument you can use any of the full class names from `Local IDE` paragraph. - -### SBT -To run Flink example job reading data from Delta table from SBT, simply run: -```shell -> cd examples/ -> export STANDALONE_VERSION=x.y.z # update to desired version -> export EXTRA_MAVEN_REPO={staged_repo} # include staged repo if desired -> -> build/sbt "flinkExample/runMain org.example.source.bounded.DeltaBoundedSourceExample" -``` - -Similar to `Maven` paragraph, here you can also use any of the full class names from the `Local IDE` paragraph as `build/sbt "flinkExample/runMain` argument. - -# Delta Sink -## Run example for non-partitioned Delta table -To run example in-memory Flink job writing data a non-partitioned Delta table run: - -### Local IDE - Simply run `org.example.sink.DeltaSinkExample` class that contains `main` method - -### Maven -```shell -> cd examples/flink-example/ -> -> mvn package exec:java -Dexec.cleanupDaemonThreads=false -Dexec.mainClass=org.example.sink.DeltaSinkExample -Dstaging.repo.url={maven_repo} -Dconnectors.version={version} -``` - -### SBT -```shell -> cd examples/ -> export STANDALONE_VERSION=x.y.z # update to desired version -> export EXTRA_MAVEN_REPO={staged_repo} # include staged repo if desired -> -> build/sbt "flinkExample/runMain org.example.sink.DeltaSinkExample" -``` - -## Run example for partitioned Delta table -To run example in-memory Flink job writing data a non-partitioned Delta table run: - -### Local IDE - Simply run `org.example.sink.DeltaSinkPartitionedTableExample` class that contains `main` method - -### Maven -```shell -> cd examples/flink-example/ -> -> mvn package exec:java -Dexec.cleanupDaemonThreads=false -Dexec.mainClass=org.example.sink.DeltaSinkPartitionedTableExample -Dstaging.repo.url={maven_repo} -Dconnectors.version={version} -``` - -### SBT -```shell -> cd examples/ -> export STANDALONE_VERSION=x.y.z # update to desired version -> export EXTRA_MAVEN_REPO={staged_repo} # include staged repo if desired -> -> build/sbt "flinkExample/runMain org.example.sink.DeltaSinkPartitionedTableExample" -``` - -## Verify -After performing above steps you may observe your command line that will be printing descriptive information -about produced data. Streaming Flink job will run until manual termination and will be producing 1 event -in the interval of 800 millis by default. - -To inspect written data look inside `examples/flink-example/src/main/resources/example_table` or -`examples/flink-example/src/main/resources/example_partitioned_table` which will contain created Delta tables along with the written Parquet files. - -NOTE: there is no need to manually delete previous data to run the example job again - the example application will do it automatically - -# Run an example on a local Flink cluster -## Setup -1. Setup Flink cluster on your local machine by following the instructions provided [here](https://nightlies.apache.org/flink/flink-docs-release-1.13/try-flink/local_installation.html) (note: link redirects to Flink 1.13 release so be aware to choose your desired release). -2. Go to the examples directory in order to package the jar -```shell -> cd examples/flink-example/ -> mvn -P cluster clean package -Dstaging.repo.url={maven_repo} -Dconnectors.version={version} -``` -After that you should find the packaged fat-jar under path: `/flink-example/target/flink-example--jar-with-dependencies.jar` -3. Assuming you've downloaded and extracted Flink binaries from step 1 to the directory `` run: -```shell -> cd -> ./bin/start-cluster.sh -> ./bin/flink run -c org.example.sink.DeltaSinkExampleCluster /flink-example/target/flink-example--jar-with-dependencies.jar -``` -The example above will submit Flink example job for Delta Sink. To submit FLink example job for Delta Source use -`org.example.source.bounded.DeltaBoundedSourceClusterExample` or `org.example.source.continuous.DeltaContinuousSourceClusterExample`. -First will submit a batch job, and second will submit streaming job. - -NOTE:
-Before running cluster examples for Delta Source, you need to manually copy Delta table data from `src/main/resources/data/source_table_no_partitions` -to `/tmp/delta-flink-example/source_table`. - -## Verify -### Dela Sink -Go the http://localhost:8081 on your browser where you should find Flink UI and you will be able to inspect your running job. -You can also look for the written files under `/tmp/delta-flink-example/` directory. -![flink job ui](src/main/resources/assets/images/flink-cluster-job.png) - -### Delta Source -Go the http://localhost:8081 on your browser where you should find Flink UI and you will be able to inspect your running job. -You can also look at Task Manager logs for `ConsoleSink` output. -![flink job ui](src/main/resources/assets/images/source-pipeline.png) -![flink job logs](src/main/resources/assets/images/source-pipeline-logs.png) - -### Cleaning up -1. You cancel your job from the UI after you've verified your test. -2. To shut down the cluster go back to the command line and run -```shell -> ./bin/stop-cluster.sh -``` diff --git a/connectors/examples/flink-example/pom.xml b/connectors/examples/flink-example/pom.xml deleted file mode 100644 index e8aa0691cdb..00000000000 --- a/connectors/examples/flink-example/pom.xml +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - 4.0.0 - - org.example - flink-example - 1.1-SNAPSHOT - - - 1.8 - 1.8 - "" - 2.12 - 0.6.0-SNAPSHOT - 1.16.2 - 3.1.0 - 2.12.1 - - - - - staging-repo - ${staging.repo.url} - - - - - - io.delta - delta-flink - ${connectors.version} - - - io.delta - delta-standalone_${scala.main.version} - ${connectors.version} - - - com.fasterxml.jackson.core - jackson-databind - 2.13.5 - - - com.fasterxml.jackson.core - jackson-annotations - 2.13.5 - - - org.apache.flink - flink-clients - ${flink-version} - ${flink.scope} - - - org.apache.flink - flink-parquet - ${flink-version} - - - org.apache.hadoop - hadoop-client - ${hadoop-version} - - - org.apache.flink - flink-table-common - ${flink-version} - ${flink.scope} - - - org.apache.flink - flink-connector-files - ${flink-version} - ${flink.scope} - - - org.apache.flink - flink-table-runtime - ${flink-version} - ${flink.scope} - - - org.apache.flink - flink-table-planner_2.12 - ${flink-version} - ${flink.scope} - - - - - - org.apache.logging.log4j - log4j-slf4j-impl - ${log4j.version} - runtime - - - org.apache.logging.log4j - log4j-api - ${log4j.version} - runtime - - - org.apache.logging.log4j - log4j-core - ${log4j.version} - runtime - - - - - - local - - true - - - compile - - - - cluster - - false - - - provided - - - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.3.0 - - - - com.example.FlinkDeltaLakeProducerJob - - - - jar-with-dependencies - - - - - assemble-all - package - - single - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.8 - 1.8 - - - - - diff --git a/connectors/examples/flink-example/src/main/java/org/example/sink/DeltaSinkExample.java b/connectors/examples/flink-example/src/main/java/org/example/sink/DeltaSinkExample.java deleted file mode 100644 index e20713d0fed..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/sink/DeltaSinkExample.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (2021) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.example.sink; - -import io.delta.flink.sink.DeltaSink; -import org.apache.flink.core.fs.Path; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.apache.hadoop.conf.Configuration; -import org.utils.DeltaExampleSourceFunction; -import org.utils.Utils; -import org.utils.job.DeltaSinkLocalJobExampleBase; - -/** - * Demonstrates how the Flink Delta Sink can be used to write data to Delta table. - *

- * If you run this example then application will spawn example local Flink job generating data to - * the underlying Delta table under directory of "src/main/resources/example_table". The job will be - * run in a daemon thread while in the main app's thread there will Delta Standalone application - * reading and printing all the data to the std out. - */ -public class DeltaSinkExample extends DeltaSinkLocalJobExampleBase { - - static String TABLE_PATH = Utils.resolveExampleTableAbsolutePath("example_table"); - - public static void main(String[] args) throws Exception { - new DeltaSinkExample().run(TABLE_PATH); - } - - /** - * An example of using Flink Delta Sink in streaming pipeline. - */ - @Override - public StreamExecutionEnvironment createPipeline( - String tablePath, - int sourceParallelism, - int sinkParallelism) { - - DeltaSink deltaSink = getDeltaSink(tablePath); - StreamExecutionEnvironment env = getStreamExecutionEnvironment(); - - // Using Flink Delta Sink in processing pipeline - env - .addSource(new DeltaExampleSourceFunction()) - .setParallelism(sourceParallelism) - .sinkTo(deltaSink) - .name("MyDeltaSink") - .setParallelism(sinkParallelism); - - return env; - } - - /** - * An example of Flink Delta Sink configuration. - */ - @Override - public DeltaSink getDeltaSink(String tablePath) { - return DeltaSink - .forRowData( - new Path(TABLE_PATH), - new Configuration(), - Utils.FULL_SCHEMA_ROW_TYPE) - .build(); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/sink/DeltaSinkExampleCluster.java b/connectors/examples/flink-example/src/main/java/org/example/sink/DeltaSinkExampleCluster.java deleted file mode 100644 index 5f9237bc4f8..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/sink/DeltaSinkExampleCluster.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (2021) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.example.sink; - -import java.util.UUID; - -import io.delta.flink.sink.DeltaSink; -import org.apache.flink.core.fs.Path; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.apache.hadoop.conf.Configuration; -import org.utils.DeltaExampleSourceFunction; -import org.utils.Utils; -import org.utils.job.DeltaSinkClusterJobExampleBase; - -/** - * Demonstrates how the Flink Delta Sink can be used to write data to Delta table. - *

- * This application is supposed to be run on a Flink cluster. When run it will start to generate - * data to the underlying Delta table under directory of `/tmp/delta-flink-example/`. - */ -public class DeltaSinkExampleCluster extends DeltaSinkClusterJobExampleBase { - - static String TABLE_PATH = "/tmp/delta-flink-example/" + - UUID.randomUUID().toString().replace("-", ""); - - public static void main(String[] args) throws Exception { - new DeltaSinkExampleCluster().run(TABLE_PATH); - } - - /** - * An example of using Flink Delta Sink in streaming pipeline. - */ - @Override - public StreamExecutionEnvironment createPipeline( - String tablePath, - int sourceParallelism, - int sinkParallelism) { - - DeltaSink deltaSink = getDeltaSink(tablePath); - StreamExecutionEnvironment env = getStreamExecutionEnvironment(); - - // Using Flink Delta Sink in processing pipeline - env - .addSource(new DeltaExampleSourceFunction()) - .setParallelism(sourceParallelism) - .sinkTo(deltaSink) - .name("MyDeltaSink") - .setParallelism(sinkParallelism); - - return env; - } - - /** - * An example of Flink Delta Sink configuration. - */ - @Override - public DeltaSink getDeltaSink(String tablePath) { - return DeltaSink - .forRowData( - new Path(TABLE_PATH), - new Configuration(), - Utils.FULL_SCHEMA_ROW_TYPE) - .build(); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/sink/DeltaSinkPartitionedTableExample.java b/connectors/examples/flink-example/src/main/java/org/example/sink/DeltaSinkPartitionedTableExample.java deleted file mode 100644 index e4df05239c5..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/sink/DeltaSinkPartitionedTableExample.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (2021) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.example.sink; - -import io.delta.flink.sink.DeltaSink; -import io.delta.flink.sink.RowDataDeltaSinkBuilder; -import org.apache.flink.core.fs.Path; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.apache.hadoop.conf.Configuration; -import org.utils.DeltaExampleSourceFunction; -import org.utils.Utils; -import org.utils.job.DeltaSinkLocalJobExampleBase; - -/** - * Demonstrates how the Flink Delta Sink can be used to write data to a partitioned Delta table. - *

- * If you run this example then application will spawn example local Flink job generating data to - * the underlying Delta table under directory of "src/main/resources/example_table". The job will be - * run in a daemon thread while in the main app's thread there will Delta Standalone application - * reading and printing all the data to the std out. - */ -public class DeltaSinkPartitionedTableExample extends DeltaSinkLocalJobExampleBase { - - static String TABLE_PATH = Utils.resolveExampleTableAbsolutePath("example_partitioned_table"); - - public static void main(String[] args) throws Exception { - new DeltaSinkPartitionedTableExample().run(TABLE_PATH); - } - - /** - * An example of using Flink Delta Sink in streaming pipeline. - */ - @Override - public StreamExecutionEnvironment createPipeline( - String tablePath, - int sourceParallelism, - int sinkParallelism) { - - DeltaSink deltaSink = getDeltaSink(tablePath); - StreamExecutionEnvironment env = getStreamExecutionEnvironment(); - - // Using Flink Delta Sink in processing pipeline - env - .addSource(new DeltaExampleSourceFunction()) - .setParallelism(sourceParallelism) - .sinkTo(deltaSink) - .name("MyDeltaSink") - .setParallelism(sinkParallelism); - - return env; - } - - /** - * An example of Flink Delta Sink configuration with partition column. - */ - @Override - public DeltaSink getDeltaSink(String tablePath) { - String[] partitionCols = {"f1"}; - - RowDataDeltaSinkBuilder deltaSinkBuilder = DeltaSink.forRowData( - new Path(TABLE_PATH), new Configuration(), Utils.FULL_SCHEMA_ROW_TYPE); - deltaSinkBuilder.withPartitionColumns(partitionCols); - return deltaSinkBuilder.build(); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceClusterExample.java b/connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceClusterExample.java deleted file mode 100644 index b1f942d3178..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceClusterExample.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.example.source.bounded; - -import io.delta.flink.source.DeltaSource; -import org.apache.flink.api.common.eventtime.WatermarkStrategy; -import org.apache.flink.core.fs.Path; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.apache.hadoop.conf.Configuration; -import org.utils.ConsoleSink; -import org.utils.Utils; -import org.utils.job.bounded.DeltaBoundedSourceClusterJobExampleBase; - -/** - * Demonstrates how the Flink Delta source can be used to read data from Delta table. - *

- * This application is supposed to be run on a Flink cluster. It will try to read Delta table from - * "/tmp/delta-flink-example/source_table" folder in a batch job. - * The Delta table data has to be copied there manually from - * "src/main/resources/data/source_table_no_partitions" folder. - * Read records will be printed to log using custom Sink Function. - *

- * This configuration will read all columns from underlying Delta table from the latest Snapshot. - * If any of the columns was a partition column, connector will automatically detect it. - */ -public class DeltaBoundedSourceClusterExample extends DeltaBoundedSourceClusterJobExampleBase { - - private static final String TABLE_PATH = "/tmp/delta-flink-example/source_table"; - - public static void main(String[] args) throws Exception { - new DeltaBoundedSourceClusterExample().run(TABLE_PATH); - } - - /** - * An example of using Flink Delta Source in streaming pipeline. - */ - @Override - public StreamExecutionEnvironment createPipeline( - String tablePath, - int sourceParallelism, - int sinkParallelism) { - - DeltaSource deltaSink = getDeltaSource(tablePath); - StreamExecutionEnvironment env = getStreamExecutionEnvironment(); - - env - .fromSource(deltaSink, WatermarkStrategy.noWatermarks(), "bounded-delta-source") - .setParallelism(sourceParallelism) - .addSink(new ConsoleSink(Utils.FULL_SCHEMA_ROW_TYPE)) - .setParallelism(1); - - return env; - } - - /** - * An example of Flink Delta Source configuration that will read all columns from Delta table - * using the latest snapshot. - */ - @Override - public DeltaSource getDeltaSource(String tablePath) { - return DeltaSource.forBoundedRowData( - new Path(tablePath), - new Configuration() - ).build(); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceExample.java b/connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceExample.java deleted file mode 100644 index 52fbb0f3cea..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceExample.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.example.source.bounded; - -import io.delta.flink.source.DeltaSource; -import org.apache.flink.api.common.eventtime.WatermarkStrategy; -import org.apache.flink.core.fs.Path; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.apache.hadoop.conf.Configuration; -import org.utils.ConsoleSink; -import org.utils.Utils; -import org.utils.job.bounded.DeltaBoundedSourceLocalJobExampleBase; - -/** - * Demonstrates how the Flink Delta source can be used to read data from Delta table. - *

- * If you run this example then application will spawn example local Flink batch job that will read - * data from Delta table placed under "src/main/resources/data/source_table_no_partitions". - * Read records will be printed to log using custom Sink Function. - *

- * This configuration will read all columns from underlying Delta table from the latest Snapshot. - * If any of the columns was a partition column, connector will automatically detect it. - */ -public class DeltaBoundedSourceExample extends DeltaBoundedSourceLocalJobExampleBase { - - private static final String TABLE_PATH = - Utils.resolveExampleTableAbsolutePath("data/source_table_no_partitions"); - - public static void main(String[] args) throws Exception { - new DeltaBoundedSourceExample().run(TABLE_PATH); - } - - /** - * An example of using Flink Delta Source in streaming pipeline. - */ - @Override - public StreamExecutionEnvironment createPipeline( - String tablePath, - int sourceParallelism, - int sinkParallelism) { - - DeltaSource deltaSink = getDeltaSource(tablePath); - StreamExecutionEnvironment env = getStreamExecutionEnvironment(); - - env - .fromSource(deltaSink, WatermarkStrategy.noWatermarks(), "bounded-delta-source") - .setParallelism(sourceParallelism) - .addSink(new ConsoleSink(Utils.FULL_SCHEMA_ROW_TYPE)) - .setParallelism(1); - - return env; - } - - /** - * An example of Flink Delta Source configuration that will read all columns from Delta table - * using the latest snapshot. - */ - @Override - public DeltaSource getDeltaSource(String tablePath) { - return DeltaSource.forBoundedRowData( - new Path(tablePath), - new Configuration() - ).build(); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceUserColumnsExample.java b/connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceUserColumnsExample.java deleted file mode 100644 index 8ff5bc2458b..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceUserColumnsExample.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.example.source.bounded; - -import java.util.Arrays; - -import io.delta.flink.source.DeltaSource; -import org.apache.flink.api.common.eventtime.WatermarkStrategy; -import org.apache.flink.core.fs.Path; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.apache.flink.table.types.logical.IntType; -import org.apache.flink.table.types.logical.RowType; -import org.apache.flink.table.types.logical.VarCharType; -import org.apache.hadoop.conf.Configuration; -import org.utils.ConsoleSink; -import org.utils.Utils; -import org.utils.job.bounded.DeltaBoundedSourceLocalJobExampleBase; - -/** - * Demonstrates how the Flink Delta source can be used to read data from Delta table. - *

- * If you run this example then application will spawn example local Flink batch job that will read - * data from Delta table placed under "src/main/resources/data/source_table_no_partitions". - * Read records will be printed to log using custom Sink Function. - *

- * This configuration will read only columns specified by user. - * If any of the columns was a partition column, connector will automatically detect it. - * Source will read data from the latest snapshot. - */ -public class DeltaBoundedSourceUserColumnsExample extends DeltaBoundedSourceLocalJobExampleBase { - - private static final String TABLE_PATH = - Utils.resolveExampleTableAbsolutePath("data/source_table_no_partitions"); - - private static final RowType ROW_TYPE = new RowType(Arrays.asList( - new RowType.RowField("f1", new VarCharType(VarCharType.MAX_LENGTH)), - new RowType.RowField("f3", new IntType()) - )); - - public static void main(String[] args) throws Exception { - new DeltaBoundedSourceUserColumnsExample().run(TABLE_PATH); - } - - /** - * An example of using Flink Delta Source in streaming pipeline. - */ - @Override - public StreamExecutionEnvironment createPipeline( - String tablePath, - int sourceParallelism, - int sinkParallelism) { - - DeltaSource deltaSink = getDeltaSource(tablePath); - StreamExecutionEnvironment env = getStreamExecutionEnvironment(); - - env - .fromSource(deltaSink, WatermarkStrategy.noWatermarks(), "bounded-delta-source") - .setParallelism(sourceParallelism) - .addSink(new ConsoleSink(ROW_TYPE)) - .setParallelism(1); - - return env; - } - - // TODO PR 18 implement .option("columnNames", ...) was missed. - /** - * An example of Flink Delta Source configuration that will read only columns specified by user. - * via {@code .columnNames(...)} method. Alternatively, the {@code .option("columnNames", - * List names} method can be used. - */ - @Override - public DeltaSource getDeltaSource(String tablePath) { - return DeltaSource.forBoundedRowData( - new Path(tablePath), - new Configuration() - ) - .columnNames("f1", "f3") - .build(); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceVersionAsOfExample.java b/connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceVersionAsOfExample.java deleted file mode 100644 index 524e153d009..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/source/bounded/DeltaBoundedSourceVersionAsOfExample.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.example.source.bounded; - -import io.delta.flink.source.DeltaSource; -import org.apache.flink.api.common.eventtime.WatermarkStrategy; -import org.apache.flink.core.fs.Path; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.apache.hadoop.conf.Configuration; -import org.utils.ConsoleSink; -import org.utils.Utils; -import org.utils.job.bounded.DeltaBoundedSourceLocalJobExampleBase; - -/** - * Demonstrates how the Flink Delta source can be used to read data from Delta table from - * specific Delta Snapshot version. - *

- * If you run this example then application will spawn example local Flink batch job that will read - * data from Delta table placed under "src/main/resources/data/source_table_no_partitions". - * Read records will be printed to log using custom Sink Function. - *

- * This configuration will read all columns from underlying Delta table from version - * specified by source configuration. - * If any of the columns was a partition column, connector will automatically detect it. - */ -public class DeltaBoundedSourceVersionAsOfExample extends DeltaBoundedSourceLocalJobExampleBase { - - private static final String TABLE_PATH = - Utils.resolveExampleTableAbsolutePath("data/source_table_no_partitions"); - - public static void main(String[] args) throws Exception { - new DeltaBoundedSourceVersionAsOfExample().run(TABLE_PATH); - } - - /** - * An example of using Flink Delta Source in streaming pipeline. - */ - @Override - public StreamExecutionEnvironment createPipeline( - String tablePath, - int sourceParallelism, - int sinkParallelism) { - - DeltaSource deltaSink = getDeltaSource(tablePath); - StreamExecutionEnvironment env = getStreamExecutionEnvironment(); - - env - .fromSource(deltaSink, WatermarkStrategy.noWatermarks(), "bounded-delta-source") - .setParallelism(sourceParallelism) - .addSink(new ConsoleSink(Utils.FULL_SCHEMA_ROW_TYPE)) - .setParallelism(1); - - return env; - } - - /** - * An example of Flink Delta Source configuration that will from defined Delta snapshot version. - * The version can be used via {@code .versionAsOf(long)} method. Alternatively, - * the {@code .option("versionAsOf", long} method can be used. - */ - @Override - public DeltaSource getDeltaSource(String tablePath) { - return DeltaSource.forBoundedRowData( - new Path(tablePath), - new Configuration() - ) - .versionAsOf(1) - .build(); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceClusterExample.java b/connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceClusterExample.java deleted file mode 100644 index 920a396e60c..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceClusterExample.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.example.source.continuous; - -import io.delta.flink.source.DeltaSource; -import org.apache.flink.api.common.eventtime.WatermarkStrategy; -import org.apache.flink.core.fs.Path; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.apache.hadoop.conf.Configuration; -import org.utils.ConsoleSink; -import org.utils.Utils; -import org.utils.job.continuous.DeltaContinuousSourceClusterJobExampleBase; - -/** - * Demonstrates how the Flink Delta source can be used to read data from Delta table. - *

- * This application is supposed to be run on a Flink cluster. It will try to read Delta table from - * "/tmp/delta-flink-example/source_table" folder in a streaming job. - * The Delta table data has to be copied there manually from - * "src/main/resources/data/source_table_no_partitions" folder. - * Read records will be printed to log using custom Sink Function. - *

- * This configuration will read all columns from underlying Delta table from the latest Snapshot. - * If any of the columns was a partition column, connector will automatically detect it. - */ -public class DeltaContinuousSourceClusterExample extends - DeltaContinuousSourceClusterJobExampleBase { - - private static final String TABLE_PATH = "/tmp/delta-flink-example/source_table"; - - public static void main(String[] args) throws Exception { - new DeltaContinuousSourceClusterExample().run(TABLE_PATH); - } - - /** - * An example of using Flink Delta Source in streaming pipeline. - */ - @Override - public StreamExecutionEnvironment createPipeline( - String tablePath, - int sourceParallelism, - int sinkParallelism) { - - DeltaSource deltaSink = getDeltaSource(tablePath); - StreamExecutionEnvironment env = getStreamExecutionEnvironment(); - - env - .fromSource(deltaSink, WatermarkStrategy.noWatermarks(), "continuous-delta-source") - .setParallelism(sourceParallelism) - .addSink(new ConsoleSink(Utils.FULL_SCHEMA_ROW_TYPE)) - .name("Console Sink") - .setParallelism(1); - - return env; - } - - /** - * An example of Flink Delta Source configuration that will read all columns from Delta table - * using the latest snapshot. The {@code .forContinuousRowData(...) } creates Delta Flink - * source that will monitor delta table for any new changes. - */ - @Override - public DeltaSource getDeltaSource(String tablePath) { - return DeltaSource.forContinuousRowData( - new Path(tablePath), - new Configuration() - ).build(); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceExample.java b/connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceExample.java deleted file mode 100644 index 3f0c9f5d8aa..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceExample.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.example.source.continuous; - -import io.delta.flink.source.DeltaSource; -import org.apache.flink.api.common.eventtime.WatermarkStrategy; -import org.apache.flink.core.fs.Path; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.apache.hadoop.conf.Configuration; -import org.utils.ConsoleSink; -import org.utils.Utils; -import org.utils.job.continuous.DeltaContinuousSourceLocalJobExampleBase; - -/** - * Demonstrates how the Flink Delta source can be used to read data from Delta table. - *

- * If you run this example then application will spawn example local Flink streaming job that will - * read data from Delta table placed under "src/main/resources/data/source_table_no_partitions" - * and will start to actively monitor this table for any new changes. - * Read records will be printed to log using custom Sink Function. - *

- * This configuration will read all columns from underlying Delta table from the latest Snapshot. - * If any of the columns was a partition column, connector will automatically detect it. - */ -public class DeltaContinuousSourceExample extends DeltaContinuousSourceLocalJobExampleBase { - - private static final String TABLE_PATH = - Utils.resolveExampleTableAbsolutePath("data/source_table_no_partitions"); - - public static void main(String[] args) throws Exception { - new DeltaContinuousSourceExample().run(TABLE_PATH); - } - - /** - * An example of using Flink Delta Source in streaming pipeline. - */ - @Override - public StreamExecutionEnvironment createPipeline( - String tablePath, - int sourceParallelism, - int sinkParallelism) { - - DeltaSource deltaSink = getDeltaSource(tablePath); - StreamExecutionEnvironment env = getStreamExecutionEnvironment(); - - env - .fromSource(deltaSink, WatermarkStrategy.noWatermarks(), "continuous-delta-source") - .setParallelism(sourceParallelism) - .addSink(new ConsoleSink(Utils.FULL_SCHEMA_ROW_TYPE)) - .setParallelism(1); - - return env; - } - - /** - * An example of Flink Delta Source configuration that will read all columns from Delta table - * using the latest snapshot. The {@code .forContinuousRowData(...) } creates Delta Flink - * source that will monitor delta table for any new changes. - */ - @Override - public DeltaSource getDeltaSource(String tablePath) { - return DeltaSource.forContinuousRowData( - new Path(tablePath), - new Configuration() - ).build(); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceStartingVersionExample.java b/connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceStartingVersionExample.java deleted file mode 100644 index ae4ac3fc1bc..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceStartingVersionExample.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.example.source.continuous; - -import io.delta.flink.source.DeltaSource; -import org.apache.flink.api.common.eventtime.WatermarkStrategy; -import org.apache.flink.core.fs.Path; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.apache.hadoop.conf.Configuration; -import org.utils.ConsoleSink; -import org.utils.Utils; -import org.utils.job.continuous.DeltaContinuousSourceLocalJobExampleBase; - -/** - * Demonstrates how the Flink Delta source can be used to read data from Delta table. - *

- * If you run this example then application will spawn example local Flink streaming job that will - * read changes from Delta table placed under "src/main/resources/data/source_table_no_partitions" - * starting from version specified by user via {@code .startingVersion(long)} method. - * After that, source connector will start to actively monitor this table for any new changes. - * Read records will be printed to log using custom Sink Function. - */ -public class DeltaContinuousSourceStartingVersionExample extends - DeltaContinuousSourceLocalJobExampleBase { - - private static final String TABLE_PATH = - Utils.resolveExampleTableAbsolutePath("data/source_table_no_partitions"); - - public static void main(String[] args) throws Exception { - new DeltaContinuousSourceStartingVersionExample().run(TABLE_PATH); - } - - /** - * An example of using Flink Delta Source in streaming pipeline. - */ - @Override - public StreamExecutionEnvironment createPipeline( - String tablePath, - int sourceParallelism, - int sinkParallelism) { - - DeltaSource deltaSink = getDeltaSource(tablePath); - StreamExecutionEnvironment env = getStreamExecutionEnvironment(); - - env - .fromSource(deltaSink, WatermarkStrategy.noWatermarks(), "continuous-delta-source") - .setParallelism(sourceParallelism) - .addSink(new ConsoleSink(Utils.FULL_SCHEMA_ROW_TYPE)) - .setParallelism(1); - - return env; - } - - /** - * An example of Flink Delta Source configuration that will read all columns from Delta table. - * This source will read only changes added to the table starting from version specified via - * {@code .startingVersion(long)} method. - * Alternatively the {@code .option("startingVersion", Long)} or {@code .option - * ("startingVersion", String)} options can be used. - *

- * The {@code .forContinuousRowData(...)} creates Delta Flink source that will monitor - * delta table for any new changes. - */ - @Override - public DeltaSource getDeltaSource(String tablePath) { - return DeltaSource.forContinuousRowData( - new Path(tablePath), - new Configuration() - ) - .startingVersion(10) - .build(); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceUserColumnsExample.java b/connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceUserColumnsExample.java deleted file mode 100644 index 26576700895..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/source/continuous/DeltaContinuousSourceUserColumnsExample.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.example.source.continuous; - -import java.util.Arrays; - -import io.delta.flink.source.DeltaSource; -import org.apache.flink.api.common.eventtime.WatermarkStrategy; -import org.apache.flink.core.fs.Path; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.apache.flink.table.types.logical.IntType; -import org.apache.flink.table.types.logical.RowType; -import org.apache.flink.table.types.logical.VarCharType; -import org.apache.hadoop.conf.Configuration; -import org.utils.ConsoleSink; -import org.utils.Utils; -import org.utils.job.continuous.DeltaContinuousSourceLocalJobExampleBase; - -/** - * Demonstrates how the Flink Delta source can be used to read data from Delta table. - *

- * If you run this example then application will spawn example local Flink streaming job that will - * read data from Delta table placed under "src/main/resources/data/source_table_no_partitions" - * and will start to actively monitor this table for any new changes. - * Read records will be printed to log using custom Sink Function. - *

- * This configuration will read only columns specified by user. - * If any of the columns was a partition column, connector will automatically detect it. - */ -public class DeltaContinuousSourceUserColumnsExample extends - DeltaContinuousSourceLocalJobExampleBase { - - private static final String TABLE_PATH = - Utils.resolveExampleTableAbsolutePath("data/source_table_no_partitions"); - - private static final RowType ROW_TYPE = new RowType(Arrays.asList( - new RowType.RowField("f1", new VarCharType(VarCharType.MAX_LENGTH)), - new RowType.RowField("f3", new IntType()) - )); - - public static void main(String[] args) throws Exception { - new DeltaContinuousSourceUserColumnsExample().run(TABLE_PATH); - } - - /** - * An example of using Flink Delta Source in streaming pipeline. - */ - @Override - public StreamExecutionEnvironment createPipeline( - String tablePath, - int sourceParallelism, - int sinkParallelism) { - - DeltaSource deltaSink = getDeltaSource(tablePath); - StreamExecutionEnvironment env = getStreamExecutionEnvironment(); - - env - .fromSource(deltaSink, WatermarkStrategy.noWatermarks(), "continuous-delta-source") - .setParallelism(sourceParallelism) - .addSink(new ConsoleSink(ROW_TYPE)) - .setParallelism(1); - - return env; - } - - // TODO PR 18 implement .option("columnNames", ...) was missed. - /** - * An example of Flink Delta Source configuration that will read only columns specified by user. - * via {@code .columnNames(...)} method. Alternatively, the {@code .option("columnNames", - * List names} method can be used. The {@code .forContinuousRowData(...) } creates - * Delta Flink source that will monitor delta table for any new changes. - */ - @Override - public DeltaSource getDeltaSource(String tablePath) { - return DeltaSource.forContinuousRowData( - new Path(tablePath), - new Configuration() - ) - .columnNames("f1", "f3") - .build(); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/sql/StreamingApiDeltaSourceToTableDeltaSinkJob.java b/connectors/examples/flink-example/src/main/java/org/example/sql/StreamingApiDeltaSourceToTableDeltaSinkJob.java deleted file mode 100644 index 6457e1b9f0a..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/sql/StreamingApiDeltaSourceToTableDeltaSinkJob.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.example.sql; - -import java.util.UUID; -import java.util.concurrent.TimeUnit; - -import io.delta.flink.source.DeltaSource; -import org.apache.flink.api.common.eventtime.WatermarkStrategy; -import org.apache.flink.core.fs.Path; -import org.apache.flink.streaming.api.datastream.DataStreamSource; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.api.Table; -import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; -import org.apache.flink.table.data.RowData; -import org.apache.hadoop.conf.Configuration; -import org.utils.Utils; -import static org.utils.job.sql.SqlExampleBase.createTableStreamingEnv; -import static org.utils.job.sql.SqlExampleBase.createTestStreamEnv; - -/** - * This is an example of using Delta Connector both in Streaming and Table API. In this example a - * Delta Source will be created using Streaming API and will be registered as Flink table. Next we - * will use Flink SQL to read data from it using SELECT statement and write back to newly created - * Delta table defined by CREATE TABLE statement. - */ -public class StreamingApiDeltaSourceToTableDeltaSinkJob { - - private static final String SOURCE_TABLE_PATH = Utils.resolveExampleTableAbsolutePath( - "data/source_table_no_partitions"); - - private static final String SINK_TABLE_PATH = Utils.resolveExampleTableAbsolutePath( - "example_streamingToTableAPI_table_" + UUID.randomUUID().toString().split("-")[0]); - - public static void main(String[] args) throws Exception { - StreamExecutionEnvironment streamEnv = createTestStreamEnv(false); // isStreaming = false - StreamTableEnvironment tableEnv = createTableStreamingEnv(streamEnv); - createPipeline(streamEnv, tableEnv); - } - - private static void createPipeline( - StreamExecutionEnvironment streamEnv, - StreamTableEnvironment tableEnv) throws Exception { - - // Set up a Delta Source using Flink's Streaming API. - DeltaSource deltaSource = DeltaSource.forBoundedRowData( - new Path(SOURCE_TABLE_PATH), - new Configuration() - ).build(); - - // create a source stream from Delta Source connector. - DataStreamSource sourceStream = - streamEnv.fromSource(deltaSource, WatermarkStrategy.noWatermarks(), "delta-source"); - - // setup Delta Catalog - tableEnv.executeSql("CREATE CATALOG myDeltaCatalog WITH ('type' = 'delta-catalog')"); - tableEnv.executeSql("USE CATALOG myDeltaCatalog"); - - // Convert source stream into Flink's table and register it as temporary view under - // "InputTable" name. - Table sourceTable = tableEnv.fromDataStream(sourceStream); - tableEnv.createTemporaryView("InputTable", sourceTable); - - // Create Sink Delta table using Flink SQL API. - tableEnv.executeSql(String.format("" - + "CREATE TABLE sinkTable (" - + "f1 STRING," - + "f2 STRING," - + "f3 INT" - + ") WITH (" - + " 'connector' = 'delta'," - + " 'table-path' = '%s'" - + ")", - SINK_TABLE_PATH) - ); - - // Insert into sinkTable all rows read by Delta Source that is registered as "InputTable" - // view. - tableEnv.executeSql("INSERT INTO sinkTable SELECT * FROM InputTable") - .await(10, TimeUnit.SECONDS); - - // Read and print all rows from sinkTable using Flink SQL. - tableEnv.executeSql("SELECT * FROM sinkTable").print(); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/sql/insert/InsertTableExample.java b/connectors/examples/flink-example/src/main/java/org/example/sql/insert/InsertTableExample.java deleted file mode 100644 index a8362309254..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/sql/insert/InsertTableExample.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.example.sql.insert; - -import java.util.UUID; - -import org.apache.flink.table.api.Table; -import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; -import org.utils.Utils; -import org.utils.job.sql.SqlSinkExampleBase; - -/** - * This is an example of executing a INSERT query on Delta Table using Flink SQL. - */ -public class InsertTableExample extends SqlSinkExampleBase { - - static String TABLE_PATH = Utils.resolveExampleTableAbsolutePath( - "example_table_" + UUID.randomUUID().toString().split("-")[0]); - - public static void main(String[] args) - throws Exception { - new InsertTableExample().run(TABLE_PATH); - } - - @Override - protected Table runSqlJob(String tablePath, StreamTableEnvironment tableEnv) { - - // setup Delta Catalog - tableEnv.executeSql("CREATE CATALOG myDeltaCatalog WITH ('type' = 'delta-catalog')"); - tableEnv.executeSql("USE CATALOG myDeltaCatalog"); - - // SQL definition for Delta Table where we will insert rows. - tableEnv.executeSql(String.format("" - + "CREATE TABLE sinkTable (" - + "f1 STRING," - + "f2 STRING," - + "f3 INT" - + ") WITH (" - + " 'connector' = 'delta'," - + " 'table-path' = '%s'" - + ")", - tablePath) - ); - - // A SQL query that inserts three rows (three columns per row) into sinkTable. - tableEnv.executeSql("" - + "INSERT INTO sinkTable VALUES " - + "('a', 'b', 1)," - + "('c', 'd', 2)," - + "('e', 'f', 3)" - ); - return null; - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/sql/select/bounded/SelectBoundedTableExample.java b/connectors/examples/flink-example/src/main/java/org/example/sql/select/bounded/SelectBoundedTableExample.java deleted file mode 100644 index a62c4d792b2..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/sql/select/bounded/SelectBoundedTableExample.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.example.sql.select.bounded; - -import org.apache.flink.table.api.Table; -import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; -import org.utils.Utils; -import org.utils.job.sql.BoundedSqlSourceExampleBase; - -/** - * This is an example of executing a bounded SELECT query on Delta Table using Flink SQL. - */ -public class SelectBoundedTableExample extends BoundedSqlSourceExampleBase { - - private static final String TABLE_PATH = - Utils.resolveExampleTableAbsolutePath("data/source_table_no_partitions"); - - public static void main(String[] args) throws Exception { - new SelectBoundedTableExample().run(TABLE_PATH); - } - - @Override - protected Table runSqlJob(String tablePath, StreamTableEnvironment tableEnv) { - - // setup Delta Catalog - tableEnv.executeSql("CREATE CATALOG myDeltaCatalog WITH ('type' = 'delta-catalog')"); - tableEnv.executeSql("USE CATALOG myDeltaCatalog"); - - // SQL definition for Delta Table where we will insert rows. - tableEnv.executeSql(String.format("" - + "CREATE TABLE sourceTable (" - + "f1 STRING," - + "f2 STRING," - + "f3 INT" - + ") WITH (" - + " 'connector' = 'delta'," - + " 'table-path' = '%s'" - + ")", - tablePath) - ); - - // A batch SQL query that fetches all columns from sourceTable. The batch mode is a - // default mode for SQL queries on Delta Table. - return tableEnv.sqlQuery("SELECT * FROM sourceTable"); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/sql/select/bounded/SelectBoundedTableVersionAsOfExample.java b/connectors/examples/flink-example/src/main/java/org/example/sql/select/bounded/SelectBoundedTableVersionAsOfExample.java deleted file mode 100644 index 7713d7dcba6..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/sql/select/bounded/SelectBoundedTableVersionAsOfExample.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.example.sql.select.bounded; - -import org.apache.flink.table.api.Table; -import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; -import org.utils.Utils; -import org.utils.job.sql.BoundedSqlSourceExampleBase; - -/** - * This is an example of executing a bounded SELECT query on Delta Table using Flink SQL - * that will read Delta table from version specified by `versionAsOf` option. - */ -public class SelectBoundedTableVersionAsOfExample extends BoundedSqlSourceExampleBase { - - private static final String TABLE_PATH = - Utils.resolveExampleTableAbsolutePath("data/source_table_no_partitions"); - - public static void main(String[] args) throws Exception { - new SelectBoundedTableVersionAsOfExample().run(TABLE_PATH); - } - - @Override - protected Table runSqlJob(String tablePath, StreamTableEnvironment tableEnv) { - - // setup Delta Catalog - tableEnv.executeSql("CREATE CATALOG myDeltaCatalog WITH ('type' = 'delta-catalog')"); - tableEnv.executeSql("USE CATALOG myDeltaCatalog"); - - // SQL definition for Delta Table where we will insert rows. - tableEnv.executeSql(String.format("" - + "CREATE TABLE sourceTable (" - + "f1 STRING," - + "f2 STRING," - + "f3 INT" - + ") WITH (" - + " 'connector' = 'delta'," - + " 'table-path' = '%s'" - + ")", - tablePath) - ); - - // A SQL query that fetches all columns from sourceTable starting from Delta version 1. - // This query runs in batch mode which is a default mode for SQL queries on Delta Table. - return tableEnv.sqlQuery("SELECT * FROM sourceTable /*+ OPTIONS('versionAsOf' = '1') */"); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/sql/select/continuous/SelectContinuousTableExample.java b/connectors/examples/flink-example/src/main/java/org/example/sql/select/continuous/SelectContinuousTableExample.java deleted file mode 100644 index d224dae6f3f..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/sql/select/continuous/SelectContinuousTableExample.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.example.sql.select.continuous; - -import org.apache.flink.table.api.Table; -import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; -import org.utils.Utils; -import org.utils.job.sql.ContinuousSqlSourceExampleBase; - -/** - * This is an example of executing a continuous SELECT query on Delta Table using Flink SQL. - */ -public class SelectContinuousTableExample extends ContinuousSqlSourceExampleBase { - - private static final String TABLE_PATH = - Utils.resolveExampleTableAbsolutePath("data/source_table_no_partitions"); - - public static void main(String[] args) throws Exception { - new SelectContinuousTableExample().run(TABLE_PATH); - } - - @Override - protected Table runSqlJob(String tablePath, StreamTableEnvironment tableEnv) { - - // setup Delta Catalog - tableEnv.executeSql("CREATE CATALOG myDeltaCatalog WITH ('type' = 'delta-catalog')"); - tableEnv.executeSql("USE CATALOG myDeltaCatalog"); - - // SQL definition for Delta Table where we will insert rows. - tableEnv.executeSql(String.format("" - + "CREATE TABLE sourceTable (" - + "f1 STRING," - + "f2 STRING," - + "f3 INT" - + ") WITH (" - + " 'connector' = 'delta'," - + " 'table-path' = '%s'" - + ")", - tablePath) - ); - - // A SQL query that fetches all columns from sourceTable. - // This query runs in continuous mode. - return tableEnv.sqlQuery("SELECT * FROM sourceTable /*+ OPTIONS('mode' = 'streaming') */"); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/example/sql/select/continuous/SelectContinuousTableStartingVersionExample.java b/connectors/examples/flink-example/src/main/java/org/example/sql/select/continuous/SelectContinuousTableStartingVersionExample.java deleted file mode 100644 index 462a0f73bdc..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/example/sql/select/continuous/SelectContinuousTableStartingVersionExample.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.example.sql.select.continuous; - -import org.apache.flink.table.api.Table; -import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; -import org.utils.Utils; -import org.utils.job.sql.ContinuousSqlSourceExampleBase; - -/** - * This is an example of executing a continuous SELECT query on Delta Table using Flink SQL - * that will read Delta table from version specified by `startingVersion` option. - */ -public class SelectContinuousTableStartingVersionExample extends ContinuousSqlSourceExampleBase { - - private static final String TABLE_PATH = - Utils.resolveExampleTableAbsolutePath("data/source_table_no_partitions"); - - public static void main(String[] args) throws Exception { - new SelectContinuousTableStartingVersionExample().run(TABLE_PATH); - } - - @Override - protected Table runSqlJob(String tablePath, StreamTableEnvironment tableEnv) { - - // setup Delta Catalog - tableEnv.executeSql("CREATE CATALOG myDeltaCatalog WITH ('type' = 'delta-catalog')"); - tableEnv.executeSql("USE CATALOG myDeltaCatalog"); - - // SQL definition for Delta Table where we will insert rows. - tableEnv.executeSql(String.format("" - + "CREATE TABLE sourceTable (" - + "f1 STRING," - + "f2 STRING," - + "f3 INT" - + ") WITH (" - + " 'connector' = 'delta'," - + " 'table-path' = '%s'" - + ")", - tablePath) - ); - - // A SQL query that fetches all columns from sourceTable starting from Delta version 10. - // This query runs in continuous mode. - return tableEnv.sqlQuery("" - + "SELECT * FROM sourceTable " - + "/*+ OPTIONS('mode' = 'streaming', 'startingVersion' = '10') */" - ); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/ConsoleSink.java b/connectors/examples/flink-example/src/main/java/org/utils/ConsoleSink.java deleted file mode 100644 index ece9c5cb57e..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/ConsoleSink.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.utils; - -import java.util.List; -import java.util.StringJoiner; - -import org.apache.flink.streaming.api.functions.sink.RichSinkFunction; -import org.apache.flink.table.data.RowData; -import org.apache.flink.table.types.logical.RowType; -import org.apache.flink.table.types.logical.RowType.RowField; -import org.apache.flink.util.Preconditions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ConsoleSink extends RichSinkFunction { - - private static final Logger LOG = LoggerFactory.getLogger(ConsoleSink.class); - - private final RowType rowType; - - public ConsoleSink(RowType rowType) { - Preconditions.checkNotNull(rowType); - this.rowType = rowType; - } - - @Override - public void invoke(RowData row, Context context) throws Exception { - - int i = 0; - StringJoiner joiner = new StringJoiner(", "); - List fields = rowType.getFields(); - for (RowField field : fields) { - Object value = field.getType().accept(new ValueVisitor(row, i++)); - joiner.add( field.getName() + " -> [" + value + "]"); - } - - LOG.info("Delta table row content: " + joiner); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/DeltaExampleSourceFunction.java b/connectors/examples/flink-example/src/main/java/org/utils/DeltaExampleSourceFunction.java deleted file mode 100644 index ae310430e6e..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/DeltaExampleSourceFunction.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.utils; - -import java.util.concurrent.ThreadLocalRandom; - -import org.apache.flink.streaming.api.functions.source.RichParallelSourceFunction; -import org.apache.flink.table.data.RowData; -import org.apache.flink.table.data.util.DataFormatConverters; -import org.apache.flink.table.types.utils.TypeConversions; -import org.apache.flink.types.Row; - -/** - * Internal class providing mock implementation for example stream source. - *

- * This streaming source will be generating events of type {@link Utils#FULL_SCHEMA_ROW_TYPE} with - * interval of {@link DeltaExampleSourceFunction#NEXT_ROW_INTERVAL_MILLIS} that will be further - * fed to the Flink job until the parent process is stopped. - */ -public class DeltaExampleSourceFunction extends RichParallelSourceFunction { - - static int NEXT_ROW_INTERVAL_MILLIS = 800; - - public static final DataFormatConverters.DataFormatConverter CONVERTER = - DataFormatConverters.getConverterForDataType( - TypeConversions.fromLogicalToDataType(Utils.FULL_SCHEMA_ROW_TYPE) - ); - - private volatile boolean cancelled = false; - - @Override - public void run(SourceContext ctx) throws InterruptedException { - ThreadLocalRandom random = ThreadLocalRandom.current(); - while (!cancelled) { - - RowData row = CONVERTER.toInternal( - Row.of( - String.valueOf(random.nextInt(0, 10)), - String.valueOf(random.nextInt(0, 100)), - random.nextInt(0, 30)) - ); - ctx.collect(row); - Thread.sleep(NEXT_ROW_INTERVAL_MILLIS); - } - } - - @Override - public void cancel() { - cancelled = true; - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/DeltaTableUpdater.java b/connectors/examples/flink-example/src/main/java/org/utils/DeltaTableUpdater.java deleted file mode 100644 index 29d255c09c5..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/DeltaTableUpdater.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.utils; - -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.UUID; - -import org.apache.flink.api.common.serialization.BulkWriter; -import org.apache.flink.core.fs.FileSystem.WriteMode; -import org.apache.flink.core.fs.Path; -import org.apache.flink.formats.parquet.ParquetWriterFactory; -import org.apache.flink.formats.parquet.row.ParquetRowDataBuilder; -import org.apache.flink.table.data.RowData; -import org.apache.flink.table.data.util.DataFormatConverters; -import org.apache.flink.table.data.util.DataFormatConverters.DataFormatConverter; -import org.apache.flink.table.types.logical.RowType; -import org.apache.flink.table.types.utils.TypeConversions; -import org.apache.flink.types.Row; -import org.apache.hadoop.conf.Configuration; - -import io.delta.standalone.DeltaLog; -import io.delta.standalone.Operation; -import io.delta.standalone.OptimisticTransaction; -import io.delta.standalone.actions.AddFile; - -/** - * This class inserts new data into Delta table. - */ -public class DeltaTableUpdater { - - private static final String ENGINE_INFO = "local"; - - private static final Configuration configuration = new Configuration(); - - private final String deltaTablePath; - - public DeltaTableUpdater(String deltaTablePath) { - this.deltaTablePath = deltaTablePath; - } - - /** - * Writes records to Delta table accordingly to {@link Descriptor}. All new data from {@link - * Descriptor} will be inserted into Delta table under one commit, creating one new Delta - * version for entire {@link Descriptor}. - */ - public void writeToTable(Descriptor descriptor) { - List rows = descriptor.getRows(); - RowType rowType = descriptor.getRowType(); - - try { - long now = System.currentTimeMillis(); - DeltaLog deltaLog = DeltaLog.forTable(configuration, deltaTablePath); - - Path pathToParquet = writeToParquet(deltaTablePath, rowType, rows); - - AddFile addFile = - AddFile.builder(pathToParquet.getPath(), Collections.emptyMap(), rows.size(), now, - true) - .build(); - - // Commit Delta transaction. - // Start new Delta transaction. - OptimisticTransaction txn = deltaLog.startTransaction(); - Operation op = new Operation(Operation.Name.WRITE); - txn.commit(Collections.singletonList(addFile), op, ENGINE_INFO); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - /** - * Writes Rows into Parquet files. - * - * @param deltaTablePath Root folder under which a Parquet file should be created. - * @param rowType A {@link RowType} describing column types for rows. - * @param rows A {@link List} of rows to write into the Parquet file. - * @return A {@link Path} to created Parquet file. - * @throws IOException {@link IOException} in case of any IO issue during writing to Parquet - * file. - */ - private Path writeToParquet(String deltaTablePath, RowType rowType, List rows) - throws IOException { - - ParquetWriterFactory factory = - ParquetRowDataBuilder.createWriterFactory(rowType, configuration, false); - - Path path = new Path(deltaTablePath, UUID.randomUUID().toString()); - BulkWriter writer = - factory.create(path.getFileSystem().create(path, WriteMode.OVERWRITE)); - - DataFormatConverter converter = getConverter(rowType); - for (Row row : rows) { - writer.addElement(converter.toInternal(row)); - } - - writer.flush(); - writer.finish(); - - return path; - } - - @SuppressWarnings("unchecked") - private DataFormatConverter getConverter(RowType rowType) { - return (DataFormatConverter) DataFormatConverters.getConverterForDataType( - TypeConversions.fromLogicalToDataType(rowType)); - } - -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/Descriptor.java b/connectors/examples/flink-example/src/main/java/org/utils/Descriptor.java deleted file mode 100644 index bd816496783..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/Descriptor.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.utils; - -import java.util.Collections; -import java.util.List; - -import org.apache.flink.table.types.logical.RowType; -import org.apache.flink.types.Row; - -/** - * This class describes a Delta table update scenario for IT case test. Information from this class - * is used by updater thread that updates Delta table with new rows during test run. - */ -public class Descriptor { - - /** - * Path to Delta table - */ - private final String tablePath; - - /** - * A {@link RowType} that describes both column names and column types for table row. - */ - private final RowType rowType; - - /** - * A {@link List} of rows that should be inserted into Delta table. - */ - private final List rows; - - public Descriptor(String tablePath, RowType rowType, List rows) { - this.tablePath = tablePath; - this.rowType = rowType; - this.rows = rows; - } - - public RowType getRowType() { - return rowType; - } - - public List getRows() { - return Collections.unmodifiableList(rows); - } - - public int getNumberOfNewRows() { - return rows.size(); - } - - public String getTablePath() { - return tablePath; - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/Utils.java b/connectors/examples/flink-example/src/main/java/org/utils/Utils.java deleted file mode 100644 index 2c46f513449..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/Utils.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.utils; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.flink.table.types.logical.IntType; -import org.apache.flink.table.types.logical.RowType; -import org.apache.flink.table.types.logical.VarCharType; -import org.apache.flink.types.Row; - -import io.delta.standalone.DeltaLog; -import io.delta.standalone.Snapshot; -import io.delta.standalone.data.CloseableIterator; -import io.delta.standalone.data.RowRecord; - -public final class Utils { - - static int PRINT_PAD_LENGTH = 4; - - private Utils() {} - - public static final RowType FULL_SCHEMA_ROW_TYPE = new RowType(Arrays.asList( - new RowType.RowField("f1", new VarCharType(VarCharType.MAX_LENGTH)), - new RowType.RowField("f2", new VarCharType(VarCharType.MAX_LENGTH)), - new RowType.RowField("f3", new IntType()) - )); - - public static String resolveExampleTableAbsolutePath(String resourcesTableDir) { - String rootPath = Paths.get(".").toAbsolutePath().normalize().toString(); - return rootPath.endsWith("flink-example") ? - // Maven commands are run from the examples/flink-example/ directory - rootPath + "/src/main/resources/" + resourcesTableDir : - // while SBT commands are run from the examples/ directory - rootPath + "/examples/flink-example/src/main/resources/" + resourcesTableDir; - } - - public static void prepareDirs(String tablePath) throws IOException { - File tableDir = new File(tablePath); - if (tableDir.exists()) { - FileUtils.cleanDirectory(tableDir); - } else { - tableDir.mkdirs(); - } - } - - public static void prepareDirs(String sourcePath, String workPath) throws IOException { - prepareDirs(workPath); - System.out.printf("Copy example table data from %s to %s%n%n", sourcePath, workPath); - FileUtils.copyDirectory(new File(sourcePath), new File(workPath)); - } - - public static ScheduledFuture runSourceTableUpdater(String tablePath) { - - final DeltaTableUpdater tableUpdater = new DeltaTableUpdater(tablePath); - - AtomicInteger index = new AtomicInteger(0); - ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); - - return scheduler.scheduleWithFixedDelay( - () -> { - int i = index.getAndIncrement(); - List rows = Collections.singletonList( - Row.of("f1_newVal_" + i, "f2_newVal_" + i, i)); - Descriptor descriptor = new Descriptor(tablePath, Utils.FULL_SCHEMA_ROW_TYPE, rows); - tableUpdater.writeToTable(descriptor); - }, - 10, - 2, - TimeUnit.SECONDS - ); - } - - public static void printDeltaTableRows(String tablePath) throws InterruptedException { - DeltaLog deltaLog = - DeltaLog.forTable(new org.apache.hadoop.conf.Configuration(), tablePath); - - for (int i = 0; i < 30; i++) { - deltaLog.update(); - Snapshot snapshot = deltaLog.snapshot(); - - System.out.println("===== current snapshot ====="); - System.out.println("snapshot version: " + snapshot.getVersion()); - System.out.println("number of total data files: " + snapshot.getAllFiles().size()); - - CloseableIterator iter = snapshot.open(); - System.out.println("\ntable rows:"); - System.out.println(StringUtils.rightPad("f1", PRINT_PAD_LENGTH) + "| " + - StringUtils.rightPad("f2", PRINT_PAD_LENGTH) + " | " + - StringUtils.rightPad("f3", PRINT_PAD_LENGTH)); - System.out.println(String.join("", Collections.nCopies(4 * PRINT_PAD_LENGTH, "-"))); - - RowRecord row = null; - int numRows = 0; - while (iter.hasNext()) { - row = iter.next(); - numRows++; - - String f1 = row.isNullAt("f1") ? null : row.getString("f1"); - String f2 = row.isNullAt("f2") ? null : row.getString("f2"); - Integer f3 = row.isNullAt("f3") ? null : row.getInt("f3"); - - System.out.println(StringUtils.rightPad(f1, PRINT_PAD_LENGTH) + "| " + - StringUtils.rightPad(f2, PRINT_PAD_LENGTH) + " | " + - StringUtils.rightPad(String.valueOf(f3), PRINT_PAD_LENGTH)); - } - System.out.println("\nnumber rows: " + numRows); - if (row != null) { - System.out.println("data schema:"); - System.out.println(row.getSchema().getTreeString()); - System.out.println("partition cols:"); - System.out.println(snapshot.getMetadata().getPartitionColumns()); - } - System.out.println("\n"); - Thread.sleep(5000); - } - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/ValueVisitor.java b/connectors/examples/flink-example/src/main/java/org/utils/ValueVisitor.java deleted file mode 100644 index a216b515172..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/ValueVisitor.java +++ /dev/null @@ -1,199 +0,0 @@ -package org.utils; - -import java.time.LocalDate; - -import org.apache.flink.table.data.ArrayData; -import org.apache.flink.table.data.DecimalData; -import org.apache.flink.table.data.MapData; -import org.apache.flink.table.data.RawValueData; -import org.apache.flink.table.data.RowData; -import org.apache.flink.table.data.TimestampData; -import org.apache.flink.table.types.logical.ArrayType; -import org.apache.flink.table.types.logical.BigIntType; -import org.apache.flink.table.types.logical.BinaryType; -import org.apache.flink.table.types.logical.BooleanType; -import org.apache.flink.table.types.logical.CharType; -import org.apache.flink.table.types.logical.DateType; -import org.apache.flink.table.types.logical.DayTimeIntervalType; -import org.apache.flink.table.types.logical.DecimalType; -import org.apache.flink.table.types.logical.DistinctType; -import org.apache.flink.table.types.logical.DoubleType; -import org.apache.flink.table.types.logical.FloatType; -import org.apache.flink.table.types.logical.IntType; -import org.apache.flink.table.types.logical.LocalZonedTimestampType; -import org.apache.flink.table.types.logical.LogicalType; -import org.apache.flink.table.types.logical.LogicalTypeVisitor; -import org.apache.flink.table.types.logical.MapType; -import org.apache.flink.table.types.logical.MultisetType; -import org.apache.flink.table.types.logical.NullType; -import org.apache.flink.table.types.logical.RawType; -import org.apache.flink.table.types.logical.RowType; -import org.apache.flink.table.types.logical.SmallIntType; -import org.apache.flink.table.types.logical.StructuredType; -import org.apache.flink.table.types.logical.SymbolType; -import org.apache.flink.table.types.logical.TimeType; -import org.apache.flink.table.types.logical.TimestampType; -import org.apache.flink.table.types.logical.TinyIntType; -import org.apache.flink.table.types.logical.VarBinaryType; -import org.apache.flink.table.types.logical.VarCharType; -import org.apache.flink.table.types.logical.YearMonthIntervalType; -import org.apache.flink.table.types.logical.ZonedTimestampType; - -public class ValueVisitor implements LogicalTypeVisitor { - - private final RowData row; - - private final int index; - - public ValueVisitor(RowData row, int index) { - this.row = row; - this.index = index; - } - - - @Override - public String visit(CharType charType) { - return row.getString(index).toString(); - } - - @Override - public String visit(VarCharType varCharType) { - return row.getString(index).toString(); - } - - @Override - public Boolean visit(BooleanType booleanType) { - return row.getBoolean(index); - } - - @Override - public byte[] visit(BinaryType binaryType) { - return row.getBinary(index); - } - - @Override - public byte[] visit(VarBinaryType varBinaryType) { - return row.getBinary(index); - } - - @Override - public DecimalData visit(DecimalType decimalType) { - return row.getDecimal(index, decimalType.getPrecision(), decimalType.getScale()); - } - - @Override - public Byte visit(TinyIntType tinyIntType) { - return row.getByte(index); - } - - @Override - public Short visit(SmallIntType smallIntType) { - return row.getShort(index); - } - - @Override - public Integer visit(IntType intType) { - return row.getInt(index); - } - - @Override - public Long visit(BigIntType bigIntType) { - return row.getLong(index); - } - - @Override - public Float visit(FloatType floatType) { - return row.getFloat(index); - } - - @Override - public Double visit(DoubleType doubleType) { - return row.getDouble(index); - } - - @Override - public LocalDate visit(DateType dateType) { - int sinceEpoch = row.getInt(index); - return LocalDate.ofEpochDay(sinceEpoch); - } - - @Override - public TimestampData visit(TimeType timeType) { - return row.getTimestamp(index, timeType.getPrecision()); - } - - @Override - public TimestampData visit(TimestampType timestampType) { - return row.getTimestamp(index, timestampType.getPrecision()); - } - - @Override - public TimestampData visit(ZonedTimestampType zonedTimestampType) { - return row.getTimestamp(index, zonedTimestampType.getPrecision()); - } - - @Override - public TimestampData visit(LocalZonedTimestampType localZonedTimestampType) { - return row.getTimestamp(index, localZonedTimestampType.getPrecision()); - } - - @Override - public TimestampData visit(YearMonthIntervalType yearMonthIntervalType) { - return row.getTimestamp(index, yearMonthIntervalType.getYearPrecision()); - } - - @Override - public TimestampData visit(DayTimeIntervalType dayTimeIntervalType) { - return row.getTimestamp(index, dayTimeIntervalType.getDayPrecision()); - } - - @Override - public ArrayData visit(ArrayType arrayType) { - return row.getArray(index); - } - - @Override - public Object visit(MultisetType multisetType) { - throw new UnsupportedOperationException("Not supported"); - } - - @Override - public MapData visit(MapType mapType) { - return row.getMap(index); - } - - @Override - public RowData visit(RowType rowType) { - return row.getRow(index, rowType.getFieldCount()); - } - - @Override - public Object visit(DistinctType distinctType) { - throw new UnsupportedOperationException("Not supported"); - } - - @Override - public Object visit(StructuredType structuredType) { - throw new UnsupportedOperationException("Not supported"); - } - - @Override - public Object visit(NullType nullType) { - throw new UnsupportedOperationException("Not supported"); - } - - @Override - public Object visit(LogicalType other) { - throw new UnsupportedOperationException("Not supported"); - } - - @Override - public Object visit(SymbolType symbolType) { - throw new UnsupportedOperationException("Not supported"); - } - - @Override - public RawValueData visit(RawType rawType) { - return row.getRawValue(index); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/job/DeltaExampleJobRunner.java b/connectors/examples/flink-example/src/main/java/org/utils/job/DeltaExampleJobRunner.java deleted file mode 100644 index e5468113bd7..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/job/DeltaExampleJobRunner.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.utils.job; - -import org.apache.flink.api.common.RuntimeExecutionMode; -import org.apache.flink.streaming.api.CheckpointingMode; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; - -public interface DeltaExampleJobRunner { - - default StreamExecutionEnvironment getStreamExecutionEnvironment() { - StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); - env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC); - env.enableCheckpointing(2000, CheckpointingMode.EXACTLY_ONCE); - return env; - } - - void run(String tablePath) throws Exception; - - StreamExecutionEnvironment createPipeline( - String tablePath, - int sourceParallelism, - int sinkParallelism - ); -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/job/DeltaExampleLocalJobRunner.java b/connectors/examples/flink-example/src/main/java/org/utils/job/DeltaExampleLocalJobRunner.java deleted file mode 100644 index 4e18760ccaf..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/job/DeltaExampleLocalJobRunner.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (2021) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.utils.job; - -import org.apache.flink.configuration.RestOptions; -import org.apache.flink.runtime.minicluster.MiniCluster; -import org.apache.flink.runtime.minicluster.MiniClusterConfiguration; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; - -/** - * Internal class providing utility methods to run local Flink job in memory. - */ -public interface DeltaExampleLocalJobRunner extends DeltaExampleJobRunner { - - default MiniCluster getMiniCluster() { - final org.apache.flink.configuration.Configuration config = - new org.apache.flink.configuration.Configuration(); - config.setString(RestOptions.BIND_PORT, "18081-19000"); - final MiniClusterConfiguration cfg = - new MiniClusterConfiguration.Builder() - .setNumTaskManagers(2) - .setNumSlotsPerTaskManager(4) - .setConfiguration(config) - .build(); - return new MiniCluster(cfg); - } - - default void runFlinkJobInBackground(StreamExecutionEnvironment env) { - new Thread(() -> { - try (MiniCluster miniCluster = getMiniCluster()) { - miniCluster.start(); - miniCluster.executeJobBlocking(env.getStreamGraph().getJobGraph()); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - }).start(); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/job/DeltaSinkClusterJobExampleBase.java b/connectors/examples/flink-example/src/main/java/org/utils/job/DeltaSinkClusterJobExampleBase.java deleted file mode 100644 index 40cddbcd238..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/job/DeltaSinkClusterJobExampleBase.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.utils.job; - -import io.delta.flink.sink.DeltaSink; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.utils.Utils; - -public abstract class DeltaSinkClusterJobExampleBase implements DeltaExampleJobRunner { - - @Override - public void run(String tablePath) throws Exception { - System.out.println("Will use table path: " + tablePath); - Utils.prepareDirs(tablePath); - StreamExecutionEnvironment env = createPipeline(tablePath, 1, 1); - env.execute("TestJob"); - } - - public abstract DeltaSink getDeltaSink(String tablePath); - -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/job/DeltaSinkLocalJobExampleBase.java b/connectors/examples/flink-example/src/main/java/org/utils/job/DeltaSinkLocalJobExampleBase.java deleted file mode 100644 index f98de9f840e..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/job/DeltaSinkLocalJobExampleBase.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (2021) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.utils.job; - -import io.delta.flink.sink.DeltaSink; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.utils.Utils; - -public abstract class DeltaSinkLocalJobExampleBase implements DeltaExampleLocalJobRunner { - - public void run(String tablePath) throws Exception { - System.out.println("Will use table path: " + tablePath); - - Utils.prepareDirs(tablePath); - StreamExecutionEnvironment env = createPipeline(tablePath, 2, 3); - runFlinkJobInBackground(env); - Utils.printDeltaTableRows(tablePath); - } - - public abstract DeltaSink getDeltaSink(String tablePath); - -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/job/bounded/DeltaBoundedSourceClusterJobExampleBase.java b/connectors/examples/flink-example/src/main/java/org/utils/job/bounded/DeltaBoundedSourceClusterJobExampleBase.java deleted file mode 100644 index b94505ed27d..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/job/bounded/DeltaBoundedSourceClusterJobExampleBase.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.utils.job.bounded; - -import io.delta.flink.source.DeltaSource; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.utils.Utils; -import org.utils.job.DeltaExampleJobRunner; - -public abstract class DeltaBoundedSourceClusterJobExampleBase implements DeltaExampleJobRunner { - - private static final String workPath = "/tmp/delta-flink-example/source_table_work"; - - @Override - public void run(String tablePath) throws Exception { - System.out.println("Will use table path: " + workPath); - Utils.prepareDirs(tablePath, workPath); - StreamExecutionEnvironment env = createPipeline(workPath, 1, 1); - env.execute("Bounded Example Job"); - } - - public abstract DeltaSource getDeltaSource(String tablePath); -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/job/bounded/DeltaBoundedSourceLocalJobExampleBase.java b/connectors/examples/flink-example/src/main/java/org/utils/job/bounded/DeltaBoundedSourceLocalJobExampleBase.java deleted file mode 100644 index 8c61341d715..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/job/bounded/DeltaBoundedSourceLocalJobExampleBase.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.utils.job.bounded; - -import io.delta.flink.source.DeltaSource; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.utils.Utils; -import org.utils.job.DeltaExampleLocalJobRunner; - -public abstract class DeltaBoundedSourceLocalJobExampleBase implements DeltaExampleLocalJobRunner { - - private final String workPath = Utils.resolveExampleTableAbsolutePath("example_table"); - - @Override - public void run(String tablePath) throws Exception { - System.out.println("Will use table path: " + tablePath); - - Utils.prepareDirs(tablePath, workPath); - StreamExecutionEnvironment env = createPipeline(workPath, 2, 3); - runFlinkJobInBackground(env); - } - - public abstract DeltaSource getDeltaSource(String tablePath); -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/job/continuous/DeltaContinuousSourceClusterJobExampleBase.java b/connectors/examples/flink-example/src/main/java/org/utils/job/continuous/DeltaContinuousSourceClusterJobExampleBase.java deleted file mode 100644 index 38c2330a8f1..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/job/continuous/DeltaContinuousSourceClusterJobExampleBase.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.utils.job.continuous; - -import io.delta.flink.source.DeltaSource; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.utils.Utils; -import org.utils.job.DeltaExampleJobRunner; - -public abstract class DeltaContinuousSourceClusterJobExampleBase implements DeltaExampleJobRunner { - - private static final String workPath = "/tmp/delta-flink-example/source_table_work"; - - @Override - public void run(String tablePath) throws Exception { - System.out.println("Will use table path: " + workPath); - Utils.prepareDirs(tablePath, workPath); - StreamExecutionEnvironment env = createPipeline(workPath, 1, 1); - - // Just to have better visual representation of Job on FLink's UI - env.disableOperatorChaining(); - - env.executeAsync("Continuous Example Job"); - Utils.runSourceTableUpdater(workPath).get(); - } - - public abstract DeltaSource getDeltaSource(String tablePath); -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/job/continuous/DeltaContinuousSourceLocalJobExampleBase.java b/connectors/examples/flink-example/src/main/java/org/utils/job/continuous/DeltaContinuousSourceLocalJobExampleBase.java deleted file mode 100644 index 0545287f9bc..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/job/continuous/DeltaContinuousSourceLocalJobExampleBase.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.utils.job.continuous; - -import io.delta.flink.source.DeltaSource; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.data.RowData; -import org.utils.Utils; -import org.utils.job.DeltaExampleLocalJobRunner; - -public abstract class DeltaContinuousSourceLocalJobExampleBase - implements DeltaExampleLocalJobRunner { - - private final String workPath = Utils.resolveExampleTableAbsolutePath("example_table"); - - @Override - public void run(String tablePath) throws Exception { - System.out.println("Will use table from path: " + tablePath); - - Utils.prepareDirs(tablePath, workPath); - StreamExecutionEnvironment env = createPipeline(workPath, 2, 3); - runFlinkJobInBackground(env); - Utils.runSourceTableUpdater(workPath); - } - - public abstract DeltaSource getDeltaSource(String tablePath); -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/job/sql/BoundedSqlSourceExampleBase.java b/connectors/examples/flink-example/src/main/java/org/utils/job/sql/BoundedSqlSourceExampleBase.java deleted file mode 100644 index e5200ac5aa1..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/job/sql/BoundedSqlSourceExampleBase.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.utils.job.sql; - -import java.util.UUID; - -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.api.Table; -import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; -import org.utils.ConsoleSink; -import org.utils.Utils; - -public abstract class BoundedSqlSourceExampleBase extends SqlExampleBase { - - private final String workPath; - - protected final boolean isStreaming; - - protected BoundedSqlSourceExampleBase() { - this.isStreaming = false; - this.workPath = Utils.resolveExampleTableAbsolutePath("example_table_" + - UUID.randomUUID().toString().split("-")[0]); - } - - public void run(String tablePath) throws Exception { - System.out.println("Will use table path: " + tablePath); - Utils.prepareDirs(tablePath, workPath); - - StreamExecutionEnvironment streamEnv = createTestStreamEnv(this.isStreaming); - StreamTableEnvironment tableEnv = createTableStreamingEnv(streamEnv); - Table table = runSqlJob(workPath, tableEnv); - tableEnv.toDataStream(table) - .map(new RowMapperFunction(Utils.FULL_SCHEMA_ROW_TYPE)) - .addSink(new ConsoleSink(Utils.FULL_SCHEMA_ROW_TYPE)) - .setParallelism(1); - streamEnv.execute(); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/job/sql/ContinuousSqlSourceExampleBase.java b/connectors/examples/flink-example/src/main/java/org/utils/job/sql/ContinuousSqlSourceExampleBase.java deleted file mode 100644 index 86c9fb15b36..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/job/sql/ContinuousSqlSourceExampleBase.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.utils.job.sql; - -import java.util.UUID; - -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.api.Table; -import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; -import org.utils.ConsoleSink; -import org.utils.Utils; - -public abstract class ContinuousSqlSourceExampleBase extends SqlExampleBase { - - private final String workPath = Utils.resolveExampleTableAbsolutePath("example_table_" + - UUID.randomUUID().toString().split("-")[0]); - - protected final boolean isStreaming; - - protected ContinuousSqlSourceExampleBase() { - this.isStreaming = true; - } - - public void run(String tablePath) throws Exception { - System.out.println("Will use table path: " + tablePath); - Utils.prepareDirs(tablePath, workPath); - - StreamExecutionEnvironment streamEnv = createTestStreamEnv(this.isStreaming); - StreamTableEnvironment tableEnv = createTableStreamingEnv(streamEnv); - Table table = runSqlJob(workPath, tableEnv); - tableEnv.toDataStream(table) - .map(new RowMapperFunction(Utils.FULL_SCHEMA_ROW_TYPE)) - .addSink(new ConsoleSink(Utils.FULL_SCHEMA_ROW_TYPE)) - .setParallelism(1); - streamEnv.executeAsync(); - - Utils.runSourceTableUpdater(workPath); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/job/sql/RowMapperFunction.java b/connectors/examples/flink-example/src/main/java/org/utils/job/sql/RowMapperFunction.java deleted file mode 100644 index e418b303bb8..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/job/sql/RowMapperFunction.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.utils.job.sql; - -import org.apache.flink.api.common.functions.MapFunction; -import org.apache.flink.table.data.RowData; -import org.apache.flink.table.data.util.DataFormatConverters; -import org.apache.flink.table.types.logical.LogicalType; -import org.apache.flink.table.types.utils.TypeConversions; -import org.apache.flink.types.Row; - -/** - * A Helper Mapper function to convert Stream of Row element to stream of RowDataElements. - */ -public class RowMapperFunction implements MapFunction { - - private final DataFormatConverters.DataFormatConverter converter; - - public RowMapperFunction(LogicalType logicalType) { - this.converter = - DataFormatConverters.getConverterForDataType( - TypeConversions.fromLogicalToDataType(logicalType) - ); - } - - @Override - public RowData map(Row value) { - return converter.toInternal(value); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/job/sql/SqlExampleBase.java b/connectors/examples/flink-example/src/main/java/org/utils/job/sql/SqlExampleBase.java deleted file mode 100644 index 75734f38815..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/job/sql/SqlExampleBase.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.utils.job.sql; - -import org.apache.flink.api.common.RuntimeExecutionMode; -import org.apache.flink.api.common.restartstrategy.RestartStrategies; -import org.apache.flink.streaming.api.CheckpointingMode; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.table.api.Table; -import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; - -public abstract class SqlExampleBase { - - /** - * Runs an SQL Flink job. Depending on the context the "tablePath" parameter - * can be a source (SELECT) or a sink (INSERT) table. - */ - protected abstract Table runSqlJob( - String tablePath, - StreamTableEnvironment tableEnv) throws Exception; - - public static StreamExecutionEnvironment createTestStreamEnv(boolean isStreaming) { - StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); - env.getConfig().setRestartStrategy(RestartStrategies.noRestart()); - - if (isStreaming) { - env.setRuntimeMode(RuntimeExecutionMode.STREAMING); - env.enableCheckpointing(1000, CheckpointingMode.EXACTLY_ONCE); - } else { - env.setRuntimeMode(RuntimeExecutionMode.BATCH); - } - - return env; - } - - public static StreamTableEnvironment createTableStreamingEnv(boolean isStreaming) { - return StreamTableEnvironment.create( - createTestStreamEnv(isStreaming) - ); - } - - public static StreamTableEnvironment createTableStreamingEnv(StreamExecutionEnvironment env) { - return StreamTableEnvironment.create(env); - } -} diff --git a/connectors/examples/flink-example/src/main/java/org/utils/job/sql/SqlSinkExampleBase.java b/connectors/examples/flink-example/src/main/java/org/utils/job/sql/SqlSinkExampleBase.java deleted file mode 100644 index 9f01d1408e8..00000000000 --- a/connectors/examples/flink-example/src/main/java/org/utils/job/sql/SqlSinkExampleBase.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.utils.job.sql; - -import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; -import org.utils.Utils; - -public abstract class SqlSinkExampleBase extends SqlExampleBase { - - public void run(String tablePath) throws Exception { - System.out.println("Will use table path: " + tablePath); - - Utils.prepareDirs(tablePath); - StreamTableEnvironment tableEnv = createTableStreamingEnv(false); // streamingMode = false - runSqlJob(tablePath, tableEnv); - Utils.printDeltaTableRows(tablePath); - } -} diff --git a/connectors/examples/flink-example/src/main/resources/assets/images/flink-cluster-job.png b/connectors/examples/flink-example/src/main/resources/assets/images/flink-cluster-job.png deleted file mode 100644 index 54c0c72f42fa187dcabb55fca190e790398e066d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148337 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

d*d1 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

vjs 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 `w?hF!~w!m~YD{{of6d78*hA$NKXBTKgAY>pY z5(uL(m*GZ8_-wZj8iB!T7i~FXH6<w*`N;hqhzO;`IKH>eY0Wf8SO3Y(fBmu;UFH3ka7AR^O#A2x4q!zyW?Nda zSLst(efC>I0zVsA#u28E^Ms?4aR2OmHLvpBi|dJxPDvpv1~J4?P-D`)H@!8`L6yv| z4V?v4lB%BlD?nYhDS&Ck!GGbsxcBji+UL>VY|1gdW@%J}krS9*8cjJ>-WS5cZaXKC z1)Er$Y8%493VNpv8B;<+S$8!a!`(H~RO(nOU~JBlP3u97mt1(!En_&7DG{#7Swpyo z><(Zhi3}9C*)73C@#5H{eo%qMUp{J%dkX7mgg7wGt*4^Vc-FtI*<+-@4!lH7&Le5C zsPN~C(j;kRJhi$4A!*sC5-EeC!Gdn7Me!xQ&{sPI` zRL=41pC&yoS&%R8x*D?O?nq>L=2{JFhpZZArASGrdaJ?vS%~xdSx{TzmG`KH^keOK zyt4%|K~77Ah_JO#f8*Kuo?5r^c2QFe9DaTG@=ZzYpw4}U3E8Q7bUhjbtSSafv4;ah}r8cgUH_E}|0~zQCw8S>KAxCpP_A z|JiydCtWz+iH$@tWAx1=kwx;PB{xKCn8Ue+$TW?xP`)A|^W%O#dn)>jn_{%%=B^o;Py-H!$te0J$Zp6ke6;kk&^NUfp?Upd~+ z!ckil$lbN3eIqh1+MjSMFl;fIM2{Fn;i$E>CDuTYJT;51QK$bhG;$hVPuPxSRA7UK ztuSf!?PG=qh8tAl;L#)7>V41qWUaj99`vE!nP0L~w6xqQP;Ta|5x5f1Xi77D8crCt?XG#?U}XQ`xW-X1Xn2?}%2&?g-|(iIzZPOEf7v)5UfdI=3$1*ia>s zp(ak|&|CVxQCL-qp7F^HdPOp60|c8x!_7Z(xcVvp&}<(YyPyDlrd^88Tt3&|#P@{+ z@7o0+B4&h%daF63_J9wcj^6{2JD%v-lC6GLZy0cyet>ufI0V`D1!3jUv`898S;odXB+kgdH*k77 z_pp)uL0}->^mj-I-zYT6A4vX#h!<;BtKi!gVDb0>;J)389Jp^?9zCiR;(eBV;K zATu9svPZVA&^Ch?-;w}QsEnJ|gwWUIKrgvaqH>nGD$Z!HTwAW$S3a>phKk)T$L;Vg z<+S{Iv@*`VZY8s_$#u+CP>YZF>(|6;HfjW#O%v8GM^ruEHr z(dBVWyPN!5ntXAJkay95NnkReQVM*nM0rkOnq@SE{fp3BUu)Xo>IMg~ps$uO+DZxu zgbMrO*8UUZy`K56^`R%|L_9k>U%BECzYOUme@p03zuL3ZDH$o*v(Nd}1Q?u<*Wx8M z>c;^{8{*5|3l!cKk6yxMl5V-g??S&lnl30hwEfBnjsU^o$x?*KyB#`e1*3W>7*gcVKMQ;EmF}UWQkU_r%db z8Usg+Xfu)6P`c!U(u#18)8LkF4QQdq7jE-z437Kkru5b73rT5P=8_PgUzw)F~`E>(+Z zYr9*%0}n_guCVeoTg`*sdj`fN~U zZGkHA0@1yu8GS(&eaZ^HL2&xx6RP9KqJ3_5WF!Z;Mc1(VK8tQP02-#xW@WN;UyqQ* z#;Mg+m#tNL6YYWqIOQ{b76`pkez6;kGMwJ)zSzn2o|#vArVKW{xEcQ9-XH>37JE&d z39XN1zV78*eimXoyGlxs*=U~d<8OgI&Tv__>V>?8mu<>ZISbsVyB;~bw>`A9625_S z__h4D0x>pj+vSO-9j}Vf8(x82h3bo3$#2H;0KRNArK1c#d*|PiP_6*SNr|W`6%EAe z103GVektWBV$-3Est4V44Yj+H&zz$lh>?Ua{Y*C9$fgpxG-u%y6lmyd{6HrUht@PZ zhacZjJAFM#6>NJ$;GwT*n75UB>su8jsv{`>7c_!K-6Oi5Qn`q5be)wPA7 zSFrqP&DfyL%+(~}RTQrjE5PvZ*>)|^!1+2`Vk`CykM~Z*`^n#`e0;D6tRP=S|QYC?CnoA%P|itl6)0> z!#sALb#4Pee8bjy8=i+QG&HFf;q(2qq2qGRA1kpm4)Zr%{$Mz^%8{Ax?hI^E*(oN> zg!P$udAW)pZt>e?*V*B8nK?(4Bx+~Bv`!}e%Gu$M9s)B$M!)yico3M@a$Y|&k@o46 z4X~`2u8;I4?wkvAIdfemP6;+O9Wed2#a-BhYMn6ltLH-W9387#77$XO+KQ($N(5q%Nqlm^Z8|HWa|Yc+=1YSK&-&~&?KC-S#bq(lV6K! zMSkt%MujT1Ud2ANjqbPrv_x?g)vKu5Uw)?EnAlgYyFKB-ZrGj2fr8LHQwCRS#~MAg z&BcEz+1`lLc(|zHcITB@`I+4sq|b8>@Z#D=Ieo z$!fpqxcPG`2__>TW1hm0$=3@rpMr%B_;WGQG0zrWk8htgn*G(U4)F55hkH62ej54R z=9751T~d^5STHfpZ=T)RdL_d3>z?`wboiQlt?R7+b}`2;ccjI4Pen;+M*^Tpjq6@5 z_Y*uh#y#9&{%$vVsegU`v{5Odz4=GqONeCTVt=7Eb6m|DbQw7_eU|ZBZ>;03{c4jj zZju`IEZtQO95%rJ%36FkmfJQBr-M>QKIePI+s@`pig$W{n?ODpK$IN+;S}aA{U&7h`_}C!S4RM z>$G`DlximvF8lk}?gsu*uun|9@9p9Y&24d82w3yoh4{2E^zB){Wv zaAvu1!V^*L$u7*v(#fe)FVK+bsB$<9o{4VOA)hV%#Mm&LIhL4vPU=3eMGDk%fT2;5 zE@^3UTn!X{UoKfpsL=H>f3TjF9Dq?jR&xBsJNZGV@R~mP`$vUFdweYuBpb$QY}3gO zg#w2%v%PgTTb&lEdJSq8C7xG5!UnKdWVHst{W^A=Y4_){8z|xo(l0YF3q6-mYo@D<9mK&Ggr)Ek^0V*S*4kJUJI{M!`juCL&1h#k?P0@lqoYa zmf$S^`KRL0O^IDpJ)zR8TCKn`&R;oe`E0F>vi&udv7E^PfM6`EAS+i9B&f_xFk6PB z)R=4iS=RH?RP+mr?Z2pgO; ze^0HN2Ppk_;zk>#T8Z?vI1_1bJd$3yDh$&d@Rbj7kaFxG>6JW?5#yKG__`b?bhqdH zTJ*fBu(sa4#lhm|sFPxOsinGp%f0(OIJ0)=md2`%+={g9&g2wu7|fqRVK?K??XJV< z`pp<9;%iOuuma9l*b>_BSl!@MJN-UOxbH#g>+nWTAl3G8$C#-bGPNMLGLGqZT1h$_ zs=R0FwL-;n7)hk(YJ%ngPzD*1?1ZKNetC!1XHY=+&P2Pp2G}`{1#EpXAFAhPi2NNn zxY4gw)nJUpE%pZoyEu_-s|mV{%YPbN^@jg+zPB80(K>kD|2|GRHo8!t+P7t|ATDR! zBN~lpGEarjW;z_Gx|Y1^14DhB$-e2xIWs&gO$F2*M=>T^<*+<|&vM!I4Lacu7DZJh zDwWdt9Qd*yjoA$J3SaoyxKo%zT*&-dyygy^+WX>k{7q^EBrl4P zjozZO>h?!wI9BkFaUj`0>`jtNS(SzdJi?Fm=B;X*UfIbZ{)?^%*T7! z)ydML&*Q=3QztO+d!IacXXS#fQIbjQOzabmzcN)C%-5KD@78`%nyZUfP7&_8;Drvf zUIClA;G*MrOr1e}?{)iY&1=F`GrjT3)<^Cnkq3T2kRsTARnd6H#0qB5eY&f3*w$5C z2G3{mFA1lQ-!G-k0h$^6y9@ozt~1qp%N?9&virs4tmDxGrXy^$@mK*82#8a?fFw_v4P~jz%X*%kIS%C35*JtKWO?>3~SPkngIUUNjI0g&PPV_Z}au`B=TE zYg9jUquyaT@OZ0*@@g^|dc#uj5=96kr{u{uE+5^0Fo0%T0+VFl&_|$gdW%KUHnfgP1yA^nm zYa$(YY3n4&Ykf?8VWhDK#(lV3)x9-`MrN=8YGE>~x@$B`JZMw~YSi7J4SnsqEBFehP~k85AK62ncUVML02V9^`S=h7T$W;0b%eL#${> zSC9wafEw`ZPS>2<4aWFS`)9>A-yhGQv(+KnH6z&RyaZC^fG+iqMbu+Ads#oncq`@d z>pXkW0X8+=bS!^SyeeCdy?Mw5XH?J1IF%9l1P-%Zw=7BBM?xlM`^f}bI>F{Jmpcv4=*fgVm!8b*6RP~4;B&lpEe~6tsFVaR z@+%H}t}X@V7s=JnmhULmNA11I;FdU0nE&ww&~C7UVMb8UEVtqKBUAV$(Kpy^1{Y=Z zjCb{W-0-umxjh|DOkB5}Cs#Umy0&v@_38T@1bd%8J&NRnyTctP`#s>NN3yQ>vetk% zCPv|)VD&`c6xpdqS`r(Y@?uDPSS4k|KLJAd>%qY<#am`t46*7&V8d0D$Rugx&x*%P zsD=C@whe-r4w}vxc$b}~ev_?#IeELy1@u;&Ngxgzy=G1OXRwA7*Cz1B3UBm#JMR{l zbL2a~{rF}XNYZd~zuiyaKd>J5K#Wc!E}MM;5V!H;Bnv;kPEpkss&l#p83g^+tE(-CoFH0y`&4}hWSjL%tH4>fN{<{T?sJ9X_AYyvIXc6f#%c+(C*Zn@+x7T2x!JBlQGIiC!@!AK;lHh3jWjV zkJqOf_d;De1KqJ@rKC6UhN6P|t%qMK4fa%(Yk}219FEi;@zZUIEjy<0{a?ub-8C%6 z6i{pe>uYnD`IK_yiN!_E1$Kw0uLw3vm*;bjxiNs)Qslrbk3QGv%(#6c;LJA|(8a8C z6J+&23z}vGVRfqDv&=tvi`uPLZ!tmlwH2-nLP9)Uy+8s3jW%!o-@C`|@m|7}o{|wj zT!I}08bNX<8%}NfxtE4crz~7wo(CPTGB&qn*#?GfgY(MOT}&m=M694$w?$~{Um#8^ zq=co(Y-oM^Th?5xhUlFV$NeF-taq%F&uPDoJKBMf?o)>BigV4|n%eY2-s5*30NPr_ zmU#hC`AtqFxaE4`S~MuP(`Y*>FFJaNKE{&szmh~})H6Pn%_&0*h6u9CHks2DCl|j= zgj6$aO!REk!RWyDGo~@csl!t^p*Ee30UU`~Jlm2|4-U_0{5t8pG%KWaZ^Edw$}pFiO6*aFfkz0PgBTl(jYN=Qz=rEBl^y5An; z27RPkd3+Yu`oh%p{||d_9#3Wewv8^C%TOs47D=hhQDjV}N@gLm6jGUImMKMvm5?$I z$($rphGmE)v&{2MnU;AT-t*G^`#sOQ_w(#`|MC2>|JXj=xR-UUb*=0Ae$U}JkMlh6 zoO_c5#G|3QFbDG|R{3n=K z5HaMKt){oCts!1q#{WgnR=ePnUKi$F5Sgyf7Z!D#tuYl|SP|?q@6YyHFV(l*OxE{k zB^6)#Z8kb5RxCOj1Boco0xUo1K9a_nLG%7ypTGxu;#O53F|vq~>SHc9uT+}BxH?|vx2?u!cAe@YH9WTStTz{}m_1tJHZKIP2>uKUo7r`n2p^ABk(`orK6LGxee*Rr&m(I~_VzoU&;Om-A@S_OE6^Hj z`Qui1W8zbIJaI`7+JPd`4L$e}ck9i$~IMgMsu-;ddTA{1+JW9?_(%>3RSig#!8+J%PZ=hE4DJ~O4~)o#=oc%NH=#49`qrt3jO)>$KvTzrB!~n=wDPS#aEVI z#y`mIn>#8e@TU(zTK2>impf=LaWvA0lxP8(1_Ca3Vs$7>D+dQLTXGmU-Of^3&Sp#)|%^?C0`XHC|2_f8oKNVRw%|N3!oX1$7yB2x61+8eg*v z%~$t&xv*-dkqBKW7%fjY>*BU3)AA^9V>)VJV|c7Nv3Jc}udF6@L}sC*X+Rn~H{g6U zN^0oUl0U(x(F(5+g)2XjUGj2h(3xQ#w|!N!WX0{rAnVgT=7+@1P*?nEy9vbxTyeequJ|jVeZXa?M8!i~!rf`d)58R*8Zn2cx zars8Sud#SM^J)~~T_MtbB-<_s3bpZNWoT+@YMA7Y-OiwJXQK4hLZO*wNRGPlPS8pJ zj9t#pzY3GK&pAdRhnzrTe~$U%#}0nyLSyj^*q@;?*Y}QI?06R6{pXu*Hwz8QTQ{pl zv03V+l=%LkHP+1AbLFXh8^41(_xNCcx0-}_fMZ4#Az1Zi-&x#5^zm@dOD~kJ~~2g=EZp>Mr_6>rApRVFCyw7 zrT3B(?C*KBm^ahTcgUQD(_>HM&`8s4u@I_lYLa(ya!U7qmiOGuLMTn*%yHU8#!Xqj z0(n``;DFOn)zAoCpp#C#z|O-%O-f4IVzDtLj_gnE*6`q;uHvz^0*fxu$VTRxzKtJ4 z!9ErH6l;HHuvB44@#)@urdNlT7P^U@Wl}mu@kv))tR{>w+Wmh|Vo>HN3G4(HaWu-C zW08HDvLaMSCdS9vI5{~f&#nwzMRtfIwfK4LzwCp;f{VB(EPrwR zFJ06{16Cz#o$fAkS?lT&Cy-CbK7DAM?zn-pmX=n!{~Mt+kz*Wj{KrVnjPxOYO#JN_ zesCo{qyFxuX}9lniz4NwOAnspax#b7SD+8J8WMcnA#m&mG+TE zk%LFN@TBgt?MWx-=|8zq9DFnb^{=soV*=L>{>=Z^MjuPo(sr{wV*OI_KVO2szlV|N zfBC0{{XhTl|9|*DUyc9KOBJa}>kYfm^6}%U$SaQ#@v?x#06nWB(y16{G>PWglc3y3BnQfr7)1984lDO`T3(hhwBQ_%Zo;xlL9|Xx0FM!6FF^Cx=qY&V20gtoCp|Yt$j8UWjR#9y5gF{}qJ!uFTYc7mJ@Kfa``i^&dHUUq1<;HiPL43FTpYun zxpf={arl6q*)YhG)hG!MARj;^rs-cNZSD#Zu4gC?8M=&+iUUI7GV+|ErKJUhN=;2I zPgP4=D8TK4GLsE4q7YO#F#oUPrjVZHek)a7t;dyY+@9z+-7M>4 zL!fM)V>>1fN_M8zuTJuRxPv?mj=IFf)%xp~F90P8B_+(^;o+(2>AoDdbV}W>kkO)F zgVgOY5SKXu&CR449g*n<2hGN}MR>cCA8bk#~C!?%iD5uDHdP;&QEk)?had!{GU@3Sg zJg7xsj;z6a;}o%Id1wf#p&?++c4+=L2SdskOd zYHF>vo~9-VEco7DUC@2nT)oK4`{L(=(QD3sU$xK}8*sr7Sy&*F=U+cj3D;@?RH4d8 zY|5<)WKPK8bfMWHw?|z_{oq_e8ri1g805Q$<^mIg0Q6xqgq<_(&2Lp!Ay{sB3 z2jx54pXVatzkNI5%Qg(c+tu#{Oj|(EY-m&*g~ZMlLS=U(m7R+RY>Edwv5)d}yXTzX zHE{ZSqW)DC$c2N@!1Pfs-%H$1KQpR4=S7X?lR=fpR&Rzl_d{6mO>WQh&od4E2p$Mk4k5BkWKiqZNz+`=t?Qw3$c5+Z?jsrH!@un zBpB&7As&#(sIjlJ&K21|VOKG>$Weku37rli9KJjuzX&35w|JQ7wA&x z<$H)Gz@zXgt?kZ2Sf`yj{k?*L56BbKG|Sv>y&ZNCP5O-0_PR#PjJu3A^9tXEv+H*e z4aFCG4SNy|4poFqa%y6}_1*2{^1^d|m+Tkmn_+$ACDtaTJ{Z;S(57@?`Y;3h-mjSu-QB_!Fu;Y?SO2o(S<~)T6 z)+4d{zK?Rs^6tRX+@3cfAtUSWcdp#l$~dW;MeobT#yl~E@$t$o(*GQ99~qOSJ!z2O z#XZ%T^z-af;k!kBb2Oq|%-L>idsDxOr!=miH}x&QjnQgnH;mn7RYVu!a-xf|S7{xC zb*{yh_m3@-#AF10GpgINm`o7dm5B+&e#6z-hsC5}C-v=9_d?c$PeP}!^Lg#qsK7~m z4~3cV?c~e|j-Tt+caJK^=)D$_N|+8Gql_-Fs9|lqHqq3eBD6aeq7d0^vrOM;&zKWy zue~=#w4VFG0Y~PqAuK@*CRsV_S-Dq^K?3uv0qkeA5KpT zU04=48xk5r>R|MjSKtTSHO3giOHm(&qU}n5vrr3qj2_XeeYbF{_B(z^L{FY;`(tet60b4 z#dMVwm-~(3Dj#ztx7;RK>chQ$JA9Jt6mQ+7i^tj1f^(Y&Uf7ReC?Yh7(hLBRpQ##YL`(G+CgJ=w41|;qnzp<%a z{56!D(DZ1n-HlCh>Ibr#TvP2M7SqX(yVFRtj$zF)+}GZ0Oi|s4VG0sznpdUe*emjJ zX;l*i*sgNw$uu$YaEpZZ3aFpJM#3i{WtAIeN#FQBe~?UW+qEj1za1@TDPridN+_HX-VegZ>b{au@T|0+kMZ{{i57V+ za`lrbwTQ0iA=K}0y8U*$;Vr3E*?~_WtzUkn7!na0lX-@0bB?g@H^g)A-PbufN4f0M zwbPxS4UWK`vo6~t^QUF4=`oKBYG}9vQjv(*p^az^1T%cY5Ng;Amj`gtBH>EFg{#?R zTbGanZ@opVF%s37*1VRMmnQ?cR@Hm=C=2?6KoyNyIfV{<#_fMQ#k#uNpkBJg(@E?N zPHcqFYx4+5(IVoc#=kz^D*W>)$_5ncM}3d*mYc_6UTkf-fzl%AQWL?ThG&pef&^g> zDCFvJ)9--rY4_KMM-Wxa2M-^bw8Tq;h9#|WLEj=oE0t!s310hq;#10qRhQ8EmHlPC zE-Jh%W4g3-FD_%4#$Ndu)F7!%HZBkC_-RaJ^AK7*cLTSu_elk8dKSw2 zSDBp7*Wc0&?!(Syk}2z471@*h0hK%Y%zHVfGxoN~rm?~|ASL7T+LL%!ws7f_N)hAp z%_0$--xP+fxyS9TO2{yQM{E+)NEMA-PU4wVHmqJ2?@a7hPn$EyBx#ve@9)rLm*&yL zdE{TQ*l}FNt7&^N7c|AboYLC6GV7^awBd0l%H!DOUu~+|UR2gvo&hn%I6NPrkm#w| z5#$|EHWL$ci-GqvY}dWQlalkOec6mx1p^m%j%53ljvDVS%8Mu)>Z*V0cvU!({z$~U zogbD4a`Il=UWCL?p9i%=&4h+W+~SJ$3!P%0DXZF3>w^ZlT5 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±(2EWidl})@Tzv>R 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 diff --git a/connectors/examples/flink-example/src/main/resources/assets/images/source-pipeline.png b/connectors/examples/flink-example/src/main/resources/assets/images/source-pipeline.png deleted file mode 100644 index 0456cd516afd27823e2386f7e589acf2d97bedb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51010 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 WoWB)5MqQd&DpAb+RPE7s=9TmiRyZ60 diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/.00000000000000000020.checkpoint.parquet.crc b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/.00000000000000000020.checkpoint.parquet.crc deleted file mode 100644 index 8e71b43cf1d2c85befe0f0479de02ce693ff816a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmV-;0Eho$a$^7h00IDVwUBBauIj{#uSo?jw&(~WxLNLr8a&35bxy%;+wy0hlyY+X zv-M}i#DE!9RXs~<10h@S0(IW~Ll0PTV0H|vg_`o?&#$;MHJS>&iDWg+Ngsm;5_#9m aVLQ%pOs{$!9Ki&_7RSNZi(g=rR=^11&^Lkr diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000000.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000000.json deleted file mode 100644 index 91b1ea11469..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000000.json +++ /dev/null @@ -1,4 +0,0 @@ -{"commitInfo":{"timestamp":1656008685930,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"889","numOutputRows":"1"}}} -{"protocol":{"minReaderVersion":1,"minWriterVersion":2}} -{"metaData":{"id":"ac4ba6c2-8dec-4e25-9ffb-5679f0d2ba37","format":{"provider":"parquet","options":{}},"schemaString":"{\"type\":\"struct\",\"fields\":[{\"name\":\"f1\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"f2\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"f3\",\"type\":\"integer\",\"nullable\":true,\"metadata\":{}}]}","partitionColumns":[],"configuration":{},"createdTime":1656008683675}} -{"add":{"path":"part-00000-ff24642e-224c-4714-8525-8a7df5b1a2f4-c000.snappy.parquet","partitionValues":{},"size":889,"modificationTime":1656008685809,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000001.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000001.json deleted file mode 100644 index 38bfad964ef..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000001.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008695734,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":0,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"889","numOutputRows":"1"}}} -{"add":{"path":"part-00000-70706ffb-aad6-4c39-95b0-c0d4ee6a9b2a-c000.snappy.parquet","partitionValues":{},"size":889,"modificationTime":1656008695727,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000002.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000002.json deleted file mode 100644 index 69a969ebfc9..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000002.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008699443,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":1,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"889","numOutputRows":"1"}}} -{"add":{"path":"part-00000-8edb4e23-7c7e-4709-a3bb-27aaf276111e-c000.snappy.parquet","partitionValues":{},"size":889,"modificationTime":1656008699438,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000003.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000003.json deleted file mode 100644 index 90d1fd47d4e..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000003.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008702751,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":2,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"889","numOutputRows":"1"}}} -{"add":{"path":"part-00000-501a544d-7549-4387-b4f5-78b953787ec5-c000.snappy.parquet","partitionValues":{},"size":889,"modificationTime":1656008702746,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000004.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000004.json deleted file mode 100644 index 0befc57c9a2..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000004.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008705890,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":3,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"889","numOutputRows":"1"}}} -{"add":{"path":"part-00000-04b07fe8-2e54-4adf-91e2-fd32bfead83d-c000.snappy.parquet","partitionValues":{},"size":889,"modificationTime":1656008705885,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000005.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000005.json deleted file mode 100644 index 6b7678554bf..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000005.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008708851,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":4,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"889","numOutputRows":"1"}}} -{"add":{"path":"part-00000-dedb3701-e58e-4871-8dcf-7fc92bceef90-c000.snappy.parquet","partitionValues":{},"size":889,"modificationTime":1656008708845,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000006.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000006.json deleted file mode 100644 index 26793c7fd24..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000006.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008711761,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":5,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"889","numOutputRows":"1"}}} -{"add":{"path":"part-00000-492b2978-4c5b-4e02-a945-ab0ed0c7de5c-c000.snappy.parquet","partitionValues":{},"size":889,"modificationTime":1656008711757,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000007.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000007.json deleted file mode 100644 index 3c4a30c8324..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000007.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008714442,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":6,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"889","numOutputRows":"1"}}} -{"add":{"path":"part-00000-412be677-a969-4236-8a14-c8233059a51e-c000.snappy.parquet","partitionValues":{},"size":889,"modificationTime":1656008714438,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000008.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000008.json deleted file mode 100644 index 6ef491fe500..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000008.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008717396,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":7,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"889","numOutputRows":"1"}}} -{"add":{"path":"part-00000-fe14f78d-2af5-4237-92ec-4131dba27fa2-c000.snappy.parquet","partitionValues":{},"size":889,"modificationTime":1656008717391,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000009.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000009.json deleted file mode 100644 index 127554393cb..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000009.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008720165,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":8,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"889","numOutputRows":"1"}}} -{"add":{"path":"part-00000-344c52be-d840-4cec-913e-703038cfe308-c000.snappy.parquet","partitionValues":{},"size":889,"modificationTime":1656008720162,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000010.checkpoint.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000010.checkpoint.parquet deleted file mode 100644 index d3e404018bc4ad6510c418130e716673455f0581..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13705 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 LPKG%Ke}wfP`n%;1 diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000010.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000010.json deleted file mode 100644 index 311695be2df..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000010.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008722841,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":9,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"907","numOutputRows":"1"}}} -{"add":{"path":"part-00000-35403e15-bee5-4683-bae0-eb6e6d066e5a-c000.snappy.parquet","partitionValues":{},"size":907,"modificationTime":1656008722837,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000011.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000011.json deleted file mode 100644 index fa05ff5da6c..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000011.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008727099,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":10,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"907","numOutputRows":"1"}}} -{"add":{"path":"part-00000-dd103f91-a5b8-49ec-bbe5-e601ad50990b-c000.snappy.parquet","partitionValues":{},"size":907,"modificationTime":1656008727096,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000012.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000012.json deleted file mode 100644 index 9ba8fd6ae30..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000012.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008730209,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":11,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"907","numOutputRows":"1"}}} -{"add":{"path":"part-00000-93fd1f92-a8e8-402d-90ae-7e3e4e1541b8-c000.snappy.parquet","partitionValues":{},"size":907,"modificationTime":1656008730204,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000013.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000013.json deleted file mode 100644 index 8929422fbca..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000013.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008732977,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":12,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"907","numOutputRows":"1"}}} -{"add":{"path":"part-00000-4827706e-23f3-4cb3-ae85-563eef3e7cab-c000.snappy.parquet","partitionValues":{},"size":907,"modificationTime":1656008732974,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000014.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000014.json deleted file mode 100644 index 21c1f359401..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000014.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008735650,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":13,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"907","numOutputRows":"1"}}} -{"add":{"path":"part-00000-e4e4db35-0dcc-429d-8ce5-b8e556b1a2cf-c000.snappy.parquet","partitionValues":{},"size":907,"modificationTime":1656008735646,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000015.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000015.json deleted file mode 100644 index 5384561c1e6..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000015.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008738254,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":14,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"907","numOutputRows":"1"}}} -{"add":{"path":"part-00000-9247e529-6180-4ffd-9cd7-c7c224a2846a-c000.snappy.parquet","partitionValues":{},"size":907,"modificationTime":1656008738252,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000016.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000016.json deleted file mode 100644 index 35ec0f1ac1b..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000016.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008741153,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":15,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"907","numOutputRows":"1"}}} -{"add":{"path":"part-00000-c7a6b364-7b33-4446-8b32-5786af31b659-c000.snappy.parquet","partitionValues":{},"size":907,"modificationTime":1656008741150,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000017.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000017.json deleted file mode 100644 index b338a2c5878..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000017.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008744023,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":16,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"907","numOutputRows":"1"}}} -{"add":{"path":"part-00000-4c690e4c-8e1b-4f61-854d-3f31eb753dad-c000.snappy.parquet","partitionValues":{},"size":907,"modificationTime":1656008744021,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000018.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000018.json deleted file mode 100644 index fe756db9665..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000018.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008747027,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":17,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"907","numOutputRows":"1"}}} -{"add":{"path":"part-00000-1570eb1f-9e65-42ad-918c-f567e937ebf2-c000.snappy.parquet","partitionValues":{},"size":907,"modificationTime":1656008747024,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000019.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000019.json deleted file mode 100644 index 16c08c4228d..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000019.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008750036,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":18,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"907","numOutputRows":"1"}}} -{"add":{"path":"part-00000-c3bfc572-0904-40be-950b-190c9ac38dd0-c000.snappy.parquet","partitionValues":{},"size":907,"modificationTime":1656008750033,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000020.checkpoint.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000020.checkpoint.parquet deleted file mode 100644 index fc02a76ebfc727fb18b22163f4c9425171bf55a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14153 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 diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000020.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000020.json deleted file mode 100644 index 62ec21a6313..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000020.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008752667,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":19,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"907","numOutputRows":"1"}}} -{"add":{"path":"part-00000-d3a6e587-1a5a-41bc-b6ff-a69043e0439f-c000.snappy.parquet","partitionValues":{},"size":907,"modificationTime":1656008752664,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000021.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000021.json deleted file mode 100644 index c91e20d3bae..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000021.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008757514,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":20,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"907","numOutputRows":"1"}}} -{"add":{"path":"part-00000-ac4b4595-f8d0-4acb-85b6-3c2c2976e1c2-c000.snappy.parquet","partitionValues":{},"size":907,"modificationTime":1656008757509,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000022.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000022.json deleted file mode 100644 index b6ef040692a..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000022.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008760753,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":21,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"907","numOutputRows":"1"}}} -{"add":{"path":"part-00000-460c4961-a5dc-4c4c-8a77-9d8984c7b0b0-c000.snappy.parquet","partitionValues":{},"size":907,"modificationTime":1656008760750,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000023.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000023.json deleted file mode 100644 index d84c8a67a3b..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000023.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008763969,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":22,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"907","numOutputRows":"1"}}} -{"add":{"path":"part-00000-761b69af-b2b2-4dbe-aea5-3c0614b6a8db-c000.snappy.parquet","partitionValues":{},"size":907,"modificationTime":1656008763965,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000024.json b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000024.json deleted file mode 100644 index df2e1fd4d16..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/00000000000000000024.json +++ /dev/null @@ -1,2 +0,0 @@ -{"commitInfo":{"timestamp":1656008767260,"operation":"WRITE","operationParameters":{"mode":"Append","partitionBy":"[]"},"readVersion":23,"isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputBytes":"907","numOutputRows":"1"}}} -{"add":{"path":"part-00000-761fc8e9-f2f8-4c4d-a740-e162ccbf1a16-c000.snappy.parquet","partitionValues":{},"size":907,"modificationTime":1656008767258,"dataChange":true}} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/_last_checkpoint b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/_last_checkpoint deleted file mode 100644 index 03ee392ed12..00000000000 --- a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/_delta_log/_last_checkpoint +++ /dev/null @@ -1 +0,0 @@ -{"version":20,"size":23} diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-04b07fe8-2e54-4adf-91e2-fd32bfead83d-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-04b07fe8-2e54-4adf-91e2-fd32bfead83d-c000.snappy.parquet deleted file mode 100644 index e9a534b339049caf29112a03a3983e04c8a56622..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 889 zcmbu8%WB&|6oyBW)G@)ELPv~13o|q#0d>$NQ6l3-yDK4!kZlNIWQ`nAS+*rPAsD|! zDP44t$H;5+jd~>cA{;{&1#$T2Tt1!ok*>ep*aQ(q43l6GEz;KML1f=QisW=HRCN3% zhYb&E4R(6%fR|XXk)MaeQ2ar1WMxs>BGqM}o8v=^SB-Bl`&IwRB2}tE`Jutm#_cXzQe-owZv?D|-o6vHDX{e=A12 zzjk9ScG{xpus3jF5938?;+zKVMJah(Hte*f$$P~*+-U|4TAb> zPsKkM36uo2BpbXOxBw(7UpKw z`Hxw5GaILc9Lnsy7vC)qyl6<(W0`gLD7f3SFr~3!;GsuVl diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-1570eb1f-9e65-42ad-918c-f567e937ebf2-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-1570eb1f-9e65-42ad-918c-f567e937ebf2-c000.snappy.parquet deleted file mode 100644 index d1ce5de021d6a2c167e92f2944be34e53dc7dace..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmbu8&1%~~6op5V)`;R&=!g+$VTQywpbi>|D3D$Kv*0refGA0}YO3 z5kjZe7~+YhL)?!Y0lI&HJ5>V@vVQ}24FG&gXluh)r_f332%y#p(r?bT8&xd?o1Z>( zi-pX;-xiZ^Y9>hsk?uLBI2Pwn-%7WVxXyaWz@}x6`?^KC=B3_2X4OlufsF^vc+~p( zxUr>CFBoK6usg6}m;Od;Bi$BqqgBiUH(v0l&3wWZ+;P9AS2Hss??2)3)}Es#wFt)M z#K6e3DV^t2E*BD9;Rin#WFdoO0j@+)0SjYIA_Z=m0=2X7*safGuddhUfa#A z`yaDjGn-_knyUO?FaEkl^yBWT?`C;#=S@#=;c(F#gv%t2dU6;<@h}bo&kcPQ`@ZKz hj_>$^x^yN%cokeZp$a2$VU8_?wh#IRAIA;+hR^EE&13)o diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-344c52be-d840-4cec-913e-703038cfe308-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-344c52be-d840-4cec-913e-703038cfe308-c000.snappy.parquet deleted file mode 100644 index 1a5b108e45f87401ea282288340464fe73cea72c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 889 zcmbu8O-tiI7{@20TdVZ4uoEVbLmAefkR9@Z(UczaCgMT%x-2qjCf%@UT9edeDg72A z9z6Il{2G2EpCo+=wXlbU@bI7K<(FsvBsUk|ZGs3RhDk7p7HR8rFS2j%MdGi7ijF?y z5JI2NF~l8Z58`5E3(HxuYEiK^a+|EW46HANHul=xheldOpfpa9KKNSiQnnDRU0-(c ziO7E6=7V2yBuER9&LO5avJatNOQ)2$%DPC!ny&SYwoW?QNxOx#vX@{Ls}G9$q!{h~ z%8ixSYKx}B-oS-Dj2ESea~il8rQ~hcu+^F-?-lECx8-_n#Y@%9c*XtNmaXPA2YE2H?m%<_1g(oZh8xP|EPhmQO%;o#}rR2DoN|KTH9h)@)Qz9}D~cGWyuc! diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-35403e15-bee5-4683-bae0-eb6e6d066e5a-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-35403e15-bee5-4683-bae0-eb6e6d066e5a-c000.snappy.parquet deleted file mode 100644 index 25932798f46bc344b4b2c50d9fe9018743b61433..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmbu8&1%~~6op5V)`;L$>4*_%VTQywpbi>|D3S4|&_xMdglt0zBWvV}%CaNLDaH6z zx+q!sS+dC+^-8uQQ9E=|5SKIe=hK~obp7#05JXPMz$O?(hv*j7V{!K&Q{gnqK!XEW zgwVTB7~+wpL)?uW0J<;0t*U{0*}s9?1^~V%w6)=zW9X!H1W@Y)>En~lMpX;J=9kai zVlMOVcg6Udno80^qRd|H`1*nuCpF8uxXj2zHX7Od9HVmS@jZZVB?o&{MP#V zsIjF{uNY)nusg6}m;PF7Bi$BqtyRoDH(v3m&3wWZ+;O+2S2Hss??2(u#-4*FwFt)g z$iT?7DV^mLF6RQA>%qCf>CMy5ei@&ZAz1m*&!!+-0z3B-q94>l;aFL`@PhJL5d>IFU=Z3zDec$sU h$9McdojcR)-l1CLRYLn2eTw10d>&_kt5?natk4c&}%7SWvyIMS#~5jp%}kK z2|488$H;5sjWUwIgk$KTAcp_W?EH52&+7K_yG;;b#4rg4(IhRM9z^!tgGjm?p`w!y zIfT%c3k|r@;)>2fgo!l;KSq9cuLThtBFP#ECg#eSM7Wv zvfp?4;FlZ;(nO?vj46)nW3-k|DRGr`k%~24>l-bdw6(KV6KUmMf>o^kRn%w2X!SR4 zY{Xt$G#%y!F3e;slse9-;TB5C+p%G{2>#V%#*xa_b-8l)SaT0dKxgSR7k?*@s;K|7ITsO2l f%k$-#HSmM3-?ai6g!ZY{*AZHN=mj3eE&O!vzD~&5 diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-460c4961-a5dc-4c4c-8a77-9d8984c7b0b0-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-460c4961-a5dc-4c4c-8a77-9d8984c7b0b0-c000.snappy.parquet deleted file mode 100644 index b3307230f48f31c1e3d2d44dbaf6a84031a4275b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmbu8%WB&|6oyBW)`;R&=?o*#!VHOVKpk`;N@Tn#bWuVVA=^;G$Qrq#vg}B5LNR`o zE<#p*mTdY)J(BH6)DB$~#NnTF`E=$-y83kO5JZm2z#rmov4iUtR= z2%-0%F~lQHhqxO%0CZn~TU7)1vVQ}&4FLQ=SZl*K6gpWQ0n|D{`rYwnqpF2q9&w-tzz!E@rp-n<})_oj=MFznwinO|BOc)dk&h^BGB~_ z#mKN2o8=QB=Mr2JwPE63_EC{OR@=^vqhT9Foik{DvR%!e7Ib#tY+5z zk6EvoO|nu=RQ|6Qe_J7TxxMPgY2Mp<({qGl3#T^-7fBlRhly^PngAIIiF~`~ymf%`N}{ diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-4827706e-23f3-4cb3-ae85-563eef3e7cab-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-4827706e-23f3-4cb3-ae85-563eef3e7cab-c000.snappy.parquet deleted file mode 100644 index edb4872e4daf608ee20c58a5a986a80f2ada15e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmbu8&1%~~6op5V)`;S6N=J-93o|6f0d>$wM2UkbZN#*{EtE*!+Ci zE#@-+ep`&csi`C#M7k%K;#izOeIwmU;yUXg1DlpP>gyKinrC_knN=^r1~z_a#&4~! zj~ZJV^@2gB1-kxWgSpPxm^CyOe{scMDbWeD;G+RVgD`O8TfR zS^0CW*pL-vz8IIxW^tm@s9?h{OP0xLRf+|qo3(40)yi&W z-T#>Nn%N{P)kNk0dhyp4qF39iewgOHtv5Zvg~LT}5H6B5>dA{BiZ9|I@Z8W>vG03c i5)X!D>y@NrzjZ}pk3~@)PIJ^ zi0t=WKKLa^g0v9n9Ak!hQdwOdFldkI#t`mCt0iqY<` z+*paNwrD!+4P4m6cvG4QWJ(d^QbWkvpMX^l6ob_&IEES`&6xonox5eoY&gnEsM36uo2BpcCOxByt=jM9W z`NXWdo{iH&4rTVg7vIhiynQ6kyy@E9wz%Cr38rxpcEyDsMi-IqyH4QA$n#t` iv^>l6<(W0`gLD7f3SFr~3zbO31zd diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-4c690e4c-8e1b-4f61-854d-3f31eb753dad-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-4c690e4c-8e1b-4f61-854d-3f31eb753dad-c000.snappy.parquet deleted file mode 100644 index 88de5ada46a2a9dc163426f241c9c920f9312b88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmbu8Pm7yC7{Z?hrG+BBm$jdYDpP%nM=-t~7f*^8E1~$PUIz+dq9*g@&nTlbf3^X{B zMF_omhasM5I>i0h5up1AxKlOoAp19P*8srRgtj(3J%dhKM*y`>kbZf--Kc6I*nEG} zEfzBWa$ih7tC=JnM7kH4;#gcjeJkBc;yUXg1DlpP?&}umnpb)UnN=^r1~$HH#t*Hp zj~iPW^^8HL1-knc<#HjxC0-lGA5~r?^NhamxWgSpFAqA3hm?c24@*_@eEyZsR4F4_O8QG% zvGUtOu@NiEd^stZ&EiC*QNczZS1gmWsuT-IH*HBag>$w{QyHdEhe2htJ(G=A>$Tm? zy8kijHM2=ps;SEV_2N%!L~nOjeKX5@J8yb|3x|u|AY3MC)RWgi6ko?d;JKl%V&C_? i$nhONP*=_*2#3MY2~`-0OLJ@?w0+P|_&Dz1H~bBz2hB+U diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-501a544d-7549-4387-b4f5-78b953787ec5-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-501a544d-7549-4387-b4f5-78b953787ec5-c000.snappy.parquet deleted file mode 100644 index f88250f43ea96f1bf39117258bb967a2b5eee7c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 889 zcmbu8%WB&|6oyCR#xcR0LPm^03o|q#0d>%YD3S4^*@cot$hMR)vPO=GEIX2%5RBg< zlrFl+W8^jZMm>^z5so2?f;jwhE}zc)NY@uPHbI0D!z36)n{;%#AKAB$B5~J3MaS=Q z2%*p4FvOO!4{Ds{P=%lNicG^fQdkI#t`l6`66{9m) zyRjBKZP9et8@RBC@v1a&P6PLTZo>#>&PDx4xT>DWWlq^6CcY$grX4iuQF%F z^Hj1v%ZqF_ESSlnSSDf4`ak9@72~oL*^u6}#pwvn=`2Y^kU$*fXF$?T&S|6CyYeR$wM2U9wV>OH|mk(i*O8G6vW}5bNO`UN4oj+MG!<7v221tbV%2vhq1W5m#NqY9i6_) zA%xz2#1Id(Lx`)9JuG+4YDCT2$?dY5GO*qg+S==l2930iKxv&IeRSOHQne6lTz~Er zGnxOmEk@tfM3N37y%S7vEKZ=_NVk%>&U#44hG`6~u1R{vdAEa%s+V9L>%TPpNwd1c zjT;-W*A~Nsy@3mRSkGD;=eBUqTE*M3VXrl9-U~M2ZtL~DnwROh^@4|uEql#r5%k9c z9V5f0befO3oJnwp*GBPsl^4l0qi;R#a0k(|R~^M&%E8mSxhi=+ec%&S%1D-y{?Qh! z{5ex>z=|@Tk4k2+FIh&`c3{$AXpt9MT$p(w%(%#Ox z|1s-rXOpZ{W0n8w#ov~QUahYBVUqV(-t+|*4j28?aGs=5UtR`Ld>IFU=Z3zDec$sU h$9Mcdojao-ya+CwP=%2=GlnKY&4Yf!hj9Zx-Crgr$Tt80 diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-761b69af-b2b2-4dbe-aea5-3c0614b6a8db-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-761b69af-b2b2-4dbe-aea5-3c0614b6a8db-c000.snappy.parquet deleted file mode 100644 index d599e1c0c06f0ce8058ce26141902a6c40ac25c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmbu8%WB&|6oyBW)`;R&$tWYx!VHOVKpAu)N@Tn#bP+-qA=^^I$QrpKvTRFoLNI=n zE=pH^mTdAyIg;&4#135)#NnTF`E=$-y7_Wz6GVL-wBm3?_B#v7v4fXb9 z5kjB8Vu%Nd3UNEO2k86-Zd3)_$-V_{8UT1mXk)_))>0 z`BY^0clq$A91GGyqk}< zL2XN|-Z4lwV0U1{F5Q*VL^=)RN-3E;ZoK1BllhDdxZ`$Bw_>JR)_ul#o z#nV)>KFf=2J}j8YqF5$j&idaMEEVIj6xooj+v0Qt=X9PVB1oVPgVJPMChISjOS7JJ z{$tjyXXCVxBboi{#XpvaUT>~?HqJU5Z#p)&EpB&u!8}gFj=1#0=rZzs*9klsd7kTr imS=gsJhz5^aN%EAfeb?XR38`!tsnFUK8_ps4POC|PR&UG diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-761fc8e9-f2f8-4c4d-a740-e162ccbf1a16-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-761fc8e9-f2f8-4c4d-a740-e162ccbf1a16-c000.snappy.parquet deleted file mode 100644 index aabc1cecf0ea2dc96f759b9c89beb513a531116d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmbu8O-tiI7{@20TY~f?J7EGjltD{{?2wl=n$nA~hh^~~dzD2d&7>PPO>2_6Na>9fNcOb_X`>(p@S|q|-nym6EyT#ycK0na|jOJ8sr=D`u)?-Df;l*|XE620>fy zX&C7yrIT#L#Z-VxyfTd6$t;g2DgESfi(81EY<1+f2?uX)XR_egMK+}Cwm2QZIh`em2ok8npfuTr$@=rf!mMYV z56rstY@8NyB(wj$_}2o_AM2}r8E2ifHyxYX7PmXSU=}A~N1Xd%bRPM>>ja*RJkNDQ h%dNfs}>b&Be%(_%fR|hXk)G~<#Du%KxwQXy|-V_QbvNctBX!P z5!s*HeDGV21Zg4CIlvT0_5svu>68*zSr@5T)3v_Q)=5V@ZnuzD?j=~o>OVz&QjB(g z<;F^EwMElmZs5Wk#*5O#ISt&4Qt~!z*lJCa_lkA6+j2a&;-zY4yyAXs%T{w51od%8 z#Yi(L9cM!>CIZ~yl~Md&W_dhL=~tIq+(Pu|!;bte;o#}rR2DoNKk$((L?{YD-;^0E z{!S$8vAoEpgMyhXie(b!toL)qQZXt^kqznfwm2QaI-Mqo2ok76qcqu)$$GQ-++6oM z|IzENd*if_Lz#Vc@UJ=rrfeb?XNbBne)gO9>hj9%*-8*V4$Wj0R diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-9247e529-6180-4ffd-9cd7-c7c224a2846a-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-9247e529-6180-4ffd-9cd7-c7c224a2846a-c000.snappy.parquet deleted file mode 100644 index 3cb01b90249016639332f4c3490f42f47c109e46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmbu8Pm7yC7{nc<#HjxC0-lGA5~r?^NhamxWgSpFAqA3hm?c24@*_@eEyZsR4F4_O8QG% zvGUtOu@NiEd^stZ&EiC*QNczZS1gmWsuT-IH*HBag>$w{QyHdEhe2htJ(G=A>$Tm? zy8kijHM2=ps;SEV_2N%!L~nOjeKX5@J8yb|3x|u|AY3MC)RWgi6ko?d;JKl%V&C_? i$nhONP(x=Dgjd0p6RI#0m*&_)X#1d_@NwM1Z}=M=ea#a9 diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-93fd1f92-a8e8-402d-90ae-7e3e4e1541b8-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-93fd1f92-a8e8-402d-90ae-7e3e4e1541b8-c000.snappy.parquet deleted file mode 100644 index fb945801c3379bd5089e99857453cb5bb888f27b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmbu8&1%~~6op5V)`;R&>4*_%VTQywpbi>|D3S4|&_xMdglt0zBWvV}%CaNL3B~wT zx(HeMS+eOH^-8uQQ9E=|5SKIe=hK~oboJ?45JZm2z$O?(hv*j7V{v;gQ{gtsK!XEW zgwXrX7~+wpL)?uW0J<;0t*U{0*}s9?1^|8_w6)=zE_Bj50;qL@^tQSoH`1*nuCpF8uxXj2zHX7Od8T)eS@jZZVB?o&JZgP? z)Y#IfR}3;O*d5rgOMk7kk!}mQ)+*+n8?SiOW2Gbx z%Aa$^hO8*_#kgcPixZVb1smQhSth4dDHf1!+LCMn=WLOtGEAWkgUV(*CL1nSE4!I> z|6|r`W|OQ`6P5q##otzlUT&}YahmtG-t+_)4i~*axJc5dCoh61zKDasb34*_%VTQywpbi>|D3S4|&_xMdglt0zBWvV}%CaNL3B~wT zx(HeMS+eOH^-8uQQ9E=|5SKIe=hK~oboJ?45JZm2z$O?(hv*j7V{v;gQ&%*~K!XEW zgwXrX7~+wpL)?uW0J<;0t*U{0*}s9?1^|8_w6)7HPUV{roYjdUxC>#T(qC(Bq}xKSwTijt#w#ARna|jQJMPx>YG!8S{bxMd*mKaN7Qt8_ z85o&1rL%m(Lc_GiMxx=fSxXsxT6#=Ey>5^PngAIIiF~`~wBV%@Y6s diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-c3bfc572-0904-40be-950b-190c9ac38dd0-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-c3bfc572-0904-40be-950b-190c9ac38dd0-c000.snappy.parquet deleted file mode 100644 index 5267272526928b7a4e2a12c4aa728c168b134bde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmbu8&1%~~6op5V)`;R&+Yuws!VHOVKpiv^Q6l3_p^Ff@2-%hrM%Ks`m1RegQ;PAc zbWytUvt*Mu%9U(aB6jGaATDR_&!;;F>H6c1Ac!23flV-o4$&>D$Kv*0rXpyRfd&V% z2%)#1FvKHGhqxO%0CfKXx2gv2WuF7L4FG&kXluh)@1T>`5kRdIq~9EGHmX_(Ha}l> zi@D6d-xlLR-$=KTxXyaWz@}x6`npBB=9%6>X4OlufsJ39@muTb zqsEp-yrGE^;c(F#go`ANdh#NO;)^&4JU8@J?E9V< iIlkiu>dYAj;dyZGger{0sX4L`+C1nFd>q&C8$JOqpv`{( diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-c7a6b364-7b33-4446-8b32-5786af31b659-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-c7a6b364-7b33-4446-8b32-5786af31b659-c000.snappy.parquet deleted file mode 100644 index 54e5d08114171333b38188691567dbbfbc053c56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmbu8&1%~~6op5V)`;RoDIGBaEzFP@2h>3$5hXI-6uJnZi;!(8VPuV5QCW5*Ii(oC zN*ARoKT9@wqg=^$C1Qsz3gU9+{(QP~kgh-82!hBl8Q27a=n&nadMs}5Wh(qe8E9}I zix7JE2}3;6bcnmL13>pLaI0$IUiLX~+W^4#gtj((^%gp59RbujLHf<{W}~WwVDs~3 zx0uWP`)x7)rlyi~5b2&^ieqsC^^J5ZiR-L~3~XBFsIOb3Yo6&HWLCWd8`$`z8Nao@ zK5A@f)C&fg7VHje*rmVL+DNyBTx%6`&y5#6YBL|O1$W%7>DA24$omg?w6W))NiBl0 zJ~A*eZAxePgv+@Emw0U$zgKyY%rg4g;|_NaJ>Bal?otlk-Yrzg^VttRRi%t%De0rO zWaZDfVnbGx`C?o$o5hJrqk;{;ELkR}RVfybZrYM;0_SXzrZP;S4ui^OJ0=@0S1Y@j zb^l}5Yi5(IR1=l|>&0JJh+b{4`eB;)w%+sv7Y-M_LAXfLs3$LiD87h;z;i=i#lG)( ik>fjlpw66e5S|C;PN>32oSGvGq0NK-z{hb7zu^;MLd`A! diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-d3a6e587-1a5a-41bc-b6ff-a69043e0439f-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-d3a6e587-1a5a-41bc-b6ff-a69043e0439f-c000.snappy.parquet deleted file mode 100644 index 0298483c4a5fc215993c8f77b0c0acea2474c4e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmbu8O-tiI7{@2$ZVA%U;)Dt0PzEg(vO``ln$nBlVOc!LUS*L?5eJq*F>?K&k+8;&xt8~>t zZA+~_Fi1CGcVNRV-KEk*It}DfDVbYteBe=&`GO6&<7Q2_Vy0TweZhm3Jv&Wm5VYl< zhLLVkI>|;{Oa-{aE5rDM%<_1W(yuPJxP|EPR!4rHaPaniCJUZT9{E@nA{2$7ugaVi zPgBYIEHARzuwW*OVwr?F>tD}VD#m3gvLRi!#pwvn=`2Y^kU$*Db)1xZUXmvp5Mm;>-`Dv&i>dC-7wCd9E8; hp5^)S#2Wg+seft(G6?NsePAH8deAd`99Qrgz5&4S%=iER diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-dd103f91-a5b8-49ec-bbe5-e601ad50990b-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-dd103f91-a5b8-49ec-bbe5-e601ad50990b-c000.snappy.parquet deleted file mode 100644 index fb4e6a41b4c4b975bf63407328740d31829e490d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmbu8&1%~~6op5V)`-Td(h(!j!VHOVKpiv^Q6l3_p^Ff@2;G(vM%Ks`m1RegQ;PAc zbWytUvt*Mu%9U(KqIT$_ATDR_&!;;F>E^>{K@d411DjwF9im%QkHzi1OoeEafd&V% z2%)zhF~lQHhqxO%0Cb;$TU7)1vVQ}&4FG&cXluh)$IwaZ2%y#p(r->S8&xd?o1d<_ z#a!m!Z;SCaHI<};NcR*|9E($^Z=_pETxUIGVAC>3ecd8m^IY#Bv+5<-z{W4l_^tKz zQDaM^UNFeCV0U1{F8#IEM!GHJTC13QZoJ@8oB4n(xZ`e3uV!XO-haTOjXeiVY7va} zk%5tEQ##8hT+Su9#B0O&y~>MZmeJQ9cesP-*Rur$uc>uO0j@+)0SitIA@DAm0=2X7*safG1+jrTG`F4 z`yaDjGn-_knyCC=FaEkh^m=>M_tU($^`a diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-dedb3701-e58e-4871-8dcf-7fc92bceef90-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-dedb3701-e58e-4871-8dcf-7fc92bceef90-c000.snappy.parquet deleted file mode 100644 index fc8b42e4b2587ab42911c8535a99aa91fe84cafd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 889 zcmbu8%WB&|6oyBW#xcd4Ku3%~3o|q#0d>#?E0OV{*@cir$Toy9vPQ0`EZdTtQjFiC zlrFl+W8^jZMmdsv5so2?f;jwhE}zc)NVk`FHbI0D!z36)i?nrm6xokYBI#{}ica6; z5JJaaF~kGq2;ypF56fAzYEiLva=Wa$46ILtHum~(2#vIgKxv#H{qb|XOW8uOc5~Iq zry~3Qm=C|nu^=r(IwzRo$UcF3EuB*0D(fN@Yq~Zt+B)fIy><&}WiP=hR(~n#AH`@7 zHg0UhURyLB_69EOVLU5MoYTNPDhK~R4m zs2FJ`rIT#L#Z-VhyfTVE$t;g2DLr(##Vth7-gM-%goCHExh!}#`N7As5TPgp{iiHg z@pCF!pXEh19~R7HQ7n@%XZ`yHOU1Y>MK+|jZE-q+b2?8F5hPHDL20rzll2$NrMaDT z{$tkN&c2cw#ScqFuUA+7GS0dyZ@M$fE!N diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-e4e4db35-0dcc-429d-8ce5-b8e556b1a2cf-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-e4e4db35-0dcc-429d-8ce5-b8e556b1a2cf-c000.snappy.parquet deleted file mode 100644 index 95d9d5caec987a876caf391f483e1db461c6d166..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmbu8&1%~~6op5V)QDoTC>=2ZEzFP@2h>3$B}!zxDRfan7NOfx!pIuAqO$Bra!N6N zl`cwGewJ+dM!k~lO4JTr6vXAs{rPm~Al<$FAP6F-WMC5vqC<3x>anj?- zyTx4QU+#qnh_BnJ>mAvss*|G%DEe835oCUDLcX)41M>M*Emwqvs4a<#IX zS@%C?y=FGaN;OgWzh3-lh3L)ps&A%wZ|hA@aN%-$A_je7Drh~n!w2s}6RRqXqo j7dgJ;2kO!p2jNw4<%BAX#JM@L5ZXNGCwv@t@EiUH*Qw0- diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-fe14f78d-2af5-4237-92ec-4131dba27fa2-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-fe14f78d-2af5-4237-92ec-4131dba27fa2-c000.snappy.parquet deleted file mode 100644 index a4431d933b49cde5aa3a7c56f4e85908531b0d05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 889 zcmbu8%WB&|6oyBW)Dgv-LPv~13o|q#0d>%YD3^z5so2?fH?efE}zc)NEcr(9fAlWrbRG_4p9wy6gxL}BJFR4hE87O z5JDfmV2B6G5yaKV9+taiHKJzixMowRfBZ(Gqr>Cs+V95YmbWdM={mm z#*K~GYm08c-oS-D%qOLdb6dD4rQ+?_u-BS4?-?6#xAl5n&C9ghe8$7Zmc8b*2-@!h z4I|y6befO3mnHR}4qwhR!a~sjq7ahfI%E8myxh#1;z2_5Iib#}#{!DiS zH_Uq5*(59FSmv+2_)ReaGs=5PxON*?#DskxuGv(-}k)8 h_H93qXZ9!v&x3P2lwstY>O%ve=0Shq!?=K-?mq%y$n*dJ diff --git a/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-ff24642e-224c-4714-8525-8a7df5b1a2f4-c000.snappy.parquet b/connectors/examples/flink-example/src/main/resources/data/source_table_no_partitions/part-00000-ff24642e-224c-4714-8525-8a7df5b1a2f4-c000.snappy.parquet deleted file mode 100644 index d8e9fd35ebc4fc47dbafa6b1391e96935931adde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 889 zcmbu8O-tiI7{@20)*`(uIAH=gltF_+cE}4xQ+n9FE#g7;Dk76+(hZxYHAxjI{T3n~ z_Tb0xYwS1LCrMvIE$l%E5C3^yetG6ka{c|MO%P$kFbM|HB5j@SNA}%=NUW7m(aDD# zLg>pk3~@)CK8AWNol@c|>mn6vy4E+^I_YRGuJ}c_0Vzm1! zH&$Y+Et(E{0~hu%-jpWJY2eQR%@EPcdWzRmg~6{FI6++9rtTnwwlu*s4qJz zMw&_KI2&>?5#SE5jN%V6%j0oM_grpq3(?aL9r=C2!PEPxEO<741Td67*A1v6O`%OuQM?`FnQF)B-u4e51ToDSifPLo6g3DjXwnrz8rz1e(ju4kQ3 z%)0B@I4$H*X8(Kf?Htj|#Z|wKvhKp0uFY+W+uf638Yf{_T=-#h5&6FB1fGmM&viq~ gvpip(Spz>f_s^|B2BCeb^>u{m2mOH$;~IXtf8rF#8~^|S diff --git a/connectors/examples/flink-example/src/main/resources/log4j2.properties b/connectors/examples/flink-example/src/main/resources/log4j2.properties deleted file mode 100644 index a6f70264767..00000000000 --- a/connectors/examples/flink-example/src/main/resources/log4j2.properties +++ /dev/null @@ -1,37 +0,0 @@ -################################################################################ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -################################################################################ - -rootLogger.level = ERROR -rootLogger.appenderRef.console.ref = ConsoleAppender - -# Logs for Apache Flink. -logger.flink.name = org.apache.flink -logger.flink.level = ERROR - -# Logs for Delta Flink connector. -logger.connector.name = io.delta.flink -logger.connector.level = ERROR - -# Logs for Console Sink. -logger.consoleSink.name = org.utils.ConsoleSink -logger.consoleSink.level = INFO - -appender.console.name = ConsoleAppender -appender.console.type = CONSOLE -appender.console.layout.type = PatternLayout -appender.console.layout.pattern = %d{HH:mm:ss,SSS} %-5p %-60c %x - %m%n diff --git a/connectors/examples/hello-world/pom.xml b/connectors/examples/hello-world/pom.xml deleted file mode 100644 index ab8492bc87d..00000000000 --- a/connectors/examples/hello-world/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - 4.0.0 - - org.example - hello-world - 1.0-SNAPSHOT - - - 1.8 - 1.8 - "" - 2.12 - 0.5.0 - - - - - staging-repo - ${staging.repo.url} - - - - - - io.delta - delta-standalone_${scala.version} - ${standalone.version} - - - - org.apache.hadoop - hadoop-client - 3.1.0 - - - - org.apache.parquet - parquet-hadoop - 1.10.1 - - - diff --git a/connectors/examples/hello-world/src/main/java/example/HelloWorld.java b/connectors/examples/hello-world/src/main/java/example/HelloWorld.java deleted file mode 100644 index b92b2824819..00000000000 --- a/connectors/examples/hello-world/src/main/java/example/HelloWorld.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (2021) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package example; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.util.*; -import java.util.stream.Collectors; - -import org.apache.commons.io.FileUtils; -import org.apache.hadoop.conf.Configuration; - -import io.delta.standalone.DeltaLog; -import io.delta.standalone.actions.AddFile; -import io.delta.standalone.Operation; -import io.delta.standalone.OptimisticTransaction; -import io.delta.standalone.actions.Metadata; -import io.delta.standalone.types.IntegerType; -import io.delta.standalone.types.StringType; -import io.delta.standalone.types.StructType; - -/** - * Simple test class for delta-standalone JAR verification. - * - Creates a delta table with partition columns. - * - Commits {@code AddFile}s individually. - * - Reads table metadata and verifies all {@code AddFile}s were committed as expected. - * - * To run with Maven: - * - cd connectors/examples/hello-world - * - mvn package exec:java -Dexec.cleanupDaemonThreads=false -Dexec.mainClass=example.HelloWorld - * - * To run with SBT: - * - cd connectors/examples - * - build/sbt "helloWorld/runMain example.HelloWorld" - * - If you encounter any sort of errors like - * ``` - * sbt.ResolveException: unresolved dependency: javax.servlet#javax.servlet-api;3.1.0 - * ``` - * then clear your ~/.ivy2/cache/io.delta - * - * To run with IntelliJ: - * - make sure that this `hello-world` folder is marked as a Module in IntelliJ. - * e.g. File > Project Structure... > Modules > '+' > Import Module > - * Create module from existing sources - * - * - then, mark the parent `java` folder as Sources Root. - * e.g. right click on `java` > Mark Directory as > Sources Root - * - * - then, import `pom.xml` as a Maven project. - * e.g. right click on `pom.xml` > Add as Maven Project - */ -public class HelloWorld { - public static void main(String[] args) throws IOException { - File tmpDir = Files.createTempDirectory("my_table").toFile(); - String tmpDirPath = tmpDir.getAbsolutePath(); - - try { - final String engineInfo = "local"; - - DeltaLog log = DeltaLog.forTable(new Configuration(), tmpDirPath); - - StructType schema = new StructType() - .add("foo", new IntegerType()) - .add("bar", new IntegerType()) - .add("zip", new StringType()); - - List partitionColumns = Arrays.asList("foo", "bar"); - - Metadata metadata = Metadata.builder() - .schema(schema) - .partitionColumns(partitionColumns) - .build(); - - Operation op = new Operation(Operation.Name.WRITE); - - for (int i = 0; i < 15; i++) { - OptimisticTransaction txn = log.startTransaction(); - if (i == 0) { - txn.updateMetadata(metadata); - } - - Map partitionValues = new HashMap<>(); - partitionValues.put("foo", Integer.toString(i % 3)); - partitionValues.put("bar", Integer.toString(i % 2)); - - long now = System.currentTimeMillis(); - - AddFile addFile = AddFile.builder(Integer.toString(i), partitionValues, 100L, now, true) - .tags(Collections.singletonMap("someTagKey", "someTagVal")) - .build(); - - txn.commit(Collections.singletonList(addFile), op, engineInfo); - System.out.println(String.format("Committed version %d", i)); - } - - DeltaLog log2 = DeltaLog.forTable(new Configuration(), tmpDirPath); - Set pathVals = log2.update() - .getAllFiles() - .stream() - .map(addFile -> Integer.parseInt(addFile.getPath())) - .collect(Collectors.toSet()); - - for (int i = 0; i < 15; i++) { - if (!pathVals.contains(i)) throw new RuntimeException(); - System.out.println(String.format("Read version %d", i)); - } - - } finally { - FileUtils.deleteDirectory(tmpDir); - } - } -} diff --git a/connectors/examples/project/build.properties b/connectors/examples/project/build.properties deleted file mode 100644 index 0983172246c..00000000000 --- a/connectors/examples/project/build.properties +++ /dev/null @@ -1,36 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# -# This file contains code from the Apache Spark project (original license above). -# It contains modifications, which are licensed as follows: -# - -# -# Copyright (2021) The Delta Lake Project Authors. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -sbt.version=1.9.9 diff --git a/connectors/examples/run_examples.py b/connectors/examples/run_examples.py deleted file mode 100644 index de65394dcad..00000000000 --- a/connectors/examples/run_examples.py +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/env python3 - -# -# Copyright (2021) The Delta Lake Project Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -import os -import subprocess -from os import path -import shutil -import argparse - - -def delete_if_exists(path): - # if path exists, delete it. - if os.path.exists(path): - shutil.rmtree(path) - print("Deleted %s " % path) - -def run_maven_proj(test_dir, example, version, maven_repo, scala_version): - print(f"\n\n##### Running Maven verification {example} on standalone version {version} with scala version {scala_version}#####") - with WorkingDirectory(test_dir): - cmd = ["mvn", "package", "exec:java", "-Dexec.cleanupDaemonThreads=false", - f"-Dexec.mainClass=example.{example}", - f"-Dscala.version={scala_version}", f"-Dstaging.repo.url={maven_repo}", - f"-Dstandalone.version={version}"] - run_cmd(cmd, stream_output=True) - -def run_sbt_proj(test_dir, proj, className, version, maven_repo, scala_version): - print(f"\n\n##### Running SBT verification {proj} on standalone version {version} with scala version {scala_version}#####") - - env = {"STANDALONE_VERSION": str(version)} - if maven_repo: - env["EXTRA_MAVEN_REPO"] = maven_repo - with WorkingDirectory(test_dir): - cmd = ["build/sbt", f"++ {scala_version}", f"{proj}/runMain example.{className}"] - run_cmd(cmd, stream_output=True, env=env) - -def clear_artifact_cache(): - print("Clearing Delta artifacts from ivy2 and mvn cache") - ivy_caches_to_clear = [filepath for filepath in os.listdir(os.path.expanduser("~")) if filepath.startswith(".ivy")] - print(f"Clearing Ivy caches in: {ivy_caches_to_clear}") - for filepath in ivy_caches_to_clear: - delete_if_exists(os.path.expanduser(f"~/{filepath}/cache/io.delta")) - delete_if_exists(os.path.expanduser(f"~/{filepath}/local/io.delta")) - delete_if_exists(os.path.expanduser("~/.m2/repository/io/delta/")) - -def run_cmd(cmd, throw_on_error=True, env=None, stream_output=False, **kwargs): - cmd_env = os.environ.copy() - if env: - cmd_env.update(env) - - if stream_output: - child = subprocess.Popen(cmd, env=cmd_env, **kwargs) - exit_code = child.wait() - if throw_on_error and exit_code != 0: - raise Exception("Non-zero exitcode: %s" % (exit_code)) - return exit_code - else: - child = subprocess.Popen( - cmd, - env=cmd_env, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - **kwargs) - (stdout, stderr) = child.communicate() - exit_code = child.wait() - if throw_on_error and exit_code != 0: - raise Exception( - "Non-zero exitcode: %s\n\nSTDOUT:\n%s\n\nSTDERR:%s" % - (exit_code, stdout, stderr)) - return (exit_code, stdout, stderr) - - -class WorkingDirectory(object): - def __init__(self, working_directory): - self.working_directory = working_directory - self.old_workdir = os.getcwd() - - def __enter__(self): - os.chdir(self.working_directory) - - def __exit__(self, tpe, value, traceback): - os.chdir(self.old_workdir) - - -if __name__ == "__main__": - """ - Script to run integration tests which are located in the examples directory. - Call this by running "python3 run-examples.py --version ", where is the - Delta Connectors repo version to use. - - There are two version 'modes' you should use to run this file. - 1. using published or staged jar: explicitly pass in the --version argument. - 2. using locally-generated jar (e.g. x.y.z-SNAPSHOT): explicitly pass in the --version argument - and --use-local-cache argument. - - In this mode, ensure that the local jar exists for all scala versions. You can generate it - by running the following commands in the root connectors folder. - - build/sbt '++2.11.12 publishM2' - build/sbt '++2.12.18 publishM2' - build/sbt '++2.13.16 publishM2' - """ - - # get the version of the package - root_dir = path.dirname(__file__) - - parser = argparse.ArgumentParser() - parser.add_argument( - "--version", - required=True, - help="Delta Standalone version to use to run the integration tests") - parser.add_argument( - "--maven-repo", - required=False, - default=None, - help="Additional Maven repo to resolve staged new release artifacts") - parser.add_argument( - "--use-local-cache", - required=False, - default=False, - action="store_true", - help="Don't clear Delta artifacts from ivy2 and mvn cache") - - args = parser.parse_args() - - if not args.use_local_cache: - clear_artifact_cache() - - examples = [("convert-to-delta", "convertToDelta", "ConvertToDelta"), - ("hello-world", "helloWorld", "HelloWorld")] - - for dir, proj, className in examples: - run_maven_proj(path.join(root_dir, dir), className, args.version, args.maven_repo, "2.11") - run_maven_proj(path.join(root_dir, dir), className, args.version, args.maven_repo, "2.12") - run_maven_proj(path.join(root_dir, dir), className, args.version, args.maven_repo, "2.13") - - run_sbt_proj(root_dir, proj, className, args.version, args.maven_repo, "2.11.12") - run_sbt_proj(root_dir, proj, className, args.version, args.maven_repo, "2.12.18") - run_sbt_proj(root_dir, proj, className, args.version, args.maven_repo, "2.13.16") diff --git a/connectors/examples/run_flink_examples.sh b/connectors/examples/run_flink_examples.sh deleted file mode 100644 index 716e5d7d7db..00000000000 --- a/connectors/examples/run_flink_examples.sh +++ /dev/null @@ -1,80 +0,0 @@ -# We expect env variables STANDALONE_VERSION and EXTRA_MAVEN_REPO -# e.g. -# export STANDALONE_VERSION=0.6.0 -# export EXTRA_MAVEN_REPO=___ -# -# We also expect the connectors repo to be cloned at ~/connectors - -declare -a source_tests=( - "org.example.source.bounded.DeltaBoundedSourceExample" - "org.example.source.bounded.DeltaBoundedSourceUserColumnsExample" - "org.example.source.bounded.DeltaBoundedSourceVersionAsOfExample" - "org.example.source.continuous.DeltaContinuousSourceExample" - "org.example.source.continuous.DeltaContinuousSourceStartingVersionExample" - "org.example.source.continuous.DeltaContinuousSourceUserColumnsExample" - "org.example.sql.select.bounded.SelectBoundedTableExample" - "org.example.sql.select.bounded.SelectBoundedTableVersionAsOfExample" - "org.example.sql.select.continuous.SelectContinuousTableExample" - "org.example.sql.select.continuous.SelectContinuousTableStartingVersionExample" -) - -declare -a sink_tests=( - "org.example.sink.DeltaSinkExample" - "org.example.sink.DeltaSinkPartitionedTableExample" - "org.example.sql.insert.InsertTableExample" - "org.example.sql.StreamingApiDeltaSourceToTableDeltaSinkJob" -) - -echo "============= Running Delta/Flink Integration Tests =============" - -echo "============= Clearing any existing maven downloads =============" -rm -rf ~/.m2/repository/io/delta/delta-standalone_2.12/$STANDALONE_VERSION -echo "Cleared delta-standalone artifacts" -rm -rf ~/.m2/repository/io/delta/delta-flink/$STANDALONE_VERSION -echo "Cleared delta-flink artifacts" -rm -rf ~/.m2/repository/org/apache/flink -echo "Cleared org.apache.flink artifacts" - -echo "============= Testing Delta Source =============" -echo "============= Testing Delta Source -- Maven =============" -cd ~/connectors/examples/flink-example/ - -for i in "${source_tests[@]}" -do - echo "============= Testing Delta Source -- Maven - $i =============" - timeout 70s mvn package exec:java \ - -Dexec.cleanupDaemonThreads=false \ - -Dexec.mainClass=$i \ - -Dstaging.repo.url=$EXTRA_MAVEN_REPO \ - -Dconnectors.version=$STANDALONE_VERSION -done - -echo "============= Testing Delta Source -- SBT =============" -cd ~/connectors/examples/ -for i in "${source_tests[@]}" -do - echo "============= Testing Delta Source -- SBT - $i =============" - timeout 70s build/sbt "flinkExample/runMain $i" -done - -echo "============= Testing Delta Sink =============" -echo "============= Testing Delta Sink -- Maven =============" -cd ~/connectors/examples/flink-example/ - -for i in "${sink_tests[@]}" -do - echo "============= Testing Delta Sink -- Maven - $i =============" - timeout 70s mvn package exec:java \ - -Dexec.cleanupDaemonThreads=false \ - -Dexec.mainClass=$i \ - -Dstaging.repo.url=$EXTRA_MAVEN_REPO \ - -Dconnectors.version=$STANDALONE_VERSION -done - -echo "============= Testing Delta Sink -- SBT =============" -cd ~/connectors/examples/ -for i in "${sink_tests[@]}" -do - echo "============= Testing Delta Sink -- SBT - $i =============" - timeout 70s build/sbt "flinkExample/runMain $i" -done diff --git a/connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/compatibility/tests/OSSCompatibilitySuite.scala b/connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/compatibility/tests/OSSCompatibilitySuite.scala deleted file mode 100644 index 591e52db193..00000000000 --- a/connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/compatibility/tests/OSSCompatibilitySuite.scala +++ /dev/null @@ -1,450 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.compatibility.tests - -import java.io.File -import java.nio.file.Files -import java.util.UUID - -import scala.collection.JavaConverters._ - -import org.apache.commons.io.FileUtils -import org.apache.hadoop.conf.Configuration -import org.apache.spark.sql.delta.{DeltaLog => OSSDeltaLog} - -import io.delta.standalone.{DeltaLog => StandaloneDeltaLog} - -import io.delta.standalone.internal.{DeltaLogImpl => InternalStandaloneDeltaLog} -import io.delta.standalone.internal.util.ComparisonUtil - -class OSSCompatibilitySuite extends OssCompatibilitySuiteBase with ComparisonUtil { - - /** - * Creates a temporary directory, a public Standalone DeltaLog, an internal Standalone DeltaLog, - * and a DeltaOSS DeltaLog, which are all then passed to `f`. - * - * The internal Standalone DeltaLog is used to gain access to internal, non-public Java APIs - * to verify internal state. - * - * The temporary directory will be deleted after `f` returns. - */ - private def withTempDirAndLogs( - f: (File, StandaloneDeltaLog, InternalStandaloneDeltaLog, OSSDeltaLog) => Unit): Unit = { - val dir = Files.createTempDirectory(UUID.randomUUID().toString).toFile - - val standaloneLog = StandaloneDeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val standaloneInternalLog = - InternalStandaloneDeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val ossLog = OSSDeltaLog.forTable(spark, dir.getCanonicalPath) - - try f(dir, standaloneLog, standaloneInternalLog, ossLog) finally { - FileUtils.deleteDirectory(dir) - } - } - - test("assert static actions are the same (without any writes/reads)") { - compareMetadata(ss.metadata, oo.metadata) - compareAddFiles(ss.addFiles, oo.addFiles) - compareRemoveFiles(ss.removeFiles, oo.removeFiles) - compareSetTransaction(ss.setTransaction, oo.setTransaction) - } - - /** - * For each (logType1, logType2, action) below, we will test the case of: - * logType1 write action (A1), logType2 read action (A2), assert A1 == A2 - * - * case 1a: standalone, oss, Metadata - * case 1b: oss, standalone, Metadata - * - * case 2a: standalone, oss, CommitInfo - * case 2b: oss, standalone, CommitInfo - * - * case 3a: standalone, oss, Protocol - * case 3b: oss, standalone, Protocol - * - * case 4a: standalone, oss, AddFile - * case 4b: oss, standalone, AddFile - * - * case 5a: standalone, oss, RemoveFile - * case 5b: oss, standalone, RemoveFile - * - * case 6a: standalone, oss, SetTransaction - * case 6b: oss, standalone, SetTransaction - */ - test("read/write actions") { - withTempDirAndLogs { (_, standaloneLog, standaloneInternalLog, ossLog) => - // === Standalone commit Metadata & CommitInfo === - val standaloneTxn0 = standaloneLog.startTransaction() - standaloneTxn0.commit(Iterable(ss.metadata).asJava, ss.op, ss.engineInfo) - - // case 1a - compareMetadata(standaloneLog.update().getMetadata, ossLog.update().metadata) - - // case 2a - compareCommitInfo(standaloneLog.getCommitInfoAt(0), oo.getCommitInfoAt(ossLog, 0)) - - // case 3a - compareProtocol(standaloneInternalLog.update().protocol, ossLog.snapshot.protocol) - - // === OSS commit Metadata & CommitInfo === - val ossTxn1 = ossLog.startTransaction() - ossTxn1.commit(oo.metadata :: Nil, oo.op) - - // case 1b - compareMetadata(standaloneLog.update().getMetadata, ossLog.update().metadata) - - // case 2b - compareCommitInfo(standaloneLog.getCommitInfoAt(1), oo.getCommitInfoAt(ossLog, 1)) - - // case 3b - compareProtocol(standaloneInternalLog.update().protocol, ossLog.snapshot.protocol) - - // === Standalone commit AddFiles === - val standaloneTxn2 = standaloneLog.startTransaction() - standaloneTxn2.commit(ss.addFiles.asJava, ss.op, ss.engineInfo) - - def assertAddFiles(): Unit = { - standaloneLog.update() - ossLog.update() - - val scanFiles = standaloneLog.snapshot().scan().getFiles.asScala.toSeq - assert(standaloneLog.snapshot().getAllFiles.size() == ss.addFiles.size) - assert(scanFiles.size == ss.addFiles.size) - assert(ossLog.snapshot.allFiles.count() == ss.addFiles.size) - - compareAddFiles( - standaloneLog.update().getAllFiles.asScala.toSeq, ossLog.update().allFiles.collect()) - compareAddFiles(scanFiles, ossLog.update().allFiles.collect()) - } - - // case 4a - assertAddFiles() - - // === OSS commit AddFiles === - val ossTxn3 = ossLog.startTransaction() - ossTxn3.commit(oo.addFiles, oo.op) - - // case 4b - assertAddFiles() - - // === Standalone commit RemoveFiles === - val standaloneTxn4 = standaloneLog.startTransaction() - standaloneTxn4.commit(ss.removeFiles.asJava, ss.op, ss.engineInfo) - - def assertRemoveFiles(): Unit = { - standaloneLog.update() - standaloneInternalLog.update() - ossLog.update() - - assert(standaloneLog.snapshot().getAllFiles.isEmpty) - assert(ossLog.snapshot.allFiles.isEmpty) - assert(standaloneInternalLog.snapshot.tombstones.size == ss.removeFiles.size) - assert(ossLog.snapshot.tombstones.count() == ss.removeFiles.size) - compareRemoveFiles( - standaloneInternalLog.snapshot.tombstones, ossLog.snapshot.tombstones.collect()) - } - - // case 5a - assertRemoveFiles() - - // === OSS commit RemoveFiles === - val ossTxn5 = ossLog.startTransaction() - ossTxn5.commit(oo.removeFiles, oo.op) - - // case 5b - assertRemoveFiles() - - // === Standalone commit SetTransaction === - val standaloneTxn6 = standaloneLog.startTransaction() - standaloneTxn6.commit(Iterable(ss.setTransaction).asJava, ss.op, ss.engineInfo) - - def assertSetTransactions(): Unit = { - standaloneInternalLog.update() - ossLog.update() - assert(standaloneInternalLog.snapshot.setTransactionsScala.length == 1) - assert(ossLog.snapshot.setTransactions.length == 1) - compareSetTransaction( - standaloneInternalLog.snapshot.setTransactions.head, - ossLog.snapshot.setTransactions.head) - } - - // case 6a - assertSetTransactions() - - // === OSS commit SetTransaction === - val ossTxn7 = ossLog.startTransaction() - ossTxn7.commit(oo.setTransaction :: Nil, oo.op) - - // case 6b - assertSetTransactions() - } - } - - test("Standalone writer write to higher protocol OSS table should fail") { - withTempDirAndLogs { (_, standaloneLog, _, ossLog) => - ossLog.startTransaction().commit(oo.metadata :: oo.protocol13 :: Nil, oo.op) - - // scalastyle:off line.size.limit - val e = intercept[io.delta.standalone.internal.exception.DeltaErrors.InvalidProtocolVersionException] { - // scalastyle:on line.size.limit - standaloneLog.startTransaction().commit(Iterable().asJava, ss.op, ss.engineInfo) - } - - assert(e.getMessage.contains( - """ - |Delta protocol version (1,3) is too new for this version of Delta - |Standalone Reader/Writer (1,2). Please upgrade to a newer release. - |""".stripMargin)) - } - } - - /////////////////////////////////////////////////////////////////////////// - // Allowed concurrent actions - /////////////////////////////////////////////////////////////////////////// - - checkStandalone( - "append / append", - conflicts = false, - reads = Seq(t => t.metadata()), - concurrentOSSWrites = Seq(oo.conflict.addA), - actions = Seq(ss.conflict.addB)) - - checkOSS( - "append / append", - conflicts = false, - reads = Seq(t => t.metadata), - concurrentStandaloneWrites = Seq(ss.conflict.addA), - actions = Seq(oo.conflict.addB)) - - checkStandalone( - "disjoint txns", - conflicts = false, - reads = Seq(t => t.txnVersion("foo")), - concurrentOSSWrites = Seq(oo.setTransaction), - actions = Nil) - - checkOSS( - "disjoint txns", - conflicts = false, - reads = Seq(t => t.txnVersion("foo")), - concurrentStandaloneWrites = Seq(ss.setTransaction), - actions = Nil) - - checkStandalone( - "disjoint delete / read", - conflicts = false, - setup = Seq(ss.conflict.metadata_partX, ss.conflict.addA_partX2), - reads = Seq(t => t.markFilesAsRead(ss.conflict.colXEq1Filter)), - concurrentOSSWrites = Seq(oo.conflict.removeA), - actions = Seq() - ) - - checkOSS( - "disjoint delete / read", - conflicts = false, - setup = Seq(oo.conflict.metadata_partX, oo.conflict.addA_partX2), - reads = Seq(t => t.filterFiles(oo.conflict.colXEq1Filter :: Nil)), - concurrentStandaloneWrites = Seq(ss.conflict.removeA), - actions = Seq() - ) - - checkStandalone( - "disjoint add / read", - conflicts = false, - setup = Seq(ss.conflict.metadata_partX), - reads = Seq(t => t.markFilesAsRead(ss.conflict.colXEq1Filter)), - concurrentOSSWrites = Seq(oo.conflict.addA_partX2), - actions = Seq() - ) - - checkOSS( - "disjoint add / read", - conflicts = false, - setup = Seq(oo.conflict.metadata_partX), - reads = Seq(t => t.filterFiles(oo.conflict.colXEq1Filter :: Nil)), - concurrentStandaloneWrites = Seq(ss.conflict.addA_partX2), - actions = Seq() - ) - - checkStandalone( - "add / read + no write", // no write = no real conflicting change even though data was added - conflicts = false, // so this should not conflict - setup = Seq(ss.conflict.metadata_partX), - reads = Seq(t => t.markFilesAsRead(ss.conflict.colXEq1Filter)), - concurrentOSSWrites = Seq(oo.conflict.addA_partX1), - actions = Seq()) - - checkOSS( - "add / read + no write", // no write = no real conflicting change even though data was added - conflicts = false, // so this should not conflict - setup = Seq(oo.conflict.metadata_partX), - reads = Seq(t => t.filterFiles(oo.conflict.colXEq1Filter :: Nil)), - concurrentStandaloneWrites = Seq(ss.conflict.addA_partX1), - actions = Seq()) - - /////////////////////////////////////////////////////////////////////////// - // Disallowed concurrent actions - /////////////////////////////////////////////////////////////////////////// - - checkStandalone( - "delete / delete", - conflicts = true, - reads = Nil, - concurrentOSSWrites = Seq(oo.conflict.removeA), - actions = Seq(ss.conflict.removeA_time5) - ) - - checkOSS( - "delete / delete", - conflicts = true, - reads = Nil, - concurrentStandaloneWrites = Seq(ss.conflict.removeA), - actions = Seq(oo.conflict.removeA_time5) - ) - - checkStandalone( - "add / read + write", - conflicts = true, - setup = Seq(ss.conflict.metadata_partX), - reads = Seq(t => t.markFilesAsRead(ss.conflict.colXEq1Filter)), - concurrentOSSWrites = Seq(oo.conflict.addA_partX1), - actions = Seq(ss.conflict.addB_partX1), - // commit info should show operation as "Manual Update", because that's the operation used by - // the harness - errorMessageHint = Some("[x=1]" :: "Manual Update" :: Nil)) - - checkOSS( - "add / read + write", - conflicts = true, - setup = Seq(oo.conflict.metadata_partX), - reads = Seq(t => t.filterFiles(oo.conflict.colXEq1Filter :: Nil)), - concurrentStandaloneWrites = Seq(ss.conflict.addA_partX1), - actions = Seq(oo.conflict.addB_partX1), - // commit info should show operation as "Manual Update", because that's the operation used by - // the harness - errorMessageHint = Some("[x=1]" :: "Manual Update" :: Nil)) - - checkStandalone( - "delete / read", - conflicts = true, - setup = Seq(ss.conflict.metadata_partX, ss.conflict.addA_partX1), - reads = Seq(t => t.markFilesAsRead(ss.conflict.colXEq1Filter)), - concurrentOSSWrites = Seq(oo.conflict.removeA), - actions = Seq(), - errorMessageHint = Some("a in partition [x=1]" :: "Manual Update" :: Nil)) - - checkOSS( - "delete / read", - conflicts = true, - setup = Seq(oo.conflict.metadata_partX, oo.conflict.addA_partX1), - reads = Seq(t => t.filterFiles(oo.conflict.colXEq1Filter :: Nil)), - concurrentStandaloneWrites = Seq(ss.conflict.removeA), - actions = Seq(), - errorMessageHint = Some("a in partition [x=1]" :: "Manual Update" :: Nil)) - - checkStandalone( - "schema change", - conflicts = true, - reads = Seq(t => t.metadata), - concurrentOSSWrites = Seq(oo.metadata), - actions = Nil) - - checkOSS( - "schema change", - conflicts = true, - reads = Seq(t => t.metadata), - concurrentStandaloneWrites = Seq(ss.metadata), - actions = Nil) - - checkStandalone( - "conflicting txns", - conflicts = true, - reads = Seq(t => t.txnVersion(oo.setTransaction.appId)), - concurrentOSSWrites = Seq(oo.setTransaction), - actions = Nil) - - checkOSS( - "conflicting txns", - conflicts = true, - reads = Seq(t => t.txnVersion(ss.setTransaction.getAppId)), - concurrentStandaloneWrites = Seq(ss.setTransaction), - actions = Nil) - - checkStandalone( - "upgrade / upgrade", - conflicts = true, - reads = Seq(t => t.metadata), - concurrentOSSWrites = Seq(oo.protocol12), - actions = Seq(ss.protocol12)) - - checkOSS( - "upgrade / upgrade", - conflicts = true, - reads = Seq(t => t.metadata), - concurrentStandaloneWrites = Seq(ss.protocol12), - actions = Seq(oo.protocol12)) - - checkStandalone( - "taint whole table", - conflicts = true, - setup = Seq(ss.conflict.metadata_partX, ss.conflict.addA_partX2), - reads = Seq( - t => t.markFilesAsRead(ss.conflict.colXEq1Filter), - // `readWholeTable` should disallow any concurrent change, even if the change - // is disjoint with the earlier filter - t => t.readWholeTable() - ), - concurrentOSSWrites = Seq(oo.conflict.addB_partX3), - actions = Seq(ss.conflict.addC_partX4) - ) - - checkOSS( - "taint whole table", - conflicts = true, - setup = Seq(oo.conflict.metadata_partX, oo.conflict.addA_partX2), - reads = Seq( - t => t.filterFiles(oo.conflict.colXEq1Filter :: Nil), - // `readWholeTable` should disallow any concurrent change, even if the change - // is disjoint with the earlier filter - t => t.readWholeTable() - ), - concurrentStandaloneWrites = Seq(ss.conflict.addB_partX3), - actions = Seq(oo.conflict.addC_partX4) - ) - - checkStandalone( - "taint whole table + concurrent remove", - conflicts = true, - setup = Seq(ss.conflict.metadata_colXY, ss.conflict.addA), - reads = Seq( - // `readWholeTable` should disallow any concurrent `RemoveFile`s. - t => t.readWholeTable() - ), - concurrentOSSWrites = Seq(oo.conflict.removeA), - actions = Seq(ss.conflict.addB)) - - checkOSS( - "taint whole table + concurrent remove", - conflicts = true, - setup = Seq(oo.conflict.metadata_colX, oo.conflict.addA), - reads = Seq( - // `readWholeTable` should disallow any concurrent `RemoveFile`s. - t => t.readWholeTable() - ), - concurrentStandaloneWrites = Seq(ss.conflict.removeA), - actions = Seq(oo.conflict.addB)) -} diff --git a/connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/compatibility/tests/OssCompatibilitySuiteBase.scala b/connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/compatibility/tests/OssCompatibilitySuiteBase.scala deleted file mode 100644 index dd8b2f986b5..00000000000 --- a/connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/compatibility/tests/OssCompatibilitySuiteBase.scala +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.compatibility.tests - -import java.util.ConcurrentModificationException - -import scala.collection.JavaConverters._ - -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.Path -import org.apache.spark.sql.QueryTest -import org.apache.spark.sql.delta.{actions => OSSActions, DeltaLog => OSSDeltaLog, DeltaOperations, OptimisticTransaction => OSSOptTxn} -import org.apache.spark.sql.test.SharedSparkSession - -import io.delta.standalone.{actions => StandaloneActions, DeltaLog => StandaloneDeltaLog, Operation => StandaloneOperation, OptimisticTransaction => StandaloneOptTxn} - -import io.delta.standalone.internal.util.{OSSUtil, StandaloneUtil} - -trait OssCompatibilitySuiteBase extends QueryTest with SharedSparkSession { - - protected val now = System.currentTimeMillis() - protected val ss = new StandaloneUtil(now) - protected val oo = new OSSUtil(now) - - private val standaloneConflictOp = new StandaloneOperation(StandaloneOperation.Name.MANUAL_UPDATE) - private val ossConflictOp = DeltaOperations.ManualUpdate - - /** - * Tests a DELTA STANDALONE transaction getting conflicted by a DELTA OSS commit (i.e. during the - * DSW transaction, a Delta OSS commit occurs and wins). - * - * Check whether the test transaction conflict with the concurrent writes by executing the - * given params in the following order: - * - setup (including setting table isolation level - * - reads - * - concurrentWrites - * - actions - * - * When `conflicts` == true, this function checks to make sure the commit of `actions` fails with - * [[java.util.ConcurrentModificationException]], otherwise checks that the commit is successful. - * - * @param testName test name - * @param conflicts should test transaction is expected to conflict or not - * @param setup sets up the initial delta log state (set schema, partitioning, etc.) - * @param reads reads made in the test transaction - * @param concurrentOSSWrites writes made by concurrent transactions after the test txn reads - * @param actions actions to be committed by the test transaction - * @param exceptionClass A substring to expect in the exception class name - */ - protected def checkStandalone( - testName: String, - conflicts: Boolean, - setup: Seq[StandaloneActions.Action] = - Seq(ss.conflict.metadata_colXY, new StandaloneActions.Protocol(1, 2)), - reads: Seq[StandaloneOptTxn => Unit], - concurrentOSSWrites: Seq[OSSActions.Action], - actions: Seq[StandaloneActions.Action], - errorMessageHint: Option[Seq[String]] = None, - exceptionClass: Option[String] = None): Unit = { - - val concurrentTxn: OSSOptTxn => Unit = - (opt: OSSOptTxn) => opt.commit(concurrentOSSWrites, ossConflictOp) - - def initialSetup(log: StandaloneDeltaLog): Unit = { - setup.foreach { action => - log.startTransaction().commit(Seq(action).asJava, standaloneConflictOp, ss.engineInfo) - } - } - - val conflictMsg = if (conflicts) "should conflict" else "should not conflict" - test(s"checkStandalone - $testName - $conflictMsg") { - withTempDir { tempDir => - // Standalone loses - val losingLog = - StandaloneDeltaLog.forTable(new Configuration(), new Path(tempDir.getCanonicalPath)) - - // OSS wins - val winningLog = OSSDeltaLog.forTable(spark, new Path(tempDir.getCanonicalPath)) - - // Setup the log - initialSetup(losingLog) - - // Perform reads - val standaloneTxn = losingLog.startTransaction() - reads.foreach(_ (standaloneTxn)) - - // Execute concurrent txn while current transaction is active - concurrentTxn(winningLog.startTransaction()) - - // Try commit and check expected conflict behavior - if (conflicts) { - val e = intercept[ConcurrentModificationException] { - standaloneTxn.commit(actions.asJava, standaloneConflictOp, ss.engineInfo) - } - errorMessageHint.foreach { expectedParts => - assert(expectedParts.forall(part => e.getMessage.contains(part))) - } - if (exceptionClass.nonEmpty) { - assert(e.getClass.getName.contains(exceptionClass.get)) - } - } else { - standaloneTxn.commit(actions.asJava, standaloneConflictOp, ss.engineInfo) - } - } - } - } - - /** - * Tests a DELTA OSS transaction getting conflicted by a DELTA STANDALONE commit (i.e. during the - * Delta OSS transaction, a Delta Standalone commit occurs and wins). - * - * Check whether the test transaction conflict with the concurrent writes by executing the - * given params in the following order: - * - setup (including setting table isolation level - * - reads - * - concurrentWrites - * - actions - * - * When `conflicts` == true, this function checks to make sure the commit of `actions` fails with - * [[java.util.ConcurrentModificationException]], otherwise checks that the commit is successful. - * - * @param testName test name - * @param conflicts should test transaction is expected to conflict or not - * @param setup sets up the initial delta log state (set schema, partitioning, etc.) - * @param reads reads made in the test transaction - * @param concurrentStandaloneWrites writes made by concurrent transactions after the test txn - * reads - * @param actions actions to be committed by the test transaction - * @param exceptionClass A substring to expect in the exception class name - */ - protected def checkOSS( - testName: String, - conflicts: Boolean, - setup: Seq[OSSActions.Action] = Seq(OSSActions.Metadata(), OSSActions.Protocol(1, 2)), - reads: Seq[OSSOptTxn => Unit], - concurrentStandaloneWrites: Seq[StandaloneActions.Action], // winning Delta Standalone writes - actions: Seq[OSSActions.Action], - errorMessageHint: Option[Seq[String]] = None, - exceptionClass: Option[String] = None): Unit = { - val concurrentTxn: StandaloneOptTxn => Unit = - (opt: StandaloneOptTxn) => - opt.commit(concurrentStandaloneWrites.asJava, standaloneConflictOp, ss.engineInfo) - - def initialSetup(log: OSSDeltaLog): Unit = { - setup.foreach { action => - log.startTransaction().commit(Seq(action), ossConflictOp) - } - } - - val conflictMsg = if (conflicts) "should conflict" else "should not conflict" - test(s"checkOSS - $testName - $conflictMsg") { - withTempDir { tempDir => - // OSS loses - val losingLog = OSSDeltaLog.forTable(spark, new Path(tempDir.getCanonicalPath)) - - // Standalone wins - val winningLog = - StandaloneDeltaLog.forTable(new Configuration(), new Path(tempDir.getCanonicalPath)) - - // Setup the log - initialSetup(losingLog) - - // Perform reads - val ossTxn = losingLog.startTransaction() - reads.foreach(_ (ossTxn)) - - // Execute concurrent txn while current transaction is active - concurrentTxn(winningLog.startTransaction()) - - // Try commit and check expected conflict behavior - if (conflicts) { - val e = intercept[ConcurrentModificationException] { - ossTxn.commit(actions, ossConflictOp) - } - errorMessageHint.foreach { expectedParts => - assert(expectedParts.forall(part => e.getMessage.contains(part))) - } - if (exceptionClass.nonEmpty) { - assert(e.getClass.getName.contains(exceptionClass.get)) - } - } else { - ossTxn.commit(actions, ossConflictOp) - } - } - } - } - -} diff --git a/connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/util/ComparisonUtil.scala b/connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/util/ComparisonUtil.scala deleted file mode 100644 index 6c9cdb79502..00000000000 --- a/connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/util/ComparisonUtil.scala +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import scala.collection.JavaConverters._ - -trait ComparisonUtil { - - private def compareOptions(a: java.util.Optional[_], b: Option[_]): Unit = { - assert(a.isPresent == b.isDefined) - if (a.isPresent) { - assert(a.get() == b.get) - } - } - - private def compareNullableMaps(a: java.util.Map[_, _], b: Map[_, _]): Unit = { - if (null == a) { - assert(null == b) - } else { - assert(a.asScala == b) - } - } - - def compareMetadata( - standalone: io.delta.standalone.actions.Metadata, - oss: org.apache.spark.sql.delta.actions.Metadata): Unit = { - - assert(standalone.getId == oss.id) - assert(standalone.getName == oss.name) - assert(standalone.getDescription == oss.description) - compareFormat(standalone.getFormat, oss.format) - assert(standalone.getSchema.toJson == oss.schemaString) - assert(standalone.getPartitionColumns.asScala == oss.partitionColumns) - assert(standalone.getConfiguration.asScala == oss.configuration) - compareOptions(standalone.getCreatedTime, oss.createdTime) - } - - def compareFormat( - standalone: io.delta.standalone.actions.Format, - oss: org.apache.spark.sql.delta.actions.Format): Unit = { - - assert(standalone.getProvider == oss.provider) - assert(standalone.getOptions.asScala == oss.options) - } - - def compareCommitInfo( - standalone: io.delta.standalone.actions.CommitInfo, - oss: org.apache.spark.sql.delta.actions.CommitInfo): Unit = { - - // Do not compare `version`s. Standalone will inject the commitVersion using - // DeltaHistoryManager. To get the OSS commitInfo, we are just reading using the store, so - // the version is not injected. - - assert(standalone.getTimestamp == oss.timestamp) - compareOptions(standalone.getUserId, oss.userId) - compareOptions(standalone.getUserName, oss.userName) - assert(standalone.getOperation == oss.operation) - compareNullableMaps(standalone.getOperationParameters, oss.operationParameters) - - assert(standalone.getJobInfo.isPresent == oss.job.isDefined) - if (standalone.getJobInfo.isPresent) { - compareJobInfo(standalone.getJobInfo.get, oss.job.get) - } - - assert(standalone.getNotebookInfo.isPresent == oss.notebook.isDefined) - if (standalone.getNotebookInfo.isPresent) { - assert(standalone.getNotebookInfo.get.getNotebookId == oss.notebook.get.notebookId) - } - - compareOptions(standalone.getClusterId, oss.clusterId) - compareOptions(standalone.getReadVersion, oss.readVersion) - compareOptions(standalone.getIsolationLevel, oss.isolationLevel) - compareOptions(standalone.getIsBlindAppend, oss.isBlindAppend) - assert(standalone.getOperationMetrics.isPresent == oss.operationMetrics.isDefined) - if (standalone.getOperationMetrics.isPresent) { - compareNullableMaps(standalone.getOperationMetrics.get(), oss.operationMetrics.get) - } - compareOptions(standalone.getUserMetadata, oss.userMetadata) - } - - def compareProtocol( - standalone: io.delta.standalone.actions.Protocol, - oss: org.apache.spark.sql.delta.actions.Protocol): Unit = { - assert(standalone.getMinReaderVersion == oss.minReaderVersion) - assert(standalone.getMinWriterVersion == oss.minWriterVersion) - } - - def compareAddFiles( - standaloneFiles: Seq[io.delta.standalone.actions.AddFile], - ossFiles: Seq[org.apache.spark.sql.delta.actions.AddFile]): Unit = { - val standaloneAddFilesMap = standaloneFiles.map { f => f.getPath -> f }.toMap - val ossAddFilesMap = ossFiles.map { f => f.path -> f }.toMap - - assert(standaloneAddFilesMap.size == ossAddFilesMap.size) - assert(standaloneAddFilesMap.keySet == ossAddFilesMap.keySet) - - standaloneAddFilesMap.keySet.foreach { path => - compareAddFile(standaloneAddFilesMap(path), ossAddFilesMap(path)) - } - } - - private def compareAddFile( - standalone: io.delta.standalone.actions.AddFile, - oss: org.apache.spark.sql.delta.actions.AddFile): Unit = { - assert(standalone.getPath == oss.path) - compareNullableMaps(standalone.getPartitionValues, oss.partitionValues) - assert(standalone.getSize == oss.size) - assert(standalone.getModificationTime == oss.modificationTime) - assert(standalone.isDataChange == oss.dataChange) - assert(standalone.getStats == oss.stats) - compareNullableMaps(standalone.getTags, oss.tags) - } - - def compareRemoveFiles( - standaloneFiles: Seq[io.delta.standalone.actions.RemoveFile], - ossFiles: Seq[org.apache.spark.sql.delta.actions.RemoveFile]): Unit = { - val standaloneAddFilesMap2 = standaloneFiles.map { f => f.getPath -> f }.toMap - val ossAddFilesMap2 = ossFiles.map { f => f.path -> f }.toMap - - assert(standaloneAddFilesMap2.size == ossAddFilesMap2.size) - assert(standaloneAddFilesMap2.keySet == ossAddFilesMap2.keySet) - - standaloneAddFilesMap2.keySet.foreach { path => - compareRemoveFile(standaloneAddFilesMap2(path), ossAddFilesMap2(path)) - } - } - - def compareRemoveFile( - standalone: io.delta.standalone.actions.RemoveFile, - oss: org.apache.spark.sql.delta.actions.RemoveFile): Unit = { - assert(standalone.getPath == oss.path) - compareOptions(standalone.getDeletionTimestamp, oss.deletionTimestamp) - assert(standalone.isDataChange == oss.dataChange) - assert(standalone.isExtendedFileMetadata == oss.extendedFileMetadata) - compareNullableMaps(standalone.getPartitionValues, oss.partitionValues) - assert(standalone.getSize.orElse(0L) == oss.size) - compareNullableMaps(standalone.getTags, oss.tags) - } - - def compareSetTransaction( - standalone: io.delta.standalone.actions.SetTransaction, - oss: org.apache.spark.sql.delta.actions.SetTransaction): Unit = { - assert(standalone.getAppId == oss.appId) - assert(standalone.getVersion == oss.version) - compareOptions(standalone.getLastUpdated, oss.lastUpdated) - } - - def compareJobInfo( - standalone: io.delta.standalone.actions.JobInfo, - oss: org.apache.spark.sql.delta.actions.JobInfo): Unit = { - assert(standalone.getJobId == oss.jobId) - assert(standalone.getJobName == oss.jobName) - assert(standalone.getRunId == oss.runId) - assert(standalone.getJobOwnerId == oss.jobOwnerId) - assert(standalone.getTriggerType == oss.triggerType) - } -} diff --git a/connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/util/OSSUtil.scala b/connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/util/OSSUtil.scala deleted file mode 100644 index 2f3fde29509..00000000000 --- a/connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/util/OSSUtil.scala +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import org.apache.spark.sql.SaveMode -import org.apache.spark.sql.catalyst.expressions.{AttributeReference, EqualTo, Literal} -import org.apache.spark.sql.delta.{DeltaLog, DeltaOperations} -import org.apache.spark.sql.delta.actions._ -import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType} - -class OSSUtil(now: Long) { - - val schema: StructType = StructType(Array( - StructField("col1_part", IntegerType, nullable = true), - StructField("col2_part", StringType, nullable = true), - StructField("foo", StringType, nullable = true) - )) - - private val partitionColumns = schema.fieldNames.filter(_.contains("part")).toSeq - - val op: DeltaOperations.Write = - DeltaOperations.Write(SaveMode.Append, Some(partitionColumns), Some("predicate_str")) - - val metadata: Metadata = Metadata( - id = "id", - name = "name", - description = "description", - format = Format(provider = "parquet", options = Map("format_key" -> "format_value")), - partitionColumns = partitionColumns, - schemaString = schema.json, - createdTime = Some(now) - ) - - val protocol12: Protocol = Protocol(1, 2) - - val protocol13: Protocol = Protocol(1, 3) - - val addFiles: Seq[AddFile] = (0 until 50).map { i => - AddFile( - path = i.toString, - partitionValues = partitionColumns.map { col => col -> i.toString }.toMap, - size = 100L, - modificationTime = now, - dataChange = true, - stats = null, - tags = Map("tag_key" -> "tag_val") - ) - } - - val removeFiles: Seq[RemoveFile] = - addFiles.map(_.removeWithTimestamp(now + 100, dataChange = true)) - - val setTransaction: SetTransaction = SetTransaction("appId", 123, Some(now + 200)) - - def getCommitInfoAt(log: DeltaLog, version: Long): CommitInfo = { - log.update() - - val firstChange = log.getChanges(version).next() - assert(firstChange._1 == version, s"getOssCommitInfoAt: expected first version to be $version" + - s"but got ${firstChange._1} instead.") - - val commitInfoOpt = firstChange._2.collectFirst { case c: CommitInfo => c } - assert(commitInfoOpt.isDefined, s"getOssCommitInfoAt: expected to find a CommitInfo action at" + - s"version $version, but none was found.") - - commitInfoOpt.get - } - - val col1PartitionFilter = - EqualTo(AttributeReference("col1_part", IntegerType, nullable = true)(), Literal(1)) - - val conflict = new ConflictVals() - - class ConflictVals { - val addA = AddFile("a", Map.empty, 1, 1, dataChange = true) - val addB = AddFile("b", Map.empty, 1, 1, dataChange = true) - - val removeA = RemoveFile("a", Some(4)) - val removeA_time5 = RemoveFile("a", Some(5)) - - val addA_partX1 = AddFile("a", Map("x" -> "1"), 1, 1, dataChange = true) - val addA_partX2 = AddFile("a", Map("x" -> "2"), 1, 1, dataChange = true) - val addB_partX1 = AddFile("b", Map("x" -> "1"), 1, 1, dataChange = true) - val addB_partX3 = AddFile("b", Map("x" -> "2"), 1, 1, dataChange = true) - val addC_partX4 = AddFile("c", Map("x" -> "4"), 1, 1, dataChange = true) - - val metadata_colX = Metadata(schemaString = new StructType().add("x", IntegerType).json) - - val metadata_partX = Metadata( - schemaString = new StructType().add("x", IntegerType).json, - partitionColumns = Seq("x") - ) - - val colXEq1Filter = EqualTo(AttributeReference("x", IntegerType, nullable = true)(), Literal(1)) - } -} diff --git a/connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/util/StandaloneUtil.scala b/connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/util/StandaloneUtil.scala deleted file mode 100644 index 2105fbacc27..00000000000 --- a/connectors/oss-compatibility-tests/src/test/scala/io/delta/standalone/internal/util/StandaloneUtil.scala +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import java.util.Collections - -import scala.collection.JavaConverters._ - -import io.delta.standalone.Operation -import io.delta.standalone.actions.{AddFile, Format, Metadata, Protocol, RemoveFile, SetTransaction} -import io.delta.standalone.expressions.{EqualTo, Literal} -import io.delta.standalone.types.{IntegerType, StringType, StructField, StructType} - -import io.delta.standalone.internal.OptimisticTransactionSuiteTestVals - -class StandaloneUtil(now: Long) { - - val engineInfo = "standaloneEngineInfo" - - val schema = new StructType(Array( - new StructField("col1_part", new IntegerType(), true), - new StructField("col2_part", new StringType(), true), - new StructField("foo", new StringType(), true) - )) - - val partitionColumns: Seq[String] = - schema.getFieldNames.filter(_.contains("part")).toSeq - - val op = new Operation(Operation.Name.MANUAL_UPDATE, Map[String, String]( - "mode" -> "\"Append\"", - "partitionBy" -> "\"[\\\"col1_part\\\",\\\"col2_part\\\"]\"", - "predicate" -> "\"predicate_str\"" - ).asJava) - - val metadata: Metadata = Metadata.builder() - .id("id") - .name("name") - .description("description") - .format(new Format("parquet", Collections.singletonMap("format_key", "format_value"))) - .partitionColumns(partitionColumns.asJava) - .schema(schema) - .createdTime(now) - .build() - - val protocol12: Protocol = new Protocol(1, 2) - - val addFiles: Seq[AddFile] = (0 until 50).map { i => - new AddFile( - i.toString, // path - partitionColumns.map { col => col -> i.toString }.toMap.asJava, // partition values - 100L, // size - now, // modification time - true, // data change - null, // stats - Map("tag_key" -> "tag_val").asJava // tags - ) - } - - val removeFiles: Seq[RemoveFile] = addFiles.map(_.remove(now + 100, true)) - - val setTransaction: SetTransaction = - new SetTransaction("appId", 123, java.util.Optional.of(now + 200)) - - val col1PartitionFilter = new EqualTo(schema.column("col1_part"), Literal.of(1)) - - val conflict = new ConflictVals() - - class ConflictVals extends OptimisticTransactionSuiteTestVals -} diff --git a/connectors/powerbi/.gitignore b/connectors/powerbi/.gitignore deleted file mode 100644 index 5a482b15055..00000000000 --- a/connectors/powerbi/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -**/.pbi/localSettings.json -**/.pbi/cache.abf \ No newline at end of file diff --git a/connectors/powerbi/CustomConnector/DeltaLake.mez b/connectors/powerbi/CustomConnector/DeltaLake.mez deleted file mode 100644 index 49758475aec47b8cdfac387669162af80a1e7833..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29785 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 F{vW~1qSgQa diff --git a/connectors/powerbi/CustomConnector/DeltaLake.sln b/connectors/powerbi/CustomConnector/DeltaLake.sln deleted file mode 100644 index 6ffd50d9e07..00000000000 --- a/connectors/powerbi/CustomConnector/DeltaLake.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.31515.178 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{4DF76451-A46A-4C0B-BE03-459FAAFA07E6}") = "DeltaLake", "DeltaLake\DeltaLake.mproj", "{61042F49-C6D8-48DA-89A0-A75B6724944C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x86 = Debug|x86 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {61042F49-C6D8-48DA-89A0-A75B6724944C}.Debug|x86.ActiveCfg = Debug|x86 - {61042F49-C6D8-48DA-89A0-A75B6724944C}.Debug|x86.Build.0 = Debug|x86 - {61042F49-C6D8-48DA-89A0-A75B6724944C}.Release|x86.ActiveCfg = Release|x86 - {61042F49-C6D8-48DA-89A0-A75B6724944C}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {9A0B3843-40FE-4FEB-B3B6-CF7C7AB26435} - EndGlobalSection -EndGlobal diff --git a/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake.mproj b/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake.mproj deleted file mode 100644 index cda932237aa..00000000000 --- a/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake.mproj +++ /dev/null @@ -1,118 +0,0 @@ - - - Debug - 2.0 - - - Exe - MyRootNamespace - MyAssemblyName - False - False - False - False - False - False - False - False - False - False - 1000 - Yes - DeltaLake - - - false - - bin\Debug\ - - - false - bin\Release\ - - - - - - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake.pq b/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake.pq deleted file mode 100644 index 3ed7c0aec89..00000000000 --- a/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake.pq +++ /dev/null @@ -1,705 +0,0 @@ -section DeltaLake; - -[DataSource.Kind="DeltaLake", Publish="DeltaLake.Publish"] -shared DeltaLake.Contents = Value.ReplaceType(DeltaLakeImpl, DeltaLakeType); - -shared DeltaLakeType = type function ( - Url as (Uri.Type meta [ - DataSource.Path = true, - Documentation.FieldCaption = "Url", - Documentation.FieldDescription = "The fully qualified HTTP storage path.", - Documentation.SampleValues = {"https://accountname.blob.core.windows.net/public"} - ] as any) , - optional options as (type nullable [ - optional Version = (type nullable number meta [ - DataSource.Path = false, - Documentation.FieldCaption = "Version", - Documentation.FieldDescription = "A numeric value that defines historic specific version of the Delta Lake table you want to read. This is similar to specifying VERSION AS OF when querying the Delta Lake table via SQL. Default is the most recent/current version.", - Documentation.SampleValues = {123} - ]), - optional UseFileBuffer = (type nullable logical meta [ - DataSource.Path = false, - Documentation.FieldCaption = "Use File Buffer", - Documentation.FieldDescription = "Not all data sources support the more performant streaming of binary files and you may receive an error message like ""Parquet.Document cannot be used with streamed binary values."" To mitigate this issue, you can set this option to ""True""", - Documentation.AllowedValues = { - true meta [ - DataSource.Path = false, - Documentation.Name = "True", - Documentation.Caption = "True" - ], - false meta [ - DataSource.Path = false, - Documentation.Name = "False", - Documentation.Caption = "False" - ] - } - ]) - ] meta [ - DataSource.Path = false, - Documentation.FieldCaption = "Advanced Options" - ]) - ) - as table meta [ - Documentation.Name = "Delta Lake", - Documentation.LongDescription = "Delta Lake Connector" - ]; - - -////////////////////////////////////// -///////// Trigger NAV Table ////////// -////////////////////////////////////// - -DeltaLakeImpl = (Url as text, optional options as record) as table => - let - Folder = Url, - Version = Record.FieldOrDefault(options, "Version", null), - UseFileBuffer = if Record.Field(options, "UseFileBuffer") is null then false else Record.Field(options, "UseFileBuffer"), - Table = DeltaLakeNavTable(Folder, Version, UseFileBuffer) - in - Table; - -////////////////////////////////////// -/////// Get Content from Blob //////// -////////////////////////////////////// - -DeltaLakeContentBlob = (Folder as text) as table => - let - container = Text.BeforeDelimiter(Folder, "/", 3), - prefix = Text.AfterDelimiter(Folder, "/", 3), - url = container & "?restype=container&comp=list&prefix=" & prefix, - headers = if Extension.CurrentCredential()[AuthenticationKind] = "Implicit" then [] else [Headers=SignRequest(url,prefix)], - response = - let - waitForResult = Value.WaitFor( - (iteration) => - let - result = Web.Contents(url,headers), - buffered = Binary.Buffer(result), - status = Value.Metadata(result)[Response.Status], - actualResult = if buffered <> null and status = 200 then buffered else null - in - actualResult, - (iteration) => #duration(0, 0, 0, 0), - 5) - in - waitForResult, - Source = Xml.Tables(response), - //Source = Xml.Tables(Web.Contents(url,headers)), - Blobs = Source{0}[Blobs], - Blob = Blobs{0}[Blob], - AddurlContent = Table.AddColumn(Blob, "urlContent", each container & "/" & [Name]), - AddContent = Table.AddColumn(AddurlContent, "Content", each Web.Contents([urlContent],[Headers=SignRequest([urlContent])])), - AddDeltaTable = Table.AddColumn(AddContent, "DeltaTable", each Text.BeforeDelimiter([Name], ".delta", {0, RelativePosition.FromEnd}), type text), - AddDeltaTableDatabase = Table.AddColumn(AddDeltaTable, "DeltaTableDatabase", each Text.BetweenDelimiters([DeltaTable], "/", "/", {0, RelativePosition.FromEnd}, {0, RelativePosition.FromEnd})), - AddDeltaTableFolder = Table.AddColumn(AddDeltaTableDatabase, "DeltaTableFolder", each Text.BeforeDelimiter([DeltaTable], "/", {1, RelativePosition.FromEnd}), type text), - AddDeltaTableFolderDepth = Table.AddColumn(AddDeltaTableFolder, "DeltaTableFolderDepth", each List.Count(List.Select(Text.Split([DeltaTableFolder], "/"), each _ <> "" ) )), - AddDeltaTableFolderList = Table.AddColumn(AddDeltaTableFolderDepth, "DeltaTableFolderList", each List.Select(Text.Split([DeltaTableFolder], "/"), each _ <> "" )), - AddDeltaTablePath = Table.AddColumn(AddDeltaTableFolderList, "DeltaTablePath", each Text.BeforeDelimiter([DeltaTable], "/", {0, RelativePosition.FromEnd})), - AddDeltaTableReplaceValue = Table.ReplaceValue(AddDeltaTablePath,"/",".",Replacer.ReplaceText,{"DeltaTable"}), - AddFolderPath = Table.AddColumn(AddDeltaTableReplaceValue, "Folder Path", each Replacer.ReplaceText(container & "/" & [Name],"/" & [Name],"")), - AddFolderPathEnd = Table.AddColumn(AddFolderPath, "Folder Path End", each Text.AfterDelimiter([Name], "/", {0, RelativePosition.FromEnd}), type text), - AddExtension = Table.AddColumn(AddFolderPathEnd, "Extension", each if Text.Contains([Folder Path End],".") then "." & Text.AfterDelimiter([Folder Path End], ".", {0, RelativePosition.FromEnd}) else "", type text) - in - AddExtension; - -////////////////////////////////////// -///// Get Content from ADLSGen2 ////// -////////////////////////////////////// - -DeltaLakeContentADLSGen2 = (Folder as text) as table => - let - filesystem = Text.BeforeDelimiter(Folder, "/", 3), - directoryCheck = Text.AfterDelimiter(Folder, "/", 3), - directory = if directoryCheck = "" then "" else Text.AfterDelimiter(Folder, "/", {0, RelativePosition.FromEnd}), - url = filesystem & "?recursive=true&resource=filesystem&directory=" & directory, - headers = if Extension.CurrentCredential()[AuthenticationKind] = "Implicit" then [] else [Headers=SignRequest(url,directory)], - response = - let - waitForResult = Value.WaitFor( - (iteration) => - let - result = Web.Contents(url,headers), - buffered = Binary.Buffer(result), - status = Value.Metadata(result)[Response.Status], - actualResult = if buffered <> null and status = 200 then buffered else null - in - actualResult, - (iteration) => #duration(0, 0, 0, 0), - 5) - in - waitForResult, - Source = Json.Document(response), - //Source = Json.Document(Web.Contents(url,headers)), - ConvertedToTable = Table.FromRecords({Source}), - ExpandedPaths = Table.ExpandListColumn(ConvertedToTable, "paths"), - ExpandedPathsColumns = Table.ExpandRecordColumn(ExpandedPaths, "paths", {"contentLength", "etag", "group", "isDirectory", "lastModified", "name", "owner", "permissions"}, {"contentLength", "etag", "group", "isDirectory", "lastModified", "name", "owner", "permissions"}), - ChangedType = Table.TransformColumnTypes(ExpandedPathsColumns,{{"contentLength", Int64.Type}, {"etag", type text}, {"group", type text}, {"isDirectory", type logical}, {"lastModified", type datetime}, {"name", type text}, {"owner", type text}, {"permissions", type text}}), - Rename = Table.RenameColumns(ChangedType,{"name","Name"}), - AddurlContent = Table.AddColumn(Rename, "urlContent", each filesystem & "/" & [Name]), - AddContent = Table.AddColumn(AddurlContent, "Content", each Web.Contents([urlContent],[Headers=SignRequest([urlContent])])), - AddDeltaTable = Table.AddColumn(AddContent, "DeltaTable", each Text.BeforeDelimiter([Name], ".delta/", {0, RelativePosition.FromEnd}), type text), - AddDeltaTableDatabase = Table.AddColumn(AddDeltaTable, "DeltaTableDatabase", each Text.BetweenDelimiters([DeltaTable], "/", "/", {0, RelativePosition.FromEnd}, {0, RelativePosition.FromEnd})), - AddDeltaTableFolder = Table.AddColumn(AddDeltaTableDatabase, "DeltaTableFolder", each Text.BeforeDelimiter([DeltaTable], "/", {1, RelativePosition.FromEnd}), type text), - AddDeltaTableFolderDepth = Table.AddColumn(AddDeltaTableFolder, "DeltaTableFolderDepth", each List.Count(List.Select(Text.Split([DeltaTableFolder], "/"), each _ <> "" ) )), - AddDeltaTableFolderList = Table.AddColumn(AddDeltaTableFolderDepth, "DeltaTableFolderList", each List.Select(Text.Split([DeltaTableFolder], "/"), each _ <> "" )), - AddDeltaTablePath = Table.AddColumn(AddDeltaTableFolderList, "DeltaTablePath", each Text.BeforeDelimiter([DeltaTable], "/", {0, RelativePosition.FromEnd})), - AddDeltaTableReplaceValue = Table.ReplaceValue(AddDeltaTablePath,"/",".",Replacer.ReplaceText,{"DeltaTable"}), - AddFolderPath = Table.AddColumn(AddDeltaTableReplaceValue, "Folder Path", each Replacer.ReplaceText(Folder & "/" & [Name],"/" & [Name],"")), - AddFolderPathEnd = Table.AddColumn(AddFolderPath, "Folder Path End", each Text.AfterDelimiter([Name], "/", {0, RelativePosition.FromEnd}), type text), - AddExtension = Table.AddColumn(AddFolderPathEnd, "Extension", each if Text.Contains([Folder Path End],".") then "." & Text.AfterDelimiter([Folder Path End], ".", {0, RelativePosition.FromEnd}) else "", type text) - in - AddExtension; - -/////////////////////////////// -/////////// SIGN-IN ////////// -/////////////////////////////// - -SignRequest = (url, optional filter as text) => - let - parts = Uri.Parts(url), - account = Text.Split(parts[Host], "."){0}, - resource = "/" & account & Text.Split(parts[Path], "?"){0}, - date = DateTimeZone.ToText(DateTimeZone.UtcNow(), "r"), - stringToSign = - //ADLS List Files - if Text.Contains(url,"?recursive=true&resource=filesystem") then "GET#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)x-ms-date:" & date & "#(lf)x-ms-version:2018-11-09#(lf)" & resource & "#(lf)recursive:true#(lf)resource:filesystem#(lf)directory:" & filter - //Blob List Files - else if Text.Contains(url,"?restype=container&comp=list") then "GET#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)x-ms-date:" & date & "#(lf)x-ms-version:2018-11-09#(lf)" & resource & "#(lf)comp:list#(lf)prefix:" & filter & "#(lf)restype:container" - //Get ADLS/Blob Files - else "GET#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)#(lf)x-ms-date:" & date & "#(lf)x-ms-version:2018-11-09#(lf)" & resource, - payload = Text.ToBinary(stringToSign, TextEncoding.Utf8), - password = Extension.CurrentCredential()[Password]?, - key = if password = null then "" else password, - secret = try Binary.FromText(key, BinaryEncoding.Base64) otherwise #binary({0}), - signature = Binary.ToText(Crypto.CreateHmac(CryptoAlgorithm.SHA256, secret, payload), BinaryEncoding.Base64) - in - if Extension.CurrentCredential()[AuthenticationKind] = "Implicit" then [] - else - [ - Authorization = "SharedKey " & account & ":" & signature, - Accept = "*/*", - #"x-ms-version" = "2018-11-09", - #"x-ms-date" = date - ]; - - -/////////////////////// -///// NAV Table /////// -/////////////////////// - -DeltaLakeNavTable = (Folder as text, optional Version as nullable number, optional UseFileBuffer as nullable logical) as table => - let - Parts = Uri.Parts(Folder), - Content = - if Text.Contains(Parts[Host], "dfs") then DeltaLakeContentADLSGen2(Folder) - else if Text.Contains(Parts[Host], "blob") then DeltaLakeContentBlob(Folder) - else - let - Output = error Error.Record("Error", "Path or system not supported", "Error") - in - Output, - Distinct = Table.Distinct(Content,{"DeltaTable","Folder Path"}), - DistinctFiltered = Table.SelectRows(Distinct, each [DeltaTable] <> null and [DeltaTable] <> ""), - NameKeyColumn = Table.DuplicateColumn(DistinctFiltered,"DeltaTable","NameKey", type text), - VersionColumn = Table.AddColumn(NameKeyColumn,"Version", each Version), - UseFileBufferColumn = Table.AddColumn(VersionColumn,"UseFileBuffer", each UseFileBuffer), - ItemKindColumn = Table.AddColumn(UseFileBufferColumn,"ItemKind", each "Table"), - ItemNameColumn = Table.AddColumn(ItemKindColumn,"ItemName", each "Table"), - IsLeafColumn = Table.AddColumn(ItemNameColumn,"IsLeaf", each true), - source = IsLeafColumn, - NavViewTables = Table.NavigationTableView(() => source, {"Folder Path","NameKey","Version","UseFileBuffer"}, fn_ReadDeltaTable, [ - Name = each Text.AfterDelimiter([DeltaTable], ".", {0, RelativePosition.FromEnd}), //[DeltaTable], - ItemKind = each [ItemKind], - ItemName = each [ItemName], - IsLeaf = each [IsLeaf], - DeltaTablePathNav = each [DeltaTablePath] - ]), - - NavDistinctDatabase = Table.Distinct(source,"DeltaTablePath"), - NavDatabases = #table( - {"Name","Key","Data","ItemKind", "ItemName", "IsLeaf"}, - Table.TransformRows(NavDistinctDatabase, each - {[DeltaTablePath], [Name], - Table.SelectRows(NavViewTables, - (InnerRow) => //Nested iteration introduced with Table.SelectRows function - _[DeltaTablePath] = InnerRow[DeltaTablePathNav] - ) - , "Database", "Database", false} - )), - NavTableDatabases = Table.ToNavigationTable(NavDatabases, {"Key"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf") - -// -// NavFolders = #table( -// {"Name","Key","Data","ItemKind", "ItemName", "IsLeaf"}, -// List.Transform(source[DeltaTableFolderList], each -// {_, [Name], _, "Database", "Database", false} -// )), -// NavTableFolder = Table.ToNavigationTable(NavFolders, {"Key"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf") - - in - NavTableDatabases; - - - - -///////////////////////////////// -///// Read Delta Function /////// -///////////////////////////////// - -fn_ReadDeltaTable = (Folder as text, DeltaTable as text, optional Version as nullable number, optional UseFileBuffer as logical, optional DeltaTableOptions as record) as table => - - let - DeltaTableVersion = Version, //= if DeltaTableOptions = null then null else Record.FieldOrDefault(DeltaTableOptions, "Version", null), - PartitionFilterFunction = if DeltaTableOptions = null then (x) => true else if Record.FieldOrDefault(DeltaTableOptions, "PartitionFilterFunction", null) = null then (x) => true else Record.Field(DeltaTableOptions, "PartitionFilterFunction"), - UseFileBuffer = UseFileBuffer, // if DeltaTableOptions = null then false else if Record.FieldOrDefault(DeltaTableOptions, "UseFileBuffer", null) = null then false else Record.Field(DeltaTableOptions, "UseFileBuffer"), - IterateFolderContent = if DeltaTableOptions = null then false else if Record.FieldOrDefault(DeltaTableOptions, "IterateFolderContent", null) = null then false else Record.Field(DeltaTableOptions, "IterateFolderContent"), - TimeZoneOffset = if DeltaTableOptions = null then null else Record.FieldOrDefault(DeltaTableOptions, "TimeZoneOffset", null), - TimeZoneOffsetDuration = Duration.FromText(Text.TrimStart(TimeZoneOffset, "+")), - - DeltaTableFolderContent = - let - Parts = Uri.Parts(Folder), - Content = - if Text.Contains(Parts[Host], "dfs") then DeltaLakeContentADLSGen2(Folder) - else if Text.Contains(Parts[Host], "blob") then DeltaLakeContentBlob(Folder) - else - let - Output = error Error.Record("Error", "Path or system not supported", "Error") - in - Output, - ContentFiltered = Table.SelectRows(Content, each ([DeltaTable] = DeltaTable)) - in - ContentFiltered, - - Delimiter = if Text.Contains(DeltaTableFolderContent{0}[Folder Path], "//") then "/" else "\", - - DeltaTableFolderContent_wFullPath = - let - - Source = DeltaTableFolderContent, - - fn_ReadContentRecursive = (tbl as table) as table => - let - subFolders = Table.SelectRows(tbl, each Value.Is(_[Content], type table)), - binaries = Table.SelectRows(tbl, each Value.Is(_[Content], type binary)), - combinedContent = if Table.RowCount(subFolders) > 0 then Table.Combine({binaries, @fn_ReadContentRecursive(Table.Combine(subFolders[Content]))}) else binaries - in - combinedContent, - - Content = if IterateFolderContent then fn_ReadContentRecursive(Source) else Source, - - #"Added Full_Path" = Table.AddColumn(Content, "Full_Path", each Text.Replace([Folder Path] & [Name], "=", "%3D"), Text.Type), - #"Added File_Name" = Table.AddColumn(#"Added Full_Path", "File_Name", each if Text.Length([Extension]) > 0 then List.Last(Text.Split([Full_Path], Delimiter)) else null, type text), - Buffered = Table.Buffer(#"Added File_Name") - in - Buffered, - - PQ_DataTypes = - let - Source = [ - Any.Type = Any.Type, - None.Type = None.Type, - Day.Type = Day.Type, - Duration.Type = Duration.Type, - Record.Type = Record.Type, - Precision.Type = Precision.Type, - Number.Type = Number.Type, - Binary.Type = Binary.Type, - Byte.Type = Byte.Type, - Character.Type = Character.Type, - Text.Type = Text.Type, - Function.Type = Function.Type, - Null.Type = Null.Type, - List.Type = List.Type, - Type.Type = Type.Type, - Logical.Type = Logical.Type, - Int8.Type = Int8.Type, - Int16.Type = Int16.Type, - Int32.Type = Int32.Type, - Int64.Type = Int64.Type, - Single.Type = Single.Type, - Double.Type = Double.Type, - Decimal.Type = Decimal.Type, - Currency.Type = Currency.Type, - Percentage.Type = Percentage.Type, - Guid.Type = Guid.Type, - Date.Type = Date.Type, - DateTime.Type = DateTime.Type, - DateTimeZone.Type = DateTimeZone.Type, - Time.Type = Time.Type, - Table.Type = Table.Type - ] - in - Source, - - #"TableSchema" = - let - ExpressionText = "type table [" & Text.Combine(metadata_columns[TableDataType], ", ") & "]", - BufferedExpression = List.Buffer({ExpressionText}){0}, - TableSchema = Expression.Evaluate(BufferedExpression, PQ_DataTypes) - in - TableSchema, - - #"_delta_log Folder" = - let - Source = DeltaTableFolderContent_wFullPath, - #"Filtered Rows" = Table.SelectRows(Source, each Text.Contains([Full_Path], Delimiter & "_delta_log" & Delimiter)), - #"Added Version" = Table.AddColumn(#"Filtered Rows", "Version", each try Int64.From(Text.BeforeDelimiter([File_Name], ".")) otherwise -1, Int64.Type), - #"Filtered RequestedVersion" = if DeltaTableVersion = null then #"Added Version" else Table.SelectRows(#"Added Version", each [Version] <= DeltaTableVersion), - BufferedTable = Table.Buffer(#"Filtered RequestedVersion"), - BufferedContent = Table.TransformColumns(BufferedTable,{{"Content", Binary.Buffer}}) - in - BufferedContent, - - #"DeltaTablePath" = - let - DeltaTablePath = Text.Combine(List.RemoveLastN(Text.Split(#"_delta_log Folder"{0}[Full_Path], Delimiter), 2), Delimiter) & Delimiter - in - DeltaTablePath, - - #"_last_checkpoint" = - let - #"_delta_log" = #"_delta_log Folder", - #"Filtered Rows" = Table.SelectRows(_delta_log, each Text.EndsWith([Name], "_last_checkpoint")), - #"Added Custom" = Table.AddColumn(#"Filtered Rows", "JsonContent", each Json.Document([Content])), - JsonContent = #"Added Custom"{0}[JsonContent], - CheckEmpty = if Table.RowCount(#"Filtered Rows") = 0 then [Size=-1, version=-1] else JsonContent, - LatestCheckPointWithParts = if Record.HasFields(CheckEmpty, "parts") then CheckEmpty else Record.AddField(CheckEmpty, "parts", 1), - - #"Filtered Rows Version" = Table.SelectRows(#"_delta_log", each Text.EndsWith([Name], ".checkpoint.parquet")), - MaxVersion = try Table.Group(#"Filtered Rows Version", {}, {{"MaxVersion", each List.Max([Version]), type number}}){0}[MaxVersion] otherwise -1, - #"Filtered Rows MaxVersion" = Table.SelectRows(#"Filtered Rows Version", each [Version] = MaxVersion), - CheckpointFromVersion = [version=try MaxVersion otherwise -1, size=-1, parts = Table.RowCount(#"Filtered Rows MaxVersion")], - - LastCheckpoint = Table.Buffer(Table.FromRecords({if DeltaTableVersion = null then LatestCheckPointWithParts else CheckpointFromVersion})){0} - in - LastCheckpoint, - - #"Checkpoint Files" = - let - LastCheckpointFile = {1..Record.Field(_last_checkpoint, "parts")}, - #"Converted to Table" = Table.FromList(LastCheckpointFile, Splitter.SplitByNothing(), {"part"}, null, ExtraValues.Error), - #"Add Version" = Table.AddColumn(#"Converted to Table", "version", each Record.Field(_last_checkpoint, "version")), - #"Add SingleFile" = Table.AddColumn(#"Add Version", "file_name", each Text.PadStart(Text.From([version]), 20, "0") & ".checkpoint.parquet", Text.Type), - #"Add MultipleFiles" = Table.AddColumn(#"Add Version", "file_name", each Text.PadStart(Text.From([version]), 20, "0") & ".checkpoint." & Text.PadStart(Text.From([part]), 10, "0") & "." & Text.PadStart(Text.From(Record.Field(_last_checkpoint, "parts")), 10, "0") & ".parquet", Text.Type), - AllFiles = Table.SelectColumns(if Record.Field(_last_checkpoint, "parts") = 1 then #"Add SingleFile" else #"Add MultipleFiles", "file_name"), - AllFiles_BufferedList = List.Buffer(Table.ToList(AllFiles)), - Content = Table.SelectRows(#"_delta_log Folder", each List.Count(List.Select(AllFiles_BufferedList, (inner) => Text.EndsWith([Name], inner))) > 0) - in - Content, - - #"Logs Checkpoint" = - let - Source = #"Checkpoint Files", - #"Parsed Logs" = Table.AddColumn(Source, "Custom", each Parquet.Document([Content])), - #"Expanded Logs" = Table.ExpandTableColumn(#"Parsed Logs", "Custom", {"add", "remove", "metaData", "commitInfo", "protocol"}, {"add", "remove", "metaData", "commitInfo", "protocol"}), - #"Removed Other Columns" = Table.SelectColumns(#"Expanded Logs",{"Version", "add", "remove", "metaData", "commitInfo", "protocol"}) - in - #"Removed Other Columns", - - #"Latest Log Files" = - let - Source = #"_delta_log Folder", - #"Filtered Rows" = Table.SelectRows(Source, each ([Extension] = ".json")), - #"Filtered Rows1" = Table.SelectRows(#"Filtered Rows", each [Version] > Record.Field(_last_checkpoint, "version")) - in - #"Filtered Rows1", - - #"Logs JSON" = - let - Source = #"Latest Log Files", - #"Added Custom" = Table.AddColumn(Source, "JsonContent", each Lines.FromBinary([Content])), - #"Expanded JsonContent" = Table.ExpandListColumn(#"Added Custom", "JsonContent"), - #"Parsed Logs" = Table.TransformColumns(#"Expanded JsonContent",{{"JsonContent", Json.Document}}), - #"Expanded Logs" = Table.ExpandRecordColumn(#"Parsed Logs", "JsonContent", {"add", "remove", "metaData", "commitInfo", "protocol"}), - #"Removed Other Columns" = Table.SelectColumns(#"Expanded Logs",{"Version", "add", "remove", "metaData", "commitInfo", "protocol"}) - in - #"Removed Other Columns", - - #"Logs ALL" = - let - Source = Table.Combine({#"Logs Checkpoint", #"Logs JSON"}), - #"Added timestamp" = Table.AddColumn(Source, "log_timestamp", each if [add] <> null then Record.Field([add], "modificationTime") else - if [remove] <> null then Record.Field([remove], "deletionTimestamp") else - if [commitInfo] <> null then Record.Field([commitInfo], "timestamp") else - if [metaData] <> null then Record.Field([metaData], "createdTime") else null, Int64.Type), - #"Added datetime" = Table.AddColumn(#"Added timestamp", "log_datetime", each try #datetime(1970,1,1,0,0,0)+#duration(0,0,0,[log_timestamp]/1000) otherwise null, DateTime.Type) - in - #"Added datetime", - - #"metadata_columns" = - let - Source = #"Logs ALL", - #"Filtered Rows1" = Table.SelectRows(Source, each ([metaData] <> null)), - MaxVersion = Table.Group(#"Filtered Rows1", {}, {{"MaxVersion", each List.Max([Version]), type number}}){0}[MaxVersion], - #"Filtered Rows2" = Table.SelectRows(#"Filtered Rows1", each [Version] = MaxVersion), - #"Kept First Rows" = Table.FirstN(#"Filtered Rows2",1), - #"Removed Other Columns" = Table.SelectColumns(#"Kept First Rows",{"metaData"}), - #"Expanded metaData" = Table.ExpandRecordColumn(#"Removed Other Columns", "metaData", {"schemaString", "partitionColumns"}, {"schemaString", "partitionColumns"}), - #"Filtered Rows" = Table.SelectRows(#"Expanded metaData", each ([schemaString] <> null)), - JSON = Table.TransformColumns(#"Filtered Rows",{{"schemaString", Json.Document}}), - #"Expanded schemaString" = Table.ExpandRecordColumn(JSON, "schemaString", {"fields"}, {"fields"}), - #"Expanded fieldList" = Table.ExpandListColumn(#"Expanded schemaString", "fields"), - #"Expanded fields" = Table.ExpandRecordColumn(#"Expanded fieldList", "fields", {"name", "type", "nullable", "metadata"}, {"name", "type", "nullable", "metadata"}), - #"Added isPartitionedBy" = Table.Buffer(Table.AddColumn(#"Expanded fields", "isPartitionedBy", each List.Contains([partitionColumns], [name]), Logical.Type)), - #"Added PBI_DataType" = Table.AddColumn(#"Added isPartitionedBy", "PBI_DataType", - each if [type] = "string" then [PBI_DataType=Text.Type, PBI_Text="Text.Type", PBI_Transformation=Text.From] - else if [type] = "long" then [PBI_DataType=Int64.Type, PBI_Text="Int64.Type", PBI_Transformation=Int64.From] - else if [type] = "integer" then [PBI_DataType=Int32.Type, PBI_Text="Int32.Type", PBI_Transformation=Int32.From] - else if [type] = "short" then [PBI_DataType=Int16.Type, PBI_Text="Int16.Type", PBI_Transformation=Int16.From] - else if [type] = "byte" then [PBI_DataType=Int8.Type, PBI_Text="Int8.Type", PBI_Transformation=Int8.From] - else if [type] = "float" then [PBI_DataType=Single.Type, PBI_Text="Single.Type", PBI_Transformation=Single.From] - else if [type] = "double" then [PBI_DataType=Double.Type, PBI_Text="Double.Type", PBI_Transformation=Double.From] - else if [type] = "string" then [PBI_DataType=Text.Type, PBI_Text="Text.Type", PBI_Transformation=Text.From] - else if [type] = "date" then [PBI_DataType=Date.Type, PBI_Text="Date.Type", PBI_Transformation=Date.From] - else if [type] = "timestamp" and TimeZoneOffset = null then [PBI_DataType=DateTime.Type, PBI_Text="DateTime.Type", PBI_Transformation=DateTime.From] - else if [type] = "timestamp" and TimeZoneOffset <> null then [PBI_DataType=DateTimeZone.Type, PBI_Text="DateTimeZone.Type", PBI_Transformation=(x) as nullable datetimezone => DateTime.AddZone(x + TimeZoneOffsetDuration, Duration.Hours(TimeZoneOffsetDuration), Duration.Minutes(TimeZoneOffsetDuration))] - else if [type] = "boolean" then [PBI_DataType=Logical.Type, PBI_Text="Logical.Type", PBI_Transformation=Logical.From] - else if [type] = "binary" then [PBI_DataType=Binary.Type, PBI_Text="Binary.Type", PBI_Transformation=Binary.From] - else if [type] = "null" then [PBI_DataType=Any.Type, PBI_Text="Any.Type", PBI_Transformation=(x) as any => x] - else if Text.StartsWith([type], "decimal") then [PBI_DataType=Number.Type, PBI_Text="Number.Type", PBI_Transformation=Number.From] - else [PBI_DataType=Any.Type, PBI_Text="Any.Type", PBI_Transformation=(x) as any => x]), - #"Expanded PBI_DataType" = Table.ExpandRecordColumn(#"Added PBI_DataType", "PBI_DataType", {"PBI_DataType", "PBI_Text", "PBI_Transformation"}, {"PBI_DataType", "PBI_Text", "PBI_Transformation"}), - #"Added ChangeDataType" = Table.AddColumn(#"Expanded PBI_DataType", "ChangeDataType", each {[name], [PBI_DataType]}, type list), - #"Added TableDataType" = Table.AddColumn(#"Added ChangeDataType", "TableDataType", each "#""" & [name] & """=" & (if [nullable] then "nullable " else "") & Text.From([PBI_Text]), type text), - #"Added ColumnTransformation" = Table.AddColumn(#"Added TableDataType", "ColumnTransformation", each {[name], [PBI_Transformation]}, type list), - #"Buffered Fields" = Table.Buffer(#"Added ColumnTransformation") - in - #"Buffered Fields", - - #"Data" = - let - Source = #"Logs ALL", - #"Added Counter" = Table.AddColumn(Source, "Counter", each if [remove] <> null then -1 else if [add] <> null then 1 else null, Int8.Type), - #"Added file_name" = Table.AddColumn(#"Added Counter", "file_name", each if [add] <> null then Record.Field([add], "path") else if [remove] <> null then Record.Field([remove], "path") else null, Text.Type), - #"Filtered Rows" = Table.SelectRows(#"Added file_name", each ([file_name] <> null)), - #"Added partitionValuesTable" = Table.AddColumn(#"Filtered Rows", "partitionValuesTable", each if [add] <> null then if Value.Is(Record.Field([add], "partitionValues"), Record.Type) then Record.ToTable(Record.Field([add], "partitionValues")) else Table.RenameColumns(Record.Field([add], "partitionValues"), {"Key", "Name"}) else null, type nullable table), - #"Added partitionValuesJSON" = Table.AddColumn(#"Added partitionValuesTable", "partitionValuesJSON", each Text.FromBinary(Json.FromValue([partitionValuesTable]))), - #"Grouped Rows1" = Table.Group(#"Added partitionValuesJSON", {"file_name"}, {{"partitionValuesJSON", each List.Max([partitionValuesJSON]), type nullable text}, {"isRelevant", each List.Sum([Counter]), type nullable text}}), - #"Relevant Files" = Table.SelectRows(#"Grouped Rows1", each ([isRelevant] > 0)), - #"Added partitionValuesTable2" = Table.AddColumn(#"Relevant Files", "partitionValuesTable", each try Table.FromRecords(Json.Document([partitionValuesJSON])) otherwise null), - #"Added partitionValuesRecord" = Table.AddColumn(#"Added partitionValuesTable2", "partitionValuesRecord", each Record.TransformFields(Record.FromTable([partitionValuesTable]), Table.SelectRows(#"metadata_columns", each [isPartitionedBy] = true)[ColumnTransformation]), Expression.Evaluate("type [" & Text.Combine(Table.SelectRows(#"metadata_columns", each [isPartitionedBy] = true)[TableDataType], ", ") & "]", PQ_DataTypes)), - #"Filtered Rows1" = Table.SelectRows(#"Added partitionValuesRecord", each PartitionFilterFunction([partitionValuesRecord])), - #"Expanded partitionValuesRecord" = Table.ExpandRecordColumn(#"Filtered Rows1", "partitionValuesRecord", Table.SelectRows(#"metadata_columns", each [isPartitionedBy] = true)[name]), - #"Added Full_Path" = Table.AddColumn(#"Expanded partitionValuesRecord", "Full_Path", each Text.Replace(DeltaTablePath & Text.Replace([file_name], "=", "%3D"), "/", Delimiter), Text.Type), - #"Removed Columns3" = Table.RemoveColumns(#"Added Full_Path",{"file_name", "partitionValuesJSON", "isRelevant", "partitionValuesTable"}), - #"Buffered RelevantFiles" = Table.Buffer(#"Removed Columns3"), - #"Merged Queries" = Table.NestedJoin(#"Buffered RelevantFiles", {"Full_Path"}, DeltaTableFolderContent_wFullPath, {"Full_Path"}, "DeltaTable Folder", JoinKind.Inner), - #"Removed Columns" = Table.RemoveColumns(#"Merged Queries",{"Full_Path"}), - #"Expanded DeltaTable Folder" = Table.ExpandTableColumn(#"Removed Columns", "DeltaTable Folder", {"Content"}, {"Content"}), - BufferFile = if UseFileBuffer then Table.TransformColumns(#"Expanded DeltaTable Folder",{{"Content", Binary.Buffer}}) else #"Expanded DeltaTable Folder", - #"Added Custom1" = Table.AddColumn(BufferFile, "Data", each Parquet.Document([Content]), Expression.Evaluate("type table [" & Text.Combine(metadata_columns[TableDataType], ", ") & "]", PQ_DataTypes)), - #"Removed Columns1" = Table.RemoveColumns(#"Added Custom1",{"Content"}), - #"Expanded Data" = Table.ExpandTableColumn(#"Removed Columns1", "Data", Table.SelectRows(metadata_columns, each not [isPartitionedBy])[name]), - #"Changed Type" = Table.TransformColumns(#"Expanded Data",Table.SelectRows(metadata_columns, each [type] = "timestamp")[ColumnTransformation]), - #"Reordered Columns" = Table.ReorderColumns(if TimeZoneOffset = null then #"Expanded Data" else #"Changed Type", metadata_columns[name]) - in - #"Reordered Columns" - - in - #"Data"; - -////////////////////////////////////// -//////////Data Source kind//////////// -////////////////////////////////////// - -DeltaLake = [ - // Needed for use with Power BI Service. - TestConnection = (dataSourcePath) => - let - json = Json.Document(dataSourcePath), - Url = json[Url] - in - { "DeltaLake.Contents" , dataSourcePath, [Version = 1, UseFileBuffer = false] }, - Authentication = [ -// Not working with Blob Storage due to error message "The specified resource does not exist" for reading out the tenant information -// Aad = [ -// AuthorizationUri = (dataSourcePath) => -// GetAuthorizationUrlFromWwwAuthenticate( -// GetServiceRootFromDataSourcePath(dataSourcePath) -// ), -// Resource = "https://storage.azure.com/" -// ], - Aad = [ - AuthorizationUri = "https://login.microsoftonline.com/common/oauth2/authorize", - Resource = "https://storage.azure.com/" - ], - Key = [ - Label = "Access key", - KeyLabel = "Access key" - ], - Implicit = [] - ] -]; - -////////////////////////////////////// -//////Data Source UI publishing/////// -////////////////////////////////////// - -DeltaLake.Publish = [ - SupportsDirectQuery = false, - Beta = true, - Category = "Other", - ButtonText = { "Delta Lake", Extension.LoadString("ButtonHelp") },//{ Extension.LoadString("ButtonTitle"), Extension.LoadString("ButtonHelp") }, - LearnMoreUrl = "https://powerbi.microsoft.com/", - SourceImage = DeltaLake.Icons, - SourceTypeImage = DeltaLake.Icons -]; - -DeltaLake.Icons = [ - Icon16 = { Extension.Contents("DeltaLake16.png"), Extension.Contents("DeltaLake20.png"), Extension.Contents("DeltaLake24.png"), Extension.Contents("DeltaLake32.png") }, - Icon32 = { Extension.Contents("DeltaLake32.png"), Extension.Contents("DeltaLake40.png"), Extension.Contents("DeltaLake48.png"), Extension.Contents("DeltaLake64.png") } -]; - - -////////////////////////////////////// -////////// Helper Function /////////// -////////////////////////////////////// - -Table.NavigationTableView = -( - baseTable as function, - keyColumns as list, - dataCtor as function, - descriptor as record -) as table => - let - transformDescriptor = (key, value) => - let - map = [ - Name = "NavigationTable.NameColumn", - Data = "NavigationTable.DataColumn", - Tags = "NavigationTable.TagsColumn", - ItemKind = "NavigationTable.ItemKindColumn", - ItemName = "Preview.DelayColumn", - IsLeaf = "NavigationTable.IsLeafColumn" - ] - in - if value is list - then [Name=value{0}, Ctor=value{1}, MetadataName = Record.FieldOrDefault(map, key)] - else [Name=key, Ctor=value, MetadataName = Record.FieldOrDefault(map, key)], - fields = List.Combine({ - List.Transform(keyColumns, (key) => [Name=key, Ctor=(row) => Record.Field(row, key), MetadataName=null]), - if Record.HasFields(descriptor, {"Data"}) then {} - else {transformDescriptor("Data", (row) => Function.Invoke(dataCtor, Record.ToList(Record.SelectFields(row, keyColumns))))}, - Table.TransformRows(Record.ToTable(descriptor), each transformDescriptor([Name], [Value])) - }), - metadata = List.Accumulate(fields, [], (m, d) => let n = d[MetadataName] in if n = null then m else Record.AddField(m, n, d[Name])), - tableKeys = List.Transform(fields, each [Name]), - tableValues = List.Transform(fields, each [Ctor]), - tableType = Type.ReplaceTableKeys( - Value.Type(#table(tableKeys, {})), - {[Columns=keyColumns, Primary=true]} - ) meta metadata, - reduceAnd = (ast) => if ast[Kind] = "Binary" and ast[Operator] = "And" then List.Combine({@reduceAnd(ast[Left]), @reduceAnd(ast[Right])}) else {ast}, - matchFieldAccess = (ast) => if ast[Kind] = "FieldAccess" and ast[Expression] = RowExpression.Row then ast[MemberName] else ..., - matchConstant = (ast) => if ast[Kind] = "Constant" then ast[Value] else ..., - matchIndex = (ast) => if ast[Kind] = "Binary" and ast[Operator] = "Equals" - then - if ast[Left][Kind] = "FieldAccess" - then Record.AddField([], matchFieldAccess(ast[Left]), matchConstant(ast[Right])) - else Record.AddField([], matchFieldAccess(ast[Right]), matchConstant(ast[Left])) - else ..., - lazyRecord = (recordCtor, keys, baseRecord) => - let record = recordCtor() in List.Accumulate(keys, [], (r, f) => Record.AddField(r, f, () => (if Record.FieldOrDefault(baseRecord, f, null) <> null then Record.FieldOrDefault(baseRecord, f, null) else Record.Field(record, f)), true)), - getIndex = (selector, keys) => Record.SelectFields(Record.Combine(List.Transform(reduceAnd(RowExpression.From(selector)), matchIndex)), keys) - in - Table.View(null, [ - GetType = () => tableType, - GetRows = () => #table(tableType, List.Transform(Table.ToRecords(baseTable()), (row) => List.Transform(tableValues, (ctor) => ctor(row)))), - OnSelectRows = (selector) => - let - index = try getIndex(selector, keyColumns) otherwise [], - default = Table.SelectRows(GetRows(), selector) - in - if Record.FieldCount(index) <> List.Count(keyColumns) then default - else Table.FromRecords({ - index & lazyRecord( - () => Table.First(default), - List.Skip(tableKeys, Record.FieldCount(index)), - Record.AddField([], "Data", () => Function.Invoke(dataCtor, Record.ToList(index)), true)) - }, - tableType) - ]); - - -// Implement this function to retrieve or calculate the service URL based on the data source path parameters -GetServiceRootFromDataSourcePath = (dataSourcePath) as text => - let - Json = Json.Document(dataSourcePath), - Extract = Record.Field(Json, "Folder"), - Parts = Uri.Parts(Extract), - Url = - //ADLS List Files - if Text.Contains(Parts[Host], "dfs") then Extract & "?recursive=true&resource=filesystem" - //Blob List Files - else if Text.Contains(Parts[Host], "blob") then Extract & "?restype=container&comp=list" - //Get ADLS/Blob Files - else "Error: Invalid Path" - in - Url; - -GetAuthorizationUrlFromWwwAuthenticate = (url as text) as text => - let - // Sending an unauthenticated request to the service returns - // a 302 status with WWW-Authenticate header in the response. The value will - // contain the correct authorization_uri. - // - // Example: - // Bearer authorization_uri="https://login.microsoftonline.com/{tenant_guid}/oauth2/authorize" - responseCodes = {302, 401}, - endpointResponse = Web.Contents(url, [ - ManualCredentials = true, - ManualStatusHandling = responseCodes - ]) - in - if (List.Contains(responseCodes, Value.Metadata(endpointResponse)[Response.Status]?)) then - let - headers = Record.FieldOrDefault(Value.Metadata(endpointResponse), "Headers", []), - wwwAuthenticate = Record.FieldOrDefault(headers, "WWW-Authenticate", ""), - split = Text.Split(Text.Trim(wwwAuthenticate), " "), - authorizationUri = List.First(List.Select(split, each Text.Contains(_, "authorization_uri=")), null) - in - if (authorizationUri <> null) then - // Trim and replace the double quotes inserted before the url - Text.Replace(Text.Trim(Text.Trim(Text.AfterDelimiter(authorizationUri, "=")), ","), """", "") - else - error Error.Record("DataSource.Error", "Unexpected WWW-Authenticate header format or value during authentication.", [ - #"WWW-Authenticate" = wwwAuthenticate - ]) - else - error Error.Unexpected("Unexpected response from server during authentication."); - - -Value.WaitFor = (producer as function, interval as function, optional count as number) as any => - let - list = List.Generate( - () => {0, null}, - (state) => state{0} <> null and (count = null or state{0} < count), - (state) => if state{1} <> null then {null, state{1}} else {1 + state{0}, Function.InvokeAfter(() => producer(state{0}), interval(state{0}))}, - (state) => state{1}) - in - List.Last(list); - -Table.ToNavigationTable = ( - table as table, - keyColumns as list, - nameColumn as text, - dataColumn as text, - itemKindColumn as text, - itemNameColumn as text, - isLeafColumn as text -) as table => - let - tableType = Value.Type(table), - newTableType = Type.AddTableKey(tableType, keyColumns, true) meta - [ - NavigationTable.NameColumn = nameColumn, - NavigationTable.DataColumn = dataColumn, - NavigationTable.ItemKindColumn = itemKindColumn, - Preview.DelayColumn = itemNameColumn, - NavigationTable.IsLeafColumn = isLeafColumn - ], - navigationTable = Value.ReplaceType(table, newTableType) - in - navigationTable; \ No newline at end of file diff --git a/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake.query.pq b/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake.query.pq deleted file mode 100644 index 2c6fd1e27e0..00000000000 --- a/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake.query.pq +++ /dev/null @@ -1,5 +0,0 @@ -// Use this file to write queries to test your data connector -let - result = DeltaLake.Contents() -in - result \ No newline at end of file diff --git a/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake16.png b/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake16.png deleted file mode 100644 index a116d28d68b9e54cc6ad3cfb9a8c5beebe472864..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 767 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 diff --git a/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake32.png b/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake32.png deleted file mode 100644 index d61da3cc9b0f5f3b0e03c9b2901f8ba93890bf2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1582 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 diff --git a/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake48.png b/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake48.png deleted file mode 100644 index c4ae0837af0f1180522d4f45b68169cf22d24636..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2539 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 Q0RR9107*qoM6N<$g1Yw1L;wH) diff --git a/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake80.png b/connectors/powerbi/CustomConnector/DeltaLake/DeltaLake80.png deleted file mode 100644 index 3acabf473b99482fc6f9ba35bdc85eeb3d266e12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4899 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 V@irR3+9d!0002ovPDHLkV1kirVu1hv diff --git a/connectors/powerbi/CustomConnector/DeltaLake/resources.resx b/connectors/powerbi/CustomConnector/DeltaLake/resources.resx deleted file mode 100644 index d0876e365e4..00000000000 --- a/connectors/powerbi/CustomConnector/DeltaLake/resources.resx +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Connect to DeltaLake - - - DeltaLake - - - DeltaLake - - \ No newline at end of file diff --git a/connectors/powerbi/PowerBI_Delta.Dataset/.pbi/editorSettings.json b/connectors/powerbi/PowerBI_Delta.Dataset/.pbi/editorSettings.json deleted file mode 100644 index d94544dc253..00000000000 --- a/connectors/powerbi/PowerBI_Delta.Dataset/.pbi/editorSettings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "version": "1.0", - "parallelQueryLoading": true -} \ No newline at end of file diff --git a/connectors/powerbi/PowerBI_Delta.Dataset/definition.pbidataset b/connectors/powerbi/PowerBI_Delta.Dataset/definition.pbidataset deleted file mode 100644 index 4b8d8a5562d..00000000000 --- a/connectors/powerbi/PowerBI_Delta.Dataset/definition.pbidataset +++ /dev/null @@ -1,4 +0,0 @@ -{ - "version": "1.0", - "settings": {} -} \ No newline at end of file diff --git a/connectors/powerbi/PowerBI_Delta.Dataset/diagramLayout.json b/connectors/powerbi/PowerBI_Delta.Dataset/diagramLayout.json deleted file mode 100644 index dde0b1242c8..00000000000 --- a/connectors/powerbi/PowerBI_Delta.Dataset/diagramLayout.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "version": "1.1.0", - "diagrams": [ - { - "ordinal": 0, - "scrollPosition": { - "x": 0, - "y": 0 - }, - "nodes": [ - { - "location": { - "x": 8037.4, - "y": 0 - }, - "nodeIndex": "RowCounts", - "size": { - "height": 128, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 4675.3, - "y": 0 - }, - "nodeIndex": "DeltaTableData_CurrentFunction", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 3646.0999999999995, - "y": 62 - }, - "nodeIndex": "DeltaTableData_CurrentDebug", - "nodeLineageTag": "b5082451-2c3d-49d6-ad7f-eb9510869aea", - "size": { - "height": 176, - "width": 234 - }, - "zIndex": 0 - } - ], - "name": "All tables", - "zoomValue": 100, - "pinKeyFieldsToTop": false, - "showExtraHeaderInfo": false, - "hideKeyFieldsWhenCollapsed": false, - "tablesLocked": false - } - ], - "selectedDiagram": "All tables", - "defaultDiagram": "All tables" -} \ No newline at end of file diff --git a/connectors/powerbi/PowerBI_Delta.Dataset/item.config.json b/connectors/powerbi/PowerBI_Delta.Dataset/item.config.json deleted file mode 100644 index d195446c2b5..00000000000 --- a/connectors/powerbi/PowerBI_Delta.Dataset/item.config.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "version": "1.0", - "logicalId": "52238194-390d-4ee7-983a-81b6a22d30fa" -} \ No newline at end of file diff --git a/connectors/powerbi/PowerBI_Delta.Dataset/item.metadata.json b/connectors/powerbi/PowerBI_Delta.Dataset/item.metadata.json deleted file mode 100644 index 266eb5cbe42..00000000000 --- a/connectors/powerbi/PowerBI_Delta.Dataset/item.metadata.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "dataset", - "displayName": "PowerBI_Delta" -} \ No newline at end of file diff --git a/connectors/powerbi/PowerBI_Delta.Dataset/model.bim b/connectors/powerbi/PowerBI_Delta.Dataset/model.bim deleted file mode 100644 index 0f56f773ea0..00000000000 --- a/connectors/powerbi/PowerBI_Delta.Dataset/model.bim +++ /dev/null @@ -1,2243 +0,0 @@ -{ - "compatibilityLevel": 1550, - "model": { - "annotations": [ - { - "name": "__PBI_TimeIntelligenceEnabled", - "value": "0" - }, - { - "name": "PBI_QueryOrder", - "value": "[\"fn_ReadDeltaTable\",\"DeltaTableFolderContent\",\"DeltaTableOptions\",\"Option_PartitionFilterFunction\",\"Option_StatsFilterFunction\",\"PartitionFilterFunction\",\"StatsFilterFunction\",\"DeltaTableVersion\",\"UseFileBuffer\",\"IterateFolderContent\",\"TimeZoneOffset\",\"TimeZoneOffsetDuration\",\"fn_AddColumnsToTable\",\"fn_GetPowerBIDataTypeInformation\",\"fn_URIDecode\",\"DeltaTableFolderContent_wFullPath\",\"Delimiter\",\"DeltaProtocol\",\"PQ_DataTypes\",\"DeltaTablePath\",\"_delta_log Folder\",\"metadata_columns\",\"TableSchema\",\"PhysicalTableSchema\",\"LogSchema\",\"_last_checkpoint\",\"Checkpoint Files\",\"Logs Checkpoint\",\"Latest Log Files\",\"Logs JSON\",\"Logs ALL\",\"Files with Stats\",\"Data\",\"Content_ADLS_DimProduct\",\"Content_ADLS_DimProduct_Clone\",\"Content_ADLS_DimProduct_ShallowClone\",\"Content_ADLS_FactInternetSales_part\",\"Content_ADLS_FactInternetSales_part_Hierarchical\",\"Content_LocalFolder\",\"DeltaTableData_CurrentFunction\",\"DeltaTableData_CurrentDebug\",\"Content_Blob_part\",\"Content_Blob_BasicDataTypes\",\"Option_Version\",\"Content_Blob_AllDataTypes\",\"Option_UseFileBuffer\",\"Option_IterateFolderContent\",\"Option_TimeZoneOffset\",\"Content_Blob_BasicDataTypes_Combine\",\"Steps_fn_AddColumnsToTable\",\"RowCounts\",\"OnSelectRows_Selector\",\"Content_Blob_DimProduct_Clone\",\"Content_Blob_DimProduct_ShallowClone\",\"Content_ColumnMapping_flat\",\"Content_ColumnMapping_complex\",\"SampleFiltering\",\"fn_test_UIFiltering\",\"test_UIFiltering\",\"Content_Blob_with_file_name\",\"GoldenDatasetsRootPath\",\"Content_multi-part-checkpoint\",\"Content_data-reader-nested-struct\",\"Content_data-reader-array-complex-objects\",\"GoldenTables\",\"Content_data-reader-partition-values\",\"Content_ADLS_BugBrackets\"]" - }, - { - "name": "PBIDesktopVersion", - "value": "2.121.762.0 (23.09)" - }, - { - "name": "PBI_ProTooling", - "value": "[\"DevMode\"]" - } - ], - "culture": "en-GB", - "cultures": [ - { - "name": "en-GB", - "linguisticMetadata": { - "content": { - "DynamicImprovement": "HighConfidence", - "Language": "en-US", - "Version": "1.0.0" - }, - "contentType": "json" - } - } - ], - "dataAccessOptions": { - "fastCombine": true, - "legacyRedirects": true, - "returnErrorValuesAsNull": true - }, - "defaultPowerBIDataSourceVersion": "powerBI_V3", - "expressions": [ - { - "name": "_last_checkpoint", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Record" - } - ], - "expression": [ - "let", - " #\"_delta_log\" = #\"_delta_log Folder\",", - " #\"Filtered Rows\" = Table.SelectRows(_delta_log, each Text.EndsWith([Name], \"_last_checkpoint\")),", - " #\"Added Custom\" = Table.AddColumn(#\"Filtered Rows\", \"JsonContent\", each Json.Document([Content])),", - " JsonContent = #\"Added Custom\"{0}[JsonContent],", - " CheckEmpty = if Table.RowCount(#\"Filtered Rows\") = 0 then [Size=-1, version=-1] else JsonContent,", - " LatestCheckPointWithParts = if Record.HasFields(CheckEmpty, \"parts\") then CheckEmpty else Record.AddField(CheckEmpty, \"parts\", 1),", - "", - " #\"Filtered Rows Version\" = Table.SelectRows(#\"_delta_log\", each Text.EndsWith([Name], \".checkpoint.parquet\")),", - " MaxVersion = try Table.Group(#\"Filtered Rows Version\", {}, {{\"MaxVersion\", each List.Max([Version]), type number}}){0}[MaxVersion] otherwise -1,", - " #\"Filtered Rows MaxVersion\" = Table.SelectRows(#\"Filtered Rows Version\", each [Version] = MaxVersion),", - " CheckpointFromVersion = [version=try MaxVersion otherwise -1, size=-1, parts = Table.RowCount(#\"Filtered Rows MaxVersion\")],", - "", - " LastCheckpoint = Table.Buffer(Table.FromRecords({if DeltaTableVersion = null then LatestCheckPointWithParts else CheckpointFromVersion})){0}", - "in", - " LastCheckpoint" - ], - "kind": "m", - "lineageTag": "66b761a8-d937-41f3-ae59-6a9762a4cc9a", - "queryGroup": "FunctionSteps" - }, - { - "name": "Checkpoint Files", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " LastCheckpointFile = {1..Record.Field(_last_checkpoint, \"parts\")},", - " #\"Converted to Table\" = Table.FromList(LastCheckpointFile, Splitter.SplitByNothing(), {\"part\"}, null, ExtraValues.Error),", - " #\"Add Version\" = Table.AddColumn(#\"Converted to Table\", \"version\", each Record.Field(_last_checkpoint, \"version\")),", - " #\"Add SingleFile\" = Table.AddColumn(#\"Add Version\", \"file_name\", each Text.PadStart(Text.From([version]), 20, \"0\") & \".checkpoint.parquet\", Text.Type),", - " #\"Add MultipleFiles\" = Table.AddColumn(#\"Add Version\", \"file_name\", each Text.PadStart(Text.From([version]), 20, \"0\") & \".checkpoint.\" & Text.PadStart(Text.From([part]), 10, \"0\") & \".\" & Text.PadStart(Text.From(Record.Field(_last_checkpoint, \"parts\")), 10, \"0\") & \".parquet\", Text.Type),", - " AllFiles = Table.SelectColumns(if Record.Field(_last_checkpoint, \"parts\") = 1 then #\"Add SingleFile\" else #\"Add MultipleFiles\", \"file_name\"),", - " AllFiles_BufferedList = List.Buffer(Table.ToList(AllFiles)),", - " Content = Table.SelectRows(#\"_delta_log Folder\", each List.Count(List.Select(AllFiles_BufferedList, (inner) => Text.EndsWith([Name], inner))) > 0)", - "in", - " Content" - ], - "kind": "m", - "lineageTag": "8a59492b-dbe3-4bda-935c-2b87f1b4c5ef", - "queryGroup": "FunctionSteps" - }, - { - "name": "metadata_columns", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = #\"Logs ALL\",", - " #\"Filtered Rows1\" = Table.SelectRows(Source, each ([metaData] <> null)),", - " MaxVersion = Table.Group(#\"Filtered Rows1\", {}, {{\"MaxVersion\", each List.Max([Version]), type number}}){0}[MaxVersion],", - " #\"Filtered Rows2\" = Table.SelectRows(#\"Filtered Rows1\", each [Version] = MaxVersion),", - " #\"Kept First Rows\" = Table.FirstN(#\"Filtered Rows2\",1),", - " #\"Removed Other Columns\" = Table.SelectColumns(#\"Kept First Rows\",{\"metaData\"}),", - " #\"Expanded metaData\" = Table.ExpandRecordColumn(#\"Removed Other Columns\", \"metaData\", {\"schemaString\", \"partitionColumns\"}, {\"schemaString\", \"partitionColumns\"}),", - " #\"Filtered Rows\" = Table.SelectRows(#\"Expanded metaData\", each ([schemaString] <> null)),", - " JSON = Table.TransformColumns(#\"Filtered Rows\",{{\"schemaString\", Json.Document}}),", - " #\"Expanded schemaString\" = Table.ExpandRecordColumn(JSON, \"schemaString\", {\"fields\"}, {\"fields\"}),", - " #\"Expanded fieldList\" = Table.ExpandListColumn(#\"Expanded schemaString\", \"fields\"),", - " #\"Expanded fields\" = Table.ExpandRecordColumn(#\"Expanded fieldList\", \"fields\", {\"name\", \"type\", \"nullable\", \"metadata\"}, {\"name\", \"type\", \"nullable\", \"metadata\"}),", - " #\"Added physicalName\" = Table.AddColumn(#\"Expanded fields\", \"physicalName\", each try Record.Field([metadata], \"delta.columnMapping.physicalName\") otherwise [name], type text),", - " #\"Changed Type\" = Table.TransformColumnTypes(#\"Added physicalName\",{{\"name\", type text}, {\"nullable\", type logical}}),", - " #\"Added isPartitionedBy\" = Table.Buffer(Table.AddColumn(#\"Changed Type\", \"isPartitionedBy\", each List.Contains([partitionColumns], [name]), Logical.Type)),", - " #\"Added PBI_Text\" = Table.AddColumn(#\"Added isPartitionedBy\", \"PBI_Text\", each fn_GetPowerBIDataTypeInformation([type], false, [nullable]), type text),", - " #\"Added PBI_DataType\" = Table.AddColumn(#\"Added PBI_Text\", \"PBI_DataType\", each Expression.Evaluate(\"type \" & [PBI_Text], PQ_DataTypes), type type),", - " #\"Added PBI_Transformation\" = Table.AddColumn(#\"Added PBI_DataType\", \"PBI_Transformation\", each ", - " if [type] = \"string\" then Text.From", - " else if [type] = \"long\" then Int64.From", - " else if [type] = \"integer\" then Int32.From", - " else if [type] = \"short\" then Int16.From", - " else if [type] = \"byte\" then Int8.From", - " else if [type] = \"float\" then Single.From", - " else if [type] = \"double\" then Double.From", - " else if [type] = \"date\" then Date.From", - " else if [type] = \"timestamp\" and TimeZoneOffset = null then DateTime.From", - " else if [type] = \"timestamp\" and TimeZoneOffset <> null then (x) as nullable datetimezone => DateTime.AddZone(DateTime.From(x) + TimeZoneOffsetDuration, Duration.Hours(TimeZoneOffsetDuration), Duration.Minutes(TimeZoneOffsetDuration))", - " else if [type] = \"boolean\" then Logical.From", - " else if [type] = \"binary\" then Binary.From", - " else if (Value.Is([type], type text) and Text.StartsWith([type], \"decimal\")) then Number.From", - " else (x) as nullable any => x, type function),", - " #\"Added physicalPBI_Text\" = Table.AddColumn(#\"Added PBI_Transformation\", \"physicalPBI_Text\", each fn_GetPowerBIDataTypeInformation([type], true, [nullable]), type text),", - " #\"Added physicalPBI_DataType\" = Table.AddColumn(#\"Added physicalPBI_Text\", \"physicalPBI_DataType\", each Expression.Evaluate(\"type \" & [physicalPBI_Text], PQ_DataTypes), type type),", - " #\"Added ChangeDataType\" = Table.AddColumn(#\"Added physicalPBI_DataType\", \"ChangeDataType\", each {[name], [PBI_DataType]}, type list),", - " #\"Added TableDataType\" = Table.AddColumn(#\"Added ChangeDataType\", \"TableDataType\", each \"#\"\"\" & [name] & \"\"\"=\" & Text.From([PBI_Text]), type text),", - " #\"Added PhysicalTableDataType\" = Table.AddColumn(#\"Added TableDataType\", \"PhysicalTableDataType\", each \"#\"\"\" & [physicalName] & \"\"\"=\" & Text.From([PBI_Text]), type text),", - " #\"Added ColumnTransformation\" = Table.AddColumn(#\"Added PhysicalTableDataType\", \"ColumnTransformation\", each {[physicalName], [PBI_Transformation]}, type list),", - " #\"Buffered Fields\" = Table.Buffer(#\"Added ColumnTransformation\")", - "in", - " #\"Buffered Fields\"" - ], - "kind": "m", - "lineageTag": "57b415a1-afb1-4fb4-832c-1b6119132ff1", - "queryGroup": "FunctionSteps" - }, - { - "name": "Logs Checkpoint", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = #\"Checkpoint Files\",", - " #\"Parsed Logs\" = Table.AddColumn(Source, \"LogInfo\", each Parquet.Document([Content])),", - " #\"Combine LogInfo and Version\" = Table.Combine(Table.TransformRows(#\"Parsed Logs\", each fn_AddColumnsToTable([Version=_[Version]], _[LogInfo])))", - "in", - " #\"Combine LogInfo and Version\"" - ], - "kind": "m", - "lineageTag": "d453cf62-55fc-4fdc-9d46-deaadb081d3c", - "queryGroup": "FunctionSteps" - }, - { - "name": "Latest Log Files", - "annotations": [ - { - "name": "PBI_ResultType", - "value": "Table" - }, - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " Source = #\"_delta_log Folder\",", - " #\"Filtered After Last Checkpoint\" = Table.SelectRows(Source, each [Version] > Record.Field(_last_checkpoint, \"version\")),", - " #\"Filtered JSON Files\" = Table.SelectRows(#\"Filtered After Last Checkpoint\", each ([Extension] = \".json\" and not Text.EndsWith([Name], \".compacted.json\")))", - "in", - " #\"Filtered JSON Files\"" - ], - "kind": "m", - "lineageTag": "6c8889e9-0563-499c-8ef4-0dd45c347d97", - "queryGroup": "FunctionSteps" - }, - { - "name": "Logs JSON", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = #\"Latest Log Files\",", - " #\"Added Custom\" = Table.AddColumn(Source, \"JsonContent\", each Lines.FromBinary([Content])),", - " #\"Expanded JsonContent\" = Table.ExpandListColumn(#\"Added Custom\", \"JsonContent\"),", - " #\"Parsed Logs\" = Table.TransformColumns(#\"Expanded JsonContent\",{{\"JsonContent\", Json.Document, LogSchema}}),", - " #\"Expanded Logs\" = Table.ExpandRecordColumn(#\"Parsed Logs\", \"JsonContent\", {\"add\", \"remove\", \"metaData\", \"commitInfo\", \"protocol\"}),", - " #\"Removed Other Columns\" = Table.SelectColumns(#\"Expanded Logs\",{\"Version\", \"add\", \"remove\", \"metaData\", \"commitInfo\", \"protocol\"})", - "in", - " #\"Removed Other Columns\"" - ], - "kind": "m", - "lineageTag": "7e8671a4-665f-480c-a654-568aa68446bb", - "queryGroup": "FunctionSteps" - }, - { - "name": "DeltaTablePath", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Text" - } - ], - "expression": [ - "let", - " DeltaTablePath = Text.Combine(List.RemoveLastN(Text.Split(#\"_delta_log Folder\"{0}[Full_Path], Delimiter), 2), Delimiter) & Delimiter", - "in", - " DeltaTablePath" - ], - "kind": "m", - "lineageTag": "4e0245c2-1323-4b68-bbb8-039b5d36d71c", - "queryGroup": "FunctionSteps" - }, - { - "name": "_delta_log Folder", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = DeltaTableFolderContent_wFullPath,", - " #\"Filtered Rows\" = Table.SelectRows(Source, each Text.Contains([Full_Path], Delimiter & \"_delta_log\" & Delimiter)),", - " DeltaLogValidated = if Table.RowCount(#\"Filtered Rows\") = 0 then error \"Mandatory folder \" & Delimiter & \"_delta_log\" & Delimiter & \" not found in the root of the file listing! Are you sure this is a Delta Lake table?\" else #\"Filtered Rows\",", - " #\"Added Version\" = Table.AddColumn(DeltaLogValidated, \"Version\", each try Int64.From(Text.BeforeDelimiter([File_Name], \".\")) otherwise -1, Int64.Type),", - " MaxVersion = Table.Group(#\"Added Version\", {}, {{\"MaxVersion\", each List.Max([Version]), type number}}){0}[MaxVersion],", - " #\"Filtered RequestedVersion\" = if DeltaTableVersion = null then #\"Added Version\" ", - "else if DeltaTableVersion < 0 then Table.SelectRows(#\"Added Version\", each [Version] <= MaxVersion + DeltaTableVersion)", - "else Table.SelectRows(#\"Added Version\", each [Version] <= DeltaTableVersion),", - " BufferedTable = Table.Buffer(#\"Filtered RequestedVersion\"),", - " BufferedContent = Table.TransformColumns(BufferedTable,{{\"Content\", Binary.Buffer}})", - "in", - " BufferedContent" - ], - "kind": "m", - "lineageTag": "a36fa401-9c9b-40d0-8d63-c3af5563f07e", - "queryGroup": "FunctionSteps" - }, - { - "name": "Logs ALL", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = Table.Combine({#\"Logs Checkpoint\", #\"Logs JSON\"}),", - " #\"Added timestamp\" = Table.AddColumn(Source, \"log_timestamp\", each if [add] <> null then Record.Field([add], \"modificationTime\") else ", - "if [remove] <> null then Record.Field([remove], \"deletionTimestamp\") else ", - "if [commitInfo] <> null then Record.Field([commitInfo], \"timestamp\") else ", - "if [metaData] <> null then Record.Field([metaData], \"createdTime\") else null, Int64.Type),", - " #\"Added datetime\" = Table.AddColumn(#\"Added timestamp\", \"log_datetime\", each try #datetime(1970,1,1,0,0,0)+#duration(0,0,0,[log_timestamp]/1000) otherwise null, DateTime.Type)", - "in", - " #\"Added datetime\"" - ], - "kind": "m", - "lineageTag": "a04d3d9e-a8af-45f7-abb8-80934513a0d3", - "queryGroup": "FunctionSteps" - }, - { - "name": "fn_ReadDeltaTable", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Function" - } - ], - "expression": [ - "let", - " fn_ReadDeltaTable = (", - " DeltaTableFolderContent as table,", - " optional DeltaTableOptions as record", - " ) as table =>", - "", - " let", - "", - " DeltaTableVersion = if DeltaTableOptions = null then null else Record.FieldOrDefault(DeltaTableOptions, \"Version\", null),", - " PartitionFilterFunction = if DeltaTableOptions = null then (x) => true else if Record.FieldOrDefault(DeltaTableOptions, \"PartitionFilterFunction\", null) = null then (x) => true else Record.Field(DeltaTableOptions, \"PartitionFilterFunction\"),", - " StatsFilterFunction = if DeltaTableOptions = null then (x, y) => true else if Record.FieldOrDefault(DeltaTableOptions, \"StatsFilterFunction\", null) = null then (x, y) => true else Record.Field(DeltaTableOptions, \"StatsFilterFunction\"),", - " UseFileBuffer = if DeltaTableOptions = null then false else if Record.FieldOrDefault(DeltaTableOptions, \"UseFileBuffer\", null) = null then false else Record.Field(DeltaTableOptions, \"UseFileBuffer\"),", - " IterateFolderContent = if DeltaTableOptions = null then false else if Record.FieldOrDefault(DeltaTableOptions, \"IterateFolderContent\", null) = null then false else Record.Field(DeltaTableOptions, \"IterateFolderContent\"),", - " TimeZoneOffset = if DeltaTableOptions = null then null else Record.FieldOrDefault(DeltaTableOptions, \"TimeZoneOffset\", null),", - " TimeZoneOffsetDuration = Duration.FromText(Text.TrimStart(TimeZoneOffset, \"+\")),", - "", - " Delimiter = if Text.Contains(DeltaTableFolderContent{0}[Folder Path], \"//\") then \"/\" else \"\\\",", - "", - " fn_URIDecode = (data as text) as text => Uri.Parts(\"http://powerbi?txt=\" & data)[Query][txt],", - "", - " DeltaProtocol =", - " let", - " Source = #\"Logs ALL\",", - " #\"Filtered Rows1\" = Table.SelectRows(Source, each ([protocol] <> null)),", - " MaxVersion = Table.Group(#\"Filtered Rows1\", {}, {{\"MaxVersion\", each List.Max([Version]), type number}}){0}[MaxVersion],", - " #\"Filtered Rows2\" = Table.SelectRows(#\"Filtered Rows1\", each [Version] = MaxVersion),", - " #\"Removed Other Columns\" = Table.SelectColumns(#\"Filtered Rows2\",{\"protocol\"}),", - " #\"Expanded protocol\" = Table.ExpandRecordColumn(#\"Removed Other Columns\", \"protocol\", {\"minReaderVersion\", \"minWriterVersion\"}, {\"minReaderVersion\", \"minWriterVersion\"}),", - " #\"Changed Type\" = Table.TransformColumnTypes(#\"Expanded protocol\",{{\"minReaderVersion\", Int64.Type}, {\"minWriterVersion\", Int64.Type}}),", - " #\"Renamed Columns\" = Table.Buffer(#\"Changed Type\")", - " in", - " #\"Renamed Columns\",", - "", - " DeltaTableFolderContent_wFullPath = ", - " let", - " Source = DeltaTableFolderContent,", - "", - " fn_ReadContentRecursive = (tbl as table) as table => ", - " let", - " subFolders = Table.SelectRows(tbl, each Value.Is(_[Content], type table)),", - " binaries = Table.SelectRows(tbl, each Value.Is(_[Content], type binary)),", - " combinedContent = if Table.RowCount(subFolders) > 0 then Table.Combine({binaries, @fn_ReadContentRecursive(Table.Combine(subFolders[Content]))}) else binaries", - " in", - " combinedContent,", - "", - " Content = if IterateFolderContent then fn_ReadContentRecursive(Source) else Source,", - "", - " #\"Added Full_Path\" = Table.AddColumn(Content, \"Full_Path\", each fn_URIDecode([Folder Path]) & [Name], Text.Type),", - " #\"Added File_Name\" = Table.AddColumn(#\"Added Full_Path\", \"File_Name\", each if Text.Length([Extension]) > 0 then List.Last(Text.Split([Full_Path], Delimiter)) else null, type text),", - " Buffered = Table.Buffer(#\"Added File_Name\")", - " in", - " Buffered,", - "", - " PQ_DataTypes = ", - " let", - " Source = [", - " Any.Type = Any.Type,", - " None.Type = None.Type,", - " Day.Type = Day.Type,", - " Duration.Type = Duration.Type,", - " Record.Type = Record.Type,", - " Precision.Type = Precision.Type,", - " Number.Type = Number.Type,", - " Binary.Type = Binary.Type,", - " Byte.Type = Byte.Type,", - " Character.Type = Character.Type,", - " Text.Type = Text.Type,", - " Function.Type = Function.Type,", - " Null.Type = Null.Type,", - " List.Type = List.Type,", - " Type.Type = Type.Type,", - " Logical.Type = Logical.Type,", - " Int8.Type = Int8.Type,", - " Int16.Type = Int16.Type,", - " Int32.Type = Int32.Type,", - " Int64.Type = Int64.Type,", - " Single.Type = Single.Type,", - " Double.Type = Double.Type,", - " Decimal.Type = Decimal.Type,", - " Currency.Type = Currency.Type,", - " Percentage.Type = Percentage.Type,", - " Guid.Type = Guid.Type,", - " Date.Type = Date.Type,", - " DateTime.Type = DateTime.Type,", - " DateTimeZone.Type = DateTimeZone.Type,", - " Time.Type = Time.Type,", - " Table.Type = Table.Type", - " ]", - " in", - " Source,", - "", - " #\"TableSchema\" = ", - " let", - " ExpressionText = \"type table [\" & Text.Combine(metadata_columns[TableDataType], \", \") & \"]\",", - " BufferedExpression = List.Buffer({ExpressionText}){0},", - " TableSchema = Expression.Evaluate(BufferedExpression, PQ_DataTypes)", - " in", - " TableSchema,", - "", - " #\"PhysicalTableSchema\" =", - " let", - " ExpressionText = \"type table [\" & Text.Combine(metadata_columns[PhysicalTableDataType], \", \") & \"]\",", - " BufferedExpression = List.Buffer({ExpressionText}){0},", - " PhysicalTableSchema = Expression.Evaluate(BufferedExpression, PQ_DataTypes)", - " in", - " PhysicalTableSchema,", - "", - " LogSchema = type [txn=record, add=record, remove=record, metaData=record, commitInfo=record, protocol=record],", - "", - " #\"_delta_log Folder\" = ", - " let", - " Source = DeltaTableFolderContent_wFullPath,", - " #\"Filtered Rows\" = Table.SelectRows(Source, each Text.Contains([Full_Path], Delimiter & \"_delta_log\" & Delimiter)),", - " DeltaLogValidated = if Table.RowCount(#\"Filtered Rows\") = 0 then error \"Mandatory folder \" & Delimiter & \"_delta_log\" & Delimiter & \" not found in the root of the file listing! Are you sure this is a Delta Lake table?\" else #\"Filtered Rows\",", - " #\"Added Version\" = Table.AddColumn(DeltaLogValidated, \"Version\", each try Int64.From(Text.BeforeDelimiter([File_Name], \".\")) otherwise -1, Int64.Type),", - " MaxVersion = Table.Group(#\"Added Version\", {}, {{\"MaxVersion\", each List.Max([Version]), type number}}){0}[MaxVersion],", - " #\"Filtered RequestedVersion\" = if DeltaTableVersion = null then #\"Added Version\" ", - " else if DeltaTableVersion < 0 then Table.SelectRows(#\"Added Version\", each [Version] <= MaxVersion + DeltaTableVersion)", - " else Table.SelectRows(#\"Added Version\", each [Version] <= DeltaTableVersion),", - " BufferedTable = Table.Buffer(#\"Filtered RequestedVersion\"),", - " BufferedContent = Table.TransformColumns(BufferedTable,{{\"Content\", Binary.Buffer}})", - " in", - " BufferedContent,", - "", - " #\"DeltaTablePath\" = ", - " let", - " DeltaTablePath = Text.Combine(List.RemoveLastN(Text.Split(#\"_delta_log Folder\"{0}[Full_Path], Delimiter), 2), Delimiter) & Delimiter", - " in", - " DeltaTablePath,", - "", - " #\"_last_checkpoint\" = ", - " let", - " #\"_delta_log\" = #\"_delta_log Folder\",", - " #\"Filtered Rows\" = Table.SelectRows(_delta_log, each Text.EndsWith([Name], \"_last_checkpoint\")),", - " #\"Added Custom\" = Table.AddColumn(#\"Filtered Rows\", \"JsonContent\", each Json.Document([Content])),", - " JsonContent = #\"Added Custom\"{0}[JsonContent],", - " CheckEmpty = if Table.RowCount(#\"Filtered Rows\") = 0 then [Size=-1, version=-1] else JsonContent,", - " LatestCheckPointWithParts = if Record.HasFields(CheckEmpty, \"parts\") then CheckEmpty else Record.AddField(CheckEmpty, \"parts\", 1),", - "", - " #\"Filtered Rows Version\" = Table.SelectRows(#\"_delta_log\", each Text.EndsWith([Name], \".checkpoint.parquet\")),", - " MaxVersion = try Table.Group(#\"Filtered Rows Version\", {}, {{\"MaxVersion\", each List.Max([Version]), type number}}){0}[MaxVersion] otherwise -1,", - " #\"Filtered Rows MaxVersion\" = Table.SelectRows(#\"Filtered Rows Version\", each [Version] = MaxVersion),", - " CheckpointFromVersion = [version=try MaxVersion otherwise -1, size=-1, parts = Table.RowCount(#\"Filtered Rows MaxVersion\")],", - "", - " LastCheckpoint = Table.Buffer(Table.FromRecords({if DeltaTableVersion = null then LatestCheckPointWithParts else CheckpointFromVersion})){0}", - " in", - " LastCheckpoint,", - "", - " #\"Checkpoint Files\" = ", - " let", - " LastCheckpointFile = {1..Record.Field(_last_checkpoint, \"parts\")},", - " #\"Converted to Table\" = Table.FromList(LastCheckpointFile, Splitter.SplitByNothing(), {\"part\"}, null, ExtraValues.Error),", - " #\"Add Version\" = Table.AddColumn(#\"Converted to Table\", \"version\", each Record.Field(_last_checkpoint, \"version\")),", - " #\"Add SingleFile\" = Table.AddColumn(#\"Add Version\", \"file_name\", each Text.PadStart(Text.From([version]), 20, \"0\") & \".checkpoint.parquet\", Text.Type),", - " #\"Add MultipleFiles\" = Table.AddColumn(#\"Add Version\", \"file_name\", each Text.PadStart(Text.From([version]), 20, \"0\") & \".checkpoint.\" & Text.PadStart(Text.From([part]), 10, \"0\") & \".\" & Text.PadStart(Text.From(Record.Field(_last_checkpoint, \"parts\")), 10, \"0\") & \".parquet\", Text.Type),", - " AllFiles = Table.SelectColumns(if Record.Field(_last_checkpoint, \"parts\") = 1 then #\"Add SingleFile\" else #\"Add MultipleFiles\", \"file_name\"),", - " AllFiles_BufferedList = List.Buffer(Table.ToList(AllFiles)),", - " Content = Table.SelectRows(#\"_delta_log Folder\", each List.Count(List.Select(AllFiles_BufferedList, (inner) => Text.EndsWith([Name], inner))) > 0)", - " in", - " Content,", - "", - " #\"Logs Checkpoint\" = ", - " let", - " Source = #\"Checkpoint Files\",", - " #\"Parsed Logs\" = Table.AddColumn(Source, \"LogInfo\", each Parquet.Document([Content])),", - " #\"Combine LogInfo and Version\" = Table.Combine(Table.TransformRows(#\"Parsed Logs\", each fn_AddColumnsToTable([Version=_[Version]], _[LogInfo])))", - " in", - " #\"Combine LogInfo and Version\",", - "", - " #\"Latest Log Files\" = ", - " let", - " Source = #\"_delta_log Folder\",", - " #\"Filtered After Last Checkpoint\" = Table.SelectRows(Source, each [Version] > Record.Field(_last_checkpoint, \"version\")),", - " #\"Filtered JSON Files\" = Table.SelectRows(#\"Filtered After Last Checkpoint\", each ([Extension] = \".json\" and not Text.EndsWith([Name], \".compacted.json\")))", - " in", - " #\"Filtered JSON Files\",", - "", - " #\"Logs JSON\" = ", - " let", - " Source = #\"Latest Log Files\",", - " #\"Added Custom\" = Table.AddColumn(Source, \"JsonContent\", each Lines.FromBinary([Content])),", - " #\"Expanded JsonContent\" = Table.ExpandListColumn(#\"Added Custom\", \"JsonContent\"),", - " #\"Parsed Logs\" = Table.TransformColumns(#\"Expanded JsonContent\",{{\"JsonContent\", Json.Document}}),", - " #\"Expanded Logs\" = Table.ExpandRecordColumn(#\"Parsed Logs\", \"JsonContent\", {\"add\", \"remove\", \"metaData\", \"commitInfo\", \"protocol\"}),", - " #\"Removed Other Columns\" = Table.SelectColumns(#\"Expanded Logs\",{\"Version\", \"add\", \"remove\", \"metaData\", \"commitInfo\", \"protocol\"})", - " in", - " #\"Removed Other Columns\",", - "", - " #\"Logs ALL\" = ", - " let", - " Source = Table.Combine({#\"Logs Checkpoint\", #\"Logs JSON\"}),", - " #\"Added timestamp\" = Table.AddColumn(Source, \"log_timestamp\", each if [add] <> null then Record.Field([add], \"modificationTime\") else ", - " if [remove] <> null then Record.Field([remove], \"deletionTimestamp\") else ", - " if [commitInfo] <> null then Record.Field([commitInfo], \"timestamp\") else ", - " if [metaData] <> null then Record.Field([metaData], \"createdTime\") else null, Int64.Type),", - " #\"Added datetime\" = Table.AddColumn(#\"Added timestamp\", \"log_datetime\", each try #datetime(1970,1,1,0,0,0)+#duration(0,0,0,[log_timestamp]/1000) otherwise null, DateTime.Type)", - " in", - " #\"Added datetime\",", - "", - " fn_GetPowerBIDataTypeInformation = ", - " (type_value as any, physical_name as logical, optional is_nullable as nullable logical) as text =>", - " let ", - " par_is_nullable = if is_nullable = null then true else is_nullable,", - "", - " ret = if Value.Is(type_value, Record.Type) then ", - " if type_value[type] = \"struct\" then \"[\" & Text.Combine(List.Transform(type_value[fields], each \"#\"\"\" & (if(physical_name) then _[metadata][delta.columnMapping.physicalName] else _[name]) & \"\"\" = \" & @fn_GetPowerBIDataTypeInformation(_[type], physical_name, _[nullable])), \", \") & \"]\"", - " else if type_value[type] = \"array\" then \"{\" & @fn_GetPowerBIDataTypeInformation(type_value[elementType], physical_name, type_value[containsNull]) & \"}\"", - " else if type_value[type] = \"map\" then \"table [Key=\" & @fn_GetPowerBIDataTypeInformation(type_value[keyType], false) & \", Value=\" & @fn_GetPowerBIDataTypeInformation(type_value[valueType], physical_name, type_value[valueContainsNull]) & \"]\"", - " else \"Any.Type\"", - " else if type_value = \"string\" then \"Text.Type\"", - " else if type_value = \"long\" then \"Int64.Type\"", - " else if type_value = \"integer\" then \"Int32.Type\"", - " else if type_value = \"short\" then \"Int16.Type\"", - " else if type_value = \"byte\" then \"Int8.Type\"", - " else if type_value = \"float\" then \"Single.Type\"", - " else if type_value = \"double\" then \"Double.Type\"", - " else if type_value = \"date\" then \"Date.Type\"", - " else if type_value = \"timestamp\" and TimeZoneOffset = null then \"DateTime.Type\"", - " else if type_value = \"timestamp\" and TimeZoneOffset <> null then \"DateTimeZone.Type\"", - " else if type_value = \"boolean\" then \"Logical.Type\"", - " else if type_value = \"binary\" then \"Binary.Type\"", - " else if type_value = \"null\" then \"Any.Type\"", - " else if Text.StartsWith(type_value, \"decimal\") then \"Number.Type\" ", - " else \"Any.Type\",", - "", - " ret_nullable = (if par_is_nullable then \"nullable \" else \"\") & ret", - " in", - " ret_nullable,", - "", - " #\"metadata_columns\" = ", - " let", - " Source = #\"Logs ALL\",", - " #\"Filtered Rows1\" = Table.SelectRows(Source, each ([metaData] <> null)),", - " MaxVersion = Table.Group(#\"Filtered Rows1\", {}, {{\"MaxVersion\", each List.Max([Version]), type number}}){0}[MaxVersion],", - " #\"Filtered Rows2\" = Table.SelectRows(#\"Filtered Rows1\", each [Version] = MaxVersion),", - " #\"Kept First Rows\" = Table.FirstN(#\"Filtered Rows2\",1),", - " #\"Removed Other Columns\" = Table.SelectColumns(#\"Kept First Rows\",{\"metaData\"}),", - " #\"Expanded metaData\" = Table.ExpandRecordColumn(#\"Removed Other Columns\", \"metaData\", {\"schemaString\", \"partitionColumns\"}, {\"schemaString\", \"partitionColumns\"}),", - " #\"Filtered Rows\" = Table.SelectRows(#\"Expanded metaData\", each ([schemaString] <> null)),", - " JSON = Table.TransformColumns(#\"Filtered Rows\",{{\"schemaString\", Json.Document}}),", - " #\"Expanded schemaString\" = Table.ExpandRecordColumn(JSON, \"schemaString\", {\"fields\"}, {\"fields\"}),", - " #\"Expanded fieldList\" = Table.ExpandListColumn(#\"Expanded schemaString\", \"fields\"),", - " #\"Expanded fields\" = Table.ExpandRecordColumn(#\"Expanded fieldList\", \"fields\", {\"name\", \"type\", \"nullable\", \"metadata\"}, {\"name\", \"type\", \"nullable\", \"metadata\"}),", - " #\"Added physicalName\" = Table.AddColumn(#\"Expanded fields\", \"physicalName\", each try Record.Field([metadata], \"delta.columnMapping.physicalName\") otherwise [name], type text),", - " #\"Changed Type\" = Table.TransformColumnTypes(#\"Added physicalName\",{{\"name\", type text}, {\"nullable\", type logical}}),", - " #\"Added isPartitionedBy\" = Table.Buffer(Table.AddColumn(#\"Changed Type\", \"isPartitionedBy\", each List.Contains([partitionColumns], [name]), Logical.Type)),", - " #\"Added PBI_Text\" = Table.AddColumn(#\"Added isPartitionedBy\", \"PBI_Text\", each fn_GetPowerBIDataTypeInformation([type], false, [nullable]), type text),", - " #\"Added PBI_DataType\" = Table.AddColumn(#\"Added PBI_Text\", \"PBI_DataType\", each Expression.Evaluate(\"type \" & [PBI_Text], PQ_DataTypes), type type),", - " #\"Added PBI_Transformation\" = Table.AddColumn(#\"Added PBI_DataType\", \"PBI_Transformation\", each ", - " if [type] = \"string\" then Text.From", - " else if [type] = \"long\" then Int64.From", - " else if [type] = \"integer\" then Int32.From", - " else if [type] = \"short\" then Int16.From", - " else if [type] = \"byte\" then Int8.From", - " else if [type] = \"float\" then Single.From", - " else if [type] = \"double\" then Double.From", - " else if [type] = \"date\" then Date.From", - " else if [type] = \"timestamp\" and TimeZoneOffset = null then DateTime.From", - " else if [type] = \"timestamp\" and TimeZoneOffset <> null then (x) as nullable datetimezone => DateTime.AddZone(DateTime.From(x) + TimeZoneOffsetDuration, Duration.Hours(TimeZoneOffsetDuration), Duration.Minutes(TimeZoneOffsetDuration))", - " else if [type] = \"boolean\" then Logical.From", - " else if [type] = \"binary\" then Binary.From", - " else if (Value.Is([type], type text) and Text.StartsWith([type], \"decimal\")) then Number.From", - " else (x) as nullable any => x, type function),", - " #\"Added physicalPBI_Text\" = Table.AddColumn(#\"Added PBI_Transformation\", \"physicalPBI_Text\", each fn_GetPowerBIDataTypeInformation([type], true, [nullable]), type text),", - " #\"Added physicalPBI_DataType\" = Table.AddColumn(#\"Added physicalPBI_Text\", \"physicalPBI_DataType\", each Expression.Evaluate(\"type \" & [physicalPBI_Text], PQ_DataTypes), type type),", - " #\"Added ChangeDataType\" = Table.AddColumn(#\"Added physicalPBI_DataType\", \"ChangeDataType\", each {[name], [PBI_DataType]}, type list),", - " #\"Added TableDataType\" = Table.AddColumn(#\"Added ChangeDataType\", \"TableDataType\", each \"#\"\"\" & [name] & \"\"\"=\" & Text.From([PBI_Text]), type text),", - " #\"Added PhysicalTableDataType\" = Table.AddColumn(#\"Added TableDataType\", \"PhysicalTableDataType\", each \"#\"\"\" & [physicalName] & \"\"\"=\" & Text.From([PBI_Text]), type text),", - " #\"Added ColumnTransformation\" = Table.AddColumn(#\"Added PhysicalTableDataType\", \"ColumnTransformation\", each {[physicalName], [PBI_Transformation]}, type list),", - " #\"Buffered Fields\" = Table.Buffer(#\"Added ColumnTransformation\")", - " in", - " #\"Buffered Fields\",", - "", - " fn_AddColumnsToTable = ", - " (cols as record, tbl as table) as table =>", - " let ", - " colName = List.First(Record.FieldNames(cols)),", - " cols_new = Record.RemoveFields(cols, colName),", - " tbl_new = Table.AddColumn(tbl, colName, (x) => Record.Field(cols, colName), Value.Type(Record.Field(cols, colName))),", - "", - " ret = if Record.FieldCount(cols) = 0 then tbl else if Record.FieldCount(cols_new) = 0 then tbl_new else @fn_AddColumnsToTable(cols_new, tbl_new)", - " in", - " ret,", - "", - " #\"Files with Stats\" = ", - " let", - " Source = #\"Logs ALL\",", - " #\"Added Counter\" = Table.AddColumn(Source, \"Counter\", each if [remove] <> null then -1 else if [add] <> null then 1 else null, Int8.Type),", - " #\"Added file_name\" = Table.AddColumn(#\"Added Counter\", \"file_name\", each if [add] <> null then Record.Field([add], \"path\") else if [remove] <> null then Record.Field([remove], \"path\") else null, Text.Type),", - " #\"Filtered Rows\" = Table.SelectRows(#\"Added file_name\", each ([file_name] <> null)),", - " #\"URI Decoded\" = Table.TransformColumns(#\"Filtered Rows\",{{\"file_name\", fn_URIDecode, type text}}),", - " #\"Added partitionValuesTable\" = Table.AddColumn(#\"URI Decoded\", \"partitionValuesTable\", each if [add] <> null then if Value.Is(Record.Field([add], \"partitionValues\"), Record.Type) then Record.ToTable(Record.Field([add], \"partitionValues\")) else Table.RenameColumns(Record.Field([add], \"partitionValues\"), {\"Key\", \"Name\"}) else null, type nullable table),", - " #\"Added partitionValuesJSON\" = Table.AddColumn(#\"Added partitionValuesTable\", \"partitionValuesJSON\", each Text.FromBinary(Json.FromValue([partitionValuesTable]))),", - " #\"Added stats\" = Table.AddColumn(#\"Added partitionValuesJSON\", \"stats\", each if [add] <> null and Record.HasFields([add], \"stats\") and Value.Is(Record.Field([add], \"stats\"), type text) ", - " then Record.Field([add], \"stats\") ", - " else null, type text),", - " #\"Grouped Rows1\" = Table.Group(#\"Added stats\", {\"file_name\"}, {{\"partitionValuesJSON\", each List.Max([partitionValuesJSON]), type nullable text}, {\"stats\", each List.Max([stats]), type nullable text}, {\"isRelevant\", each List.Sum([Counter]), type nullable text}}),", - " #\"Relevant Files\" = Table.SelectRows(#\"Grouped Rows1\", each ([isRelevant] > 0)),", - " #\"Added partitionValuesTable2\" = Table.AddColumn(#\"Relevant Files\", \"partitionValuesTable\", each try Table.FromRecords(Json.Document([partitionValuesJSON])) otherwise null),", - " #\"Added partitionValuesRecord\" = Table.AddColumn(#\"Added partitionValuesTable2\", \"partitionValuesRecord\", each Record.TransformFields(Record.FromTable([partitionValuesTable]), Table.SelectRows(#\"metadata_columns\", each [isPartitionedBy] = true)[ColumnTransformation]), Expression.Evaluate(\"type [\" & Text.Combine(Table.SelectRows(#\"metadata_columns\", each [isPartitionedBy] = true)[TableDataType], \", \") & \"]\", PQ_DataTypes)),", - " #\"Expanded partitionValuesRecord\" = Table.ExpandRecordColumn(#\"Added partitionValuesRecord\", \"partitionValuesRecord\", Table.SelectRows(#\"metadata_columns\", each [isPartitionedBy] = true)[physicalName]),", - " #\"Renamed for Filters\" = Table.RenameColumns(#\"Expanded partitionValuesRecord\",Table.ToRows(Table.SelectColumns(Table.SelectRows(metadata_columns, each [isPartitionedBy]),{\"physicalName\", \"name\"}))),", - " #\"Apply PartitionFilterFunction\" = Table.SelectRows(#\"Renamed for Filters\", each PartitionFilterFunction(_)),", - " #\"Parse stats to JSON\" = Table.AddColumn(#\"Apply PartitionFilterFunction\", \"JSON\", each if [stats] = null then null else Json.Document([stats]), type [minValues=list, maxValues=list, numRecords=Int64.Type, nullCount=Int64.Type]),", - " #\"Expanded Stats\" = Table.ExpandRecordColumn(#\"Parse stats to JSON\", \"JSON\", {\"minValues\", \"maxValues\", \"numRecords\", \"nullCount\"}, {\"minValues\", \"maxValues\", \"numRecords\", \"nullCount\"}),", - " #\"Removed Columns\" = Table.RemoveColumns(#\"Expanded Stats\",{\"partitionValuesJSON\", \"stats\", \"isRelevant\", \"partitionValuesTable\"}),", - " #\"Apply StatsFilterFunction\" = Table.SelectRows(#\"Removed Columns\", each StatsFilterFunction([minValues], [maxValues])),", - " #\"Renamed to physicalNames\" = Table.RenameColumns(#\"Apply StatsFilterFunction\",Table.ToRows(Table.SelectColumns(Table.SelectRows(metadata_columns, each [isPartitionedBy]),{\"name\", \"physicalName\"})))", - " in", - " #\"Renamed to physicalNames\",", - "", - " #\"Data\" = ", - " let", - " #\"Added Full_Path\" = Table.AddColumn(#\"Files with Stats\", \"Full_Path\", each Text.Replace(DeltaTablePath & [file_name], \"/\", Delimiter), Text.Type),", - " #\"Removed FilteringColumns\" = Table.RemoveColumns(#\"Added Full_Path\",{\"file_name\", \"minValues\", \"maxValues\", \"numRecords\", \"nullCount\"}),", - " #\"Buffered RelevantFiles\" = Table.Buffer(#\"Removed FilteringColumns\"),", - " #\"Merged Queries\" = Table.NestedJoin(#\"Buffered RelevantFiles\", {\"Full_Path\"}, DeltaTableFolderContent_wFullPath, {\"Full_Path\"}, \"DeltaTable Folder\", JoinKind.Inner),", - " #\"Removed Full_Path\" = Table.RemoveColumns(#\"Merged Queries\",{\"Full_Path\"}),", - " #\"Expanded DeltaTable Folder\" = Table.ExpandTableColumn(#\"Removed Full_Path\", \"DeltaTable Folder\", {\"Content\"}, {\"Content\"}),", - " BufferFile = if UseFileBuffer then Table.TransformColumns(#\"Expanded DeltaTable Folder\",{{\"Content\", Binary.Buffer}}) else #\"Expanded DeltaTable Folder\",", - " #\"Read Parquet\" = Table.AddColumn(BufferFile, \"Data\", each Parquet.Document([Content]), type table),", - " #\"Removed Binary Column\" = Table.RemoveColumns(#\"Read Parquet\",{\"Content\"}),", - " #\"Combine Partition Values\" = Table.CombineColumnsToRecord(#\"Removed Binary Column\", \"cols\", List.RemoveItems(Table.ColumnNames(#\"Removed Binary Column\"), {\"Data\"})),", - " #\"Combine Files\" = Table.Combine(Table.TransformRows(#\"Combine Partition Values\", each fn_AddColumnsToTable(_[cols], _[Data])), PhysicalTableSchema),", - " #\"Changed Type\" = Table.TransformColumns(#\"Combine Files\",Table.SelectRows(metadata_columns, each [type] = \"timestamp\")[ColumnTransformation]),", - " #\"Table with TimeZoneOffset\" = if TimeZoneOffset = null then #\"Combine Files\" else #\"Changed Type\",", - " #\"Reordered Columns\" = Table.ReorderColumns(#\"Table with TimeZoneOffset\", metadata_columns[physicalName]),", - " #\"Renamed Columns\" = Table.RenameColumns(#\"Reordered Columns\",Table.ToRows(Table.SelectColumns(metadata_columns,{\"physicalName\", \"name\"}))),", - " #\"Renamed ComplexTypes\" = #\"Renamed Columns\" //Table.TransformColumnTypes(#\"Renamed Columns\",Table.ToRows(Table.SelectColumns(Table.SelectRows(metadata_columns, each [name] = \"structColumn\"),{\"name\", \"PBI_DataType\"})))", - " //Table.TransformColumnTypes(#\"Renamed Columns\",Table.ToRows(Table.SelectColumns(Table.SelectRows(metadata_columns, each [name] = \"structColumn\"),{\"name\", \"PBI_DataType\"})))", - " ,", - "", - " #\"Validate ReaderVersion\" = if DeltaProtocol{0}[minReaderVersion] <= 2 then #\"Renamed ComplexTypes\" else error Error.Record(\"DeltaLakeVersionNotSupported\", \"This Connector currently only supports DeltaLake tables up to version 2.\", \"minReaderVersion\"),", - " FinalDeltaTable = Table.View(", - " #\"Validate ReaderVersion\", ", - " [", - " GetType = () => TableSchema,", - " GetRowCount = () => List.Sum(#\"Files with Stats\"[numRecords])", - " //,OnSelectRows = (condition) => Table.FirstN(#\"Reordered Columns\", 3)", - " ]", - " )", - " in", - " FinalDeltaTable", - " ", - " in ", - " #\"Data\",", - "", - " documentation = [", - " Documentation.Name = \"fn_ReadDeltaTable\",", - " Documentation.Description = \"Takes the file/folder list of a Delta Lake table and returns the content as a table object in Power Query.\",", - " Documentation.LongDescription = \"Takes the file/folder list of a Delta Lake table and returns the content as a table object in Power Query. An optional 2nd parameter can be used to for special features like Time Travel, Partition Elimination, etc.\",", - " Documentation.Category = \"Table\",", - " Documentation.Source = \"https://github.com/delta-io/connectors/blob/master/powerbi/fn_ReadDeltaTable.pq\",", - " Documentation.Version = \"1.0\",", - " Documentation.Author = \"Gerhard Brueckl, paiqo GmbH\",", - " Documentation.Examples = {[Description = \"Reading Delta Lake table from Azure Blob Storage with Time-Travel\",", - " Code = \"let", - " Source = AzureStorage.Blobs(\"\"https://gbadls01.blob.core.windows.net/public\"\"),", - " #\"\"Filtered Rows\"\" = Table.SelectRows(Source, each Text.StartsWith([Name], \"\"powerbi_delta/FactInternetSales_part.delta/\"\")),", - " DeltaTable = fn_ReadDeltaTable(#\"\"Filtered Rows\"\", [Version=7])", - "in", - " DeltaTable\",", - " Result = \"#table( {\"\"ProductKey\"\", \"\"OrderDateKey\"\", \"\"Value\"\"}, { {\"\"A\"\", \"\"2020-01-01\"\", 123} ,{\"\"B\"\", \"\"2020-04-02\"\", 45} } )\"],", - " ", - " [Description = \"Reading Delta Lake table from Azure Data Lake Storage Gen2 with PartitionFilterFunction\",", - " Code = \"let", - " Source = AzureStorage.DataLake(\"\"https://gbadls01.dfs.core.windows.net/public/powerbi_delta/FactInternetSales_part.delta\"\", [HierarchicalNavigation = false]),", - " DeltaTable = fn_ReadDeltaTable(Source, [PartitionFilterFunction=(x) => x[SalesTerritoryKey] = 3])", - "in", - " DeltaTable\",", - " Result = \"#table( {\"\"ProductKey\"\", \"\"OrderDateKey\"\", \"\"SalesTerritoryKey\"\", \"\"Value\"\"}, { {\"\"A\"\", \"\"2020-01-01\"\", 3, 123} ,{\"\"B\"\", \"\"2020-04-02\"\", 3, 45} } )\"]", - " }", - " ]", - " ", - "in", - " Value.ReplaceType(fn_ReadDeltaTable, Value.ReplaceMetadata(Value.Type(fn_ReadDeltaTable), documentation))" - ], - "kind": "m", - "lineageTag": "aea6a379-0936-41f5-ae0d-e296735fff61" - }, - { - "name": "Delimiter", - "annotations": [ - { - "name": "PBI_ResultType", - "value": "Text" - }, - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " Delimiter = if Text.Contains(DeltaTableFolderContent{0}[Folder Path], \"//\") then \"/\" else \"\\\"", - "in", - " Delimiter" - ], - "kind": "m", - "lineageTag": "9f25f3e3-6196-4e00-b95c-f97a3ce57f42", - "queryGroup": "FunctionSteps" - }, - { - "name": "Content_ADLS_DimProduct", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = AzureStorage.DataLake(\"https://gbadls01.dfs.core.windows.net/public/powerbi_delta/DimProduct.delta\", [HierarchicalNavigation = false])", - "in", - " Source" - ], - "kind": "m", - "lineageTag": "2fbbb105-4ca4-4768-8c08-303defd25505", - "queryGroup": "Sources" - }, - { - "name": "Content_LocalFolder", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = Folder.Files(\"D:\\Desktop\\dataset\")", - "in", - " Source" - ], - "kind": "m", - "lineageTag": "f4c0e45e-b729-47d2-b357-a089f88390b8", - "queryGroup": "Sources" - }, - { - "name": "DeltaTableFolderContent", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = #\"Content_ADLS_BugBrackets\"", - "in", - " Source" - ], - "kind": "m", - "lineageTag": "951947f4-a85f-4416-8d37-414234d671bc", - "queryGroup": "FunctionParameters" - }, - { - "name": "DeltaTableVersion", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Number" - } - ], - "expression": [ - "let", - " Source = if DeltaTableOptions = null then null else Record.FieldOrDefault(DeltaTableOptions, \"Version\", null)", - "in", - " Source" - ], - "kind": "m", - "lineageTag": "b62391f5-7729-4aaa-a9ee-98e52ad2b076", - "queryGroup": "FunctionSteps" - }, - { - "name": "DeltaTableOptions", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Record" - } - ], - "expression": [ - "let", - " Source = [", - " PartitionFilterFunction = Option_PartitionFilterFunction, ", - " StatsFilterFunction = Option_StatsFilterFunction, ", - " Version=Option_Version, UseFileBuffer=Option_UseFileBuffer, ", - " IterateFolderContent = Option_IterateFolderContent, ", - " TimeZoneOffset = Option_TimeZoneOffset]", - "in", - " Source" - ], - "kind": "m", - "lineageTag": "6b64a5e5-ef9d-49d0-b5e8-ccb6a457469f", - "queryGroup": "FunctionParameters" - }, - { - "name": "DeltaTableFolderContent_wFullPath", - "annotations": [ - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = DeltaTableFolderContent,", - "", - " fn_ReadContentRecursive = (tbl as table) as table => ", - " let", - " subFolders = Table.SelectRows(tbl, each Value.Is(_[Content], type table)),", - " binaries = Table.SelectRows(tbl, each Value.Is(_[Content], type binary)),", - " combinedContent = if Table.RowCount(subFolders) > 0 then Table.Combine({binaries, @fn_ReadContentRecursive(Table.Combine(subFolders[Content]))}) else binaries", - " in", - " combinedContent,", - "", - " Content = if IterateFolderContent then fn_ReadContentRecursive(Source) else Source,", - "", - " #\"Added Full_Path\" = Table.AddColumn(Content, \"Full_Path\", each fn_URIDecode([Folder Path]) & [Name], Text.Type),", - " #\"Added File_Name\" = Table.AddColumn(#\"Added Full_Path\", \"File_Name\", each if Text.Length([Extension]) > 0 then List.Last(Text.Split([Full_Path], Delimiter)) else null, type text),", - " Buffered = Table.Buffer(#\"Added File_Name\")", - "in", - " Buffered" - ], - "kind": "m", - "lineageTag": "5b1f7eb4-0b54-4495-91eb-27e55a184b10", - "queryGroup": "FunctionSteps" - }, - { - "name": "Content_Blob_part", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = AzureStorage.Blobs(\"https://gbadls01.blob.core.windows.net/public\"),", - " #\"Filtered Rows\" = Table.SelectRows(Source, each Text.StartsWith([Name], \"powerbi_delta/FactInternetSales_part.delta\"))", - "in", - " #\"Filtered Rows\"" - ], - "kind": "m", - "lineageTag": "f17e5223-fd3a-4a22-addf-820c842539cf", - "queryGroup": "Sources" - }, - { - "name": "Content_ADLS_FactInternetSales_part", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = AzureStorage.DataLake(\"https://gbadls01.dfs.core.windows.net/public/powerbi_delta/FactInternetSales_part.delta\", [HierarchicalNavigation = false])", - "in", - " Source" - ], - "kind": "m", - "lineageTag": "5c70820a-38aa-4bc8-aaea-7b4022d09f87", - "queryGroup": "Sources" - }, - { - "name": "Option_PartitionFilterFunction", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Function" - } - ], - "expression": [ - "(", - " PartitionValues as record", - ") as logical =>", - "", - "//Record.Field(PartitionValues, \"SalesTerritoryKey\") <= 3", - "//Record.Field(PartitionValues, \"partRenamed\") = \"A\"", - "true" - ], - "kind": "m", - "lineageTag": "ea976c34-e7e8-443f-b8ec-bfd1e2bfdf2c", - "queryGroup": "FunctionParameters\\Options" - }, - { - "name": "PartitionFilterFunction", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Function" - } - ], - "expression": [ - "let", - " PartitionFilterFunction = if DeltaTableOptions = null then (x) => true else if Record.FieldOrDefault(DeltaTableOptions, \"PartitionFilterFunction\", null) = null then (x) => true else Record.Field(DeltaTableOptions, \"PartitionFilterFunction\")", - "in ", - " PartitionFilterFunction" - ], - "kind": "m", - "lineageTag": "7bb8c117-853e-4b72-a8f6-0b667b5b03f3", - "queryGroup": "FunctionSteps" - }, - { - "name": "Option_Version", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Null" - } - ], - "expression": "null", - "kind": "m", - "lineageTag": "5794edba-f3f1-400b-b904-c56c371c0654", - "queryGroup": "FunctionParameters\\Options" - }, - { - "name": "UseFileBuffer", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Logical" - } - ], - "expression": "if DeltaTableOptions = null then false else if Record.FieldOrDefault(DeltaTableOptions, \"UseFileBuffer\", null) = null then false else Record.Field(DeltaTableOptions, \"UseFileBuffer\")", - "kind": "m", - "lineageTag": "9439573b-2f9b-4454-9951-f020aa3592d5", - "queryGroup": "FunctionSteps" - }, - { - "name": "IterateFolderContent", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Logical" - } - ], - "expression": "if DeltaTableOptions = null then false else if Record.FieldOrDefault(DeltaTableOptions, \"IterateFolderContent\", null) = null then false else Record.Field(DeltaTableOptions, \"IterateFolderContent\")", - "kind": "m", - "lineageTag": "3bbe61aa-ac8e-407d-ab32-e0e80445cb4e", - "queryGroup": "FunctionSteps" - }, - { - "name": "Content_ADLS_FactInternetSales_part_Hierarchical", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = AzureStorage.DataLake(\"https://gbadls01.dfs.core.windows.net/public/powerbi_delta/FactInternetSales_part.delta\", [HierarchicalNavigation = true])", - "in", - " Source" - ], - "kind": "m", - "lineageTag": "986359ce-3c42-4d7d-bced-817bee521bb4", - "queryGroup": "Sources" - }, - { - "name": "Option_UseFileBuffer", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Null" - } - ], - "expression": "null", - "kind": "m", - "lineageTag": "42d7ea54-24e4-40d6-af0d-1b01b825f646", - "queryGroup": "FunctionParameters\\Options" - }, - { - "name": "Option_IterateFolderContent", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Null" - } - ], - "expression": "null", - "kind": "m", - "lineageTag": "2485ecd5-1afc-4ed7-bcc5-b49416f90eca", - "queryGroup": "FunctionParameters\\Options" - }, - { - "name": "Option_TimeZoneOffset", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Text" - } - ], - "expression": "\"+02:00\"", - "kind": "m", - "lineageTag": "0aa7945f-5632-404d-832a-190b1b86260b", - "queryGroup": "FunctionParameters\\Options" - }, - { - "name": "TimeZoneOffset", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Text" - } - ], - "expression": "if DeltaTableOptions = null then null else Record.FieldOrDefault(DeltaTableOptions, \"TimeZoneOffset\", null)", - "kind": "m", - "lineageTag": "f61dcfe0-d140-4644-8cf2-0477d716d1a5", - "queryGroup": "FunctionSteps" - }, - { - "name": "TimeZoneOffsetDuration", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Duration" - } - ], - "expression": "Duration.FromText(Text.TrimStart(TimeZoneOffset, \"+\"))", - "kind": "m", - "lineageTag": "f634c047-1f7b-4d83-b1f3-a20b7159d7f4", - "queryGroup": "FunctionSteps" - }, - { - "name": "Option_StatsFilterFunction", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Function" - } - ], - "expression": [ - "(", - " MinValues as nullable record,", - " MaxValues as nullable record", - ") as logical =>", - "", - "//Record.Field(MinValues, \"ProductKey\") <= 215", - "true" - ], - "kind": "m", - "lineageTag": "49991d54-e0bf-41d8-8eda-ccd894f39167", - "queryGroup": "FunctionParameters\\Options" - }, - { - "name": "StatsFilterFunction", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " StatsFilterFunction = if DeltaTableOptions = null then (x) => true else if Record.FieldOrDefault(DeltaTableOptions, \"StatsFilterFunction\", null) = null then (x) => true else Record.Field(DeltaTableOptions, \"StatsFilterFunction\")", - "in ", - " StatsFilterFunction" - ], - "kind": "m", - "lineageTag": "8442a0be-0bf0-43be-9967-89e8f9248604", - "queryGroup": "FunctionSteps" - }, - { - "name": "fn_AddColumnsToTable", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " fn_AddColumnsToTable = ", - " (cols as record, tbl as table) as table =>", - " let ", - " colName = List.First(Record.FieldNames(cols)),", - " cols_new = Record.RemoveFields(cols, colName),", - " tbl_new = Table.AddColumn(tbl, colName, (x) => Record.Field(cols, colName), Value.Type(Record.Field(cols, colName))),", - "", - " ret = if Record.FieldCount(cols) = 0 then tbl else if Record.FieldCount(cols_new) = 0 then tbl_new else @fn_AddColumnsToTable(cols_new, tbl_new)", - " in", - " ret", - "in", - " fn_AddColumnsToTable" - ], - "kind": "m", - "lineageTag": "9656a0e9-5899-483a-bbd4-58e7fb576c31", - "queryGroup": "FunctionSteps" - }, - { - "name": "Content_Blob_BasicDataTypes", - "expression": [ - "let", - " Source = AzureStorage.Blobs(\"https://gbadls01.blob.core.windows.net/public\"),", - " #\"Filtered Rows\" = Table.SelectRows(Source, each Text.StartsWith([Name], \"/powerbi_delta/AllBasicDatatypes.delta/\"))", - "in", - " #\"Filtered Rows\"" - ], - "kind": "m", - "lineageTag": "aca7bde4-404d-43e9-9cf3-769c52c18481", - "queryGroup": "Sources" - }, - { - "name": "Content_Blob_AllDataTypes", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " Source = AzureStorage.Blobs(\"https://gbadls01.blob.core.windows.net/public\"),", - " #\"Filtered Rows\" = Table.SelectRows(Source, each Text.StartsWith([Name], \"/powerbi_delta/AllDatatypes.delta/\"))", - "in", - " #\"Filtered Rows\"" - ], - "kind": "m", - "lineageTag": "d08cd582-bce8-4b34-803b-1a4af69d7a4c", - "queryGroup": "Sources" - }, - { - "name": "Content_Blob_BasicDataTypes_Combine", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " Source = Content_Blob_BasicDataTypes,", - " #\"Filtered Rows\" = Table.SelectRows(Source, each ([Extension] = \".parquet\")),", - " #\"Removed Other Columns\" = Table.SelectColumns(#\"Filtered Rows\",{\"Content\", \"Date modified\", \"Name\"}),", - " #\"Added Custom\" = Table.AddColumn(#\"Removed Other Columns\", \"Data\", each Parquet.Document([Content]), type table),", - " #\"Removed Columns\" = Table.RemoveColumns(#\"Added Custom\",{\"Content\"}),", - " x = Table.CombineColumnsToRecord(#\"Removed Columns\", \"cols\", List.RemoveItems(Table.ColumnNames(#\"Removed Columns\"), {\"Data\"}))", - "in", - " x" - ], - "kind": "m", - "lineageTag": "2ebbaf05-8ff6-4161-a397-1a5835f37c3e", - "queryGroup": "Sources" - }, - { - "name": "Steps_fn_AddColumnsToTable", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = (cols as record, tbl as table) => 1,", - " cols1 = Content_Blob_BasicDataTypes_Combine{0}[cols],", - " tbl1 = Content_Blob_BasicDataTypes_Combine{0}[Data],", - "", - " rec_AddColumnToTable = ", - " (cols as record, tbl as table) as table =>", - " let ", - " colName = List.First(Record.FieldNames(cols)),", - " cols_new = Record.RemoveFields(cols, colName),", - " tbl_new = Table.AddColumn(tbl, colName, (x) => Record.Field(cols, colName), Value.Type(Record.Field(cols, colName))),", - "", - " ret = if Record.FieldCount(cols_new) = 0 then tbl_new else @rec_AddColumnToTable(cols_new, tbl_new)", - " in", - " ret,", - "", - " ret = List.Last(List.Generate(", - " () => [cols=cols1, tbl=tbl1],", - " each Record.FieldCount(_[cols]) > 0,", - " (item) => ", - " let", - " ", - " in", - " [", - " cols = Record.RemoveFields(item[cols], colName),", - " tbl = Table.AddColumn(item[tbl], colName, (x) => Record.Field(item[cols], colName), Type.RecordFields())", - " ],", - " each _[tbl]", - " )),", - "", - " ret_rec = rec_AddColumnToTable(cols1, tbl1)", - "in", - " ret_rec" - ], - "kind": "m", - "lineageTag": "9ebb45b6-4de6-4276-8acd-ec7c45b29fae", - "queryGroup": "UI_Filtering" - }, - { - "name": "TableSchema", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " ExpressionText = \"type table [\" & Text.Combine(metadata_columns[TableDataType], \", \") & \"]\",", - " BufferedExpression = List.Buffer({ExpressionText}){0},", - " TableSchema = Expression.Evaluate(BufferedExpression, PQ_DataTypes)", - "in", - " TableSchema" - ], - "kind": "m", - "lineageTag": "5468bbcd-63e9-4dc6-b0e5-532249225dd1", - "queryGroup": "FunctionSteps" - }, - { - "name": "OnSelectRows_Selector", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Record" - } - ], - "expression": [ - "let", - " condition = RowExpression.From(each [SalesTerritoryKey] = 3 or 1 = 3)", - "in", - " condition" - ], - "kind": "m", - "lineageTag": "56971686-8779-4ab4-ab71-2f7334e5bfe8", - "queryGroup": "UI_Filtering" - }, - { - "name": "Files with Stats", - "annotations": [ - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = #\"Logs ALL\",", - " #\"Added Counter\" = Table.AddColumn(Source, \"Counter\", each if [remove] <> null then -1 else if [add] <> null then 1 else null, Int8.Type),", - " #\"Added file_name\" = Table.AddColumn(#\"Added Counter\", \"file_name\", each if [add] <> null then Record.Field([add], \"path\") else if [remove] <> null then Record.Field([remove], \"path\") else null, Text.Type),", - " #\"Filtered Rows\" = Table.SelectRows(#\"Added file_name\", each ([file_name] <> null)),", - " #\"URI Decoded\" = Table.TransformColumns(#\"Filtered Rows\",{{\"file_name\", fn_URIDecode, type text}}),", - " #\"Added partitionValuesTable\" = Table.AddColumn(#\"URI Decoded\", \"partitionValuesTable\", each if [add] <> null then if Value.Is(Record.Field([add], \"partitionValues\"), Record.Type) then Record.ToTable(Record.Field([add], \"partitionValues\")) else Table.RenameColumns(Record.Field([add], \"partitionValues\"), {\"Key\", \"Name\"}) else null, type nullable table),", - " #\"Added partitionValuesJSON\" = Table.AddColumn(#\"Added partitionValuesTable\", \"partitionValuesJSON\", each Text.FromBinary(Json.FromValue([partitionValuesTable]))),", - " #\"Added stats\" = Table.AddColumn(#\"Added partitionValuesJSON\", \"stats\", each if [add] <> null and Record.HasFields([add], \"stats\") and Value.Is(Record.Field([add], \"stats\"), type text) ", - " then Record.Field([add], \"stats\") ", - " else null, type text),", - " #\"Grouped Rows1\" = Table.Group(#\"Added stats\", {\"file_name\"}, {{\"partitionValuesJSON\", each List.Max([partitionValuesJSON]), type nullable text}, {\"stats\", each List.Max([stats]), type nullable text}, {\"isRelevant\", each List.Sum([Counter]), type nullable text}}),", - " #\"Relevant Files\" = Table.SelectRows(#\"Grouped Rows1\", each ([isRelevant] > 0)),", - " #\"Added partitionValuesTable2\" = Table.AddColumn(#\"Relevant Files\", \"partitionValuesTable\", each try Table.FromRecords(Json.Document([partitionValuesJSON])) otherwise null),", - " #\"Added partitionValuesRecord\" = Table.AddColumn(#\"Added partitionValuesTable2\", \"partitionValuesRecord\", each Record.TransformFields(", - "Record.FromTable([partitionValuesTable]), Table.SelectRows(#\"metadata_columns\", each [isPartitionedBy] = true)[ColumnTransformation]), Expression.Evaluate(\"type [\" & Text.Combine(Table.SelectRows(#\"metadata_columns\", each [isPartitionedBy] = true)[TableDataType], \", \") & \"]\", PQ_DataTypes)),", - " #\"Expanded partitionValuesRecord\" = Table.ExpandRecordColumn(#\"Added partitionValuesRecord\", \"partitionValuesRecord\", Table.SelectRows(#\"metadata_columns\", each [isPartitionedBy] = true)[physicalName]),", - " #\"Renamed for Filters\" = Table.RenameColumns(#\"Expanded partitionValuesRecord\",Table.ToRows(Table.SelectColumns(Table.SelectRows(metadata_columns, each [isPartitionedBy]),{\"physicalName\", \"name\"}))),", - " #\"Apply PartitionFilterFunction\" = Table.SelectRows(#\"Renamed for Filters\", each PartitionFilterFunction(_)),", - " #\"Parse stats to JSON\" = Table.AddColumn(#\"Apply PartitionFilterFunction\", \"JSON\", each if [stats] = null then null else Json.Document([stats]), type [minValues=list, maxValues=list, numRecords=Int64.Type, nullCount=Int64.Type]),", - " #\"Expanded Stats\" = Table.ExpandRecordColumn(#\"Parse stats to JSON\", \"JSON\", {\"minValues\", \"maxValues\", \"numRecords\", \"nullCount\"}, {\"minValues\", \"maxValues\", \"numRecords\", \"nullCount\"}),", - " #\"Removed Columns\" = Table.RemoveColumns(#\"Expanded Stats\",{\"partitionValuesJSON\", \"stats\", \"isRelevant\", \"partitionValuesTable\"}),", - " #\"Apply StatsFilterFunction\" = Table.SelectRows(#\"Removed Columns\", each StatsFilterFunction([minValues], [maxValues])),", - " #\"Renamed to physicalNames\" = Table.RenameColumns(#\"Apply StatsFilterFunction\",Table.ToRows(Table.SelectColumns(Table.SelectRows(metadata_columns, each [isPartitionedBy]),{\"name\", \"physicalName\"})))", - "in", - " #\"Renamed to physicalNames\"" - ], - "kind": "m", - "lineageTag": "b7a52ea1-e764-4895-8536-83293d65ec63", - "queryGroup": "FunctionSteps" - }, - { - "name": "Content_ADLS_DimProduct_Clone", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " Source = AzureStorage.DataLake(\"https://gbadls01.dfs.core.windows.net/public/powerbi_delta/DimProduct_clone.delta\", [HierarchicalNavigation = false])", - "in", - " Source" - ], - "kind": "m", - "lineageTag": "f70e1210-84b4-4279-9759-4739dec01139", - "queryGroup": "Sources" - }, - { - "name": "Content_Blob_DimProduct_Clone", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " Source = AzureStorage.Blobs(\"https://gbadls01.blob.core.windows.net/public\"),", - " #\"Filtered Rows\" = Table.SelectRows(Source, each Text.StartsWith([Name], \"powerbi_delta/DimProduct_clone.delta\"))", - "in", - " #\"Filtered Rows\"" - ], - "kind": "m", - "lineageTag": "a8441d5d-352b-485f-bffa-789c3218dc4d", - "queryGroup": "Sources" - }, - { - "name": "Content_Blob_DimProduct_ShallowClone", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " Source = AzureStorage.Blobs(\"https://gbadls01.blob.core.windows.net/public\"),", - " #\"Filtered Rows\" = Table.SelectRows(Source, each Text.StartsWith([Name], \"powerbi_delta/DimProduct_shallow.delta\"))", - "in", - " #\"Filtered Rows\"" - ], - "kind": "m", - "lineageTag": "a1ce3a4f-a016-4501-abe5-27cf3c65bfc5", - "queryGroup": "Sources" - }, - { - "name": "LogSchema", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " LogSchema = type [txn=record, add=record, remove=record, metaData=record, commitInfo=record, protocol=record]", - "in", - " LogSchema" - ], - "kind": "m", - "lineageTag": "df6acb50-eddc-45df-8dfd-3f8b7d900430", - "queryGroup": "FunctionSteps" - }, - { - "name": "Content_ADLS_DimProduct_ShallowClone", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " Source = AzureStorage.DataLake(\"https://gbadls01.dfs.core.windows.net/public/powerbi_delta/DimProduct_shallow.delta\", [HierarchicalNavigation = false])", - "in", - " Source" - ], - "kind": "m", - "lineageTag": "5243d99f-a8a9-4ecd-9c45-a87668bf3390", - "queryGroup": "Sources" - }, - { - "name": "fn_GetPowerBIDataTypeInformation", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " fn_GetPowerBIDataTypeInformation = ", - " (type_value as any, physical_name as logical, optional is_nullable as nullable logical) as text =>", - " let ", - " par_is_nullable = if is_nullable = null then true else is_nullable,", - "", - " ret = if Value.Is(type_value, Record.Type) then ", - " if type_value[type] = \"struct\" then \"[\" & Text.Combine(List.Transform(type_value[fields], each \"#\"\"\" & (if(physical_name) then _[metadata][delta.columnMapping.physicalName] else _[name]) & \"\"\" = \" & @fn_GetPowerBIDataTypeInformation(_[type], physical_name, _[nullable])), \", \") & \"]\"", - " else if type_value[type] = \"array\" then \"{\" & @fn_GetPowerBIDataTypeInformation(type_value[elementType], physical_name, type_value[containsNull]) & \"}\"", - " else if type_value[type] = \"map\" then \"table [Key=\" & @fn_GetPowerBIDataTypeInformation(type_value[keyType], false) & \", Value=\" & @fn_GetPowerBIDataTypeInformation(type_value[valueType], physical_name, type_value[valueContainsNull]) & \"]\"", - " else \"Any.Type\"", - " else if type_value = \"string\" then \"Text.Type\"", - " else if type_value = \"long\" then \"Int64.Type\"", - " else if type_value = \"integer\" then \"Int32.Type\"", - " else if type_value = \"short\" then \"Int16.Type\"", - " else if type_value = \"byte\" then \"Int8.Type\"", - " else if type_value = \"float\" then \"Single.Type\"", - " else if type_value = \"double\" then \"Double.Type\"", - " else if type_value = \"date\" then \"Date.Type\"", - " else if type_value = \"timestamp\" and TimeZoneOffset = null then \"DateTime.Type\"", - " else if type_value = \"timestamp\" and TimeZoneOffset <> null then \"DateTimeZone.Type\"", - " else if type_value = \"boolean\" then \"Logical.Type\"", - " else if type_value = \"binary\" then \"Binary.Type\"", - " else if type_value = \"null\" then \"Any.Type\"", - " else if Text.StartsWith(type_value, \"decimal\") then \"Number.Type\" ", - " else \"Any.Type\",", - "", - " ret_nullable = (if par_is_nullable then \"nullable \" else \"\") & ret", - " in", - " ret_nullable", - "in", - " fn_GetPowerBIDataTypeInformation" - ], - "kind": "m", - "lineageTag": "252b720a-c58a-4735-b10c-12dff3670b71", - "queryGroup": "FunctionSteps" - }, - { - "name": "DeltaProtocol", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " Source = #\"Logs ALL\",", - " #\"Filtered Rows1\" = Table.SelectRows(Source, each ([protocol] <> null)),", - " MaxVersion = Table.Group(#\"Filtered Rows1\", {}, {{\"MaxVersion\", each List.Max([Version]), type number}}){0}[MaxVersion],", - " #\"Filtered Rows2\" = Table.SelectRows(#\"Filtered Rows1\", each [Version] = MaxVersion),", - " #\"Removed Other Columns\" = Table.SelectColumns(#\"Filtered Rows2\",{\"protocol\"}),", - " #\"Expanded protocol\" = Table.ExpandRecordColumn(#\"Removed Other Columns\", \"protocol\", {\"minReaderVersion\", \"minWriterVersion\"}, {\"minReaderVersion\", \"minWriterVersion\"}),", - " #\"Changed Type\" = Table.TransformColumnTypes(#\"Expanded protocol\",{{\"minReaderVersion\", Int64.Type}, {\"minWriterVersion\", Int64.Type}}),", - " #\"Renamed Columns\" = Table.Buffer(#\"Changed Type\")", - "in", - " #\"Renamed Columns\"" - ], - "kind": "m", - "lineageTag": "704f8b23-099b-4087-883a-0fa343106c48", - "queryGroup": "FunctionSteps" - }, - { - "name": "PhysicalTableSchema", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " ExpressionText = \"type table [\" & Text.Combine(metadata_columns[PhysicalTableDataType], \", \") & \"]\",", - " BufferedExpression = List.Buffer({ExpressionText}){0},", - " PhysicalTableSchema = Expression.Evaluate(BufferedExpression, PQ_DataTypes)", - "in", - " PhysicalTableSchema" - ], - "kind": "m", - "lineageTag": "cfa20de8-c42b-40d2-8130-dbe93a36a673", - "queryGroup": "FunctionSteps" - }, - { - "name": "Content_ColumnMapping_flat", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " Source = Folder.Files(\"D:\\Desktop\\powerbi_delta\\columnmapping_flat.delta\")", - "in", - " Source" - ], - "kind": "m", - "lineageTag": "00ad374a-5b82-45a4-96f8-d8ed82ec2072", - "queryGroup": "Sources" - }, - { - "name": "Content_ColumnMapping_complex", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "expression": [ - "let", - " Source = Folder.Files(\"D:\\Desktop\\powerbi_delta\\columnmapping_complex.delta\")", - "in", - " Source" - ], - "kind": "m", - "lineageTag": "7b3579d5-bc37-4e79-bb2c-35fdf77d4447", - "queryGroup": "Sources" - }, - { - "name": "SampleFiltering", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText(\"i45WMjIwMlTSUULgWB24oBEcQwVBHGM4RhI0gWOoIEiFKRzHxgIA\", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [p_year = _t, month = _t, day = _t, value = _t]),", - " #\"Changed Type\" = Table.TransformColumnTypes(Source,{{\"p_year\", Int64.Type}})", - "in", - " #\"Changed Type\"" - ], - "kind": "m", - "lineageTag": "271cc088-31e4-4363-bc28-83c769a3f355", - "queryGroup": "UI_Filtering" - }, - { - "name": "fn_test_UIFiltering", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " myFilterFunction = Table.View(", - " null,", - " [", - " GetType = () => Value.Type(SampleFiltering),", - " GetRows = () => SampleFiltering,", - " OnSelectRows = (selector) =>", - " let", - " condition = RowExpression.From(selector),", - "", - " result = Table.SelectRows(SampleFiltering, (_) => Record.Field(_, condition[Left][MemberName]) = condition[Right][Value]+1)", - " ", - " in", - " result", - " ] ", - " )", - "in ", - " myFilterFunction" - ], - "kind": "m", - "lineageTag": "05e530a8-a687-48be-8f6c-65afa8143734", - "queryGroup": "UI_Filtering" - }, - { - "name": "test_UIFiltering", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = fn_test_UIFiltering,", - " #\"Filtered Rows\" = Table.SelectRows(Source, each ([p_year] = 2022))", - "in", - " #\"Filtered Rows\"" - ], - "kind": "m", - "lineageTag": "36f3ccf9-4ac9-43ec-b182-61268b20e51b", - "queryGroup": "UI_Filtering" - }, - { - "name": "Content_Blob_with_file_name", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = AzureStorage.Blobs(\"https://gbadls01.blob.core.windows.net/public\"),", - " #\"Filtered Rows\" = Table.SelectRows(Source, each Text.StartsWith([Name], \"/powerbi_delta/table_with_file_name.delta/\"))", - "in", - " #\"Filtered Rows\"" - ], - "kind": "m", - "lineageTag": "70e9d438-742e-4c55-9ea4-09478a953f2c", - "queryGroup": "Sources" - }, - { - "name": "GoldenDatasetsRootPath", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Text" - } - ], - "expression": [ - "let", - " Source = \"D:\\SourceControl\\DeltaLake\\delta\\connectors\\golden-tables\\src\\main\\resources\\golden\"", - "in", - " Source" - ], - "kind": "m", - "lineageTag": "7830e861-c78c-411f-9de8-90d50d614ebd", - "queryGroup": "Sources\\Golden Datasets" - }, - { - "name": "Content_multi-part-checkpoint", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " GoldenTableName = \"multi-part-checkpoint\",", - " Source = GoldenTables,", - " #\"Filtered Rows\" = Table.SelectRows(Source, each [GoldenTable] = GoldenTableName),", - " Content = #\"Filtered Rows\"{0}[Content]", - "in", - " Content" - ], - "kind": "m", - "lineageTag": "cbd8a9bb-6434-442d-8571-e160c18070e7", - "queryGroup": "Sources\\Golden Datasets" - }, - { - "name": "Content_data-reader-nested-struct", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " GoldenTableName = \"data-reader-nested-struct\",", - " Source = GoldenTables,", - " #\"Filtered Rows\" = Table.SelectRows(Source, each [GoldenTable] = GoldenTableName),", - " Content = #\"Filtered Rows\"{0}[Content]", - "in", - " Content" - ], - "kind": "m", - "lineageTag": "58d0668f-23dc-47dd-97bf-e1c686de807b", - "queryGroup": "Sources\\Golden Datasets" - }, - { - "name": "Content_data-reader-array-complex-objects", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " GoldenTableName = \"data-reader-array-complex-objects\",", - " Source = GoldenTables,", - " #\"Filtered Rows\" = Table.SelectRows(Source, each [GoldenTable] = GoldenTableName),", - " Content = #\"Filtered Rows\"{0}[Content]", - "in", - " Content" - ], - "kind": "m", - "lineageTag": "cd4f48a2-6917-4781-8543-7efe717300c3", - "queryGroup": "Sources\\Golden Datasets" - }, - { - "name": "GoldenTables", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText(\"ZY1JEsIwDAT/4jPzolQOQp4UBm/IMkV+Tyi45TzdPcsSysye0MUceqM+ekvVw3pZQhQXGCXSUDmcEcNt6nkVM9mhrfTMN9r1TvVxor4fyVOreEme/APMdB4IJB59KcSWMhHTttFYHW5Sh+hX/ClH5znpiNRUJMP3zrCuHw==\", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [GoldenTable = _t]),", - " #\"Added Custom\" = Table.AddColumn(Source, \"FullPath\", each Text.TrimEnd(GoldenDatasetsRootPath, \"\\\") & \"\\\" & Text.Trim([GoldenTable], \"\\\"), type text),", - " #\"Added Custom1\" = Table.AddColumn(#\"Added Custom\", \"Content\", each Folder.Files([FullPath]))", - "in", - " #\"Added Custom1\"" - ], - "kind": "m", - "lineageTag": "9e2b2364-12e2-48b4-a8f3-7222d8054f89", - "queryGroup": "Sources\\Golden Datasets" - }, - { - "name": "Content_data-reader-partition-values", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " GoldenTableName = \"data-reader-partition-values\",", - " Source = GoldenTables,", - " #\"Filtered Rows\" = Table.SelectRows(Source, each [GoldenTable] = GoldenTableName),", - " Content = #\"Filtered Rows\"{0}[Content]", - "in", - " Content" - ], - "kind": "m", - "lineageTag": "75d3eb1c-06a8-44f5-8547-3ada809319c8", - "queryGroup": "Sources\\Golden Datasets" - }, - { - "name": "Data", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " #\"Added Full_Path\" = Table.AddColumn(#\"Files with Stats\", \"Full_Path\", each Text.Replace(DeltaTablePath & [file_name], \"/\", Delimiter), Text.Type),", - " #\"Removed FilteringColumns\" = Table.RemoveColumns(#\"Added Full_Path\",{\"minValues\", \"maxValues\", \"numRecords\", \"nullCount\", \"file_name\"}),", - " #\"Buffered RelevantFiles\" = Table.Buffer(#\"Removed FilteringColumns\"),", - " #\"Merged Queries\" = Table.NestedJoin(#\"Buffered RelevantFiles\", {\"Full_Path\"}, DeltaTableFolderContent_wFullPath, {\"Full_Path\"}, \"DeltaTable Folder\", JoinKind.Inner),", - " #\"Removed Full_Path\" = Table.RemoveColumns(#\"Merged Queries\",{\"Full_Path\"}),", - " #\"Expanded DeltaTable Folder\" = Table.ExpandTableColumn(#\"Removed Full_Path\", \"DeltaTable Folder\", {\"Content\"}, {\"Content\"}),", - " BufferFile = if UseFileBuffer then Table.TransformColumns(#\"Expanded DeltaTable Folder\",{{\"Content\", Binary.Buffer}}) else #\"Expanded DeltaTable Folder\",", - " #\"Read Parquet\" = Table.AddColumn(BufferFile, \"Data\", each Parquet.Document([Content]), type table),", - " #\"Removed Binary Column\" = Table.RemoveColumns(#\"Read Parquet\",{\"Content\"}),", - " #\"Combine Partition Values\" = Table.CombineColumnsToRecord(#\"Removed Binary Column\", \"cols\", List.RemoveItems(Table.ColumnNames(#\"Removed Binary Column\"), {\"Data\"})),", - " #\"Combine Files\" = Table.Combine(Table.TransformRows(#\"Combine Partition Values\", each fn_AddColumnsToTable(_[cols], _[Data])), PhysicalTableSchema),", - " #\"Changed Type\" = Table.TransformColumns(#\"Combine Files\",Table.SelectRows(metadata_columns, each [type] = \"timestamp\")[ColumnTransformation]),", - " #\"Table with TimeZoneOffset\" = if TimeZoneOffset = null then #\"Combine Files\" else #\"Changed Type\",", - " #\"Reordered Columns\" = Table.ReorderColumns(#\"Table with TimeZoneOffset\", metadata_columns[physicalName]),", - " #\"Renamed Columns\" = Table.RenameColumns(#\"Reordered Columns\",Table.ToRows(Table.SelectColumns(metadata_columns,{\"physicalName\", \"name\"}))),", - " #\"Renamed ComplexTypes\" = #\"Renamed Columns\" //Table.TransformColumnTypes(#\"Renamed Columns\",Table.ToRows(Table.SelectColumns(Table.SelectRows(metadata_columns, each [name] = \"structColumn\"),{\"name\", \"PBI_DataType\"})))", - " //Table.TransformColumnTypes(#\"Renamed Columns\",Table.ToRows(Table.SelectColumns(Table.SelectRows(metadata_columns, each [name] = \"structColumn\"),{\"name\", \"PBI_DataType\"})))", - ",", - "", - " #\"Validate ReaderVersion\" = if DeltaProtocol{0}[minReaderVersion] <= 2 then #\"Renamed ComplexTypes\" else error Error.Record(\"DeltaLakeVersionNotSupported\", \"This Connector currently only supports DeltaLake tables up to version 2.\", \"minReaderVersion\"),", - " FinalDeltaTable = Table.View(", - " #\"Validate ReaderVersion\", ", - " [", - " GetType = () => TableSchema,", - " GetRowCount = () => List.Sum(#\"Files with Stats\"[numRecords])", - " //,OnSelectRows = (condition) => Table.FirstN(#\"Reordered Columns\", 3)", - " ]", - " )", - "in", - " FinalDeltaTable" - ], - "kind": "m", - "lineageTag": "b6598977-52e0-4812-9047-62e3c68ecd25", - "queryGroup": "FunctionSteps" - }, - { - "name": "Content_ADLS_BugBrackets", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "expression": [ - "let", - " Source = AzureStorage.DataLake(\"https://gbadls01.dfs.core.windows.net/data/powerbi_delta/BugBrackets.delta\", [HierarchicalNavigation = false])", - "in", - " Source" - ], - "kind": "m", - "lineageTag": "953fe840-f321-4de7-87e4-c37f94a7498c", - "queryGroup": "Sources" - }, - { - "name": "fn_URIDecode", - "annotations": [ - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - }, - { - "name": "PBI_ResultType", - "value": "Function" - } - ], - "expression": "(data as text) as text => Uri.Parts(\"http://powerbi?txt=\" & data)[Query][txt]", - "kind": "m", - "lineageTag": "1ec75613-27ea-4fd2-beea-d8ce24d9a51f", - "queryGroup": "FunctionSteps" - }, - { - "name": "PQ_DataTypes", - "annotations": [ - { - "name": "PBI_ResultType", - "value": "Record" - } - ], - "expression": [ - "let", - " Source = [", - "Any.Type = Any.Type,", - "None.Type = None.Type,", - "Day.Type = Day.Type,", - "Duration.Type = Duration.Type,", - "Record.Type = Record.Type,", - "Precision.Type = Precision.Type,", - "Number.Type = Number.Type,", - "Binary.Type = Binary.Type,", - "Byte.Type = Byte.Type,", - "Character.Type = Character.Type,", - "Text.Type = Text.Type,", - "Function.Type = Function.Type,", - "Null.Type = Null.Type,", - "List.Type = List.Type,", - "Type.Type = Type.Type,", - "Logical.Type = Logical.Type,", - "Int8.Type = Int8.Type,", - "Int16.Type = Int16.Type,", - "Int32.Type = Int32.Type,", - "Int64.Type = Int64.Type,", - "Single.Type = Single.Type,", - "Double.Type = Double.Type,", - "Decimal.Type = Decimal.Type,", - "Currency.Type = Currency.Type,", - "Percentage.Type = Percentage.Type,", - "Guid.Type = Guid.Type,", - "Date.Type = Date.Type,", - "DateTime.Type = DateTime.Type,", - "DateTimeZone.Type = DateTimeZone.Type,", - "Time.Type = Time.Type,", - "Table.Type = Table.Type", - "]", - "in", - " Source" - ], - "kind": "m", - "lineageTag": "f0c17dfb-9e84-4f23-b7f2-d2a8224a6bd0", - "queryGroup": "FunctionSteps" - } - ], - "queryGroups": [ - { - "annotations": [ - { - "name": "PBI_QueryGroupOrder", - "value": "0" - } - ], - "folder": "Sources" - }, - { - "annotations": [ - { - "name": "PBI_QueryGroupOrder", - "value": "4" - } - ], - "folder": "FunctionSteps" - }, - { - "annotations": [ - { - "name": "PBI_QueryGroupOrder", - "value": "2" - } - ], - "folder": "FunctionParameters" - }, - { - "annotations": [ - { - "name": "PBI_QueryGroupOrder", - "value": "0" - } - ], - "folder": "FunctionParameters\\Options" - }, - { - "annotations": [ - { - "name": "PBI_QueryGroupOrder", - "value": "1" - } - ], - "folder": "UI_Filtering" - }, - { - "annotations": [ - { - "name": "PBI_QueryGroupOrder", - "value": "0" - } - ], - "folder": "Sources\\Golden Datasets" - } - ], - "sourceQueryCulture": "en-GB", - "tables": [ - { - "name": "DeltaTableData_CurrentFunction", - "annotations": [ - { - "name": "PBI_ResultType", - "value": "Table" - }, - { - "name": "PBI_NavigationStepName", - "value": "Navigation" - } - ], - "columns": [ - { - "name": "product", - "annotations": [ - { - "name": "SummarizationSetBy", - "value": "Automatic" - } - ], - "dataType": "string", - "lineageTag": "76c9e6eb-5030-4e15-adc1-55a50f56b02b", - "sourceColumn": "product", - "summarizeBy": "none" - }, - { - "name": "users", - "annotations": [ - { - "name": "SummarizationSetBy", - "value": "Automatic" - } - ], - "dataType": "string", - "lineageTag": "e5c72b40-ccde-4311-91c0-7b494b5bc047", - "sourceColumn": "users", - "summarizeBy": "none" - } - ], - "lineageTag": "1c1b35b6-5451-4971-a822-c33d3e7214f8", - "measures": [ - { - "name": "RowCount", - "expression": "COUNTROWS(DeltaTableData_CurrentFunction)", - "formatString": "#,0", - "lineageTag": "cc48cce2-feb1-46ac-93d9-31807c333f67" - }, - { - "name": "Function Up-to-Date", - "expression": [ - "//IF(COUNTROWS(EXCEPT(Data, DeltaTableData_Generic)) = 0, \"Function Up-to-Date!\", \"FUNCTION NOT UP TO DATE!!!\")", - "IF(COUNTROWS(DeltaTableData_CurrentDebug) = COUNTROWS(DeltaTableData_CurrentFunction), \"Function Up-to-Date!\", \"FUNCTION NOT UP TO DATE!!!\")" - ], - "lineageTag": "3dd360ff-6cc6-4f34-bd49-9ca3357e5a76" - } - ], - "partitions": [ - { - "name": "DeltaTableData_CurrentFunction-9c259273-48b9-495e-a4df-983309fa0f9d", - "mode": "import", - "source": { - "expression": [ - "let", - " Source = fn_ReadDeltaTable(DeltaTableFolderContent, DeltaTableOptions)", - "in", - " Source" - ], - "type": "m" - } - } - ] - }, - { - "name": "RowCounts", - "annotations": [ - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "columns": [ - { - "name": "GoldenTable", - "annotations": [ - { - "name": "SummarizationSetBy", - "value": "Automatic" - } - ], - "dataType": "string", - "lineageTag": "6c44fecf-af30-4464-b2f7-89c1bfe39082", - "sourceColumn": "GoldenTable", - "summarizeBy": "none" - }, - { - "name": "RowCounts", - "annotations": [ - { - "name": "SummarizationSetBy", - "value": "Automatic" - } - ], - "dataType": "int64", - "formatString": "#,0", - "lineageTag": "f124689d-7424-4dac-8043-f8efbaf44d82", - "sourceColumn": "RowCounts", - "summarizeBy": "sum" - } - ], - "lineageTag": "9a0dddd8-84f0-4e44-ab08-361abf445c3b", - "partitions": [ - { - "name": "RowCounts-38e290fc-6a76-4321-ae40-7d220463adf6", - "mode": "import", - "source": { - "expression": [ - "let", - " Source = GoldenTables,", - " #\"Invoked Custom Function\" = Table.AddColumn(Source, \"fn_ReadDeltaTable\", each fn_ReadDeltaTable([Content], null)),", - " #\"Added Custom\" = Table.AddColumn(#\"Invoked Custom Function\", \"RowCounts\", each Table.RowCount([fn_ReadDeltaTable]), Int64.Type),", - " #\"Removed Other Columns\" = Table.SelectColumns(#\"Added Custom\",{\"GoldenTable\", \"RowCounts\"})", - "in", - " #\"Removed Other Columns\"" - ], - "type": "m" - } - } - ] - }, - { - "name": "DeltaTableData_CurrentDebug", - "annotations": [ - { - "name": "PBI_ResultType", - "value": "Table" - } - ], - "columns": [ - { - "name": "product", - "annotations": [ - { - "name": "SummarizationSetBy", - "value": "Automatic" - } - ], - "dataType": "string", - "lineageTag": "ff67f5a0-eadd-4391-aa68-060fb5cda460", - "sourceColumn": "product", - "summarizeBy": "none" - }, - { - "name": "users", - "annotations": [ - { - "name": "SummarizationSetBy", - "value": "Automatic" - } - ], - "dataType": "string", - "lineageTag": "1217c4ea-017f-4131-b18b-8a20d74b3844", - "sourceColumn": "users", - "summarizeBy": "none" - } - ], - "lineageTag": "b5082451-2c3d-49d6-ad7f-eb9510869aea", - "partitions": [ - { - "name": "DeltaTableData_CurrentDebug", - "mode": "import", - "source": { - "expression": [ - "let", - " Source = #\"Data\"", - "in", - " Source" - ], - "type": "m" - } - } - ] - } - ] - } -} \ No newline at end of file diff --git a/connectors/powerbi/PowerBI_Delta.Report/StaticResources/SharedResources/BaseThemes/CY20SU09.json b/connectors/powerbi/PowerBI_Delta.Report/StaticResources/SharedResources/BaseThemes/CY20SU09.json deleted file mode 100644 index 1f39d9f68b2..00000000000 --- a/connectors/powerbi/PowerBI_Delta.Report/StaticResources/SharedResources/BaseThemes/CY20SU09.json +++ /dev/null @@ -1,522 +0,0 @@ -{ - "name": "CY20SU09", - "dataColors": [ - "#118DFF", - "#12239E", - "#E66C37", - "#6B007B", - "#E044A7", - "#744EC2", - "#D9B300", - "#D64550", - "#197278", - "#1AAB40", - "#15C6F4", - "#4092FF", - "#FFA058", - "#BE5DC9", - "#F472D0", - "#B5A1FF", - "#C4A200", - "#FF8080", - "#00DBBC", - "#5BD667", - "#0091D5", - "#4668C5", - "#FF6300", - "#99008A", - "#EC008C", - "#533285", - "#99700A", - "#FF4141", - "#1F9A85", - "#25891C", - "#0057A2", - "#002050", - "#C94F0F", - "#450F54", - "#B60064", - "#34124F", - "#6A5A29", - "#1AAB40", - "#BA141A", - "#0C3D37", - "#0B511F" - ], - "foreground": "#252423", - "foregroundNeutralSecondary": "#605E5C", - "foregroundNeutralTertiary": "#B3B0AD", - "background": "#FFFFFF", - "backgroundLight": "#F3F2F1", - "backgroundNeutral": "#C8C6C4", - "tableAccent": "#118DFF", - "good": "#1AAB40", - "neutral": "#D9B300", - "bad": "#D64554", - "maximum": "#118DFF", - "center": "#D9B300", - "minimum": "#DEEFFF", - "null": "#FF7F48", - "hyperlink": "#0078d4", - "visitedHyperlink": "#0078d4", - "textClasses": { - "callout": { - "fontSize": 45, - "fontFace": "DIN", - "color": "#252423" - }, - "title": { - "fontSize": 12, - "fontFace": "DIN", - "color": "#252423" - }, - "header": { - "fontSize": 12, - "fontFace": "Segoe UI Semibold", - "color": "#252423" - }, - "label": { - "fontSize": 10, - "fontFace": "Segoe UI", - "color": "#252423" - } - }, - "visualStyles": { - "*": { - "*": { - "*": [ - { - "wordWrap": true - } - ], - "line": [ - { - "transparency": 0 - } - ], - "outline": [ - { - "transparency": 0 - } - ], - "plotArea": [ - { - "transparency": 0 - } - ], - "categoryAxis": [ - { - "showAxisTitle": true, - "gridlineStyle": "dotted" - } - ], - "valueAxis": [ - { - "showAxisTitle": true, - "gridlineStyle": "dotted" - } - ], - "title": [ - { - "titleWrap": true - } - ], - "lineStyles": [ - { - "strokeWidth": 3 - } - ], - "wordWrap": [ - { - "show": true - } - ], - "background": [ - { - "show": true, - "transparency": 0 - } - ], - "outspacePane": [ - { - "backgroundColor": { - "solid": { - "color": "#ffffff" - } - }, - "foregroundColor": { - "solid": { - "color": "#252423" - } - }, - "transparency": 0, - "border": true, - "borderColor": { - "solid": { - "color": "#B3B0AD" - } - } - } - ], - "filterCard": [ - { - "$id": "Applied", - "transparency": 0, - "foregroundColor": { - "solid": { - "color": "#252423" - } - }, - "border": true - }, - { - "$id": "Available", - "transparency": 0, - "foregroundColor": { - "solid": { - "color": "#252423" - } - }, - "border": true - } - ] - } - }, - "scatterChart": { - "*": { - "bubbles": [ - { - "bubbleSize": -10 - } - ], - "general": [ - { - "responsive": true - } - ], - "fillPoint": [ - { - "show": true - } - ], - "legend": [ - { - "showGradientLegend": true - } - ] - } - }, - "lineChart": { - "*": { - "general": [ - { - "responsive": true - } - ] - } - }, - "map": { - "*": { - "bubbles": [ - { - "bubbleSize": -10 - } - ] - } - }, - "pieChart": { - "*": { - "legend": [ - { - "show": true, - "position": "RightCenter" - } - ], - "labels": [ - { - "labelStyle": "Data value, percent of total" - } - ] - } - }, - "donutChart": { - "*": { - "legend": [ - { - "show": true, - "position": "RightCenter" - } - ], - "labels": [ - { - "labelStyle": "Data value, percent of total" - } - ] - } - }, - "pivotTable": { - "*": { - "*": [ - { - "showExpandCollapseButtons": true - } - ] - } - }, - "multiRowCard": { - "*": { - "card": [ - { - "outlineWeight": 2, - "barShow": true, - "barWeight": 2 - } - ] - } - }, - "kpi": { - "*": { - "trendline": [ - { - "transparency": 20 - } - ] - } - }, - "slicer": { - "*": { - "general": [ - { - "responsive": true - } - ] - } - }, - "waterfallChart": { - "*": { - "general": [ - { - "responsive": true - } - ] - } - }, - "columnChart": { - "*": { - "general": [ - { - "responsive": true - } - ], - "legend": [ - { - "showGradientLegend": true - } - ] - } - }, - "clusteredColumnChart": { - "*": { - "general": [ - { - "responsive": true - } - ], - "legend": [ - { - "showGradientLegend": true - } - ] - } - }, - "hundredPercentStackedColumnChart": { - "*": { - "general": [ - { - "responsive": true - } - ], - "legend": [ - { - "showGradientLegend": true - } - ] - } - }, - "barChart": { - "*": { - "general": [ - { - "responsive": true - } - ], - "legend": [ - { - "showGradientLegend": true - } - ] - } - }, - "clusteredBarChart": { - "*": { - "general": [ - { - "responsive": true - } - ], - "legend": [ - { - "showGradientLegend": true - } - ] - } - }, - "hundredPercentStackedBarChart": { - "*": { - "general": [ - { - "responsive": true - } - ], - "legend": [ - { - "showGradientLegend": true - } - ] - } - }, - "areaChart": { - "*": { - "general": [ - { - "responsive": true - } - ] - } - }, - "stackedAreaChart": { - "*": { - "general": [ - { - "responsive": true - } - ] - } - }, - "lineClusteredColumnComboChart": { - "*": { - "general": [ - { - "responsive": true - } - ] - } - }, - "lineStackedColumnComboChart": { - "*": { - "general": [ - { - "responsive": true - } - ] - } - }, - "ribbonChart": { - "*": { - "general": [ - { - "responsive": true - } - ] - } - }, - "group": { - "*": { - "background": [ - { - "show": false - } - ] - } - }, - "basicShape": { - "*": { - "background": [ - { - "show": false - } - ], - "general": [ - { - "keepLayerOrder": true - } - ], - "visualHeader": [ - { - "show": false - } - ] - } - }, - "image": { - "*": { - "background": [ - { - "show": false - } - ], - "general": [ - { - "keepLayerOrder": true - } - ], - "visualHeader": [ - { - "show": false - } - ] - } - }, - "actionButton": { - "*": { - "visualHeader": [ - { - "show": false - } - ] - } - }, - "textbox": { - "*": { - "general": [ - { - "keepLayerOrder": true - } - ], - "visualHeader": [ - { - "show": false - } - ] - } - }, - "page": { - "*": { - "outspace": [ - { - "color": { - "solid": { - "color": "#FFFFFF" - } - } - } - ], - "background": [ - { - "transparency": 100 - } - ] - } - } - } -} \ No newline at end of file diff --git a/connectors/powerbi/PowerBI_Delta.Report/datasetDiagramLayout.json b/connectors/powerbi/PowerBI_Delta.Report/datasetDiagramLayout.json deleted file mode 100644 index c54f79c2f28..00000000000 --- a/connectors/powerbi/PowerBI_Delta.Report/datasetDiagramLayout.json +++ /dev/null @@ -1,287 +0,0 @@ -{ - "version": "1.1.0", - "diagrams": [ - { - "ordinal": 0, - "scrollPosition": { - "x": 0, - "y": 0 - }, - "nodes": [ - { - "location": { - "x": 0, - "y": 0 - }, - "nodeIndex": "ADLS_DimProduct", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 425, - "y": 0 - }, - "nodeIndex": "ADLS_DimProduct_Buffered", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 850.1, - "y": 0 - }, - "nodeIndex": "ADLS_DimProduct_UTC+2", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 2125.2, - "y": 0 - }, - "nodeIndex": "ADLSGen1_DimProduct", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 2550.2, - "y": 0 - }, - "nodeIndex": "ADLSGen1_FactInternetSales_part", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 2975.2, - "y": 0 - }, - "nodeIndex": "Blob_BasicDataTypes", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 3400.3, - "y": 0 - }, - "nodeIndex": "Blob_part", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 4675.3, - "y": 0 - }, - "nodeIndex": "DeltaTableData_Generic", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 5100.4, - "y": 0 - }, - "nodeIndex": "Local_part", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 5525.4, - "y": 86 - }, - "nodeIndex": "PQ_DataTypes", - "size": { - "height": 128, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 5950.4, - "y": 0 - }, - "nodeIndex": "Test_Partition_Elimination", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 6375.5, - "y": 0 - }, - "nodeIndex": "Test_Time_Travel", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 6808.2, - "y": 0 - }, - "nodeIndex": "Data", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 7240.9, - "y": 0 - }, - "nodeIndex": "Blob_AllDataTypes", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 7673.6, - "y": 0 - }, - "nodeIndex": "ADLS_DimProduct_prevVersion", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 1275.1, - "y": 0 - }, - "nodeIndex": "ADLS_FactInternetSales_part", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 1700.1, - "y": 0 - }, - "nodeIndex": "ADLS_FactInternetSales_part_Hierarchical", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 8037.4, - "y": 0 - }, - "nodeIndex": "RowCounts", - "size": { - "height": 128, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 8470.1, - "y": 0 - }, - "nodeIndex": "Blob_AllDataTypes_expanded", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 8902.8, - "y": 0 - }, - "nodeIndex": "Sample_ADLS_Gen2", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 9335.5, - "y": 0 - }, - "nodeIndex": "Sample_Blob", - "size": { - "height": 300, - "width": 234 - }, - "zIndex": 0 - }, - { - "location": { - "x": 9699.3, - "y": 0 - }, - "nodeIndex": "Blob_with_file_name", - "nodeLineageTag": "95e9d529-5a1f-4e95-80a2-8dba48e3f01d", - "size": { - "height": 128, - "width": 234 - }, - "zIndex": 0 - } - ], - "name": "All tables", - "zoomValue": 100, - "pinKeyFieldsToTop": false, - "showExtraHeaderInfo": false, - "hideKeyFieldsWhenCollapsed": false, - "tablesLocked": false - } - ], - "selectedDiagram": "All tables", - "defaultDiagram": "All tables" -} \ No newline at end of file diff --git a/connectors/powerbi/PowerBI_Delta.Report/definition.pbir b/connectors/powerbi/PowerBI_Delta.Report/definition.pbir deleted file mode 100644 index 443f9242087..00000000000 --- a/connectors/powerbi/PowerBI_Delta.Report/definition.pbir +++ /dev/null @@ -1,9 +0,0 @@ -{ - "version": "1.0", - "datasetReference": { - "byPath": { - "path": "../PowerBI_Delta.Dataset" - }, - "byConnection": null - } -} \ No newline at end of file diff --git a/connectors/powerbi/PowerBI_Delta.Report/item.config.json b/connectors/powerbi/PowerBI_Delta.Report/item.config.json deleted file mode 100644 index b1d5225283d..00000000000 --- a/connectors/powerbi/PowerBI_Delta.Report/item.config.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "version": "1.0", - "logicalId": "319f64ca-4399-4443-afd1-a358abc163f5" -} \ No newline at end of file diff --git a/connectors/powerbi/PowerBI_Delta.Report/item.metadata.json b/connectors/powerbi/PowerBI_Delta.Report/item.metadata.json deleted file mode 100644 index f236cedf876..00000000000 --- a/connectors/powerbi/PowerBI_Delta.Report/item.metadata.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "report", - "displayName": "PowerBI_Delta" -} \ No newline at end of file diff --git a/connectors/powerbi/PowerBI_Delta.Report/report.json b/connectors/powerbi/PowerBI_Delta.Report/report.json deleted file mode 100644 index 9aa10a1aacb..00000000000 --- a/connectors/powerbi/PowerBI_Delta.Report/report.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "config": "{\"version\":\"5.37\",\"themeCollection\":{\"baseTheme\":{\"name\":\"CY20SU09\",\"version\":\"5.17\",\"type\":2}},\"activeSectionIndex\":0,\"defaultDrillFilterOtherVisuals\":true,\"slowDataSourceSettings\":{\"isCrossHighlightingDisabled\":false,\"isSlicerSelectionsButtonEnabled\":false,\"isFilterSelectionsButtonEnabled\":false,\"isFieldWellButtonEnabled\":false,\"isApplyAllButtonEnabled\":false},\"linguisticSchemaSyncVersion\":2,\"settings\":{\"useNewFilterPaneExperience\":true,\"allowChangeFilterTypes\":true,\"useStylableVisualContainerHeader\":true,\"exportDataMode\":1},\"objects\":{\"section\":[{\"properties\":{\"verticalAlignment\":{\"expr\":{\"Literal\":{\"Value\":\"'Top'\"}}}}}]}}", - "layoutOptimization": 0, - "resourcePackages": [ - { - "resourcePackage": { - "disabled": false, - "items": [ - { - "name": "CY20SU09", - "path": "BaseThemes/CY20SU09.json", - "type": 202 - } - ], - "name": "SharedResources", - "type": 2 - } - } - ], - "sections": [ - { - "config": "{}", - "displayName": "Page 1", - "displayOption": 1, - "filters": "[]", - "height": 720.00, - "name": "ReportSection", - "visualContainers": [ - { - "config": "{\"name\":\"17dd014bcb84b2e86c7a\",\"layouts\":[{\"id\":0,\"position\":{\"x\":41.03052120832681,\"y\":0,\"z\":0,\"width\":300.0356863358898,\"height\":150.0178431679449}}],\"singleVisual\":{\"visualType\":\"card\",\"projections\":{\"Values\":[{\"queryRef\":\"DeltaTableData_CurrentFunction.RowCount\"}]},\"prototypeQuery\":{\"Version\":2,\"From\":[{\"Name\":\"d\",\"Entity\":\"DeltaTableData_CurrentFunction\",\"Type\":0}],\"Select\":[{\"Measure\":{\"Expression\":{\"SourceRef\":{\"Source\":\"d\"}},\"Property\":\"RowCount\"},\"Name\":\"DeltaTableData_CurrentFunction.RowCount\"}],\"OrderBy\":[{\"Direction\":2,\"Expression\":{\"Measure\":{\"Expression\":{\"SourceRef\":{\"Source\":\"d\"}},\"Property\":\"RowCount\"}}}]},\"drillFilterOtherVisuals\":true,\"objects\":{}}}", - "filters": "[]", - "height": 150.02, - "width": 300.04, - "x": 41.03, - "y": 0.00, - "z": 0.00 - }, - { - "config": "{\"name\":\"ab30bfc2485357da0d28\",\"layouts\":[{\"id\":0,\"position\":{\"x\":401.32978556894665,\"y\":96.16528408201596,\"z\":2000,\"width\":751.3714196274848,\"height\":235.92549694787917}}],\"singleVisual\":{\"visualType\":\"tableEx\",\"projections\":{\"Values\":[{\"queryRef\":\"RowCounts.GoldenTable\"},{\"queryRef\":\"Sum(RowCounts.RowCounts)\"}]},\"prototypeQuery\":{\"Version\":2,\"From\":[{\"Name\":\"r\",\"Entity\":\"RowCounts\",\"Type\":0}],\"Select\":[{\"Column\":{\"Expression\":{\"SourceRef\":{\"Source\":\"r\"}},\"Property\":\"GoldenTable\"},\"Name\":\"RowCounts.GoldenTable\",\"NativeReferenceName\":\"GoldenTable\"},{\"Aggregation\":{\"Expression\":{\"Column\":{\"Expression\":{\"SourceRef\":{\"Source\":\"r\"}},\"Property\":\"RowCounts\"}},\"Function\":0},\"Name\":\"Sum(RowCounts.RowCounts)\",\"NativeReferenceName\":\"RowCounts\"}]},\"drillFilterOtherVisuals\":true}}", - "filters": "[]", - "height": 235.93, - "width": 751.37, - "x": 401.33, - "y": 96.17, - "z": 2000.00 - }, - { - "config": "{\"name\":\"faeabc8e9d35160bee93\",\"layouts\":[{\"id\":0,\"position\":{\"x\":0,\"y\":138.47800907810299,\"z\":1000,\"width\":380.81452496478323,\"height\":162.83988104554703}}],\"singleVisual\":{\"visualType\":\"card\",\"projections\":{\"Values\":[{\"queryRef\":\"DeltaTableData_Generic.Function Up-to-Date\"}]},\"prototypeQuery\":{\"Version\":2,\"From\":[{\"Name\":\"d\",\"Entity\":\"DeltaTableData_CurrentFunction\",\"Type\":0}],\"Select\":[{\"Measure\":{\"Expression\":{\"SourceRef\":{\"Source\":\"d\"}},\"Property\":\"Function Up-to-Date\"},\"Name\":\"DeltaTableData_Generic.Function Up-to-Date\"}]},\"drillFilterOtherVisuals\":true}}", - "filters": "[]", - "height": 162.84, - "width": 380.81, - "x": 0.00, - "y": 138.48, - "z": 1000.00 - } - ], - "width": 1280.00 - } - ] -} \ No newline at end of file diff --git a/connectors/powerbi/PowerBI_Delta.pbip b/connectors/powerbi/PowerBI_Delta.pbip deleted file mode 100644 index f7fe086d6e8..00000000000 --- a/connectors/powerbi/PowerBI_Delta.pbip +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "1.0", - "artifacts": [ - { - "report": { - "path": "PowerBI_Delta.Report" - } - } - ], - "settings": { - "enableAutoRecovery": true - } -} \ No newline at end of file diff --git a/connectors/powerbi/README.md b/connectors/powerbi/README.md deleted file mode 100644 index 8d051b1608c..00000000000 --- a/connectors/powerbi/README.md +++ /dev/null @@ -1,209 +0,0 @@ -# Reading Delta Lake tables natively in PowerBI - -The provided PowerQuery/M function allows you to read a Delta Lake table directly from any storage supported by PowerBI. Common storages which have also been tested include Azure Data Lake Store, Azure Blob Storage or a local folder or file share. - -# Features - -- Read Delta Lake table into PowerBI without having a cluster (Spark, Databricks, Azure Synapse) up and running -- Online/Scheduled Refresh in the PowerBI service -- Support all storage systems that are supported by PowerBI - - Azure Data Lake Store Gen2 (tested) - - Azure Blob Storage (tested) - - Local Folder or Network Share (tested) - - Azure Data Lake Store Gen1 (tested) - - Local Hadoop / HDFS (partially tested, check `UseFileBuffer` option) -- Support for Partition Elimination to leverage the partitioning schema of the Delta Lake table ([details](#partitionfilterfunction)) -- Support for File Pruning using file stats ([details](#statsfilterfunction)) -- Support all simple and complex data types (struct, map, array, ...) -- Added shortcut to read `COUNT` from `_delta_log` directly if possible -- Support for Delta Lake time travel - e.g. `VERSION AS OF` - - also supports negative values for `VERSION AS OF` to easily access the previous version using a value of `-1` -- Support for `TimeZoneOffset` to automatically convert all timestamps to a given timezone - e.g. `+2:00` -- Support for `minReaderVersion` up to `2` - -# Usage - -1. In PowerBI desktop, go to Home -> Queries -> Transform Data -2. Once you are in the Power Query Editor use Home -> New Source -> Blank query -3. Go to Home -> Query -> Advanced Editor -4. Paste the code of the custom function: [fn_ReadDeltaTable.pq](fn_ReadDeltaTable.pq) and name the query `fn_ReadDeltaTable` -5. Connect to your storage - e.g. create a PQ query with the following code (paste it via the Advanced Editor) and call it `Blob_Content` - -```m -let - Source = AzureStorage.Blobs("https://gbadls01.blob.core.windows.net/public"), - #"Filtered Rows" = Table.SelectRows(Source, each Text.StartsWith([Name], "powerbi_delta/FactInternetSales_part.delta/")) -in - #"Filtered Rows" -``` - -6. Open your query that contains the function and select `Blob_Content` in the parameter `DeltaTableFolderContent` -7. Click `Invoke` -8. A new PQ query will be created for you showing the contents of the Delta Lake table - -# Parameters - -The function supports two parameters of which the second is optional: - -1. DeltaTableFolderContent -2. DeltaTableOptions - -## Parameter DeltaTableFolderContent - -A table that contains a file/folder listing of your Delta Lake table. PowerBI supports a wide set of storage services which you can use for this. There are however some mandatory things this file/folder listing has to cotain: - -- a sub-folder `_delta_log` (which holds the Delta Log files and also ensures that the parent folder is the root of the Delta Lake table) -- mandatory columns `Name`, `Folder Path`, `Content`, `Extension` -These are all returned by default for common Storage connectors like Azure Data Lake Storage Gen2 or Azure Blob Storaage - -## Parameter DeltaTableOptions - -An optional record that be specified to control the following options: - -### **Version** - -A numeric value that defines historic specific version of the Delta Lake table you want to read. This is similar to specifying -`VERSION AS OF` When querying the Delta Lake table via SQL. Default is the most recent/current version. -You can also specify a negative value to go backwards from the most recent/current version number. -e.g using a value of `-1` to load the previous version of the Delta table. - -### **UseFileBuffer** - -Some data sources do not support streaming of binary files and you may receive an error message like **"Parquet.Document cannot be used with streamed binary values."**. To mitigate this issue, you can set `UseFileBuffer=true`. Details about this issue and implications are desribed [here](https://blog.crossjoin.co.uk/2021/03/07/parquet-files-in-power-bi-power-query-and-the-streamed-binary-values-error/). -Please be aware that this option can have negative performance impact! - -### **PartitionFilterFunction** - -A fuction that is used to filter out partitions before actually reading the files. The function has to take 1 parameter of type `record` and must return a `logical` type (true/false). The record that is passed in can then be used to specify the partition filter. For each file in the delta table the metadata is checked against this function. If it is not matched, it is discarded from the final list of files that make up the Delta Lake table. -Assuming your Delta Lake table is partitioned by Year and Month and you want to filter for `Year=2021` and `Month="Jan"` your function may look like this: - -```m -(PartitionValues as record) as logical => - Record.Field(PartitionValues, "Year") = 2021 and Record.Field(PartitionValues, "Month") = "Jan" -``` - -If you are lazy you can also use this shorter version without explicit type definitions: - -```m -(x) => Record.Field(x, "Year") = 2021 and Record.Field(x, "Month") = "Jan" -``` - -or even more lightweight - -```m -(x) => x[Year] = 2021 and x[Month] = "Jan" -``` - -It supports all possible variations that are supported by Power Query/M so you can also build complex partition filters. - -### **StatsFilterFunction** - -A fuction that is used to filter out files based on the min/max values in the delta log before actually reading the files. The function has to take 2 parameter of type `record` and must return a `logical` type (true/false). The first record passed to the function are the `minValues`, the second record are the `maxValues` from the file statistics. They can then be used in a similar way as the [PartitionFilterFunction](#partitionfilterfunction): -Assuming your Delta Lake table is partitioned by Year and Month and you want to filter for `Year=2021` and `Month="Jan"` your function may look like this: - -```m -= ( - minValues as record, - maxValues as record -) as logical => - -Record.Field(minValues, "ProductKey") <= 220 and Record.Field(maxValues, "OrderDateKey") >= 20080731 -``` - -### **IterateFolderContent** - -Some data sources (like Azure Data Lake Store Gen1) do not automatically expand all sub-folders to get the single files. To make the function work with those data sources you can set `IterateFolderContent=true`. -Please be aware that this option can have negative performance impact! - -### **TimeZoneOffset** - -Apache Parquet has no built-in data type for timestamps with offset hence all timestamps are stored physically as UTC. As Delta Lake is also based on Apache Parquet, this also applies here. So, to explicitly change the timezone for all timestamps that are read from the Delta Lake table, you can use `TimeZoneOffset="+02:00"`. The resulting columns will then be of type DateTimeZone with the offset of `+02:00` and the DateTime-value shifted by +2 hours. The parameter supports the following format only: `[+|-][HH:mm]` - -### **additional options may be added in the future!** - -# Known limitations - -- Time Travel - - currently only supports `VERSION AS OF` - - `TIMESTAMP AS OF` not yet supported -- complex data types in combination with `minReaderVersion >= 2` - -# Examples - -The examples below can be used *as-is* in Power BI desktop. If you are prompted for authentication, just select `Anonymous` for your authentication method. -> **Note:** In the examples the root folder of the Delta Lake table ends with `.delta`. This is not mandatory and can be any path. - -## Using Delta Lake Time Travel - -To use Delta Lake Time Travel you need to specify the `Version`-option as part of the second argument. The following example reads the Version 1 of a Delta Lake table from an Azure Blob Storage. - -```m -let - Source = AzureStorage.Blobs("https://gbadls01.blob.core.windows.net/public"), - #"Filtered Rows" = Table.SelectRows(Source, each Text.StartsWith([Name], "powerbi_delta/FactInternetSales_part.delta/")), - DeltaTable = fn_ReadDeltaTable(#"Filtered Rows", [Version=1]) -in - DeltaTable -``` - -## Using Delta Lake Partition Elimination - -Partition Elimination is a crucial feature when working with large amounts of data. Without it, you would need to read the whole table and discard a majority of the rows afterwards which is not very efficient. This can be accomplished by using the `PartitionFilterFunction`-option as part of the second argument. In the example below our table is partitioned by `SalesTerritoryKey` (integer) and we only want to load data from Sales Territories where the `SalesTerritoryKey` is greater or equal to `5`: - -```m -let - Source = AzureStorage.Blobs("https://gbadls01.blob.core.windows.net/public"), - #"Filtered Rows" = Table.SelectRows(Source, each Text.StartsWith([Name], "powerbi_delta/FactInternetSales_part.delta/")), - DeltaTable = fn_ReadDeltaTable(#"Filtered Rows", [PartitionFilterFunction = (x) => Record.Field(x, "SalesTerritoryKey") >= 5]) -in - DeltaTable -``` - -## Reading from Azure Data Lake Store Gen1 - -To read diretly from an Azure Data Lake Store Gen1 folder, you need to specify the options `UseFileBuffer=true` and `IterateFolderContent=true`: - -```m -let - Source = DataLake.Contents("adl://myadlsgen1.azuredatalakestore.net/DeltaSamples/FactInternetSales_part.delta", [PageSize=null]), - DeltaTable = fn_ReadDeltaTable(Source, [UseFileBuffer = true, IterateFolderContent = true]) -in - DeltaTable -``` - -## Reading from Azure Data Lake Store Gen2 - -You can also read directly from an Azure Data Lake Store Gen2 using the snippet below. If you want/need to use `HierarchicalNavigation = true` you may add `IterateFolderContent=true` to the options of `fn_ReadDeltaTable`. This may speed up overall performance - but usually varies from case to case so please test this on your own data first! - -```m -let - Source = AzureStorage.DataLake("https://gbadls01.dfs.core.windows.net/public/powerbi_delta/DimProduct.delta", [HierarchicalNavigation = false]), - DeltaTable = fn_ReadDeltaTable(Source, [PartitionFilterFunction=(x) => x[Year] = 2021 and x[Month] = "Jan"]) -in - DeltaTable -``` - -# FAQ - -**Q:** The Power Query UI does not show the second parameter. How can I use it? - -**A:** To use the second parameter of the function you need to use the advanced editor. Power Query does currently not support parameters of type record in the UI - --------------------- -**Q:** How can I use [Delta Lake Time Travel](https://databricks.com/blog/2019/02/04/introducing-delta-time-travel-for-large-scale-data-lakes.html)? - -**A:** The function supports an optional second parameter to supply generic parameters. To query specific version of the Delta Lake table, you can provide a record with the field `Version` and the value of the version you want to query. For example, to read Version 123 of your Delta Table, you can use the following M code: `fn_ReadDeltaTable(DeltaTableFolderContents, [Version=123])` - --------------------- -**Q:** The data source I am using does not work with the `fn_ReadDeltaTable` function - what can I do? - -**A:** Please open a support ticket/issue in the git repository. - - -# Contributing -If you want to contribute to this connector, you can use the provided `.pbip` Power BI Desktop Project file to develop a new feature and run some tests. Ideally, the tests will be based on data in `connectors\golden-tables` so it is easy for everyone else to re-run the tests. If this is not possible, you may also add references to your local files other data sourcs (e.g. blob storage) but be aware, that those then cannot be opened by other contributors if they require authentication. - -The idea is that you first create a PQ query that points to your Delta Lake table as a file-listing. Then reference that PQ query in the pre-defined query `DeltaTableFolderContent` in the PQ folder `/FunctionParameters/Options`. If necessary, you can also change all the other parameters there if you need to test them. -You can then debug the code step by step using the PQ queries under folder `/FunctionSteps`. Once you are done with your changes there, it is very important that you remember the PQ queries that you have changed and duplicate them to the final PQ query `fn_ReadDeltaTable`! -This will automatically run basic checks (rowcount and if the table can still be read) on the Golden Tables defined in PQ query `GoldenTables`. -Once this all succeeds, you can take the text from `fn_ReadDeltaTable` and copy it to the file `connectors\powerbi\fn_ReadDeltaTable.pq`. \ No newline at end of file diff --git a/connectors/powerbi/fn_ReadDeltaTable.pq b/connectors/powerbi/fn_ReadDeltaTable.pq deleted file mode 100644 index 7ab272d49ab..00000000000 --- a/connectors/powerbi/fn_ReadDeltaTable.pq +++ /dev/null @@ -1,376 +0,0 @@ -let - fn_ReadDeltaTable = ( - DeltaTableFolderContent as table, - optional DeltaTableOptions as record - ) as table => - - let - - DeltaTableVersion = if DeltaTableOptions = null then null else Record.FieldOrDefault(DeltaTableOptions, "Version", null), - PartitionFilterFunction = if DeltaTableOptions = null then (x) => true else if Record.FieldOrDefault(DeltaTableOptions, "PartitionFilterFunction", null) = null then (x) => true else Record.Field(DeltaTableOptions, "PartitionFilterFunction"), - StatsFilterFunction = if DeltaTableOptions = null then (x, y) => true else if Record.FieldOrDefault(DeltaTableOptions, "StatsFilterFunction", null) = null then (x, y) => true else Record.Field(DeltaTableOptions, "StatsFilterFunction"), - UseFileBuffer = if DeltaTableOptions = null then false else if Record.FieldOrDefault(DeltaTableOptions, "UseFileBuffer", null) = null then false else Record.Field(DeltaTableOptions, "UseFileBuffer"), - IterateFolderContent = if DeltaTableOptions = null then false else if Record.FieldOrDefault(DeltaTableOptions, "IterateFolderContent", null) = null then false else Record.Field(DeltaTableOptions, "IterateFolderContent"), - TimeZoneOffset = if DeltaTableOptions = null then null else Record.FieldOrDefault(DeltaTableOptions, "TimeZoneOffset", null), - TimeZoneOffsetDuration = Duration.FromText(Text.TrimStart(TimeZoneOffset, "+")), - - Delimiter = if Text.Contains(DeltaTableFolderContent{0}[Folder Path], "//") then "/" else "\", - - fn_URIDecode = (data as text) as text => Uri.Parts("http://powerbi?txt=" & data)[Query][txt], - - DeltaProtocol = - let - Source = #"Logs ALL", - #"Filtered Rows1" = Table.SelectRows(Source, each ([protocol] <> null)), - MaxVersion = Table.Group(#"Filtered Rows1", {}, {{"MaxVersion", each List.Max([Version]), type number}}){0}[MaxVersion], - #"Filtered Rows2" = Table.SelectRows(#"Filtered Rows1", each [Version] = MaxVersion), - #"Removed Other Columns" = Table.SelectColumns(#"Filtered Rows2",{"protocol"}), - #"Expanded protocol" = Table.ExpandRecordColumn(#"Removed Other Columns", "protocol", {"minReaderVersion", "minWriterVersion"}, {"minReaderVersion", "minWriterVersion"}), - #"Changed Type" = Table.TransformColumnTypes(#"Expanded protocol",{{"minReaderVersion", Int64.Type}, {"minWriterVersion", Int64.Type}}), - #"Renamed Columns" = Table.Buffer(#"Changed Type") - in - #"Renamed Columns", - - DeltaTableFolderContent_wFullPath = - let - Source = DeltaTableFolderContent, - - fn_ReadContentRecursive = (tbl as table) as table => - let - subFolders = Table.SelectRows(tbl, each Value.Is(_[Content], type table)), - binaries = Table.SelectRows(tbl, each Value.Is(_[Content], type binary)), - combinedContent = if Table.RowCount(subFolders) > 0 then Table.Combine({binaries, @fn_ReadContentRecursive(Table.Combine(subFolders[Content]))}) else binaries - in - combinedContent, - - Content = if IterateFolderContent then fn_ReadContentRecursive(Source) else Source, - - #"Added Full_Path" = Table.AddColumn(Content, "Full_Path", each fn_URIDecode([Folder Path]) & [Name], Text.Type), - #"Added File_Name" = Table.AddColumn(#"Added Full_Path", "File_Name", each if Text.Length([Extension]) > 0 then List.Last(Text.Split([Full_Path], Delimiter)) else null, type text), - Buffered = Table.Buffer(#"Added File_Name") - in - Buffered, - - PQ_DataTypes = - let - Source = [ - Any.Type = Any.Type, - None.Type = None.Type, - Day.Type = Day.Type, - Duration.Type = Duration.Type, - Record.Type = Record.Type, - Precision.Type = Precision.Type, - Number.Type = Number.Type, - Binary.Type = Binary.Type, - Byte.Type = Byte.Type, - Character.Type = Character.Type, - Text.Type = Text.Type, - Function.Type = Function.Type, - Null.Type = Null.Type, - List.Type = List.Type, - Type.Type = Type.Type, - Logical.Type = Logical.Type, - Int8.Type = Int8.Type, - Int16.Type = Int16.Type, - Int32.Type = Int32.Type, - Int64.Type = Int64.Type, - Single.Type = Single.Type, - Double.Type = Double.Type, - Decimal.Type = Decimal.Type, - Currency.Type = Currency.Type, - Percentage.Type = Percentage.Type, - Guid.Type = Guid.Type, - Date.Type = Date.Type, - DateTime.Type = DateTime.Type, - DateTimeZone.Type = DateTimeZone.Type, - Time.Type = Time.Type, - Table.Type = Table.Type - ] - in - Source, - - #"TableSchema" = - let - ExpressionText = "type table [" & Text.Combine(metadata_columns[TableDataType], ", ") & "]", - BufferedExpression = List.Buffer({ExpressionText}){0}, - TableSchema = Expression.Evaluate(BufferedExpression, PQ_DataTypes) - in - TableSchema, - - #"PhysicalTableSchema" = - let - ExpressionText = "type table [" & Text.Combine(metadata_columns[PhysicalTableDataType], ", ") & "]", - BufferedExpression = List.Buffer({ExpressionText}){0}, - PhysicalTableSchema = Expression.Evaluate(BufferedExpression, PQ_DataTypes) - in - PhysicalTableSchema, - - LogSchema = type [txn=record, add=record, remove=record, metaData=record, commitInfo=record, protocol=record], - - #"_delta_log Folder" = - let - Source = DeltaTableFolderContent_wFullPath, - #"Filtered Rows" = Table.SelectRows(Source, each Text.Contains([Full_Path], Delimiter & "_delta_log" & Delimiter)), - DeltaLogValidated = if Table.RowCount(#"Filtered Rows") = 0 then error "Mandatory folder " & Delimiter & "_delta_log" & Delimiter & " not found in the root of the file listing! Are you sure this is a Delta Lake table?" else #"Filtered Rows", - #"Added Version" = Table.AddColumn(DeltaLogValidated, "Version", each try Int64.From(Text.BeforeDelimiter([File_Name], ".")) otherwise -1, Int64.Type), - MaxVersion = Table.Group(#"Added Version", {}, {{"MaxVersion", each List.Max([Version]), type number}}){0}[MaxVersion], - #"Filtered RequestedVersion" = if DeltaTableVersion = null then #"Added Version" - else if DeltaTableVersion < 0 then Table.SelectRows(#"Added Version", each [Version] <= MaxVersion + DeltaTableVersion) - else Table.SelectRows(#"Added Version", each [Version] <= DeltaTableVersion), - BufferedTable = Table.Buffer(#"Filtered RequestedVersion"), - BufferedContent = Table.TransformColumns(BufferedTable,{{"Content", Binary.Buffer}}) - in - BufferedContent, - - #"DeltaTablePath" = - let - DeltaTablePath = Text.Combine(List.RemoveLastN(Text.Split(#"_delta_log Folder"{0}[Full_Path], Delimiter), 2), Delimiter) & Delimiter - in - DeltaTablePath, - - #"_last_checkpoint" = - let - #"_delta_log" = #"_delta_log Folder", - #"Filtered Rows" = Table.SelectRows(_delta_log, each Text.EndsWith([Name], "_last_checkpoint")), - #"Added Custom" = Table.AddColumn(#"Filtered Rows", "JsonContent", each Json.Document([Content])), - JsonContent = #"Added Custom"{0}[JsonContent], - CheckEmpty = if Table.RowCount(#"Filtered Rows") = 0 then [Size=-1, version=-1] else JsonContent, - LatestCheckPointWithParts = if Record.HasFields(CheckEmpty, "parts") then CheckEmpty else Record.AddField(CheckEmpty, "parts", 1), - - #"Filtered Rows Version" = Table.SelectRows(#"_delta_log", each Text.EndsWith([Name], ".checkpoint.parquet")), - MaxVersion = try Table.Group(#"Filtered Rows Version", {}, {{"MaxVersion", each List.Max([Version]), type number}}){0}[MaxVersion] otherwise -1, - #"Filtered Rows MaxVersion" = Table.SelectRows(#"Filtered Rows Version", each [Version] = MaxVersion), - CheckpointFromVersion = [version=try MaxVersion otherwise -1, size=-1, parts = Table.RowCount(#"Filtered Rows MaxVersion")], - - LastCheckpoint = Table.Buffer(Table.FromRecords({if DeltaTableVersion = null then LatestCheckPointWithParts else CheckpointFromVersion})){0} - in - LastCheckpoint, - - #"Checkpoint Files" = - let - LastCheckpointFile = {1..Record.Field(_last_checkpoint, "parts")}, - #"Converted to Table" = Table.FromList(LastCheckpointFile, Splitter.SplitByNothing(), {"part"}, null, ExtraValues.Error), - #"Add Version" = Table.AddColumn(#"Converted to Table", "version", each Record.Field(_last_checkpoint, "version")), - #"Add SingleFile" = Table.AddColumn(#"Add Version", "file_name", each Text.PadStart(Text.From([version]), 20, "0") & ".checkpoint.parquet", Text.Type), - #"Add MultipleFiles" = Table.AddColumn(#"Add Version", "file_name", each Text.PadStart(Text.From([version]), 20, "0") & ".checkpoint." & Text.PadStart(Text.From([part]), 10, "0") & "." & Text.PadStart(Text.From(Record.Field(_last_checkpoint, "parts")), 10, "0") & ".parquet", Text.Type), - AllFiles = Table.SelectColumns(if Record.Field(_last_checkpoint, "parts") = 1 then #"Add SingleFile" else #"Add MultipleFiles", "file_name"), - AllFiles_BufferedList = List.Buffer(Table.ToList(AllFiles)), - Content = Table.SelectRows(#"_delta_log Folder", each List.Count(List.Select(AllFiles_BufferedList, (inner) => Text.EndsWith([Name], inner))) > 0) - in - Content, - - #"Logs Checkpoint" = - let - Source = #"Checkpoint Files", - #"Parsed Logs" = Table.AddColumn(Source, "LogInfo", each Parquet.Document([Content])), - #"Combine LogInfo and Version" = Table.Combine(Table.TransformRows(#"Parsed Logs", each fn_AddColumnsToTable([Version=_[Version]], _[LogInfo]))) - in - #"Combine LogInfo and Version", - - #"Latest Log Files" = - let - Source = #"_delta_log Folder", - #"Filtered After Last Checkpoint" = Table.SelectRows(Source, each [Version] > Record.Field(_last_checkpoint, "version")), - #"Filtered JSON Files" = Table.SelectRows(#"Filtered After Last Checkpoint", each ([Extension] = ".json" and not Text.EndsWith([Name], ".compacted.json"))) - in - #"Filtered JSON Files", - - #"Logs JSON" = - let - Source = #"Latest Log Files", - #"Added Custom" = Table.AddColumn(Source, "JsonContent", each Lines.FromBinary([Content])), - #"Expanded JsonContent" = Table.ExpandListColumn(#"Added Custom", "JsonContent"), - #"Parsed Logs" = Table.TransformColumns(#"Expanded JsonContent",{{"JsonContent", Json.Document}}), - #"Expanded Logs" = Table.ExpandRecordColumn(#"Parsed Logs", "JsonContent", {"add", "remove", "metaData", "commitInfo", "protocol"}), - #"Removed Other Columns" = Table.SelectColumns(#"Expanded Logs",{"Version", "add", "remove", "metaData", "commitInfo", "protocol"}) - in - #"Removed Other Columns", - - #"Logs ALL" = - let - Source = Table.Combine({#"Logs Checkpoint", #"Logs JSON"}), - #"Added timestamp" = Table.AddColumn(Source, "log_timestamp", each if [add] <> null then Record.Field([add], "modificationTime") else - if [remove] <> null then Record.Field([remove], "deletionTimestamp") else - if [commitInfo] <> null then Record.Field([commitInfo], "timestamp") else - if [metaData] <> null then Record.Field([metaData], "createdTime") else null, Int64.Type), - #"Added datetime" = Table.AddColumn(#"Added timestamp", "log_datetime", each try #datetime(1970,1,1,0,0,0)+#duration(0,0,0,[log_timestamp]/1000) otherwise null, DateTime.Type) - in - #"Added datetime", - - fn_GetPowerBIDataTypeInformation = - (type_value as any, physical_name as logical, optional is_nullable as nullable logical) as text => - let - par_is_nullable = if is_nullable = null then true else is_nullable, - - ret = if Value.Is(type_value, Record.Type) then - if type_value[type] = "struct" then "[" & Text.Combine(List.Transform(type_value[fields], each "#""" & (if(physical_name) then _[metadata][delta.columnMapping.physicalName] else _[name]) & """ = " & @fn_GetPowerBIDataTypeInformation(_[type], physical_name, _[nullable])), ", ") & "]" - else if type_value[type] = "array" then "{" & @fn_GetPowerBIDataTypeInformation(type_value[elementType], physical_name, type_value[containsNull]) & "}" - else if type_value[type] = "map" then "table [Key=" & @fn_GetPowerBIDataTypeInformation(type_value[keyType], false) & ", Value=" & @fn_GetPowerBIDataTypeInformation(type_value[valueType], physical_name, type_value[valueContainsNull]) & "]" - else "Any.Type" - else if type_value = "string" then "Text.Type" - else if type_value = "long" then "Int64.Type" - else if type_value = "integer" then "Int32.Type" - else if type_value = "short" then "Int16.Type" - else if type_value = "byte" then "Int8.Type" - else if type_value = "float" then "Single.Type" - else if type_value = "double" then "Double.Type" - else if type_value = "date" then "Date.Type" - else if type_value = "timestamp" and TimeZoneOffset = null then "DateTime.Type" - else if type_value = "timestamp" and TimeZoneOffset <> null then "DateTimeZone.Type" - else if type_value = "boolean" then "Logical.Type" - else if type_value = "binary" then "Binary.Type" - else if type_value = "null" then "Any.Type" - else if Text.StartsWith(type_value, "decimal") then "Number.Type" - else "Any.Type", - - ret_nullable = (if par_is_nullable then "nullable " else "") & ret - in - ret_nullable, - - #"metadata_columns" = - let - Source = #"Logs ALL", - #"Filtered Rows1" = Table.SelectRows(Source, each ([metaData] <> null)), - MaxVersion = Table.Group(#"Filtered Rows1", {}, {{"MaxVersion", each List.Max([Version]), type number}}){0}[MaxVersion], - #"Filtered Rows2" = Table.SelectRows(#"Filtered Rows1", each [Version] = MaxVersion), - #"Kept First Rows" = Table.FirstN(#"Filtered Rows2",1), - #"Removed Other Columns" = Table.SelectColumns(#"Kept First Rows",{"metaData"}), - #"Expanded metaData" = Table.ExpandRecordColumn(#"Removed Other Columns", "metaData", {"schemaString", "partitionColumns"}, {"schemaString", "partitionColumns"}), - #"Filtered Rows" = Table.SelectRows(#"Expanded metaData", each ([schemaString] <> null)), - JSON = Table.TransformColumns(#"Filtered Rows",{{"schemaString", Json.Document}}), - #"Expanded schemaString" = Table.ExpandRecordColumn(JSON, "schemaString", {"fields"}, {"fields"}), - #"Expanded fieldList" = Table.ExpandListColumn(#"Expanded schemaString", "fields"), - #"Expanded fields" = Table.ExpandRecordColumn(#"Expanded fieldList", "fields", {"name", "type", "nullable", "metadata"}, {"name", "type", "nullable", "metadata"}), - #"Added physicalName" = Table.AddColumn(#"Expanded fields", "physicalName", each try Record.Field([metadata], "delta.columnMapping.physicalName") otherwise [name], type text), - #"Changed Type" = Table.TransformColumnTypes(#"Added physicalName",{{"name", type text}, {"nullable", type logical}}), - #"Added isPartitionedBy" = Table.Buffer(Table.AddColumn(#"Changed Type", "isPartitionedBy", each List.Contains([partitionColumns], [name]), Logical.Type)), - #"Added PBI_Text" = Table.AddColumn(#"Added isPartitionedBy", "PBI_Text", each fn_GetPowerBIDataTypeInformation([type], false, [nullable]), type text), - #"Added PBI_DataType" = Table.AddColumn(#"Added PBI_Text", "PBI_DataType", each Expression.Evaluate("type " & [PBI_Text], PQ_DataTypes), type type), - #"Added PBI_Transformation" = Table.AddColumn(#"Added PBI_DataType", "PBI_Transformation", each - if [type] = "string" then Text.From - else if [type] = "long" then Int64.From - else if [type] = "integer" then Int32.From - else if [type] = "short" then Int16.From - else if [type] = "byte" then Int8.From - else if [type] = "float" then Single.From - else if [type] = "double" then Double.From - else if [type] = "date" then Date.From - else if [type] = "timestamp" and TimeZoneOffset = null then DateTime.From - else if [type] = "timestamp" and TimeZoneOffset <> null then (x) as nullable datetimezone => DateTime.AddZone(DateTime.From(x) + TimeZoneOffsetDuration, Duration.Hours(TimeZoneOffsetDuration), Duration.Minutes(TimeZoneOffsetDuration)) - else if [type] = "boolean" then Logical.From - else if [type] = "binary" then Binary.From - else if (Value.Is([type], type text) and Text.StartsWith([type], "decimal")) then Number.From - else (x) as nullable any => x, type function), - #"Added physicalPBI_Text" = Table.AddColumn(#"Added PBI_Transformation", "physicalPBI_Text", each fn_GetPowerBIDataTypeInformation([type], true, [nullable]), type text), - #"Added physicalPBI_DataType" = Table.AddColumn(#"Added physicalPBI_Text", "physicalPBI_DataType", each Expression.Evaluate("type " & [physicalPBI_Text], PQ_DataTypes), type type), - #"Added ChangeDataType" = Table.AddColumn(#"Added physicalPBI_DataType", "ChangeDataType", each {[name], [PBI_DataType]}, type list), - #"Added TableDataType" = Table.AddColumn(#"Added ChangeDataType", "TableDataType", each "#""" & [name] & """=" & Text.From([PBI_Text]), type text), - #"Added PhysicalTableDataType" = Table.AddColumn(#"Added TableDataType", "PhysicalTableDataType", each "#""" & [physicalName] & """=" & Text.From([PBI_Text]), type text), - #"Added ColumnTransformation" = Table.AddColumn(#"Added PhysicalTableDataType", "ColumnTransformation", each {[physicalName], [PBI_Transformation]}, type list), - #"Buffered Fields" = Table.Buffer(#"Added ColumnTransformation") - in - #"Buffered Fields", - - fn_AddColumnsToTable = - (cols as record, tbl as table) as table => - let - colName = List.First(Record.FieldNames(cols)), - cols_new = Record.RemoveFields(cols, colName), - tbl_new = Table.AddColumn(tbl, colName, (x) => Record.Field(cols, colName), Value.Type(Record.Field(cols, colName))), - - ret = if Record.FieldCount(cols) = 0 then tbl else if Record.FieldCount(cols_new) = 0 then tbl_new else @fn_AddColumnsToTable(cols_new, tbl_new) - in - ret, - - #"Files with Stats" = - let - Source = #"Logs ALL", - #"Added Counter" = Table.AddColumn(Source, "Counter", each if [remove] <> null then -1 else if [add] <> null then 1 else null, Int8.Type), - #"Added file_name" = Table.AddColumn(#"Added Counter", "file_name", each if [add] <> null then Record.Field([add], "path") else if [remove] <> null then Record.Field([remove], "path") else null, Text.Type), - #"Filtered Rows" = Table.SelectRows(#"Added file_name", each ([file_name] <> null)), - #"URI Decoded" = Table.TransformColumns(#"Filtered Rows",{{"file_name", fn_URIDecode, type text}}), - #"Added partitionValuesTable" = Table.AddColumn(#"URI Decoded", "partitionValuesTable", each if [add] <> null then if Value.Is(Record.Field([add], "partitionValues"), Record.Type) then Record.ToTable(Record.Field([add], "partitionValues")) else Table.RenameColumns(Record.Field([add], "partitionValues"), {"Key", "Name"}) else null, type nullable table), - #"Added partitionValuesJSON" = Table.AddColumn(#"Added partitionValuesTable", "partitionValuesJSON", each Text.FromBinary(Json.FromValue([partitionValuesTable]))), - #"Added stats" = Table.AddColumn(#"Added partitionValuesJSON", "stats", each if [add] <> null and Record.HasFields([add], "stats") and Value.Is(Record.Field([add], "stats"), type text) - then Record.Field([add], "stats") - else null, type text), - #"Grouped Rows1" = Table.Group(#"Added stats", {"file_name"}, {{"partitionValuesJSON", each List.Max([partitionValuesJSON]), type nullable text}, {"stats", each List.Max([stats]), type nullable text}, {"isRelevant", each List.Sum([Counter]), type nullable text}}), - #"Relevant Files" = Table.SelectRows(#"Grouped Rows1", each ([isRelevant] > 0)), - #"Added partitionValuesTable2" = Table.AddColumn(#"Relevant Files", "partitionValuesTable", each try Table.FromRecords(Json.Document([partitionValuesJSON])) otherwise null), - #"Added partitionValuesRecord" = Table.AddColumn(#"Added partitionValuesTable2", "partitionValuesRecord", each Record.TransformFields(Record.FromTable([partitionValuesTable]), Table.SelectRows(#"metadata_columns", each [isPartitionedBy] = true)[ColumnTransformation]), Expression.Evaluate("type [" & Text.Combine(Table.SelectRows(#"metadata_columns", each [isPartitionedBy] = true)[TableDataType], ", ") & "]", PQ_DataTypes)), - #"Expanded partitionValuesRecord" = Table.ExpandRecordColumn(#"Added partitionValuesRecord", "partitionValuesRecord", Table.SelectRows(#"metadata_columns", each [isPartitionedBy] = true)[physicalName]), - #"Renamed for Filters" = Table.RenameColumns(#"Expanded partitionValuesRecord",Table.ToRows(Table.SelectColumns(Table.SelectRows(metadata_columns, each [isPartitionedBy]),{"physicalName", "name"}))), - #"Apply PartitionFilterFunction" = Table.SelectRows(#"Renamed for Filters", each PartitionFilterFunction(_)), - #"Parse stats to JSON" = Table.AddColumn(#"Apply PartitionFilterFunction", "JSON", each if [stats] = null then null else Json.Document([stats]), type [minValues=list, maxValues=list, numRecords=Int64.Type, nullCount=Int64.Type]), - #"Expanded Stats" = Table.ExpandRecordColumn(#"Parse stats to JSON", "JSON", {"minValues", "maxValues", "numRecords", "nullCount"}, {"minValues", "maxValues", "numRecords", "nullCount"}), - #"Removed Columns" = Table.RemoveColumns(#"Expanded Stats",{"partitionValuesJSON", "stats", "isRelevant", "partitionValuesTable"}), - #"Apply StatsFilterFunction" = Table.SelectRows(#"Removed Columns", each StatsFilterFunction([minValues], [maxValues])), - #"Renamed to physicalNames" = Table.RenameColumns(#"Apply StatsFilterFunction",Table.ToRows(Table.SelectColumns(Table.SelectRows(metadata_columns, each [isPartitionedBy]),{"name", "physicalName"}))) - in - #"Renamed to physicalNames", - - #"Data" = - let - #"Added Full_Path" = Table.AddColumn(#"Files with Stats", "Full_Path", each Text.Replace(DeltaTablePath & [file_name], "/", Delimiter), Text.Type), - #"Removed FilteringColumns" = Table.RemoveColumns(#"Added Full_Path",{"file_name", "minValues", "maxValues", "numRecords", "nullCount"}), - #"Buffered RelevantFiles" = Table.Buffer(#"Removed FilteringColumns"), - #"Merged Queries" = Table.NestedJoin(#"Buffered RelevantFiles", {"Full_Path"}, DeltaTableFolderContent_wFullPath, {"Full_Path"}, "DeltaTable Folder", JoinKind.Inner), - #"Removed Full_Path" = Table.RemoveColumns(#"Merged Queries",{"Full_Path"}), - #"Expanded DeltaTable Folder" = Table.ExpandTableColumn(#"Removed Full_Path", "DeltaTable Folder", {"Content"}, {"Content"}), - BufferFile = if UseFileBuffer then Table.TransformColumns(#"Expanded DeltaTable Folder",{{"Content", Binary.Buffer}}) else #"Expanded DeltaTable Folder", - #"Read Parquet" = Table.AddColumn(BufferFile, "Data", each Parquet.Document([Content]), type table), - #"Removed Binary Column" = Table.RemoveColumns(#"Read Parquet",{"Content"}), - #"Combine Partition Values" = Table.CombineColumnsToRecord(#"Removed Binary Column", "cols", List.RemoveItems(Table.ColumnNames(#"Removed Binary Column"), {"Data"})), - #"Combine Files" = Table.Combine(Table.TransformRows(#"Combine Partition Values", each fn_AddColumnsToTable(_[cols], _[Data])), PhysicalTableSchema), - #"Changed Type" = Table.TransformColumns(#"Combine Files",Table.SelectRows(metadata_columns, each [type] = "timestamp")[ColumnTransformation]), - #"Table with TimeZoneOffset" = if TimeZoneOffset = null then #"Combine Files" else #"Changed Type", - #"Reordered Columns" = Table.ReorderColumns(#"Table with TimeZoneOffset", metadata_columns[physicalName]), - #"Renamed Columns" = Table.RenameColumns(#"Reordered Columns",Table.ToRows(Table.SelectColumns(metadata_columns,{"physicalName", "name"}))), - #"Renamed ComplexTypes" = #"Renamed Columns" //Table.TransformColumnTypes(#"Renamed Columns",Table.ToRows(Table.SelectColumns(Table.SelectRows(metadata_columns, each [name] = "structColumn"),{"name", "PBI_DataType"}))) - //Table.TransformColumnTypes(#"Renamed Columns",Table.ToRows(Table.SelectColumns(Table.SelectRows(metadata_columns, each [name] = "structColumn"),{"name", "PBI_DataType"}))) - , - - #"Validate ReaderVersion" = if DeltaProtocol{0}[minReaderVersion] <= 2 then #"Renamed ComplexTypes" else error Error.Record("DeltaLakeVersionNotSupported", "This Connector currently only supports DeltaLake tables up to version 2.", "minReaderVersion"), - FinalDeltaTable = Table.View( - #"Validate ReaderVersion", - [ - GetType = () => TableSchema, - GetRowCount = () => List.Sum(#"Files with Stats"[numRecords]) - //,OnSelectRows = (condition) => Table.FirstN(#"Reordered Columns", 3) - ] - ) - in - FinalDeltaTable - - in - #"Data", - - documentation = [ - Documentation.Name = "fn_ReadDeltaTable", - Documentation.Description = "Takes the file/folder list of a Delta Lake table and returns the content as a table object in Power Query.", - Documentation.LongDescription = "Takes the file/folder list of a Delta Lake table and returns the content as a table object in Power Query. An optional 2nd parameter can be used to for special features like Time Travel, Partition Elimination, etc.", - Documentation.Category = "Table", - Documentation.Source = "https://github.com/delta-io/connectors/blob/master/powerbi/fn_ReadDeltaTable.pq", - Documentation.Version = "1.0", - Documentation.Author = "Gerhard Brueckl, paiqo GmbH", - Documentation.Examples = {[Description = "Reading Delta Lake table from Azure Blob Storage with Time-Travel", - Code = "let - Source = AzureStorage.Blobs(""https://gbadls01.blob.core.windows.net/public""), - #""Filtered Rows"" = Table.SelectRows(Source, each Text.StartsWith([Name], ""powerbi_delta/FactInternetSales_part.delta/"")), - DeltaTable = fn_ReadDeltaTable(#""Filtered Rows"", [Version=7]) -in - DeltaTable", - Result = "#table( {""ProductKey"", ""OrderDateKey"", ""Value""}, { {""A"", ""2020-01-01"", 123} ,{""B"", ""2020-04-02"", 45} } )"], - - [Description = "Reading Delta Lake table from Azure Data Lake Storage Gen2 with PartitionFilterFunction", - Code = "let - Source = AzureStorage.DataLake(""https://gbadls01.dfs.core.windows.net/public/powerbi_delta/FactInternetSales_part.delta"", [HierarchicalNavigation = false]), - DeltaTable = fn_ReadDeltaTable(Source, [PartitionFilterFunction=(x) => x[SalesTerritoryKey] = 3]) -in - DeltaTable", - Result = "#table( {""ProductKey"", ""OrderDateKey"", ""SalesTerritoryKey"", ""Value""}, { {""A"", ""2020-01-01"", 3, 123} ,{""B"", ""2020-04-02"", 3, 45} } )"] - } - ] - -in - Value.ReplaceType(fn_ReadDeltaTable, Value.ReplaceMetadata(Value.Type(fn_ReadDeltaTable), documentation)) \ No newline at end of file diff --git a/connectors/scalastyle-config.xml b/connectors/scalastyle-config.xml deleted file mode 100644 index 2143de7ae98..00000000000 --- a/connectors/scalastyle-config.xml +++ /dev/null @@ -1,423 +0,0 @@ - - - - - - - Scalastyle standard configuration - - - - - - - - - - true - - - - - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ARROW, EQUALS, ELSE, TRY, CATCH, FINALLY, LARROW, RARROW - - - - - - ARROW, EQUALS, COMMA, COLON, IF, ELSE, DO, WHILE, FOR, MATCH, TRY, CATCH, FINALLY, LARROW, RARROW - - - - - - - - - ^println$ - - - - - spark(.sqlContext)?.sparkContext.hadoopConfiguration - - - - - @VisibleForTesting - - - - - Runtime\.getRuntime\.addShutdownHook - - - - - mutable\.SynchronizedBuffer - - - - - Class\.forName - - - - - Await\.result - - - - - Await\.ready - - - - - (\.toUpperCase|\.toLowerCase)(?!(\(|\(Locale.ROOT\))) - - - - - throw new \w+Error\( - - - - - - JavaConversions - Instead of importing implicits in scala.collection.JavaConversions._, import - scala.collection.JavaConverters._ and use .asScala / .asJava methods - - - - org\.apache\.commons\.lang\. - Use Commons Lang 3 classes (package org.apache.commons.lang3.*) instead - of Commons Lang 2 (package org.apache.commons.lang.*) - - - - extractOpt - Use jsonOption(x).map(.extract[T]) instead of .extractOpt[T], as the latter - is slower. - - - - - java,scala,3rdParty,standalone,standaloneInternal - javax?\..* - scala\..* - (?!io\.delta\.standalone\.).* - io\.delta\.standalone\.(?!internal).* - io\.delta\.standalone\.internal\..* - - - - - - COMMA - - - - - - \)\{ - - - - - (?m)^(\s*)/[*][*].*$(\r|)\n^\1 [*] - Use Javadoc style indentation for multiline comments - - - - case[^\n>]*=>\s*\{ - Omit braces in case clauses. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 800> - - - - - 30 - - - - - 10 - - - - - 50 - - - - - - - - - - - -1,0,1,2,3 - - - diff --git a/connectors/sql-delta-import/readme.md b/connectors/sql-delta-import/readme.md deleted file mode 100644 index 4efcd60208f..00000000000 --- a/connectors/sql-delta-import/readme.md +++ /dev/null @@ -1,89 +0,0 @@ -# sql-delta-import - - Imports data from a relational database or any other JDBC source into your Delta Lake. - Import either entire table or only a subset of columns, control level of parallelism, - include any custom transformations - -Destination delta table has to exist before import. It's schema will be used to infer -desired columns and their data types - -## Basic Usage - -You can use included runner to import data without custom transformations by submitting -a spark job - -Ex: split data in source table by `id` into 10 chunks (default) and import it into -destination delta table - -```shell script -spark-submit / ---class "io.delta.connectors.spark.jdbc.ImportRunner" sql-delta-import.jar / ---jdbc-url jdbc:mysql://hostName:port/database / ---source source.table ---destination destination.table ---split-by id -``` -A good `split-by` column will be indexed and ideally will have close to uniform distribution -of data between it's `min` and `max` values - -## Control degree of import parallelism using `chunks` parameter and spark executor configuration - -```shell script -spark-submit --num-executors 15 --executor-cores 4 / ---conf spark.databricks.delta.optimizeWrite.enabled=true / ---conf spark.databricks.delta.autoCompact.enabled=true / ---class "io.delta.connectors.spark.jdbc.ImportRunner" sql-delta-import.jar / ---jdbc-url jdbc:mysql://hostName:port/database / ---source source.table ---destination destination.table ---split-by id ---chunks 500 -``` -Source table will be split by `id` column into 500 chunks but only at most 60 connections -(15 executors x 4 cores) will be used to import the data. This allows us to import large -tables without overloading underlying data store with large volume of connections. This -configuration is also useful when distribution of data by `split-by` column is not uniform -and there are "gaps" for large ranges of values. Delta's auto compaction and optimization -features are enabled via spark configuration to make sure that storage of imported data is -optimized - avoid small files and skewed file sizes. - -## Use JDBCImport in your project to specify custom transformations that will be applied during import - -```scala -import org.apache.spark.sql._ -import org.apache.spark.sql.functions._ -import org.apache.spark.sql.types._ -import io.delta.connectors.spark.jdbc._ - - implicit val spark: SparkSession = SparkSession - .builder() - .master("local[*]") - .getOrCreate() - - // All additional possible jdbc connector properties described here - - // https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-configuration-properties.html - - val jdbcUrl = "jdbc:mysql://hostName:port/database" - - val config = ImportConfig( - source = "table", - destination = "target_database.table", - splitBy = "id", - chunks = 10) - - // define a transform to convert all timestamp columns to strings - val timeStampsToStrings : DataFrame => DataFrame = source => { - val tsCols = source.schema.fields.filter(_.dataType == DataTypes.TimestampType).map(_.name) - tsCols.foldLeft(source)((df, colName) => - df.withColumn(colName, from_unixtime(unix_timestamp(col(colName)), "yyyy-MM-dd HH:mm:ss.S"))) -} - - // Whatever functions are passed to below transform will be applied during import - val transforms = new DataTransforms(Seq( - df => df.withColumn("id", col("id").cast(types.StringType)), // cast id column to string - timeStampsToStrings // use transform defined above for timestamp conversion - )) - - new JDBCImport(jdbcUrl = jdbcUrl, importConfig = config, dataTransform = transforms) - .run() -``` diff --git a/connectors/sql-delta-import/src/main/scala/DataTransforms.scala b/connectors/sql-delta-import/src/main/scala/DataTransforms.scala deleted file mode 100644 index bd02c4b6678..00000000000 --- a/connectors/sql-delta-import/src/main/scala/DataTransforms.scala +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.connectors.spark.jdbc - -import org.apache.spark.sql.DataFrame - -/** - * Class that applies transformation functions one by one on input DataFrame - */ -class DataTransforms(transformations: Seq[DataFrame => DataFrame]) { - - /** - * Executes functions against DataFrame - * - * @param df - input DataFrame against which functions need to be executed - * @return - modified by Seq of functions DataFrame - */ - def runTransform(df: DataFrame): DataFrame = transformations.foldLeft(df)((v, f) => f(v)) -} diff --git a/connectors/sql-delta-import/src/main/scala/ImportRunner.scala b/connectors/sql-delta-import/src/main/scala/ImportRunner.scala deleted file mode 100644 index 9b994c372cd..00000000000 --- a/connectors/sql-delta-import/src/main/scala/ImportRunner.scala +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.connectors.spark.jdbc - -import org.apache.spark.sql.SparkSession -import org.rogach.scallop.{ScallopConf, ScallopOption} - -/** - * Spark app that wraps functionality of JDBCImport and exposes configuration as command line args - */ -object ImportRunner { - - def main(args: Array[String]): Unit = { - val config = new ImportRunnerConfig(args) - - implicit val spark = SparkSession - .builder() - .appName("sql-delta-import") - .getOrCreate() - - val importConfig = ImportConfig( - config.source(), - config.destination(), - config.splitBy(), - config.chunks()) - - val transforms = new DataTransforms(Seq.empty) - - JDBCImport( - jdbcUrl = config.jdbcUrl(), - importConfig = importConfig, - dataTransforms = transforms - ).run - } -} - -class ImportRunnerConfig(arguments: Seq[String]) extends ScallopConf(arguments) { - val className = "io.delta.connectors.spark.jdbc.ImportRunner" - val jarName = "sql-delta-import.jar" - - banner("\nOptions:\n") - footer( - s"""Usage: - |spark-submit {spark options} --class $className $jarName OPTIONS - |""".stripMargin) - - override def mainOptions: Seq[String] = Seq("jdbcUrl", "source", "destination", "splitBy") - - val jdbcUrl: ScallopOption[String] = opt[String](required = true) - val source: ScallopOption[String] = opt[String](required = true) - val destination: ScallopOption[String] = opt[String](required = true) - val splitBy: ScallopOption[String] = opt[String](required = true) - val chunks: ScallopOption[Int] = opt[Int](default = Some(10)) - - verify() -} diff --git a/connectors/sql-delta-import/src/main/scala/JDBCImport.scala b/connectors/sql-delta-import/src/main/scala/JDBCImport.scala deleted file mode 100644 index 9684ecb5c0b..00000000000 --- a/connectors/sql-delta-import/src/main/scala/JDBCImport.scala +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.connectors.spark.jdbc - -import java.util.Properties - -import io.delta.tables.DeltaTable -import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession} -import org.apache.spark.sql.functions.col - -/** - * Class that contains JDBC source, read parallelism params and target table name - * - * @param source - JDBC source table - * @param destination - Delta target database.table - * @param splitBy - column by which to split source data while reading - * @param chunks - to how many chunks split jdbc source data - */ -case class ImportConfig(source: String, destination: String, splitBy: String, chunks: Int) { - val bounds_sql = s""" - (select min($splitBy) as lower_bound, max($splitBy) as upper_bound from $source) as bounds - """ -} - -/** - * Class that does reading from JDBC source, transform and writing to Delta table - * - * @param jdbcUrl - url connecting string for jdbc source - * @param importConfig - case class that contains source read parallelism params and target table - * @param jdbcParams - additional JDBC session params like isolation level, perf tuning, - * net wait params etc... - * @param dataTransform - contains function that we should apply to transform our source data - */ -class JDBCImport(jdbcUrl: String, - importConfig: ImportConfig, - jdbcParams: Map[String, String] = Map(), - dataTransform: DataTransforms) - (implicit val spark: SparkSession) { - - import spark.implicits._ - - implicit def mapToProperties(m: Map[String, String]): Properties = { - val properties = new Properties() - m.foreach(pair => properties.put(pair._1, pair._2)) - properties - } - - // list of columns to import is obtained from schema of destination delta table - private lazy val targetColumns = DeltaTable - .forName(importConfig.destination) - .toDF - .schema - .fieldNames - - private lazy val sourceDataframe = readJDBCSourceInParallel() - .select(targetColumns.map(col): _*) - - /** - * obtains lower and upper bound of source table and uses those values to read in a JDBC dataframe - * @return a dataframe read from source table - */ - private def readJDBCSourceInParallel(): DataFrame = { - - val (lower, upper) = spark - .read - .jdbc(jdbcUrl, importConfig.bounds_sql, jdbcParams) - .as[(Option[Long], Option[Long])] - .take(1) - .map { case (a, b) => (a.getOrElse(0L), b.getOrElse(0L)) } - .head - - spark.read.jdbc( - jdbcUrl, - importConfig.source, - importConfig.splitBy, - lower, - upper, - importConfig.chunks, - jdbcParams) - } - - private implicit class DataFrameExtensionOps(df: DataFrame) { - - def runTransform(): DataFrame = dataTransform.runTransform(sourceDataframe) - - def writeToDelta(deltaTableToWrite: String): Unit = df - .write - .format("delta") - .mode(SaveMode.Overwrite) - .insertInto(deltaTableToWrite) - } - - /** - * Runs transform against dataframe read from jdbc and writes it to Delta table - */ - def run(): Unit = { - sourceDataframe - .runTransform() - .writeToDelta(importConfig.destination) - } -} - -object JDBCImport { - def apply(jdbcUrl: String, - importConfig: ImportConfig, - jdbcParams: Map[String, String] = Map(), - dataTransforms: DataTransforms = new DataTransforms(Seq.empty)) - (implicit spark: SparkSession): JDBCImport = { - - new JDBCImport(jdbcUrl, importConfig, jdbcParams, dataTransforms) - } -} diff --git a/connectors/sql-delta-import/src/test/scala/ImportTest.scala b/connectors/sql-delta-import/src/test/scala/ImportTest.scala deleted file mode 100644 index c4835d81d1f..00000000000 --- a/connectors/sql-delta-import/src/test/scala/ImportTest.scala +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.connectors.spark.jdbc - -import java.io.File -import java.nio.file.Files -import java.sql.{Connection, DriverManager} -import java.util.UUID - -import org.apache.commons.io.FileUtils -import org.apache.spark.sql.{DataFrame, SparkSession} -import org.apache.spark.sql.functions._ -import org.apache.spark.sql.types.DataTypes -import org.scalatest.BeforeAndAfterAll -import org.scalatest.FunSuite - -class ImportTest extends FunSuite with BeforeAndAfterAll { - - def withTempDir(f: File => Unit): Unit = { - val dir = Files.createTempDirectory(UUID.randomUUID().toString).toFile - try f(dir) finally { - FileUtils.deleteDirectory(dir) - } - } - - private def initDataSource (conn: Connection) = { - conn.prepareStatement("create schema test").executeUpdate() - conn.prepareStatement( - """ - create table test.tbl( - id TINYINT, - status SMALLINT, - ts TIMESTAMP, - title VARCHAR)""" - ).executeUpdate() - conn.prepareStatement( - """ - insert into test.tbl(id, status, ts, title ) VALUES - (1, 2, parsedatetime('01-02-2021 01:02:21', 'dd-MM-yyyy hh:mm:ss'),'lorem ipsum'), - (3, 4, parsedatetime('03-04-2021 03:04:21', 'dd-MM-yyyy hh:mm:ss'),'lorem'), - (5, 6, parsedatetime('05-06-2021 05:06:21', 'dd-MM-yyyy hh:mm:ss'),'ipsum'), - (7, 8, parsedatetime('07-08-2021 07:08:21', 'dd-MM-yyyy hh:mm:ss'),'Lorem Ipsum') - """ - ).executeUpdate() - } - - implicit lazy val spark: SparkSession = SparkSession - .builder() - .master("local[*]") - .appName("spark session") - .config("spark.sql.shuffle.partitions", "10") - .config("spark.ui.enabled", "false") - .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") - .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") - .getOrCreate() - - val url = "jdbc:h2:mem:testdb;DATABASE_TO_UPPER=FALSE" - - DriverManager.registerDriver(new org.h2.Driver()) - - val conn = DriverManager.getConnection(url) - initDataSource(conn) - - override def afterAll() { - spark.catalog.clearCache() - spark.sharedState.cacheManager.clearCache() - conn.close() - } - - val chunks = 2 - - test("import data into a delta table") { - withTempDir { tempDir => - spark.sql("DROP TABLE IF EXISTS tbl") - spark.sql(s""" - CREATE TABLE tbl (id INT, status INT, title STRING) - USING DELTA - LOCATION "${tempDir.getCanonicalPath}/tbl" - """) - - - JDBCImport(url, ImportConfig("test.tbl", "tbl", "id", chunks)).run() - - // since we imported data without any optimizations number of - // read partitions should equal number of chunks used during import - assert(spark.table("tbl").rdd.getNumPartitions == chunks) - - val imported = spark.sql("select * from tbl") - .collect() - .sortBy(a => a.getAs[Int]("id")) - - assert(imported.length == 4) - assert(imported.map(a => a.getAs[Int]("id")).toSeq == Seq(1, 3, 5, 7)) - assert(imported.map(a => a.getAs[Int]("status")).toSeq == Seq(2, 4, 6, 8)) - assert(imported.map(a => a.getAs[String]("title")).toSeq == - Seq("lorem ipsum", "lorem", "ipsum", "Lorem Ipsum")) - } - } - - test("transform data before importing it into a delta table") { - withTempDir { tempDir => - spark.sql("DROP TABLE IF EXISTS tbl2") - spark.sql(s""" - CREATE TABLE tbl2 (id INT, status INT, ts STRING, title STRING) - USING DELTA - LOCATION "${tempDir.getCanonicalPath}/tbl2" - """) - - val timeStampsToStrings : DataFrame => DataFrame = source => { - val tsCols = source.schema.fields.filter(_.dataType == DataTypes.TimestampType).map(_.name) - tsCols.foldLeft(source)((df, name) => - df.withColumn(name, from_unixtime(unix_timestamp(col(name)), "yy-MM-dd HH:mm"))) - } - - val transforms = new DataTransforms(Seq( - a => a.withColumn("title", upper(col("title"))), - timeStampsToStrings - )) - - JDBCImport( - jdbcUrl = url, - importConfig = ImportConfig("test.tbl", "tbl2", "id", 2), - dataTransforms = transforms).run() - - val imported = spark.sql("select * from tbl2") - .collect() - .sortBy(a => a.getAs[Int]("id")) - - assert(imported.length == 4) - assert(imported.map(a => a.getAs[String]("title")).toSeq == - Seq("LOREM IPSUM", "LOREM", "IPSUM", "LOREM IPSUM")) - - assert(imported.map(a => a.getAs[String]("ts")).toSeq == - Seq("21-02-01 01:02", "21-04-03 03:04", "21-06-05 05:06", "21-08-07 07:08")) - } - } - -} diff --git a/connectors/standalone-parquet/src/main/java/io/delta/standalone/util/ParquetSchemaConverter.java b/connectors/standalone-parquet/src/main/java/io/delta/standalone/util/ParquetSchemaConverter.java deleted file mode 100644 index cc238de0bf1..00000000000 --- a/connectors/standalone-parquet/src/main/java/io/delta/standalone/util/ParquetSchemaConverter.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.util; - -import org.apache.parquet.schema.MessageType; - -import io.delta.standalone.types.StructType; - -import io.delta.standalone.internal.util.SparkToParquetSchemaConverter; - -/** - * :: DeveloperApi :: - *

- * Converter class to convert {@link StructType} to Parquet {@link MessageType}. - */ -public final class ParquetSchemaConverter { - - private ParquetSchemaConverter(){}; - - /** - * :: DeveloperApi :: - *

- * Represents Parquet timestamp types. - *

- */ - public enum ParquetOutputTimestampType { - INT96, - TIMESTAMP_MICROS, - TIMESTAMP_MILLIS - } - - public static final Boolean writeLegacyParquetFormatDefault = false; - public static final ParquetOutputTimestampType outputTimestampTypeDefault = - ParquetOutputTimestampType.INT96; - - /** - * :: DeveloperApi :: - *

- * Convert a {@link StructType} to Parquet {@link MessageType}. - * - * @param schema the schema to convert - * @return {@code schema} as a Parquet {@link MessageType} - * @throws IllegalArgumentException if a {@code StructField} name contains invalid character(s) - */ - public static MessageType deltaToParquet(StructType schema) { - return new SparkToParquetSchemaConverter( - writeLegacyParquetFormatDefault, - outputTimestampTypeDefault).convert(schema); - } - - /** - * :: DeveloperApi :: - *

- * Convert a {@link StructType} to Parquet {@link MessageType}. - * - * @param schema the schema to convert - * @param writeLegacyParquetFormat Whether to use legacy Parquet format compatible with Spark - * 1.4 and prior versions when converting a {@link StructType} to a Parquet - * {@link MessageType}. When set to false, use standard format defined in parquet-format - * spec. - * @return {@code schema} as a Parquet {@link MessageType} - * @throws IllegalArgumentException if a {@code StructField} name contains invalid character(s) - */ - public static MessageType deltaToParquet(StructType schema, Boolean writeLegacyParquetFormat) { - return new SparkToParquetSchemaConverter( - writeLegacyParquetFormat, - outputTimestampTypeDefault).convert(schema); - } - - /** - * :: DeveloperApi :: - *

- * Convert a {@link StructType} to Parquet {@link MessageType}. - * - * @param schema the schema to convert - * @param outputTimestampType which parquet timestamp type to use when writing - * @return {@code schema} as a Parquet {@link MessageType} - * @throws IllegalArgumentException if a {@code StructField} name contains invalid character(s) - */ - public static MessageType deltaToParquet( - StructType schema, - ParquetOutputTimestampType outputTimestampType) { - return new SparkToParquetSchemaConverter( - writeLegacyParquetFormatDefault, - outputTimestampType).convert(schema); - } - - /** - * :: DeveloperApi :: - *

- * Convert a {@link StructType} to Parquet {@link MessageType}. - * - * @param schema the schema to convert - * @param writeLegacyParquetFormat Whether to use legacy Parquet format compatible with Spark - * 1.4 and prior versions when converting a {@link StructType} to a Parquet - * {@link MessageType}. When set to false, use standard format defined in parquet-format - * spec. - * @param outputTimestampType which parquet timestamp type to use when writing - * @return {@code schema} as a Parquet {@link MessageType} - * @throws IllegalArgumentException if a {@code StructField} name contains invalid character(s) - */ - public static MessageType deltaToParquet( - StructType schema, - Boolean writeLegacyParquetFormat, - ParquetOutputTimestampType outputTimestampType) { - return new SparkToParquetSchemaConverter( - writeLegacyParquetFormat, - outputTimestampType).convert(schema); - } -} diff --git a/connectors/standalone-parquet/src/main/scala/io/delta/standalone/internal/util/ParquetSchemaConverter.scala b/connectors/standalone-parquet/src/main/scala/io/delta/standalone/internal/util/ParquetSchemaConverter.scala deleted file mode 100644 index c75c33a9ca4..00000000000 --- a/connectors/standalone-parquet/src/main/scala/io/delta/standalone/internal/util/ParquetSchemaConverter.scala +++ /dev/null @@ -1,340 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import org.apache.parquet.schema.{ConversionPatterns, MessageType, Type, Types} -import org.apache.parquet.schema.OriginalType._ -import org.apache.parquet.schema.PrimitiveType.PrimitiveTypeName._ -import org.apache.parquet.schema.Type.Repetition._ - -import io.delta.standalone.types._ -import io.delta.standalone.util.ParquetSchemaConverter.ParquetOutputTimestampType - -/** - * This converter class is used to convert Spark SQL [[StructType]] to Parquet [[MessageType]]. - * - * @param writeLegacyParquetFormat Whether to use legacy Parquet format compatible with Spark 1.4 - * and prior versions when converting a [[StructType]] to a Parquet [[MessageType]]. - * When set to false, use standard format defined in parquet-format spec. This argument only - * affects Parquet write path. - * @param outputTimestampType which parquet timestamp type to use when writing. - */ -private[standalone] class SparkToParquetSchemaConverter( - writeLegacyParquetFormat: Boolean, - outputTimestampType: ParquetOutputTimestampType) { - - /** - * Converts a Spark SQL [[StructType]] to a Parquet [[MessageType]]. - */ - def convert(schema: StructType): MessageType = { - Types - .buildMessage() - .addFields(schema.getFields.map(convertField): _*) - .named(ParquetSchemaConverter.SPARK_PARQUET_SCHEMA_NAME) - } - - /** - * Converts a Spark SQL [[StructField]] to a Parquet [[Type]]. - */ - private def convertField(field: StructField): Type = { - convertField(field, if (field.isNullable) OPTIONAL else REQUIRED) - } - - private def convertField(field: StructField, repetition: Type.Repetition): Type = { - ParquetSchemaConverter.checkFieldName(field.getName) - - field.getDataType match { - // =================== - // Simple atomic types - // =================== - - case _: BooleanType => - Types.primitive(BOOLEAN, repetition).named(field.getName) - - case _: ByteType => - Types.primitive(INT32, repetition).as(INT_8).named(field.getName) - - case _: ShortType => - Types.primitive(INT32, repetition).as(INT_16).named(field.getName) - - case _: IntegerType => - Types.primitive(INT32, repetition).named(field.getName) - - case _: LongType => - Types.primitive(INT64, repetition).named(field.getName) - - case _: FloatType => - Types.primitive(FLOAT, repetition).named(field.getName) - - case _: DoubleType => - Types.primitive(DOUBLE, repetition).named(field.getName) - - case _: StringType => - Types.primitive(BINARY, repetition).as(UTF8).named(field.getName) - - case _: DateType => - Types.primitive(INT32, repetition).as(DATE).named(field.getName) - - // NOTE: Spark SQL can write timestamp values to Parquet using INT96, TIMESTAMP_MICROS or - // TIMESTAMP_MILLIS. TIMESTAMP_MICROS is recommended but INT96 is the default to keep the - // behavior same as before. - // - // As stated in PARQUET-323, Parquet `INT96` was originally introduced to represent nanosecond - // timestamp in Impala for some historical reasons. It's not recommended to be used for any - // other types and will probably be deprecated in some future version of parquet-format spec. - // That's the reason why parquet-format spec only defines `TIMESTAMP_MILLIS` and - // `TIMESTAMP_MICROS` which are both logical types annotating `INT64`. - // - // Originally, Spark SQL uses the same nanosecond timestamp type as Impala and Hive. Starting - // from Spark 1.5.0, we resort to a timestamp type with microsecond precision so that we can - // store a timestamp into a `Long`. This design decision is subject to change though, for - // example, we may resort to nanosecond precision in the future. - case _: TimestampType => - outputTimestampType match { - case ParquetOutputTimestampType.INT96 => - Types.primitive(INT96, repetition).named(field.getName) - case ParquetOutputTimestampType.TIMESTAMP_MICROS => - Types.primitive(INT64, repetition).as(TIMESTAMP_MICROS).named(field.getName) - case ParquetOutputTimestampType.TIMESTAMP_MILLIS => - Types.primitive(INT64, repetition).as(TIMESTAMP_MILLIS).named(field.getName) - } - - case _: BinaryType => - Types.primitive(BINARY, repetition).named(field.getName) - - // ====================== - // Decimals (legacy mode) - // ====================== - - // Spark 1.4.x and prior versions only support decimals with a maximum precision of 18 and - // always store decimals in fixed-length byte arrays. To keep compatibility with these older - // versions, here we convert decimals with all precisions to `FIXED_LEN_BYTE_ARRAY` annotated - // by `DECIMAL`. - case decimalType: DecimalType if writeLegacyParquetFormat => - Types - .primitive(FIXED_LEN_BYTE_ARRAY, repetition) - .as(DECIMAL) - .precision(decimalType.getPrecision) - .scale(decimalType.getScale) - .length(computeMinBytesForPrecision(decimalType.getPrecision)) - .named(field.getName) - - // ======================== - // Decimals (standard mode) - // ======================== - - // Uses INT32 for 1 <= precision <= 9 - case decimalType: DecimalType - if decimalType.getPrecision <= 9 && !writeLegacyParquetFormat => - Types - .primitive(INT32, repetition) - .as(DECIMAL) - .precision(decimalType.getPrecision) - .scale(decimalType.getScale) - .named(field.getName) - - // Uses INT64 for 1 <= precision <= 18 - case decimalType: DecimalType - if decimalType.getPrecision <= 18 && !writeLegacyParquetFormat => - Types - .primitive(INT64, repetition) - .as(DECIMAL) - .precision(decimalType.getPrecision) - .scale(decimalType.getScale) - .named(field.getName) - - // Uses FIXED_LEN_BYTE_ARRAY for all other precisions - case decimalType: DecimalType if !writeLegacyParquetFormat => - Types - .primitive(FIXED_LEN_BYTE_ARRAY, repetition) - .as(DECIMAL) - .precision(decimalType.getPrecision) - .scale(decimalType.getScale) - .length(computeMinBytesForPrecision(decimalType.getPrecision)) - .named(field.getName) - - // =================================== - // ArrayType and MapType (legacy mode) - // =================================== - - // Spark 1.4.x and prior versions convert `ArrayType` with nullable elements into a 3-level - // `LIST` structure. This behavior is somewhat a hybrid of parquet-hive and parquet-avro - // (1.6.0rc3): the 3-level structure is similar to parquet-hive while the 3rd level element - // field name "array" is borrowed from parquet-avro. - case arrayType: ArrayType if arrayType.containsNull && writeLegacyParquetFormat => - // group (LIST) { - // optional group bag { - // repeated array; - // } - // } - - // This should not use `listOfElements` here because this new method checks if the - // element name is `element` in the `GroupType` and throws an exception if not. - // As mentioned above, Spark prior to 1.4.x writes `ArrayType` as `LIST` but with - // `array` as its element name as below. Therefore, we build manually - // the correct group type here via the builder. (See SPARK-16777) - Types - .buildGroup(repetition).as(LIST) - .addField(Types - .buildGroup(REPEATED) - // "array" is the name chosen by parquet-hive (1.7.0 and prior version) - .addField(convertField( - new StructField("array", arrayType.getElementType, arrayType.containsNull))) - .named("bag")) - .named(field.getName) - - // Spark 1.4.x and prior versions convert ArrayType with non-nullable elements into a 2-level - // LIST structure. This behavior mimics parquet-avro (1.6.0rc3). Note that this case is - // covered by the backwards-compatibility rules implemented in `isElementType()`. - case arrayType: ArrayType if !arrayType.containsNull && writeLegacyParquetFormat => - // group (LIST) { - // repeated element; - // } - - // Here too, we should not use `listOfElements`. (See SPARK-16777) - Types - .buildGroup(repetition).as(LIST) - // "array" is the name chosen by parquet-avro (1.7.0 and prior version) - .addField(convertField( - new StructField("array", arrayType.getElementType, arrayType.containsNull), REPEATED)) - .named(field.getName) - - // Spark 1.4.x and prior versions convert MapType into a 3-level group annotated by - // MAP_KEY_VALUE. This is covered by `convertGroupField(field: GroupType): DataType`. - case mapType: MapType if writeLegacyParquetFormat => - // group (MAP) { - // repeated group map (MAP_KEY_VALUE) { - // required key; - // value; - // } - // } - ConversionPatterns.mapType( - repetition, - field.getName, - "key_value", - convertField(new StructField("key", mapType.getKeyType, false)), - convertField(new StructField("value", mapType.getValueType, mapType.valueContainsNull))) - - // ===================================== - // ArrayType and MapType (standard mode) - // ===================================== - - case arrayType: ArrayType if !writeLegacyParquetFormat => - // group (LIST) { - // repeated group list { - // element; - // } - // } - Types - .buildGroup(repetition).as(LIST) - .addField( - Types.repeatedGroup() - .addField(convertField( - new StructField("element", arrayType.getElementType, arrayType.containsNull))) - .named("list")) - .named(field.getName) - - case mapType: MapType if !writeLegacyParquetFormat => - // group (MAP) { - // repeated group key_value { - // required key; - // value; - // } - // } - Types - .buildGroup(repetition).as(MAP) - .addField( - Types - .repeatedGroup() - .addField(convertField(new StructField("key", mapType.getKeyType, false))) - .addField(convertField( - new StructField("value", mapType.getValueType, mapType.valueContainsNull()))) - .named("key_value")) - .named(field.getName) - - // =========== - // Other types - // =========== - - case structType: StructType => - structType.getFields.foldLeft(Types.buildGroup(repetition)) { (builder, field) => - builder.addField(convertField(field)) - }.named(field.getName) - - case _ => - throw new UnsupportedOperationException( - s"Unsupported data type ${field.getDataType.getTypeName}") - } - } - - // Returns the minimum number of bytes needed to store a decimal with a given `precision`. - private def computeMinBytesForPrecision(precision: Int) : Int = { - var numBytes = 1 - while (math.pow(2.0, 8 * numBytes - 1) < math.pow(10.0, precision)) { - numBytes += 1 - } - numBytes - } -} - -private object ParquetSchemaConverter { - val SPARK_PARQUET_SCHEMA_NAME = "spark_schema" - - val EMPTY_MESSAGE: MessageType = - Types.buildMessage().named(ParquetSchemaConverter.SPARK_PARQUET_SCHEMA_NAME) - - def checkFieldName(name: String): Unit = { - // ,;{}()\n\t= and space are special characters in Parquet schema - checkConversionRequirement( - !name.matches(".*[ ,;{}()\n\t=].*"), - s"""Attribute name "$name" contains invalid character(s) among " ,;{}()\\n\\t=". - |Please use alias to rename it. - """.stripMargin.split("\n").mkString(" ").trim) - } - - def checkFieldNames(names: Seq[String]): Unit = { - names.foreach(checkFieldName) - } - - def checkConversionRequirement(f: => Boolean, message: String): Unit = { - if (!f) { - throw new IllegalArgumentException(message) - } - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/CommitResult.java b/connectors/standalone/src/main/java/io/delta/standalone/CommitResult.java deleted file mode 100644 index bb726109d9a..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/CommitResult.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone; - -/** - * Wrapper around the result of {@link OptimisticTransaction#commit}. - */ -public final class CommitResult { - private final long version; - - public CommitResult(long version) { - this.version = version; - } - - /** - * @return the table version that was committed. - */ - public long getVersion() { - return version; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/DeltaLog.java b/connectors/standalone/src/main/java/io/delta/standalone/DeltaLog.java deleted file mode 100644 index 7c673f899e9..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/DeltaLog.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone; - -import java.util.Iterator; - -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.Path; - -import io.delta.standalone.actions.CommitInfo; -import io.delta.standalone.internal.DeltaLogImpl; - -/** - * Represents the transaction logs of a Delta table. It provides APIs to access the states of a - * Delta table. - *

- * You can use the following code to create a {@link DeltaLog} instance. - *

{@code
- *   Configuration conf = ... // Create your own Hadoop Configuration instance
- *   DeltaLog deltaLog = DeltaLog.forTable(conf, "/the/delta/table/path");
- * }
- */ -public interface DeltaLog { - - /** - * @return the current {@link Snapshot} of the Delta table. You may need to call - * {@link #update()} to access the latest snapshot if the current snapshot is stale. - */ - Snapshot snapshot(); - - /** - * Bring {@link DeltaLog}'s current {@link Snapshot} to the latest state if there are any new - * transaction logs. - * - * @return the latest snapshot after applying the new transaction logs. - */ - Snapshot update(); - - /** - * Travel back in time to the {@link Snapshot} with the provided {@code version} number. - * - * @param version the snapshot version to generate - * @return the snapshot at the provided {@code version} - * @throws IllegalArgumentException if the {@code version} is outside the range of available - * versions - */ - Snapshot getSnapshotForVersionAsOf(long version); - - /** - * Travel back in time to the latest {@link Snapshot} that was generated at or before - * {@code timestamp}. - * - * @param timestamp the number of milliseconds since midnight, January 1, 1970 UTC - * @return the snapshot nearest to, but not after, the provided {@code timestamp} - * @throws RuntimeException if the snapshot is unable to be recreated - * @throws IllegalArgumentException if the {@code timestamp} is before the earliest possible - * snapshot or after the latest possible snapshot - */ - Snapshot getSnapshotForTimestampAsOf(long timestamp); - - /** - * Returns a new {@link OptimisticTransaction} that can be used to read the current state of the - * log and then commit updates. The reads and updates will be checked for logical conflicts - * with any concurrent writes to the log. - *

- * Note that all reads in a transaction must go through the returned transaction object, and not - * directly to the {@link DeltaLog} otherwise they will not be checked for conflicts. - * - * @return a new {@link OptimisticTransaction}. - */ - OptimisticTransaction startTransaction(); - - /** - * @param version the commit version to retrieve {@link CommitInfo} - * @return the {@link CommitInfo} of the commit at the provided version. - */ - CommitInfo getCommitInfoAt(long version); - - /** @return the path of the Delta table. */ - Path getPath(); - - /** - * Get all actions starting from {@code startVersion} (inclusive) in increasing order of - * committed version. - *

- * If {@code startVersion} doesn't exist, return an empty {@code Iterator}. - * - * @param startVersion the table version to begin retrieving actions from (inclusive) - * @param failOnDataLoss whether to throw when data loss detected - * @return an {@code Iterator} of {@link VersionLog}s starting from {@code startVersion} - * @throws IllegalArgumentException if {@code startVersion} is negative - * @throws IllegalStateException if data loss detected and {@code failOnDataLoss} is true - */ - Iterator getChanges(long startVersion, boolean failOnDataLoss); - - /** - * Returns the latest version that was committed before or at {@code timestamp}. If no version - * exists, returns -1. - * - * Specifically: - *

    - *
  • if a commit version exactly matches the provided timestamp, we return it
  • - *
  • else, we return the latest commit version with a timestamp less than the - * provided one
  • - *
  • If the provided timestamp is less than the timestamp of any committed version, - * we throw an error.
  • - *
. - * - * @param timestamp the number of milliseconds since midnight, January 1, 1970 UTC - * @return latest commit that happened before or at {@code timestamp}. - * @throws IllegalArgumentException if the timestamp is less than the timestamp of any committed - * version - */ - long getVersionBeforeOrAtTimestamp(long timestamp); - - /** - * Returns the latest version that was committed at or after {@code timestamp}. If no version - * exists, returns -1. - * - * Specifically: - *
    - *
  • if a commit version exactly matches the provided timestamp, we return it
  • - *
  • else, we return the earliest commit version with a timestamp greater than the - * provided one
  • - *
  • If the provided timestamp is larger than the timestamp of any committed version, - * we throw an error.
  • - *
. - * - * @param timestamp the number of milliseconds since midnight, January 1, 1970 UTC - * @return latest commit that happened at or before {@code timestamp}. - * @throws IllegalArgumentException if the timestamp is more than the timestamp of any committed - * version - */ - long getVersionAtOrAfterTimestamp(long timestamp); - - /** - * @return Whether a Delta table exists at this directory. - */ - boolean tableExists(); - - /** - * Create a {@link DeltaLog} instance representing the table located at the provided - * {@code path}. - * - * @param hadoopConf Hadoop {@code Configuration} to use when accessing the Delta table - * @param path the path to the Delta table - * @return the {@code DeltaLog} for the provided {@code path} - */ - static DeltaLog forTable(Configuration hadoopConf, String path) { - return DeltaLogImpl.forTable(hadoopConf, path); - } - - /** - * Create a {@link DeltaLog} instance representing the table located at the provided - * {@code path}. - * - * @param hadoopConf Hadoop {@code Configuration} to use when accessing the Delta table - * @param path the path to the Delta table - * @return the {@code DeltaLog} for the provided {@code path} - */ - static DeltaLog forTable(Configuration hadoopConf, Path path) { - return DeltaLogImpl.forTable(hadoopConf, path); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/DeltaScan.java b/connectors/standalone/src/main/java/io/delta/standalone/DeltaScan.java deleted file mode 100644 index 90b3071626a..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/DeltaScan.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone; - -import java.util.Optional; - -import io.delta.standalone.actions.AddFile; -import io.delta.standalone.data.CloseableIterator; -import io.delta.standalone.expressions.Expression; - -/** - * Provides access to an iterator over the files in this snapshot. - *

- * Typically created with a read predicate {@link Expression} to let users filter files. Please note - * filtering is only supported on partition columns and users should use - * {@link DeltaScan#getResidualPredicate()} to check for any unapplied portion of the input - * predicate. - */ -public interface DeltaScan { - - /** - * Creates a {@link CloseableIterator} over files belonging to this snapshot. - *

- * There is no iteration ordering guarantee among files. - *

- * Files returned are guaranteed to satisfy the predicate, if any, returned by - * {@link #getPushedPredicate()}. - * - * @return a {@link CloseableIterator} over the files in this snapshot that satisfy - * {@link #getPushedPredicate()} - */ - CloseableIterator getFiles(); - - /** - * @return the input predicate passed in by the user - */ - Optional getInputPredicate(); - - /** - * @return portion of the input predicate that can be evaluated by Delta Standalone using only - * metadata (filters on partition columns). Files returned by {@link #getFiles()} are - * guaranteed to satisfy the pushed predicate, and the caller doesn’t need to apply them - * again on the returned files. - */ - Optional getPushedPredicate(); - - /** - * @return portion of the input predicate that may not be fully applied. Files returned by - * {@link #getFiles()} are not guaranteed to satisfy the residual predicate, and the - * caller should still apply them on the returned files. - */ - Optional getResidualPredicate(); -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/Operation.java b/connectors/standalone/src/main/java/io/delta/standalone/Operation.java deleted file mode 100644 index 75a8fbe24ec..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/Operation.java +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone; - -import java.util.Collections; -import java.util.Map; -import java.util.Optional; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -/** - * An operation that can be performed on a Delta table. - *

- * An operation is tracked as the first line in delta logs, and powers {@code DESCRIBE HISTORY} for - * Delta tables. - *

- * Operations must be constructed using one of the {@link Operation.Name} types below. - * As well, optional {@link Metrics} values are given below. - */ -public final class Operation { - - /////////////////////////////////////////////////////////////////////////// - // Operation Names - /////////////////////////////////////////////////////////////////////////// - - /** - * Supported operation types. - */ - public enum Name { - /** Recorded during batch inserts. */ - WRITE("WRITE"), - - /** Recorded during streaming inserts. */ - STREAMING_UPDATE("STREAMING UPDATE"), - - /** Recorded while deleting certain partitions. */ - DELETE("DELETE"), - - /** Recorded when truncating the table. */ - TRUNCATE("TRUNCATE"), - - /** Recorded when converting a table into a Delta table. */ - CONVERT("CONVERT"), - - /** Recorded when a merge operation is committed to the table. */ - MERGE("MERGE"), - - /** Recorded when an update operation is committed to the table. */ - UPDATE("UPDATE"), - - /** Recorded when the table is created. */ - CREATE_TABLE("CREATE TABLE"), - - /** Recorded when the table is replaced. */ - REPLACE_TABLE("REPLACE TABLE"), - - /** Recorded when the table properties are set. */ - SET_TABLE_PROPERTIES("SET TBLPROPERTIES"), - - /** Recorded when the table properties are unset. */ - UNSET_TABLE_PROPERTIES("UNSET TBLPROPERTIES"), - - /** Recorded when columns are added. */ - ADD_COLUMNS("ADD COLUMNS"), - - /** Recorded when columns are changed. */ - CHANGE_COLUMN("CHANGE COLUMN"), - - /** Recorded when columns are replaced. */ - REPLACE_COLUMNS("REPLACE COLUMNS"), - - /** Recorded when the table protocol is upgraded. */ - UPGRADE_PROTOCOL("UPGRADE PROTOCOL"), - - /** Recorded when the table schema is upgraded. */ - UPGRADE_SCHEMA("UPDATE SCHEMA"), - - MANUAL_UPDATE("Manual Update"); - - /** Actual value that will be recorded in the transaction log */ - private final String logStr; - - Name(String logStr) { - this.logStr = logStr; - } - - @Override - public String toString() { - return logStr; - } - } - - /////////////////////////////////////////////////////////////////////////// - // Operation Metrics - /////////////////////////////////////////////////////////////////////////// - - /** - * Some possible operation metrics and their suggested corresponding operation types. - * These are purely exemplary, and users may use whichever metrics best fit their application. - */ - public static class Metrics { - /** - * Number of files written. - * - * Usually used with the WRITE operation. - */ - public static final String numFiles = "numFiles"; - - /** - * Size in bytes of the written contents. - * - * Usually used with WRITE, STREAMING_UPDATE operations. - */ - public static final String numOutputBytes = "numOutputBytes"; - - /** - * Number of rows written. - * - * Usually used with WRITE, STREAMING_UPDATE, MERGE operations. - */ - public static final String numOutputRows = "numOutputRows"; - - /** - * Number of files added. - * - * Usually used with STREAMING_UPDATE, DELETE, UPDATE operations. - */ - public static final String numAddedFiles = "numAddedFiles"; - - /** - * Number of files removed. - * - * Usually used with STREAMING_UPDATE, DELETE, DELETE_PARTITIONS, TRUNCATE, - * UPDATE operations. - */ - public static final String numRemovedFiles = "numRemovedFiles"; - - /** - * Number of rows removed. - * - * Usually used with the DELETE operation. - */ - public static final String numDeletedRows = "numDeletedRows"; - - /** - * Number of rows copied in the process of deleting files. - * - * Usually used with DELETE, UPDATE operations. - */ - public static final String numCopiedRows = "numCopiedRows"; - - /** - * Time taken to execute the entire operation. - * - * Usually used with DELETE, DELETE_PARTITIONS, TRUNCATE, MERGE, UPDATE operations. - */ - public static final String executionTimeMs = "executionTimeMs"; - - /** - * Time taken to scan the files for matches. - * - * Usually used with DELETE, DELETE_PARTITIONS, MERGE, UPDATE operations. - */ - public static final String scanTimeMs = "scanTimeMs"; - - /** - * Time taken to rewrite the matched files. - * - * Usually used with DELETE, DELETE_PARTITIONS, MERGE, UPDATE operations. - */ - public static final String rewriteTimeMs = "rewriteTimeMs"; - - /** - * Number of parquet files that have been converted. - * - * Usually used with the CONVERT operation. - */ - public static final String numConvertedFiles = "numConvertedFiles"; - - /** - * Number of rows in the source table. - * - * Usually used with the MERGE operation. - */ - public static final String numSourceRows = "numSourceRows"; - - /** - * Number of rows inserted into the target table. - * - * Usually used with the MERGE operation. - */ - public static final String numTargetRowsInserted = "numTargetRowsInserted"; - - /** - * Number of rows updated in the target table. - * - * Usually used with the MERGE operation. - */ - public static final String numTargetRowsUpdated = "numTargetRowsUpdated"; - - /** - * Number of rows deleted in the target table. - * - * Usually used with the MERGE operation. - */ - public static final String numTargetRowsDeleted = "numTargetRowsDeleted"; - - /** - * Number of target rows copied. - * - * Usually used with the MERGE operation. - */ - public static final String numTargetRowsCopied = "numTargetRowsCopied"; - - /** - * Number files added to the sink(target). - * - * Usually used with the MERGE operation. - */ - public static final String numTargetFilesAdded = "numTargetFilesAdded"; - - /** - * Number of files removed from the sink(target). - * - * Usually used with the MERGE operation. - */ - public static final String numTargetFilesRemoved = "numTargetFilesRemoved"; - - /** - * Number of rows updated. - * - * Usually used with the UPDATE operation. - */ - public static final String numUpdatedRows = "numUpdatedRows"; - } - - /////////////////////////////////////////////////////////////////////////// - // Operation internals, constructors, and external APIs - /////////////////////////////////////////////////////////////////////////// - - @Nonnull - private final Name name; - - @Nullable - private final Map parameters; - - @Nullable - private final Map metrics; - - @Nonnull - private final Optional userMetadata; - - /** - * @param name The {@link Name} of the operation. - */ - public Operation(@Nonnull Name name) { - this(name, Collections.emptyMap(), Collections.emptyMap(), Optional.empty()); - } - - /** - * @param name The {@link Name} of the operation. - * @param parameters Any relevant operation parameters, where values are JSON-encoded. - */ - public Operation(@Nonnull Name name, @Nullable Map parameters) { - this(name, parameters, Collections.emptyMap(), Optional.empty()); - } - - /** - * @param name The {@link Name} of the operation. - * @param parameters Any relevant operation parameters, where values are JSON-encoded. - * @param metrics Any relevant operation metrics. See {@link Metrics} for suggested keys. - */ - public Operation(@Nonnull Name name, @Nullable Map parameters, - @Nullable Map metrics) { - this(name, parameters, metrics, Optional.empty()); - } - - /** - * @param name The {@link Name} of the operation. - * @param parameters Any relevant operation parameters, where values are JSON-encoded. - * @param metrics Any relevant operation metrics. See {@link Metrics} for suggested keys. - * @param userMetadata Optional additional user metadata. - */ - public Operation(@Nonnull Name name, @Nullable Map parameters, - @Nullable Map metrics, - @Nonnull Optional userMetadata) { - this.name = name; - this.parameters = parameters; - this.metrics = metrics; - this.userMetadata = userMetadata; - } - - /** - * @return operation name - */ - @Nonnull - public Name getName() { - return name; - } - - /** - * @return operation parameters - */ - @Nullable - public Map getParameters() { - return parameters != null ? Collections.unmodifiableMap(parameters) : null; - } - - /** - * @return operation metrics - */ - @Nullable - public Map getMetrics() { - return metrics != null ? Collections.unmodifiableMap(metrics) : null; - } - - /** - * @return user metadata for this operation - */ - @Nonnull - public Optional getUserMetadata() { - return userMetadata; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/OptimisticTransaction.java b/connectors/standalone/src/main/java/io/delta/standalone/OptimisticTransaction.java deleted file mode 100644 index b265fd9682f..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/OptimisticTransaction.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone; - -import io.delta.standalone.actions.Action; -import io.delta.standalone.actions.Metadata; -import io.delta.standalone.expressions.Expression; - -/** - * Used to perform a set of reads in a transaction and then commit a set of updates to the - * state of the log. All reads from the {@link DeltaLog} MUST go through this instance rather - * than directly to the {@link DeltaLog} otherwise they will not be checked for logical conflicts - * with concurrent updates. - *

- * This class is not thread-safe. - */ -public interface OptimisticTransaction { - - /** - * Modifies the state of the log by adding a new commit that is based on a read at the table's - * latest version as of this transaction's instantiation. In the case of a conflict with a - * concurrent writer this method will throw an exception. - *

- * Note: any {@link io.delta.standalone.actions.AddFile} with an absolute path within the table - * path will be updated to have a relative path (based off of the table path). Because of this, - * be sure to generate all {@link io.delta.standalone.actions.RemoveFile}s using - * {@link io.delta.standalone.actions.AddFile}s read from the Delta Log (do not use the - * {@link io.delta.standalone.actions.AddFile}s created pre-commit.) - * - * @param A derived class of {@link Action}. This allows, for example, both a - * {@code List} and a {@code List} to be accepted. - * @param actions Set of actions to commit. - * @param op Details of operation that is performing this transactional commit. - * @param engineInfo String used to identify the writer engine. It should resemble - * "{engineName}/{engineVersion}", with dashes in place of whitespace. - * For example, {@code "Flink-Connector/1.1.0"}. - * @return a {@link CommitResult}, wrapping the table version that was committed. - */ - CommitResult commit(Iterable actions, Operation op, String engineInfo); - - /** - * Mark files matched by the {@code readPredicate} as read by this transaction. - *

- * Please note filtering is only supported on partition columns, thus the files matched - * may be a superset of the files in the Delta table that satisfy {@code readPredicate}. Users - * should use {@link DeltaScan#getResidualPredicate()} to check for any unapplied portion of the - * input predicate. - *

- * Internally, {@code readPredicate} and the matched {@code readFiles} will be used to determine - * if logical conflicts between this transaction and previously-committed transactions can be - * resolved (i.e. no error thrown). - *

- * For example: - *

    - *
  • This transaction TXN1 reads partition 'date=2021-09-08' to perform an UPDATE and tries - * to commit at the next table version N.
  • - *
  • After TXN1 starts, another transaction TXN2 reads partition 'date=2021-09-07' and - * commits first at table version N (with no other metadata changes).
  • - *
  • TXN1 sees that another commit won, and needs to know whether to commit at version N+1 - * or fail. Using the {@code readPredicates} and resultant {@code readFiles}, TXN1 can see - * that none of its read files were changed by TXN2. Thus there are no logical conflicts and - * TXN1 can commit at table version N+1.
  • - *
- * - * @param readPredicate Predicate used to determine which files were read. - * @return a {@link DeltaScan} containing the list of files matching the pushed portion of the - * readPredicate. - */ - DeltaScan markFilesAsRead(Expression readPredicate); - - /** - * Records an update to the metadata that should be committed with this transaction. - * - *

- * Use {@link Metadata#copyBuilder()} to build a new {@link Metadata} instance based on the - * current table metadata. For example: - * - *

{@code
-     * Metadata newMetadata = optimisticTransaction.metadata().copyBuilder()
-     *     .schema(newSchema)
-     *     .build();
-     * optimisticTransaction.updateMetadata(newMetadata);
-     * }
- * - *

- * IMPORTANT: It is the responsibility of the caller to ensure that files currently - * present in the table are still valid under the new metadata. - * - * @param metadata The new metadata for the delta table. - */ - void updateMetadata(Metadata metadata); - - /** - * Mark the entire table as tainted (i.e. read) by this transaction. - */ - void readWholeTable(); - - /** - * @param id transaction id - * @return the latest version that has committed for the idempotent transaction with given - * {@code id}. - */ - long txnVersion(String id); - - /** - * @return the metadata for this transaction. The metadata refers to the metadata of the table's - * latest version as of this transaction's instantiation unless updated during the - * transaction. - */ - Metadata metadata(); - - /** - * @return The table version that this transaction is reading from. - */ - long readVersion(); -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/Snapshot.java b/connectors/standalone/src/main/java/io/delta/standalone/Snapshot.java deleted file mode 100644 index 1ab1f1b148b..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/Snapshot.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone; - -import java.util.List; - -import io.delta.standalone.actions.AddFile; -import io.delta.standalone.actions.Metadata; -import io.delta.standalone.data.CloseableIterator; -import io.delta.standalone.data.RowRecord; -import io.delta.standalone.expressions.Expression; - -/** - * {@link Snapshot} provides APIs to access the Delta table state (such as table metadata, active - * files) at some version. - *

- * See Delta Transaction Log Protocol - * for more details about the transaction logs. - */ -public interface Snapshot { - - /** - * @return a {@link DeltaScan} of the files in this snapshot - */ - DeltaScan scan(); - - /** - * @param predicate the predicate to be used to filter the files in this snapshot. - * @return a {@link DeltaScan} of the files in this snapshot matching the pushed portion of - * {@code predicate} - */ - DeltaScan scan(Expression predicate); - - /** - * @return all of the files present in this snapshot - */ - List getAllFiles(); - - /** - * @return the table metadata for this snapshot - */ - Metadata getMetadata(); - - /** - * @return the version for this snapshot - */ - long getVersion(); - - /** - * Creates a {@link CloseableIterator} which can iterate over data belonging to this snapshot. - * It provides no iteration ordering guarantee among data. - * - * @return a {@link CloseableIterator} to iterate over data - */ - CloseableIterator open(); -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/VersionLog.java b/connectors/standalone/src/main/java/io/delta/standalone/VersionLog.java deleted file mode 100644 index 321d542d9eb..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/VersionLog.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone; - -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import javax.annotation.Nonnull; - -import io.delta.storage.CloseableIterator; - -import io.delta.standalone.actions.Action; - -/** - * {@link VersionLog} is the representation of all actions (changes) to the Delta Table - * at a specific table version. - */ -public class VersionLog { - private final long version; - - @Nonnull - private final List actions; - - public VersionLog(long version, @Nonnull List actions) { - this.version = version; - this.actions = actions; - } - - /** - * @return the table version at which these actions occurred - */ - public long getVersion() { - return version; - } - - /** - * @return an unmodifiable {@code List} of the actions for this table version - */ - @Nonnull - public List getActions() { - return Collections.unmodifiableList(actions); - } - - /** - * @return an {@code CloseableIterator} of the actions for this table version. This method is - * preferred for memory efficient iteration through the action list. - */ - @Nonnull - public CloseableIterator getActionsIterator() { - synchronized (this) { - return new CloseableIterator() { - - private final Iterator wrap = actions.iterator(); - - @Override - public void close() { - } - - @Override - public boolean hasNext() { - return wrap.hasNext(); - } - - @Override - public Action next() { - return wrap.next(); - } - }; - } - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/actions/Action.java b/connectors/standalone/src/main/java/io/delta/standalone/actions/Action.java deleted file mode 100644 index 6e9670e146c..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/actions/Action.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.actions; - -/** - * A marker interface for all actions that can be applied to a Delta table. - * Each action represents a single change to the state of a Delta table. - *

- * You can use the following code to extract the concrete type of an {@link Action}. - *

{@code
- *   List actions = ...
- *   actions.forEach(x -> {
- *       if (x instanceof AddFile) {
- *          AddFile addFile = (AddFile) x;
- *          ...
- *       } else if (x instanceof AddCDCFile) {
- *          AddCDCFile addCDCFile = (AddCDCFile)x;
- *          ...
- *       } else if ...
- *   });
- * }
- */ -public interface Action { -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/actions/AddCDCFile.java b/connectors/standalone/src/main/java/io/delta/standalone/actions/AddCDCFile.java deleted file mode 100644 index f790582076b..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/actions/AddCDCFile.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.actions; - -import java.util.Collections; -import java.util.Map; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -/** - * A change file containing CDC data for the Delta version it's within. Non-CDC readers should - * ignore this, CDC readers should scan all ChangeFiles in a version rather than computing - * changes from AddFile and RemoveFile actions. - */ -public final class AddCDCFile implements FileAction { - @Nonnull - private final String path; - - @Nonnull - private final Map partitionValues; - - private final long size; - - @Nullable - private final Map tags; - - public AddCDCFile( - @Nonnull String path, - @Nonnull Map partitionValues, - long size, - @Nullable Map tags) { - this.path = path; - this.partitionValues = partitionValues; - this.size = size; - this.tags = tags; - } - - /** - * @return the relative path or the absolute path that should be added to the table. If it's a - * relative path, it's relative to the root of the table. Note: the path is encoded and - * should be decoded by {@code new java.net.URI(path)} when using it. - */ - @Override - @Nonnull - public String getPath() { - return path; - } - - /** - * @return an unmodifiable {@code Map} from partition column to value for - * this file. Partition values are stored as strings, using the following formats. - * An empty string for any type translates to a null partition value. - * @see Delta Protocol Partition Value Serialization - */ - @Nonnull - public Map getPartitionValues() { - return Collections.unmodifiableMap(partitionValues); - } - - /** - * @return the size of this file in bytes - */ - public long getSize() { - return size; - } - - /** - * @return an unmodifiable {@code Map} containing metadata about this file - */ - @Nullable - public Map getTags() { - return tags != null ? Collections.unmodifiableMap(tags) : null; - } - - @Override - public boolean isDataChange() { - return false; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/actions/AddFile.java b/connectors/standalone/src/main/java/io/delta/standalone/actions/AddFile.java deleted file mode 100644 index 3c60bb27153..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/actions/AddFile.java +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.actions; - -import java.util.Collections; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -/** - * Represents an action that adds a new file to the table. The path of a file acts as the primary - * key for the entry in the set of files. - *

- * Note: since actions within a given Delta file are not guaranteed to be applied in order, it is - * not valid for multiple file operations with the same path to exist in a single version. - * - * @see Delta Transaction Log Protocol: Add File and Remove File - */ -public final class AddFile implements FileAction { - @Nonnull - private final String path; - - @Nonnull - private final Map partitionValues; - - private final long size; - - private final long modificationTime; - - private final boolean dataChange; - - @Nullable - private final String stats; - - @Nullable - private final Map tags; - - public AddFile( - @Nonnull String path, - @Nonnull Map partitionValues, - long size, - long modificationTime, - boolean dataChange, - @Nullable String stats, - @Nullable Map tags) { - this.path = path; - this.partitionValues = partitionValues; - this.size = size; - this.modificationTime = modificationTime; - this.dataChange = dataChange; - this.stats = stats; - this.tags = tags; - } - - /** - * @return the corresponding {@link RemoveFile} for this file, instantiated with - * {@code deletionTimestamp =} {@link System#currentTimeMillis()} - */ - @Nonnull - public RemoveFile remove() { - return remove(System.currentTimeMillis(), dataChange); - } - - /** - * @return the corresponding {@link RemoveFile} for this file, instantiated with the given - * {@code deletionTimestamp} - */ - @Nonnull - public RemoveFile remove(long deletionTimestamp) { - return remove(deletionTimestamp, dataChange); - } - - /** - * @return the corresponding {@link RemoveFile} for this file, instantiated with the given - * {@code dataChange} flag - */ - @Nonnull - public RemoveFile remove(boolean dataChange) { - return remove(System.currentTimeMillis(), dataChange); - } - - /** - * @return the corresponding {@link RemoveFile} for this file, instantiated with the given - * {@code deletionTimestamp} value and {@code dataChange} flag - */ - @Nonnull - public RemoveFile remove(long deletionTimestamp, boolean dataChange) { - return new RemoveFile(path, Optional.of(deletionTimestamp), dataChange, true, - partitionValues, Optional.of(size), tags); - } - - /** - * @return the relative path or the absolute path that should be added to the table. If it's a - * relative path, it's relative to the root of the table. Note: the path is encoded and - * should be decoded by {@code new java.net.URI(path)} when using it. - */ - @Override - @Nonnull - public String getPath() { - return path; - } - - /** - * @return an unmodifiable {@code Map} from partition column to value for - * this file. Partition values are stored as strings, using the following formats. - * An empty string for any type translates to a null partition value. - * @see Delta Protocol Partition Value Serialization - */ - @Nonnull - public Map getPartitionValues() { - return Collections.unmodifiableMap(partitionValues); - } - - /** - * @return the size of this file in bytes - */ - public long getSize() { - return size; - } - - /** - * @return the time that this file was last modified or created, as - * milliseconds since the epoch - */ - public long getModificationTime() { - return modificationTime; - } - - /** - * @return whether any data was changed as a result of this file being created. When - * {@code false} the file must already be present in the table or the records in the - * added file must be contained in one or more remove actions in the same version - */ - @Override - public boolean isDataChange() { - return dataChange; - } - - /** - * @return statistics (for example: count, min/max values for columns) - * about the data in this file as serialized JSON - */ - @Nullable - public String getStats() { - return stats; - } - - /** - * @return an unmodifiable {@code Map} containing metadata about this file - */ - @Nullable - public Map getTags() { - return tags != null ? Collections.unmodifiableMap(tags) : null; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - AddFile addFile = (AddFile) o; - return size == addFile.size && - modificationTime == addFile.modificationTime && - dataChange == addFile.dataChange && - Objects.equals(path, addFile.path) && - Objects.equals(partitionValues, addFile.partitionValues) && - Objects.equals(stats, addFile.stats) && - Objects.equals(tags, addFile.tags); - } - - @Override - public int hashCode() { - return Objects.hash(path, partitionValues, size, modificationTime, dataChange, stats, tags); - } - - /** - * @return a new {@link AddFile.Builder} - */ - public static Builder builder(String path, Map partitionValues, long size, - long modificationTime, boolean dataChange) { - return new Builder(path, partitionValues, size, modificationTime, dataChange); - } - - /** - * Builder class for {@link AddFile}. Enables construction of {@link AddFile}s with default - * values. - */ - public static final class Builder { - // required AddFile fields - private final String path; - private final Map partitionValues; - private final long size; - private final long modificationTime; - private final boolean dataChange; - - // optional AddFile fields - private String stats; - private Map tags; - - public Builder(String path, Map partitionValues, long size, - long modificationTime, boolean dataChange) { - this.path = path; - this.partitionValues = partitionValues; - this.size = size; - this.modificationTime = modificationTime; - this.dataChange = dataChange; - } - - public Builder stats(String stats) { - this.stats = stats; - return this; - } - - public Builder tags(Map tags) { - this.tags = tags; - return this; - } - - /** - * Builds an {@link AddFile} using the provided parameters. If a parameter is not provided - * its default values is used. - * - * @return a new {@link AddFile} with the properties added to the builder - */ - public AddFile build() { - AddFile addFile = new AddFile(this.path, this.partitionValues, this.size, - this.modificationTime, this.dataChange, this.stats, this.tags); - return addFile; - } - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/actions/CommitInfo.java b/connectors/standalone/src/main/java/io/delta/standalone/actions/CommitInfo.java deleted file mode 100644 index 2b0527d7b8a..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/actions/CommitInfo.java +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.actions; - -import java.sql.Timestamp; -import java.util.Collections; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -/** - * Holds provenance information about changes to the table. This CommitInfo - * is not stored in the checkpoint and has reduced compatibility guarantees. - * Information stored in it is best effort (i.e. can be falsified by a writer). - * - * @see Delta Transaction Log Protocol: Commit Provenance Information - */ -public class CommitInfo implements Action { - @Nonnull private final Optional version; - @Nullable private final Timestamp timestamp; - @Nonnull private final Optional userId; - @Nonnull private final Optional userName; - @Nullable private final String operation; - @Nullable private final Map operationParameters; - @Nonnull private final Optional jobInfo; - @Nonnull private final Optional notebookInfo; - @Nonnull private final Optional clusterId; - @Nonnull private final Optional readVersion; - @Nonnull private final Optional isolationLevel; - @Nonnull private final Optional isBlindAppend; - @Nonnull private final Optional> operationMetrics; - @Nonnull private final Optional userMetadata; - @Nonnull private final Optional engineInfo; - - // For binary compatibility with version 0.2.0 - public CommitInfo( - @Nonnull Optional version, - @Nullable Timestamp timestamp, - @Nonnull Optional userId, - @Nonnull Optional userName, - @Nullable String operation, - @Nullable Map operationParameters, - @Nonnull Optional jobInfo, - @Nonnull Optional notebookInfo, - @Nonnull Optional clusterId, - @Nonnull Optional readVersion, - @Nonnull Optional isolationLevel, - @Nonnull Optional isBlindAppend, - @Nonnull Optional> operationMetrics, - @Nonnull Optional userMetadata) { - this.version = version; - this.timestamp = timestamp; - this.userId = userId; - this.userName = userName; - this.operation = operation; - this.operationParameters = operationParameters; - this.jobInfo = jobInfo; - this.notebookInfo = notebookInfo; - this.clusterId = clusterId; - this.readVersion = readVersion; - this.isolationLevel = isolationLevel; - this.isBlindAppend = isBlindAppend; - this.operationMetrics = operationMetrics; - this.userMetadata = userMetadata; - this.engineInfo = Optional.empty(); - } - - public CommitInfo( - @Nonnull Optional version, - @Nullable Timestamp timestamp, - @Nonnull Optional userId, - @Nonnull Optional userName, - @Nullable String operation, - @Nullable Map operationParameters, - @Nonnull Optional jobInfo, - @Nonnull Optional notebookInfo, - @Nonnull Optional clusterId, - @Nonnull Optional readVersion, - @Nonnull Optional isolationLevel, - @Nonnull Optional isBlindAppend, - @Nonnull Optional> operationMetrics, - @Nonnull Optional userMetadata, - @Nonnull Optional engineInfo) { - this.version = version; - this.timestamp = timestamp; - this.userId = userId; - this.userName = userName; - this.operation = operation; - this.operationParameters = operationParameters; - this.jobInfo = jobInfo; - this.notebookInfo = notebookInfo; - this.clusterId = clusterId; - this.readVersion = readVersion; - this.isolationLevel = isolationLevel; - this.isBlindAppend = isBlindAppend; - this.operationMetrics = operationMetrics; - this.userMetadata = userMetadata; - this.engineInfo = engineInfo; - } - - /** - * @return the log version for this commit - */ - @Nonnull - public Optional getVersion() { - return version; - } - - /** - * @return the time the files in this commit were committed - */ - @Nullable - public Timestamp getTimestamp() { - return timestamp; - } - - /** - * @return the userId of the user who committed this file - */ - @Nonnull - public Optional getUserId() { - return userId; - } - - /** - * @return the userName of the user who committed this file - */ - @Nonnull - public Optional getUserName() { - return userName; - } - - /** - * @return the type of operation for this commit. e.g. "WRITE" - */ - @Nullable - public String getOperation() { - return operation; - } - - /** - * @return any relevant operation parameters. e.g. "mode", "partitionBy" - */ - @Nullable - public Map getOperationParameters() { - if (operationParameters != null) return Collections.unmodifiableMap(operationParameters); - return null; - } - - /** - * @return the JobInfo for this commit - */ - @Nonnull - public Optional getJobInfo() { - return jobInfo; - } - - /** - * @return the NotebookInfo for this commit - */ - @Nonnull - public Optional getNotebookInfo() { - return notebookInfo; - } - - /** - * @return the ID of the cluster used to generate this commit - */ - @Nonnull - public Optional getClusterId() { - return clusterId; - } - - /** - * @return the version that the transaction used to generate this commit is reading from - */ - @Nonnull - public Optional getReadVersion() { - return readVersion; - } - - /** - * @return the isolation level at which this commit was generated - */ - @Nonnull - public Optional getIsolationLevel() { - return isolationLevel; - } - - /** - * @return whether this commit has blindly appended without caring about existing files - */ - @Nonnull - public Optional getIsBlindAppend() { - return isBlindAppend; - } - - /** - * @return any operation metrics calculated - */ - @Nonnull - public Optional> getOperationMetrics() { - return operationMetrics.map(Collections::unmodifiableMap); - } - - /** - * @return any additional user metadata - */ - @Nonnull - public Optional getUserMetadata() { - return userMetadata; - } - - /** - * @return the engineInfo of the engine that performed this commit. It should be of the form - * "{engineName}/{engineVersion} Delta-Standalone/{deltaStandaloneVersion}" - */ - @Nonnull - public Optional getEngineInfo() { - return engineInfo; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - CommitInfo that = (CommitInfo) o; - return Objects.equals(version, that.version) && - Objects.equals(timestamp, that.timestamp) && - Objects.equals(userId, that.userId) && - Objects.equals(userName, that.userName) && - Objects.equals(operation, that.operation) && - Objects.equals(operationParameters, that.operationParameters) && - Objects.equals(jobInfo, that.jobInfo) && - Objects.equals(notebookInfo, that.notebookInfo) && - Objects.equals(clusterId, that.clusterId) && - Objects.equals(readVersion, that.readVersion) && - Objects.equals(isolationLevel, that.isolationLevel) && - Objects.equals(isBlindAppend, that.isBlindAppend) && - Objects.equals(operationMetrics, that.operationMetrics) && - Objects.equals(userMetadata, that.userMetadata) && - Objects.equals(engineInfo, that.engineInfo); - } - - @Override - public int hashCode() { - return Objects.hash(version, timestamp, userId, userName, operation, operationParameters, - jobInfo, notebookInfo, clusterId, readVersion, isolationLevel, isBlindAppend, - operationMetrics, userMetadata, engineInfo); - } - - /** - * @return a new {@link CommitInfo.Builder} - */ - public static Builder builder() { - return new Builder(); - } - - /** - * Builder class for {@link CommitInfo}. Enables construction of {@link CommitInfo}s with - * default values. - */ - public static final class Builder { - @Nonnull private Optional version = Optional.empty(); - @Nullable private Timestamp timestamp; - @Nonnull private Optional userId = Optional.empty(); - @Nonnull private Optional userName = Optional.empty(); - @Nullable private String operation; - @Nullable private Map operationParameters; - @Nonnull private Optional jobInfo = Optional.empty(); - @Nonnull private Optional notebookInfo = Optional.empty(); - @Nonnull private Optional clusterId = Optional.empty(); - @Nonnull private Optional readVersion = Optional.empty(); - @Nonnull private Optional isolationLevel = Optional.empty(); - @Nonnull private Optional isBlindAppend = Optional.empty(); - @Nonnull private Optional> operationMetrics = Optional.empty(); - @Nonnull private Optional userMetadata = Optional.empty(); - @Nonnull private Optional engineInfo = Optional.empty(); - - public Builder version(Long version) { - this.version = Optional.of(version); - return this; - } - - public Builder timestamp(@Nullable Timestamp timestamp) { - this.timestamp = timestamp; - return this; - } - - public Builder userId(@Nullable String userId) { - this.userId = Optional.of(userId); - return this; - } - - public Builder userName(String userName) { - this.userName = Optional.of(userName); - return this; - } - - public Builder operation(String operation) { - this.operation = operation; - return this; - } - - public Builder operationParameters(@Nullable Map operationParameters) { - this.operationParameters = operationParameters; - return this; - } - - public Builder jobInfo(JobInfo jobInfo) { - this.jobInfo = Optional.of(jobInfo); - return this; - } - - public Builder notebookInfo(NotebookInfo notebookInfo ) { - this.notebookInfo = Optional.of(notebookInfo); - return this; - } - - public Builder clusterId(String clusterId) { - this.clusterId = Optional.of(clusterId); - return this; - } - - public Builder readVersion(Long readVersion) { - this.readVersion = Optional.of(readVersion); - return this; - } - - public Builder isolationLevel(String isolationLevel) { - this.isolationLevel = Optional.of(isolationLevel); - return this; - } - - public Builder isBlindAppend(Boolean isBlindAppend) { - this.isBlindAppend = Optional.of(isBlindAppend); - return this; - } - - public Builder operationMetrics(Map operationMetrics) { - this.operationMetrics = Optional.of(operationMetrics); - return this; - } - - public Builder userMetadata(String userMetadata) { - this.userMetadata = Optional.of(userMetadata); - return this; - } - - public Builder engineInfo(String engineInfo) { - this.engineInfo = Optional.of(engineInfo); - return this; - } - - /** - * Builds a {@link CommitInfo} using the provided parameters. If a parameter is not provided - * its default values is used. - * - * @return a new {@link CommitInfo} with the properties added to the builder - */ - public CommitInfo build() { - CommitInfo commitInfo = new CommitInfo(this.version, this.timestamp, this.userId, - this.userName, this.operation, this.operationParameters, this.jobInfo, - this.notebookInfo, this.clusterId, this.readVersion, this.isolationLevel, - this.isBlindAppend, this.operationMetrics, this.userMetadata, this.engineInfo); - return commitInfo; - } - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/actions/FileAction.java b/connectors/standalone/src/main/java/io/delta/standalone/actions/FileAction.java deleted file mode 100644 index 769f8a71c03..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/actions/FileAction.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.actions; - -/** - * Generic interface for {@link Action}s pertaining to the addition and removal of files. - */ -public interface FileAction extends Action { - - /** - @return the relative path or the absolute path of the file being added or removed by this - * action. If it's a relative path, it's relative to the root of the table. Note: the path - * is encoded and should be decoded by {@code new java.net.URI(path)} when using it. - */ - String getPath(); - - /** - * @return whether any data was changed as a result of this file being added or removed. - */ - boolean isDataChange(); -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/actions/Format.java b/connectors/standalone/src/main/java/io/delta/standalone/actions/Format.java deleted file mode 100644 index 727ef1c944f..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/actions/Format.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.actions; - -import java.util.Collections; -import java.util.Map; -import java.util.Objects; - -/** - * A specification of the encoding for the files stored in a table. - * - * - * @see Delta Transaction Log Protocol: Format Specification - */ -public final class Format { - private final String provider; - private final Map options; - - public Format(String provider, Map options) { - this.provider = provider; - this.options = options; - } - - public Format() { - this.provider = "parquet"; - this.options = Collections.emptyMap(); - } - - /** - * @return the name of the encoding for files in this table - */ - public String getProvider() { - return provider; - } - - /** - * @return an unmodifiable {@code Map} containing configuration options for - * the format - */ - public Map getOptions() { - return Collections.unmodifiableMap(options); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Format format = (Format) o; - return Objects.equals(provider, format.provider) && - Objects.equals(options, format.options); - } - - @Override - public int hashCode() { - return Objects.hash(provider, options); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/actions/JobInfo.java b/connectors/standalone/src/main/java/io/delta/standalone/actions/JobInfo.java deleted file mode 100644 index 0c6c1e9a739..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/actions/JobInfo.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.actions; - -import java.util.Objects; - -/** Represents the Databricks Job information that committed to the Delta table. */ -public class JobInfo { - private final String jobId; - private final String jobName; - private final String runId; - private final String jobOwnerId; - private final String triggerType; - - public JobInfo( - String jobId, - String jobName, - String runId, - String jobOwnerId, - String triggerType) { - this.jobId = jobId; - this.jobName = jobName; - this.runId = runId; - this.jobOwnerId = jobOwnerId; - this.triggerType = triggerType; - } - - public String getJobId() { - return jobId; - } - - public String getJobName() { - return jobName; - } - - public String getRunId() { - return runId; - } - - public String getJobOwnerId() { - return jobOwnerId; - } - - public String getTriggerType() { - return triggerType; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - JobInfo jobInfo = (JobInfo) o; - return Objects.equals(jobId, jobInfo.jobId) && - Objects.equals(jobName, jobInfo.jobName) && - Objects.equals(runId, jobInfo.runId) && - Objects.equals(jobOwnerId, jobInfo.jobOwnerId) && - Objects.equals(triggerType, jobInfo.triggerType); - } - - @Override - public int hashCode() { - return Objects.hash(jobId, jobName, runId, jobOwnerId, triggerType); - } - - /** - * @return a new {@link JobInfo.Builder} - */ - public static Builder builder(String jobId) { - return new Builder(jobId); - } - - /** - * Builder class for {@link JobInfo}. Enables construction of {@link JobInfo}s with default - * values. - */ - public static class Builder { - // required JobInfo fields - private final String jobId; - // optional JobInfo fields - private String jobName; - private String runId; - private String jobOwnerId; - private String triggerType; - - public Builder(String jobId) { - this.jobId = jobId; - } - - public Builder jobName(String jobName) { - this.jobName = jobName; - return this; - } - - public Builder runId(String runId) { - this.runId = runId; - return this; - } - - public Builder jobOwnerId(String jobOwnerId) { - this.jobOwnerId = jobOwnerId; - return this; - } - - public Builder triggerType(String triggerType) { - this.triggerType = triggerType; - return this; - } - - /** - * Builds a {@link JobInfo} using the provided parameters. If a parameter is not provided - * its default values is used. - * - * @return a new {@link JobInfo} with the properties added to the builder - */ - public JobInfo build() { - JobInfo jobInfo = new JobInfo(this.jobId, this.jobName, this.runId, this.jobOwnerId, - this.triggerType); - return jobInfo; - } - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/actions/Metadata.java b/connectors/standalone/src/main/java/io/delta/standalone/actions/Metadata.java deleted file mode 100644 index 770828e43c2..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/actions/Metadata.java +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.actions; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import io.delta.standalone.types.StructType; - -/** - * Updates the metadata of the table. The first version of a table must contain - * a {@link Metadata} action. Subsequent {@link Metadata} actions completely - * overwrite the current metadata of the table. It is the responsibility of the - * writer to ensure that any data already present in the table is still valid - * after any change. There can be at most one {@link Metadata} action in a - * given version of the table. - * - * @see Delta Transaction Log Protocol: Change Metadata - */ -public final class Metadata implements Action { - @Nonnull private final String id; - @Nullable private final String name; - @Nullable private final String description; - @Nonnull private final Format format; - @Nonnull private final List partitionColumns; - @Nonnull private final Map configuration; - @Nonnull private final Optional createdTime; - @Nullable private final StructType schema; - - public Metadata( - @Nonnull String id, - @Nullable String name, - @Nullable String description, - @Nonnull Format format, - @Nonnull List partitionColumns, - @Nonnull Map configuration, - @Nonnull Optional createdTime, - @Nullable StructType schema) { - this.id = id; - this.name = name; - this.description = description; - this.format = format; - this.partitionColumns = partitionColumns; - this.configuration = configuration; - this.createdTime = createdTime; - this.schema = schema; - } - - /** - * @return the unique identifier for this table - */ - @Nonnull - public String getId() { - return id; - } - - /** - * @return the user-provided identifier for this table - */ - @Nullable - public String getName() { - return name; - } - - /** - * @return the user-provided description for this table - */ - @Nullable - public String getDescription() { - return description; - } - - /** - * @return the {@link Format} for this table - */ - @Nonnull - public Format getFormat() { - return format; - } - - /** - * @return an unmodifiable {@code java.util.List} containing the names of - * columns by which the data should be partitioned - */ - @Nonnull - public List getPartitionColumns() { - return Collections.unmodifiableList(partitionColumns); - } - - /** - * @return an unmodifiable {@code java.util.Map} containing configuration - * options for this metadata - */ - @Nonnull - public Map getConfiguration() { - return Collections.unmodifiableMap(configuration); - } - - /** - * @return the time when this metadata action was created, in milliseconds - * since the Unix epoch - */ - @Nonnull - public Optional getCreatedTime() { - return createdTime; - } - - /** - * @return the schema of the table as a {@link StructType} - */ - @Nullable - public StructType getSchema() { - return schema; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Metadata metadata = (Metadata) o; - return Objects.equals(id, metadata.id) && - Objects.equals(name, metadata.name) && - Objects.equals(description, metadata.description) && - Objects.equals(format, metadata.format) && - Objects.equals(partitionColumns, metadata.partitionColumns) && - Objects.equals(configuration, metadata.configuration) && - Objects.equals(createdTime, metadata.createdTime) && - Objects.equals(schema, metadata.schema); - } - - @Override - public int hashCode() { - return Objects.hash(id, name, description, format, partitionColumns, configuration, - createdTime, schema); - } - - /** - * @return a new {@link Metadata.Builder} initialized with the same properties as this - * {@link Metadata} instance - */ - public Builder copyBuilder() { - return new Builder(id, name, description, format, partitionColumns, configuration, - createdTime, schema); - } - - /** - * @return a new {@link Metadata.Builder} - */ - public static Builder builder() { - return new Builder(); - } - - /** - * Builder class for {@link Metadata}. Enables construction of {@link Metadata}s with default - * values. - */ - public static final class Builder { - @Nonnull private String id = java.util.UUID.randomUUID().toString(); - @Nullable private String name; - @Nullable private String description; - @Nonnull private Format format = new Format("parquet", Collections.emptyMap()); - @Nonnull private List partitionColumns = Collections.emptyList(); - @Nonnull private Map configuration = Collections.emptyMap(); - @Nonnull private Optional createdTime = Optional.of(System.currentTimeMillis()); - @Nullable private StructType schema; - - public Builder(){}; - - private Builder( - @Nonnull String id, - @Nullable String name, - @Nullable String description, - @Nonnull Format format, - @Nonnull List partitionColumns, - @Nonnull Map configuration, - @Nonnull Optional createdTime, - @Nullable StructType schema) { - this.id = id; - this.name = name; - this.description = description; - this.format = format; - this.partitionColumns = partitionColumns; - this.configuration = configuration; - this.createdTime = createdTime; - this.schema = schema; - } - - public Builder id(@Nonnull String id) { - this.id = id; - return this; - } - - public Builder name(@Nullable String name) { - this.name = name; - return this; - } - - public Builder description(@Nullable String description) { - this.description = description; - return this; - } - - public Builder format(@Nonnull Format format) { - this.format = format; - return this; - } - - public Builder partitionColumns(@Nonnull List partitionColumns) { - this.partitionColumns = partitionColumns; - return this; - } - - public Builder configuration(@Nonnull Map configuration) { - this.configuration = configuration; - return this; - } - - public Builder createdTime(Long createdTime) { - this.createdTime = Optional.of(createdTime); - return this; - } - - public Builder createdTime(@Nonnull Optional createdTime) { - this.createdTime = createdTime; - return this; - } - - public Builder schema(@Nullable StructType schema) { - this.schema = schema; - return this; - } - - /** - * Builds a {@link Metadata} using the provided parameters. If a parameter is not provided - * its default values is used. - * - * @return a new {@link Metadata} with the properties added to the builder - */ - public Metadata build() { - Metadata metadata = new Metadata( - this.id, - this.name, - this.description, - this.format, - this.partitionColumns, - this.configuration, - this.createdTime, - this.schema); - return metadata; - } - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/actions/NotebookInfo.java b/connectors/standalone/src/main/java/io/delta/standalone/actions/NotebookInfo.java deleted file mode 100644 index 2dcae00b846..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/actions/NotebookInfo.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.actions; - -import java.util.Objects; - -/** Represents the Databricks Notebook information that committed to the Delta table. */ -public class NotebookInfo { - private final String notebookId; - - public NotebookInfo(String notebookId) { - this.notebookId = notebookId; - } - - public String getNotebookId() { - return notebookId; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - NotebookInfo that = (NotebookInfo) o; - return Objects.equals(notebookId, that.notebookId); - } - - @Override - public int hashCode() { - return Objects.hash(notebookId); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/actions/Protocol.java b/connectors/standalone/src/main/java/io/delta/standalone/actions/Protocol.java deleted file mode 100644 index 347155e2baa..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/actions/Protocol.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.actions; - -import java.util.Objects; - -/** - * Used to block older clients from reading or writing the log when backwards - * incompatible changes are made to the protocol. Readers and writers are - * responsible for checking that they meet the minimum versions before performing - * any other operations. - *

- * Since this action allows us to explicitly block older clients in the case of a - * breaking change to the protocol, clients should be tolerant of messages and - * fields that they do not understand. - * - * @see Delta Transaction Log Protocol: Protocol Evolution - */ -public final class Protocol implements Action { - private final int minReaderVersion; - private final int minWriterVersion; - - public Protocol(int minReaderVersion, int minWriterVersion) { - this.minReaderVersion = minReaderVersion; - this.minWriterVersion = minWriterVersion; - } - - /** - * @return the minimum version of the Delta read protocol that a client must implement in order - * to correctly read this table - */ - public int getMinReaderVersion() { - return minReaderVersion; - } - - /** - * @return the minimum version of the Delta write protocol that a client must implement in order - * to correctly write this table - */ - public int getMinWriterVersion() { - return minWriterVersion; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Protocol protocol = (Protocol) o; - return minReaderVersion == protocol.minReaderVersion && - minWriterVersion == protocol.minWriterVersion; - } - - @Override - public int hashCode() { - return Objects.hash(minReaderVersion, minWriterVersion); - } -} - diff --git a/connectors/standalone/src/main/java/io/delta/standalone/actions/RemoveFile.java b/connectors/standalone/src/main/java/io/delta/standalone/actions/RemoveFile.java deleted file mode 100644 index f087436fb47..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/actions/RemoveFile.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.actions; - -import java.util.Collections; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -/** - * Logical removal of a given file from the reservoir. Acts as a tombstone before a file is - * deleted permanently. - *

- * Users should only instantiate {@link RemoveFile} instances using one of the various - * {@link AddFile#remove()} methods. Users should use an {@link AddFile} instance read from the - * Delta Log since {@link AddFile} paths may be updated during - * {@link io.delta.standalone.OptimisticTransaction#commit}. - *

- * Note that for protocol compatibility reasons, the fields {@code partitionValues}, - * {@code size}, and {@code tags} are only present when the {@code extendedFileMetadata} flag is - * true. New writers should generally be setting this flag, but old writers (and FSCK) won't, so - * readers must check this flag before attempting to consume those values. - * - * @see Delta Transaction Log Protocol: Add File and Remove File - */ -public final class RemoveFile implements FileAction { - @Nonnull - private final String path; - - @Nonnull - private final Optional deletionTimestamp; - - private final boolean dataChange; - - private final boolean extendedFileMetadata; - - @Nullable - private final Map partitionValues; - - @Nonnull - private final Optional size; - - @Nullable - private final Map tags; - - /** - * Users should not construct {@link RemoveFile}s themselves, and should instead use one - * of the various {@link AddFile#remove()} methods to instantiate the correct {@link RemoveFile} - * for a given {@link AddFile} instance. - * - * @deprecated {@link RemoveFile} should be created from {@link AddFile#remove()} instead. - */ - @Deprecated - public RemoveFile( - @Nonnull String path, - @Nonnull Optional deletionTimestamp, - boolean dataChange, - boolean extendedFileMetadata, - @Nullable Map partitionValues, - @Nonnull - Optional size, - @Nullable Map tags) { - this.path = path; - this.deletionTimestamp = deletionTimestamp; - this.dataChange = dataChange; - this.extendedFileMetadata = extendedFileMetadata; - this.partitionValues = partitionValues; - this.size = size; - this.tags = tags; - } - - /** - * @return the relative path or the absolute path that should be removed from the table. If it's - * a relative path, it's relative to the root of the table. Note: the path is encoded - * and should be decoded by {@code new java.net.URI(path)} when using it. - */ - @Override - public String getPath() { - return path; - } - - /** - * @return the time that this file was deleted as milliseconds since the epoch - */ - public Optional getDeletionTimestamp() { - return deletionTimestamp; - } - - /** - * @return whether any data was changed as a result of this file being removed. When - * {@code false} the records in the removed file must be contained in one or more add - * actions in the same version - */ - @Override - public boolean isDataChange() { - return dataChange; - } - - /** - * @return true if the fields {@code partitionValues}, {@code size}, and {@code tags} are - * present - */ - public boolean isExtendedFileMetadata() { - return extendedFileMetadata; - } - - /** - * @return an unmodifiable {@code Map} from partition column to value for - * this file. Partition values are stored as strings, using the following formats. - * An empty string for any type translates to a null partition value. - * @see Delta Protocol Partition Value Serialization - */ - @Nullable - public Map getPartitionValues() { - return partitionValues != null ? Collections.unmodifiableMap(partitionValues) : null; - } - - /** - * @return the size of this file in bytes - */ - public Optional getSize() { - return size; - } - - /** - * @return an unmodifiable {@code Map} containing metadata about this file - */ - @Nullable - public Map getTags() { - return tags != null ? Collections.unmodifiableMap(tags) : null; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - RemoveFile removeFile = (RemoveFile) o; - return Objects.equals(path, removeFile.path) && - Objects.equals(deletionTimestamp, removeFile.deletionTimestamp) && - Objects.equals(dataChange, removeFile.dataChange) && - Objects.equals(extendedFileMetadata, removeFile.extendedFileMetadata) && - Objects.equals(partitionValues, removeFile.partitionValues) && - Objects.equals(size, removeFile.size) && - Objects.equals(tags, removeFile.tags); - } - - @Override - public int hashCode() { - return Objects.hash(path, deletionTimestamp, dataChange, extendedFileMetadata, - partitionValues, size, tags); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/actions/SetTransaction.java b/connectors/standalone/src/main/java/io/delta/standalone/actions/SetTransaction.java deleted file mode 100644 index 47365bda19e..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/actions/SetTransaction.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.actions; - -import java.util.Optional; -import javax.annotation.Nonnull; - -/** - * Sets the committed version for a given application. Used to make operations like - * {@link io.delta.standalone.Operation.Name#STREAMING_UPDATE} idempotent. - * - * @see Delta Transaction Log Protocol: Transaction Identifiers - */ -public final class SetTransaction implements Action { - @Nonnull - private final String appId; - - private final long version; - - @Nonnull - private final Optional lastUpdated; - - public SetTransaction( - @Nonnull String appId, - long version, - @Nonnull Optional lastUpdated) { - this.appId = appId; - this.version = version; - this.lastUpdated = lastUpdated; - } - - /** - * @return the unique identifier for the application performing the transaction - */ - @Nonnull - public String getAppId() { - return appId; - } - - /** - * @return the application-specific numeric identifier for this transaction - */ - public long getVersion() { - return version; - } - - /** - * @return the time when this transaction action was created, in milliseconds since the Unix - * epoch - */ - @Nonnull - public Optional getLastUpdated() { - return lastUpdated; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/data/CloseableIterator.java b/connectors/standalone/src/main/java/io/delta/standalone/data/CloseableIterator.java deleted file mode 100644 index ff1fc95524a..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/data/CloseableIterator.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.data; - -import java.io.Closeable; -import java.util.Iterator; - -/** - * An {@link Iterator} that also implements the {@link Closeable} interface. The caller - * should call {@link #close()} method to free all resources properly after using the iterator. - */ -public interface CloseableIterator extends Iterator, Closeable { } diff --git a/connectors/standalone/src/main/java/io/delta/standalone/data/RowRecord.java b/connectors/standalone/src/main/java/io/delta/standalone/data/RowRecord.java deleted file mode 100644 index c8c4066f2af..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/data/RowRecord.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.delta.standalone.data; - -import java.math.BigDecimal; -import java.sql.Date; -import java.sql.Timestamp; -import java.util.List; -import java.util.Map; - -import io.delta.standalone.types.StructField; -import io.delta.standalone.types.StructType; - -/** - * Represents one row of data containing a non-empty collection of {@code fieldName - value} pairs. - * It provides APIs to allow retrieval of values through {@code fieldName} lookup. For example, - * - *

{@code
- *   if (row.isNullAt("int_field")) {
- *     // handle the null value.
- *   } else {
- *     int x = getInt("int_field");
- *   }
- * }
- * - * @see StructType StructType - * @see StructField StructField - */ -public interface RowRecord { - - /** - * @return the schema for this {@link RowRecord} - */ - StructType getSchema(); - - /** - * @return the number of elements in this {@link RowRecord} - */ - int getLength(); - - /** - * @param fieldName name of field/column, not {@code null} - * @return whether the value of field {@code fieldName} is {@code null} - */ - boolean isNullAt(String fieldName); - - /** - * Retrieves value from data record and returns the value as a primitive int. - * - * @param fieldName name of field/column, not {@code null} - * @return the value for field {@code fieldName} as a primitive int - * @throws IllegalArgumentException if {@code fieldName} does not exist in this schema - * @throws ClassCastException if data type does not match - * @throws NullPointerException if {@code null} data value read - */ - int getInt(String fieldName); - - /** - * Retrieves value from data record and returns the value as a primitive long. - * - * @param fieldName name of field/column, not {@code null} - * @return the value for field {@code fieldName} as a primitive long - * @throws IllegalArgumentException if {@code fieldName} does not exist in this schema - * @throws ClassCastException if data type does not match - * @throws NullPointerException if {@code null} data value read - */ - long getLong(String fieldName); - - /** - * Retrieves value from data record and returns the value as a primitive byte. - * - * @param fieldName name of field/column, not {@code null} - * @return the value for field {@code fieldName} as a primitive byte - * @throws IllegalArgumentException if {@code fieldName} does not exist in this schema - * @throws ClassCastException if data type does not match - * @throws NullPointerException if {@code null} data value read - */ - byte getByte(String fieldName); - - /** - * Retrieves value from data record and returns the value as a primitive short. - * - * @param fieldName name of field/column, not {@code null} - * @return the value for field {@code fieldName} as a primitive short - * @throws IllegalArgumentException if {@code fieldName} does not exist in this schema - * @throws ClassCastException if data type does not match - * @throws NullPointerException if {@code null} data value read - */ - short getShort(String fieldName); - - /** - * Retrieves value from data record and returns the value as a primitive boolean. - * - * @param fieldName name of field/column, not {@code null} - * @return the value for field {@code fieldName} as a primitive boolean - * @throws IllegalArgumentException if {@code fieldName} does not exist in this schema - * @throws ClassCastException if data type does not match - * @throws NullPointerException if {@code null} data value read - */ - boolean getBoolean(String fieldName); - - /** - * Retrieves value from data record and returns the value as a primitive float. - * - * @param fieldName name of field/column, not {@code null} - * @return the value for field {@code fieldName} as a primitive float - * @throws IllegalArgumentException if {@code fieldName} does not exist in this schema - * @throws ClassCastException if data type does not match - * @throws NullPointerException if {@code null} data value read - */ - float getFloat(String fieldName); - - /** - * Retrieves value from data record and returns the value as a primitive double. - * - * @param fieldName name of field/column, not {@code null} - * @return the value for field {@code fieldName} as a primitive double - * @throws IllegalArgumentException if {@code fieldName} does not exist in this schema - * @throws ClassCastException if data type does not match - * @throws NullPointerException if {@code null} data value read - */ - double getDouble(String fieldName); - - /** - * Retrieves value from data record and returns the value as a {@code String} object. - * - * @param fieldName name of field/column, not {@code null} - * @return the value for field {@code fieldName} as a String object. {@code null} only if - * {@code null} value read and field is nullable. - * @throws IllegalArgumentException if {@code fieldName} does not exist in this schema - * @throws ClassCastException if data type does not match - * @throws NullPointerException if field is not nullable and {@code null} data value read - */ - String getString(String fieldName); - - /** - * Retrieves value from data record and returns the value as binary (byte array). - * - * @param fieldName name of field/column, not {@code null} - * @return the value for field {@code fieldName} as binary (byte array). {@code null} only if - * {@code null} value read and field is nullable. - * @throws IllegalArgumentException if {@code fieldName} does not exist in this schema - * @throws ClassCastException if data type does not match - * @throws NullPointerException if field is not nullable and {@code null} data value read - */ - byte[] getBinary(String fieldName); - - /** - * Retrieves value from data record and returns the value as a {@code java.math.BigDecimal}. - * - * @param fieldName name of field/column, not {@code null} - * @return the value for field {@code fieldName} as java.math.BigDecimal. {@code null} only if - * {@code null} value read and field is nullable. - * @throws IllegalArgumentException if {@code fieldName} does not exist in this schema - * @throws ClassCastException if data type does not match - * @throws NullPointerException if field is not nullable and {@code null} data value read - */ - BigDecimal getBigDecimal(String fieldName); - - /** - * Retrieves value from data record and returns the value as a {@code java.sql.Timestamp}. - * - * @param fieldName name of field/column, not {@code null} - * @return the value for field {@code fieldName} as java.sql.Timestamp. {@code null} only if - * {@code null} value read and field is nullable. - * @throws IllegalArgumentException if {@code fieldName} does not exist in this schema - * @throws ClassCastException if data type does not match - * @throws NullPointerException if field is not nullable and {@code null} data value read - */ - Timestamp getTimestamp(String fieldName); - - /** - * Retrieves value from data record and returns the value as a {@code java.sql.Date}. - * - * @param fieldName name of field/column, not {@code null} - * @return the value for field {@code fieldName} as java.sql.Date. {@code null} only if - * {@code null} value read and field is nullable. - * @throws IllegalArgumentException if {@code fieldName} does not exist in this schema - * @throws ClassCastException if data type does not match - * @throws NullPointerException if field is not nullable and {@code null} data value read - */ - Date getDate(String fieldName); - - /** - * Retrieves value from data record and returns the value as a {@code RowRecord} object. - * - * @param fieldName name of field/column, not {@code null} - * @return the value for field {@code fieldName} as a {@code RowRecord} object. - * {@code null} only if {@code null} value read and field is nullable. - * @throws IllegalArgumentException if {@code fieldName} does not exist in this schema - * @throws ClassCastException if data type does not match - * @throws NullPointerException for this field or any nested field, if that field is not - * nullable and {@code null} data value read - */ - RowRecord getRecord(String fieldName); - - /** - * Retrieves value from data record and returns the value as a {@code java.util.List} object. - * - * @param fieldName name of field/column, not {@code null} - * @param element type - * @return the value for field {@code fieldName} as a {@code java.util.List} object. - * {@code null} only if {@code null} value read and field is nullable. - * @throws IllegalArgumentException if {@code fieldName} does not exist in this schema - * @throws ClassCastException if data type does not match - * @throws NullPointerException for this field or any element field, if that field is not - * nullable and {@code null} data value read - */ - List getList(String fieldName); - - /** - * Retrieves value from data record and returns the value as a {@code java.util.Map} - * object. - * - * @param fieldName name of field/column, not {@code null} - * @param key type - * @param value type - * @return the value for field {@code fieldName} as a {@code java.util.Map} object. - * {@code null} only if {@code null} value read and field is nullable. - * @throws IllegalArgumentException if {@code fieldName} does not exist in this schema - * @throws ClassCastException if data type does not match - * @throws NullPointerException for this field or any key/value field, if that field is not - * nullable and {@code null} data value read - */ - Map getMap(String fieldName); -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentAppendException.java b/connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentAppendException.java deleted file mode 100644 index 0684e9066e2..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentAppendException.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.exceptions; - -/** - * Thrown when files are added that would have been read by the current transaction. - */ -public class ConcurrentAppendException extends DeltaConcurrentModificationException { - public ConcurrentAppendException(String message) { - super(message); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.java b/connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.java deleted file mode 100644 index 5385a068504..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentDeleteDeleteException.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.exceptions; - -/** - * Thrown when the current transaction deletes data that was deleted by a concurrent transaction. - */ -public class ConcurrentDeleteDeleteException extends DeltaConcurrentModificationException { - public ConcurrentDeleteDeleteException(String message) { - super(message); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.java b/connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.java deleted file mode 100644 index 66fd2564143..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentDeleteReadException.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.exceptions; - -/** - * Thrown when the current transaction reads data that was deleted by a concurrent transaction. - */ -public class ConcurrentDeleteReadException extends DeltaConcurrentModificationException { - public ConcurrentDeleteReadException(String message) { - super(message); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentTransactionException.java b/connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentTransactionException.java deleted file mode 100644 index ded42ca70b5..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/ConcurrentTransactionException.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.exceptions; - -/** - * Thrown when concurrent transaction both attempt to update the same idempotent transaction. - */ -public class ConcurrentTransactionException extends DeltaConcurrentModificationException { - public ConcurrentTransactionException(String message) { - super(message); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.java b/connectors/standalone/src/main/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.java deleted file mode 100644 index df4f0ef1337..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/DeltaConcurrentModificationException.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.exceptions; - -import java.util.ConcurrentModificationException; - -/** - * The basic class for all Delta Standalone commit conflict exceptions. - */ -public class DeltaConcurrentModificationException extends ConcurrentModificationException { - public DeltaConcurrentModificationException(String message) { - super(message); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/DeltaStandaloneException.java b/connectors/standalone/src/main/java/io/delta/standalone/exceptions/DeltaStandaloneException.java deleted file mode 100644 index 2abe39ecf3e..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/DeltaStandaloneException.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.exceptions; - -/** - * Thrown when a query fails, usually because the query itself is invalid. - */ -public class DeltaStandaloneException extends RuntimeException { - public DeltaStandaloneException() { - super(); - } - - public DeltaStandaloneException(String message) { - super(message); - } - - public DeltaStandaloneException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/MetadataChangedException.java b/connectors/standalone/src/main/java/io/delta/standalone/exceptions/MetadataChangedException.java deleted file mode 100644 index 79c2da17038..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/MetadataChangedException.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.exceptions; - -/** - * Thrown when the metadata of the Delta table has changed between the time of read - * and the time of commit. - */ -public class MetadataChangedException extends DeltaConcurrentModificationException { - public MetadataChangedException(String message) { - super(message); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/ProtocolChangedException.java b/connectors/standalone/src/main/java/io/delta/standalone/exceptions/ProtocolChangedException.java deleted file mode 100644 index c5c1d571bf4..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/exceptions/ProtocolChangedException.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.exceptions; - -/** - * Thrown when the protocol version has changed between the time of read and the time of commit. - */ -public class ProtocolChangedException extends DeltaConcurrentModificationException { - public ProtocolChangedException(String message) { - super(message); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/And.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/And.java deleted file mode 100644 index 343c39df86c..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/And.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.delta.standalone.expressions; - -import io.delta.standalone.types.BooleanType; -import io.delta.standalone.internal.exception.DeltaErrors; - -/** - * Evaluates logical {@code expr1} AND {@code expr2} for {@code new And(expr1, expr2)}. - *

- * Requires both left and right input expressions evaluate to booleans. - */ -public final class And extends BinaryOperator implements Predicate { - - public And(Expression left, Expression right) { - super(left, right, "&&"); - if (!(left.dataType() instanceof BooleanType) || - !(right.dataType() instanceof BooleanType)) { - throw DeltaErrors.illegalExpressionValueType( - "AND", - "bool", - left.dataType().getTypeName(), - right.dataType().getTypeName()); - } - } - - @Override - public Object nullSafeEval(Object leftResult, Object rightResult) { - return (boolean) leftResult && (boolean) rightResult; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/BinaryComparison.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/BinaryComparison.java deleted file mode 100644 index 8693873b389..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/BinaryComparison.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.delta.standalone.expressions; - -import java.util.Comparator; - -import io.delta.standalone.internal.expressions.Util; - -/** - * A {@link BinaryOperator} that compares the left and right {@link Expression}s and evaluates to a - * boolean value. - */ -public abstract class BinaryComparison extends BinaryOperator implements Predicate { - private final Comparator comparator; - - protected BinaryComparison(Expression left, Expression right, String symbol) { - super(left, right, symbol); - - // super asserted that left and right DataTypes were the same - - comparator = Util.createComparator(left.dataType()); - } - - protected int compare(Object leftResult, Object rightResult) { - return comparator.compare(leftResult, rightResult); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/BinaryExpression.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/BinaryExpression.java deleted file mode 100644 index 2fbd8550ce4..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/BinaryExpression.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.expressions; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -import io.delta.standalone.data.RowRecord; - -/** - * An {@link Expression} with two inputs and one output. The output is by default evaluated to null - * if either input is evaluated to null. - */ -public abstract class BinaryExpression implements Expression { - protected final Expression left; - protected final Expression right; - - protected BinaryExpression(Expression left, Expression right) { - this.left = left; - this.right = right; - } - - public Expression getLeft() { - return left; - } - - public Expression getRight() { - return right; - } - - @Override - public final Object eval(RowRecord record) { - Object leftResult = left.eval(record); - if (null == leftResult) return null; - - Object rightResult = right.eval(record); - if (null == rightResult) return null; - - return nullSafeEval(leftResult, rightResult); - } - - protected abstract Object nullSafeEval(Object leftResult, Object rightResult); - - @Override - public List children() { - return Arrays.asList(left, right); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - BinaryExpression that = (BinaryExpression) o; - return Objects.equals(left, that.left) && - Objects.equals(right, that.right); - } - - @Override - public int hashCode() { - return Objects.hash(left, right); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/BinaryOperator.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/BinaryOperator.java deleted file mode 100644 index 24a9327d0bc..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/BinaryOperator.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.delta.standalone.expressions; - -/** - * A {@link BinaryExpression} that is an operator, meaning the string representation is - * {@code x symbol y}, rather than {@code funcName(x, y)}. - *

- * Requires both inputs to be of the same data type. - */ -public abstract class BinaryOperator extends BinaryExpression { - protected final String symbol; - - protected BinaryOperator(Expression left, Expression right, String symbol) { - super(left, right); - this.symbol = symbol; - - if (!left.dataType().equivalent(right.dataType())) { - throw new IllegalArgumentException("BinaryOperator left and right DataTypes must be the" - + " same, found: " + left.dataType().getTypeName() + " " + symbol + " " + - right.dataType().getTypeName()); - } - } - - @Override - public String toString() { - return "(" + left.toString() + " " + symbol + " " + right.toString() + ")"; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/Column.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/Column.java deleted file mode 100644 index 1976c4e3024..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/Column.java +++ /dev/null @@ -1,100 +0,0 @@ -package io.delta.standalone.expressions; - -import java.util.Collections; -import java.util.Objects; -import java.util.Set; - -import io.delta.standalone.data.RowRecord; -import io.delta.standalone.types.*; - -/** - * A column whose row-value will be computed based on the data in a {@link RowRecord}. - *

- * It is recommended that you instantiate using an existing table schema {@link StructType} - * with {@link StructType#column(String)}. For example, {@code mySchema.column(columnName)}. - *

- * Only supports primitive data types, see - * Delta Transaction Log Protocol: Primitive Types. - */ -public final class Column extends LeafExpression { - private final String name; - private final DataType dataType; - private final RowRecordEvaluator evaluator; - - public Column(String name, DataType dataType) { - this.name = name; - this.dataType = dataType; - - if (dataType instanceof IntegerType) { - evaluator = (record -> record.getInt(name)); - } else if (dataType instanceof LongType) { - evaluator = (record -> record.getLong(name)); - } else if (dataType instanceof ByteType) { - evaluator = (record -> record.getByte(name)); - } else if (dataType instanceof ShortType) { - evaluator = (record -> record.getShort(name)); - } else if (dataType instanceof BooleanType) { - evaluator = (record -> record.getBoolean(name)); - } else if (dataType instanceof FloatType) { - evaluator = (record -> record.getFloat(name)); - } else if (dataType instanceof DoubleType) { - evaluator = (record -> record.getDouble(name)); - } else if (dataType instanceof StringType) { - evaluator = (record -> record.getString(name)); - } else if (dataType instanceof BinaryType) { - evaluator = (record -> record.getBinary(name)); - } else if (dataType instanceof DecimalType) { - evaluator = (record -> record.getBigDecimal(name)); - } else if (dataType instanceof TimestampType) { - evaluator = (record -> record.getTimestamp(name)); - } else if (dataType instanceof DateType) { - evaluator = (record -> record.getDate(name)); - } else { - throw new UnsupportedOperationException("The data type of column " + name + - " is " + dataType.getTypeName() + ". This is not supported yet."); - } - } - - public String name() { - return name; - } - - @Override - public Object eval(RowRecord record) { - return record.isNullAt(name) ? null : evaluator.nullSafeEval(record); - } - - @Override - public DataType dataType() { - return dataType; - } - - @Override - public String toString() { - return "Column(" + name + ")"; - } - - @Override - public Set references() { - return Collections.singleton(name); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Column column = (Column) o; - return Objects.equals(name, column.name) && - Objects.equals(dataType, column.dataType); - } - - @Override - public int hashCode() { - return Objects.hash(name, dataType); - } - - @FunctionalInterface - private interface RowRecordEvaluator { - Object nullSafeEval(RowRecord record); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/EqualTo.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/EqualTo.java deleted file mode 100644 index 927e68b3b62..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/EqualTo.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.delta.standalone.expressions; - -/** - * Evaluates {@code expr1} = {@code expr2} for {@code new EqualTo(expr1, expr2)}. - */ -public final class EqualTo extends BinaryComparison implements Predicate { - - public EqualTo(Expression left, Expression right) { - super(left, right, "="); - } - - @Override - protected Object nullSafeEval(Object leftResult, Object rightResult) { - return compare(leftResult, rightResult) == 0; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/Expression.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/Expression.java deleted file mode 100644 index e5e35e61ac3..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/Expression.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.expressions; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import io.delta.standalone.data.RowRecord; -import io.delta.standalone.types.DataType; - -/** - * An expression in Delta Standalone. - */ -public interface Expression { - - /** - * @param record the input record to evaluate. - * @return the result of evaluating this expression on the given input {@link RowRecord}. - */ - Object eval(RowRecord record); - - /** - * @return the {@link DataType} of the result of evaluating this expression. - */ - DataType dataType(); - - /** - * @return the String representation of this expression. - */ - String toString(); - - /** - * @return the names of columns referenced by this expression. - */ - default Set references() { - Set result = new HashSet<>(); - children().forEach(child -> result.addAll(child.references())); - return result; - } - - /** - * @return a {@link List} of the immediate children of this node - */ - List children(); -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/GreaterThan.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/GreaterThan.java deleted file mode 100644 index 242f34f0237..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/GreaterThan.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.expressions; - -/** - * Evaluates {@code expr1} > {@code expr2} for {@code new GreaterThan(expr1, expr2)}. - */ -public final class GreaterThan extends BinaryComparison implements Predicate { - public GreaterThan(Expression left, Expression right) { - super(left, right, ">"); - } - - @Override - protected Object nullSafeEval(Object leftResult, Object rightResult) { - return compare(leftResult, rightResult) > 0; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/GreaterThanOrEqual.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/GreaterThanOrEqual.java deleted file mode 100644 index 8db54d643ce..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/GreaterThanOrEqual.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.delta.standalone.expressions; - -/** - * Evaluates {@code expr1} >= {@code expr2} for {@code new GreaterThanOrEqual(expr1, expr2)}. - */ -public final class GreaterThanOrEqual extends BinaryComparison implements Predicate { - public GreaterThanOrEqual(Expression left, Expression right) { - super(left, right, ">="); - } - - @Override - protected Object nullSafeEval(Object leftResult, Object rightResult) { - return compare(leftResult, rightResult) >= 0; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/In.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/In.java deleted file mode 100644 index c4161f1d7e7..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/In.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.expressions; - -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import io.delta.standalone.data.RowRecord; -import io.delta.standalone.internal.expressions.Util; - -/** - * Evaluates if {@code expr} is in {@code exprList} for {@code new In(expr, exprList)}. True if - * {@code expr} is equal to any expression in {@code exprList}, else false. - */ -public final class In implements Predicate { - private final Expression value; - private final List elems; - private final Comparator comparator; - - /** - * @param value a nonnull expression - * @param elems a nonnull, nonempty list of expressions with the same data type as - * {@code value} - */ - public In(Expression value, List elems) { - if (null == value) { - throw new IllegalArgumentException("'In' expression 'value' cannot be null"); - } - if (null == elems) { - throw new IllegalArgumentException("'In' expression 'elems' cannot be null"); - } - if (elems.isEmpty()) { - throw new IllegalArgumentException("'In' expression 'elems' cannot be empty"); - } - - boolean allSameDataType = elems - .stream() - .allMatch(x -> x.dataType().equivalent(value.dataType())); - - if (!allSameDataType) { - throw new IllegalArgumentException( - "In expression 'elems' and 'value' must all be of the same DataType"); - } - - this.value = value; - this.elems = elems; - this.comparator = Util.createComparator(value.dataType()); - } - - /** - * This implements the {@code IN} expression functionality outlined by the Databricks SQL Null - * semantics reference guide. The logic is as follows: - *
    - *
  • TRUE if the non-NULL value is found in the list
  • - *
  • FALSE if the non-NULL value is not found in the list and the list does not contain - * NULL values
  • - *
  • NULL if the value is NULL, or the non-NULL value is not found in the list and the - * list contains at least one NULL value
  • - *
- * - * @see NULL Semantics - */ - @Override - public Boolean eval(RowRecord record) { - Object origValue = value.eval(record); - if (null == origValue) return null; - - // null if a null value has been found in list, otherwise false - Boolean falseOrNullresult = false; - for (Expression setElem : elems) { - Object setElemValue = setElem.eval(record); - if (setElemValue == null) { - // null value found but element may still be in list - falseOrNullresult = null; - } else if (comparator.compare(origValue, setElemValue) == 0) { - // short circuit and return true; we have found the element in the list - return true; - } - - } - return falseOrNullresult; - } - - @Override - public String toString() { - String elemsStr = elems - .stream() - .map(Expression::toString) - .collect(Collectors.joining(", ")); - return value + " IN (" + elemsStr + ")"; - } - - @Override - public List children() { - return Stream.concat(Stream.of(value), elems.stream()).collect(Collectors.toList()); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/IsNotNull.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/IsNotNull.java deleted file mode 100644 index 598bef6f234..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/IsNotNull.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.delta.standalone.expressions; - -import io.delta.standalone.data.RowRecord; - -/** - * Evaluates if {@code expr} is not null for {@code new IsNotNull(expr)}. - */ -public final class IsNotNull extends UnaryExpression implements Predicate { - public IsNotNull(Expression child) { - super(child); - } - - @Override - public Object eval(RowRecord record) { - return child.eval(record) != null; - } - - @Override - public String toString() { - return "(" + child.toString() + ") IS NOT NULL"; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/IsNull.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/IsNull.java deleted file mode 100644 index 9647f25dcb2..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/IsNull.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.delta.standalone.expressions; - -import io.delta.standalone.data.RowRecord; - -/** - * Evaluates if {@code expr} is null for {@code new IsNull(expr)}. - */ -public final class IsNull extends UnaryExpression implements Predicate { - public IsNull(Expression child) { - super(child); - } - - @Override - public Object eval(RowRecord record) { return child.eval(record) == null; } - - @Override - public String toString() { - return "(" + child.toString() + ") IS NULL"; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/LeafExpression.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/LeafExpression.java deleted file mode 100644 index d42b5c08b02..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/LeafExpression.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.delta.standalone.expressions; - -import java.util.Collections; -import java.util.List; -import java.util.Set; - -/** - * An {@link Expression} with no children. - */ -public abstract class LeafExpression implements Expression { - - protected LeafExpression() {} - - @Override - public List children() { - return Collections.emptyList(); - } - - @Override - public Set references() { - return Collections.emptySet(); - } - - public abstract boolean equals(Object o); - - public abstract int hashCode(); -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/LessThan.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/LessThan.java deleted file mode 100644 index cba7d024b17..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/LessThan.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.delta.standalone.expressions; - -/** - * Evaluates {@code expr1} < {@code expr2} for {@code new LessThan(expr1, expr2)}. - */ -public final class LessThan extends BinaryComparison implements Predicate { - public LessThan(Expression left, Expression right) { - super(left, right, "<"); - } - - @Override - protected Object nullSafeEval(Object leftResult, Object rightResult) { - return compare(leftResult, rightResult) < 0; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/LessThanOrEqual.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/LessThanOrEqual.java deleted file mode 100644 index f43638fa74a..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/LessThanOrEqual.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.delta.standalone.expressions; - -/** - * Evaluates {@code expr1} <= {@code expr2} for {@code new LessThanOrEqual(expr1, expr2)}. - */ -public final class LessThanOrEqual extends BinaryComparison implements Predicate { - public LessThanOrEqual(Expression left, Expression right) { - super(left, right, "<="); - } - - @Override - protected Object nullSafeEval(Object leftResult, Object rightResult) { - return compare(leftResult, rightResult) <= 0; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/Literal.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/Literal.java deleted file mode 100644 index 1e29752cdb8..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/Literal.java +++ /dev/null @@ -1,159 +0,0 @@ -package io.delta.standalone.expressions; - -import java.math.BigDecimal; -import java.sql.Date; -import java.sql.Timestamp; -import java.util.Objects; - -import io.delta.standalone.data.RowRecord; -import io.delta.standalone.types.*; - -/** - * A literal value. - *

- * Only supports primitive data types, see - * Delta Transaction Log Protocol: Primitive Types. - */ -public final class Literal extends LeafExpression { - public static final Literal True = Literal.of(true); - public static final Literal False = Literal.of(false); - - private final Object value; - private final DataType dataType; - - private Literal(Object value, DataType dataType) { - this.value = value; - this.dataType = dataType; - } - - public Object value() { - return value; - } - - @Override - public Object eval(RowRecord record) { - return value; - } - - @Override - public DataType dataType() { - return dataType; - } - - @Override - public String toString() { - return String.valueOf(value); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Literal literal = (Literal) o; - return Objects.equals(value, literal.value) && - Objects.equals(dataType, literal.dataType); - } - - @Override - public int hashCode() { - return Objects.hash(value, dataType); - } - - /** - * @return a {@link Literal} with data type {@link IntegerType} - */ - public static Literal of(int value) { - return new Literal(value, new IntegerType()); - } - - /** - * @return a {@link Literal} with data type {@link BooleanType} - */ - public static Literal of(boolean value) { - return new Literal(value, new BooleanType()); - } - - /** - * @return a {@link Literal} with data type {@link BinaryType} - */ - public static Literal of(byte[] value) { - return new Literal(value, new BinaryType()); - } - - /** - * @return a {@link Literal} with data type {@link DateType} - */ - public static Literal of(Date value) { - return new Literal(value, new DateType()); - } - - /** - * @return a {@link Literal} with data type {@link DecimalType} with precision and scale - * inferred from {@code value} - */ - public static Literal of(BigDecimal value) { - return new Literal(value, new DecimalType(value.precision(), value.scale())); - } - - /** - * @return a {@link Literal} with data type {@link DoubleType} - */ - public static Literal of(double value) { - return new Literal(value, new DoubleType()); - } - - /** - * @return a {@link Literal} with data type {@link FloatType} - */ - public static Literal of(float value) { - return new Literal(value, new FloatType()); - } - - /** - * @return a {@link Literal} with data type {@link LongType} - */ - public static Literal of(long value) { - return new Literal(value, new LongType()); - } - - /** - * @return a {@link Literal} with data type {@link ShortType} - */ - public static Literal of(short value) { - return new Literal(value, new ShortType()); - } - - /** - * @return a {@link Literal} with data type {@link StringType} - */ - public static Literal of(String value) { - return new Literal(value, new StringType()); - } - - /** - * @return a {@link Literal} with data type {@link TimestampType} - */ - public static Literal of(Timestamp value) { - return new Literal(value, new TimestampType()); - } - - /** - * @return a {@link Literal} with data type {@link ByteType} - */ - public static Literal of(byte value) { - return new Literal(value, new ByteType()); - } - - /** - * @return a null {@link Literal} with the given data type - */ - public static Literal ofNull(DataType dataType) { - if (dataType instanceof NullType - || dataType instanceof ArrayType - || dataType instanceof MapType - || dataType instanceof StructType) { - throw new IllegalArgumentException( - dataType.getTypeName() + " is an invalid data type for Literal."); - } - return new Literal(null, dataType); } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/Not.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/Not.java deleted file mode 100644 index a2441078f2d..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/Not.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.delta.standalone.expressions; - -import io.delta.standalone.types.BooleanType; -import io.delta.standalone.internal.exception.DeltaErrors; - -/** - * Evaluates logical NOT {@code expr} for {@code new Not(expr)}. - *

- * Requires the child expression evaluates to a boolean. - */ -public final class Not extends UnaryExpression implements Predicate { - public Not(Expression child) { - super(child); - if (!(child.dataType() instanceof BooleanType)) { - throw DeltaErrors.illegalExpressionValueType( - "NOT", - "bool", - child.dataType().getTypeName()); - } - } - - @Override - public Object nullSafeEval(Object childResult) { - return !((boolean) childResult); - } - - @Override - public String toString() { - return "(NOT " + child.toString() + ")"; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/Or.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/Or.java deleted file mode 100644 index 3df2d2b8335..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/Or.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.delta.standalone.expressions; - -import io.delta.standalone.types.BooleanType; -import io.delta.standalone.internal.exception.DeltaErrors; - -/** - * Evaluates logical {@code expr1} OR {@code expr2} for {@code new Or(expr1, expr2)}. - *

- * Requires both left and right input expressions evaluate to booleans. - */ -public final class Or extends BinaryOperator implements Predicate { - - public Or(Expression left, Expression right) { - super(left, right, "||"); - if (!(left.dataType() instanceof BooleanType) || - !(right.dataType() instanceof BooleanType)) { - throw DeltaErrors.illegalExpressionValueType( - "OR", - "bool", - left.dataType().getTypeName(), - right.dataType().getTypeName()); - } - } - - @Override - public Object nullSafeEval(Object leftResult, Object rightResult) { - return (boolean) leftResult || (boolean) rightResult; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/Predicate.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/Predicate.java deleted file mode 100644 index 7966c25aaeb..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/Predicate.java +++ /dev/null @@ -1,14 +0,0 @@ -package io.delta.standalone.expressions; - -import io.delta.standalone.types.BooleanType; -import io.delta.standalone.types.DataType; - -/** - * An {@link Expression} that defines a relation on inputs. Evaluates to true, false, or null. - */ -public interface Predicate extends Expression { - @Override - default DataType dataType() { - return new BooleanType(); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/expressions/UnaryExpression.java b/connectors/standalone/src/main/java/io/delta/standalone/expressions/UnaryExpression.java deleted file mode 100644 index 43470f64c1c..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/expressions/UnaryExpression.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.expressions; - -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -import io.delta.standalone.data.RowRecord; - -/** - * An {@link Expression} with one input and one output. The output is by default evaluated to null - * if the input is evaluated to null. - */ -public abstract class UnaryExpression implements Expression { - protected final Expression child; - - protected UnaryExpression(Expression child) { - this.child = child; - } - - public Expression getChild() { - return child; - } - - @Override - public Object eval(RowRecord record) { - Object childResult = child.eval(record); - - if (null == childResult) return null; - - return nullSafeEval(childResult); - } - - protected Object nullSafeEval(Object childResult) { - throw new IllegalArgumentException( - "UnaryExpressions must override either eval or nullSafeEval"); - } - - @Override - public List children() { - return Collections.singletonList(child); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - UnaryExpression that = (UnaryExpression) o; - return Objects.equals(child, that.child); - } - - @Override - public int hashCode() { - return Objects.hash(child); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/internal/expressions/CastingComparator.java b/connectors/standalone/src/main/java/io/delta/standalone/internal/expressions/CastingComparator.java deleted file mode 100644 index 49863c5d7b8..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/internal/expressions/CastingComparator.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.delta.standalone.internal.expressions; - -import java.util.Comparator; - -public class CastingComparator> implements Comparator { - private final Comparator comparator; - - public CastingComparator() { - comparator = Comparator.naturalOrder(); - } - - @SuppressWarnings("unchecked") - @Override - public int compare(Object a, Object b) { - return comparator.compare((T) a, (T) b); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/internal/expressions/Util.java b/connectors/standalone/src/main/java/io/delta/standalone/internal/expressions/Util.java deleted file mode 100644 index 1e493f8097b..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/internal/expressions/Util.java +++ /dev/null @@ -1,75 +0,0 @@ -package io.delta.standalone.internal.expressions; - -import java.math.BigDecimal; -import java.util.Comparator; -import java.util.Date; - -import io.delta.standalone.types.*; - -public final class Util { - - public static Comparator createComparator(DataType dataType) { - if (dataType instanceof IntegerType) { - return new CastingComparator(); - } - - if (dataType instanceof BooleanType) { - return new CastingComparator(); - } - - if (dataType instanceof FloatType) { - return new CastingComparator(); - } - - if (dataType instanceof LongType) { - return new CastingComparator(); - } - - if (dataType instanceof ByteType) { - return new CastingComparator(); - } - - if (dataType instanceof ShortType) { - return new CastingComparator(); - } - - if (dataType instanceof DoubleType) { - return new CastingComparator(); - } - - if (dataType instanceof DecimalType) { - return new CastingComparator(); - } - - if (dataType instanceof TimestampType) { - return new CastingComparator(); - } - - if (dataType instanceof DateType) { - return new CastingComparator(); - } - - if (dataType instanceof StringType) { - return new CastingComparator(); - } - - if (dataType instanceof BinaryType) { - return (o1, o2) -> { - byte[] one = (byte[]) o1; - byte[] two = (byte[]) o2; - int i = 0; - while (i < one.length && i < two.length) { - if (one[i] != two[i]) { - return Byte.compare(one[i], two[i]); - } - i ++; - } - return Integer.compare(one.length, two.length); - }; - } - - // unsupported comparison types: ArrayType, StructType, MapType - throw new IllegalArgumentException( - "Couldn't find matching comparator for DataType: " + dataType.getTypeName()); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/ArrayType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/ArrayType.java deleted file mode 100644 index 278f589dd90..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/ArrayType.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -import java.util.Objects; - -/** - * The data type for collections of multiple values. - */ -public final class ArrayType extends DataType { - private final DataType elementType; - private final boolean containsNull; - - /** - * @param elementType the data type of values - * @param containsNull indicates if values have {@code null} value - */ - public ArrayType(DataType elementType, boolean containsNull) { - this.elementType = elementType; - this.containsNull = containsNull; - } - - /** - * @return the type of array elements - */ - public DataType getElementType() { - return elementType; - } - - /** - * @return {@code true} if the array has {@code null} values, else {@code false} - */ - public boolean containsNull() { - return containsNull; - } - - /** - * Builds a readable {@code String} representation of this {@code ArrayType}. - */ - protected void buildFormattedString(String prefix, StringBuilder builder) { - final String nextPrefix = prefix + " |"; - builder.append( - String.format( - "%s-- element: %s (containsNull = %b)\n", - prefix, - elementType.getTypeName(), - containsNull) - ); - DataType.buildFormattedString(elementType, nextPrefix, builder); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ArrayType arrayType = (ArrayType) o; - return containsNull == arrayType.containsNull && - Objects.equals(elementType, arrayType.elementType); - } - - @Override - public int hashCode() { - return Objects.hash(elementType, containsNull); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/BinaryType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/BinaryType.java deleted file mode 100644 index fc3b141bd8b..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/BinaryType.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -/** - * The data type representing {@code byte[]} values. - */ -public final class BinaryType extends DataType { } diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/BooleanType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/BooleanType.java deleted file mode 100644 index dc42dea3792..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/BooleanType.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -/** - * The data type representing {@code boolean} values. - */ -public final class BooleanType extends DataType { } diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/ByteType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/ByteType.java deleted file mode 100644 index cb869d3d96e..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/ByteType.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -/** - * The data type representing {@code byte} values. - */ -public final class ByteType extends DataType { - @Override - public String getSimpleString() { - return "tinyint"; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/DataType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/DataType.java deleted file mode 100644 index 35f2f7ffd20..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/DataType.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -import java.util.Locale; -import java.util.Objects; - -import io.delta.standalone.internal.util.DataTypeParser; - -/** - * The base type of all {@code io.delta.standalone} data types. - * Represents a bare-bones Java implementation of the Spark SQL - * DataType, - * allowing Spark SQL schemas to be represented in Java. - */ -public abstract class DataType { - - /** - * Parses the input {@code json} into a {@link DataType}. - * - * @param json the {@link String} json to parse - * @return the parsed {@link DataType} - */ - public static DataType fromJson(String json) { - return DataTypeParser.fromJson(json); - } - - /** - * @return the name of the type used in JSON serialization - */ - public String getTypeName() { - String tmp = this.getClass().getSimpleName(); - tmp = stripSuffix(tmp, "$"); - tmp = stripSuffix(tmp, "Type"); - tmp = stripSuffix(tmp, "UDT"); - return tmp.toLowerCase(Locale.ROOT); - } - - /** - * @return a readable {@code String} representation for the type - */ - public String getSimpleString() { - return getTypeName(); - } - - /** - * @return a {@code String} representation for the type saved in external catalogs - */ - public String getCatalogString() { - return getSimpleString(); - } - - /** - * @return a JSON {@code String} representation of the type - */ - public String toJson() { return DataTypeParser.toJson(this); } - - /** - * @return a pretty (i.e. indented) JSON {@code String} representation of the type - */ - public String toPrettyJson() { return DataTypeParser.toPrettyJson(this); } - - /** - * Builds a readable {@code String} representation of the {@code ArrayType} - */ - protected static void buildFormattedString( - DataType dataType, - String prefix, - StringBuilder builder) { - if (dataType instanceof ArrayType) { - ((ArrayType) dataType).buildFormattedString(prefix, builder); - } - if (dataType instanceof StructType) { - ((StructType) dataType).buildFormattedString(prefix, builder); - } - if (dataType instanceof MapType) { - ((MapType) dataType).buildFormattedString(prefix, builder); - } - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - DataType that = (DataType) o; - return getTypeName().equals(that.getTypeName()); - } - - public boolean equivalent(DataType dt) { - return this.equals(dt); - } - - @Override - public int hashCode() { - return Objects.hash(getTypeName()); - } - - private String stripSuffix(String orig, String suffix) { - if (null != orig && orig.endsWith(suffix)) { - return orig.substring(0, orig.length() - suffix.length()); - } - return orig; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/DateType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/DateType.java deleted file mode 100644 index a1411f4b510..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/DateType.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -/** - * A date type, supporting "0001-01-01" through "9999-12-31". - * Internally, this is represented as the number of days from 1970-01-01. - */ -public final class DateType extends DataType { } diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/DecimalType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/DecimalType.java deleted file mode 100644 index 766b4d12b00..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/DecimalType.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -import java.util.Objects; - -/** - * The data type representing {@code java.math.BigDecimal} values. - * A Decimal that must have fixed precision (the maximum number of digits) and scale (the number - * of digits on right side of dot). - * - * The precision can be up to 38, scale can also be up to 38 (less or equal to precision). - * - * The default precision and scale is (10, 0). - */ -public final class DecimalType extends DataType { - public static final DecimalType USER_DEFAULT = new DecimalType(10, 0); - - private final int precision; - private final int scale; - - public DecimalType(int precision, int scale) { - this.precision = precision; - this.scale = scale; - } - - /** - * @return the maximum number of digits of the decimal - */ - public int getPrecision() { - return precision; - } - - /** - * @return the number of digits on the right side of the decimal point (dot) - */ - public int getScale() { - return scale; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - DecimalType that = (DecimalType) o; - return precision == that.precision && - scale == that.scale; - } - - @Override - public boolean equivalent(DataType dt) { - return dt instanceof DecimalType; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), precision, scale); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/DoubleType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/DoubleType.java deleted file mode 100644 index 182ab150031..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/DoubleType.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -/** - * The data type representing {@code double} values. - */ -public final class DoubleType extends DataType { } diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/FieldMetadata.java b/connectors/standalone/src/main/java/io/delta/standalone/types/FieldMetadata.java deleted file mode 100644 index 0d7fef2a076..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/FieldMetadata.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * The metadata for a given {@link StructField}. - */ -public final class FieldMetadata { - private final Map metadata; - - private FieldMetadata(Map metadata) { - this.metadata = metadata; - } - - /** - * @return list of the key-value pairs in this {@link FieldMetadata} - */ - public Map getEntries() { - return Collections.unmodifiableMap(metadata); - } - - /** - * @param key the key to check for - * @return True if {@code this} contains a mapping for the given key, False otherwise - */ - public boolean contains(String key) { - return metadata.containsKey(key); - } - - /** - * @param key the key to check for - * @return the value to which the specified key is mapped, or null if there is no mapping for - * the given key - */ - public Object get(String key) { - return metadata.get(key); - } - - @Override - public String toString() { - return metadata.entrySet() - .stream() - .map(entry -> entry.getKey() + "=" + - (entry.getValue().getClass().isArray() ? - Arrays.toString((Object[]) entry.getValue()) : - entry.getValue().toString())) - .collect(Collectors.joining(", ", "{", "}")); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - FieldMetadata that = (FieldMetadata) o; - if (this.metadata.size() != that.metadata.size()) return false; - return this.metadata.entrySet().stream().allMatch(e -> - e.getValue().equals(that.metadata.get(e.getKey())) || - (e.getValue().getClass().isArray() && - that.metadata.get(e.getKey()).getClass().isArray() && - Arrays.equals( - (Object[]) e.getValue(), - (Object[]) that.metadata.get(e.getKey())))); - } - - @Override - public int hashCode() { - return metadata.entrySet() - .stream() - .mapToInt( entry -> (entry.getValue().getClass().isArray() ? - (entry.getKey() == null ? 0 : entry.getKey().hashCode())^ - Arrays.hashCode((Object[]) entry.getValue()) : - entry.hashCode()) - ).sum(); - } - - /** - * @return a new {@link FieldMetadata.Builder} - */ - public static Builder builder() { - return new Builder(); - } - - /** - * Builder class for {@link FieldMetadata}. - */ - public static class Builder { - private Map metadata = new HashMap(); - - public Builder putNull(String key) { - metadata.put(key, null); - return this; - } - - public Builder putLong(String key, long value) { - metadata.put(key, value); - return this; - } - - public Builder putDouble(String key, double value) { - metadata.put(key, value); - return this; - } - - public Builder putBoolean(String key, boolean value) { - metadata.put(key, value); - return this; - } - - public Builder putString(String key, String value) { - metadata.put(key, value); - return this; - } - - public Builder putMetadata(String key, FieldMetadata value) { - metadata.put(key, value); - return this; - } - - public Builder putLongArray(String key, Long[] value) { - metadata.put(key, value); - return this; - } - - public Builder putDoubleArray(String key, Double[] value) { - metadata.put(key, value); - return this; - } - - public Builder putBooleanArray(String key, Boolean[] value) { - metadata.put(key, value); - return this; - } - - public Builder putStringArray(String key, String[] value) { - metadata.put(key, value); - return this; - } - - public Builder putMetadataArray(String key, FieldMetadata[] value) { - metadata.put(key, value); - return this; - } - - /** - * @return a new {@link FieldMetadata} with the mappings added to the builder - */ - public FieldMetadata build() { - return new FieldMetadata(this.metadata); - } - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/FloatType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/FloatType.java deleted file mode 100644 index 2831525d6e4..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/FloatType.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -/** - * The data type representing {@code float} values. - */ -public final class FloatType extends DataType { } diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/IntegerType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/IntegerType.java deleted file mode 100644 index 97509b08a0a..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/IntegerType.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -/** - * The data type representing {@code int} values. - */ -public final class IntegerType extends DataType { - @Override - public String getSimpleString() { - return "int"; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/LongType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/LongType.java deleted file mode 100644 index e1ad3adba23..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/LongType.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -/** - * The data type representing {@code long} values. - */ -public final class LongType extends DataType { - @Override - public String getSimpleString() { - return "bigint"; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/MapType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/MapType.java deleted file mode 100644 index 1e034934ed6..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/MapType.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -import java.util.Objects; - -/** - * The data type for Maps. Keys in a map are not allowed to have {@code null} values. - */ -public final class MapType extends DataType { - private final DataType keyType; - private final DataType valueType; - private final boolean valueContainsNull; - - /** - * @param keyType the data type of map keys - * @param valueType the data type of map values - * @param valueContainsNull indicates if map values have {@code null} values - */ - public MapType(DataType keyType, DataType valueType, boolean valueContainsNull) { - this.keyType = keyType; - this.valueType = valueType; - this.valueContainsNull = valueContainsNull; - } - - /** - * @return the data type of map keys - */ - public DataType getKeyType() { - return keyType; - } - - /** - * @return the data type of map values - */ - public DataType getValueType() { - return valueType; - } - - /** - * @return {@code true} if this map has null values, else {@code false} - */ - public boolean valueContainsNull() { - return valueContainsNull; - } - - /** - * Builds a readable {@code String} representation of this {@code MapType}. - */ - protected void buildFormattedString(String prefix, StringBuilder builder) { - final String nextPrefix = prefix + " |"; - builder.append(String.format("%s-- key: %s\n", prefix, keyType.getTypeName())); - DataType.buildFormattedString(keyType, nextPrefix, builder); - builder.append( - String.format( - "%s-- value: %s (valueContainsNull = %b)\n", - prefix, - valueType.getTypeName(), - valueContainsNull) - ); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - MapType mapType = (MapType) o; - return valueContainsNull == mapType.valueContainsNull && - Objects.equals(keyType, mapType.keyType) && - Objects.equals(valueType, mapType.valueType); - } - - @Override - public int hashCode() { - return Objects.hash(keyType, valueType, valueContainsNull); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/NullType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/NullType.java deleted file mode 100644 index 587e631c43f..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/NullType.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -/** - * The data type representing {@code null} values. - */ -public final class NullType extends DataType { } diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/ShortType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/ShortType.java deleted file mode 100644 index 2f9d0270294..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/ShortType.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -/** - * The data type representing {@code short} values. - */ -public final class ShortType extends DataType { - @Override - public String getSimpleString() { - return "smallint"; - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/StringType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/StringType.java deleted file mode 100644 index 8850c5f6840..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/StringType.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -/** - * The data type representing {@code String} values. - */ -public final class StringType extends DataType { } diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/StructField.java b/connectors/standalone/src/main/java/io/delta/standalone/types/StructField.java deleted file mode 100644 index d7f9eb14002..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/StructField.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -import java.util.Objects; - -/** - * A field inside a {@link StructType}. - */ -public final class StructField { - private final String name; - private final DataType dataType; - private final boolean nullable; - private final FieldMetadata metadata; - - /** - * Constructor with default {@code nullable = true}. - * - * @param name the name of this field - * @param dataType the data type of this field - */ - public StructField(String name, DataType dataType) { - this(name, dataType, true); - } - - /** - * @param name the name of this field - * @param dataType the data type of this field - * @param nullable indicates if values of this field can be {@code null} values - */ - public StructField(String name, DataType dataType, boolean nullable) { - this(name, dataType, nullable, FieldMetadata.builder().build()); - } - - /** - * @param name the name of this field - * @param dataType the data type of this field - * @param nullable indicates if values of this field can be {@code null} values - * @param metadata metadata for this field - */ - public StructField(String name, DataType dataType, boolean nullable, FieldMetadata metadata) { - this.name = name; - this.dataType = dataType; - this.nullable = nullable; - this.metadata = metadata; - } - - /** - * @return the name of this field - */ - public String getName() { - return name; - } - - /** - * @return the data type of this field - */ - public DataType getDataType() { - return dataType; - } - - /** - * @return whether this field allows to have a {@code null} value. - */ - public boolean isNullable() { - return nullable; - } - - /** - * @return the metadata for this field - */ - public FieldMetadata getMetadata() { - return metadata; - } - - /** - * Builds a readable {@code String} representation of this {@code StructField}. - */ - protected void buildFormattedString(String prefix, StringBuilder builder) { - final String nextPrefix = prefix + " |"; - builder.append(String.format("%s-- %s: %s (nullable = %b) (metadata =%s)\n", - prefix, name, dataType.getTypeName(), nullable, metadata.toString())); - DataType.buildFormattedString(dataType, nextPrefix, builder); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - StructField that = (StructField) o; - return name.equals(that.name) && dataType.equals(that.dataType) && nullable == that.nullable - && metadata.equals(that.metadata); - } - - @Override - public int hashCode() { - return Objects.hash(name, dataType, nullable, metadata); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/StructType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/StructType.java deleted file mode 100644 index f6e2ecc0fb3..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/StructType.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -import java.util.Arrays; -import java.util.HashMap; - -import io.delta.standalone.expressions.Column; -import io.delta.standalone.internal.util.SchemaUtils; - -/** - * The data type representing a table's schema, consisting of a collection of - * fields (that is, {@code fieldName} to {@code dataType} pairs). - * - * @see StructField StructField - */ -public final class StructType extends DataType { - private final StructField[] fields; - private final HashMap nameToField; - - public StructType() { - this(new StructField[0]); - } - - public StructType(StructField[] fields) { - this.fields = fields; - this.nameToField = new HashMap<>(); - Arrays.stream(fields).forEach(field -> nameToField.put(field.getName(), field)); - } - - /** - * Creates a new {@link StructType} by adding a new field. - * - *
{@code
-     * StructType schema = new StructType()
-     *     .add(new StructField("a", new IntegerType(), true))
-     *     .add(new StructField("b", new LongType(), false))
-     *     .add(new StructField("c", new StringType(), true))
-     * }
- * @param field The new field to add. - * @return a {@link StructType} with the added field - */ - public StructType add(StructField field) { - StructField[] newFields = Arrays.copyOf(fields, fields.length + 1); - newFields[newFields.length - 1] = field; - return new StructType(newFields); - } - - /** - * Creates a new {@link StructType} by adding a new nullable field with no metadata. - * - *
{@code
-     * StructType schema = new StructType()
-     *     .add("a", new IntegerType())
-     *     .add("b", new LongType())
-     *     .add("c", new StringType())
-     * }
- * @param fieldName The name of the new field. - * @param dataType The datatype for the new field. - * @return a {@link StructType} with the added field - */ - public StructType add(String fieldName, DataType dataType) { - StructField newField = new StructField(fieldName, dataType, true); - return add(newField); - } - - /** - * Creates a new {@link StructType} by adding a new field with no metadata. - * - *
{@code
-     * StructType schema = new StructType()
-     *     .add("a", new IntegerType(), true)
-     *     .add("b", new LongType(), false)
-     *     .add("c", new StringType(), true)
-     * }
- * @param fieldName The name of the new field. - * @param dataType The datatype for the new field. - * @param nullable Whether or not the new field is nullable. - * @return a {@link StructType} with the added field - */ - public StructType add(String fieldName, DataType dataType, boolean nullable) { - StructField newField = new StructField(fieldName, dataType, nullable); - return add(newField); - } - - /** - * @return array of fields - */ - public StructField[] getFields() { - return fields.clone(); - } - - /** - * @return array of field names - */ - public String[] getFieldNames() { - return Arrays.stream(fields).map(StructField::getName).toArray(String[]::new); - } - - /** - * @return the number of fields - */ - public int length() { - return fields.length; - } - - /** - * @param fieldName the name of the desired {@link StructField}, not null - * @return the {@code link} with the given name, not null - * @throws IllegalArgumentException if a field with the given name does not exist - */ - public StructField get(String fieldName) { - if (!nameToField.containsKey(fieldName)) { - throw new IllegalArgumentException( - String.format( - "Field \"%s\" does not exist. Available fields: %s", - fieldName, - Arrays.toString(getFieldNames())) - ); - } - - return nameToField.get(fieldName); - } - - /** - * Creates a {@link Column} expression for the field with the given {@code fieldName}. - * @param fieldName the name of the {@link StructField} to create a column for - * @return a {@link Column} expression for the {@link StructField} with name {@code fieldName} - */ - public Column column(String fieldName) { - StructField field = nameToField.get(fieldName); - return new Column(fieldName, field.getDataType()); - } - - /** - * @return a readable indented tree representation of this {@code StructType} - * and all of its nested elements - */ - public String getTreeString() { - final String prefix = " |"; - StringBuilder builder = new StringBuilder(); - builder.append("root\n"); - Arrays.stream(fields).forEach(field -> field.buildFormattedString(prefix, builder)); - return builder.toString(); - } - - /** - * Builds a readable {@code String} representation of this {@code StructType} - * and all of its nested elements. - */ - protected void buildFormattedString(String prefix, StringBuilder builder) { - Arrays.stream(fields).forEach(field -> field.buildFormattedString(prefix, builder)); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - StructType that = (StructType) o; - return Arrays.equals(fields, that.fields); - } - - @Override - public int hashCode() { - return Arrays.hashCode(fields); - } - - /** - * Whether a new schema can replace this existing schema in a Delta table without rewriting data - * files in the table. - *

- * Returns false if the new schema: - *

    - *
  • Drops any column that is present in the current schema
  • - *
  • Converts nullable=true to nullable=false for any column
  • - *
  • Changes any datatype
  • - *
  • Adds a new column with nullable=false
  • - *
- * - * @param newSchema the new schema to update the table with - * @return whether the new schema is compatible with this existing schema - */ - public boolean isWriteCompatible(StructType newSchema) { - return SchemaUtils.isWriteCompatible( - this, - newSchema); - } -} diff --git a/connectors/standalone/src/main/java/io/delta/standalone/types/TimestampType.java b/connectors/standalone/src/main/java/io/delta/standalone/types/TimestampType.java deleted file mode 100644 index febaa79a793..00000000000 --- a/connectors/standalone/src/main/java/io/delta/standalone/types/TimestampType.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.types; - -/** - * The data type representing {@code java.sql.Timestamp} values. - */ -public final class TimestampType extends DataType { } diff --git a/connectors/standalone/src/main/scala-2.11/io/delta/standalone/internal/util/CaseInsensitiveMap.scala b/connectors/standalone/src/main/scala-2.11/io/delta/standalone/internal/util/CaseInsensitiveMap.scala deleted file mode 100644 index e92804aa0ed..00000000000 --- a/connectors/standalone/src/main/scala-2.11/io/delta/standalone/internal/util/CaseInsensitiveMap.scala +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import java.util.Locale - -/** - * Builds a map in which keys are case insensitive. Input map can be accessed for cases where - * case-sensitive information is required. The primary constructor is marked private to avoid - * nested case-insensitive map creation, otherwise the keys in the original map will become - * case-insensitive in this scenario. - * Note: CaseInsensitiveMap is serializable. However, after transformation, e.g. `filterKeys()`, - * it may become not serializable. - */ -private[internal] class CaseInsensitiveMap[T] private (val originalMap: Map[String, T]) - extends Map[String, T] with Serializable { - - // Note: this class supports Scala 2.12. A parallel source tree has a 2.13 implementation. - - val keyLowerCasedMap = originalMap.map(kv => kv.copy(_1 = kv._1.toLowerCase(Locale.ROOT))) - - override def get(k: String): Option[T] = keyLowerCasedMap.get(k.toLowerCase(Locale.ROOT)) - - override def contains(k: String): Boolean = - keyLowerCasedMap.contains(k.toLowerCase(Locale.ROOT)) - - override def +[B1 >: T](kv: (String, B1)): CaseInsensitiveMap[B1] = { - new CaseInsensitiveMap(originalMap.filter(!_._1.equalsIgnoreCase(kv._1)) + kv) - } - - def ++(xs: TraversableOnce[(String, T)]): CaseInsensitiveMap[T] = { - xs.foldLeft(this)(_ + _) - } - - override def iterator: Iterator[(String, T)] = keyLowerCasedMap.iterator - - override def -(key: String): Map[String, T] = { - new CaseInsensitiveMap(originalMap.filter(!_._1.equalsIgnoreCase(key))) - } - - def toMap: Map[String, T] = originalMap -} - -object CaseInsensitiveMap { - def apply[T](params: Map[String, T]): CaseInsensitiveMap[T] = params match { - case caseSensitiveMap: CaseInsensitiveMap[T] => caseSensitiveMap - case _ => new CaseInsensitiveMap(params) - } -} diff --git a/connectors/standalone/src/main/scala-2.12/io/delta/standalone/internal/util/CaseInsensitiveMap.scala b/connectors/standalone/src/main/scala-2.12/io/delta/standalone/internal/util/CaseInsensitiveMap.scala deleted file mode 100644 index e92804aa0ed..00000000000 --- a/connectors/standalone/src/main/scala-2.12/io/delta/standalone/internal/util/CaseInsensitiveMap.scala +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import java.util.Locale - -/** - * Builds a map in which keys are case insensitive. Input map can be accessed for cases where - * case-sensitive information is required. The primary constructor is marked private to avoid - * nested case-insensitive map creation, otherwise the keys in the original map will become - * case-insensitive in this scenario. - * Note: CaseInsensitiveMap is serializable. However, after transformation, e.g. `filterKeys()`, - * it may become not serializable. - */ -private[internal] class CaseInsensitiveMap[T] private (val originalMap: Map[String, T]) - extends Map[String, T] with Serializable { - - // Note: this class supports Scala 2.12. A parallel source tree has a 2.13 implementation. - - val keyLowerCasedMap = originalMap.map(kv => kv.copy(_1 = kv._1.toLowerCase(Locale.ROOT))) - - override def get(k: String): Option[T] = keyLowerCasedMap.get(k.toLowerCase(Locale.ROOT)) - - override def contains(k: String): Boolean = - keyLowerCasedMap.contains(k.toLowerCase(Locale.ROOT)) - - override def +[B1 >: T](kv: (String, B1)): CaseInsensitiveMap[B1] = { - new CaseInsensitiveMap(originalMap.filter(!_._1.equalsIgnoreCase(kv._1)) + kv) - } - - def ++(xs: TraversableOnce[(String, T)]): CaseInsensitiveMap[T] = { - xs.foldLeft(this)(_ + _) - } - - override def iterator: Iterator[(String, T)] = keyLowerCasedMap.iterator - - override def -(key: String): Map[String, T] = { - new CaseInsensitiveMap(originalMap.filter(!_._1.equalsIgnoreCase(key))) - } - - def toMap: Map[String, T] = originalMap -} - -object CaseInsensitiveMap { - def apply[T](params: Map[String, T]): CaseInsensitiveMap[T] = params match { - case caseSensitiveMap: CaseInsensitiveMap[T] => caseSensitiveMap - case _ => new CaseInsensitiveMap(params) - } -} diff --git a/connectors/standalone/src/main/scala-2.13/io/delta/standalone/internal/util/CaseInsensitiveMap.scala b/connectors/standalone/src/main/scala-2.13/io/delta/standalone/internal/util/CaseInsensitiveMap.scala deleted file mode 100644 index f11670fa440..00000000000 --- a/connectors/standalone/src/main/scala-2.13/io/delta/standalone/internal/util/CaseInsensitiveMap.scala +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import java.util.Locale - -/** - * Builds a map in which keys are case insensitive. Input map can be accessed for cases where - * case-sensitive information is required. The primary constructor is marked private to avoid - * nested case-insensitive map creation, otherwise the keys in the original map will become - * case-insensitive in this scenario. - * Note: CaseInsensitiveMap is serializable. However, after transformation, e.g. `filterKeys()`, - * it may become not serializable. - */ -private[internal] class CaseInsensitiveMap[T] private (val originalMap: Map[String, T]) - extends Map[String, T] with Serializable { - - override def removed(key: String): Map[String, T] = - new CaseInsensitiveMap(originalMap.removed(key.toLowerCase(Locale.ROOT))) - - override def updated[V1 >: T](key: String, value: V1): Map[String, V1] = - new CaseInsensitiveMap(originalMap.updated(key.toLowerCase(Locale.ROOT), value)) - - // Note: this class supports Scala 2.12. A parallel source tree has a 2.13 implementation. - - val keyLowerCasedMap = originalMap.map(kv => kv.copy(_1 = kv._1.toLowerCase(Locale.ROOT))) - - override def get(k: String): Option[T] = keyLowerCasedMap.get(k.toLowerCase(Locale.ROOT)) - - override def contains(k: String): Boolean = - keyLowerCasedMap.contains(k.toLowerCase(Locale.ROOT)) - - override def +[B1 >: T](kv: (String, B1)): CaseInsensitiveMap[B1] = { - new CaseInsensitiveMap(originalMap.filter(!_._1.equalsIgnoreCase(kv._1)) + kv) - } - - def ++(xs: TraversableOnce[(String, T)]): CaseInsensitiveMap[T] = { - xs.foldLeft(this)(_ + _) - } - - override def iterator: Iterator[(String, T)] = keyLowerCasedMap.iterator - - - def toMap: Map[String, T] = originalMap -} - -object CaseInsensitiveMap { - def apply[T](params: Map[String, T]): CaseInsensitiveMap[T] = params match { - case caseSensitiveMap: CaseInsensitiveMap[T] => caseSensitiveMap - case _ => new CaseInsensitiveMap(params) - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/BufferingLogDeletionIterator.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/BufferingLogDeletionIterator.scala deleted file mode 100644 index 01c457b9ebf..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/BufferingLogDeletionIterator.scala +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import scala.collection.mutable - -import org.apache.hadoop.fs.{FileStatus, Path} - -/** - * An iterator that helps select old log files for deletion. It takes the input iterator of log - * files from the earliest file, and returns should-be-deleted files until the given maxTimestamp - * or maxVersion to delete is reached. Note that this iterator may stop deleting files earlier - * than maxTimestamp or maxVersion if it finds that files that need to be preserved for adjusting - * the timestamps of subsequent files. Let's go through an example. Assume the following commit - * history: - * - * +---------+-----------+--------------------+ - * | Version | Timestamp | Adjusted Timestamp | - * +---------+-----------+--------------------+ - * | 0 | 0 | 0 | - * | 1 | 5 | 5 | - * | 2 | 10 | 10 | - * | 3 | 7 | 11 | - * | 4 | 8 | 12 | - * | 5 | 14 | 14 | - * +---------+-----------+--------------------+ - * - * As you can see from the example, we require timestamps to be monotonically increasing with - * respect to the version of the commit, and each commit to have a unique timestamp. If we have - * a commit which doesn't obey one of these two requirements, we adjust the timestamp of that - * commit to be one millisecond greater than the previous commit. - * - * Given the above commit history, the behavior of this iterator will be as follows: - * - For maxVersion = 1 and maxTimestamp = 9, we can delete versions 0 and 1 - * - Until we receive maxVersion >= 4 and maxTimestamp >= 12, we can't delete versions 2 and 3. - * This is because version 2 is used to adjust the timestamps of commits up to version 4. - * - For maxVersion >= 5 and maxTimestamp >= 14 we can delete everything - * The semantics of time travel guarantee that for a given timestamp, the user will ALWAYS get the - * same version. Consider a user asks to get the version at timestamp 11. If all files are there, - * we would return version 3 (timestamp 11) for this query. If we delete versions 0-2, the - * original timestamp of version 3 (7) will not have an anchor to adjust on, and if the time - * travel query is re-executed we would return version 4. This is the motivation behind this - * iterator implementation. - * - * The implementation maintains an internal "maybeDelete" buffer of files that we are unsure of - * deleting because they may be necessary to adjust time of future files. For each file we get - * from the underlying iterator, we check whether it needs time adjustment or not. If it does need - * time adjustment, then we cannot immediately decide whether it is safe to delete that file or - * not and therefore we put it in each the buffer. Then we iteratively peek ahead at the future - * files and accordingly decide whether to delete all the buffered files or retain them. - * - * @param underlying The iterator which gives the list of files in ascending version order - * @param maxTimestamp The timestamp until which we can delete (inclusive). - * @param maxVersion The version until which we can delete (inclusive). - * @param versionGetter A method to get the commit version from the file path. - */ -class BufferingLogDeletionIterator( - underlying: Iterator[FileStatus], - maxTimestamp: Long, - maxVersion: Long, - versionGetter: Path => Long) extends Iterator[FileStatus] {/** - * Our output iterator - */ - private val filesToDelete = new mutable.Queue[FileStatus]() - /** - * Our intermediate buffer which will buffer files as long as the last file requires a timestamp - * adjustment. - */ - private val maybeDeleteFiles = new mutable.ArrayBuffer[FileStatus]() - private var lastFile: FileStatus = _ - private var hasNextCalled: Boolean = false - - private def init(): Unit = { - if (underlying.hasNext) { - lastFile = underlying.next() - maybeDeleteFiles.append(lastFile) - } - } - - init() - - /** Whether the given file can be deleted based on the version and retention timestamp input. */ - private def shouldDeleteFile(file: FileStatus): Boolean = { - file.getModificationTime <= maxTimestamp && versionGetter(file.getPath) <= maxVersion - } - - /** - * Files need a time adjustment if their timestamp isn't later than the lastFile. - */ - private def needsTimeAdjustment(file: FileStatus): Boolean = { - versionGetter(lastFile.getPath) < versionGetter(file.getPath) && - lastFile.getModificationTime >= file.getModificationTime - } - - /** - * Enqueue the files in the buffer if the last file is safe to delete. Clears the buffer. - */ - private def flushBuffer(): Unit = { - if (maybeDeleteFiles.lastOption.exists(shouldDeleteFile)) { - filesToDelete ++= maybeDeleteFiles - } - maybeDeleteFiles.clear() - } - - /** - * Peeks at the next file in the iterator. Based on the next file we can have three - * possible outcomes: - * - The underlying iterator returned a file, which doesn't require timestamp adjustment. If - * the file in the buffer has expired, flush the buffer to our output queue. - * - The underlying iterator returned a file, which requires timestamp adjustment. In this case, - * we add this file to the buffer and fetch the next file - * - The underlying iterator is empty. In this case, we check the last file in the buffer. If - * it has expired, then flush the buffer to the output queue. - * Once this method returns, the buffer is expected to have 1 file (last file of the - * underlying iterator) unless the underlying iterator is fully consumed. - */ - private def queueFilesInBuffer(): Unit = { - var continueBuffering = true - while (continueBuffering) { - if (!underlying.hasNext) { - flushBuffer() - return - } - - var currentFile = underlying.next() - require(currentFile != null, "FileStatus iterator returned null") - if (needsTimeAdjustment(currentFile)) { - currentFile = new FileStatus( - currentFile.getLen, currentFile.isDirectory, currentFile.getReplication, - currentFile.getBlockSize, lastFile.getModificationTime + 1, currentFile.getPath) - maybeDeleteFiles.append(currentFile) - } else { - flushBuffer() - maybeDeleteFiles.append(currentFile) - continueBuffering = false - } - lastFile = currentFile - } - } - - override def hasNext: Boolean = { - hasNextCalled = true - if (filesToDelete.isEmpty) queueFilesInBuffer() - filesToDelete.nonEmpty - } - - override def next(): FileStatus = { - if (!hasNextCalled) throw new NoSuchElementException() - hasNextCalled = false - filesToDelete.dequeue() - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/Checkpoints.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/Checkpoints.scala deleted file mode 100644 index 62714dd9553..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/Checkpoints.scala +++ /dev/null @@ -1,343 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.io.FileNotFoundException -import java.util.UUID - -import scala.collection.JavaConverters._ -import scala.util.control.NonFatal - -import com.github.mjakubowski84.parquet4s.ParquetWriter -import io.delta.storage.CloseableIterator -import org.apache.hadoop.fs.Path -import org.apache.parquet.hadoop.metadata.CompressionCodecName - -import io.delta.standalone.internal.actions.SingleAction -import io.delta.standalone.internal.exception.DeltaErrors -import io.delta.standalone.internal.logging.Logging -import io.delta.standalone.internal.sources.StandaloneHadoopConf.CHECKPOINTING_ENABLED -import io.delta.standalone.internal.util.FileNames._ -import io.delta.standalone.internal.util.JsonUtils - -/** - * Records information about a checkpoint. - * - * @param version the version of this checkpoint - * @param size the number of actions in the checkpoint - * @param parts the number of parts when the checkpoint has multiple parts. None if this is a - * singular checkpoint - */ -private[internal] case class CheckpointMetaData( - version: Long, - size: Long, - parts: Option[Int]) - -/** - * A class to help with comparing checkpoints with each other, where we may have had concurrent - * writers that checkpoint with different number of parts. - */ -private[internal] case class CheckpointInstance( - version: Long, - numParts: Option[Int]) extends Ordered[CheckpointInstance] { - - /** - * Due to lexicographic sorting, a version with more parts will appear after a version with - * less parts during file listing. We use that logic here as well. - */ - def isEarlierThan(other: CheckpointInstance): Boolean = { - if (other == CheckpointInstance.MaxValue) return true - version < other.version || - (version == other.version && numParts.forall(_ < other.numParts.getOrElse(1))) - } - - def isNotLaterThan(other: CheckpointInstance): Boolean = { - if (other == CheckpointInstance.MaxValue) return true - version <= other.version - } - - def getCorrespondingFiles(path: Path): Seq[Path] = { - assert(this != CheckpointInstance.MaxValue, "Can't get files for CheckpointVersion.MaxValue.") - numParts match { - case None => checkpointFileSingular(path, version) :: Nil - case Some(parts) => checkpointFileWithParts(path, version, parts) - } - } - - override def compare(that: CheckpointInstance): Int = { - if (version == that.version) { - numParts.getOrElse(1) - that.numParts.getOrElse(1) - } else { - // we need to guard against overflow. We just can't return (this - that).toInt - if (version - that.version < 0) -1 else 1 - } - } -} - -private[internal] object CheckpointInstance { - def apply(path: Path): CheckpointInstance = { - CheckpointInstance(checkpointVersion(path), numCheckpointParts(path)) - } - - def apply(metadata: CheckpointMetaData): CheckpointInstance = { - CheckpointInstance(metadata.version, metadata.parts) - } - - val MaxValue: CheckpointInstance = CheckpointInstance(-1, None) -} - -private[internal] trait Checkpoints { - self: DeltaLogImpl => - - /** The path to the file that holds metadata about the most recent checkpoint. */ - val LAST_CHECKPOINT = new Path(logPath, "_last_checkpoint") - - /** Returns information about the most recent checkpoint. */ - def lastCheckpoint: Option[CheckpointMetaData] = { - loadMetadataFromFile(0) - } - - /** - * Creates a checkpoint using the default snapshot. - */ - def checkpoint(): Unit = checkpoint(snapshot) - - /** - * Creates a checkpoint using snapshotToCheckpoint. By default it uses the current log version. - */ - def checkpoint(snapshotToCheckpoint: SnapshotImpl): Unit = { - if (!hadoopConf.getBoolean(CHECKPOINTING_ENABLED, true)) { - logInfo(s"Skipping writing Delta checkpoint for version ${snapshotToCheckpoint.version}") - return - } - if (snapshotToCheckpoint.version < 0) { - throw DeltaErrors.checkpointNonExistTable(dataPath) - } - val checkpointMetaData = Checkpoints.writeCheckpoint(this, snapshotToCheckpoint) - val json = JsonUtils.toJson(checkpointMetaData) - store.write(LAST_CHECKPOINT, Iterator(json).asJava, true, hadoopConf) // overwrite = true - - doLogCleanup() - } - - /** Loads the checkpoint metadata from the _last_checkpoint file. */ - private def loadMetadataFromFile(tries: Int): Option[CheckpointMetaData] = { - var checkpointMetadataJson: CloseableIterator[String] = null - try { - checkpointMetadataJson = store.read(LAST_CHECKPOINT, hadoopConf) - val checkpointMetadata = - JsonUtils.mapper.readValue[CheckpointMetaData](checkpointMetadataJson.next()) - Some(checkpointMetadata) - } catch { - case _: FileNotFoundException => - None - case NonFatal(e) if tries < 3 => - logWarning(s"Failed to parse $LAST_CHECKPOINT. This may happen if there was an error " + - "during read operation, or a file appears to be partial. Sleeping and trying again.", e) - Thread.sleep(1000) - loadMetadataFromFile(tries + 1) - case NonFatal(e) => - logWarning(s"$LAST_CHECKPOINT is corrupted. Will search the checkpoint files directly", e) - // Hit a partial file. This could happen on Azure as overwriting _last_checkpoint file is - // not atomic. We will try to list all files to find the latest checkpoint and restore - // CheckpointMetaData from it. - val verifiedCheckpoint = findLastCompleteCheckpoint(CheckpointInstance(-1L, None)) - verifiedCheckpoint.map(manuallyLoadCheckpoint) - } finally { - if (null != checkpointMetadataJson) { - checkpointMetadataJson.close() - } - } - } - - /** Loads the given checkpoint manually to come up with the CheckpointMetaData */ - private def manuallyLoadCheckpoint(cv: CheckpointInstance): CheckpointMetaData = { - CheckpointMetaData(cv.version, -1L, cv.numParts) - } - - /** - * Finds the first verified, complete checkpoint before the given version. - * - * @param cv The CheckpointVersion to compare against - */ - protected def findLastCompleteCheckpoint(cv: CheckpointInstance): Option[CheckpointInstance] = { - var cur = math.max(cv.version, 0L) - while (cur >= 0) { - val checkpoints = store - .listFrom(checkpointPrefix(logPath, math.max(0, cur - 1000)), hadoopConf) - .asScala - .map(_.getPath) - .filter(isCheckpointFile) - .map(CheckpointInstance(_)) - .takeWhile(tv => (cur == 0 || tv.version <= cur) && tv.isEarlierThan(cv)) - .toArray - val lastCheckpoint = getLatestCompleteCheckpointFromList(checkpoints, cv) - if (lastCheckpoint.isDefined) { - return lastCheckpoint - } else { - cur -= 1000 - } - } - None - } - - /** - * Given a list of checkpoint files, pick the latest complete checkpoint instance which is not - * later than `notLaterThan`. - */ - protected def getLatestCompleteCheckpointFromList( - instances: Array[CheckpointInstance], - notLaterThan: CheckpointInstance): Option[CheckpointInstance] = { - val complete = instances.filter(_.isNotLaterThan(notLaterThan)).groupBy(identity).filter { - case (CheckpointInstance(_, None), inst) => inst.length == 1 - case (CheckpointInstance(_, Some(parts)), inst) => inst.length == parts - } - complete.keys.toArray.sorted.lastOption - } -} - -private[internal] object Checkpoints extends Logging { - /** - * Writes out the contents of a [[Snapshot]] into a checkpoint file that - * can be used to short-circuit future replays of the log. - * - * Returns the checkpoint metadata to be committed to a file. We will use the value - * in this file as the source of truth of the last valid checkpoint. - */ - def writeCheckpoint(deltaLog: DeltaLogImpl, snapshot: SnapshotImpl): CheckpointMetaData = { - - // The writing of checkpoints doesn't go through log store, so we need to check with the - // log store and decide whether to use rename. - val useRename = deltaLog.store.isPartialWriteVisible(deltaLog.logPath, deltaLog.hadoopConf) - - var checkpointSize = 0L - var numOfFiles = 0L - - // Use the string in the closure as Path is not Serializable. - val path = checkpointFileSingular(snapshot.path, snapshot.version).toString - - // Exclude commitInfo, CDC - val actions: Seq[SingleAction] = ( - Seq(snapshot.metadataScala, snapshot.protocolScala) ++ - snapshot.setTransactionsScala ++ - snapshot.allFilesScala ++ - snapshot.tombstonesScala - ).map(_.wrap) - - logInfo(s"Starting to write checkpoint at path=$path using rename=$useRename and " + - s"snapshot=$snapshot") - - val writtenPath = - if (useRename) { - val p = new Path(path) - // Two instances of the same task may run at the same time in some cases (e.g., - // speculation, stage retry), so generate the temp path here to avoid two tasks - // using the same path. - val tempPath = new Path(p.getParent, s".${p.getName}.${UUID.randomUUID}.tmp") - logInfo(s"Writing the checkpoint first to temp file: $tempPath") - tempPath.toString - } else { - path - } - - val writerOptions = ParquetWriter.Options( - compressionCodecName = CompressionCodecName.SNAPPY, - timeZone = deltaLog.timezone, - hadoopConf = deltaLog.hadoopConf - ) - val writer = ParquetWriter.writer[SingleAction](writtenPath, writerOptions) - - try { - actions.foreach { singleAction => - writer.write(singleAction) - checkpointSize += 1 - if (singleAction.add != null) { - numOfFiles += 1 - } - } - - // Before calling close (or rename if applicable) make sure we have written - // all `addFiles` actions from the snapshot. By writing the `addFiles` actions, - // we ensure the table state is captured in the checkpoint. - if (numOfFiles != snapshot.numOfFiles) { - val msg = s"Number of `add` files written to checkpoint file ($numOfFiles) doesn't match " + - s"the number of `add` files contained in the snapshot (${snapshot.numOfFiles}). " + - s"Skipping creating the checkpoint.\nCheckpoint file: `$path`." + - (if (writtenPath != path) s"\nTemporary file: `$writtenPath`" else "") - - // The error message will be logged in the catch block below. - throw new IllegalStateException(msg) - } - - // Close the writer only after writing all the actions. Calling close before writing - // all the records could result in leaving a Parquet file with partial content as the - // `close` flushes the already buffered data to storage. - // This would leak resources but we don't have a way to abort the storage request here. - writer.close() - } catch { - case e: org.apache.hadoop.fs.FileAlreadyExistsException if !useRename => - val p = new Path(writtenPath) - if (p.getFileSystem(deltaLog.hadoopConf).exists(p)) { - // The file has been written by a zombie task. We can just use this checkpoint file - // rather than failing a Delta commit. - } else { - throw e - } - case other: Throwable => - // Make sure the log the exception before throwing it, so that we know why the checkpoint - // write failed. - logError(s"Error writing checkpoint at $writtenPath", other) - throw other - } - - if (useRename) { - val src = new Path(writtenPath) - val dest = new Path(path) - val fs = dest.getFileSystem(deltaLog.hadoopConf) - var renameDone = false - try { - if (fs.rename(src, dest)) { - renameDone = true - } else { - val msg = s"Cannot rename $src to $dest" - // There should be only one writer writing the checkpoint file, so there must be - // something wrong here. - logError(msg) - throw new IllegalStateException(msg) - } - } finally { - if (!renameDone) { - try { - fs.delete(src, false) - } catch { - case NonFatal(e) => - logWarning(s"Error while deleting the temporary checkpoint part file $src", e) - } - } - } - } - - // Attempting to write empty checkpoint - if (checkpointSize == 0) { - logWarning(DeltaErrors.EmptyCheckpointErrorMessage) - } - - val checkpointMetaData = CheckpointMetaData(snapshot.version, checkpointSize, None) - logInfo(s"Checkpoint written to $path with $checkpointMetaData") - checkpointMetaData - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/ConflictChecker.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/ConflictChecker.scala deleted file mode 100644 index e0f23d2365e..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/ConflictChecker.scala +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.util.concurrent.TimeUnit - -import scala.collection.mutable - -import io.delta.standalone.expressions.Expression - -import io.delta.standalone.internal.actions._ -import io.delta.standalone.internal.exception.DeltaErrors -import io.delta.standalone.internal.logging.Logging -import io.delta.standalone.internal.util.{FileNames, PartitionUtils} - -/** - * A class representing different attributes of current transaction needed for conflict detection. - * - * @param readPredicates - partition predicates by which files have been queried by the transaction - * @param readFiles - specific files that have been seen by the transaction - * @param readWholeTable - whether the whole table was read during the transaction - * @param readAppIds - appIds that have been seen by the transaction - * @param metadata - table metadata for the transaction - * @param actions - delta log actions that the transaction wants to commit - * @param deltaLog - [[DeltaLogImpl]] corresponding to the target table - */ -private[internal] case class CurrentTransactionInfo( - readPredicates: Seq[Expression], - readFiles: Set[AddFile], - readWholeTable: Boolean, - readAppIds: Set[String], - metadata: Metadata, - actions: Seq[Action], - deltaLog: DeltaLogImpl) - -/** - * Summary of the Winning commit against which we want to check the conflict - * @param actions - delta log actions committed by the winning commit - * @param commitVersion - winning commit version - */ -private[internal] case class WinningCommitSummary(actions: Seq[Action], commitVersion: Long) { - val metadataUpdates: Seq[Metadata] = actions.collect { case a: Metadata => a } - val appLevelTransactions: Seq[SetTransaction] = actions.collect { case a: SetTransaction => a } - val protocol: Seq[Protocol] = actions.collect { case a: Protocol => a } - val commitInfo: Option[CommitInfo] = actions.collectFirst { case a: CommitInfo => a }.map( - ci => ci.copy(version = Some(commitVersion))) - val removedFiles: Seq[RemoveFile] = actions.collect { case a: RemoveFile => a } - val addedFiles: Seq[AddFile] = actions.collect { case a: AddFile => a } - val isBlindAppendOption: Option[Boolean] = commitInfo.flatMap(_.isBlindAppend) - val blindAppendAddedFiles: Seq[AddFile] = if (isBlindAppendOption.getOrElse(false)) { - addedFiles - } else { - Seq() - } - val changedDataAddedFiles: Seq[AddFile] = if (isBlindAppendOption.getOrElse(false)) { - Seq() - } else { - addedFiles - } - val onlyAddFiles: Boolean = actions.collect { case f: FileAction => f } - .forall(_.isInstanceOf[AddFile]) -} - -private[internal] class ConflictChecker( - currentTransactionInfo: CurrentTransactionInfo, - winningCommitVersion: Long, - isolationLevel: IsolationLevel, - logPrefixStr: String) extends Logging { - - private val timingStats = mutable.HashMap[String, Long]() - private val deltaLog = currentTransactionInfo.deltaLog - private val winningCommitSummary: WinningCommitSummary = createWinningCommitSummary() - - def checkConflicts(): Unit = { - checkProtocolCompatibility() - checkNoMetadataUpdates() - checkForAddedFilesThatShouldHaveBeenReadByCurrentTxn() - checkForDeletedFilesAgainstCurrentTxnReadFiles() - checkForDeletedFilesAgainstCurrentTxnDeletedFiles() - checkForUpdatedApplicationTransactionIdsThatCurrentTxnDependsOn() - reportMetrics() - } - - /** - * Initializes [[WinningCommitSummary]] for the already committed - * transaction (winning transaction). - */ - private def createWinningCommitSummary(): WinningCommitSummary = { - recordTime("initialize-old-commit") { - import io.delta.standalone.internal.util.Implicits._ - - val deltaLog = currentTransactionInfo.deltaLog - val winningCommitActions = deltaLog.store - .read(FileNames.deltaFile(deltaLog.logPath, winningCommitVersion), deltaLog.hadoopConf) - .toArray - .map(Action.fromJson) - - WinningCommitSummary(winningCommitActions, winningCommitVersion) - } - } - - /** - * Asserts that the client is up to date with the protocol and is allowed to read and write - * against the protocol set by the committed transaction. - */ - private def checkProtocolCompatibility(): Unit = { - if (winningCommitSummary.protocol.nonEmpty) { - winningCommitSummary.protocol.foreach { p => - deltaLog.assertProtocolRead(p) - deltaLog.assertProtocolWrite(p) - } - currentTransactionInfo.actions.foreach { - case Protocol(_, _) => - throw DeltaErrors.protocolChangedException(winningCommitSummary.commitInfo) - case _ => - } - } - } - - /** - * Check if the committed transaction has changed metadata. - */ - private def checkNoMetadataUpdates(): Unit = { - // Fail if the metadata is different than what the txn read. - if (winningCommitSummary.metadataUpdates.nonEmpty) { - throw DeltaErrors.metadataChangedException(winningCommitSummary.commitInfo) - } - } - - /** - * Check if the new files added by the already committed transactions should have been read by - * the current transaction. - */ - private def checkForAddedFilesThatShouldHaveBeenReadByCurrentTxn(): Unit = { - recordTime("checked-appends") { - // Fail if new files have been added that the txn should have read. - val addedFilesToCheckForConflicts = isolationLevel match { - case Serializable => - winningCommitSummary.changedDataAddedFiles ++ winningCommitSummary.blindAppendAddedFiles - case SnapshotIsolation => - Seq.empty - } - - val predicatesMatchingAddedFiles = currentTransactionInfo.readPredicates.flatMap { p => - val conflictingFile = PartitionUtils.filterFileList( - currentTransactionInfo.metadata.partitionSchema, - addedFilesToCheckForConflicts, - p - ).headOption - - conflictingFile.map(f => getPrettyPartitionMessage(f.partitionValues)) - }.headOption - - if (predicatesMatchingAddedFiles.isDefined) { - throw DeltaErrors.concurrentAppendException( - winningCommitSummary.commitInfo, predicatesMatchingAddedFiles.get) - } - } - } - - /** - * Check if [[RemoveFile]] actions added by already committed transactions conflicts with files - * read by the current transaction. - */ - private def checkForDeletedFilesAgainstCurrentTxnReadFiles(): Unit = { - recordTime("checked-deletes") { - // Fail if files have been deleted that the txn read. - val readFilePaths = currentTransactionInfo.readFiles.map( - f => f.path -> f.partitionValues).toMap - val deleteReadOverlap = winningCommitSummary.removedFiles - .find(r => readFilePaths.contains(r.path)) - if (deleteReadOverlap.nonEmpty) { - val filePath = deleteReadOverlap.get.path - val partition = getPrettyPartitionMessage(readFilePaths(filePath)) - throw DeltaErrors.concurrentDeleteReadException( - winningCommitSummary.commitInfo, s"$filePath in $partition") - } - if (winningCommitSummary.removedFiles.nonEmpty && currentTransactionInfo.readWholeTable) { - val filePath = winningCommitSummary.removedFiles.head.path - throw DeltaErrors.concurrentDeleteReadException( - winningCommitSummary.commitInfo, s"$filePath") - } - } - } - - /** - * Check if [[RemoveFile]] actions added by already committed transactions conflicts with - * [[RemoveFile]] actions this transaction is trying to add. - */ - private def checkForDeletedFilesAgainstCurrentTxnDeletedFiles(): Unit = { - recordTime("checked-2x-deletes") { - // Fail if a file is deleted twice. - val txnDeletes = currentTransactionInfo.actions - .collect { case r: RemoveFile => r } - .map(_.path).toSet - val deleteOverlap = winningCommitSummary.removedFiles.map(_.path).toSet intersect txnDeletes - if (deleteOverlap.nonEmpty) { - throw DeltaErrors.concurrentDeleteDeleteException( - winningCommitSummary.commitInfo, deleteOverlap.head) - } - } - } - - /** - * Checks if the winning transaction corresponds to some AppId on which current transaction - * also depends. - */ - private def checkForUpdatedApplicationTransactionIdsThatCurrentTxnDependsOn(): Unit = { - // Fail if the appIds seen by the current transaction has been updated by the winning - // transaction i.e. the winning transaction have [[SetTransaction]] corresponding to - // some appId on which current transaction depends on. Example - This can happen when - // multiple instances of the same streaming query are running at the same time. - val txnOverlap = winningCommitSummary.appLevelTransactions.map(_.appId).toSet intersect - currentTransactionInfo.readAppIds - if (txnOverlap.nonEmpty) { - throw DeltaErrors.concurrentTransactionException(winningCommitSummary.commitInfo) - } - } - - /////////////////////////////////////////////////////////////////////////// - // Helper Methods - /////////////////////////////////////////////////////////////////////////// - - /** A helper function for pretty printing a specific partition directory. */ - private def getPrettyPartitionMessage(partitionValues: Map[String, String]): String = { - val partitionColumns = currentTransactionInfo.metadata.partitionColumns - if (partitionColumns.isEmpty) { - "the root of the table" - } else { - val partition = partitionColumns.map { name => - s"$name=${partitionValues(name)}" - }.mkString("[", ", ", "]") - s"partition $partition" - } - } - - private def recordTime[T](phase: String)(f: => T): T = { - val startTimeNs = System.nanoTime() - val ret = f - val timeTakenMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTimeNs) - timingStats += phase -> timeTakenMs - ret - } - - private def reportMetrics(): Unit = { - lazy val timingStr = timingStats.keys - .toSeq - .sorted - .map(k => s"$k=${timingStats(k)}") - .mkString(",") - - logInfo(s"[$logPrefixStr] Timing stats against $winningCommitVersion [$timingStr]") - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/DeltaConfig.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/DeltaConfig.scala deleted file mode 100644 index 530a0caf695..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/DeltaConfig.scala +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.util.{HashMap, Locale} - -import org.apache.hadoop.conf.Configuration - -import io.delta.standalone.internal.actions.{Metadata, Protocol} -import io.delta.standalone.internal.exception.DeltaErrors -import io.delta.standalone.internal.logging.Logging -import io.delta.standalone.internal.util.{CalendarInterval, IntervalUtils} - -private[internal] case class DeltaConfig[T]( - key: String, - defaultValue: String, - fromString: String => T, - validationFunction: T => Boolean, - helpMessage: String, - minimumProtocolVersion: Option[Protocol] = None, - editable: Boolean = true) { - /** - * Recover the saved value of this configuration from `Metadata`. - * If undefined, return defaultValue. - */ - def fromMetadata(metadata: Metadata): T = { - fromString(metadata.configuration.getOrElse(key, defaultValue)) - } - - /** Validate the setting for this configuration */ - private def validate(value: String): Unit = { - if (!editable) { - throw DeltaErrors.cannotModifyTableProperty(key) - } - val onErrorMessage = s"$key $helpMessage" - try { - require(validationFunction(fromString(value)), onErrorMessage) - } catch { - case e: NumberFormatException => - throw new IllegalArgumentException(onErrorMessage, e) - } - } - - /** - * Validate this configuration and return the key - value pair to save into the metadata. - */ - def apply(value: String): (String, String) = { - validate(value) - key -> value - } -} - -/** - * Contains list of reservoir configs and validation checks. - */ -private[internal] object DeltaConfigs extends Logging { - - /** - * Convert a string to [[CalendarInterval]]. This method is case-insensitive and will throw - * [[IllegalArgumentException]] when the input string is not a valid interval. - * - * @throws IllegalArgumentException if the string is not a valid internal. - */ - def parseCalendarInterval(s: String): CalendarInterval = { - if (s == null || s.trim.isEmpty) { - throw new IllegalArgumentException("Interval cannot be null or blank.") - } - val sInLowerCase = s.trim.toLowerCase(Locale.ROOT) - val interval = - if (sInLowerCase.startsWith("interval ")) sInLowerCase else "interval " + sInLowerCase - val cal = IntervalUtils.safeStringToInterval(interval) - if (cal == null) { - throw new IllegalArgumentException("Invalid interval: " + s) - } - cal - } - - /** - * A global default value set as a HadoopConf will overwrite the default value of a DeltaConfig. - * For example, user can run: - * hadoopConf.set("spark.databricks.delta.properties.defaults.isAppendOnly", "true") - * This setting will be populated to a Delta table during its creation and overwrites - * the default value of delta.isAppendOnly - * - * We accept these HadoopConfs as strings and only perform validation in DeltaConfig. All the - * DeltaConfigs set in HadoopConf should adopt the same prefix. - */ - val hadoopConfPrefix = "spark.databricks.delta.properties.defaults." - - private val entries = new HashMap[String, DeltaConfig[_]] - - protected def buildConfig[T]( - key: String, - defaultValue: String, - fromString: String => T, - validationFunction: T => Boolean, - helpMessage: String, - minimumProtocolVersion: Option[Protocol] = None, - userConfigurable: Boolean = true): DeltaConfig[T] = { - val deltaConfig = DeltaConfig( - s"delta.$key", - defaultValue, - fromString, - validationFunction, - helpMessage, - minimumProtocolVersion, - userConfigurable) - - entries.put(key.toLowerCase(Locale.ROOT), deltaConfig) - deltaConfig - } - - /** - * Validates specified configurations and returns the normalized key -> value map. - */ - def validateConfigurations(configurations: Map[String, String]): Map[String, String] = { - configurations.map { - case kv @ (key, value) if key.toLowerCase(Locale.ROOT).startsWith("delta.constraints.") => - throw new IllegalArgumentException(s"Unsupported CHECK constraint configuration $key set") - case (key, value) if key.toLowerCase(Locale.ROOT).startsWith("delta.") => - Option(entries.get(key.toLowerCase(Locale.ROOT).stripPrefix("delta."))) - .map(_(value)) - .getOrElse { - throw DeltaErrors.unknownConfigurationKeyException(key) - } - case keyvalue @ (key, _) => - if (entries.containsKey(key.toLowerCase(Locale.ROOT))) { - logWarning( - s""" - |You are trying to set a property the key of which is the same as Delta config: $key. - |If you are trying to set a Delta config, prefix it with "delta.", e.g. 'delta.$key'. - |""".stripMargin) - } - keyvalue - } - } - - /** - * Table properties for new tables can be specified through Hadoop configurations. This method - * checks to see if any of the configurations exist among the Hadoop configurations and merges - * them with the user provided configurations. User provided configs take precedence. - */ - def mergeGlobalConfigs( - hadoopConf: Configuration, - tableConf: Map[String, String]): Map[String, String] = { - import collection.JavaConverters._ - - val globalConfs = entries.asScala.flatMap { case (_, config) => - val hadoopConfKey = hadoopConfPrefix + config.key.stripPrefix("delta.") - Option(hadoopConf.get(hadoopConfKey, null)) match { - case Some(default) => Some(config(default)) - case _ => None - } - } - - globalConfs.toMap ++ tableConf - } - - def getMilliSeconds(i: CalendarInterval): Long = { - getMicroSeconds(i) / 1000L - } - - private def getMicroSeconds(i: CalendarInterval): Long = { - assert(i.months == 0) - i.days * util.DateTimeConstants.MICROS_PER_DAY + i.microseconds - } - - /** - * For configs accepting an interval, we require the user specified string must obey: - * - * - Doesn't use months or years, since an internal like this is not deterministic. - * - The microseconds parsed from the string value must be a non-negative value. - * - * The method returns whether a [[CalendarInterval]] satisfies the requirements. - */ - def isValidIntervalConfigValue(i: CalendarInterval): Boolean = { - i.months == 0 && getMicroSeconds(i) >= 0 - } - - /** - * The shortest duration we have to keep delta files around before deleting them. We can only - * delete delta files that are before a compaction. We may keep files beyond this duration until - * the next calendar day. - */ - val LOG_RETENTION = buildConfig[CalendarInterval]( - "logRetentionDuration", - "interval 30 days", - parseCalendarInterval, - isValidIntervalConfigValue, - "needs to be provided as a calendar interval such as '2 weeks'. Months " + - "and years are not accepted. You may specify '365 days' for a year instead.") - - /** - * The shortest duration we have to keep logically deleted data files around before deleting them - * physically. This is to prevent failures in stale readers after compactions or partition - * overwrites. - * - * Note: this value should be large enough: - * - It should be larger than the longest possible duration of a job if you decide to run "VACUUM" - * when there are concurrent readers or writers accessing the table. - * - If you are running a streaming query reading from the table, you should make sure the query - * doesn't stop longer than this value. Otherwise, the query may not be able to restart as it - * still needs to read old files. - */ - val TOMBSTONE_RETENTION = buildConfig[CalendarInterval]( - "deletedFileRetentionDuration", - "interval 1 week", - parseCalendarInterval, - isValidIntervalConfigValue, - "needs to be provided as a calendar interval such as '2 weeks'. Months " + - "and years are not accepted. You may specify '365 days' for a year instead.") - - /** How often to checkpoint the delta log. */ - val CHECKPOINT_INTERVAL = buildConfig[Int]( - "checkpointInterval", - "10", - _.toInt, - _ > 0, - "needs to be a positive integer.") - - /** Whether to clean up expired checkpoints and delta logs. */ - val ENABLE_EXPIRED_LOG_CLEANUP = buildConfig[Boolean]( - "enableExpiredLogCleanup", - "true", - _.toBoolean, - _ => true, - "needs to be a boolean.") - - /** - * Whether this Delta table is append-only. Files can't be deleted, or values can't be updated. - */ - val IS_APPEND_ONLY = buildConfig[Boolean]( - "appendOnly", - "false", - _.toBoolean, - _ => true, - "needs to be a boolean.", - Some(new Protocol(0, 2))) -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/DeltaHistoryManager.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/DeltaHistoryManager.scala deleted file mode 100644 index 94b28627730..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/DeltaHistoryManager.scala +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.sql.Timestamp - -import scala.collection.JavaConverters._ - -import io.delta.storage.LogStore -import org.apache.hadoop.fs.Path - -import io.delta.standalone.internal.actions.{Action, CommitInfo, CommitMarker} -import io.delta.standalone.internal.exception.DeltaErrors -import io.delta.standalone.internal.logging.Logging -import io.delta.standalone.internal.util.FileNames - -/** - * This class keeps tracks of the version of commits and their timestamps for a Delta table to - * help with operations like describing the history of a table. - * - * @param deltaLog the transaction log of this table - */ -private[internal] case class DeltaHistoryManager(deltaLog: DeltaLogImpl) extends Logging { - - /** Get the persisted commit info for the given delta file. */ - def getCommitInfo(version: Long): CommitInfo = { - import io.delta.standalone.internal.util.Implicits._ - - val info = deltaLog.store - .read(FileNames.deltaFile(deltaLog.logPath, version), deltaLog.hadoopConf) - .toArray - .map(Action.fromJson) - .collectFirst { case c: CommitInfo => c } - if (info.isEmpty) { - CommitInfo.empty(Some(version)) - } else { - info.head.copy(version = Some(version)) - } - } - - /** - * Check whether the given version can be recreated by replaying the DeltaLog. - * - * @throws IllegalArgumentException if version is outside range of available versions - */ - def checkVersionExists(version: Long): Unit = { - val earliestVersion = getEarliestReproducibleCommitVersion - val latestVersion = deltaLog.update().version - if (version < earliestVersion || version > latestVersion) { - throw DeltaErrors.versionNotExistException(version, earliestVersion, latestVersion) - } - } - - /** - * Returns the latest commit that happened at or before `time`. - * - * If the given timestamp is outside the range of [earliestCommit, latestCommit] then use params - * `canReturnLastCommit` and `canReturnEarliestCommit` to control whether an exception is thrown - * or the corresponding earliest/latest commit is returned. See param docs below. - * - * @param timestamp the timestamp to search for - * @param canReturnLastCommit Whether we can return the latest version of the table if the - * provided timestamp is after the latest commit - * @param mustBeRecreatable Whether the state at the given commit should be recreatable - * @param canReturnEarliestCommit Whether we can return the earliest version of the table if the - * provided timestamp is before the earliest commit - * @throws RuntimeException if the state at the given commit in not recreatable and - * mustBeRecreatable is true - * @throws IllegalArgumentException if the provided timestamp is before the earliest commit and - * canReturnEarliestCommit is false - * @throws IllegalArgumentException if the provided timestamp is after the latest commit and - * canReturnLastCommit is false - */ - def getActiveCommitAtTime( - timestamp: Timestamp, - canReturnLastCommit: Boolean = false, - mustBeRecreatable: Boolean = true, - canReturnEarliestCommit: Boolean = false): Commit = { - val time = timestamp.getTime - val earliestVersion = if (mustBeRecreatable) { - getEarliestReproducibleCommitVersion - } else { - getEarliestDeltaFile(deltaLog) - } - val latestVersion = deltaLog.update().version - - // Search for the commit - val commits = getCommits(deltaLog.store, deltaLog.logPath, earliestVersion, latestVersion + 1) - - // If it returns empty, we will fail below with `timestampEarlierThanTableFirstCommit` - val commit = lastCommitBeforeTimestamp(commits, time).getOrElse(commits.head) - - // Error handling - val commitTs = new Timestamp(commit.timestamp) - if (commit.timestamp > time && !canReturnEarliestCommit) { - throw DeltaErrors.timestampEarlierThanTableFirstCommit(timestamp, commitTs) - } else if (commit.timestamp < time && commit.version == latestVersion && !canReturnLastCommit) { - throw DeltaErrors.timestampLaterThanTableLastCommit(timestamp, commitTs) - } - - commit - } - - /** - * Get the earliest commit available for this table. Note that this version isn't guaranteed to - * exist when performing an action as a concurrent operation can delete the file during cleanup. - * This value must be used as a lower bound. - */ - def getEarliestDeltaFile(deltaLog: DeltaLogImpl): Long = { - val version0 = FileNames.deltaFile(deltaLog.logPath, 0) - val earliestVersionOpt = deltaLog.store.listFrom(version0, deltaLog.hadoopConf) - .asScala - .filter(f => FileNames.isDeltaFile(f.getPath)) - .take(1).toArray.headOption - if (earliestVersionOpt.isEmpty) { - throw DeltaErrors.noHistoryFound(deltaLog.logPath) - } - FileNames.deltaVersion(earliestVersionOpt.get.getPath) - } - - /** - * Get the earliest commit, which we can recreate. Note that this version isn't guaranteed to - * exist when performing an action as a concurrent operation can delete the file during cleanup. - * This value must be used as a lower bound. - * - * We search for the earliest checkpoint we have, or whether we have the 0th delta file, because - * that way we can reconstruct the entire history of the table. This method assumes that the - * commits are contiguous. - */ - private def getEarliestReproducibleCommitVersion: Long = { - val files = deltaLog.store - .listFrom(FileNames.deltaFile(deltaLog.logPath, 0), deltaLog.hadoopConf) - .asScala - .filter(f => FileNames.isDeltaFile(f.getPath) || FileNames.isCheckpointFile(f.getPath)) - - // A map of checkpoint version and number of parts, to number of parts observed - val checkpointMap = new scala.collection.mutable.HashMap[(Long, Int), Int]() - var smallestDeltaVersion = Long.MaxValue - var lastCompleteCheckpoint: Option[Long] = None - - // Iterate through the log files - this will be in order starting from the lowest version. - // Checkpoint files come before deltas, so when we see a checkpoint, we remember it and - // return it once we detect that we've seen a smaller or equal delta version. - while (files.hasNext) { - val nextFilePath = files.next().getPath - if (FileNames.isDeltaFile(nextFilePath)) { - val version = FileNames.deltaVersion(nextFilePath) - if (version == 0L) return version - smallestDeltaVersion = math.min(version, smallestDeltaVersion) - - // Note that we also check this condition at the end of the function - we check it - // here too to to try and avoid more file listing when it's unnecessary. - if (lastCompleteCheckpoint.exists(_ >= smallestDeltaVersion)) { - return lastCompleteCheckpoint.get - } - } else if (FileNames.isCheckpointFile(nextFilePath)) { - val checkpointVersion = FileNames.checkpointVersion(nextFilePath) - val parts = FileNames.numCheckpointParts(nextFilePath) - if (parts.isEmpty) { - lastCompleteCheckpoint = Some(checkpointVersion) - } else { - // if we have a multi-part checkpoint, we need to check that all parts exist - val numParts = parts.getOrElse(1) - val preCount = checkpointMap.getOrElse(checkpointVersion -> numParts, 0) - if (numParts == preCount + 1) { - lastCompleteCheckpoint = Some(checkpointVersion) - } - checkpointMap.put(checkpointVersion -> numParts, preCount + 1) - } - } - } - - if (lastCompleteCheckpoint.exists(_ >= smallestDeltaVersion)) { - lastCompleteCheckpoint.get - } else if (smallestDeltaVersion < Long.MaxValue) { - throw DeltaErrors.noReproducibleHistoryFound(deltaLog.logPath) - } else { - throw DeltaErrors.noHistoryFound(deltaLog.logPath) - } - } - - /** - * Returns the commit version and timestamps of all commits in `[start, end)`. If `end` is not - * specified, will return all commits that exist after `start`. Will guarantee that the commits - * returned will have both monotonically increasing versions as well as timestamps. - * Exposed for tests. - */ - private def getCommits( - logStore: LogStore, - logPath: Path, - start: Long, - end: Long): Array[Commit] = { - val commits = logStore.listFrom(FileNames.deltaFile(logPath, start), deltaLog.hadoopConf) - .asScala - .filter(f => FileNames.isDeltaFile(f.getPath)) - .map { fileStatus => - Commit(FileNames.deltaVersion(fileStatus.getPath), fileStatus.getModificationTime) - } - .takeWhile(_.version < end) - - monotonizeCommitTimestamps(commits.toArray) - } - - /** - * Makes sure that the commit timestamps are monotonically increasing with respect to commit - * versions. Requires the input commits to be sorted by the commit version. - */ - private def monotonizeCommitTimestamps[T <: CommitMarker](commits: Array[T]): Array[T] = { - var i = 0 - val length = commits.length - while (i < length - 1) { - val prevTimestamp = commits(i).getTimestamp - assert(commits(i).getVersion < commits(i + 1).getVersion, "Unordered commits provided.") - if (prevTimestamp >= commits(i + 1).getTimestamp) { - logWarning(s"Found Delta commit ${commits(i).getVersion} with a timestamp $prevTimestamp " + - s"which is greater than the next commit timestamp ${commits(i + 1).getTimestamp}.") - commits(i + 1) = commits(i + 1).withTimestamp(prevTimestamp + 1).asInstanceOf[T] - } - i += 1 - } - commits - } - - /** Returns the latest commit that happened at or before `time`. */ - private def lastCommitBeforeTimestamp(commits: Seq[Commit], time: Long): Option[Commit] = { - val i = commits.lastIndexWhere(_.timestamp <= time) - if (i < 0) None else Some(commits(i)) - } - - /** A helper class to represent the timestamp and version of a commit. */ - case class Commit(version: Long, timestamp: Long) extends CommitMarker { - override def withTimestamp(timestamp: Long): Commit = this.copy(timestamp = timestamp) - - override def getTimestamp: Long = timestamp - - override def getVersion: Long = version - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/DeltaLogImpl.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/DeltaLogImpl.scala deleted file mode 100644 index 9c8928ceb12..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/DeltaLogImpl.scala +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.io.IOException -import java.sql.Timestamp -import java.util.TimeZone -import java.util.concurrent.locks.ReentrantLock - -import scala.collection.JavaConverters._ - -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.Path - -import io.delta.standalone.{DeltaLog, OptimisticTransaction, VersionLog} -import io.delta.standalone.actions.{CommitInfo => CommitInfoJ} - -import io.delta.standalone.internal.actions.{Action, Metadata, Protocol} -import io.delta.standalone.internal.exception.DeltaErrors -import io.delta.standalone.internal.logging.Logging -import io.delta.standalone.internal.sources.StandaloneHadoopConf -import io.delta.standalone.internal.storage.LogStoreProvider -import io.delta.standalone.internal.util.{Clock, ConversionUtils, FileNames, SystemClock} - -/** - * Scala implementation of Java interface [[DeltaLog]]. - */ -private[internal] class DeltaLogImpl private[internal]( - val hadoopConf: Configuration, - val logPath: Path, - val dataPath: Path, - val clock: Clock) - extends DeltaLog - with Checkpoints - with MetadataCleanup - with LogStoreProvider - with SnapshotManagement - with Logging { - - /** Used to read and write physical log files and checkpoints. */ - lazy val store = createLogStore(hadoopConf) - - /** Direct access to the underlying storage system. */ - lazy val fs = logPath.getFileSystem(hadoopConf) - - // TODO: There is a race here where files could get dropped when increasing the - // retention interval... - protected def metadata = if (snapshot == null) Metadata() else snapshot.metadataScala - - /** How long to keep around logically deleted files before physically deleting them. */ - def tombstoneRetentionMillis: Long = - DeltaConfigs.getMilliSeconds(DeltaConfigs.TOMBSTONE_RETENTION.fromMetadata(metadata)) - - /** - * Tombstones before this timestamp will be dropped from the state and the files can be - * garbage collected. - */ - def minFileRetentionTimestamp: Long = clock.getTimeMillis() - tombstoneRetentionMillis - - /** The unique identifier for this table. */ - def tableId: String = metadata.id - - /** Use ReentrantLock to allow us to call `lockInterruptibly`. */ - private val deltaLogLock = new ReentrantLock() - - /** Delta History Manager containing version and commit history. */ - protected lazy val history = DeltaHistoryManager(this) - - /** Returns the checkpoint interval for this log. Not transactional. */ - def checkpointInterval: Int = DeltaConfigs.CHECKPOINT_INTERVAL.fromMetadata(metadata) - - /** Convert the timeZoneId to an actual timeZone that can be used for decoding. */ - def timezone: TimeZone = { - if (hadoopConf.get(StandaloneHadoopConf.PARQUET_DATA_TIME_ZONE_ID) == null) { - TimeZone.getDefault - } else { - TimeZone.getTimeZone(hadoopConf.get(StandaloneHadoopConf.PARQUET_DATA_TIME_ZONE_ID)) - } - } - - /////////////////////////////////////////////////////////////////////////// - // Public Java API Methods - /////////////////////////////////////////////////////////////////////////// - - override def getPath: Path = dataPath - - override def getCommitInfoAt(version: Long): CommitInfoJ = { - history.checkVersionExists(version) - ConversionUtils.convertCommitInfo(history.getCommitInfo(version)) - } - - override def getChanges( - startVersion: Long, - failOnDataLoss: Boolean): java.util.Iterator[VersionLog] = { - - if (startVersion < 0) throw new IllegalArgumentException(s"Invalid startVersion: $startVersion") - - val deltaPaths = store.listFrom(FileNames.deltaFile(logPath, startVersion), hadoopConf) - .asScala - .filter(f => FileNames.isDeltaFile(f.getPath)) - - // Subtract 1 to ensure that we have the same check for the inclusive startVersion - var lastSeenVersion = startVersion - 1 - deltaPaths.map[VersionLog] { status => - val p = status.getPath - val version = FileNames.deltaVersion(p) - if (failOnDataLoss && version > lastSeenVersion + 1) { - throw DeltaErrors.failOnDataLossException(lastSeenVersion + 1, version) - } - lastSeenVersion = version - - new MemoryOptimizedVersionLog( - version, - () => store.read(p, hadoopConf)) - }.asJava - } - - override def getVersionBeforeOrAtTimestamp(timestamp: Long): Long = { - if (!tableExists) return -1 - - // Note: if the provided timestamp is earlier than any committed version, then - // `getActiveCommitAtTime` will throw IllegalArgumentException (specifically, - // `DeltaErrors.timestampEarlierThanTableFirstCommit`). - history.getActiveCommitAtTime( - new Timestamp(timestamp), - // e.g. if we give time T+2 and last commit has time T, then we DO want that last commit - canReturnLastCommit = true, - mustBeRecreatable = false, - // e.g. we give time T-1 and first commit has time T, then do NOT want that earliest commit - canReturnEarliestCommit = false - ).version - } - - override def getVersionAtOrAfterTimestamp(timestamp: Long): Long = { - if (!tableExists) return -1 - - // Note: if the provided timestamp is later than any committed version, then - // `getActiveCommitAtTime` will throw IllegalArgumentException (specifically, - // `DeltaErrors.timestampLaterThanTableLastCommit`). - val commit = history.getActiveCommitAtTime( - new Timestamp(timestamp), - // e.g. if we give time T+2 and last commit has time T, then we do NOT want that last commit - canReturnLastCommit = false, - mustBeRecreatable = false, - // e.g. we give time T-1 and first commit has time T, then we DO want that earliest commit - canReturnEarliestCommit = true - ) - - if (commit.timestamp >= timestamp) { - commit.version - } else { - // this commit.timestamp is before the input timestamp. if this is the last commit, then the - // input timestamp is after the last commit and `getActiveCommitAtTime` would have thrown - // an IllegalArgumentException. So, clearly, this can't be the last commit, so we can safely - // return commit.version + 1 as the version that is at or after the input timestamp. - commit.version + 1 - } - } - - override def startTransaction(): OptimisticTransaction = { - update() - new OptimisticTransactionImpl(this, snapshot) - } - - /** Whether a Delta table exists at this directory. */ - override def tableExists: Boolean = snapshot.version >= 0 - - /////////////////////////////////////////////////////////////////////////// - // Internal Methods - /////////////////////////////////////////////////////////////////////////// - - /** - * Run `body` inside `deltaLogLock` lock using `lockInterruptibly` so that the thread can be - * interrupted when waiting for the lock. - */ - def lockInterruptibly[T](body: => T): T = { - deltaLogLock.lockInterruptibly() - try { - body - } finally { - deltaLogLock.unlock() - } - } - - /** Creates the log directory if it does not exist. */ - def ensureLogDirectoryExist(): Unit = { - if (!fs.exists(logPath)) { - if (!fs.mkdirs(logPath)) { - throw new IOException(s"Cannot create $logPath") - } - } - } - - /** - * Asserts that the client is up to date with the protocol and - * allowed to read the table that is using the given `protocol`. - */ - def assertProtocolRead(protocol: Protocol): Unit = { - if (protocol != null && Action.readerVersion < protocol.minReaderVersion) { - throw new DeltaErrors.InvalidProtocolVersionException(Action.protocolVersion, protocol) - } - } - - /** - * Asserts that the client is up to date with the protocol and - * allowed to write to the table that is using the given `protocol`. - */ - def assertProtocolWrite(protocol: Protocol): Unit = { - if (protocol != null && Action.writerVersion < protocol.minWriterVersion) { - throw new DeltaErrors.InvalidProtocolVersionException(Action.protocolVersion, protocol) - } - } - - /** - * Checks whether this table only accepts appends. If so it will throw an error in operations that - * can remove data such as DELETE/UPDATE/MERGE. - */ - def assertRemovable(): Unit = { - if (DeltaConfigs.IS_APPEND_ONLY.fromMetadata(metadata)) { - throw DeltaErrors.modifyAppendOnlyTableException - } - } -} - -private[standalone] object DeltaLogImpl { - def forTable(hadoopConf: Configuration, dataPath: String): DeltaLogImpl = { - apply(hadoopConf, new Path(dataPath, "_delta_log")) - } - - def forTable(hadoopConf: Configuration, dataPath: Path): DeltaLogImpl = { - apply(hadoopConf, new Path(dataPath, "_delta_log")) - } - - def forTable(hadoopConf: Configuration, dataPath: String, clock: Clock): DeltaLogImpl = { - apply(hadoopConf, new Path(dataPath, "_delta_log"), clock) - } - - def forTable(hadoopConf: Configuration, dataPath: Path, clock: Clock): DeltaLogImpl = { - apply(hadoopConf, new Path(dataPath, "_delta_log"), clock) - } - - private def apply( - hadoopConf: Configuration, - rawPath: Path, - clock: Clock = new SystemClock): DeltaLogImpl = { - val fs = rawPath.getFileSystem(hadoopConf) - val path = fs.makeQualified(rawPath) - - new DeltaLogImpl(hadoopConf, path, path.getParent, clock) - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/MemoryOptimizedVersionLog.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/MemoryOptimizedVersionLog.scala deleted file mode 100644 index 7cf72758c5a..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/MemoryOptimizedVersionLog.scala +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.util.Collections - -import scala.collection.JavaConverters._ - -import io.delta.storage.CloseableIterator - -import io.delta.standalone.VersionLog -import io.delta.standalone.actions.{Action => ActionJ} - -import io.delta.standalone.internal.actions.Action -import io.delta.standalone.internal.util.ConversionUtils - -/** - * Scala implementation of Java class [[VersionLog]] provides a way to iterate through actions - * without loading the entire action list into memory when using [[getActionsIterator]]. - * - * This implementation only loads all actions into a list at the first call to [[getActions]]. - * - * @param version the table version at which these actions occurred - * @param supplier provide [[CloseableIterator]] of actions for fetching information inside all - * [[Action]] stored in this table version - */ -private[internal] class MemoryOptimizedVersionLog( - version: Long, - supplier: () => CloseableIterator[String]) - extends VersionLog(version, new java.util.ArrayList[ActionJ]()) { - import io.delta.standalone.internal.util.Implicits._ - - private lazy val cachedActions: java.util.List[ActionJ] = { - // CloseableIterator is automatically closed by - // io.delta.standalone.internal.util.Implicits.CloseableIteratorOps.toArray - supplier() - .toArray - .map(x => ConversionUtils.convertAction(Action.fromJson(x))) - .toList - .asJava - } - - override def getActionsIterator: CloseableIterator[ActionJ] = { - new CloseableIterator[ActionJ]() { - // A wrapper class casting CloseableIterator[String] to CloseableIterator[Action] - private val wrap = supplier() - - override def next(): ActionJ = { - ConversionUtils.convertAction(Action.fromJson(wrap.next)) - } - - override def close(): Unit = { - wrap.close() - } - - override def hasNext: Boolean = { - wrap.hasNext - } - } - } - - override def getActions: java.util.List[ActionJ] = { - Collections.unmodifiableList(cachedActions) - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/MetadataCleanup.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/MetadataCleanup.scala deleted file mode 100644 index c8feed93a94..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/MetadataCleanup.scala +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.util.{Calendar, TimeZone} - -import scala.collection.JavaConverters._ - -import org.apache.commons.lang3.time.DateUtils -import org.apache.hadoop.fs.{FileStatus, Path} - -import io.delta.standalone.internal.util.FileNames.{checkpointPrefix, checkpointVersion, deltaVersion, isCheckpointFile, isDeltaFile} - -private[internal] trait MetadataCleanup { - self: DeltaLogImpl => - - /** Whether to clean up expired log files and checkpoints. */ - def enableExpiredLogCleanup: Boolean = - DeltaConfigs.ENABLE_EXPIRED_LOG_CLEANUP.fromMetadata(metadata) - - /** - * Returns the duration in millis for how long to keep around obsolete logs. We may keep logs - * beyond this duration until the next calendar day to avoid constantly creating checkpoints. - */ - def deltaRetentionMillis: Long = { - DeltaConfigs.getMilliSeconds(DeltaConfigs.LOG_RETENTION.fromMetadata(metadata)) - } - - def doLogCleanup(): Unit = { - if (enableExpiredLogCleanup) { - cleanUpExpiredLogs() - } - } - - /** Clean up expired delta and checkpoint logs. Exposed for testing. */ - def cleanUpExpiredLogs(): Unit = { - val fileCutOffTime = truncateDay(clock.getTimeMillis() - deltaRetentionMillis).getTime - - lazy val formattedDate = fileCutOffTime.toGMTString - logInfo(s"Starting the deletion of log files older than $formattedDate") - - var numDeleted = 0 - listExpiredDeltaLogs(fileCutOffTime.getTime).map(_.getPath).foreach { path => - // recursive = false - if (fs.delete(path, false)) numDeleted += 1 - } - - logInfo(s"Deleted $numDeleted log files older than $formattedDate") - } - - /** - * Returns an iterator of expired delta logs that can be cleaned up. For a delta log to be - * considered as expired, it must: - * - have a checkpoint file after it - * - be older than `fileCutOffTime` - */ - private def listExpiredDeltaLogs(fileCutOffTime: Long): Iterator[FileStatus] = { - val latestCheckpoint = lastCheckpoint - if (latestCheckpoint.isEmpty) return Iterator.empty - val threshold = latestCheckpoint.get.version - 1L - val files = store.listFrom(checkpointPrefix(logPath, 0), hadoopConf) - .asScala - .filter(f => isCheckpointFile(f.getPath) || isDeltaFile(f.getPath)) - def getVersion(filePath: Path): Long = { - if (isCheckpointFile(filePath)) { - checkpointVersion(filePath) - } else { - deltaVersion(filePath) - } - } - - new BufferingLogDeletionIterator(files, fileCutOffTime, threshold, getVersion) - } - - /** Truncates a timestamp down to the previous midnight and returns the time and a log string */ - private def truncateDay(timeMillis: Long): Calendar = { - val date = Calendar.getInstance(TimeZone.getTimeZone("UTC")) - date.setTimeInMillis(timeMillis) - DateUtils.truncate( - date, - Calendar.DAY_OF_MONTH) - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/OptimisticTransactionImpl.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/OptimisticTransactionImpl.scala deleted file mode 100644 index 585aa06e5ae..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/OptimisticTransactionImpl.scala +++ /dev/null @@ -1,574 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.nio.file.FileAlreadyExistsException -import java.util.UUID - -import scala.collection.JavaConverters._ -import scala.collection.mutable.ArrayBuffer - -import org.apache.hadoop.fs.Path - -import io.delta.standalone.{CommitResult, DeltaScan, NAME, Operation, OptimisticTransaction, VERSION} -import io.delta.standalone.actions.{Action => ActionJ, Metadata => MetadataJ} -import io.delta.standalone.exceptions.DeltaStandaloneException -import io.delta.standalone.expressions.{Expression, Literal} -import io.delta.standalone.types.StructType - -import io.delta.standalone.internal.actions.{Action, AddFile, CommitInfo, FileAction, Metadata, Protocol, RemoveFile} -import io.delta.standalone.internal.exception.DeltaErrors -import io.delta.standalone.internal.logging.Logging -import io.delta.standalone.internal.sources.StandaloneHadoopConf -import io.delta.standalone.internal.util.{ConversionUtils, FileNames, SchemaMergingUtils, SchemaUtils} -import io.delta.standalone.internal.util.DeltaFileOperations - - -private[internal] class OptimisticTransactionImpl( - deltaLog: DeltaLogImpl, - snapshot: SnapshotImpl) extends OptimisticTransaction with Logging { - val DELTA_MAX_RETRY_COMMIT_ATTEMPTS = 10000000 - - /** Used for logging */ - private val txnId = UUID.randomUUID().toString - - /** Tracks the appIds that have been seen by this transaction. */ - private[internal] val readTxn = new ArrayBuffer[String] - - /** - * Tracks the data that could have been seen by recording the partition - * predicates by which files have been queried by this transaction. - */ - private val readPredicates = new ArrayBuffer[Expression] - - /** Tracks specific files that have been seen by this transaction. */ - private val readFiles = new scala.collection.mutable.HashSet[AddFile] - - /** Whether the whole table was read during the transaction. */ - private var readTheWholeTable = false - - /** Tracks if this transaction has already committed. */ - private var committed = false - - /** Stores the updated metadata (if any) that will result from this txn. */ - private var newMetadata: Option[Metadata] = None - - /** Stores the updated protocol (if any) that will result from this txn. */ - private var newProtocol: Option[Protocol] = None - - /** Whether this transaction is creating a new table. */ - private var isCreatingNewTable: Boolean = false - - /** - * Tracks the start time since we started trying to write a particular commit. - * Used for logging duration of retried transactions. - */ - private var commitAttemptStartTime: Long = _ - - /** The protocol of the snapshot that this transaction is reading at. */ - def protocol: Protocol = newProtocol.getOrElse(snapshot.protocolScala) - - /** - * Returns the metadata for this transaction. The metadata refers to the metadata of the snapshot - * at the transaction's read version unless updated during the transaction. - */ - def metadataScala: Metadata = newMetadata.getOrElse(snapshot.metadataScala) - - /////////////////////////////////////////////////////////////////////////// - // Public Java API Methods - /////////////////////////////////////////////////////////////////////////// - - override def metadata: MetadataJ = ConversionUtils.convertMetadata(metadataScala) - - override def commit[T <: ActionJ]( - actionsJ: java.lang.Iterable[T], - op: Operation, - engineInfo: String): CommitResult = { - - actionsJ.asScala.collect { case m: MetadataJ => m }.foreach { m => - updateMetadata(m) - } - - val actions = actionsJ.asScala - .map(ConversionUtils.convertActionJ) - .filter(!_.isInstanceOf[Metadata]) - .toSeq - - // Try to commit at the next version. - var preparedActions = prepareCommit(actions) - - // Find the isolation level to use for this commit - val noDataChanged = actions.collect { case f: FileAction => f.dataChange }.forall(_ == false) - val isolationLevelToUse = if (noDataChanged) { - // If no data has changed (i.e. its is only being rearranged), then SnapshotIsolation - // provides Serializable guarantee. Hence, allow reduced conflict detection by using - // SnapshotIsolation of what the table isolation level is. - SnapshotIsolation - } else { - Serializable - } - - val isBlindAppend = { - val dependsOnFiles = readPredicates.nonEmpty || readFiles.nonEmpty - val onlyAddFiles = - preparedActions.collect { case f: FileAction => f }.forall(_.isInstanceOf[AddFile]) - onlyAddFiles && !dependsOnFiles - } - - val commitInfo = CommitInfo( - deltaLog.clock.getTimeMillis(), - op.getName.toString, - if (op.getParameters == null) null else op.getParameters.asScala.toMap, - Map.empty, - Some(readVersion).filter(_ >= 0), - Option(isolationLevelToUse.toString), - Some(isBlindAppend), - Some(op.getMetrics.asScala.toMap), - if (op.getUserMetadata.isPresent) Some(op.getUserMetadata.get()) else None, - Some(s"${engineInfo.replaceAll("\\s", "-")} ${NAME.replaceAll("\\s", "-")}/$VERSION") - ) - - preparedActions = commitInfo +: preparedActions - - commitAttemptStartTime = deltaLog.clock.getTimeMillis() - - val commitVersion = doCommitRetryIteratively( - snapshot.version + 1, - preparedActions, - isolationLevelToUse) - - postCommit(commitVersion) - - logInfo(s"Committed delta #$commitVersion to ${deltaLog.logPath}") - - new CommitResult(commitVersion) - } - - /** Returns files matching the given predicates. */ - override def markFilesAsRead(readPredicate: Expression): DeltaScan = { - val scan = snapshot.scanScala(readPredicate) - val matchedFiles = scan.getFilesScala - - if (scan.getPushedPredicate.isPresent) { - readPredicates += scan.getPushedPredicate.get() - } - readFiles ++= matchedFiles - - scan - } - - /** - * All [[Metadata]] actions must go through this function, and be added to the committed actions - * via `newMetadata`. That is, they should never be passed into `prepareCommit`. - * - * This function enforces: - * - At most one unique [[Metadata]] is committed in a single transaction. - * - If this is the first commit, the committed metadata configuration includes global Delta - * configuration defaults. - * - Checks for unenforceable NOT NULL constraints in the table schema. - * - Checks for column name duplication. - * - Verifies column names are parquet compatible. - * - Enforces that protocol versions are not part of the table properties. - */ - override def updateMetadata(metadataJ: MetadataJ): Unit = { - - var latestMetadata = ConversionUtils.convertMetadataJ(metadataJ) - - // this Metadata instance was previously added - if (newMetadata.contains(latestMetadata)) { - return - } - - assert(newMetadata.isEmpty, - "Cannot change the metadata more than once in a transaction.") - - if (readVersion == -1 || isCreatingNewTable) { - latestMetadata = withGlobalConfigDefaults(latestMetadata) - isCreatingNewTable = true - } - - if (snapshot.metadataScala.schemaString != latestMetadata.schemaString) { - SchemaUtils.checkUnenforceableNotNullConstraints(latestMetadata.schema) - } - - verifyNewMetadata(latestMetadata) - checkPartitionColumns(latestMetadata.partitionColumns, latestMetadata.schema) - - logInfo(s"Updated metadata from ${newMetadata.getOrElse("-")} to $latestMetadata") - - newMetadata = Some(latestMetadata) - } - - override def readWholeTable(): Unit = { - readPredicates += Literal.True - readTheWholeTable = true - } - - override def txnVersion(id: String): Long = { - readTxn += id - snapshot.transactions.getOrElse(id, -1L) - } - - override def readVersion(): Long = { - snapshot.version - } - - /////////////////////////////////////////////////////////////////////////// - // Critical Internal-Only Methods - /////////////////////////////////////////////////////////////////////////// - - /** - * Prepare for a commit by doing all necessary pre-commit checks and modifications to the actions. - * - * Requires that no Metadata action exists inside of `actions`. Instead, Metadata actions should - * be added via the `newMetadata` field. - * - * @return The finalized set of actions. - */ - private def prepareCommit(actions: Seq[Action]): Seq[Action] = { - assert(!committed, "Transaction already committed.") - - val customCommitInfo = actions.exists(_.isInstanceOf[CommitInfo]) - assert(!customCommitInfo, "Cannot commit a custom CommitInfo in a transaction.") - - // This will ignore errors (disabled by default) when trying to relativize a path - // This is specifically for files living in a filesystem different from the base table path - // so one can enable shallow clones across file systems - val relativizeIgnoreError = deltaLog - .hadoopConf - .getBoolean(StandaloneHadoopConf.RELATIVE_PATH_IGNORE, false) - - // Convert AddFile paths to relative paths if they're in the table path - var finalActions = actions.map { - case addFile: AddFile => - addFile.copy(path = - DeltaFileOperations.tryRelativizePath( - deltaLog.fs, - deltaLog.getPath, - new Path(addFile.path), - relativizeIgnoreError - ).toString) - case a: Action => a - } - - newMetadata.foreach { m => - verifySchemaCompatibility(snapshot.metadataScala.schema, m.schema, actions) - } - - // If the metadata has changed, add that to the set of actions - finalActions = newMetadata.toSeq ++ finalActions - - if (snapshot.version == -1) { - deltaLog.ensureLogDirectoryExist() - - // If this is the first commit and no protocol is specified, initialize the protocol version. - if (!finalActions.exists(_.isInstanceOf[Protocol])) { - finalActions = protocol +: finalActions - } - - // If this is the first commit and no metadata is specified, throw an exception - if (!finalActions.exists(_.isInstanceOf[Metadata])) { - throw DeltaErrors.metadataAbsentException() - } - } - - val protocolOpt = finalActions.collectFirst{ case p: Protocol => p } - if (protocolOpt.isDefined) { - assert(protocolOpt.get == Protocol(), s"Invalid Protocol ${protocolOpt.get.simpleString}. " + - s"Currently only Protocol readerVersion 1 and writerVersion 2 is supported.") - } - - val partitionColumns = metadataScala.partitionColumns.toSet - finalActions.foreach { - case a: AddFile if partitionColumns != a.partitionValues.keySet => - throw DeltaErrors.addFilePartitioningMismatchException( - a.partitionValues.keySet.toSeq, partitionColumns.toSeq) - case _ => // nothing - } - - deltaLog.assertProtocolWrite(snapshot.protocolScala) - - // We make sure that this isn't an appendOnly table as we check if we need to delete files. - val removes = actions.collect { case r: RemoveFile => r } - if (removes.exists(_.dataChange)) deltaLog.assertRemovable() - - finalActions - } - - /** - * Commit `actions` using `attemptVersion` version number. If there are any conflicts that are - * found, we will retry a fixed number of times. - * - * @return the real version that was committed - */ - protected def doCommitRetryIteratively( - attemptVersion: Long, - actions: Seq[Action], - isolationLevel: IsolationLevel): Long = deltaLog.lockInterruptibly { - var tryCommit = true - var commitVersion = attemptVersion - var attemptNumber = 0 - - while (tryCommit) { - try { - if (attemptNumber == 0) { - doCommit(commitVersion, actions, isolationLevel) - } else if (attemptNumber > DELTA_MAX_RETRY_COMMIT_ATTEMPTS) { - val totalCommitAttemptTime = deltaLog.clock.getTimeMillis() - commitAttemptStartTime - throw DeltaErrors.maxCommitRetriesExceededException( - attemptNumber, - commitVersion, - attemptVersion, - actions.length, - totalCommitAttemptTime) - } else { - commitVersion = checkForConflicts(commitVersion, actions, attemptNumber, isolationLevel) - doCommit(commitVersion, actions, isolationLevel) - } - tryCommit = false - } catch { - case _: FileAlreadyExistsException => attemptNumber += 1 - } - } - commitVersion - } - - /** - * Commit `actions` using `attemptVersion` version number. - * - * If you detect any conflicts, try to resolve logical conflicts and commit using a new version. - * - * @return the real version that was committed. - * @throws IllegalStateException if the attempted commit version is ahead of the current delta log - * version - */ - private def doCommit( - attemptVersion: Long, - actions: Seq[Action], - isolationLevel: IsolationLevel): Long = { - logInfo( - s"Attempting to commit version $attemptVersion with ${actions.size} actions with " + - s"$isolationLevel isolation level") - - if (readVersion > -1 && metadata.getId != snapshot.getMetadata.getId) { - logError(s"Change in the table id detected in txn. Table id for txn on table at " + - s"${deltaLog.dataPath} was ${snapshot.getMetadata.getId} when the txn was created and " + - s"is now changed to ${metadata.getId}.") - } - - deltaLog.store.write( - FileNames.deltaFile(deltaLog.logPath, attemptVersion), - actions.map(_.json).toIterator.asJava, - false, // overwrite = false - deltaLog.hadoopConf - ) - - val postCommitSnapshot = deltaLog.update() - if (postCommitSnapshot.version < attemptVersion) { - throw new IllegalStateException( - s"The committed version is $attemptVersion " + - s"but the current version is ${postCommitSnapshot.version}.") - } - - attemptVersion - } - - /** - * Perform post-commit operations - */ - private def postCommit(commitVersion: Long): Unit = { - committed = true - - if (shouldCheckpoint(commitVersion)) { - try { - // We checkpoint the version to be committed to so that no two transactions will checkpoint - // the same version. - deltaLog.checkpoint(deltaLog.getSnapshotForVersionAsOf(commitVersion)) - } catch { - case e: IllegalStateException => logWarning("Failed to checkpoint table state.", e) - } - } - } - - /** - * Looks at actions that have happened since the txn started and checks for logical - * conflicts with the read/writes. If no conflicts are found return the commit version to attempt - * next. - */ - private def checkForConflicts( - checkVersion: Long, - actions: Seq[Action], - attemptNumber: Int, - commitIsolationLevel: IsolationLevel): Long = { - val nextAttemptVersion = getNextAttemptVersion - - val currentTransactionInfo = CurrentTransactionInfo( - readPredicates = readPredicates.toSeq, - readFiles = readFiles.toSet, - readWholeTable = readTheWholeTable, - readAppIds = readTxn.toSet, - metadata = metadataScala, - actions = actions, - deltaLog = deltaLog) - - val logPrefixStr = s"[attempt $attemptNumber]" - val txnDetailsLogStr = { - var adds = 0L - var removes = 0L - currentTransactionInfo.actions.foreach { - case _: AddFile => adds += 1 - case _: RemoveFile => removes += 1 - case _ => - } - s"$adds adds, $removes removes, ${readPredicates.size} read predicates, " + - s"${readFiles.size} read files" - } - - logInfo(s"$logPrefixStr Checking for conflicts with versions " + - s"[$checkVersion, $nextAttemptVersion) with current txn having $txnDetailsLogStr") - - (checkVersion until nextAttemptVersion).foreach { otherCommitVersion => - val conflictChecker = new ConflictChecker( - currentTransactionInfo, - otherCommitVersion, - commitIsolationLevel, - logPrefixStr) - - conflictChecker.checkConflicts() - - logInfo(s"$logPrefixStr No conflicts in version $otherCommitVersion, " + - s"${deltaLog.clock.getTimeMillis() - commitAttemptStartTime} ms since start") - } - - logInfo(s"$logPrefixStr No conflicts with versions [$checkVersion, $nextAttemptVersion) " + - s"with current txn having $txnDetailsLogStr, " + - s"${deltaLog.clock.getTimeMillis() - commitAttemptStartTime} ms since start") - - nextAttemptVersion - } - - /////////////////////////////////////////////////////////////////////////// - // Helper Methods - /////////////////////////////////////////////////////////////////////////// - - private def verifyNewMetadata(metadata: Metadata): Unit = { - SchemaMergingUtils.checkColumnNameDuplication(metadata.schema, "in the metadata update") - SchemaUtils.checkFieldNames(SchemaMergingUtils.explodeNestedFieldNames(metadata.dataSchema)) - - try { - SchemaUtils.checkFieldNames(metadata.partitionColumns) - } catch { - case e: DeltaStandaloneException => throw DeltaErrors.invalidPartitionColumn(e) - } - - Protocol.checkMetadataProtocolProperties(metadata, protocol) - } - - /** - * Check that the schema contains all partition columns and at least one non-partition column - */ - private def checkPartitionColumns(partitionCols: Seq[String], schema: StructType): Unit = { - // schema contains all partition column - val schemaCols = schema.getFieldNames.toSet - - val partitionsColsNotInSchema = partitionCols.toSet.diff(schemaCols).toSeq - - if (partitionsColsNotInSchema.nonEmpty) { - throw DeltaErrors.partitionColumnsNotFoundException(partitionsColsNotInSchema, schema) - } - - // schema contains at least one non-partition column - if (partitionCols.length == schemaCols.size) { - throw DeltaErrors.nonPartitionColumnAbsentException() - } - } - - /** - * We want to check that the [[newSchema]] is compatible with the [[existingSchema]]. - * - * If the table is empty, or if the current commit is removing all the files in the table, - * then we do not need to perform this compatibility check. - */ - private def verifySchemaCompatibility( - existingSchema: StructType, - newSchema: StructType, - actions: Seq[Action]): Unit = { - val tableEmpty = snapshot.numOfFiles == 0 - - lazy val allCurrentFilesRemoved = { - val removeFiles = actions.collect { case r: RemoveFile => r } - removeFiles.map(_.path).toSet == snapshot.allFilesScala.map(_.path).toSet - } - - if (tableEmpty || allCurrentFilesRemoved) return - - if (!existingSchema.isWriteCompatible(newSchema)) { - throw DeltaErrors.schemaChangedException(existingSchema, newSchema) - } - } - - /** - * Returns true if we should checkpoint the version that has just been committed. - */ - private def shouldCheckpoint(committedVersion: Long): Boolean = { - val checkpointingEnabled = - deltaLog.hadoopConf.getBoolean(StandaloneHadoopConf.CHECKPOINTING_ENABLED, true) - checkpointingEnabled && committedVersion != 0 && committedVersion % deltaLog.checkpointInterval == 0 - } - - /** Returns the next attempt version given the last attempted version */ - private def getNextAttemptVersion: Long = { - deltaLog.update() - deltaLog.snapshot.version + 1 - } - - /** Creates new metadata with global Delta configuration defaults. */ - private def withGlobalConfigDefaults(metadata: Metadata): Metadata = { - metadata.copy(configuration = - DeltaConfigs.mergeGlobalConfigs(deltaLog.hadoopConf, metadata.configuration)) - } - - /////////////////////////////////////////////////////////////////////////// - // Logging Override Methods - /////////////////////////////////////////////////////////////////////////// - - protected lazy val logPrefix: String = { - def truncate(uuid: String): String = uuid.split("-").head - s"[tableId=${truncate(snapshot.metadataScala.id)},txnId=${truncate(txnId)}] " - } - - override def logInfo(msg: => String): Unit = { - super.logInfo(logPrefix + msg) - } - - override def logWarning(msg: => String): Unit = { - super.logWarning(logPrefix + msg) - } - - override def logWarning(msg: => String, throwable: Throwable): Unit = { - super.logWarning(logPrefix + msg, throwable) - } - - override def logError(msg: => String): Unit = { - super.logError(logPrefix + msg) - } - - override def logError(msg: => String, throwable: Throwable): Unit = { - super.logError(logPrefix + msg, throwable) - } - -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/SnapshotImpl.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/SnapshotImpl.scala deleted file mode 100644 index a0697d6c6dd..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/SnapshotImpl.scala +++ /dev/null @@ -1,436 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.net.URI - -import scala.collection.JavaConverters._ -import scala.collection.parallel.ExecutionContextTaskSupport -import scala.collection.parallel.immutable.ParVector -import scala.concurrent.ExecutionContext - -import com.github.mjakubowski84.parquet4s.ParquetReader -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.{FileSystem, Path} - -import io.delta.standalone.{DeltaScan, Snapshot} -import io.delta.standalone.actions.{AddFile => AddFileJ, Metadata => MetadataJ, Protocol => ProtocolJ, RemoveFile => RemoveFileJ, SetTransaction => SetTransactionJ} -import io.delta.standalone.data.{CloseableIterator, RowRecord => RowParquetRecordJ} -import io.delta.standalone.expressions.Expression - -import io.delta.standalone.internal.actions.{AddFile, InMemoryLogReplay, MemoryOptimizedLogReplay, Metadata, Parquet4sSingleActionWrapper, Protocol, RemoveFile, SetTransaction, SingleAction} -import io.delta.standalone.internal.data.CloseableParquetDataIterator -import io.delta.standalone.internal.exception.DeltaErrors -import io.delta.standalone.internal.logging.Logging -import io.delta.standalone.internal.scan.{DeltaScanImpl, FilteredDeltaScanImpl} -import io.delta.standalone.internal.util.{ConversionUtils, FileNames, JsonUtils} - -/** - * Contains the protocol, metadata, and corresponding table version. The protocol and metadata - * will be used as the defaults in the Snapshot if no newer values are found in logs > `version`. - */ -case class SnapshotProtocolMetadataHint(protocol: Protocol, metadata: Metadata, version: Long) - -/** - * Visible for testing. - * - * Will contain various metrics collected while finding/loading the latest protocol and metadata - * for this Snapshot. This can be used to verify that the minimal log replay occurred. - */ -case class ProtocolMetadataLoadMetrics(fileVersions: Seq[Long]) - -/** - * Scala implementation of Java interface [[Snapshot]]. - * - * @param path _delta_log path of this snapshot - * @param timestamp The timestamp of the latest commit in milliseconds. Can also be set to -1 if the - * timestamp of the commit is unknown or the table has not been initialized, i.e. - * `version = -1`. - * @param protocolMetadataHint The optional protocol, metadata, and table version that can be used - * to speed up loading *this* Snapshot's protocol and metadata (P&M). - * Essentially, when computing *this* Snapshot's P&M, we only need to - * look at the log files *newer* than the hint version. - */ -private[internal] class SnapshotImpl( - val hadoopConf: Configuration, - val path: Path, - val version: Long, - val logSegment: LogSegment, - val minFileRetentionTimestamp: Long, - val deltaLog: DeltaLogImpl, - val timestamp: Long, - protocolMetadataHint: Option[SnapshotProtocolMetadataHint] = Option.empty) - extends Snapshot with Logging { - - protocolMetadataHint.foreach { hint => - require(hint.version <= version, s"Cannot use a protocolMetadataHint with a version newer " + - s"than that of this Snapshot. Hint version: ${hint.version}, Snapshot version: $version") - } - - import SnapshotImpl._ - - @volatile private var loadedState = false - - private val memoryOptimizedLogReplay = - new MemoryOptimizedLogReplay(files, deltaLog.store, hadoopConf, deltaLog.timezone) - - /////////////////////////////////////////////////////////////////////////// - // Public API Methods - /////////////////////////////////////////////////////////////////////////// - - override def toString: String = { - if (loadedState) { - s"SnapshotImpl(path=$path, version=$version, timestamp=$timestamp, " + - s"sizeInBytes=${state.sizeInBytes}, numAddFiles=${state.numOfFiles}, " + - s"numRemoveFiles=${state.numOfRemoves}, numSetTransactions=${state.numOfSetTransactions})" - } else { - s"SnapshotImpl(path=$path, version=$version, timestamp=$timestamp)" - } - } - - override def scan(): DeltaScan = new DeltaScanImpl(memoryOptimizedLogReplay) - - override def scan(predicate: Expression): DeltaScan = - new FilteredDeltaScanImpl( - memoryOptimizedLogReplay, - predicate, - metadataScala.partitionSchema, - hadoopConf) - - override def getAllFiles: java.util.List[AddFileJ] = activeFilesJ - - override def getMetadata: MetadataJ = ConversionUtils.convertMetadata(metadataScala) - - override def getVersion: Long = version - - override def open(): CloseableIterator[RowParquetRecordJ] = - CloseableParquetDataIterator( - allFilesScala - .map { add => - (FileNames.absolutePath(deltaLog.dataPath, add.path).toString, add.partitionValues) - }, - getMetadata.getSchema, - // the time zone ID if it exists, else null - deltaLog.timezone, - hadoopConf) - - /////////////////////////////////////////////////////////////////////////// - // Internal-Only Methods - /////////////////////////////////////////////////////////////////////////// - - /** - * Returns an implementation that provides an accessor to the files as internal Scala - * [[AddFile]]s. This prevents us from having to replay the log internally, generate Scala - * actions, convert them to Java actions (as per the [[DeltaScan]] interface), and then - * convert them back to Scala actions. - */ - def scanScala(): DeltaScanImpl = new DeltaScanImpl(memoryOptimizedLogReplay) - - def scanScala(predicate: Expression): DeltaScanImpl = - new FilteredDeltaScanImpl( - memoryOptimizedLogReplay, - predicate, - metadataScala.partitionSchema, - hadoopConf) - - def tombstones: Seq[RemoveFileJ] = state.tombstones.toSeq.map(ConversionUtils.convertRemoveFile) - def setTransactions: Seq[SetTransactionJ] = - state.setTransactions.map(ConversionUtils.convertSetTransaction) - def protocol: ProtocolJ = ConversionUtils.convertProtocol(protocolScala) - - def allFilesScala: Seq[AddFile] = state.activeFiles.toSeq - def tombstonesScala: Seq[RemoveFile] = state.tombstones.toSeq - def setTransactionsScala: Seq[SetTransaction] = state.setTransactions - def numOfFiles: Long = state.numOfFiles - - /** A map to look up transaction version by appId. */ - lazy val transactions: Map[String, Long] = - setTransactionsScala.map(t => t.appId -> t.version).toMap - - /** - * protocolScala, metadataScala are internals APIs. - * protocolMetadataLoadMetrics is visible for testing only. - * - * NOTE: These values need to be declared lazy. In Scala, strict values (i.e. non-lazy) in - * superclasses (e.g. SnapshotImpl) are fully initialized before subclasses - * (e.g. InitialSnapshotImpl). If these were 'strict', or 'eager', vals, then - * `loadTableProtocolAndMetadata` would be called for all new InitialSnapshotImpl instances, - * causing an exception. - */ - lazy val (protocolScala, metadataScala, protocolMetadataLoadMetrics) = - loadTableProtocolAndMetadata() - - private def loadTableProtocolAndMetadata(): (Protocol, Metadata, ProtocolMetadataLoadMetrics) = { - val fileVersionsScanned = scala.collection.mutable.Set[Long]() - def createMetrics = ProtocolMetadataLoadMetrics(fileVersionsScanned.toSeq.sorted.reverse) - - var protocol: Protocol = null - var metadata: Metadata = null - - val iter = memoryOptimizedLogReplay.getReverseIterator - - try { - // We replay logs from newest to oldest and will stop when we find the latest Protocol and - // Metadata (P&M). - // - // If the protocolMetadataHint is defined, then we will only look at log files strictly newer - // (>) than the protocolMetadataHint's version. If we don't find any new P&M, then we will - // default to those from the protocolMetadataHint. - // - // If the protocolMetadataHint is not defined, then we must look at all log files. If no - // P&M is found, then we fail. - iter.asScala.foreach { case (action, _, actionTableVersion) => - - // We have not yet found the latest P&M. If we had found BOTH, we would have returned - // already. Note that we may have already found ONE of them. - protocolMetadataHint.foreach { hint => - if (actionTableVersion == hint.version) { - // Furthermore, we have already looked at all the actions in all the log files strictly - // newer (>) than the hint version. Thus, we can short circuit early and use the P&M - // from the hint. - - val newestProtocol = if (protocol == null) { - logInfo(s"Using the protocol from the protocolMetadataHint: ${hint.protocol}") - hint.protocol - } else { - logInfo(s"Found a newer protocol: $protocol") - protocol - } - - val newestMetadata = if (metadata == null) { - logInfo(s"Using the metadata from the protocolMetadataHint: ${hint.metadata}") - hint.metadata - } else { - logInfo(s"Found a newer metadata: $metadata") - metadata - } - - return (newestProtocol, newestMetadata, createMetrics) - } - } - - fileVersionsScanned += actionTableVersion - - action match { - case p: Protocol if null == protocol => - // We only need the latest protocol - protocol = p - - if (protocol != null && metadata != null) { - // Stop since we have found the latest Protocol and metadata. - return (protocol, metadata, createMetrics) - } - case m: Metadata if null == metadata => - metadata = m - - if (protocol != null && metadata != null) { - // Stop since we have found the latest Protocol and metadata. - return (protocol, metadata, createMetrics) - } - case _ => // do nothing - } - } - } finally { - iter.close() - } - - // Sanity check. Should not happen in any valid Delta logs. - if (protocol == null) { - throw DeltaErrors.actionNotFoundException("protocol", logSegment.version) - } - if (metadata == null) { - throw DeltaErrors.actionNotFoundException("metadata", logSegment.version) - } - throw new IllegalStateException("should not happen") - } - - private def loadInMemory(paths: Seq[Path]): Seq[SingleAction] = { - // `ParVector`, by default, uses ForkJoinPool.commonPool(). This is a static ForkJoinPool - // instance shared by the entire JVM. This can cause issues for downstream connectors (e.g. - // the flink-delta connector) that require no object reference leaks between jobs. See #424 for - // more details. To solve this, we create and use our own ForkJoinPool instance per each method - // invocation. If we instead create this on a per-Snapshot instance then we couldn't close the - // pool and might leak threads. ALso, if we instead create this statically in Snapshot or - // DeltaLog (for less overhead) then we are back to the original problem of having a static - // ForkJoinPool. - // - // Note that we cannot create a ForkJoinPool directly as Scala 2.11 uses - // scala.collection.forkjoin.ForkJoinPool but Scala 2.12/2.13 uses - // java.util.concurrent.ForkJoinPool. - - // Under the hood, creates a new ForkJoinPool instance. This instance will use a thread pool of - // size equal to the number of processors available to the JVM. - val execContextService = ExecutionContext.fromExecutorService(null) - - try { - val pv = new ParVector(paths.map(_.toString).sortWith(_ < _).toVector) - pv.tasksupport = new ExecutionContextTaskSupport(execContextService) - pv.flatMap { path => - if (path.endsWith("json")) { - import io.delta.standalone.internal.util.Implicits._ - deltaLog.store - .read(new Path(path), hadoopConf) - .toArray - .map { line => JsonUtils.mapper.readValue[SingleAction](line) } - } else if (path.endsWith("parquet")) { - val parquetIterable = ParquetReader.read[Parquet4sSingleActionWrapper]( - path, - ParquetReader.Options( - timeZone = deltaLog.timezone, - hadoopConf = hadoopConf) - ) - try { - parquetIterable.toArray.map(_.unwrap) - } finally { - parquetIterable.close() - } - } else Seq.empty[SingleAction] - }.toList - } finally { - execContextService.shutdown() - } - } - - private def files: Seq[Path] = { - val logPathURI = path.toUri - val files = (logSegment.deltas ++ logSegment.checkpoints).map(_.getPath) - - // assert that the log belongs to table - files.foreach { f => - if (f.toString.isEmpty || f.getParent != new Path(logPathURI)) { - // scalastyle:off throwerror - throw new AssertionError( - s"File (${f.toString}) doesn't belong in the transaction log at $logPathURI.") - // scalastyle:on throwerror - } - } - - files - } - - /** - * Reconstruct the state by applying deltas in order to the checkpoint. - */ - protected lazy val state: State = { - val replay = new InMemoryLogReplay(hadoopConf, minFileRetentionTimestamp) - val actions = loadInMemory(files).map(_.unwrap) - - replay.append(0, actions.iterator) - - if (null == replay.currentProtocolVersion) { - throw DeltaErrors.actionNotFoundException("protocol", version) - } - if (null == replay.currentMetaData) { - throw DeltaErrors.actionNotFoundException("metadata", version) - } - - loadedState = true - - State( - replay.getSetTransactions, - replay.getActiveFiles, - replay.getTombstones, - replay.sizeInBytes, - replay.getActiveFiles.size, - replay.getTombstones.size, - replay.getSetTransactions.size - ) - } - - private lazy val activeFilesJ = - state.activeFiles.map(ConversionUtils.convertAddFile).toList.asJava - - logInfo(s"[tableId=${metadataScala.id}] Created snapshot $this") - - /** Complete initialization by checking protocol version. */ - deltaLog.assertProtocolRead(protocolScala) -} - -private[internal] object SnapshotImpl { - /** Canonicalize the paths for Actions. */ - def canonicalizePath(path: String, hadoopConf: Configuration): String = { - val hadoopPath = new Path(new URI(path)) - if (hadoopPath.isAbsoluteAndSchemeAuthorityNull) { - val fs = FileSystem.get(hadoopConf) - fs.makeQualified(hadoopPath).toUri.toString - } else { - // return untouched if - // - path is a relative path - // - or path is already fully qualified - // - or path points to external file systems (authority is not null) - hadoopPath.toUri.toString - } - } - - /** - * Metrics and metadata computed around the Delta table. - * - * @param setTransactions The streaming queries writing to this table - * @param activeFiles The files in this table - * @param tombstones The unexpired tombstones - * @param sizeInBytes The total size of the table (of active files, not including tombstones) - * @param numOfFiles The number of files in this table - * @param numOfRemoves The number of tombstones in the state - * @param numOfSetTransactions Number of streams writing to this table - */ - case class State( - setTransactions: Seq[SetTransaction], - activeFiles: Iterable[AddFile], - tombstones: Iterable[RemoveFile], - sizeInBytes: Long, - numOfFiles: Long, - numOfRemoves: Long, - numOfSetTransactions: Long) -} - -/** - * An initial snapshot. Uses default Protocol and Metadata. - * - * @param hadoopConf the hadoop configuration for the table - * @param logPath the path to transaction log - * @param deltaLog the delta log object - */ -private class InitialSnapshotImpl( - override val hadoopConf: Configuration, - val logPath: Path, - override val deltaLog: DeltaLogImpl) - extends SnapshotImpl(hadoopConf, logPath, -1, LogSegment.empty(logPath), -1, deltaLog, -1) { - - private val memoryOptimizedLogReplay = - new MemoryOptimizedLogReplay(Nil, deltaLog.store, hadoopConf, deltaLog.timezone) - - override lazy val state: SnapshotImpl.State = { - SnapshotImpl.State(Nil, Nil, Nil, 0L, 0L, 0L, 0L) - } - - override lazy val protocolScala: Protocol = Protocol() - - override lazy val metadataScala: Metadata = Metadata() - - override lazy val protocolMetadataLoadMetrics: ProtocolMetadataLoadMetrics = - ProtocolMetadataLoadMetrics(Seq.empty) - - override def scan(): DeltaScan = new DeltaScanImpl(memoryOptimizedLogReplay) - - override def scan(predicate: Expression): DeltaScan = - new FilteredDeltaScanImpl( - memoryOptimizedLogReplay, - predicate, - metadataScala.partitionSchema, - hadoopConf - ) -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/SnapshotManagement.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/SnapshotManagement.scala deleted file mode 100644 index a1f78107cb7..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/SnapshotManagement.scala +++ /dev/null @@ -1,328 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.io.FileNotFoundException -import java.sql.Timestamp - -import scala.collection.JavaConverters._ - -import org.apache.hadoop.fs.{FileStatus, Path} - -import io.delta.standalone.internal.exception.DeltaErrors -import io.delta.standalone.internal.util.FileNames._ - -/** - * Manages the creation, computation, and access of Snapshot's for Delta tables. Responsibilities - * include: - * - Figuring out the set of files that are required to compute a specific version of a table - * - Updating and exposing the latest snapshot of the Delta table in a thread-safe manner - */ -private[internal] trait SnapshotManagement { self: DeltaLogImpl => - - @volatile protected var currentSnapshot: SnapshotImpl = getSnapshotAtInit - - /** Returns the current snapshot. Note this does not automatically `update()`. */ - def snapshot: SnapshotImpl = currentSnapshot - - /** - * Update DeltaLog by applying the new delta files if any. - */ - def update(): SnapshotImpl = { - lockInterruptibly { - updateInternal() - } - } - - def getSnapshotForVersionAsOf(version: Long): SnapshotImpl = { - history.checkVersionExists(version) - getSnapshotAt(version) - } - - def getSnapshotForTimestampAsOf(timestamp: Long): SnapshotImpl = { - val latestCommit = history.getActiveCommitAtTime(new Timestamp(timestamp)) - getSnapshotAt(latestCommit.version) - } - - /** - * Queries the store for new delta files and applies them to the current state. - * Note: the caller should hold `deltaLogLock` before calling this method. - */ - private def updateInternal(): SnapshotImpl = { - try { - val newSegment = getLogSegmentForVersion( - startCheckpoint = currentSnapshot.logSegment.checkpointVersion) - if (newSegment != currentSnapshot.logSegment) { - val startingFrom = newSegment.checkpointVersion - .map(v => s" starting from checkpoint version $v.").getOrElse(".") - logInfo(s"Loading version ${newSegment.version}$startingFrom") - - val newSnapshot = createSnapshot( - newSegment, - newSegment.lastCommitTimestamp, - previousSnapshotOpt = Some(currentSnapshot) // We are updating to the newSegment! - ) - - if (currentSnapshot.version > -1 && - currentSnapshot.metadataScala.id != newSnapshot.metadataScala.id) { - logError(s"Change in the table id detected while updating snapshot. " + - s"\nPrevious snapshot = $currentSnapshot\nNew snapshot = $newSnapshot.") - } - - logInfo(s"Updated snapshot to $newSnapshot") - currentSnapshot = newSnapshot - } - } catch { - case e: FileNotFoundException => - // DeltaErrors.logFileNotFoundException - if (Option(e.getMessage).exists(_.contains("reconstruct state at version"))) { - throw e - } - logInfo(s"No delta log found for the Delta table at $logPath") - currentSnapshot = new InitialSnapshotImpl(hadoopConf, logPath, this) - } - currentSnapshot - } - - /** - * Get a list of files that can be used to compute a Snapshot at version `versionToLoad`, If - * `versionToLoad` is not provided, will generate the list of files that are needed to load the - * latest version of the Delta table. This method also performs checks to ensure that the delta - * files are contiguous. - * - * @param startCheckpoint A potential start version to perform the listing of the DeltaLog, - * typically that of a known checkpoint. If this version's not provided, - * we will start listing from version 0. - * @param versionToLoad A specific version to load. Typically used with time travel and the - * Delta streaming source. If not provided, we will try to load the latest - * version of the table. - * @return Some LogSegment to build a Snapshot if files do exist after the given - * startCheckpoint. None, if there are no new files after `startCheckpoint`. - */ - protected def getLogSegmentForVersion( - startCheckpoint: Option[Long], - versionToLoad: Option[Long] = None): LogSegment = { - - // List from the starting checkpoint. If a checkpoint doesn't exist, this will still return - // deltaVersion=0. - val newFiles = store - .listFrom(checkpointPrefix(logPath, startCheckpoint.getOrElse(0L)), hadoopConf) - .asScala - // Pick up all checkpoint and delta files - .filter { file => isCheckpointFile(file.getPath) || isDeltaFile(file.getPath) } - // filter out files that aren't atomically visible. Checkpoint files of 0 size are invalid - .filterNot { file => isCheckpointFile(file.getPath) && file.getLen == 0 } - // take files until the version we want to load - .takeWhile(f => versionToLoad.forall(v => getFileVersion(f.getPath) <= v)) - .toArray - - if (newFiles.isEmpty && startCheckpoint.isEmpty) { - throw DeltaErrors.emptyDirectoryException(logPath.toString) - } else if (newFiles.isEmpty) { - // The directory may be deleted and recreated and we may have stale state in our DeltaLog - // singleton, so try listing from the first version - return getLogSegmentForVersion(None, versionToLoad) - } - val (checkpoints, deltas) = newFiles.partition(f => isCheckpointFile(f.getPath)) - - // Find the latest checkpoint in the listing that is not older than the versionToLoad - val lastCheckpoint = versionToLoad.map(CheckpointInstance(_, None)) - .getOrElse(CheckpointInstance.MaxValue) - val checkpointFiles = checkpoints.map(f => CheckpointInstance(f.getPath)) - val newCheckpoint = getLatestCompleteCheckpointFromList(checkpointFiles, lastCheckpoint) - if (newCheckpoint.isDefined) { - // If there is a new checkpoint, start new lineage there. - val newCheckpointVersion = newCheckpoint.get.version - val newCheckpointPaths = newCheckpoint.get.getCorrespondingFiles(logPath).toSet - - val deltasAfterCheckpoint = deltas.filter { file => - deltaVersion(file.getPath) > newCheckpointVersion - } - val deltaVersions = deltasAfterCheckpoint.map(f => deltaVersion(f.getPath)) - - // We may just be getting a checkpoint file after the filtering - if (deltaVersions.nonEmpty) { - verifyDeltaVersions(deltaVersions) - require(deltaVersions.head == newCheckpointVersion + 1, "Did not get the first delta " + - s"file version: ${newCheckpointVersion + 1} to compute Snapshot") - versionToLoad.foreach { version => - require(deltaVersions.last == version, - s"Did not get the last delta file version: $version to compute Snapshot") - } - } - val newVersion = deltaVersions.lastOption.getOrElse(newCheckpoint.get.version) - val newCheckpointFiles = checkpoints.filter(f => newCheckpointPaths.contains(f.getPath)) - assert(newCheckpointFiles.length == newCheckpointPaths.size, - "Failed in getting the file information for:\n" + - newCheckpointPaths.mkString(" -", "\n -", "") + "\n" + - "among\n" + checkpoints.map(_.getPath).mkString(" -", "\n -", "")) - - // In the case where `deltasAfterCheckpoint` is empty, `deltas` should still not be empty, - // they may just be before the checkpoint version unless we have a bug in log cleanup - val lastCommitTimestamp = deltas.last.getModificationTime - - LogSegment( - logPath, - newVersion, - deltasAfterCheckpoint, - newCheckpointFiles, - newCheckpoint.map(_.version), - lastCommitTimestamp) - } else { - // No starting checkpoint found. This means that we should definitely have version 0, or the - // last checkpoint we thought should exist (the `_last_checkpoint` file) no longer exists - if (startCheckpoint.isDefined) { - throw DeltaErrors.missingPartFilesException( - startCheckpoint.get, new FileNotFoundException( - s"Checkpoint file to load version: ${startCheckpoint.get} is missing.")) - } - - val deltaVersions = deltas.map(f => deltaVersion(f.getPath)) - verifyDeltaVersions(deltaVersions) - if (deltaVersions.head != 0) { - throw DeltaErrors.logFileNotFoundException( - deltaFile(logPath, 0L), deltaVersions.last) - } - versionToLoad.foreach { version => - require(deltaVersions.last == version, - s"Did not get the last delta file version: $version to compute Snapshot") - } - - val latestCommit = deltas.last - LogSegment( - logPath, - deltaVersion(latestCommit.getPath), // deltas is not empty, so can call .last - deltas, - Nil, - None, - latestCommit.getModificationTime) - } - } - - /** - * Load the Snapshot for this Delta table at initialization. This method uses the `lastCheckpoint` - * file as a hint on where to start listing the transaction log directory. If the _delta_log - * directory doesn't exist, this method will return an `InitialSnapshot`. - */ - protected def getSnapshotAtInit: SnapshotImpl = { - try { - val logSegment = getLogSegmentForVersion(lastCheckpoint.map(_.version)) - - val startCheckpoint = logSegment.checkpointVersion - .map(v => s" starting from checkpoint $v.").getOrElse(".") - logInfo(s"Loading version ${logSegment.version}$startCheckpoint") - - val snapshot = createSnapshot( - logSegment, - logSegment.lastCommitTimestamp, - previousSnapshotOpt = None // This is the `init`. There's no previous snapshot. - ) - - logInfo(s"Returning initial snapshot $snapshot") - - snapshot - } catch { - case _: FileNotFoundException => - logInfo(s"Creating initial snapshot without metadata, because the directory is empty") - new InitialSnapshotImpl(hadoopConf, logPath, this) - } - } - - /** Get the snapshot at `version`. */ - private def getSnapshotAt(version: Long): SnapshotImpl = { - if (snapshot.version == version) return snapshot - - val startingCheckpoint = findLastCompleteCheckpoint(CheckpointInstance(version, None)) - val segment = getLogSegmentForVersion(startingCheckpoint.map(_.version), Some(version)) - - // In practice, this will always be None because all callers of this method have already called - // deltaLog.update() (to determine the full list of versions, to understand the full history). - // Thus, `snapshot.version` will always be > version. (If they were equal, we would have already - // returned early above). - val previousSnapshotOpt = - if (currentSnapshot.version <= version) Some(currentSnapshot) else None - - createSnapshot( - segment, - segment.lastCommitTimestamp, - previousSnapshotOpt - ) - } - - private def createSnapshot( - segment: LogSegment, - lastCommitTimestamp: Long, - previousSnapshotOpt: Option[SnapshotImpl]): SnapshotImpl = { - - previousSnapshotOpt.foreach { previousSnapshot => - assert( - previousSnapshot.version <= segment.version, - s"Trying to create a Snapshot at version ${segment.version} yet you are passing a " + - s"newer `previousSnapshotOpt` with version ${previousSnapshot.version}." - ) - } - - new SnapshotImpl( - hadoopConf, - logPath, - segment.version, - segment, - minFileRetentionTimestamp, - this, - lastCommitTimestamp, - previousSnapshotOpt.map { previousSnapshot => - SnapshotProtocolMetadataHint( - previousSnapshot.protocolScala, previousSnapshot.metadataScala, previousSnapshot.version) - } - ) - } - - private def verifyDeltaVersions(versions: Array[Long]): Unit = { - // Turn this to a vector so that we can compare it with a range. - val deltaVersions = versions.toVector - if (deltaVersions.nonEmpty && (deltaVersions.head to deltaVersions.last) != deltaVersions) { - throw DeltaErrors.deltaVersionsNotContiguousException(deltaVersions) - } - } -} - -/** - * Provides information around which files in the transaction log need to be read to create - * the given version of the log. - * - * @param logPath The path to the _delta_log directory - * @param version The Snapshot version to generate - * @param deltas The delta files to read - * @param checkpoints The checkpoint files to read - * @param checkpointVersion The checkpoint version used to start replay - * @param lastCommitTimestamp The "unadjusted" timestamp of the last commit within this segment. By - * unadjusted, we mean that the commit timestamps may not necessarily be - * monotonically increasing for the commits within this segment. - */ -private[internal] case class LogSegment( - logPath: Path, - version: Long, - deltas: Seq[FileStatus], - checkpoints: Seq[FileStatus], - checkpointVersion: Option[Long], - lastCommitTimestamp: Long) - -private[internal] object LogSegment { - - /** The LogSegment for an empty transaction log directory. */ - def empty(path: Path): LogSegment = LogSegment(path, -1L, Nil, Nil, None, -1L) -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/actions/InMemoryLogReplay.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/actions/InMemoryLogReplay.scala deleted file mode 100644 index 7a8afb26b47..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/actions/InMemoryLogReplay.scala +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.actions - -import java.net.URI - -import org.apache.hadoop.conf.Configuration - -import io.delta.standalone.internal.SnapshotImpl.canonicalizePath - -/** - * Replays a history of action, resolving them to produce the current state - * of the table. The protocol for resolution is as follows: - * - The most recent [[AddFile]] and accompanying metadata for any `path` wins. - * - [[RemoveFile]] deletes a corresponding [[AddFile]] and is retained as a - * tombstone until `minFileRetentionTimestamp` has passed. - * - The most recent [[Metadata]] wins. - * - The most recent [[Protocol]] version wins. - * - For each path, this class should always output only one [[FileAction]] (either [[AddFile]] or - * [[RemoveFile]]) - * - * This class is not thread safe. - */ -private[internal] class InMemoryLogReplay( - hadoopConf: Configuration, - minFileRetentionTimestamp: Long) { - var currentProtocolVersion: Protocol = null - var currentVersion: Long = -1 - var currentMetaData: Metadata = null - var sizeInBytes: Long = 0 - var numMetadata: Long = 0 - var numProtocol: Long = 0 - private val transactions = new scala.collection.mutable.HashMap[String, SetTransaction]() - private val activeFiles = new scala.collection.mutable.HashMap[URI, AddFile]() - private val tombstones = new scala.collection.mutable.HashMap[URI, RemoveFile]() - - def append(version: Long, actions: Iterator[Action]): Unit = { - assert(currentVersion == -1 || version == currentVersion + 1, - s"Attempted to replay version $version, but state is at $currentVersion") - currentVersion = version - actions.foreach { - case a: SetTransaction => - transactions(a.appId) = a - case a: Metadata => - currentMetaData = a - numMetadata += 1 - case a: Protocol => - currentProtocolVersion = a - numProtocol += 1 - case add: AddFile => - val canonicalizeAdd = add.copy( - dataChange = false, - path = canonicalizePath(add.path, hadoopConf)) - activeFiles(canonicalizeAdd.pathAsUri) = canonicalizeAdd - // Remove the tombstone to make sure we only output one `FileAction`. - tombstones.remove(canonicalizeAdd.pathAsUri) - sizeInBytes += canonicalizeAdd.size - case remove: RemoveFile => - val canonicaleRemove = remove.copy( - dataChange = false, - path = canonicalizePath(remove.path, hadoopConf)) - val removedFile = activeFiles.remove(canonicaleRemove.pathAsUri) - tombstones(canonicaleRemove.pathAsUri) = canonicaleRemove - - if (removedFile.isDefined) { - sizeInBytes -= removedFile.get.size - } - case _ => // do nothing - } - } - - def getSetTransactions: Seq[SetTransaction] = transactions.values.toSeq - - def getActiveFiles: Iterable[AddFile] = activeFiles.values - - def getTombstones: Iterable[RemoveFile] = { - tombstones.values.filter(_.delTimestamp > minFileRetentionTimestamp) - } - -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/actions/MemoryOptimizedLogReplay.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/actions/MemoryOptimizedLogReplay.scala deleted file mode 100644 index 77bf7f3ce74..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/actions/MemoryOptimizedLogReplay.scala +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.actions - -import java.util.TimeZone - -import com.github.mjakubowski84.parquet4s.{ParquetIterable, ParquetReader} -import io.delta.storage.{CloseableIterator, LogStore} -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.Path - -import io.delta.standalone.internal.util.{FileNames, JsonUtils} - -/** - * Used to replay the transaction logs from the newest log file to the oldest log file, in a - * memory-efficient, lazy, iterated manner. - */ -private[internal] class MemoryOptimizedLogReplay( - files: Seq[Path], - logStore: LogStore, - val hadoopConf: Configuration, - timeZone: TimeZone) { - - /** - * @return a [[CloseableIterator]] of tuple (Action, isLoadedFromCheckpoint, tableVersion) in - * reverse transaction log order - */ - def getReverseIterator: CloseableIterator[(Action, Boolean, Long)] = - new CloseableIterator[(Action, Boolean, Long)] { - private val reverseFilesIter: Iterator[Path] = files.sortWith(_.getName > _.getName).iterator - private var actionIter: Option[CloseableIterator[(Action, Boolean, Long)]] = None - - /** - * Requires that `reverseFilesIter.hasNext` is true - */ - private def getNextIter: Option[CloseableIterator[(Action, Boolean, Long)]] = { - val nextFile = reverseFilesIter.next() - - if (nextFile.getName.endsWith(".json")) { - val fileVersion = FileNames.deltaVersion(nextFile) - Some(new CustomJsonIterator(logStore.read(nextFile, hadoopConf), fileVersion)) - } else if (nextFile.getName.endsWith(".parquet")) { - val fileVersion = FileNames.checkpointVersion(nextFile) - val parquetIterable = ParquetReader.read[Parquet4sSingleActionWrapper]( - nextFile.toString, - ParquetReader.Options(timeZone, hadoopConf) - ) - Some(new CustomParquetIterator(parquetIterable, fileVersion)) - } else { - throw new IllegalStateException(s"unexpected log file path: $nextFile") - } - } - - /** - * If the current `actionIter` has no more elements, this function repeatedly reads the next - * file, if it exists, and creates the next `actionIter` until we find a non-empty file. - */ - private def ensureNextIterIsReady(): Unit = { - // this iterator already has a next element, we can return early - if (actionIter.exists(_.hasNext)) return - - actionIter.foreach(_.close()) - actionIter = None - - // there might be empty files. repeat until we find a non-empty file or run out of files - while (reverseFilesIter.hasNext) { - actionIter = getNextIter - - if (actionIter.exists(_.hasNext)) return - - // it was an empty file - actionIter.foreach(_.close()) - actionIter = None - } - } - - override def hasNext: Boolean = { - ensureNextIterIsReady() - - // from the semantics of `ensureNextIterIsReady()`, if `actionIter` is defined then it is - // guaranteed to have a next element - actionIter.isDefined - } - - override def next(): (Action, Boolean, Long) = { - if (!hasNext()) throw new NoSuchElementException - - if (actionIter.isEmpty) throw new IllegalStateException("Impossible") - - actionIter.get.next() - } - - override def close(): Unit = { - actionIter.foreach(_.close()) - } - } -} - -/////////////////////////////////////////////////////////////////////////// -// Helper Classes -/////////////////////////////////////////////////////////////////////////// - -private class CustomJsonIterator(iter: CloseableIterator[String], version: Long) - extends CloseableIterator[(Action, Boolean, Long)] { - - override def hasNext: Boolean = iter.hasNext - - override def next(): (Action, Boolean, Long) = { - (JsonUtils.mapper.readValue[SingleAction](iter.next()).unwrap, false, version) - } - - override def close(): Unit = iter.close() -} - -private class CustomParquetIterator( - iterable: ParquetIterable[Parquet4sSingleActionWrapper], - version: Long) - extends CloseableIterator[(Action, Boolean, Long)] { - - private val iter = iterable.iterator - - override def hasNext: Boolean = iter.hasNext - - override def next(): (Action, Boolean, Long) = { - (iter.next().unwrap.unwrap, true, version) - } - - override def close(): Unit = iterable.close() -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/actions/actions.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/actions/actions.scala deleted file mode 100644 index a005b25a89d..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/actions/actions.scala +++ /dev/null @@ -1,459 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.actions - -import java.net.URI -import java.sql.Timestamp - -import com.fasterxml.jackson.annotation.{JsonIgnore, JsonInclude, JsonRawValue} -import com.fasterxml.jackson.core.JsonGenerator -import com.fasterxml.jackson.databind.{JsonSerializer, SerializerProvider} -import com.fasterxml.jackson.databind.annotation.{JsonDeserialize, JsonSerialize} - -import io.delta.standalone.types.StructType - -import io.delta.standalone.internal.util.{DataTypeParser, JsonUtils} - -private[internal] object Action { - /** The maximum version of the protocol that this version of Delta Standalone understands. */ - val readerVersion = 1 - val writerVersion = 2 - val protocolVersion: Protocol = Protocol(readerVersion, writerVersion) - - def fromJson(json: String): Action = { - JsonUtils.mapper.readValue[SingleAction](json).unwrap - } -} - -/** - * Represents a single change to the state of a Delta table. An order sequence - * of actions can be replayed using [[InMemoryLogReplay]] to derive the state - * of the table at a given point in time. - */ -private[internal] sealed trait Action { - def wrap: SingleAction - - def json: String = JsonUtils.toJson(wrap) -} - -/** - * Used to block older clients from reading or writing the log when backwards - * incompatible changes are made to the protocol. Readers and writers are - * responsible for checking that they meet the minimum versions before performing - * any other operations. - * - * Since this action allows us to explicitly block older clients in the case of a - * breaking change to the protocol, clients should be tolerant of messages and - * fields that they do not understand. - */ -private[internal] case class Protocol( - minReaderVersion: Int = Action.readerVersion, - minWriterVersion: Int = Action.writerVersion) extends Action { - override def wrap: SingleAction = SingleAction(protocol = this) - - @JsonIgnore - def simpleString: String = s"($minReaderVersion,$minWriterVersion)" -} - -private[internal] object Protocol { - val MIN_READER_VERSION_PROP = "delta.minReaderVersion" - val MIN_WRITER_VERSION_PROP = "delta.minWriterVersion" - - def checkMetadataProtocolProperties(metadata: Metadata, protocol: Protocol): Unit = { - assert(!metadata.configuration.contains(MIN_READER_VERSION_PROP), s"Should not have the " + - s"protocol version ($MIN_READER_VERSION_PROP) as part of table properties") - assert(!metadata.configuration.contains(MIN_WRITER_VERSION_PROP), s"Should not have the " + - s"protocol version ($MIN_WRITER_VERSION_PROP) as part of table properties") - } -} - -/** -* Sets the committed version for a given application. Used to make operations -* like streaming append idempotent. -*/ -private[internal] case class SetTransaction( - appId: String, - version: Long, - @JsonDeserialize(contentAs = classOf[java.lang.Long]) - lastUpdated: Option[Long]) extends Action { - override def wrap: SingleAction = SingleAction(txn = this) -} - -/** Actions pertaining to the addition and removal of files. */ -private[internal] sealed trait FileAction extends Action { - val path: String - val dataChange: Boolean - @JsonIgnore - lazy val pathAsUri: URI = new URI(path) -} - -/** - * Adds a new file to the table. When multiple [[AddFile]] file actions - * are seen with the same `path` only the metadata from the last one is - * kept. - */ -private[internal] case class AddFile( - path: String, - @JsonInclude(JsonInclude.Include.ALWAYS) - partitionValues: Map[String, String], - size: Long, - modificationTime: Long, - dataChange: Boolean, - @JsonRawValue - stats: String = null, - tags: Map[String, String] = null) extends FileAction { - require(path.nonEmpty) - - override def wrap: SingleAction = SingleAction(add = this) - - def remove: RemoveFile = removeWithTimestamp() - - def removeWithTimestamp( - timestamp: Long = System.currentTimeMillis(), - dataChange: Boolean = true): RemoveFile = { - // scalastyle:off - RemoveFile(path, Some(timestamp), dataChange) - // scalastyle:on - } -} - -/** - * Logical removal of a given file from the reservoir. Acts as a tombstone before a file is - * deleted permanently. - * - * Note that for protocol compatibility reasons, the fields `partitionValues`, `size`, and `tags` - * are only present when the extendedFileMetadata flag is true. New writers should generally be - * setting this flag, but old writers (and FSCK) won't, so readers must check this flag before - * attempting to consume those values. - */ -private[internal] case class RemoveFile( - path: String, - @JsonDeserialize(contentAs = classOf[java.lang.Long]) - deletionTimestamp: Option[Long], - dataChange: Boolean = true, - extendedFileMetadata: Boolean = false, - partitionValues: Map[String, String] = null, - @JsonDeserialize(contentAs = classOf[java.lang.Long]) - size: Option[Long] = None, - tags: Map[String, String] = null) extends FileAction { - override def wrap: SingleAction = SingleAction(remove = this) - - @JsonIgnore - val delTimestamp: Long = deletionTimestamp.getOrElse(0L) -} - -/** - * A change file containing CDC data for the Delta version it's within. Non-CDC readers should - * ignore this, CDC readers should scan all ChangeFiles in a version rather than computing - * changes from AddFile and RemoveFile actions. - */ -private[internal] case class AddCDCFile( - path: String, - partitionValues: Map[String, String], - size: Long, - tags: Map[String, String] = null) extends FileAction { - override val dataChange = false - - override def wrap: SingleAction = SingleAction(cdc = this) -} - -private[internal] case class Format( - provider: String = "parquet", - options: Map[String, String] = Map.empty) - -/** - * Updates the metadata of the table. Only the last update to the [[Metadata]] - * of a table is kept. It is the responsibility of the writer to ensure that - * any data already present in the table is still valid after any change. - */ -private[internal] case class Metadata( - id: String = java.util.UUID.randomUUID().toString, - name: String = null, - description: String = null, - format: Format = Format(), - schemaString: String = null, - partitionColumns: Seq[String] = Nil, - configuration: Map[String, String] = Map.empty, - @JsonDeserialize(contentAs = classOf[java.lang.Long]) - createdTime: Option[Long] = Some(System.currentTimeMillis())) extends Action { - - /** Returns the schema as a [[StructType]] */ - @JsonIgnore - lazy val schema: StructType = - Option(schemaString).map { s => - DataTypeParser.fromJson(s).asInstanceOf[StructType] - }.getOrElse(new StructType(Array.empty)) - - /** Columns written out to files. */ - @JsonIgnore - lazy val dataSchema: StructType = { - val partitions = partitionColumns.toSet - new StructType(schema.getFields.filterNot(f => partitions.contains(f.getName))) - } - - /** Returns the partitionSchema as a [[StructType]] */ - @JsonIgnore - lazy val partitionSchema: StructType = - new StructType(partitionColumns.map(c => schema.get(c)).toArray) - - override def wrap: SingleAction = SingleAction(metaData = this) -} - -/** - * Interface for objects that represents the information for a commit. Commits can be referred to - * using a version and timestamp. The timestamp of a commit comes from the remote storage - * `lastModifiedTime`, and can be adjusted for clock skew. Hence we have the method `withTimestamp`. - */ -private[internal] trait CommitMarker { - /** Get the timestamp of the commit as millis after the epoch. */ - def getTimestamp: Long - /** Return a copy object of this object with the given timestamp. */ - def withTimestamp(timestamp: Long): CommitMarker - /** Get the version of the commit. */ - def getVersion: Long -} - -/** - * Holds provenance information about changes to the table. This [[Action]] - * is not stored in the checkpoint and has reduced compatibility guarantees. - * Information stored in it is best effort (i.e. can be falsified by the writer). - */ -private[internal] case class CommitInfo( - // The commit version should be left unfilled during commit(). When reading a delta file, we can - // infer the commit version from the file name and fill in this field then. - @JsonDeserialize(contentAs = classOf[java.lang.Long]) - version: Option[Long], - timestamp: Timestamp, - userId: Option[String], - userName: Option[String], - operation: String, - @JsonSerialize(using = classOf[JsonMapSerializer]) - operationParameters: Map[String, String], - job: Option[JobInfo], - notebook: Option[NotebookInfo], - clusterId: Option[String], - @JsonDeserialize(contentAs = classOf[java.lang.Long]) - readVersion: Option[Long], - isolationLevel: Option[String], - /** Whether this commit has blindly appended without caring about existing files */ - isBlindAppend: Option[Boolean], - operationMetrics: Option[Map[String, String]], - userMetadata: Option[String], - engineInfo: Option[String]) extends Action with CommitMarker { - override def wrap: SingleAction = SingleAction(commitInfo = this) - - override def withTimestamp(timestamp: Long): CommitInfo = { - this.copy(timestamp = new Timestamp(timestamp)) - } - - override def getTimestamp: Long = timestamp.getTime - @JsonIgnore - override def getVersion: Long = version.get -} - -private[internal] object CommitInfo { - def empty(version: Option[Long] = None): CommitInfo = { - CommitInfo(version, null, None, None, null, null, None, None, - None, None, None, None, None, None, None) - } - - def apply( - time: Long, - operation: String, - operationParameters: Map[String, String], - commandContext: Map[String, String], - readVersion: Option[Long], - isolationLevel: Option[String], - isBlindAppend: Option[Boolean], - operationMetrics: Option[Map[String, String]], - userMetadata: Option[String], - engineInfo: Option[String]): CommitInfo = { - val getUserName = commandContext.get("user").flatMap { - case "unknown" => None - case other => Option(other) - } - - CommitInfo( - None, - new Timestamp(time), - commandContext.get("userId"), - getUserName, - operation, - operationParameters, - JobInfo.fromContext(commandContext), - NotebookInfo.fromContext(commandContext), - commandContext.get("clusterId"), - readVersion, - isolationLevel, - isBlindAppend, - operationMetrics, - userMetadata, - engineInfo - ) - } -} - -private[internal] case class JobInfo( - jobId: String, - jobName: String, - runId: String, - jobOwnerId: String, - triggerType: String) - -private[internal] object JobInfo { - def fromContext(context: Map[String, String]): Option[JobInfo] = { - context.get("jobId").map { jobId => - JobInfo( - jobId, - context.get("jobName").orNull, - context.get("runId").orNull, - context.get("jobOwnerId").orNull, - context.get("jobTriggerType").orNull) - } - } -} - -private[internal] case class NotebookInfo(notebookId: String) - -private[internal] object NotebookInfo { - def fromContext(context: Map[String, String]): Option[NotebookInfo] = { - context.get("notebookId").map { nbId => NotebookInfo(nbId) } - } -} - -/** A serialization helper to create a common action envelope. */ -private[internal] case class SingleAction( - txn: SetTransaction = null, - add: AddFile = null, - remove: RemoveFile = null, - metaData: Metadata = null, - protocol: Protocol = null, - cdc: AddCDCFile = null, - commitInfo: CommitInfo = null) { - - def unwrap: Action = { - if (add != null) { - add - } else if (remove != null) { - remove - } else if (metaData != null) { - metaData - } else if (txn != null) { - txn - } else if (protocol != null) { - protocol - } else if (cdc != null) { - cdc - } else if (commitInfo != null) { - commitInfo - } else { - null - } - } -} - -/** Serializes Maps containing JSON strings without extra escaping. */ -private[internal] class JsonMapSerializer extends JsonSerializer[Map[String, String]] { - def serialize( - parameters: Map[String, String], - jgen: JsonGenerator, - provider: SerializerProvider): Unit = { - jgen.writeStartObject() - parameters.foreach { case (key, value) => - if (value == null) { - jgen.writeNullField(key) - } else { - jgen.writeFieldName(key) - // Write value as raw data, since it's already JSON text - jgen.writeRawValue(value) - } - } - jgen.writeEndObject() - } -} - -/** - * Parquet4s Wrapper Classes - * - * With the inclusion of RemoveFile as an exposed Java API, and since it was upgraded to match the - * latest Delta OSS release, we now had a case class inside of [[SingleAction]] that had "primitive" - * default parameters. They are primitive in the sense that Parquet4s would try to decode them using - * the [[PrimitiveValueCodecs]] trait. But since these parameters have default values, there is no - * guarantee that they will exist in the underlying parquet checkpoint files. Thus (without these - * classes), parquet4s would throw errors like this: - * - * Cause: java.lang.IllegalArgumentException: NullValue cannot be decoded to required type - * at com.github.mjakubowski84.parquet4s.RequiredValueCodec.decode(ValueCodec.scala:61) - * at com.github.mjakubowski84.parquet4s.RequiredValueCodec.decode$(ValueCodec.scala:58) - * at com.github.mjakubowski84.parquet4s.PrimitiveValueCodecs$$anon$5.decode(ValueCodec.scala:137) - * - * Note this only happens with "primitive" parameters with default arguments, and not with "complex" - * or optional constructor parameters. - * - * We solve this issue by creating wrapper classes that wrap these primitive constructor parameters - * in [[Option]]s, and then un-wrapping them as needed, performing the appropriate Option[T] => T - * parameter conversions. - */ - -private[internal] trait Parquet4sWrapper[T] { - def unwrap: T -} - -private[internal] case class Parquet4sRemoveFileWrapper( - path: String, - @JsonDeserialize(contentAs = classOf[java.lang.Long]) - deletionTimestamp: Option[Long], - dataChangeOpt: Option[Boolean] = Some(true), - extendedFileMetadataOpt: Option[Boolean] = Some(false), - partitionValues: Map[String, String] = null, - @JsonDeserialize(contentAs = classOf[java.lang.Long]) - size: Option[Long] = None, - tags: Map[String, String] = null) extends Parquet4sWrapper[RemoveFile] { - - override def unwrap: RemoveFile = RemoveFile( - path, - deletionTimestamp, - dataChangeOpt.contains(true), - extendedFileMetadataOpt.contains(true), - partitionValues, - size, - tags - ) -} - -private[internal] case class Parquet4sSingleActionWrapper( - txn: SetTransaction = null, - add: AddFile = null, - remove: Parquet4sRemoveFileWrapper = null, - metaData: Metadata = null, - protocol: Protocol = null, - cdc: AddCDCFile = null, - commitInfo: CommitInfo = null) extends Parquet4sWrapper[SingleAction] { - - override def unwrap: SingleAction = SingleAction( - txn, - add, - remove match { - case x: Parquet4sRemoveFileWrapper if x != null => x.unwrap - case _ => null - }, - metaData, - protocol, - cdc, - commitInfo - ) -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/data/CloseableParquetDataIterator.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/data/CloseableParquetDataIterator.scala deleted file mode 100644 index a1fe7cbe544..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/data/CloseableParquetDataIterator.scala +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.data - -import java.util.TimeZone - -import com.github.mjakubowski84.parquet4s._ -import com.github.mjakubowski84.parquet4s.ParquetReader.Options -import org.apache.hadoop.conf.Configuration - -import io.delta.standalone.data.{CloseableIterator, RowRecord => RowParquetRecordJ} -import io.delta.standalone.types._ - -/** - * A [[CloseableIterator]] over [[RowParquetRecordJ]]s. - * - * Iterates file by file, row by row. - * - * @param dataFilePathsAndPartitions Seq of (file path, file partitions) tuples to iterate over, - * not null - * @param schema for file data and partition values, not null. Used to read and verify the parquet - * data in file and partition data - * @param readTimeZone time zone ID for data, not null. Used to ensure proper Date and Timestamp - * decoding - */ -private[internal] case class CloseableParquetDataIterator( - dataFilePathsAndPartitions: Seq[(String, Map[String, String])], - schema: StructType, - readTimeZone: TimeZone, - hadoopConf: Configuration) extends CloseableIterator[RowParquetRecordJ] { - - private val dataFilePathsAndPartitionsIter = dataFilePathsAndPartitions.iterator - - /** - * Iterable resource that allows for iteration over the parquet rows of a single file. - * Must be closed. - */ - private var parquetRows = if (dataFilePathsAndPartitionsIter.hasNext) readNextFile else null - - /** - * Deserialized partition values. This variable gets updated every time `readNextFile` is called - * - * It makes more sense to deserialize partition values once per file than N times for each N row - * in a file. - */ - private var partitionValues: Map[String, Any] = _ - - /** - * Actual iterator over the parquet rows. - * - * We want this as its own variable, instead of calling `parquetRows.iterator.hasNext` or - * `parquetRows.iterator.next`, as that returns a new iterator instance each time, thus restarting - * at the head. - */ - private var parquetRowsIter = if (null != parquetRows) parquetRows.iterator else null - - /** - * @return true if there is next row of data in the current `dataFilePathsAndPartitions` file - * OR a row of data in the next `dataFilePathsAndPartitionsIter` file, else false - */ - override def hasNext: Boolean = { - // Base case when initialized to null - if (null == parquetRows || null == parquetRowsIter) { - close() - return false - } - - // We need to search for the next non-empty file - while (true) { - // More rows in current file - if (parquetRowsIter.hasNext) return true - - // No more rows in current file and no more files - if (!dataFilePathsAndPartitionsIter.hasNext) { - close() - return false - } - - // No more rows in this file, but there is a next file - parquetRows.close() - - // Repeat the search at the next file - parquetRows = readNextFile - parquetRowsIter = parquetRows.iterator - } - - // Impossible - throw new RuntimeException("Some bug in CloseableParquetDataIterator::hasNext") - } - - /** - * @return the next row of data the current `dataFilePathsAndPartitionsIter` file - * OR the first row of data in the next `dataFilePathsAndPartitionsIter` file - * @throws NoSuchElementException if there is no next row of data - */ - override def next(): RowParquetRecordJ = { - if (!hasNext()) throw new NoSuchElementException - val row = parquetRowsIter.next() - RowParquetRecordImpl(row, schema, readTimeZone, partitionValues) - } - - /** - * Closes the `parquetRows` iterable and sets fields to null, ensuring that all following calls - * to `hasNext` return false - */ - override def close(): Unit = { - if (null != parquetRows) { - parquetRows.close() - parquetRows = null - parquetRowsIter = null - } - } - - /** - * Requires that `dataFilePathsAndPartitionsIter.hasNext` is true. - * - * @return the iterable for the next data file in `dataFilePathsAndPartitionsIter`, not null - */ - private def readNextFile: ParquetIterable[RowParquetRecord] = { - val (nextDataFilePath, nextPartitionVals) = dataFilePathsAndPartitionsIter.next() - - partitionValues = Map() - - if (null != nextPartitionVals) { - nextPartitionVals.foreach { case (fieldName, value) => - if (value == null) { - partitionValues += (fieldName -> null) - } else { - val schemaField = schema.get(fieldName) - if (schemaField != null) { - val decodedFieldValue = decodePartition(schemaField.getDataType, value) - partitionValues += (fieldName -> decodedFieldValue) - } else { - throw new IllegalStateException(s"StructField with name $schemaField was null.") - } - } - } - } - - ParquetReader.read[RowParquetRecord]( - nextDataFilePath, Options(timeZone = readTimeZone, hadoopConf = hadoopConf)) - } - - /** - * Follows deserialization as specified here - * https://github.com/delta-io/delta/blob/master/PROTOCOL.md#Partition-Value-Serialization - */ - private def decodePartition(elemType: DataType, partitionVal: String): Any = { - elemType match { - case _: StringType => partitionVal - case _: TimestampType => java.sql.Timestamp.valueOf(partitionVal) - case _: DateType => java.sql.Date.valueOf(partitionVal) - case _: IntegerType => partitionVal.toInt - case _: LongType => partitionVal.toLong - case _: ByteType => partitionVal.toByte - case _: ShortType => partitionVal.toShort - case _: BooleanType => partitionVal.toBoolean - case _: FloatType => partitionVal.toFloat - case _: DoubleType => partitionVal.toDouble - case _: DecimalType => new java.math.BigDecimal(partitionVal) - case _: BinaryType => partitionVal.getBytes("UTF-8") - case _ => - throw new RuntimeException(s"Unknown decode type ${elemType.getTypeName}, $partitionVal") - } - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/data/PartitionRowRecord.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/data/PartitionRowRecord.scala deleted file mode 100644 index 707e72845ab..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/data/PartitionRowRecord.scala +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.data - -import java.math.{BigDecimal => BigDecimalJ} -import java.sql.{Date, Timestamp} - -import io.delta.standalone.data.{RowRecord => RowRecordJ} -import io.delta.standalone.types._ - -import io.delta.standalone.internal.exception.DeltaErrors - -/** - * A RowRecord representing a Delta Lake partition of Map(partitionKey -> partitionValue) - */ -private[internal] class PartitionRowRecord( - partitionSchema: StructType, - partitionValues: Map[String, String]) extends RowRecordJ { - - require(partitionSchema.getFieldNames.toSet == partitionValues.keySet, - s""" - |Column mismatch between partitionSchema and partitionValues. - |partitionSchema: ${partitionSchema.getFieldNames.mkString(", ")} - |partitionValues: ${partitionValues.keySet.mkString(", ")} - |""".stripMargin) - - private def getPrimitive(field: StructField): String = { - val partitionValue = partitionValues(field.getName) - if (partitionValue == null) throw DeltaErrors.nullValueFoundForPrimitiveTypes(field.getName) - partitionValue - } - - private def getNonPrimitive(field: StructField): Option[String] = { - val partitionValue = partitionValues(field.getName) - if (partitionValue == null) { - if (!field.isNullable) { - throw DeltaErrors.nullValueFoundForNonNullSchemaField(field.getName, partitionSchema) - } - None - } else Some(partitionValue) - } - - override def getSchema: StructType = partitionSchema - - override def getLength: Int = partitionSchema.getFieldNames.length - - override def isNullAt(fieldName: String): Boolean = { - partitionSchema.get(fieldName) // check that the field exists - partitionValues(fieldName) == null - } - - override def getInt(fieldName: String): Int = { - val field = partitionSchema.get(fieldName) - if (!field.getDataType.isInstanceOf[IntegerType]) { - throw DeltaErrors.fieldTypeMismatch(fieldName, field.getDataType, "integer") - } - getPrimitive(field).toInt - } - - override def getLong(fieldName: String): Long = { - val field = partitionSchema.get(fieldName) - if (!field.getDataType.isInstanceOf[LongType]) { - throw DeltaErrors.fieldTypeMismatch(fieldName, field.getDataType, "long") - } - getPrimitive(field).toLong - } - - override def getByte(fieldName: String): Byte = { - val field = partitionSchema.get(fieldName) - if (!field.getDataType.isInstanceOf[ByteType]) { - throw DeltaErrors.fieldTypeMismatch(fieldName, field.getDataType, "byte") - } - getPrimitive(field).toByte - } - - override def getShort(fieldName: String): Short = { - val field = partitionSchema.get(fieldName) - if (!field.getDataType.isInstanceOf[ShortType]) { - throw DeltaErrors.fieldTypeMismatch(fieldName, field.getDataType, "short") - } - getPrimitive(field).toShort - } - - override def getBoolean(fieldName: String): Boolean = { - val field = partitionSchema.get(fieldName) - if (!field.getDataType.isInstanceOf[BooleanType]) { - throw DeltaErrors.fieldTypeMismatch(fieldName, field.getDataType, "boolean") - } - getPrimitive(field).toBoolean - } - - override def getFloat(fieldName: String): Float = { - val field = partitionSchema.get(fieldName) - if (!field.getDataType.isInstanceOf[FloatType]) { - throw DeltaErrors.fieldTypeMismatch(fieldName, field.getDataType, "float") - } - getPrimitive(field).toFloat - } - - override def getDouble(fieldName: String): Double = { - val field = partitionSchema.get(fieldName) - if (!field.getDataType.isInstanceOf[DoubleType]) { - throw DeltaErrors.fieldTypeMismatch(fieldName, field.getDataType, "double") - } - getPrimitive(field).toDouble - } - - override def getString(fieldName: String): String = { - val field = partitionSchema.get(fieldName) - if (!field.getDataType.isInstanceOf[StringType]) { - throw DeltaErrors.fieldTypeMismatch(fieldName, field.getDataType, "string") - } - getNonPrimitive(field).orNull - } - - override def getBinary(fieldName: String): Array[Byte] = { - val field = partitionSchema.get(fieldName) - if (!field.getDataType.isInstanceOf[BinaryType]) { - throw DeltaErrors.fieldTypeMismatch(fieldName, field.getDataType, "binary") - } - getNonPrimitive(field).map(_.map(_.toByte).toArray).orNull - } - - override def getBigDecimal(fieldName: String): BigDecimalJ = { - val field = partitionSchema.get(fieldName) - if (!field.getDataType.isInstanceOf[DecimalType]) { - throw DeltaErrors.fieldTypeMismatch(fieldName, field.getDataType, "decimal") - } - getNonPrimitive(field).map(new BigDecimalJ(_)).orNull - } - - override def getTimestamp(fieldName: String): Timestamp = { - val field = partitionSchema.get(fieldName) - if (!field.getDataType.isInstanceOf[TimestampType]) { - throw DeltaErrors.fieldTypeMismatch(fieldName, field.getDataType, "timestamp") - } - getNonPrimitive(field).map(Timestamp.valueOf).orNull - } - - override def getDate(fieldName: String): Date = { - val field = partitionSchema.get(fieldName) - if (!field.getDataType.isInstanceOf[DateType]) { - throw DeltaErrors.fieldTypeMismatch(fieldName, field.getDataType, "date") - } - getNonPrimitive(field).map(Date.valueOf).orNull - } - - override def getRecord(fieldName: String): RowRecordJ = { - throw new UnsupportedOperationException( - "Struct is not a supported partition type.") - } - - override def getList[T](fieldName: String): java.util.List[T] = { - throw new UnsupportedOperationException( - "Array is not a supported partition type.") - } - - override def getMap[K, V](fieldName: String): java.util.Map[K, V] = { - throw new UnsupportedOperationException( - "Map is not a supported partition type.") - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/data/RowParquetRecordImpl.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/data/RowParquetRecordImpl.scala deleted file mode 100644 index c7746a8d717..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/data/RowParquetRecordImpl.scala +++ /dev/null @@ -1,340 +0,0 @@ -// scalastyle:off -/* - * Copyright (c) 2018 Marcin Jakubowski - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* - * This file contains code from the parquet4s project (original license above). - * It contains modifications, which are licensed as follows: - */ -// scalastyle:on - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.data - -import java.sql.{Date, Timestamp} -import java.util.TimeZone - -import scala.collection.JavaConverters._ -import scala.collection.compat.Factory -import scala.reflect.ClassTag - -import com.github.mjakubowski84.parquet4s._ - -import io.delta.standalone.data.{RowRecord => RowParquetRecordJ} -import io.delta.standalone.types._ - -import io.delta.standalone.internal.exception.DeltaErrors - -/** - * Scala implementation of Java interface [[RowParquetRecordJ]]. - * - * @param record the internal parquet4s record - * @param schema the intended schema for this record - * @param timeZone the timeZone as which time-based data will be read - * @param partitionValues the deserialized partition values of current record - */ -private[internal] case class RowParquetRecordImpl( - record: RowParquetRecord, - schema: StructType, - timeZone: TimeZone, - partitionValues: Map[String, Any]) extends RowParquetRecordJ { - - /** - * Needed to decode values. Constructed with the `timeZone` to properly decode time-based data. - */ - private val codecConf = ValueCodecConfiguration(timeZone) - - /////////////////////////////////////////////////////////////////////////// - // Public API Methods - /////////////////////////////////////////////////////////////////////////// - - override def getSchema: StructType = schema - - override def getLength: Int = record.length + partitionValues.size - - override def isNullAt(fieldName: String): Boolean = { - if (partitionValues.contains(fieldName)) { // is partition field - partitionValues(fieldName) == null - } else { - record.get(fieldName) == NullValue - } - } - - override def getInt(fieldName: String): Int = getAs[Int](fieldName) - - override def getLong(fieldName: String): Long = getAs[Long](fieldName) - - override def getByte(fieldName: String): Byte = getAs[Byte](fieldName) - - override def getShort(fieldName: String): Short = getAs[Short](fieldName) - - override def getBoolean(fieldName: String): Boolean = getAs[Boolean](fieldName) - - override def getFloat(fieldName: String): Float = getAs[Float](fieldName) - - override def getDouble(fieldName: String): Double = getAs[Double](fieldName) - - override def getString(fieldName: String): String = getAs[String](fieldName) - - override def getBinary(fieldName: String): Array[Byte] = getAs[Array[Byte]](fieldName) - - override def getBigDecimal(fieldName: String): java.math.BigDecimal = - getAs[java.math.BigDecimal](fieldName) - - override def getTimestamp(fieldName: String): Timestamp = getAs[Timestamp](fieldName) - - override def getDate(fieldName: String): Date = getAs[Date](fieldName) - - override def getRecord(fieldName: String): RowParquetRecordJ = getAs[RowParquetRecordJ](fieldName) - - override def getList[T](fieldName: String): java.util.List[T] = - getAs[java.util.List[T]](fieldName) - - override def getMap[K, V](fieldName: String): java.util.Map[K, V] = - getAs[java.util.Map[K, V]](fieldName) - - /////////////////////////////////////////////////////////////////////////// - // Decoding Helper Methods - /////////////////////////////////////////////////////////////////////////// - - /** - * Decodes the parquet data into the desired type [[T]] - * - * @param fieldName the field name to lookup - * @return the data at column with name `fieldName` as type [[T]] - * @throws IllegalArgumentException if `fieldName` not in this schema - * @throws NullPointerException if field, of type [[StructField]], is not `nullable` and null data - * value read - * @throws RuntimeException if unable to decode the type [[T]] - */ - private def getAs[T](fieldName: String): T = { - val schemaField = schema.get(fieldName) - - // Partition Field - if (partitionValues.contains(fieldName)) { - if (partitionValues(fieldName) == null && !schemaField.isNullable) { - throw DeltaErrors.nullValueFoundForNonNullSchemaField(fieldName, schema) - } - - return partitionValues(fieldName).asInstanceOf[T] - } - - // Data Field - val parquetVal = record.get(fieldName) - - if (parquetVal == NullValue && !schemaField.isNullable) { - throw DeltaErrors.nullValueFoundForNonNullSchemaField(fieldName, schema) - } - - if (primitiveDecodeMap.contains(schemaField.getDataType.getTypeName) - && parquetVal == NullValue) { - throw DeltaErrors.nullValueFoundForPrimitiveTypes(fieldName) - } - - decode(schemaField.getDataType, parquetVal).asInstanceOf[T] - } - - /** - * Decode the parquet `parquetVal` into the corresponding Scala type for `elemType` - */ - private def decode(elemType: DataType, parquetVal: Value): Any = { - val elemTypeName = elemType.getTypeName - if (primitiveDecodeMap.contains(elemTypeName)) { - return primitiveDecodeMap(elemTypeName).decode(parquetVal, codecConf) - } - - if (primitiveNullableDecodeMap.contains(elemTypeName)) { - return primitiveNullableDecodeMap(elemTypeName).decode(parquetVal, codecConf) - } - - (elemType, parquetVal) match { - case (x: ArrayType, y: ListParquetRecord) => decodeList(x.getElementType, y) - case (x: MapType, y: MapParquetRecord) => decodeMap(x.getKeyType, x.getValueType, y) - case (x: StructType, y: RowParquetRecord) => RowParquetRecordImpl(y, x, timeZone, Map.empty) - case _ => - throw new RuntimeException(s"Unknown non-primitive decode type $elemTypeName, $parquetVal") - } - } - - /** - * Decode the parquet `listVal` into a [[java.util.List]], with all elements (recursive) decoded - */ - private def decodeList(elemType: DataType, listVal: ListParquetRecord): Any = { - val elemTypeName = elemType.getTypeName - - if (seqDecodeMap.contains(elemTypeName)) { - // List of primitives - return seqDecodeMap(elemTypeName).decode(listVal, codecConf).asJava - } - - elemType match { - case x: ArrayType => - // List of lists - listVal.map { case y: ListParquetRecord => - y.map(z => decode(x.getElementType, z)).asJava - }.asJava - case x: MapType => - // List of maps - listVal.map { case y: MapParquetRecord => - decodeMap(x.getKeyType, x.getValueType, y) - }.asJava - case x: StructType => - // List of records - listVal.map { - case y: RowParquetRecord => RowParquetRecordImpl(y, x, timeZone, Map.empty) - }.asJava - case _ => throw new RuntimeException(s"Unknown non-primitive list decode type $elemTypeName") - } - } - - /** - * Decode the parquet `mapVal` into a [[java.util.Map]], with all entries (recursive) decoded - */ - private def decodeMap( - keyType: DataType, - valueType: DataType, - mapVal: MapParquetRecord): java.util.Map[Any, Any] = { - mapVal.map { case (keyParquetVal, valParquetVal) => - decode(keyType, keyParquetVal) -> decode(valueType, valParquetVal) - }.toMap.asJava - } - - /////////////////////////////////////////////////////////////////////////// - // Useful Custom Decoders and type -> decoder Maps - /////////////////////////////////////////////////////////////////////////// - - /** - * parquet4s.ValueCodec.decimalCodec doesn't match on IntValue, but it should. - * - * So, we create our own version that does. - * - * It should only ever be used to decode, not encode. - */ - private val customDecimalCodec: ValueCodec[java.math.BigDecimal] = - new OptionalValueCodec[java.math.BigDecimal] { - - override def decodeNonNull( - value: Value, - configuration: ValueCodecConfiguration): java.math.BigDecimal = { - value match { - case IntValue(int) => new java.math.BigDecimal(int) - case DoubleValue(double) => BigDecimal.decimal(double).bigDecimal - case FloatValue(float) => BigDecimal.decimal(float).bigDecimal - case LongValue(long) => new java.math.BigDecimal(long) - case BinaryValue(binary) => Decimals.decimalFromBinary(binary).bigDecimal - case _ => throw new RuntimeException(s"Unknown decimal decode type $value") - } - } - - /** should NEVER be called */ - override def encodeNonNull( - data: java.math.BigDecimal, - configuration: ValueCodecConfiguration): Value = { - throw new UnsupportedOperationException("Shouldn't be encoding in the reader (decimal)") - } - } - - /** - * Decode parquet array into a [[Seq]]. - * - * parquet4s decodes all list records into [[Array]]s, but we cannot implement the Java method - * ` T[] getArray(String field)` in Scala due to type erasure. - * - * If we convert the parquet arrays, instead, into [[Seq]]s, then we can implement the Java method - * ` List getList(String fieldName)` in Scala. - * - * This should only ever be used to decode, not encode. - */ - private def customSeqCodec[T](elementCodec: ValueCodec[T])(implicit - classTag: ClassTag[T], - factory: Factory[T, Seq[T]] - ): ValueCodec[Seq[T]] = new OptionalValueCodec[Seq[T]] { - - override def decodeNonNull( - value: Value, - configuration: ValueCodecConfiguration): Seq[T] = { - value match { - case listRecord: ListParquetRecord => - listRecord.map(elementCodec.decode(_, codecConf)).toSeq - case binaryValue: BinaryValue if classTag.runtimeClass == classOf[Byte] => - binaryValue.value.getBytes.asInstanceOf[Seq[T]] - case _ => throw new RuntimeException(s"Unknown list decode type $value") - } - } - - /** should NEVER be called */ - override def encodeNonNull( - data: Seq[T], - configuration: ValueCodecConfiguration): Value = { - throw new UnsupportedOperationException("Shouldn't be encoding in the reader (seq)") - } - } - - private val primitiveDecodeMap = Map( - new IntegerType().getTypeName -> ValueCodec.intCodec, - new LongType().getTypeName -> ValueCodec.longCodec, - new ByteType().getTypeName -> ValueCodec.byteCodec, - new ShortType().getTypeName -> ValueCodec.shortCodec, - new BooleanType().getTypeName -> ValueCodec.booleanCodec, - new FloatType().getTypeName -> ValueCodec.floatCodec, - new DoubleType().getTypeName -> ValueCodec.doubleCodec - ) - - private val primitiveNullableDecodeMap = Map( - new StringType().getTypeName -> ValueCodec.stringCodec, - new BinaryType().getTypeName -> ValueCodec.arrayCodec[Byte, Array], - new DecimalType(1, 1).getTypeName -> customDecimalCodec, - new TimestampType().getTypeName -> ValueCodec.sqlTimestampCodec, - new DateType().getTypeName -> ValueCodec.sqlDateCodec - ) - - private val seqDecodeMap = Map( - new IntegerType().getTypeName -> customSeqCodec[Int](ValueCodec.intCodec), - new LongType().getTypeName -> customSeqCodec[Long](ValueCodec.longCodec), - new ByteType().getTypeName -> customSeqCodec[Byte](ValueCodec.byteCodec), - new ShortType().getTypeName -> customSeqCodec[Short](ValueCodec.shortCodec), - new BooleanType().getTypeName -> customSeqCodec[Boolean](ValueCodec.booleanCodec), - new FloatType().getTypeName -> customSeqCodec[Float](ValueCodec.floatCodec), - new DoubleType().getTypeName -> customSeqCodec[Double](ValueCodec.doubleCodec), - new StringType().getTypeName -> customSeqCodec[String](ValueCodec.stringCodec), - new BinaryType().getTypeName -> customSeqCodec[Array[Byte]](ValueCodec.arrayCodec[Byte, Array]), - new DecimalType(1, 1).getTypeName -> - customSeqCodec[java.math.BigDecimal](customDecimalCodec), - new TimestampType().getTypeName -> customSeqCodec[Timestamp](ValueCodec.sqlTimestampCodec), - new DateType().getTypeName -> customSeqCodec[Date](ValueCodec.sqlDateCodec) - ) -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/exception/DeltaErrors.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/exception/DeltaErrors.scala deleted file mode 100644 index 6b39b4f93c9..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/exception/DeltaErrors.scala +++ /dev/null @@ -1,360 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.exception - -import java.io.{FileNotFoundException, IOException} - -import scala.annotation.varargs - -import org.apache.hadoop.fs.Path - -import io.delta.standalone.exceptions._ -import io.delta.standalone.types.{DataType, StructType} - -import io.delta.standalone.internal.actions.{CommitInfo, Protocol} -import io.delta.standalone.internal.util.JsonUtils - -/** A holder object for Delta errors. */ -private[internal] object DeltaErrors { - - /** - * Thrown when the protocol version of a table is greater than the one supported by this client - */ - class InvalidProtocolVersionException( - clientProtocol: Protocol, - tableProtocol: Protocol) extends RuntimeException( - s""" - |Delta protocol version ${tableProtocol.simpleString} is too new for this version of Delta - |Standalone Reader/Writer ${clientProtocol.simpleString}. Please upgrade to a newer release. - |""".stripMargin) - - val EmptyCheckpointErrorMessage = - s""" - |Attempted to write an empty checkpoint without any actions. This checkpoint will not be - |useful in recomputing the state of the table. However this might cause other checkpoints to - |get deleted based on retention settings. - """.stripMargin - - def deltaVersionsNotContiguousException(deltaVersions: Seq[Long]): Throwable = { - new IllegalStateException(s"Versions ($deltaVersions) are not contiguous.") - } - - def actionNotFoundException(action: String, version: Long): Throwable = { - new IllegalStateException( - s""" - |The $action of your Delta table couldn't be recovered while Reconstructing - |version: ${version.toString}. Did you manually delete files in the _delta_log directory? - """.stripMargin) - } - - def emptyDirectoryException(directory: String): Throwable = { - new FileNotFoundException(s"No file found in the directory: $directory.") - } - - def logFileNotFoundException( - path: Path, - version: Long): Throwable = { - new FileNotFoundException(s"$path: Unable to reconstruct state at version $version as the " + - s"transaction log has been truncated due to manual deletion or the log retention policy ") - } - - def missingPartFilesException(version: Long, e: Exception): Throwable = { - new IllegalStateException( - s"Couldn't find all part files of the checkpoint version: $version", e) - } - - def noReproducibleHistoryFound(logPath: Path): DeltaStandaloneException = { - new DeltaStandaloneException(s"No reproducible commits found at $logPath") - } - - def timestampEarlierThanTableFirstCommit( - userTimestamp: java.sql.Timestamp, - commitTs: java.sql.Timestamp): Throwable = { - new IllegalArgumentException( - s"""The provided timestamp ($userTimestamp) is before the earliest version available to this - |table ($commitTs). Please use a timestamp greater than or equal to $commitTs. - """.stripMargin) - } - - def timestampLaterThanTableLastCommit( - userTimestamp: java.sql.Timestamp, - commitTs: java.sql.Timestamp): Throwable = { - new IllegalArgumentException( - s"""The provided timestamp ($userTimestamp) is after the latest version available to this - |table ($commitTs). Please use a timestamp less than or equal to $commitTs. - """.stripMargin) - } - - def noHistoryFound(logPath: Path): DeltaStandaloneException = { - new DeltaStandaloneException(s"No commits found at $logPath") - } - - def versionNotExistException(userVersion: Long, earliest: Long, latest: Long): Throwable = { - new DeltaStandaloneException(s"Cannot time travel Delta table to version $userVersion. " + - s"Available versions: [$earliest, $latest].") - } - - def nullValueFoundForPrimitiveTypes(fieldName: String): Throwable = { - new NullPointerException(s"Read a null value for field $fieldName which is a primitive type.") - } - - def nullValueFoundForNonNullSchemaField(fieldName: String, schema: StructType): Throwable = { - new NullPointerException(s"Read a null value for field $fieldName, yet schema indicates " + - s"that this field can't be null. Schema: ${schema.getTreeString}") - } - - /** - * Thrown when a user tries to get a value of type `desiredType` from a - * [[io.delta.standalone.expressions.Column]] with name `fieldName` and dataType `actualType`, - * but `actualType` and `desiredType` are not the same. - */ - def fieldTypeMismatch( - fieldName: String, - actualType: DataType, - desiredType: String): Throwable = { - new ClassCastException( - s"The data type of field $fieldName is ${actualType.getTypeName}. " + - s"Cannot cast it to $desiredType") - } - - def failOnDataLossException(expectedVersion: Long, seenVersion: Long): Throwable = { - new IllegalStateException( - s"""The stream from your Delta table was expecting process data from version $expectedVersion, - |but the earliest available version in the _delta_log directory is $seenVersion. The files - |in the transaction log may have been deleted due to log cleanup. - | - |If you would like to ignore the missed data and continue your stream from where it left - |off, you can set the .option("failOnDataLoss", "false") as part - |of your readStream statement. - """.stripMargin - ) - } - - def metadataAbsentException(): Throwable = { - new IllegalStateException( - "Couldn't find Metadata while committing the first version of the Delta table.") - } - - def addFilePartitioningMismatchException( - addFilePartitions: Seq[String], - metadataPartitions: Seq[String]): Throwable = { - new IllegalStateException( - s""" - |The AddFile contains partitioning schema different from the table's partitioning schema - |expected: ${DeltaErrors.formatColumnList(metadataPartitions)} - |actual: ${DeltaErrors.formatColumnList(addFilePartitions)} - """.stripMargin) - } - - def modifyAppendOnlyTableException: Throwable = { - new UnsupportedOperationException( - "This table is configured to only allow appends. If you would like to permit " + - s"updates or deletes, use 'ALTER TABLE SET TBLPROPERTIES " + - s"(appendOnly=false)'.") - } - - def invalidColumnName(name: String): DeltaStandaloneException = { - new DeltaStandaloneException( - s"""Attribute name "$name" contains invalid character(s) among " ,;{}()\\n\\t=". - |Please use alias to rename it. - """.stripMargin.split("\n").mkString(" ").trim) - } - - def invalidPartitionColumn(e: RuntimeException): DeltaStandaloneException = { - new DeltaStandaloneException( - """Found partition columns having invalid character(s) among " ,;{}()\n\t=". Please """ + - "change the name to your partition columns. This check can be turned off by setting " + - """spark.conf.set("spark.databricks.delta.partitionColumnValidity.enabled", false) """ + - "however this is not recommended as other features of Delta may not work properly.", - e) - } - - def incorrectLogStoreImplementationException(cause: Throwable): Throwable = { - new IOException(s""" - |The error typically occurs when the default LogStore implementation, that - |is, HDFSLogStore, is used to write into a Delta table on a non-HDFS storage system. - |In order to get the transactional ACID guarantees on table updates, you have to use the - |correct implementation of LogStore that is appropriate for your storage system. - |See https://docs.delta.io/latest/delta-storage.html for details. - """.stripMargin, cause) - } - - def concurrentModificationExceptionMsg( - baseMessage: String, - commit: Option[CommitInfo]): String = { - baseMessage + - commit.map(ci => s"\nConflicting commit: ${JsonUtils.toJson(ci)}").getOrElse("") + - s"\nRefer to https://docs.delta.io/latest/concurrency-control.html for more details." - } - - def metadataChangedException( - conflictingCommit: Option[CommitInfo]): MetadataChangedException = { - val message = DeltaErrors.concurrentModificationExceptionMsg( - "The metadata of the Delta table has been changed by a concurrent update. " + - "Please try the operation again.", - conflictingCommit) - new MetadataChangedException(message) - } - - def protocolChangedException(conflictingCommit: Option[CommitInfo]): ProtocolChangedException = { - val additionalInfo = conflictingCommit.map { v => - if (v.version.getOrElse(-1) == 0) { - "This happens when multiple writers are writing to an empty directory. " + - "Creating the table ahead of time will avoid this conflict. " - } else { - "" - } - }.getOrElse("") - - val message = DeltaErrors.concurrentModificationExceptionMsg( - "The protocol version of the Delta table has been changed by a concurrent update. " + - additionalInfo + "Please try the operation again.", - conflictingCommit) - new ProtocolChangedException(message) - } - - def concurrentAppendException( - conflictingCommit: Option[CommitInfo], - partition: String): ConcurrentAppendException = { - val message = DeltaErrors.concurrentModificationExceptionMsg( - s"Files were added to $partition by a concurrent update. " + - s"Please try the operation again.", - conflictingCommit) - new ConcurrentAppendException(message) - } - - def concurrentDeleteReadException( - conflictingCommit: Option[CommitInfo], - file: String): ConcurrentDeleteReadException = { - val message = DeltaErrors.concurrentModificationExceptionMsg( - "This transaction attempted to read one or more files that were deleted" + - s" (for example $file) by a concurrent update. Please try the operation again.", - conflictingCommit) - new ConcurrentDeleteReadException(message) - } - - def concurrentDeleteDeleteException( - conflictingCommit: Option[CommitInfo], - file: String): ConcurrentDeleteDeleteException = { - val message = DeltaErrors.concurrentModificationExceptionMsg( - "This transaction attempted to delete one or more files that were deleted " + - s"(for example $file) by a concurrent update. Please try the operation again.", - conflictingCommit) - new ConcurrentDeleteDeleteException(message) - } - - def concurrentTransactionException( - conflictingCommit: Option[CommitInfo]): ConcurrentTransactionException = { - val message = DeltaErrors.concurrentModificationExceptionMsg( - s"This error occurs when multiple streaming queries are using the same checkpoint to write " + - "into this table. Did you run multiple instances of the same streaming query" + - " at the same time?", - conflictingCommit) - new ConcurrentTransactionException(message) - } - - def maxCommitRetriesExceededException( - attemptNumber: Int, - attemptVersion: Long, - initAttemptVersion: Long, - numActions: Int, - totalCommitAttemptTime: Long): Throwable = { - new IllegalStateException( - s"""This commit has failed as it has been tried $attemptNumber times but did not succeed. - |This can be caused by the Delta table being committed continuously by many concurrent - |commits. - | - |Commit started at version: $initAttemptVersion - |Commit failed at version: $attemptVersion - |Number of actions attempted to commit: $numActions - |Total time spent attempting this commit: $totalCommitAttemptTime ms - """.stripMargin) - } - - def nestedNotNullConstraint( - parent: String, nested: DataType, nestType: String): DeltaStandaloneException = { - new DeltaStandaloneException(s"The $nestType type of the field $parent contains a NOT NULL " + - s"constraint. Delta does not support NOT NULL constraints nested within arrays or maps. " + - s"Parsed $nestType type:\n${nested.toPrettyJson}") - } - - def checkpointNonExistTable(path: Path): Throwable = { - new IllegalStateException(s"Cannot checkpoint a non-exist table $path. Did you manually " + - s"delete files in the _delta_log directory?") - } - - def cannotModifyTableProperty(prop: String): Throwable = { - throw new UnsupportedOperationException( - s"The Delta table configuration $prop cannot be specified by the user") - } - - def unknownConfigurationKeyException(confKey: String): Throwable = { - new DeltaStandaloneException(s"Unknown configuration was specified: $confKey") - } - - def schemaChangedException(oldSchema: StructType, newSchema: StructType): Throwable = { - val msg = - s"""Detected incompatible schema change: - |old schema: ${oldSchema.getTreeString} - | - |new schema: ${newSchema.getTreeString} - """.stripMargin - new IllegalStateException(msg) - } - - @varargs def illegalExpressionValueType( - exprName: String, - expectedType: String, - realTypes: String*): RuntimeException = { - new IllegalArgumentException( - s"$exprName expression requires $expectedType type. But found ${realTypes.mkString(", ")}"); - } - - def logStoreConfConflicts(classConf: Seq[String], schemeConf: Seq[String]): Throwable = { - val schemeConfStr = schemeConf.mkString(", ") - val classConfStr = classConf.mkString(", ") - new IllegalArgumentException( - s"(`$classConfStr`) and (`$schemeConfStr`)" + - " cannot be set at the same time. Please set only one group of them.") - } - - def inconsistentLogStoreConfs(setKeys: Seq[(String, String)]): Throwable = { - val setKeyStr = setKeys.map(_.productIterator.mkString(" = ")).mkString(", ") - new IllegalArgumentException( - s"($setKeyStr) cannot be set to different values. Please only set one of them, or set them " + - s"to the same value.") - } - - def partitionColumnsNotFoundException(partCols: Seq[String], schema: StructType): Throwable = { - new DeltaStandaloneException(s"Partition column(s) ${partCols.mkString(",")} not found in " + - s"schema:\n${schema.getTreeString}") - } - - def nonPartitionColumnAbsentException(): Throwable = { - new DeltaStandaloneException("Data written into Delta needs to contain at least one " + - "non-partitioned column") - } - - /////////////////////////////////////////////////////////////////////////// - // Helper Methods - /////////////////////////////////////////////////////////////////////////// - - private def formatColumn(colName: String): String = s"`$colName`" - - private def formatColumnList(colNames: Seq[String]): String = - colNames.map(formatColumn).mkString("[", ", ", "]") -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/isolationLevels.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/isolationLevels.scala deleted file mode 100644 index cf906272a6f..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/isolationLevels.scala +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -sealed trait IsolationLevel { - override def toString: String = this.getClass.getSimpleName.stripSuffix("$") -} - -case object Serializable extends IsolationLevel - -case object SnapshotIsolation extends IsolationLevel diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/logging/Logging.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/logging/Logging.scala deleted file mode 100644 index 8e8cba4557b..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/logging/Logging.scala +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.logging - -import org.slf4j.{Logger, LoggerFactory} - -/** - * Utility trait for classes that want to log data. Creates a SLF4J logger for the class and allows - * logging messages at different levels using methods that only evaluate parameters lazily if the - * log level is enabled. - */ -private[internal] trait Logging { - - // Make the log field transient so that objects with Logging can - // be serialized and used on another machine - @transient private var log_ : Logger = null - - // Method to get the logger name for this object - private def logName = { - // Ignore trailing $'s in the class names for Scala objects - this.getClass.getName.stripSuffix("$") - } - - // Method to get or create the logger for this object - private def log: Logger = { - if (log_ == null) { - log_ = LoggerFactory.getLogger(logName) - } - log_ - } - - // Log methods that take only a String - protected def logInfo(msg: => String): Unit = { - if (log.isInfoEnabled) log.info(msg) - } - - protected def logWarning(msg: => String): Unit = { - if (log.isWarnEnabled) log.warn(msg) - } - - protected def logError(msg: => String): Unit = { - if (log.isErrorEnabled) log.error(msg) - } - - // Log methods that take Throwables (Exceptions/Errors) too - protected def logInfo(msg: => String, throwable: Throwable): Unit = { - if (log.isInfoEnabled) log.info(msg, throwable) - } - - protected def logWarning(msg: => String, throwable: Throwable): Unit = { - if (log.isWarnEnabled) log.warn(msg, throwable) - } - - protected def logError(msg: => String, throwable: Throwable): Unit = { - if (log.isErrorEnabled) log.error(msg, throwable) - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/scan/DeltaScanImpl.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/scan/DeltaScanImpl.scala deleted file mode 100644 index 87d2a3614af..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/scan/DeltaScanImpl.scala +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.scan - -import java.net.URI -import java.util.{NoSuchElementException, Optional} - -import io.delta.standalone.DeltaScan -import io.delta.standalone.actions.{AddFile => AddFileJ} -import io.delta.standalone.data.CloseableIterator -import io.delta.standalone.expressions.Expression - -import io.delta.standalone.internal.SnapshotImpl.canonicalizePath -import io.delta.standalone.internal.actions.{AddFile, MemoryOptimizedLogReplay, RemoveFile} -import io.delta.standalone.internal.util.ConversionUtils - -/** - * Scala implementation of Java interface [[DeltaScan]]. - */ -private[internal] class DeltaScanImpl(replay: MemoryOptimizedLogReplay) extends DeltaScan { - - /** - * Whether or not the given [[AddFile]] should be returned during iteration. - */ - protected def accept(addFile: AddFile): Boolean = true - - /** - * This is a utility method for internal use cases where we need the filtered files - * as their Scala instances, instead of Java. - */ - def getFilesScala: Array[AddFile] = { - import io.delta.standalone.internal.util.Implicits._ - - getIterScala.toArray - } - - override def getFiles: CloseableIterator[AddFileJ] = new CloseableIterator[AddFileJ] { - private val iter = getIterScala - - override def hasNext: Boolean = iter.hasNext - - override def next(): AddFileJ = ConversionUtils.convertAddFile(iter.next()) - - override def close(): Unit = iter.close() - } - - override def getInputPredicate: Optional[Expression] = Optional.empty() - - override def getPushedPredicate: Optional[Expression] = Optional.empty() - - override def getResidualPredicate: Optional[Expression] = Optional.empty() - - /** - * Replay Delta transaction logs and return a [[CloseableIterator]] of all [[AddFile]]s - * that - * - are valid delta files (i.e. they have not been removed or returned already) - * - pass the given [[accept]] check - */ - private def getIterScala: CloseableIterator[AddFile] = new CloseableIterator[AddFile] { - private val iter = replay.getReverseIterator - private val addFiles = new scala.collection.mutable.HashSet[URI]() - private val tombstones = new scala.collection.mutable.HashSet[URI]() - private var nextMatching: Option[AddFile] = None - - /** - * @return the next AddFile in the log that has not been removed or returned already, or None - * if no such AddFile exists. - */ - private def findNextValid(): Option[AddFile] = { - while (iter.hasNext) { - val (action, isCheckpoint, _) = iter.next() - - action match { - case add: AddFile => - val canonicalizeAdd = add.copy( - dataChange = false, - path = canonicalizePath(add.path, replay.hadoopConf)) - - val alreadyDeleted = tombstones.contains(canonicalizeAdd.pathAsUri) - val alreadyReturned = addFiles.contains(canonicalizeAdd.pathAsUri) - - if (!alreadyReturned) { - // no AddFile will appear twice in a checkpoint so we only need non-checkpoint - // AddFiles in the set - if (!isCheckpoint) { - addFiles += canonicalizeAdd.pathAsUri - } - - if (!alreadyDeleted) { - return Some(canonicalizeAdd) - } - } - // Note: `RemoveFile` in a checkpoint is useless since when we generate a checkpoint, an - // AddFile file must be removed if there is a `RemoveFile` - case remove: RemoveFile if !isCheckpoint => - val canonicalizeRemove = remove.copy( - dataChange = false, - path = canonicalizePath(remove.path, replay.hadoopConf)) - - tombstones += canonicalizeRemove.pathAsUri - case _ => // do nothing - } - } - - // No next valid found - None - } - - /** - * Sets the [[nextMatching]] variable to the next "valid" AddFile that also passes the given - * [[accept]] check, or None if no such AddFile file exists. - */ - private def setNextMatching(): Unit = { - var nextValid = findNextValid() - - while (nextValid.isDefined) { - if (accept(nextValid.get)) { - nextMatching = nextValid - return - } - - nextValid = findNextValid() - } - - // No next matching found - nextMatching = None - } - - override def hasNext: Boolean = { - // nextMatching will be empty if - // a) this is the first time hasNext has been called - // b) next() was just called and successfully returned a next element, setting nextMatching to - // None - // c) we've run out of actions to iterate over. in this case, setNextMatching() and - // findNextValid() will both short circuit and return immediately - if (nextMatching.isEmpty) { - setNextMatching() - } - nextMatching.isDefined - } - - override def next(): AddFile = { - if (!hasNext()) throw new NoSuchElementException() - val ret = nextMatching.get - nextMatching = None - ret - } - - override def close(): Unit = { - iter.close() - } - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/scan/FilteredDeltaScanImpl.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/scan/FilteredDeltaScanImpl.scala deleted file mode 100644 index 5b5432bfa89..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/scan/FilteredDeltaScanImpl.scala +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.scan - -import java.util.Optional - -import scala.collection.mutable - -import org.apache.hadoop.conf.Configuration - -import io.delta.standalone.expressions.Expression -import io.delta.standalone.types.StructType - -import io.delta.standalone.internal.actions.{AddFile, MemoryOptimizedLogReplay} -import io.delta.standalone.internal.data.PartitionRowRecord -import io.delta.standalone.internal.sources.StandaloneHadoopConf -import io.delta.standalone.internal.util.PartitionUtils - -/** - * An implementation of [[io.delta.standalone.DeltaScan]] that filters files and only returns - * those that match the [[getPushedPredicate]]. - * - * If the pushed predicate is empty, then all files are returned. - */ -final private[internal] class FilteredDeltaScanImpl( - replay: MemoryOptimizedLogReplay, - expr: Expression, - partitionSchema: StructType, - hadoopConf: Configuration) extends DeltaScanImpl(replay) { - - private val partitionColumns = partitionSchema.getFieldNames.toSeq - private val evaluationResults = mutable.Map.empty[Map[String, String], Boolean] - - private val (metadataConjunction, dataConjunction) = - PartitionUtils.splitMetadataAndDataPredicates(expr, partitionColumns) - - private val partitionFilterRecordCachingEnabled = hadoopConf - .getBoolean(StandaloneHadoopConf.PARTITION_FILTER_RECORD_CACHING_KEY, true) - - override protected def accept(addFile: AddFile): Boolean = { - if (metadataConjunction.isEmpty) return true - - // found in micro-benchmarking that eagerly creating - // new PartitionRowRecord can destroy the purpose of caching - lazy val partitionRowRecord = new PartitionRowRecord(partitionSchema, addFile.partitionValues) - - if (partitionFilterRecordCachingEnabled) { - val cachedResult = evaluationResults.get(addFile.partitionValues) - if (cachedResult.isDefined) return cachedResult.get - val result = metadataConjunction.get.eval(partitionRowRecord).asInstanceOf[Boolean] - evaluationResults(addFile.partitionValues) = result - result - } else { - val result = metadataConjunction.get.eval(partitionRowRecord).asInstanceOf[Boolean] - result - } - } - - override def getInputPredicate: Optional[Expression] = Optional.of(expr) - - override def getPushedPredicate: Optional[Expression] = - Optional.ofNullable(metadataConjunction.orNull) - - override def getResidualPredicate: Optional[Expression] = - Optional.ofNullable(dataConjunction.orNull) - -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/sources/StandaloneHadoopConf.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/sources/StandaloneHadoopConf.scala deleted file mode 100644 index 9855cfeedfa..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/sources/StandaloneHadoopConf.scala +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.sources - -/** - * [[org.apache.hadoop.conf.Configuration]] entries for Delta Standalone features. - */ -private[internal] object StandaloneHadoopConf { - - /** - * If enabled, this ignores errors when trying to relativize an absolute path of an - * [[io.delta.standalone.actions.AddFile]] across file systems. - * This allows user to define shallow clone delta tables where data resides in - * external file systems such as s3://, wasbs:// or adls:// - * By default, this feature is disabled. Set to `true` to enable. - */ - val RELATIVE_PATH_IGNORE = "io.delta.vacuum.relativize.ignoreError" - - /** Time zone as which time-based parquet values will be encoded and decoded. */ - val PARQUET_DATA_TIME_ZONE_ID = "io.delta.standalone.PARQUET_DATA_TIME_ZONE_ID" - - /** Legacy key for the class name of the desired [[LogStore]] implementation to be used. */ - val LEGACY_LOG_STORE_CLASS_KEY = "io.delta.standalone.LOG_STORE_CLASS_KEY" - - /** Key for the class name of the desired [[LogStore]] implementation to be used. */ - val LOG_STORE_CLASS_KEY = "delta.logStore.class" - - /** - * If enabled, partition values evaluation result will be cached in partition pruning in - * `FilteredDeltaScanImpl::accept`. - * By default, this feature is enabled. Set to `false` to disable. - */ - val PARTITION_FILTER_RECORD_CACHING_KEY = - "io.delta.standalone.partitionFilterRecordCaching.enabled" - - /** - * When set to true, Delta Standalone will checkpoint as normal. When set to false, Delta - * Standalone will explicitly skip checkpointing. - */ - val CHECKPOINTING_ENABLED = "io.delta.standalone.checkpointing.enabled" -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/AzureLogStore.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/AzureLogStore.scala deleted file mode 100644 index d101f3868e2..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/AzureLogStore.scala +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.storage - -import scala.collection.JavaConverters._ - -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.Path - -/** - * LogStore implementation for Azure. - * - * We assume the following from Azure's [[org.apache.hadoop.fs.FileSystem]] implementations: - * - Rename without overwrite is atomic. - * - List-after-write is consistent. - * - * Regarding file creation, this implementation: - * - Uses atomic rename when overwrite is false; if the destination file exists or the rename - * fails, throws an exception. - * - Uses create-with-overwrite when overwrite is true. This does not make the file atomically - * visible and therefore the caller must handle partial files. - */ -private[internal] class AzureLogStore(override val initHadoopConf: Configuration) - extends HadoopFileSystemLogStore(initHadoopConf) { - - override def write( - path: Path, - actions: java.util.Iterator[String], - overwrite: java.lang.Boolean, - hadoopConf: Configuration): Unit = { - writeWithRename(path, actions.asScala, overwrite, hadoopConf) - } - - override def isPartialWriteVisible(path: Path, hadoopConf: Configuration): java.lang.Boolean = { - true - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/DelegatingLogStore.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/DelegatingLogStore.scala deleted file mode 100644 index bf492c6c4f7..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/DelegatingLogStore.scala +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.storage - -import java.util.Locale - -import scala.collection.mutable - -import io.delta.storage.{CloseableIterator, LogStore} -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.{FileStatus, Path} - -import io.delta.standalone.internal.logging.Logging - -/** - * A delegating LogStore used to dynamically resolve LogStore implementation based - * on the scheme of paths. - */ -class DelegatingLogStore(hadoopConf: Configuration) - extends LogStore(hadoopConf) - with Logging { - - // Map scheme to the corresponding LogStore resolved and created. Accesses to this map need - // synchronization This could be accessed by multiple threads because it is shared through - // shared DeltaLog instances. - private val schemeToLogStoreMap = mutable.Map.empty[String, LogStore] - - private lazy val defaultLogStore = createLogStore(DelegatingLogStore.defaultHDFSLogStoreClassName) - - // Creates a LogStore with given LogStore class name. - private def createLogStore(className: String): LogStore = { - LogStoreProvider.createLogStoreWithClassName(className, hadoopConf) - } - - // Create LogStore based on the scheme of `path`. - private def schemeBasedLogStore(path: Path): LogStore = { - Option(path.toUri.getScheme) match { - case Some(origScheme) => - val scheme = origScheme.toLowerCase(Locale.ROOT) - this.synchronized { - if (schemeToLogStoreMap.contains(scheme)) { - schemeToLogStoreMap(scheme) - } else { - // Resolve LogStore class based on the following order: - // 1. Scheme conf if set. - // 2. Defaults for scheme if exists. - // 3. Default. - val logStoreClassNameOpt = Option( - hadoopConf.get(LogStoreProvider.logStoreSchemeConfKey(scheme)) - ).orElse(DelegatingLogStore.getDefaultLogStoreClassName(scheme)) - - val logStore = logStoreClassNameOpt.map(createLogStore(_)).getOrElse(defaultLogStore) - schemeToLogStoreMap += scheme -> logStore - logInfo(s"LogStore ${logStore.getClass.getName} is used for scheme ${scheme}") - logStore - } - } - case _ => defaultLogStore - } - } - - def getDelegate(path: Path): LogStore = schemeBasedLogStore(path) - - ////////////////////////// - // Public API Overrides // - ////////////////////////// - - override def read(path: Path, hadoopConf: Configuration): CloseableIterator[String] = { - getDelegate(path).read(path, hadoopConf) - } - - override def write( - path: Path, - actions: java.util.Iterator[String], - overwrite: java.lang.Boolean, - hadoopConf: Configuration): Unit = { - getDelegate(path).write(path, actions, overwrite, hadoopConf) - } - - override def listFrom(path: Path, hadoopConf: Configuration): java.util.Iterator[FileStatus] = { - getDelegate(path).listFrom(path, hadoopConf) - } - - override def resolvePathOnPhysicalStorage(path: Path, hadoopConf: Configuration): Path = { - getDelegate(path).resolvePathOnPhysicalStorage(path, hadoopConf) - } - - override def isPartialWriteVisible(path: Path, hadoopConf: Configuration): java.lang.Boolean = { - getDelegate(path).isPartialWriteVisible(path, hadoopConf) - } -} - -object DelegatingLogStore { - - /** - * Java LogStore (io.delta.storage) implementations are now the default. - */ - val defaultS3LogStoreClassName = classOf[io.delta.storage.S3SingleDriverLogStore].getName - val defaultAzureLogStoreClassName = classOf[io.delta.storage.AzureLogStore].getName - val defaultHDFSLogStoreClassName = classOf[io.delta.storage.HDFSLogStore].getName - val defaultGCSLogStoreClassName = classOf[io.delta.storage.GCSLogStore].getName - - // Supported schemes with default. - val s3Schemes = Set("s3", "s3a", "s3n") - val azureSchemes = Set("abfs", "abfss", "adl", "wasb", "wasbs") - val gsSchemes = Set("gs") - - // Returns the default LogStore class name for `scheme`. - // None if we do not have a default for it. - def getDefaultLogStoreClassName(scheme: String): Option[String] = { - if (s3Schemes.contains(scheme)) { - return Some(defaultS3LogStoreClassName) - } else if (DelegatingLogStore.azureSchemes(scheme: String)) { - return Some(defaultAzureLogStoreClassName) - } else if (DelegatingLogStore.gsSchemes(scheme: String)) { - return Some(defaultGCSLogStoreClassName) - } - None - } -} - diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/HDFSLogStore.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/HDFSLogStore.scala deleted file mode 100644 index 1c25ebf2d6b..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/HDFSLogStore.scala +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.storage - -import java.io.IOException -import java.nio.charset.StandardCharsets.UTF_8 -import java.nio.file.FileAlreadyExistsException -import java.util.EnumSet - -import scala.collection.JavaConverters._ -import scala.util.control.NonFatal - -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.{FileContext, Options, Path, RawLocalFileSystem} -import org.apache.hadoop.fs.CreateFlag.CREATE -import org.apache.hadoop.fs.Options.{ChecksumOpt, CreateOpts} - -import io.delta.standalone.internal.exception.DeltaErrors -import io.delta.standalone.internal.logging.Logging - -/** - * The [[LogStore]] implementation for HDFS, which uses Hadoop [[FileContext]] APIs to - * provide the necessary atomic and durability guarantees: - * - * 1. Atomic visibility of files: `FileContext.rename` is used write files which is atomic for HDFS. - * - * 2. Consistent file listing: HDFS file listing is consistent. - */ -private[internal] class HDFSLogStore(override val initHadoopConf: Configuration) - extends HadoopFileSystemLogStore(initHadoopConf) with Logging { - - val noAbstractFileSystemExceptionMessage = "No AbstractFileSystem" - - override def write( - path: Path, - actions: java.util.Iterator[String], - overwrite: java.lang.Boolean, - hadoopConf: Configuration): Unit = { - val isLocalFs = path.getFileSystem(hadoopConf).isInstanceOf[RawLocalFileSystem] - if (isLocalFs) { - // We need to add `synchronized` for RawLocalFileSystem as its rename will not throw an - // exception when the target file exists. Hence we must make sure `exists + rename` in - // `writeInternal` for RawLocalFileSystem is atomic in our tests. - synchronized { - writeInternal(path, actions.asScala, overwrite, hadoopConf) - } - } else { - // rename is atomic and also will fail when the target file exists. Not need to add the extra - // `synchronized`. - writeInternal(path, actions.asScala, overwrite, hadoopConf) - } - } - - override def isPartialWriteVisible(path: Path, hadoopConf: Configuration): java.lang.Boolean = { - true - } - - private def writeInternal( - path: Path, - actions: Iterator[String], - overwrite: Boolean, - hadoopConf: Configuration): Unit = { - val fc: FileContext = try { - getFileContext(path, hadoopConf) - } catch { - case e: IOException if e.getMessage.contains(noAbstractFileSystemExceptionMessage) => - val newException = DeltaErrors.incorrectLogStoreImplementationException(e) - logError(newException.getMessage, newException.getCause) - throw newException - } - if (!overwrite && fc.util.exists(path)) { - // This is needed for the tests to throw error with local file system - throw new FileAlreadyExistsException(path.toString) - } - - val tempPath = createTempPath(path) - var streamClosed = false // This flag is to avoid double close - var renameDone = false // This flag is to save the delete operation in most of cases. - val stream = fc.create( - tempPath, EnumSet.of(CREATE), CreateOpts.checksumParam(ChecksumOpt.createDisabled())) - - try { - actions.map(_ + "\n").map(_.getBytes(UTF_8)).foreach(stream.write) - stream.close() - streamClosed = true - try { - val renameOpt = if (overwrite) Options.Rename.OVERWRITE else Options.Rename.NONE - fc.rename(tempPath, path, renameOpt) - renameDone = true - // TODO: this is a workaround of HADOOP-16255 - remove this when HADOOP-16255 is resolved - tryRemoveCrcFile(fc, tempPath) - } catch { - case e: org.apache.hadoop.fs.FileAlreadyExistsException => - throw new FileAlreadyExistsException(path.toString) - } - } finally { - if (!streamClosed) { - stream.close() - } - if (!renameDone) { - fc.delete(tempPath, false) - } - } - } - - private def getFileContext(path: Path, hadoopConf: Configuration): FileContext = { - FileContext.getFileContext(path.toUri, hadoopConf) - } - - private def tryRemoveCrcFile(fc: FileContext, path: Path): Unit = { - try { - val checksumFile = new Path(path.getParent, s".${path.getName}.crc") - if (fc.util.exists(checksumFile)) { - // checksum file exists, deleting it - fc.delete(checksumFile, true) - } - } catch { - case NonFatal(_) => // ignore, we are removing crc file as "best-effort" - } - } - -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/HadoopFileSystemLogStore.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/HadoopFileSystemLogStore.scala deleted file mode 100644 index 9ccdc94b4e6..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/HadoopFileSystemLogStore.scala +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.storage - -import java.io.{BufferedReader, FileNotFoundException, InputStreamReader} -import java.nio.charset.StandardCharsets.UTF_8 -import java.nio.file.FileAlreadyExistsException -import java.util.UUID - -import scala.collection.JavaConverters._ - -import io.delta.storage.{CloseableIterator, LogStore} -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.{FileStatus, Path} - -/** - * Default implementation of [[LogStore]] for Hadoop [[org.apache.hadoop.fs.FileSystem]] - * implementations. - */ -abstract class HadoopFileSystemLogStore(override val initHadoopConf: Configuration) - extends LogStore(initHadoopConf) { - - override def read(path: Path, hadoopConf: Configuration): CloseableIterator[String] = { - val fs = path.getFileSystem(hadoopConf) - val stream = fs.open(path) - val reader = new BufferedReader(new InputStreamReader(stream, UTF_8)) - new LineCloseableIterator(reader) - } - - override def listFrom(path: Path, hadoopConf: Configuration): java.util.Iterator[FileStatus] = { - val fs = path.getFileSystem(hadoopConf) - if (!fs.exists(path.getParent)) { - throw new FileNotFoundException(s"No such file or directory: ${path.getParent}") - } - val files = fs.listStatus(path.getParent) - files.filter(_.getPath.getName >= path.getName).sortBy(_.getPath.getName).iterator.asJava - } - - override def resolvePathOnPhysicalStorage(path: Path, hadoopConf: Configuration): Path = { - path.getFileSystem(hadoopConf).makeQualified(path) - } - - /** - * An internal write implementation that uses FileSystem.rename(). - * - * This implementation should only be used for the underlying file systems that support atomic - * renames, e.g., Azure is OK but HDFS is not. - */ - protected def writeWithRename( - path: Path, - actions: Iterator[String], - overwrite: Boolean, - hadoopConf: Configuration): Unit = { - val fs = path.getFileSystem(hadoopConf) - - if (!fs.exists(path.getParent)) { - throw new FileNotFoundException(s"No such file or directory: ${path.getParent}") - } - if (overwrite) { - val stream = fs.create(path, true) - try { - actions.map(_ + "\n").map(_.getBytes(UTF_8)).foreach(stream.write) - } finally { - stream.close() - } - } else { - if (fs.exists(path)) { - throw new FileAlreadyExistsException(path.toString) - } - val tempPath = createTempPath(path) - var streamClosed = false // This flag is to avoid double close - var renameDone = false // This flag is to save the delete operation in most of cases. - val stream = fs.create(tempPath) - try { - actions.map(_ + "\n").map(_.getBytes(UTF_8)).foreach(stream.write) - stream.close() - streamClosed = true - try { - if (fs.rename(tempPath, path)) { - renameDone = true - } else { - if (fs.exists(path)) { - throw new FileAlreadyExistsException(path.toString) - } else { - throw new IllegalStateException(s"Cannot rename $tempPath to $path") - } - } - } catch { - case _: org.apache.hadoop.fs.FileAlreadyExistsException => - throw new FileAlreadyExistsException(path.toString) - } - } finally { - if (!streamClosed) { - stream.close() - } - if (!renameDone) { - fs.delete(tempPath, false) - } - } - } - } - - protected def createTempPath(path: Path): Path = { - new Path(path.getParent, s".${path.getName}.${UUID.randomUUID}.tmp") - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/LineCloseableIterator.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/LineCloseableIterator.scala deleted file mode 100644 index 830825b6a0d..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/LineCloseableIterator.scala +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.storage - -import java.io.Reader - -import io.delta.storage.CloseableIterator -import org.apache.commons.io.IOUtils - -/** - * Turn a `Reader` to `ClosableIterator` which can be read on demand. Each element is - * a trimmed line. - */ -class LineCloseableIterator(_reader: Reader) extends CloseableIterator[String] { - private val reader = IOUtils.toBufferedReader(_reader) - // Whether `nextValue` is valid. If it's invalid, we should try to read the next line. - private var gotNext = false - // The next value to return when `next` is called. This is valid only if `getNext` is true. - private var nextValue: String = _ - // Whether the reader is closed. - private var closed = false - // Whether we have consumed all data in the reader. - private var finished = false - - override def hasNext(): Boolean = { - if (!finished) { - // Check whether we have closed the reader before reading. Even if `nextValue` is valid, we - // still don't return `nextValue` after a reader is closed. Otherwise, it would be confusing. - if (closed) { - throw new IllegalStateException("Iterator is closed") - } - if (!gotNext) { - val nextLine = reader.readLine() - if (nextLine == null) { - finished = true - close() - } else { - nextValue = nextLine.trim - } - gotNext = true - } - } - !finished - } - - override def next(): String = { - if (!hasNext) { - throw new NoSuchElementException("End of stream") - } - gotNext = false - nextValue - } - - override def close(): Unit = { - if (!closed) { - closed = true - reader.close() - } - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/LocalLogStore.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/LocalLogStore.scala deleted file mode 100644 index 382b9f8c531..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/LocalLogStore.scala +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.storage - -import scala.collection.JavaConverters._ - -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.Path - -/** - * A [[LogStore]] implementation that should be used for testing only. - * - * Production users should specify the appropriate [[LogStore]] implementation in the Hadoop - * [[Configuration]] properties. - * - * We assume the following from [[org.apache.hadoop.fs.FileSystem]] implementations: - * - Rename without overwrite is atomic. - * - List-after-write is consistent. - * - * Regarding file creation, this implementation: - * - Uses atomic rename when overwrite is false; if the destination file exists or the rename - * fails, throws an exception. - * - Uses create-with-overwrite when overwrite is true. This does not make the file atomically - * visible and therefore the caller must handle partial files. - */ -private[internal] class LocalLogStore(override val initHadoopConf: Configuration) - extends HadoopFileSystemLogStore(initHadoopConf) { - - /** - * This write implementation needs to wraps `writeWithRename` with `synchronized` as the rename() - * for [[org.apache.hadoop.fs.RawLocalFileSystem]] doesn't throw an exception when the target file - * exists. Hence we must make sure `exists + rename` in `writeWithRename` is atomic in our tests. - */ - override def write( - path: Path, - actions: java.util.Iterator[String], - overwrite: java.lang.Boolean, - hadoopConf: Configuration): Unit = { - synchronized { - writeWithRename(path, actions.asScala, overwrite, hadoopConf) - } - } - - override def isPartialWriteVisible(path: Path, hadoopConf: Configuration): java.lang.Boolean = { - true - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/LogStoreProvider.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/LogStoreProvider.scala deleted file mode 100644 index 452ee4cdc03..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/LogStoreProvider.scala +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.storage - -import scala.collection.JavaConverters._ - -import io.delta.storage.LogStore -import org.apache.hadoop.conf.Configuration - -import io.delta.standalone.exceptions.DeltaStandaloneException - -import io.delta.standalone.internal.exception.DeltaErrors -import io.delta.standalone.internal.sources.StandaloneHadoopConf - -private[internal] object LogStoreProvider extends LogStoreProvider - -private[internal] trait LogStoreProvider { - - // We accept keys with the `spark.` prefix to maintain compatibility with delta-spark - val acceptedLogStoreClassConfKeyRegex = - f"((?:spark.)?${StandaloneHadoopConf.LOG_STORE_CLASS_KEY}|" + - f"${StandaloneHadoopConf.LEGACY_LOG_STORE_CLASS_KEY})" - .replace(""".""", """\.""") - val acceptedLogStoreSchemeConfKeyRegex = """(?:spark\.)?delta\.logStore\.\w+\.impl""" - - val logStoreClassConfKey: String = StandaloneHadoopConf.LOG_STORE_CLASS_KEY - val defaultLogStoreClass: String = classOf[DelegatingLogStore].getName - - // The conf key for setting the LogStore implementation for `scheme`. - def logStoreSchemeConfKey(scheme: String): String = s"delta.logStore.${scheme}.impl" - - def createLogStore(hadoopConf: Configuration): LogStore = { - checkLogStoreConfConflicts(hadoopConf) - normalizeHadoopConf(hadoopConf) - val logStoreClassName = hadoopConf.get(logStoreClassConfKey, defaultLogStoreClass) - createLogStoreWithClassName(logStoreClassName, hadoopConf) - } - - def createLogStoreWithClassName(className: String, hadoopConf: Configuration): LogStore = { - if (className == classOf[DelegatingLogStore].getName) { - new DelegatingLogStore(hadoopConf) - } else { - // scalastyle:off classforname - val logStoreClass = - Class.forName(className, true, Thread.currentThread().getContextClassLoader) - // scalastyle:on classforname - - if (classOf[LogStore].isAssignableFrom(logStoreClass)) { - logStoreClass - .getConstructor(classOf[Configuration]) - .newInstance(hadoopConf) - .asInstanceOf[LogStore] - } else { - throw new DeltaStandaloneException(s"Can't instantiate a LogStore with classname " + - s"$className.") - } - } - } - - /** - * Normalizes LogStore hadoop configs. - * - For each config, check that the values are consistent across all accepted keys. Throw an - * error if they are not. - * - Set the "normalized" key to such value. This means future accesses can exclusively use the - * normalized keys. - * - * For scheme conf keys: - * - We accept 'delta.logStore.{scheme}.impl' and 'spark.delta.logStore.{scheme}.impl' - * - The normalized key is 'delta.logStore.{scheme}.impl' - * - * For class conf key: - * - We accept 'delta.logStore.class', 'spark.delta.logStore.class', and - * 'io.delta.standalone.LOG_STORE_CLASS_KEY' (legacy). - * - The normalized key is 'delta.logStore.class' - */ - def normalizeHadoopConf(hadoopConf: Configuration): Unit = { - // LogStore scheme conf keys - val schemeConfs = hadoopConf.getValByRegex(acceptedLogStoreSchemeConfKeyRegex).asScala - schemeConfs.filter(_._1.startsWith("spark.")).foreach { case (key, value) => - val normalizedKey = key.stripPrefix("spark.") - Option(hadoopConf.get(normalizedKey)) match { - case Some(normalValue) => - // The normalized key is also present in the hadoopConf. Check that they store - // the same value, otherwise throw an error. - if (value != normalValue) { - throw DeltaErrors.inconsistentLogStoreConfs( - Seq((key, value), (normalizedKey, normalValue))) - } - case None => - // The normalized key is not present in the hadoopConf. Set the normalized key to the - // provided value. - hadoopConf.set(normalizedKey, value) - } - } - - // LogStore class conf key - val classConfs = hadoopConf.getValByRegex(acceptedLogStoreClassConfKeyRegex).asScala - if (classConfs.values.toSet.size > 1) { - // More than one class conf key are set to different values - throw DeltaErrors.inconsistentLogStoreConfs(classConfs.iterator.toSeq) - } else if (classConfs.size > 0) { - // Set the normalized key to the provided value. - hadoopConf.set(logStoreClassConfKey, classConfs.values.head) - } - } - - def checkLogStoreConfConflicts(hadoopConf: Configuration): Unit = { - val classConf = hadoopConf.getValByRegex(acceptedLogStoreClassConfKeyRegex) - val schemeConf = hadoopConf.getValByRegex(acceptedLogStoreSchemeConfKeyRegex) - - if (!classConf.isEmpty() && !schemeConf.isEmpty()) { - throw DeltaErrors.logStoreConfConflicts( - classConf.keySet().asScala.toSeq, - schemeConf.keySet().asScala.toSeq) - } - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/S3SingleDriverLogStore.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/S3SingleDriverLogStore.scala deleted file mode 100644 index c0a349068b9..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/storage/S3SingleDriverLogStore.scala +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.storage - -import java.io.FileNotFoundException -import java.net.URI -import java.nio.charset.StandardCharsets.UTF_8 -import java.util.concurrent.{ConcurrentHashMap, TimeUnit} - -import scala.collection.JavaConverters._ - -import com.google.common.cache.CacheBuilder -import com.google.common.io.CountingOutputStream -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.{FileStatus, FileSystem, Path} - -import io.delta.standalone.internal.util.FileNames - -private[internal] class S3SingleDriverLogStore(override val initHadoopConf: Configuration) - extends HadoopFileSystemLogStore(initHadoopConf) { - - import S3SingleDriverLogStore._ - - /////////////////////////////////////////////////////////////////////////// - // Public API Methods - /////////////////////////////////////////////////////////////////////////// - - override def write( - path: Path, - actions: java.util.Iterator[String], - overwrite: java.lang.Boolean, - hadoopConf: Configuration): Unit = { - val (fs, resolvedPath) = resolved(path, hadoopConf) - val lockedPath = getPathKey(resolvedPath) - acquirePathLock(lockedPath) - try { - if (exists(fs, resolvedPath) && !overwrite) { - throw new java.nio.file.FileAlreadyExistsException(resolvedPath.toUri.toString) - } - val stream = new CountingOutputStream(fs.create(resolvedPath, overwrite)) - actions.asScala.map(_ + "\n").map(_.getBytes(UTF_8)).foreach(stream.write) - stream.close() - - // When a Delta log starts afresh, all cached files in that Delta log become obsolete, - // so we remove them from the cache. - if (isInitialVersion(resolvedPath)) { - val obsoleteFiles = writtenPathCache - .asMap() - .asScala - .keys - .filter(_.getParent == lockedPath.getParent()) - .asJava - - writtenPathCache.invalidateAll(obsoleteFiles) - } - - // Cache the information of written files to help fix the inconsistency in future listings - writtenPathCache.put(lockedPath, - FileMetadata(stream.getCount(), System.currentTimeMillis())) - } catch { - // Convert Hadoop's FileAlreadyExistsException to Java's FileAlreadyExistsException - case e: org.apache.hadoop.fs.FileAlreadyExistsException => - throw new java.nio.file.FileAlreadyExistsException(e.getMessage) - } finally { - releasePathLock(lockedPath) - } - } - - override def isPartialWriteVisible(path: Path, hadoopConf: Configuration): java.lang.Boolean = { - false - } - - /** - * List files starting from `resolvedPath` (inclusive) in the same directory. - */ - override def listFrom(path: Path, hadoopConf: Configuration): java.util.Iterator[FileStatus] = { - val (fs, resolvedPath) = resolved(path, hadoopConf) - listFromInternal(fs, resolvedPath).asJava - } - - /////////////////////////////////////////////////////////////////////////// - // Helper Methods - /////////////////////////////////////////////////////////////////////////// - - private def resolved(path: Path, hadoopConf: Configuration): (FileSystem, Path) = { - val fs = path.getFileSystem(hadoopConf) - val resolvedPath = stripUserInfo(fs.makeQualified(path)) - (fs, resolvedPath) - } - - private def getPathKey(resolvedPath: Path): Path = { - stripUserInfo(resolvedPath) - } - - private def stripUserInfo(path: Path): Path = { - val uri = path.toUri - val newUri = new URI( - uri.getScheme, - null, - uri.getHost, - uri.getPort, - uri.getPath, - uri.getQuery, - uri.getFragment) - new Path(newUri) - } - - /** - * Merge two iterators of [[FileStatus]] into a single iterator ordered by file path name. - * In case both iterators have [[FileStatus]]s for the same file path, keep the one from - * `iterWithPrecedence` and discard that from `iter`. - */ - private def mergeFileIterators( - iter: Iterator[FileStatus], - iterWithPrecedence: Iterator[FileStatus]): Iterator[FileStatus] = { - (iter.map(f => (f.getPath, f)).toMap ++ iterWithPrecedence.map(f => (f.getPath, f))) - .values - .toSeq - .sortBy(_.getPath.getName) - .iterator - } - - /** - * List files starting from `resolvedPath` (inclusive) in the same directory. - */ - private def listFromCache(fs: FileSystem, resolvedPath: Path) = { - val pathKey = getPathKey(resolvedPath) - writtenPathCache - .asMap() - .asScala - .iterator - .filter { case (path, _) => - path.getParent == pathKey.getParent() && path.getName >= pathKey.getName } - .map { case (path, fileMetadata) => - new FileStatus( - fileMetadata.length, - false, - 1, - fs.getDefaultBlockSize(path), - fileMetadata.modificationTime, - path) - } - } - - /** - * List files starting from `resolvedPath` (inclusive) in the same directory, which merges - * the file system list and the cache list when `useCache` is on, otherwise - * use file system list only. - */ - private def listFromInternal(fs: FileSystem, resolvedPath: Path, useCache: Boolean = true) = { - val parentPath = resolvedPath.getParent - if (!fs.exists(parentPath)) { - throw new FileNotFoundException(s"No such file or directory: $parentPath") - } - val listedFromFs = - fs.listStatus(parentPath).filter(_.getPath.getName >= resolvedPath.getName).iterator - val listedFromCache = if (useCache) listFromCache(fs, resolvedPath) else Iterator.empty - - // File statuses listed from file system take precedence - mergeFileIterators(listedFromCache, listedFromFs) - } - - /** - * Check if the path is an initial version of a Delta log. - */ - private def isInitialVersion(path: Path): Boolean = { - FileNames.isDeltaFile(path) && FileNames.deltaVersion(path) == 0L - } - - /** - * Check if a path exists. Normally we check both the file system and the cache, but when the - * path is the first version of a Delta log, we ignore the cache. - */ - private def exists(fs: FileSystem, resolvedPath: Path): Boolean = { - // Ignore the cache for the first file of a Delta log - listFromInternal(fs, resolvedPath, useCache = !isInitialVersion(resolvedPath)) - .take(1) - .exists(_.getPath.getName == resolvedPath.getName) - } -} - -private object S3SingleDriverLogStore { - /** - * A global path lock to ensure that no concurrent writers writing to the same path in the same - * JVM. - */ - private val pathLock = new ConcurrentHashMap[Path, AnyRef]() - - /** - * A global cache that records the metadata of the files recently written. - * As list-after-write may be inconsistent on S3, we can use the files in the cache - * to fix the inconsistent file listing. - */ - private val writtenPathCache = - CacheBuilder.newBuilder() - .expireAfterAccess(120, TimeUnit.MINUTES) - .build[Path, FileMetadata]() - - /** - * Release the lock for the path after writing. - * - * Note: the caller should resolve the path to make sure we are locking the correct absolute path. - */ - private def releasePathLock(resolvedPath: Path): Unit = { - val lock = pathLock.remove(resolvedPath) - lock.synchronized { - lock.notifyAll() - } - } - - /** - * Acquire a lock for the path before writing. - * - * Note: the caller should resolve the path to make sure we are locking the correct absolute path. - */ - private def acquirePathLock(resolvedPath: Path): Unit = { - while (true) { - val lock = pathLock.putIfAbsent(resolvedPath, new Object) - if (lock == null) return - lock.synchronized { - while (pathLock.get(resolvedPath) == lock) { - lock.wait() - } - } - } - } -} - -/** - * The file metadata to be stored in the cache. - */ -private case class FileMetadata(length: Long, modificationTime: Long) diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/CalendarInterval.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/CalendarInterval.scala deleted file mode 100644 index 2cb308aa258..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/CalendarInterval.scala +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -/** - * The class representing calendar intervals. The calendar interval is stored internally in - * three components. - *
    - *
  • an integer value representing the number of `months` in this interval,
  • - *
  • an integer value representing the number of `days` in this interval,
  • - *
  • a long value representing the number of `microseconds` in this interval.
  • - *
- * - * The `months` and `days` are not units of time with a constant length (unlike hours, seconds), so - * they are two separated fields from microseconds. One month may be equal to 28, 29, 30 or 31 days - * and one day may be equal to 23, 24 or 25 hours (daylight saving). - * - * @param months an integer value representing the number of months in this interval - * @param days an integer value representing the number of days in this interval - * @param microseconds a long value representing the number of microseconds in this interval - */ -private[internal] case class CalendarInterval( - val months: Int, - val days: Int, - val microseconds: Long) - diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/Clock.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/Clock.scala deleted file mode 100644 index 9b3dfffde71..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/Clock.scala +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -/** - * An interface to represent clocks, so that they can be mocked out in unit tests. - */ -private[internal] trait Clock { - /** @return Current system time, in ms. */ - def getTimeMillis(): Long - - // scalastyle:off line.size.limit - /** - * Current value of high resolution time source, in ns. - * - * This method abstracts the call to the JRE's `System.nanoTime()` call. As with that method, the - * value here is not guaranteed to be monotonically increasing, but rather a higher resolution - * time source for use in the calculation of time intervals. The characteristics of the values - * returned may very from JVM to JVM (or even the same JVM running on different OSes or CPUs), but - * in general it should be preferred over [[getTimeMillis()]] when calculating time differences. - * - * Specifically for Linux on x64 architecture, the following links provide useful information - * about the characteristics of the value returned: - * - * http://btorpey.github.io/blog/2014/02/18/clock-sources-in-linux/ - * https://stackoverflow.com/questions/10921210/cpu-tsc-fetch-operation-especially-in-multicore-multi-processor-environment - * - * TL;DR: on modern (2.6.32+) Linux kernels with modern (AMD K8+) CPUs, the values returned by - * `System.nanoTime()` are consistent across CPU cores *and* packages, and provide always - * increasing values (although it may not be completely monotonic when the system clock is - * adjusted by NTP daemons using time slew). - */ - // scalastyle:on line.size.limit - def nanoTime(): Long - - /** - * Wait until the wall clock reaches at least the given time. Note this may not actually wait for - * the actual difference between the current and target times, since the wall clock may drift. - */ - def waitTillTime(targetTime: Long): Long -} - -/** - * A clock backed by the actual time from the OS as reported by the `System` API. - */ -private[internal] class SystemClock extends Clock { - - val minPollTime = 25L - - /** - * @return the same time (milliseconds since the epoch) - * as is reported by `System.currentTimeMillis()` - */ - override def getTimeMillis(): Long = System.currentTimeMillis() - - /** - * @return value reported by `System.nanoTime()`. - */ - override def nanoTime(): Long = System.nanoTime() - - /** - * @param targetTime block until the current time is at least this value - * @return current system time when wait has completed - */ - override def waitTillTime(targetTime: Long): Long = { - var currentTime = System.currentTimeMillis() - - var waitTime = targetTime - currentTime - if (waitTime <= 0) { - return currentTime - } - - val pollTime = math.max(waitTime / 10.0, minPollTime).toLong - - while (true) { - currentTime = System.currentTimeMillis() - waitTime = targetTime - currentTime - if (waitTime <= 0) { - return currentTime - } - val sleepTime = math.min(waitTime, pollTime) - Thread.sleep(sleepTime) - } - -1 - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/ConversionUtils.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/ConversionUtils.scala deleted file mode 100644 index df946e8e72c..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/ConversionUtils.scala +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import java.lang.{String => StringJ} -import java.util.{Optional => OptionalJ} - -import scala.collection.JavaConverters._ - -import io.delta.standalone.actions.{Action => ActionJ, AddCDCFile => AddCDCFileJ, AddFile => AddFileJ, CommitInfo => CommitInfoJ, Format => FormatJ, JobInfo => JobInfoJ, Metadata => MetadataJ, NotebookInfo => NotebookInfoJ, Protocol => ProtocolJ, RemoveFile => RemoveFileJ, SetTransaction => SetTransactionJ} - -import io.delta.standalone.internal.actions.{Action, AddCDCFile, AddFile, CommitInfo, Format, JobInfo, Metadata, NotebookInfo, Protocol, RemoveFile, SetTransaction} - -/** - * Provide helper methods to convert from Scala to Java types and vice versa. - */ -private[internal] object ConversionUtils { - - /////////////////////////////////////////////////////////////////////////// - // Scala to Java conversions - /////////////////////////////////////////////////////////////////////////// - - /** - * This is a workaround for a known issue in Scala 2.11: `asJava` doesn't handle `null`. - * See https://github.com/scala/scala/pull/4343 - */ - private def nullableMapAsJava[K, V](map: Map[K, V]): java.util.Map[K, V] = { - if (map == null) { - null - } else { - map.asJava - } - } - - private def toJavaLongOptional(opt: Option[Long]): OptionalJ[java.lang.Long] = opt match { - case Some(v) => OptionalJ.ofNullable(v) - case None => OptionalJ.empty() - } - - private def toJavaBooleanOptional( - opt: Option[Boolean]): OptionalJ[java.lang.Boolean] = opt match { - case Some(v) => OptionalJ.ofNullable(v) - case None => OptionalJ.empty() - } - - private def toJavaStringOptional(opt: Option[String]): OptionalJ[StringJ] = opt match { - case Some(v) => OptionalJ.ofNullable(v) - case None => OptionalJ.empty() - } - - private def toJavaMapOptional( - opt: Option[Map[String, String]]): OptionalJ[java.util.Map[StringJ, StringJ]] = opt match { - case Some(v) => OptionalJ.ofNullable(v.asJava) - case None => OptionalJ.empty() - } - - /** - * Convert an [[AddFile]] (Scala) to an [[AddFileJ]] (Java) - */ - def convertAddFile(internal: AddFile): AddFileJ = { - new AddFileJ( - internal.path, - internal.partitionValues.asJava, - internal.size, - internal.modificationTime, - internal.dataChange, - internal.stats, - nullableMapAsJava(internal.tags)) - } - - def convertAddCDCFile(internal: AddCDCFile): AddCDCFileJ = { - new AddCDCFileJ( - internal.path, - internal.partitionValues.asJava, - internal.size, - nullableMapAsJava(internal.tags)) - } - - def convertRemoveFile(internal: RemoveFile): RemoveFileJ = { - new RemoveFileJ( - internal.path, - toJavaLongOptional(internal.deletionTimestamp), - internal.dataChange, - internal.extendedFileMetadata, - nullableMapAsJava(internal.partitionValues), - toJavaLongOptional(internal.size), - nullableMapAsJava(internal.tags)) - } - - /** - * Convert a [[Metadata]] (Scala) to a [[MetadataJ]] (Java) - */ - def convertMetadata(internal: Metadata): MetadataJ = { - new MetadataJ( - internal.id, - internal.name, - internal.description, - convertFormat(internal.format), - internal.partitionColumns.toList.asJava, - internal.configuration.asJava, - toJavaLongOptional(internal.createdTime), - internal.schema) - } - - /** - * Convert a [[Format]] (Scala) to a [[FormatJ]] (Java) - */ - def convertFormat(internal: Format): FormatJ = { - new FormatJ(internal.provider, internal.options.asJava) - } - - /** - * Convert a [[CommitInfo]] (Scala) to a [[CommitInfoJ]] (Java) - */ - def convertCommitInfo(internal: CommitInfo): CommitInfoJ = { - val notebookInfoOpt: OptionalJ[NotebookInfoJ] = if (internal.notebook.isDefined) { - OptionalJ.of(convertNotebookInfo(internal.notebook.get)) - } else { - OptionalJ.empty() - } - - val jobInfoOpt: OptionalJ[JobInfoJ] = if (internal.job.isDefined) { - OptionalJ.of(convertJobInfo(internal.job.get)) - } else { - OptionalJ.empty() - } - - new CommitInfoJ( - toJavaLongOptional(internal.version), - internal.timestamp, - toJavaStringOptional(internal.userId), - toJavaStringOptional(internal.userName), - internal.operation, - nullableMapAsJava(internal.operationParameters), - jobInfoOpt, - notebookInfoOpt, - toJavaStringOptional(internal.clusterId), - toJavaLongOptional(internal.readVersion), - toJavaStringOptional(internal.isolationLevel), - toJavaBooleanOptional(internal.isBlindAppend), - toJavaMapOptional(internal.operationMetrics), - toJavaStringOptional(internal.userMetadata), - toJavaStringOptional(internal.engineInfo) - ) - } - - /** - * Convert a [[JobInfo]] (Scala) to a [[JobInfoJ]] (Java) - */ - def convertJobInfo(internal: JobInfo): JobInfoJ = { - new JobInfoJ( - internal.jobId, - internal.jobName, - internal.runId, - internal.jobOwnerId, - internal.triggerType) - } - - /** - * Convert a [[NotebookInfo]] (Scala) to a [[NotebookInfoJ]] (Java) - */ - def convertNotebookInfo(internal: NotebookInfo): NotebookInfoJ = { - new NotebookInfoJ(internal.notebookId) - } - - def convertSetTransaction(internal: SetTransaction): SetTransactionJ = { - new SetTransactionJ(internal.appId, internal.version, toJavaLongOptional(internal.lastUpdated)) - } - - def convertProtocol(internal: Protocol): ProtocolJ = { - new ProtocolJ(internal.minReaderVersion, internal.minWriterVersion) - } - - def convertAction(internal: Action): ActionJ = internal match { - case x: AddFile => convertAddFile(x) - case x: AddCDCFile => convertAddCDCFile(x) - case x: RemoveFile => convertRemoveFile(x) - case x: CommitInfo => convertCommitInfo(x) - case x: Metadata => convertMetadata(x) - case x: SetTransaction => convertSetTransaction(x) - case x: Protocol => convertProtocol(x) - } - - /////////////////////////////////////////////////////////////////////////// - // Java to Scala conversions - /////////////////////////////////////////////////////////////////////////// - - private implicit def toScalaOption[J, S](opt: OptionalJ[J]): Option[S] = - if (opt.isPresent) Some(opt.get().asInstanceOf[S]) else None - - def convertActionJ(external: ActionJ): Action = external match { - case x: AddFileJ => convertAddFileJ(x) - case x: AddCDCFileJ => convertAddCDCFileJ(x) - case x: RemoveFileJ => convertRemoveFileJ(x) - case x: CommitInfoJ => convertCommitInfoJ(x) - case x: MetadataJ => convertMetadataJ(x) - case x: SetTransactionJ => convertSetTransactionJ(x) - case x: ProtocolJ => convertProtocolJ(x) - case _ => throw new UnsupportedOperationException("cannot convert this Java Action") - } - - def convertAddFileJ(external: AddFileJ): AddFile = { - AddFile( - external.getPath, - if (external.getPartitionValues == null) null else external.getPartitionValues.asScala.toMap, - external.getSize, - external.getModificationTime, - external.isDataChange, - external.getStats, - if (external.getTags != null) external.getTags.asScala.toMap else null - ) - } - - def convertAddCDCFileJ(external: AddCDCFileJ): AddCDCFile = { - AddCDCFile( - external.getPath, - if (external.getPartitionValues == null) null else external.getPartitionValues.asScala.toMap, - external.getSize, - if (external.getTags == null) null else external.getTags.asScala.toMap - ) - } - - def convertRemoveFileJ(external: RemoveFileJ): RemoveFile = { - RemoveFile( - external.getPath, - external.getDeletionTimestamp, - external.isDataChange, - external.isExtendedFileMetadata, - if (external.isExtendedFileMetadata && external.getPartitionValues != null) { - external.getPartitionValues.asScala.toMap - } else null, - external.getSize, - if (external.isExtendedFileMetadata && external.getTags != null) { - external.getTags.asScala.toMap - } else null - ) - } - - def convertCommitInfoJ(external: CommitInfoJ): CommitInfo = { - CommitInfo( - external.getVersion, - external.getTimestamp, - external.getUserId, - external.getUserName, - external.getOperation, - if (external.getOperationParameters != null) { - external.getOperationParameters.asScala.toMap - } else null, - if (external.getJobInfo.isDefined) { - Some(convertJobInfoJ(external.getJobInfo.get())) - } else None, - if (external.getNotebookInfo.isDefined) { - Some(convertNotebookInfoJ(external.getNotebookInfo.get())) - } else None, - external.getClusterId, - external.getReadVersion, - external.getIsolationLevel, - external.getIsBlindAppend, - if (external.getOperationMetrics.isDefined) { - Some(external.getOperationMetrics.get.asScala.toMap) - } else None, - external.getUserMetadata, - external.getEngineInfo - ) - } - - def convertMetadataJ(external: MetadataJ): Metadata = { - Metadata( - external.getId, - external.getName, - external.getDescription, - convertFormatJ(external.getFormat), - if (external.getSchema == null) null else external.getSchema.toJson, - external.getPartitionColumns.asScala.toSeq, - if (external.getConfiguration == null) null else external.getConfiguration.asScala.toMap, - external.getCreatedTime - ) - } - - def convertProtocolJ(external: ProtocolJ): Protocol = { - Protocol( - external.getMinReaderVersion, - external.getMinWriterVersion - ) - } - - def convertFormatJ(external: FormatJ): Format = { - Format( - external.getProvider, - external.getOptions.asScala.toMap - ) - } - - def convertSetTransactionJ(external: SetTransactionJ): SetTransaction = { - SetTransaction( - external.getAppId, - external.getVersion, - external.getLastUpdated - ) - } - - def convertJobInfoJ(external: JobInfoJ): JobInfo = { - JobInfo( - external.getJobId, - external.getJobName, - external.getRunId, - external.getJobOwnerId, - external.getTriggerType - ) - } - - def convertNotebookInfoJ(external: NotebookInfoJ): NotebookInfo = { - NotebookInfo(external.getNotebookId) - } - -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/DataTypeParser.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/DataTypeParser.scala deleted file mode 100644 index 6ec22c3db9b..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/DataTypeParser.scala +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This file contains code from the Apache Spark project (original license above). - * It contains modifications, which are licensed as follows: - */ - -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import scala.collection.JavaConverters._ - -import org.json4s._ -import org.json4s.JsonAST.JValue -import org.json4s.JsonDSL._ -import org.json4s.jackson.JsonMethods._ - -import io.delta.standalone.types._ - -private[standalone] object DataTypeParser { - - private val FIXED_DECIMAL = """decimal\(\s*(\d+)\s*,\s*(\-?\d+)\s*\)""".r - - private val nonDecimalNameToType = { - Seq(new NullType, new DateType, new TimestampType, new BinaryType, new IntegerType, - new BooleanType, new LongType, new DoubleType, new FloatType, new ShortType, new ByteType, - new StringType).map(t => t.getTypeName -> t).toMap - } - - def fromJson(json: String): DataType = parseDataType(parse(json)) - - private def parseDataType(json: JValue): DataType = json match { - case JString(name) => - nameToType(name) - - case JSortedObject( - ("containsNull", JBool(n)), - ("elementType", t: JValue), - ("type", JString("array"))) => - new ArrayType(parseDataType(t), n) - - case JSortedObject( - ("keyType", k: JValue), - ("type", JString("map")), - ("valueContainsNull", JBool(n)), - ("valueType", v: JValue)) => - new MapType(parseDataType(k), parseDataType(v), n) - - case JSortedObject( - ("fields", JArray(fields)), - ("type", JString("struct"))) => - new StructType(fields.map(parseStructField).toArray) - - case other => - throw new IllegalArgumentException( - s"Failed to convert the JSON string '${compact(render(other))}' to a data type.") - } - - def toJson(value: DataType): String = compact(render(dataTypeToJValue(value))) - - def toPrettyJson(value: DataType): String = pretty(render(dataTypeToJValue(value))) - - private def dataTypeToJValue(dataType: DataType): JValue = dataType match { - case array: ArrayType => - ("type" -> "array") ~ - ("elementType" -> dataTypeToJValue(array.getElementType)) ~ - ("containsNull" -> array.containsNull()) - case map: MapType => - ("type" -> "map") ~ - ("keyType" -> dataTypeToJValue(map.getKeyType())) ~ - ("valueType" -> dataTypeToJValue(map.getValueType())) ~ - ("valueContainsNull" -> map.valueContainsNull()) - case struct: StructType => - ("type" -> "struct") ~ - ("fields" -> struct.getFields().map(structFieldToJValue).toList) - case decimal: DecimalType => - s"decimal(${decimal.getPrecision()},${decimal.getScale()})" - case _: DataType => - dataType.getTypeName() - } - - private def structFieldToJValue(field: StructField): JValue = { - val name = field.getName() - val dataType = field.getDataType() - val nullable = field.isNullable() - val metadata = field.getMetadata() - - ("name" -> name) ~ - ("type" -> dataTypeToJValue(dataType)) ~ - ("nullable" -> nullable) ~ - ("metadata" -> metadataValueToJValue(metadata)) - } - - private def metadataValueToJValue(value: Any): JValue = { - value match { - case metadata: FieldMetadata => - JObject(metadata.getEntries().entrySet().asScala.map(e => - (e.getKey(), metadataValueToJValue(e.getValue()))).toList) - case arr: Array[Object] => - JArray(arr.toList.map(metadataValueToJValue)) - case x: Long => - JInt(x) - case x: Double => - JDouble(x) - case x: Boolean => - JBool(x) - case x: String => - JString(x) - case null => - JNull - case other => - throw new IllegalArgumentException( - s"Failed to convert ${value.getClass()} instance to JValue.") - } - } - - /** Given the string representation of a type, return its DataType */ - private def nameToType(name: String): DataType = { - name match { - case "decimal" => DecimalType.USER_DEFAULT - case FIXED_DECIMAL(precision, scale) => new DecimalType(precision.toInt, scale.toInt) - case other => nonDecimalNameToType.getOrElse( - other, - throw new IllegalArgumentException( - s"Failed to convert the JSON string '$name' to a data type.")) - } - } - - private def parseStructField(json: JValue): StructField = json match { - case JSortedObject( - ("metadata", metadata: JObject), - ("name", JString(name)), - ("nullable", JBool(nullable)), - ("type", dataType: JValue)) => - new StructField(name, parseDataType(dataType), nullable, parseFieldMetadata(metadata)) - case JSortedObject( - ("name", JString(name)), - ("nullable", JBool(nullable)), - ("type", dataType: JValue)) => - new StructField(name, parseDataType(dataType), nullable) - case other => - throw new IllegalArgumentException( - s"Failed to convert the JSON string '${compact(render(other))}' to a field.") - } - - private def parseFieldMetadata(metadata: JObject): FieldMetadata = { - val builder = FieldMetadata.builder() - metadata.obj.foreach { - case (key, JInt(value)) => - builder.putLong(key, value.toLong) - case(key, JDouble(value)) => - builder.putDouble(key, value) - case (key, JBool(value)) => - builder.putBoolean(key, value) - case (key, JString(value)) => - builder.putString(key, value) - case (key, o: JObject) => - builder.putMetadata(key, parseFieldMetadata(o)) - case (key, JArray(value)) => - if (value.isEmpty) { - // If it is an empty array, we cannot infer its element type. We put an empty Array[Long]. - builder.putLongArray(key, Array.empty) - } else { - value.head match { - case _: JInt => - builder.putLongArray(key, - value.map(_.asInstanceOf[JInt].num.toLong.asInstanceOf[java.lang.Long]).toArray) - case _: JDouble => - builder.putDoubleArray(key, - value.asInstanceOf[List[JDouble]].map(_.num.asInstanceOf[java.lang.Double]).toArray) - case _: JBool => - builder.putBooleanArray(key, - value.asInstanceOf[List[JBool]].map(_.value.asInstanceOf[java.lang.Boolean]) - .toArray) - case _: JString => - builder.putStringArray(key, value.asInstanceOf[List[JString]].map(_.s).toArray) - case _: JObject => - builder.putMetadataArray(key, - value.asInstanceOf[List[JObject]].map(parseFieldMetadata).toArray) - case other => - throw new IllegalArgumentException( - s"Unsupported ${value.head.getClass()} Array as metadata value.") - } - } - case (key, JNull) => - builder.putNull(key) - case (key, other) => - throw new IllegalArgumentException( - s"Unsupported ${other.getClass()} instance as metadata value.") - } - builder.build() - } - - private object JSortedObject { - def unapplySeq(value: JValue): Option[List[(String, JValue)]] = value match { - case JObject(seq) => Some(seq.sortBy(_._1)) - case _ => None - } - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/DateTimeConstants.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/DateTimeConstants.scala deleted file mode 100644 index d7e97f1af5c..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/DateTimeConstants.scala +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -private[internal] object DateTimeConstants { - - val MONTHS_PER_YEAR = 12 - - val DAYS_PER_WEEK = 7 - - val HOURS_PER_DAY = 24L - - val MINUTES_PER_HOUR = 60L - - val SECONDS_PER_MINUTE = 60L - val SECONDS_PER_HOUR: Long = MINUTES_PER_HOUR * SECONDS_PER_MINUTE - val SECONDS_PER_DAY: Long = HOURS_PER_DAY * SECONDS_PER_HOUR - - val MILLIS_PER_SECOND = 1000L - val MILLIS_PER_MINUTE: Long = SECONDS_PER_MINUTE * MILLIS_PER_SECOND - val MILLIS_PER_HOUR: Long = MINUTES_PER_HOUR * MILLIS_PER_MINUTE - val MILLIS_PER_DAY: Long = HOURS_PER_DAY * MILLIS_PER_HOUR - - val MICROS_PER_MILLIS = 1000L - val MICROS_PER_SECOND: Long = MILLIS_PER_SECOND * MICROS_PER_MILLIS - val MICROS_PER_MINUTE: Long = SECONDS_PER_MINUTE * MICROS_PER_SECOND - val MICROS_PER_HOUR: Long = MINUTES_PER_HOUR * MICROS_PER_MINUTE - val MICROS_PER_DAY: Long = HOURS_PER_DAY * MICROS_PER_HOUR - - val NANOS_PER_MICROS = 1000L - val NANOS_PER_MILLIS: Long = MICROS_PER_MILLIS * NANOS_PER_MICROS - val NANOS_PER_SECOND: Long = MILLIS_PER_SECOND * NANOS_PER_MILLIS - -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/DeltaFileOperations.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/DeltaFileOperations.scala deleted file mode 100644 index bde3b04da6d..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/DeltaFileOperations.scala +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import org.apache.hadoop.fs.{FileSystem, Path} - -import io.delta.standalone.internal.logging.Logging - -/** - * Utility methods on files, directories, and paths. - */ -private[internal] object DeltaFileOperations extends Logging { - - /** - * Given a path `child`: - * 1. Returns `child` if the path is already relative - * 2. Tries relativizing `child` with respect to `basePath` - * a) If the `child` doesn't live within the same base path, returns `child` as is - * b) If `child` lives in a different FileSystem, throws an exception - * Note that `child` may physically be pointing to a path within `basePath`, but may logically - * belong to a different FileSystem, e.g. DBFS mount points and direct S3 paths. - */ - def tryRelativizePath( - fs: FileSystem, - basePath: Path, - child: Path, - ignoreError: Boolean = false): Path = { - // We can map multiple schemes to the same `FileSystem` class, but `FileSystem.getScheme` is - // usually just a hard-coded string. Hence, we need to use the scheme of the URI that we use to - // create the FileSystem here. - if (child.isAbsolute) { - try { - new Path(fs.makeQualified(basePath).toUri.relativize(fs.makeQualified(child).toUri)) - } catch { - case _: IllegalArgumentException if ignoreError => - // ES-85571: when the file system failed to make the child path qualified, - // it means the child path exists in a different file system - // (a different authority or schema). This usually happens when the file is coming - // from the across buckets or across cloud storage system shallow clone. - // When ignoreError being set to true, not try to relativize this path, - // ignore the error and just return `child` as is. - child - case e: IllegalArgumentException => - logError(s"Failed to relativize the path ($child) " + - s"with the base path ($basePath) and the file system URI (${fs.getUri})", e) - throw new IllegalStateException( - s"""Failed to relativize the path ($child). This can happen when absolute paths make - |it into the transaction log, which start with the scheme - |s3://, wasbs:// or adls://. - | - |If this table was created with a shallow clone across file systems - |(different buckets/containers) and this table is NOT USED IN PRODUCTION, you can - |set the hadoop configuration io.delta.vacuum.relativize.ignoreError - |to true. Using this configuration could lead to accidental data loss, - |therefore we do not recommend the use of this flag unless - |this is a shallow clone for testing purposes. - """.stripMargin) - } - } else { - child - } - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/FileNames.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/FileNames.scala deleted file mode 100644 index 74346f41529..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/FileNames.scala +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import java.net.URI - -import org.apache.hadoop.fs.Path - -/** Helper for creating file names for specific commits / checkpoints. */ -private[internal] object FileNames { - - val deltaFilePattern = "\\d+\\.json".r.pattern - val checkpointFilePattern = "\\d+\\.checkpoint(\\.\\d+\\.\\d+)?\\.parquet".r.pattern - - /** Returns the path for a given delta file. */ - def deltaFile(path: Path, version: Long): Path = new Path(path, f"$version%020d.json") - - /** Returns the version for the given delta path. */ - def deltaVersion(path: Path): Long = path.getName.stripSuffix(".json").toLong - - /** - * Returns the prefix of all checkpoint files for the given version. - * - * Intended for use with listFrom to get all files from this version onwards. The returned Path - * will not exist as a file. - */ - def checkpointPrefix(path: Path, version: Long): Path = - new Path(path, f"$version%020d.checkpoint") - - /** - * Returns the path for a singular checkpoint up to the given version. - * - * In a future protocol version this path will stop being written. - */ - def checkpointFileSingular(path: Path, version: Long): Path = - new Path(path, f"$version%020d.checkpoint.parquet") - - /** - * Returns the paths for all parts of the checkpoint up to the given version. - * - * In a future protocol version we will write this path instead of checkpointFileSingular. - * - * Example of the format: 00000000000000004915.checkpoint.0000000020.0000000060.parquet is - * checkpoint part 20 out of 60 for the snapshot at version 4915. Zero padding is for - * lexicographic sorting. - */ - def checkpointFileWithParts(path: Path, version: Long, numParts: Int): Seq[Path] = { - Range(1, numParts + 1) - .map(i => new Path(path, f"$version%020d.checkpoint.$i%010d.$numParts%010d.parquet")) - } - - def numCheckpointParts(path: Path): Option[Int] = { - val segments = path.getName.split("\\.") - - if (segments.size != 5) None else Some(segments(3).toInt) - } - - def isCheckpointFile(path: Path): Boolean = checkpointFilePattern.matcher(path.getName).matches() - - def isDeltaFile(path: Path): Boolean = deltaFilePattern.matcher(path.getName).matches() - - def checkpointVersion(path: Path): Long = path.getName.split("\\.")(0).toLong - - /** - * Get the version of the checkpoint, checksum or delta file. Throws an error if an unexpected - * file type is seen. These unexpected files should be filtered out to ensure forward - * compatibility in cases where new file types are added, but without an explicit protocol - * upgrade. - */ - def getFileVersion(path: Path): Long = { - if (isCheckpointFile(path)) { - checkpointVersion(path) - } else if (isDeltaFile(path)) { - deltaVersion(path) - } else { - // scalastyle:off throwerror - throw new AssertionError( - s"Unexpected file type found in transaction log: $path") - // scalastyle:on throwerror - } - } - - /** - * Returns the `child` path as an absolute path and resolves any escaped char sequences - */ - def absolutePath(parentDir: Path, child: String): Path = { - val p = new Path(new URI(child)) - if (p.isAbsolute) { - p - } else { - new Path(parentDir, p) - } - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/Implicits.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/Implicits.scala deleted file mode 100644 index 62e252fc365..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/Implicits.scala +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import scala.reflect.ClassTag - -import io.delta.standalone.data.CloseableIterator - -private[internal] object Implicits { - implicit class CloseableIteratorOps[T: ClassTag](private val iter: CloseableIterator[T]) { - import scala.collection.JavaConverters._ - - /** - * Convert the [[CloseableIterator]] (Java) to an in-memory [[Array]] (Scala). - * - * [[scala.collection.Iterator.toArray]] is used over [[scala.collection.Iterable.toSeq]] - * because `toSeq` is lazy, meaning `iter.close()` would be called before the Seq was actually - * generated. - */ - def toArray: Array[T] = { - try { - iter.asScala.toArray - } finally { - iter.close() - } - } - } - implicit class DeltaStorageCloseableIteratorOps[T: ClassTag] - (private val iter: io.delta.storage.CloseableIterator[T]) { - import scala.collection.JavaConverters._ - - /** - * Convert the [[io.delta.storage.CloseableIterator]] (Java) to an in-memory [[Array]] (Scala). - * - * [[scala.collection.Iterator.toArray]] is used over [[scala.collection.Iterable.toSeq]] - * because `toSeq` is lazy, meaning `iter.close()` would be called before the Seq was actually - * generated. - */ - def toArray: Array[T] = { - try { - iter.asScala.toArray - } finally { - iter.close() - } - } - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/IntervalUtils.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/IntervalUtils.scala deleted file mode 100644 index 636afcebb4a..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/IntervalUtils.scala +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import java.nio.charset.StandardCharsets - -private[internal] object IntervalUtils { - - object IntervalUnit extends Enumeration { - type IntervalUnit = Value - - val NANOSECOND = Value(0, "nanosecond") - val MICROSECOND = Value(1, "microsecond") - val MILLISECOND = Value(2, "millisecond") - val SECOND = Value(3, "second") - val MINUTE = Value(4, "minute") - val HOUR = Value(5, "hour") - val DAY = Value(6, "day") - val WEEK = Value(7, "week") - val MONTH = Value(8, "month") - val YEAR = Value(9, "year") - } - import IntervalUnit._ - - private object ParseState extends Enumeration { - type ParseState = Value - - val PREFIX, - TRIM_BEFORE_SIGN, - SIGN, - TRIM_BEFORE_VALUE, - VALUE, - VALUE_FRACTIONAL_PART, - TRIM_BEFORE_UNIT, - UNIT_BEGIN, - UNIT_SUFFIX, - UNIT_END = Value - } - private final val intervalStr = "interval" - private def unitToUtf8(unit: IntervalUnit): String = { - unit.toString - } - private final val yearStr = unitToUtf8(YEAR) - private final val monthStr = unitToUtf8(MONTH) - private final val weekStr = unitToUtf8(WEEK) - private final val dayStr = unitToUtf8(DAY) - private final val hourStr = unitToUtf8(HOUR) - private final val minuteStr = unitToUtf8(MINUTE) - private final val secondStr = unitToUtf8(SECOND) - private final val millisStr = unitToUtf8(MILLISECOND) - private final val microsStr = unitToUtf8(MICROSECOND) - - /** - * A safe version of `stringToInterval`. It returns null for invalid input string. - */ - def safeStringToInterval(input: String): CalendarInterval = { - try { - stringToInterval(input) - } catch { - case _: IllegalArgumentException => null - } - } - - /** - * Converts a string to [[CalendarInterval]] case-insensitively. - * - * @throws IllegalArgumentException if the input string is not in valid interval format. - */ - def stringToInterval(input: String): CalendarInterval = { - import ParseState._ - def throwIAE(msg: String, e: Exception = null) = { - throw new IllegalArgumentException(s"Error parsing '$input' to interval, $msg", e) - } - - if (input == null) { - throwIAE("interval string cannot be null") - } - // scalastyle:off caselocale .toLowerCase - val s = input.trim().toLowerCase - // scalastyle:on - val bytes = s.getBytes(StandardCharsets.UTF_8) - if (bytes.isEmpty) { - throwIAE("interval string cannot be empty") - } - var state = PREFIX - var i = 0 - var currentValue: Long = 0 - var isNegative: Boolean = false - var months: Int = 0 - var days: Int = 0 - var microseconds: Long = 0 - var fractionScale: Int = 0 - val initialFractionScale = (DateTimeConstants.NANOS_PER_SECOND / 10).toInt - var fraction: Int = 0 - var pointPrefixed: Boolean = false - - def trimToNextState(b: Byte, next: ParseState): Unit = { - if (Character.isWhitespace(b)) { - i += 1 - } else { - state = next - } - } - - def currentWord: String = { - val sep = "\\s+" - val strings = s.split(sep) - val lenRight = s.substring(i, s.length).split(sep) .length - strings(strings.length - lenRight) - } - - def matchAt(i: Int, str: String): Boolean = { - if (i + str.length > s.length) { - false - } else { - s.substring(i, i + str.length) == str - } - } - - while (i < bytes.length) { - val b = bytes(i) - state match { - case PREFIX => - if (s.startsWith(intervalStr)) { - if (s.length == - intervalStr.length) { - throwIAE("interval string cannot be empty") - } else if (!Character.isWhitespace( - bytes(i + intervalStr.length))) { - throwIAE(s"invalid interval prefix $currentWord") - } else { - i += intervalStr.length + 1 - } - } - state = TRIM_BEFORE_SIGN - case TRIM_BEFORE_SIGN => trimToNextState(b, SIGN) - case SIGN => - currentValue = 0 - fraction = 0 - // We preset next state from SIGN to TRIM_BEFORE_VALUE. If we meet '.' in the SIGN state, - // it means that the interval value we deal with here is a numeric with only fractional - // part, such as '.11 second', which can be parsed to 0.11 seconds. In this case, we need - // to reset next state to `VALUE_FRACTIONAL_PART` to go parse the fraction part of the - // interval value. - state = TRIM_BEFORE_VALUE - // We preset the scale to an invalid value to track fraction presence in the UNIT_BEGIN - // state. If we meet '.', the scale become valid for the VALUE_FRACTIONAL_PART state. - fractionScale = -1 - pointPrefixed = false - b match { - case '-' => - isNegative = true - i += 1 - case '+' => - isNegative = false - i += 1 - case _ if '0' <= b && b <= '9' => - isNegative = false - case '.' => - isNegative = false - fractionScale = initialFractionScale - pointPrefixed = true - i += 1 - state = VALUE_FRACTIONAL_PART - case _ => throwIAE( s"unrecognized number '$currentWord'") - } - case TRIM_BEFORE_VALUE => trimToNextState(b, VALUE) - case VALUE => - b match { - case _ if '0' <= b && b <= '9' => - try { - currentValue = Math.addExact(Math.multiplyExact(10, currentValue), (b - '0')) - } catch { - case e: ArithmeticException => throwIAE(e.getMessage, e) - } - case _ if Character.isWhitespace(b) => state = TRIM_BEFORE_UNIT - case '.' => - fractionScale = initialFractionScale - state = VALUE_FRACTIONAL_PART - case _ => throwIAE(s"invalid value '$currentWord'") - } - i += 1 - case VALUE_FRACTIONAL_PART => - if ('0' <= b && b <= '9' && fractionScale > 0) { - fraction += (b - '0') * fractionScale - fractionScale /= 10 - } else if (Character.isWhitespace(b) && - (!pointPrefixed || fractionScale < initialFractionScale)) { - fraction /= DateTimeConstants.NANOS_PER_MICROS.toInt - state = TRIM_BEFORE_UNIT - } else if ('0' <= b && b <= '9') { - throwIAE(s"interval can only support nanosecond precision, '$currentWord' is out" + - s" of range") - } else { - throwIAE(s"invalid value '$currentWord'") - } - i += 1 - case TRIM_BEFORE_UNIT => trimToNextState(b, UNIT_BEGIN) - case UNIT_BEGIN => - // Checks that only seconds can have the fractional part - if (b != 's' && fractionScale >= 0) { - throwIAE(s"'$currentWord' cannot have fractional part") - } - if (isNegative) { - currentValue = -currentValue - fraction = -fraction - } - try { - b match { - case 'y' if matchAt(i, yearStr) => - val monthsInYears = Math.multiplyExact( - DateTimeConstants.MONTHS_PER_YEAR, - currentValue) - months = Math.toIntExact(Math.addExact(months, monthsInYears)) - i += yearStr.length - case 'w' if matchAt(i, weekStr) => - val daysInWeeks = Math.multiplyExact(DateTimeConstants.DAYS_PER_WEEK, currentValue) - days = Math.toIntExact(Math.addExact(days, daysInWeeks)) - i += weekStr.length - case 'd' if matchAt(i, dayStr) => - days = Math.addExact(days, Math.toIntExact(currentValue)) - i += dayStr.length - case 'h' if matchAt(i, hourStr) => - val hoursUs = Math.multiplyExact(currentValue, DateTimeConstants.MICROS_PER_HOUR) - microseconds = Math.addExact(microseconds, hoursUs) - i += hourStr.length - case 's' if matchAt(i, secondStr) => - val secondsUs = Math.multiplyExact( - currentValue, - DateTimeConstants.MICROS_PER_SECOND) - microseconds = Math.addExact(Math.addExact(microseconds, secondsUs), fraction) - i += secondStr.length - case 'm' => - if (matchAt(i, monthStr)) { - months = Math.addExact(months, Math.toIntExact(currentValue)) - i += monthStr.length - } else if (matchAt(i, minuteStr)) { - val minutesUs = Math.multiplyExact( - currentValue, - DateTimeConstants.MICROS_PER_MINUTE) - microseconds = Math.addExact(microseconds, minutesUs) - i += minuteStr.length - } else if (matchAt(i, millisStr)) { - val millisUs = Math.multiplyExact( - currentValue, - DateTimeConstants.MICROS_PER_MILLIS) - microseconds = Math.addExact(microseconds, millisUs) - i += millisStr.length - } else if (matchAt(i, microsStr)) { - microseconds = Math.addExact(microseconds, currentValue) - i += microsStr.length - } else throwIAE(s"invalid unit '$currentWord'") - case _ => throwIAE(s"invalid unit '$currentWord'") - } - } catch { - case e: ArithmeticException => throwIAE(e.getMessage, e) - } - state = UNIT_SUFFIX - case UNIT_SUFFIX => - b match { - case 's' => state = UNIT_END - case _ if Character.isWhitespace(b) => state = TRIM_BEFORE_SIGN - case _ => throwIAE(s"invalid unit '$currentWord'") - } - i += 1 - case UNIT_END => - if (Character.isWhitespace(b) ) { - i += 1 - state = TRIM_BEFORE_SIGN - } else { - throwIAE(s"invalid unit '$currentWord'") - } - } - } - - val result = state match { - case UNIT_SUFFIX | UNIT_END | TRIM_BEFORE_SIGN => - new CalendarInterval(months, days, microseconds) - case TRIM_BEFORE_VALUE => throwIAE(s"expect a number after '$currentWord' but hit EOL") - case VALUE | VALUE_FRACTIONAL_PART => - throwIAE(s"expect a unit name after '$currentWord' but hit EOL") - case _ => throwIAE(s"unknown error when parsing '$currentWord'") - } - - result - } -} - diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/JsonUtils.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/JsonUtils.scala deleted file mode 100644 index 42d87bf4a90..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/JsonUtils.scala +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import com.fasterxml.jackson.annotation.JsonInclude.Include -import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper} -import com.fasterxml.jackson.module.scala.{DefaultScalaModule, ScalaObjectMapper} - -/** Useful json functions used around the Delta codebase. */ -private[internal] object JsonUtils { - // scalastyle:off - /** - * Used to convert between classes and JSON. Use `lazy` so that it's easier to see the real - * error when an incompatible `jackson-module-scala` version is on the classpath rather than - * `java.lang.NoClassDefFoundError: Could not initialize class io.delta.standalone.internal.util.JsonUtils$` - */ - // scalastyle:on - lazy val mapper = { - val mapper = new ObjectMapper with ScalaObjectMapper - mapper.setSerializationInclusion(Include.NON_ABSENT) - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - mapper.registerModule(DefaultScalaModule) - mapper - } - - def toJson[T: Manifest](obj: T): String = { - mapper.writeValueAsString(obj) - } - - def toPrettyJson[T: Manifest](obj: T): String = { - mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj) - } - - def fromJson[T: Manifest](json: String): T = { - mapper.readValue[T](json) - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/ManualClock.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/ManualClock.scala deleted file mode 100644 index 6035c00a4a9..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/ManualClock.scala +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import java.util.concurrent.TimeUnit - -/** - * A `Clock` whose time can be manually set and modified. Its reported time does not change - * as time elapses, but only as its time is modified by callers. This is mainly useful for - * testing. - * - * For this implementation, `getTimeMillis()` and `nanoTime()` always return the same value - * (adjusted for the correct unit). - * - * @param time initial time (in milliseconds since the epoch) - */ -private[internal] class ManualClock(private var time: Long) extends Clock { - - /** - * @return `ManualClock` with initial time 0 - */ - def this() = this(0L) - - override def getTimeMillis(): Long = synchronized { - time - } - - override def nanoTime(): Long = TimeUnit.MILLISECONDS.toNanos(getTimeMillis()) - - /** - * @param timeToSet new time (in milliseconds) that the clock should represent - */ - def setTime(timeToSet: Long): Unit = synchronized { - time = timeToSet - notifyAll() - } - - /** - * @param timeToAdd time (in milliseconds) to add to the clock's time - */ - def advance(timeToAdd: Long): Unit = synchronized { - time += timeToAdd - notifyAll() - } - - /** - * @param targetTime block until the clock time is set or advanced to at least this time - * @return current time reported by the clock when waiting finishes - */ - override def waitTillTime(targetTime: Long): Long = synchronized { - while (time < targetTime) { - wait(10) - } - getTimeMillis() - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/PartitionUtils.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/PartitionUtils.scala deleted file mode 100644 index 4d3b897a627..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/PartitionUtils.scala +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import java.util.Locale - -import scala.collection.JavaConverters._ - -import io.delta.standalone.expressions.{And, Expression, Literal} -import io.delta.standalone.types.StructType - -import io.delta.standalone.internal.actions.AddFile -import io.delta.standalone.internal.data.PartitionRowRecord - - -private[internal] object PartitionUtils { - - /** - * Filters the given [[AddFile]]s by the given `partitionFilters`, returning those that match. - * - * This is different from - * [[io.delta.standalone.internal.scan.FilteredDeltaScanImpl.getFilesScala]] in that this method - * already has the [[AddFile]]s in memory, whereas the `FilteredDeltaScanImpl` performs a - * memory-optimized replay to collect and filter the files. - * - * @param files The active files in the DeltaLog state, which contains the partition value - * information - * @param partitionFilter Filter on the partition columns - */ - def filterFileList( - partitionSchema: StructType, - files: Seq[AddFile], - partitionFilter: Expression): Seq[AddFile] = { - files.filter { addFile => - val partitionRowRecord = new PartitionRowRecord(partitionSchema, addFile.partitionValues) - val result = partitionFilter.eval(partitionRowRecord) - result.asInstanceOf[Boolean] - } - } - - /** - * Partition the given condition into two optional conjunctive predicates M, D such that - * condition = M AND D, where we define: - * - M: conjunction of predicates that can be evaluated using metadata only. - * - D: conjunction of other predicates. - */ - def splitMetadataAndDataPredicates( - condition: Expression, - partitionColumns: Seq[String]): (Option[Expression], Option[Expression]) = { - val (metadataPredicates, dataPredicates) = splitConjunctivePredicates(condition) - .partition(isPredicateMetadataOnly(_, partitionColumns)) - - val metadataConjunction = if (metadataPredicates.isEmpty) { - None - } else { - Some(metadataPredicates.reduceLeftOption(new And(_, _)).getOrElse(Literal.True)) - } - - val dataConjunction = if (dataPredicates.isEmpty) { - None - } else { - Some(dataPredicates.reduceLeftOption(new And(_, _)).getOrElse(Literal.True)) - } - - (metadataConjunction, dataConjunction) - } - - /** - * Check if condition can be evaluated using only metadata (i.e. partition columns) - */ - def isPredicateMetadataOnly(condition: Expression, partitionColumns: Seq[String]): Boolean = { - val lowercasePartCols = partitionColumns.map(_.toLowerCase(Locale.ROOT)) - - condition.references() - .asScala - .map(_.toLowerCase(Locale.ROOT)) - .forall(lowercasePartCols.contains(_)) - } - - private def splitConjunctivePredicates(condition: Expression): Seq[Expression] = { - condition match { - case a: And => splitConjunctivePredicates(a.getLeft) ++ splitConjunctivePredicates(a.getRight) - case other => other :: Nil - } - } - -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/SchemaMergingUtils.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/SchemaMergingUtils.scala deleted file mode 100644 index 6579a2a4184..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/SchemaMergingUtils.scala +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import io.delta.standalone.exceptions.DeltaStandaloneException -import io.delta.standalone.types.{ArrayType, DataType, MapType, StructType} - -/** - * Utils to merge table schema with data schema. - */ -private[internal] object SchemaMergingUtils { - - /** - * Returns all column names in this schema as a flat list. For example, a schema like: - * | - a - * | | - 1 - * | | - 2 - * | - b - * | - c - * | | - nest - * | | - 3 - * will get flattened to: "a", "a.1", "a.2", "b", "c", "c.nest", "c.nest.3" - */ - def explodeNestedFieldNames(schema: StructType): Seq[String] = { - def explode(schema: StructType): Seq[Seq[String]] = { - def recurseIntoComplexTypes(complexType: DataType): Seq[Seq[String]] = { - complexType match { - case s: StructType => explode(s) - case a: ArrayType => recurseIntoComplexTypes(a.getElementType).map(Seq("element") ++ _) - case m: MapType => - recurseIntoComplexTypes(m.getKeyType).map(Seq("key") ++ _) ++ - recurseIntoComplexTypes(m.getValueType).map(Seq("value") ++ _) - case _ => Nil - } - } - - schema.getFields.flatMap { f => - val name = f.getName - f.getDataType match { - case s: StructType => - Seq(Seq(name)) ++ explode(s).map(nested => Seq(name) ++ nested) - case a: ArrayType => - Seq(Seq(name)) ++ recurseIntoComplexTypes(a).map(nested => Seq(name) ++ nested) - case m: MapType => - Seq(Seq(name)) ++ recurseIntoComplexTypes(m).map(nested => Seq(name) ++ nested) - case _ => Seq(name) :: Nil - } - } - } - - explode(schema).map { nameParts => - nameParts.map(n => if (n.contains(".")) s"`$n`" else n).mkString(".") - } - } - - /** - * Checks if input column names have duplicate identifiers. This throws an exception if - * the duplication exists. - * - * @param schema the schema to check for duplicates - * @param colType column type name, used in an exception message - */ - def checkColumnNameDuplication(schema: StructType, colType: String): Unit = { - val columnNames = explodeNestedFieldNames(schema) - // scalastyle:off caselocale - val names = columnNames.map(_.toLowerCase) - // scalastyle:on caselocale - if (names.distinct.length != names.length) { - val duplicateColumns = names.groupBy(identity).collect { - case (x, ys) if ys.length > 1 => s"$x" - } - - throw new DeltaStandaloneException( - s"Found duplicate column(s) $colType: ${duplicateColumns.mkString(", ")}") - } - } -} diff --git a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/SchemaUtils.scala b/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/SchemaUtils.scala deleted file mode 100644 index 85b1f8e58f6..00000000000 --- a/connectors/standalone/src/main/scala/io/delta/standalone/internal/util/SchemaUtils.scala +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import io.delta.standalone.exceptions.DeltaStandaloneException -import io.delta.standalone.types.{ArrayType, DataType, MapType, StructField, StructType} - -import io.delta.standalone.internal.exception.DeltaErrors - -private[standalone] object SchemaUtils { - - /** - * Verifies that the column names are acceptable by Parquet and henceforth Delta. Parquet doesn't - * accept the characters ' ,;{}()\n\t'. We ensure that neither the data columns nor the partition - * columns have these characters. - */ - def checkFieldNames(names: Seq[String]): Unit = { - ParquetSchemaConverter.checkFieldNames(names) - - // The method checkFieldNames doesn't have a valid regex to search for '\n'. That should be - // fixed in Apache Spark, and we can remove this additional check here. - names.find(_.contains("\n")).foreach(col => throw DeltaErrors.invalidColumnName(col)) - } - - /** - * Go through the schema to look for unenforceable NOT NULL constraints and throw when they're - * encountered. - */ - def checkUnenforceableNotNullConstraints(schema: StructType): Unit = { - def checkField(path: Seq[String], f: StructField): Unit = f.getDataType match { - case a: ArrayType => if (!matchesNullableType(a.getElementType)) { - throw DeltaErrors.nestedNotNullConstraint( - prettyFieldName(path :+ f.getName), a.getElementType, nestType = "element") - } - case m: MapType => - val keyTypeNullable = matchesNullableType(m.getKeyType) - val valueTypeNullable = matchesNullableType(m.getValueType) - - if (!keyTypeNullable) { - throw DeltaErrors.nestedNotNullConstraint( - prettyFieldName(path :+ f.getName), m.getKeyType, nestType = "key") - } - if (!valueTypeNullable) { - throw DeltaErrors.nestedNotNullConstraint( - prettyFieldName(path :+ f.getName), m.getValueType, nestType = "value") - } - case _ => // nothing - } - - def traverseColumns[E <: DataType](path: Seq[String], dt: E): Unit = dt match { - case s: StructType => - s.getFields.foreach { field => - checkField(path, field) - traverseColumns(path :+ field.getName, field.getDataType) - } - case a: ArrayType => - traverseColumns(path :+ "element", a.getElementType) - case m: MapType => - traverseColumns(path :+ "key", m.getKeyType) - traverseColumns(path :+ "value", m.getValueType) - case _ => // nothing - } - - traverseColumns(Seq.empty, schema) - } - - /** - * As the Delta table updates, the schema may change as well. This method defines whether a new - * schema can replace a pre-existing schema of a Delta table. Our rules are to return false if - * the new schema: - * - Drops any column that is present in the current schema - * - Converts nullable=true to nullable=false for any column - * - Changes any datatype - * - Adds a new column with nullable=false - */ - def isWriteCompatible(existingSchema: StructType, newSchema: StructType): Boolean = { - - def isDatatypeWriteCompatible(_existingType: DataType, _newType: DataType): Boolean = { - (_existingType, _newType) match { - case (e: StructType, n: StructType) => - isWriteCompatible(e, n) - case (e: ArrayType, n: ArrayType) => - // if existing elements are nullable, so should be the new element - (!e.containsNull() || n.containsNull()) && - isDatatypeWriteCompatible(e.getElementType, n.getElementType) - case (e: MapType, n: MapType) => - // if existing value is nullable, so should be the new value - (!e.valueContainsNull || n.valueContainsNull) && - isDatatypeWriteCompatible(e.getKeyType, n.getKeyType) && - isDatatypeWriteCompatible(e.getValueType, n.getValueType) - case (a, b) => a == b - } - } - - def isStructWriteCompatible(_existingSchema: StructType, _newSchema: StructType): Boolean = { - val existing = toFieldMap(_existingSchema.getFields) - // scalastyle:off caselocale - val existingFieldNames = _existingSchema.getFieldNames.map(_.toLowerCase).toSet - assert(existingFieldNames.size == _existingSchema.length, - "Delta tables don't allow field names that only differ by case") - val newFields = _newSchema.getFieldNames.map(_.toLowerCase).toSet - assert(newFields.size == _newSchema.length, - "Delta tables don't allow field names that only differ by case") - // scalastyle:on caselocale - - if (!existingFieldNames.subsetOf(newFields)) { - // Dropped a column that was present in the DataFrame schema - return false - } - _newSchema.getFields.forall { newField => - existing.get(newField.getName) match { - case Some(existingField) => - // we know the name matches modulo case - now verify exact match - (existingField.getName == newField.getName - // if existing value is nullable, so should be the new value - && (!existingField.isNullable || newField.isNullable) - // and the type of the field must be compatible, too - && isDatatypeWriteCompatible(existingField.getDataType, newField.getDataType)) - case None => - // Cannot add a new column with nullable=false - newField.isNullable - } - } - } - - isStructWriteCompatible(existingSchema, newSchema) - } - - /////////////////////////////////////////////////////////////////////////// - // Helper Methods - /////////////////////////////////////////////////////////////////////////// - - private def toFieldMap(fields: Seq[StructField]): Map[String, StructField] = { - CaseInsensitiveMap(fields.map(field => field.getName -> field).toMap) - } - - /** - * This is a simpler version of Delta OSS SchemaUtils::typeAsNullable. Instead of returning the - * nullable DataType, returns true if the input `dt` matches the nullable DataType. - */ - private def matchesNullableType(dt: DataType): Boolean = dt match { - case s: StructType => s.getFields.forall { field => - field.isNullable && matchesNullableType(field.getDataType) - } - - case a: ArrayType => a.getElementType match { - case s: StructType => - a.containsNull() && matchesNullableType(s) - case _ => - a.containsNull() - } - - case m: MapType => (m.getKeyType, m.getValueType) match { - case (s1: StructType, s2: StructType) => - m.valueContainsNull() && matchesNullableType(s1) && matchesNullableType(s2) - case (s1: StructType, _) => - m.valueContainsNull() && matchesNullableType(s1) - case (_, s2: StructType) => - m.valueContainsNull() && matchesNullableType(s2) - case _ => true - } - - case _ => true - } - - private def prettyFieldName(columnPath: Seq[String]): String = - columnPath.map(n => if (n.contains(".")) s"`$n`" else n).mkString(".") - - private object ParquetSchemaConverter { - def checkFieldNames(names: Seq[String]): Unit = { - names.foreach(checkFieldName) - } - - def checkFieldName(name: String): Unit = { - // ,;{}()\n\t= and space are special characters in Parquet schema - checkConversionRequirement( - !name.matches(".*[ ,;{}()\n\t=].*"), - s"""Attribute name "$name" contains invalid character(s) among " ,;{}()\\n\\t=". - |Please use alias to rename it. - """.stripMargin.split("\n").mkString(" ").trim) - } - - def checkConversionRequirement(f: => Boolean, message: String): Unit = { - if (!f) { - throw new DeltaStandaloneException(message) - } - } - } -} diff --git a/connectors/standalone/src/test/resources/log4j.properties b/connectors/standalone/src/test/resources/log4j.properties deleted file mode 100644 index 37b5230dadd..00000000000 --- a/connectors/standalone/src/test/resources/log4j.properties +++ /dev/null @@ -1,48 +0,0 @@ -# -# Copyright (2020-present) The Delta Lake Project Authors. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# Set everything to be logged to the file target/unit-tests.log -test.appender=file -log4j.rootCategory=INFO, ${test.appender} -log4j.appender.file=org.apache.log4j.FileAppender -log4j.appender.file.append=true -log4j.appender.file.file=target/unit-tests.log -log4j.appender.file.layout=org.apache.log4j.PatternLayout -log4j.appender.file.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss.SSS} %t %p %c{1}: %m%n - -# Tests that launch java subprocesses can set the "test.appender" system property to -# "console" to avoid having the child process's logs overwrite the unit test's -# log file. -log4j.appender.console=org.apache.log4j.ConsoleAppender -log4j.appender.console.target=System.err -log4j.appender.console.layout=org.apache.log4j.PatternLayout -log4j.appender.console.layout.ConversionPattern=%t: %m%n - -# Ignore messages below warning level from Jetty, because it's a bit verbose -log4j.logger.org.spark_project.jetty=WARN diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/ActionBuildersSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/ActionBuildersSuite.scala deleted file mode 100644 index 831e6e4e683..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/ActionBuildersSuite.scala +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.sql.Timestamp -import java.util.{Collections, Optional} - -import scala.collection.JavaConverters._ - -import org.scalatest.FunSuite - -import io.delta.standalone.actions.{AddFile => AddFileJ, CommitInfo => CommitInfoJ, Format => FormatJ, JobInfo => JobInfoJ, Metadata => MetadataJ, NotebookInfo => NotebookInfoJ} -import io.delta.standalone.types.{IntegerType, StructField => StructFieldJ, StructType => StructTypeJ} - -class ActionBuildersSuite extends FunSuite { - test("builder action class constructor for Metadata") { - val metadataFromBuilderDefaults = MetadataJ.builder().build() - val metadataFromConstructorDefaults = new MetadataJ( - metadataFromBuilderDefaults.getId(), - null, - null, - new FormatJ("parquet", Collections.emptyMap()), - Collections.emptyList(), - Collections.emptyMap(), - metadataFromBuilderDefaults.getCreatedTime(), - null); - assert(metadataFromBuilderDefaults == metadataFromConstructorDefaults) - - val metadataFromBuilder = MetadataJ.builder() - .id("test_id") - .name("test_name") - .description("test_description") - .format(new FormatJ("csv", Collections.emptyMap())) - .partitionColumns(List("id", "name").asJava) - .configuration(Map("test"->"foo").asJava) - .createdTime(0L) - .schema(new StructTypeJ(Array(new StructFieldJ("test_field", new IntegerType())))) - .build() - val metadataFromConstructor = new MetadataJ( - "test_id", - "test_name", - "test_description", - new FormatJ("csv", Collections.emptyMap()), - List("id", "name").asJava, - Map("test"->"foo").asJava, - Optional.of(0L), - new StructTypeJ(Array(new StructFieldJ("test_field", new IntegerType())))) - assert(metadataFromBuilder == metadataFromConstructor) - } - - test("Metadata constructor matches Metadata.Builder constructor") { - assert( - classOf[MetadataJ].getDeclaredConstructors - .filter(!_.isSynthetic) - .map(_.getParameterCount()).toList.max == - classOf[MetadataJ.Builder].getDeclaredConstructors - .filter(!_.isSynthetic) - .map(_.getParameterCount()).toList.max, - "Metadata and Metadata.Builder's constructors are not the same. Please update them " + - "accordingly if you add a new field to Metadata." - ) - } - - test("copyBuilder constructor for Metadata") { - val metadata = new MetadataJ( - "test_id", - "test_name", - "test_description", - new FormatJ("csv", Collections.emptyMap()), - List("id", "name").asJava, - Map("test"->"foo").asJava, - Optional.empty(), - null) - assert(metadata == metadata.copyBuilder().build()) // values are copied - - val defaultMetadata = MetadataJ.builder().build() - assert(defaultMetadata == defaultMetadata.copyBuilder().build()) // default values are copied - - val overwrittenMetadata = new MetadataJ( - "foo", - "foo", - "foo", - new FormatJ("csv", Collections.emptyMap()), - List("id", "name").asJava, - Map("test"->"foo").asJava, - Optional.of(0L), - null) - assert(overwrittenMetadata == metadata.copyBuilder() // values can be overwritten - .id("foo").name("foo").description("foo").createdTime(0L) - .build()) - } - - test("builder action class constructor for AddFile") { - val addFileFromBuilderDefaults = AddFileJ.builder( - "/test", - Collections.emptyMap(), - 0L, - 0L, - true).build() - val addFileFromConstructorDefaults = new AddFileJ( - "/test", - Collections.emptyMap(), - 0L, - 0L, - true, - null, - null) - assert(addFileFromBuilderDefaults == addFileFromConstructorDefaults) - - val addFileFromBuilder = AddFileJ.builder( - "/test", - Collections.emptyMap(), - 0L, - 0L, - true) - .stats("test_stats") - .tags(Map("test"->"foo").asJava) - .build() - val addFileFromConstructor = new AddFileJ( - "/test", - Collections.emptyMap(), - 0L, - 0L, - true, - "test_stats", - Map("test"->"foo").asJava) - assert(addFileFromBuilder == addFileFromConstructor) - } - - test("builder action class constructor for JobInfo") { - val jobInfoFromBuilderDefaults = JobInfoJ.builder("test").build() - val jobInfoFromConstructorDefaults = new JobInfoJ( - "test", - null, - null, - null, - null) - assert(jobInfoFromBuilderDefaults == jobInfoFromConstructorDefaults) - - val jobInfoFromBuilder = JobInfoJ.builder("test") - .jobName("test_name") - .runId("test_id") - .jobOwnerId("test_job_id") - .triggerType("test_trigger_type") - .build() - val jobInfoFromConstructor = new JobInfoJ( - "test", - "test_name", - "test_id", - "test_job_id", - "test_trigger_type") - assert(jobInfoFromBuilder == jobInfoFromConstructor) - } - - test("builder action class constructor for CommitInfo") { - val commitInfoFromBuilderDefaults = CommitInfoJ.builder().build() - val commitInfoFromConstructorDefaults = new CommitInfoJ( - Optional.empty(), - null, - Optional.empty(), - Optional.empty(), - null, - null, - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty()) - assert(commitInfoFromBuilderDefaults == commitInfoFromConstructorDefaults) - - val commitInfoFromBuilder = CommitInfoJ.builder() - .version(0L) - .timestamp(new Timestamp(1540415658000L)) - .userId("test_id") - .userName("test_name") - .operation("test_op") - .operationParameters(Map("test"->"op").asJava) - .jobInfo(JobInfoJ.builder("test").build()) - .notebookInfo(new NotebookInfoJ("test")) - .clusterId("test_clusterId") - .readVersion(0L) - .isolationLevel("test_level") - .isBlindAppend(true) - .operationMetrics(Map("test"->"metric").asJava) - .userMetadata("user_metadata") - .engineInfo("engine_info") - .build() - val commitInfoFromConstructor = new CommitInfoJ( - Optional.of(0L), - new Timestamp(1540415658000L), - Optional.of("test_id"), - Optional.of("test_name"), - "test_op", - Map("test"->"op").asJava, - Optional.of(JobInfoJ.builder("test").build()), - Optional.of(new NotebookInfoJ("test")), - Optional.of("test_clusterId"), - Optional.of(0L), - Optional.of("test_level"), - Optional.of(true), - Optional.of(Map("test"->"metric").asJava), - Optional.of("user_metadata"), - Optional.of("engine_info")) - assert(commitInfoFromBuilder == commitInfoFromConstructor) - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/BenchmarkPartitionFilterRecordCachingSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/BenchmarkPartitionFilterRecordCachingSuite.scala deleted file mode 100644 index b8ec69d9a67..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/BenchmarkPartitionFilterRecordCachingSuite.scala +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.io.File - -import scala.collection.mutable - -import org.apache.hadoop.conf.Configuration -import org.scalatest.{FunSuite, Ignore} - -import io.delta.standalone.Operation -import io.delta.standalone.expressions.{And, EqualTo, Literal} -import io.delta.standalone.types._ - -import io.delta.standalone.internal.actions.{AddFile, Metadata} -import io.delta.standalone.internal.logging.Logging -import io.delta.standalone.internal.sources.StandaloneHadoopConf -import io.delta.standalone.internal.util.TestUtils._ - -/** - * Micro-benchmarking the feature caching partition filter record. - * To run this, temporarily remove @Ignore. - */ -@Ignore -class BenchmarkPartitionFilterRecordCachingSuite extends FunSuite with Logging { - - private val op = new Operation(Operation.Name.WRITE) - - private val schema = new StructType(Array( - new StructField("col1", new StringType(), true), - new StructField("col2", new StringType(), true), - new StructField("col3", new StringType(), true), - new StructField("col4", new StringType(), true), - new StructField("col5", new IntegerType(), true) - )) - - private val partitionSchema = new StructType(Array( - new StructField("col1", new StringType(), true), - new StructField("col2", new StringType(), true), - new StructField("col3", new StringType(), true), - new StructField("col4", new StringType(), true) - )) - - private val metadata = Metadata( - partitionColumns = partitionSchema.getFieldNames, - schemaString = schema.toJson - ) - - private val addFiles = (1 to 10000).map { i => - val partitionValues = Map( - "col1" -> (i % 2).toString, - "col2" -> (i % 3).toString, - "col3" -> (i % 2).toString, - "col4" -> (i % 5).toString - ) - AddFile(i.toString, partitionValues, 1L, 1L, dataChange = true) - } - - private val filter = new And( - new And( - new EqualTo(partitionSchema.column("col1"), Literal.of("1")), - new EqualTo(partitionSchema.column("col2"), Literal.of("2")) - ), - new And( - new EqualTo(partitionSchema.column("col3"), Literal.of("1")), - new EqualTo(partitionSchema.column("col4"), Literal.of("4")) - ) - ) - - private def scanAndMeasureElapsedTime(configuration: Configuration, file: File): Long = { - val deltaLog = DeltaLogImpl.forTable(configuration, file.getCanonicalPath) - deltaLog.startTransaction().commit(metadata :: Nil, op, "engineInfo") - deltaLog.startTransaction().commit(addFiles, op, "engineInfo") - val scan = deltaLog.update().scan(filter) - - val start = System.nanoTime() - - val iter = scan.getFiles - while (iter.hasNext) { - iter.hasNext - iter.next() - } - iter.close() - - val elapsed = System.nanoTime() - start - elapsed - } - - test("micro-benchmark with/ without partition filter record caching") { - val conf = new Configuration() - val confDisabledCaching = new Configuration() - confDisabledCaching.setBoolean(StandaloneHadoopConf.PARTITION_FILTER_RECORD_CACHING_KEY, false) - - val elapsedTimesWithCaching = mutable.ArrayBuffer.empty[Long] - val elapsedTimesWithoutCaching = mutable.ArrayBuffer.empty[Long] - - - (1 to 200).foreach { _ => - withTempDir { dir => - val elapsed = scanAndMeasureElapsedTime(conf, dir) - elapsedTimesWithCaching.append(elapsed) - } - - withTempDir { dir => - val elapsed = scanAndMeasureElapsedTime(confDisabledCaching, dir) - elapsedTimesWithoutCaching.append(elapsed) - } - } - - val totalTimesCaching = elapsedTimesWithCaching.sum - val totalTimesNoCaching = elapsedTimesWithoutCaching.sum - - assert(totalTimesCaching < totalTimesNoCaching) - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/BufferingLogDeletionIteratorSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/BufferingLogDeletionIteratorSuite.scala deleted file mode 100644 index 43de3005a44..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/BufferingLogDeletionIteratorSuite.scala +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import org.apache.hadoop.fs.{FileStatus, Path} -import org.scalatest.FunSuite - -class BufferingLogDeletionIteratorSuite extends FunSuite { - /** - * Creates FileStatus objects, where the name is the version of a commit, and the modification - * timestamps come from the input. - */ - private def createFileStatuses(modTimes: Long*): Iterator[FileStatus] = { - modTimes.zipWithIndex.map { case (time, version) => - new FileStatus(10L, false, 1, 10L, time, new Path(version.toString)) - }.iterator - } - - /** - * Creates a log deletion iterator with a retention `maxTimestamp` and `maxVersion` (both - * inclusive). The input iterator takes the original file timestamps, and the deleted output will - * return the adjusted timestamps of files that would actually be consumed by the iterator. - */ - private def testBufferingLogDeletionIterator( - maxTimestamp: Long, - maxVersion: Long)(inputTimestamps: Seq[Long], deleted: Seq[Long]): Unit = { - val i = new BufferingLogDeletionIterator( - createFileStatuses(inputTimestamps: _*), maxTimestamp, maxVersion, _.getName.toLong) - deleted.foreach { ts => - assert(i.hasNext, s"Was supposed to delete $ts, but iterator returned hasNext: false") - assert(i.next().getModificationTime === ts, "Returned files out of order!") - } - assert(!i.hasNext, "Iterator should be consumed") - } - - test("BufferingLogDeletionIterator: iterator behavior") { - val i1 = new BufferingLogDeletionIterator(Iterator.empty, 100, 100, _ => 1) - intercept[NoSuchElementException](i1.next()) - assert(!i1.hasNext) - - testBufferingLogDeletionIterator(maxTimestamp = 100, maxVersion = 100)( - inputTimestamps = Seq(10), - deleted = Seq(10) - ) - - testBufferingLogDeletionIterator(maxTimestamp = 100, maxVersion = 100)( - inputTimestamps = Seq(10, 15, 25), - deleted = Seq(10, 15, 25) - ) - } - - test("BufferingLogDeletionIterator: " + - "early exit while handling adjusted timestamps due to timestamp") { - // only should return 5 because 5 < 7 - testBufferingLogDeletionIterator(maxTimestamp = 7, maxVersion = 100)( - inputTimestamps = Seq(5, 10, 8, 12), - deleted = Seq(5) - ) - - // Should only return 5, because 10 is used to adjust the following 8 to 11 - testBufferingLogDeletionIterator(maxTimestamp = 10, maxVersion = 100)( - inputTimestamps = Seq(5, 10, 8, 12), - deleted = Seq(5) - ) - - // When it is 11, we can delete both 10 and 8 - testBufferingLogDeletionIterator(maxTimestamp = 11, maxVersion = 100)( - inputTimestamps = Seq(5, 10, 8, 12), - deleted = Seq(5, 10, 11) - ) - - // When it is 12, we can return all - testBufferingLogDeletionIterator(maxTimestamp = 12, maxVersion = 100)( - inputTimestamps = Seq(5, 10, 8, 12), - deleted = Seq(5, 10, 11, 12) - ) - - // Should only return 5, because 10 is used to adjust the following 8 to 11 - testBufferingLogDeletionIterator(maxTimestamp = 10, maxVersion = 100)( - inputTimestamps = Seq(5, 10, 8), - deleted = Seq(5) - ) - - // When it is 11, we can delete both 10 and 8 - testBufferingLogDeletionIterator(maxTimestamp = 11, maxVersion = 100)( - inputTimestamps = Seq(5, 10, 8), - deleted = Seq(5, 10, 11) - ) - } - - test("BufferingLogDeletionIterator: " + - "early exit while handling adjusted timestamps due to version") { - // only should return 5 because we can delete only up to version 0 - testBufferingLogDeletionIterator(maxTimestamp = 100, maxVersion = 0)( - inputTimestamps = Seq(5, 10, 8, 12), - deleted = Seq(5) - ) - - // Should only return 5, because 10 is used to adjust the following 8 to 11 - testBufferingLogDeletionIterator(maxTimestamp = 100, maxVersion = 1)( - inputTimestamps = Seq(5, 10, 8, 12), - deleted = Seq(5) - ) - - // When we can delete up to version 2, we can return up to version 2 - testBufferingLogDeletionIterator(maxTimestamp = 100, maxVersion = 2)( - inputTimestamps = Seq(5, 10, 8, 12), - deleted = Seq(5, 10, 11) - ) - - // When it is version 3, we can return all - testBufferingLogDeletionIterator(maxTimestamp = 100, maxVersion = 3)( - inputTimestamps = Seq(5, 10, 8, 12), - deleted = Seq(5, 10, 11, 12) - ) - - // Should only return 5, because 10 is used to adjust the following 8 to 11 - testBufferingLogDeletionIterator(maxTimestamp = 100, maxVersion = 1)( - inputTimestamps = Seq(5, 10, 8), - deleted = Seq(5) - ) - - // When we can delete up to version 2, we can return up to version 2 - testBufferingLogDeletionIterator(maxTimestamp = 100, maxVersion = 2)( - inputTimestamps = Seq(5, 10, 8), - deleted = Seq(5, 10, 11) - ) - } - - test("BufferingLogDeletionIterator: multiple adjusted timestamps") { - Seq(9, 10, 11).foreach { retentionTimestamp => - // Files should be buffered but not deleted, because of the file 11, which has adjusted ts 12 - testBufferingLogDeletionIterator(maxTimestamp = retentionTimestamp, maxVersion = 100)( - inputTimestamps = Seq(5, 10, 8, 11, 14), - deleted = Seq(5) - ) - } - - // Safe to delete everything before (including) file: 11 which has adjusted timestamp 12 - testBufferingLogDeletionIterator(maxTimestamp = 12, maxVersion = 100)( - inputTimestamps = Seq(5, 10, 8, 11, 14), - deleted = Seq(5, 10, 11, 12) - ) - - Seq(0, 1, 2).foreach { retentionVersion => - testBufferingLogDeletionIterator(maxTimestamp = 100, maxVersion = retentionVersion)( - inputTimestamps = Seq(5, 10, 8, 11, 14), - deleted = Seq(5) - ) - } - - testBufferingLogDeletionIterator(maxTimestamp = 100, maxVersion = 3)( - inputTimestamps = Seq(5, 10, 8, 11, 14), - deleted = Seq(5, 10, 11, 12) - ) - - // Test when the last element is adjusted with both timestamp and version - Seq(9, 10, 11).foreach { retentionTimestamp => - testBufferingLogDeletionIterator(maxTimestamp = retentionTimestamp, maxVersion = 100)( - inputTimestamps = Seq(5, 10, 8, 9), - deleted = Seq(5) - ) - } - - testBufferingLogDeletionIterator(maxTimestamp = 12, maxVersion = 100)( - inputTimestamps = Seq(5, 10, 8, 9), - deleted = Seq(5, 10, 11, 12) - ) - - Seq(0, 1, 2).foreach { retentionVersion => - testBufferingLogDeletionIterator(maxTimestamp = 100, maxVersion = retentionVersion)( - inputTimestamps = Seq(5, 10, 8, 9), - deleted = Seq(5) - ) - } - - testBufferingLogDeletionIterator(maxTimestamp = 100, maxVersion = 3)( - inputTimestamps = Seq(5, 10, 8, 9), - deleted = Seq(5, 10, 11, 12) - ) - - Seq(9, 10, 11).foreach { retentionTimestamp => - testBufferingLogDeletionIterator(maxTimestamp = retentionTimestamp, maxVersion = 100)( - inputTimestamps = Seq(10, 8, 9), - deleted = Nil - ) - } - - // Test the first element causing cascading adjustments - testBufferingLogDeletionIterator(maxTimestamp = 12, maxVersion = 100)( - inputTimestamps = Seq(10, 8, 9), - deleted = Seq(10, 11, 12) - ) - - Seq(0, 1).foreach { retentionVersion => - testBufferingLogDeletionIterator(maxTimestamp = 100, maxVersion = retentionVersion)( - inputTimestamps = Seq(10, 8, 9), - deleted = Nil - ) - } - - testBufferingLogDeletionIterator(maxTimestamp = 100, maxVersion = 2)( - inputTimestamps = Seq(10, 8, 9), - deleted = Seq(10, 11, 12) - ) - - // Test multiple batches of time adjustments - testBufferingLogDeletionIterator(maxTimestamp = 12, maxVersion = 100)( - inputTimestamps = Seq(5, 10, 8, 9, 12, 15, 14, 14), // 5, 10, 11, 12, 13, 15, 16, 17 - deleted = Seq(5) - ) - - Seq(13, 14, 15, 16).foreach { retentionTimestamp => - testBufferingLogDeletionIterator(maxTimestamp = retentionTimestamp, maxVersion = 100)( - inputTimestamps = Seq(5, 10, 8, 9, 12, 15, 14, 14), // 5, 10, 11, 12, 13, 15, 16, 17 - deleted = Seq(5, 10, 11, 12, 13) - ) - } - - testBufferingLogDeletionIterator(maxTimestamp = 17, maxVersion = 100)( - inputTimestamps = Seq(5, 10, 8, 9, 12, 15, 14, 14), // 5, 10, 11, 12, 13, 15, 16, 17 - deleted = Seq(5, 10, 11, 12, 13, 15, 16, 17) - ) - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/ConversionUtilsSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/ConversionUtilsSuite.scala deleted file mode 100644 index 488fde0cae0..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/ConversionUtilsSuite.scala +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.sql.Timestamp - -import org.scalatest.FunSuite - -import io.delta.standalone.types.{IntegerType, StructField, StructType} - -import io.delta.standalone.internal.actions._ -import io.delta.standalone.internal.util.ConversionUtils.{convertAction, convertActionJ} - -class ConversionUtilsSuite extends FunSuite { - private val schema = new StructType(Array( - new StructField("col1", new IntegerType()), - new StructField("col2", new IntegerType()) - )) - - private val addFile = AddFile("path", Map("col1" -> "val2", "col2" -> "val2"), 123L, 456L, - dataChange = true, "stats", Map("tagKey" -> "tagVal")) - - private val cdcFile = AddCDCFile("path", Map("col1" -> "val2", "col2" -> "val2"), 700L, - Map("tagKey" -> "tagVal")) - - private val removeFile = addFile.removeWithTimestamp() - - private val metadata = Metadata("id", "name", "desc", Format(), schema.toJson, - Seq("col1", "col2"), Map("configKey" -> "configVal"), Some(789L)) - - private val jobInfo = JobInfo("jobId", "jobName", "runId", "jobOwnerId", "triggerType") - - private val notebookInfo = NotebookInfo("notebookId") - - private val commitInfo = CommitInfo(Some(1L), new Timestamp(1000000), Some("userId"), - Some("userName"), "WRITE", Map("paramKey" -> "paramVal"), Some(jobInfo), Some(notebookInfo), - Some("clusterId"), Some(9L), Some("Serializable"), Some(true), - Some(Map("opMetricKey" -> "opMetricVal")), Some("userMetadata"), Some("engineInfo")) - - private val setTransaction = SetTransaction("appId", 1L, Some(2000L)) - - private val protocol = Protocol() - - private val actions = - Seq(addFile, cdcFile, removeFile, metadata, commitInfo, setTransaction, protocol) - - test("convert actions") { - actions.foreach { scalaAction => - val javaAction = convertAction(scalaAction) - val newScalaAction = convertActionJ(javaAction) - - assert(newScalaAction == scalaAction, - s""" - |New Scala action: ${newScalaAction.toString} - |did not equal - |Original Scala action ${scalaAction.toString} - |""".stripMargin) - } - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DelegatingLogStoreSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/DelegatingLogStoreSuite.scala deleted file mode 100644 index 30b09c84f7e..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DelegatingLogStoreSuite.scala +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.Path -import org.scalatest.FunSuite - -import io.delta.standalone.internal.storage.{DelegatingLogStore, LogStoreProvider} - -class DelegatingLogStoreSuite extends FunSuite { - - private val customLogStoreClassName = classOf[UserDefinedLogStore].getName - - private def fakeSchemeWithNoDefault = "fake" - - /** - * Test DelegatingLogStore by directly creating a DelegatingLogStore and test LogStore - * resolution based on input `scheme`. This is not an end-to-end test. - * - * @param scheme The scheme to be used for testing. - * @param schemeConf The scheme conf value to be set. If None, scheme conf will be unset. - * @param expClassName Expected LogStore class name resolved by DelegatingLogStore. - */ - private def testDelegatingLogStore( - scheme: String, - schemeConf: Option[String], - expClassName: String): Unit = { - - val hadoopConf = new Configuration() - val schemeConfKey = LogStoreProvider.logStoreSchemeConfKey(scheme) - schemeConf.foreach(hadoopConf.set(schemeConfKey, _)) - - val delegatingLogStore = new DelegatingLogStore(hadoopConf) - val actualLogStore = delegatingLogStore.getDelegate( - new Path(s"${scheme}://dummy") - ) - assert(actualLogStore.getClass.getName == expClassName) - } - - test("DelegatingLogStore resolution using default scheme confs") { - for (scheme <- DelegatingLogStore.s3Schemes) { - testDelegatingLogStore(scheme, None, DelegatingLogStore.defaultS3LogStoreClassName) - } - for (scheme <- DelegatingLogStore.azureSchemes) { - testDelegatingLogStore(scheme, None, DelegatingLogStore.defaultAzureLogStoreClassName) - } - for (scheme <- DelegatingLogStore.gsSchemes) { - testDelegatingLogStore(scheme, None, DelegatingLogStore.defaultGCSLogStoreClassName) - } - testDelegatingLogStore(fakeSchemeWithNoDefault, None, - DelegatingLogStore.defaultHDFSLogStoreClassName) - } - - test("DelegatingLogStore resolution using customized scheme confs") { - val allTestSchemes = DelegatingLogStore.s3Schemes ++ DelegatingLogStore.azureSchemes + - fakeSchemeWithNoDefault - for (scheme <- allTestSchemes) { - for (store <- Seq( - // default (java) classes (in io.delta.storage) - DelegatingLogStore.defaultS3LogStoreClassName, - DelegatingLogStore.defaultAzureLogStoreClassName, - DelegatingLogStore.defaultHDFSLogStoreClassName, - DelegatingLogStore.defaultGCSLogStoreClassName, - // deprecated (scala) classes - "io.delta.standalone.internal.storage.S3SingleDriverLogStore", - "io.delta.standalone.internal.storage.AzureLogStore", - "io.delta.standalone.internal.storage.HDFSLogStore", - customLogStoreClassName)) { - // we set delta.logStore.${scheme}.impl -> $store - testDelegatingLogStore(scheme, Some(store), store) - } - } - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaConfigSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaConfigSuite.scala deleted file mode 100644 index a4715bf02aa..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaConfigSuite.scala +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.util.concurrent.TimeUnit - -import org.apache.hadoop.conf.Configuration -import org.scalatest.FunSuite - -import io.delta.standalone.internal.DeltaConfigs.{isValidIntervalConfigValue, parseCalendarInterval} -import io.delta.standalone.internal.actions.Metadata -import io.delta.standalone.internal.util.{CalendarInterval, DateTimeConstants} - -class DeltaConfigSuite extends FunSuite { - - test("mergeGlobalConfigs") { - - val hadoopConf = new Configuration() - hadoopConf.set( - DeltaConfigs.hadoopConfPrefix + DeltaConfigs.IS_APPEND_ONLY.key.stripPrefix("delta."), - "true") - hadoopConf.set( - DeltaConfigs.hadoopConfPrefix + - DeltaConfigs.ENABLE_EXPIRED_LOG_CLEANUP.key.stripPrefix("delta."), - "true") - val metadataConf = Map(DeltaConfigs.ENABLE_EXPIRED_LOG_CLEANUP.key -> "false", - DeltaConfigs.CHECKPOINT_INTERVAL.key -> "1 day") - val mergedConf = DeltaConfigs.mergeGlobalConfigs(hadoopConf, metadataConf) - assert(mergedConf.get(DeltaConfigs.IS_APPEND_ONLY.key) == Some("true")) - assert(mergedConf.get(DeltaConfigs.ENABLE_EXPIRED_LOG_CLEANUP.key) == Some("false")) - assert(mergedConf.get(DeltaConfigs.CHECKPOINT_INTERVAL.key) == Some("1 day")) - assert(!mergedConf.contains("delta.deletedFileRetentionDuration")) // we didn't add other keys - } - - test("check DeltaConfig defaults") { - val emptyMetadata = new Metadata() - assert( - DeltaConfigs.getMilliSeconds(DeltaConfigs.TOMBSTONE_RETENTION.fromMetadata(emptyMetadata)) == - DateTimeConstants.MILLIS_PER_DAY*DateTimeConstants.DAYS_PER_WEEK) // default is 1 week - - assert(DeltaConfigs.getMilliSeconds(DeltaConfigs.LOG_RETENTION.fromMetadata(emptyMetadata)) == - DateTimeConstants.MILLIS_PER_DAY*30) // default is 30 days - - assert(DeltaConfigs.CHECKPOINT_INTERVAL.fromMetadata(emptyMetadata) == 10) - - assert(DeltaConfigs.ENABLE_EXPIRED_LOG_CLEANUP.fromMetadata(emptyMetadata)) - - assert(!DeltaConfigs.IS_APPEND_ONLY.fromMetadata(emptyMetadata)) - } - - test("parseCalendarInterval") { - for (input <- Seq("5 MINUTES", "5 minutes", "5 Minutes", "inTERval 5 minutes")) { - assert(parseCalendarInterval(input) === - new CalendarInterval(0, 0, TimeUnit.MINUTES.toMicros(5))) - } - - for (input <- Seq(null, "", " ")) { - val e = intercept[IllegalArgumentException] { - parseCalendarInterval(input) - } - assert(e.getMessage.contains("cannot be null or blank")) - } - - for (input <- Seq("interval", "interval1 day", "foo", "foo 1 day")) { - val e = intercept[IllegalArgumentException] { - parseCalendarInterval(input) - } - assert(e.getMessage.contains("Invalid interval")) - } - } - - test("isValidIntervalConfigValue") { - for (input <- Seq( - // Allow 0 microsecond because we always convert microseconds to milliseconds so 0 - // microsecond is the same as 100 microseconds. - "0 microsecond", - "1 microsecond", - "1 millisecond", - "1 day", - "-1 day 86400001 milliseconds", // This is 1 millisecond - "1 day -1 microseconds")) { - assert(isValidIntervalConfigValue(parseCalendarInterval(input))) - } - for (input <- Seq( - "-1 microseconds", - "-1 millisecond", - "-1 day", - "1 day -86400001 milliseconds", // This is -1 millisecond - "1 month", - "1 year")) { - assert(!isValidIntervalConfigValue(parseCalendarInterval(input)), s"$input") - } - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaDataReaderSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaDataReaderSuite.scala deleted file mode 100644 index 74dcb77d191..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaDataReaderSuite.scala +++ /dev/null @@ -1,470 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.math.{BigDecimal => JBigDecimal} -import java.sql.Timestamp -import java.util.{List => JList, Map => JMap, TimeZone} -import java.util.Arrays.{asList => asJList} - -import scala.collection.JavaConverters._ -import scala.collection.mutable.ListBuffer - -import com.fasterxml.jackson.core.JsonParseException -import org.apache.hadoop.conf.Configuration -import org.scalatest.FunSuite - -import io.delta.standalone.DeltaLog -import io.delta.standalone.data.{CloseableIterator, RowRecord => JRowRecord} -import io.delta.standalone.types._ - -import io.delta.standalone.internal.data.RowParquetRecordImpl -import io.delta.standalone.internal.sources.StandaloneHadoopConf -import io.delta.standalone.internal.util.DataTypeParser -import io.delta.standalone.internal.util.GoldenTableUtils._ - -/** - * Instead of using Spark in this project to WRITE data and log files for tests, we have - * io.delta.golden.GoldenTables do it instead. During tests, we then refer by name to specific - * golden tables that that class is responsible for generating ahead of time. This allows us to - * focus on READING only so that we may fully decouple from Spark and not have it as a dependency. - * - * See io.delta.golden.GoldenTables for documentation on how to ensure that the needed files have - * been generated. - */ -class DeltaDataReaderSuite extends FunSuite { - - test("read - primitives") { - withLogForGoldenTable("data-reader-primitives") { log => - val recordIter = log.snapshot().open() - var count = 0 - var checkNulls = false - while (recordIter.hasNext) { - val row = recordIter.next() - if (row.isNullAt("as_int")) { - assert(row.isNullAt("as_int")) - intercept[NullPointerException](row.getInt("as_int")) - assert(row.isNullAt("as_long")) - intercept[NullPointerException](row.getInt("as_long")) - assert(row.isNullAt("as_byte")) - intercept[NullPointerException](row.getInt("as_byte")) - assert(row.isNullAt("as_short")) - intercept[NullPointerException](row.getInt("as_short")) - assert(row.isNullAt("as_boolean")) - intercept[NullPointerException](row.getInt("as_boolean")) - assert(row.isNullAt("as_float")) - intercept[NullPointerException](row.getInt("as_float")) - assert(row.isNullAt("as_double")) - intercept[NullPointerException](row.getInt("as_double")) - assert(row.isNullAt("as_string")) - assert(row.getString("as_string") == null) - assert(row.isNullAt("as_binary")) - assert(row.getBinary("as_binary") == null) - assert(row.isNullAt("as_big_decimal")) - assert(row.getBigDecimal("as_big_decimal") == null) - checkNulls = true - } else { - val i = row.getInt("as_int") - assert(row.getLong("as_long") == i.longValue) - assert(row.getByte("as_byte") == i.toByte) - assert(row.getShort("as_short") == i.shortValue) - assert(row.getBoolean("as_boolean") == (i % 2 == 0)) - assert(row.getFloat("as_float") == i.floatValue) - assert(row.getDouble("as_double") == i.doubleValue) - assert(row.getString("as_string") == i.toString) - assert(row.getBinary("as_binary") sameElements Array[Byte](i.toByte, i.toByte)) - assert(row.getBigDecimal("as_big_decimal") == new JBigDecimal(i)) - } - count += 1 - } - - assert(count == 11) - assert(checkNulls, "didn't check null values for primitive types. " + - "Please check if the generated table is correct") - } - } - - test("read - date types") { - Seq("UTC", "Iceland", "PST", "America/Los_Angeles", "Etc/GMT+9", "Asia/Beirut", - "JST").foreach { timeZoneId => - withGoldenTable(s"data-reader-date-types-$timeZoneId") { tablePath => - val timeZone = TimeZone.getTimeZone(timeZoneId) - TimeZone.setDefault(timeZone) - - val timestamp = Timestamp.valueOf("2020-01-01 08:09:10") - val date = java.sql.Date.valueOf("2020-01-01") - - val hadoopConf = new Configuration() - hadoopConf.set(StandaloneHadoopConf.PARQUET_DATA_TIME_ZONE_ID, timeZoneId) - - val log = DeltaLog.forTable(hadoopConf, tablePath) - val recordIter = log.snapshot().open() - - if (!recordIter.hasNext) fail(s"No row record for timeZoneId $timeZoneId") - - val row = recordIter.next() - - assert(row.getTimestamp("timestamp").equals(timestamp)) - assert(row.getDate("date").equals(date)) - - recordIter.close() - } - } - } - - test("read - array of primitives") { - withLogForGoldenTable("data-reader-array-primitives") { log => - val recordIter = log.snapshot().open() - var count = 0 - while (recordIter.hasNext) { - val row = recordIter.next() - val list = row.getList[Int]("as_array_int") - val i = list.get(0) - - assert(row.getList[Long]("as_array_long") == asJList(i.toLong)) - assert(row.getList[Byte]("as_array_byte") == asJList(i.toByte)) - assert(row.getList[Short]("as_array_short") == asJList(i.shortValue)) - assert(row.getList[Boolean]("as_array_boolean") == asJList(i % 2 == 0)) - assert(row.getList[Float]("as_array_float") == asJList(i.floatValue)) - assert(row.getList[Double]("as_array_double") == asJList(i.doubleValue)) - assert(row.getList[String]("as_array_string") == asJList(i.toString)) - assert(row.getList[Array[Byte]]("as_array_binary").get(0) sameElements - Array(i.toByte, i.toByte)) - assert(row.getList[JBigDecimal]("as_array_big_decimal") == asJList(new JBigDecimal(i))) - count += 1 - } - - assert(count == 10) - } - } - - test("read - array of complex objects") { - withLogForGoldenTable("data-reader-array-complex-objects") { log => - val recordIter = log.snapshot().open() - var count = 0 - while (recordIter.hasNext) { - val row = recordIter.next() - val i = row.getInt("i") - assert( - row.getList[JList[JList[Int]]]("3d_int_list") == - asJList( - asJList(asJList(i, i, i), asJList(i, i, i)), - asJList(asJList(i, i, i), asJList(i, i, i)) - ) - ) - - assert( - row.getList[JList[JList[JList[Int]]]]("4d_int_list") == - asJList( - asJList( - asJList(asJList(i, i, i), asJList(i, i, i)), - asJList(asJList(i, i, i), asJList(i, i, i)) - ), - asJList( - asJList(asJList(i, i, i), asJList(i, i, i)), - asJList(asJList(i, i, i), asJList(i, i, i)) - ) - ) - ) - - assert( - row.getList[JMap[String, Long]]("list_of_maps") == - asJList( - Map[String, Long](i.toString -> i.toLong).asJava, - Map[String, Long](i.toString -> i.toLong).asJava - ) - ) - - val recordList = row.getList[JRowRecord]("list_of_records") - recordList.asScala.foreach(nestedRow => assert(nestedRow.getInt("val") == i)) - count += 1 - } - - assert(count == 10) - } - } - - test("read - map") { - withLogForGoldenTable("data-reader-map") { log => - val recordIter = log.snapshot().open() - var count = 0 - while (recordIter.hasNext) { - val row = recordIter.next() - val i = row.getInt("i") - assert(row.getMap[Int, Int]("a").equals(Map(i -> i).asJava)) - assert(row.getMap[Long, Byte]("b").equals(Map(i.toLong -> i.toByte).asJava)) - assert(row.getMap[Short, Boolean]("c").equals(Map(i.toShort -> (i % 2 == 0)).asJava)) - assert(row.getMap[Float, Double]("d").equals(Map(i.toFloat -> i.toDouble).asJava)) - assert( - row.getMap[String, JBigDecimal]("e").equals(Map(i.toString -> new JBigDecimal(i)).asJava) - ) - - val mapOfRecordList = row.getMap[Int, java.util.List[JRowRecord]]("f") - val recordList = mapOfRecordList.get(i) - recordList.asScala.foreach(nestedRow => assert(nestedRow.getInt("val") == i)) - count += 1 - } - - assert(count == 10) - } - } - - test("read - nested struct") { - withLogForGoldenTable("data-reader-nested-struct") { log => - val recordIter = log.snapshot().open() - var count = 0 - while (recordIter.hasNext) { - val row = recordIter.next() - val i = row.getInt("b") - val nestedStruct = row.getRecord("a") - assert(nestedStruct.getString("aa") == i.toString) - assert(nestedStruct.getString("ab") == i.toString) - - val nestedNestedStruct = nestedStruct.getRecord("ac") - assert(nestedNestedStruct.getInt("aca") == i) - assert(nestedNestedStruct.getLong("acb") == i.toLong) - count += 1 - } - - assert(count == 10) - } - } - - test("read - nullable field, invalid schema column key") { - withLogForGoldenTable("data-reader-nullable-field-invalid-schema-key") { log => - val recordIter = log.snapshot().open() - - if (!recordIter.hasNext) fail(s"No row record") - - val row = recordIter.next() - row.getList[String]("array_can_contain_null").asScala.foreach(elem => assert(elem == null)) - - val e = intercept[IllegalArgumentException] { - row.getInt("foo_key_does_not_exist") - } - assert(e.getMessage.contains("Field \"foo_key_does_not_exist\" does not exist.")) - - recordIter.close() - } - } - - /** this also tests reading PARTITIONED data */ - test("test escaped char sequences in path") { - withLogForGoldenTable("data-reader-escaped-chars") { log => - assert(log.snapshot().getAllFiles.asScala.forall(_.getPath.contains("_2=bar"))) - - val recordIter = log.snapshot().open() - var count = 0 - while (recordIter.hasNext) { - val row = recordIter.next() - assert(row.getString("_1").contains("foo")) - count += 1 - } - - assert(count == 3) - } - } - - test("test bad type cast") { - withLogForGoldenTable("data-reader-primitives") { log => - val recordIter = log.snapshot().open() - assertThrows[ClassCastException] { - var row = recordIter.next() - while (row.isNullAt("as_big_decimal")) { - // Skip null values as we don't do type check for null values. - row = recordIter.next() - } - row.getString("as_big_decimal") - } - } - } - - test("correct schema and length") { - withLogForGoldenTable("data-reader-date-types-UTC") { log => - val recordIter = log.snapshot().open() - if (!recordIter.hasNext) fail(s"No row record") - val row = recordIter.next() - assert(row.getLength == 2) - - val expectedSchema = new StructType(Array( - new StructField("timestamp", new TimestampType), - new StructField("date", new DateType) - )) - - assert(row.getSchema == expectedSchema) - } - } - - test("data reader can read partition values") { - withLogForGoldenTable("data-reader-partition-values") { log => - val snapshot = log.update() - val partitionColumns = snapshot.getMetadata.getPartitionColumns.asScala.toSet - val recordIter = snapshot.open() - - if (!recordIter.hasNext) fail(s"No row record") - - while (recordIter.hasNext) { - val row = recordIter.next() - assert(row.getLength == 15) - - assert(!row.isNullAt("value")) - - if (row.getString("value") == "2") { // null partition columns - for (fieldName <- row.getSchema.getFieldNames.filter(partitionColumns.contains)) { - assert(row.isNullAt(fieldName)) - } - } else { - doMatch(row, row.getString("value").toInt); - } - } - } - } - - private def doMatch(row: JRowRecord, i: Int): Unit = { - assert(row.getInt("as_int") == i) - assert(row.getLong("as_long") == i.longValue) - assert(row.getByte("as_byte") == i.toByte) - assert(row.getShort("as_short") == i.shortValue) - assert(row.getBoolean("as_boolean") == (i % 2 == 0)) - assert(row.getFloat("as_float") == i.floatValue) - assert(row.getDouble("as_double") == i.doubleValue) - assert(row.getString("as_string") == i.toString) - assert(row.getString("as_string_lit_null") == "null") - assert(row.getDate("as_date") == java.sql.Date.valueOf("2021-09-08")) - assert(row.getTimestamp("as_timestamp") == java.sql.Timestamp.valueOf("2021-09-08 11:11:11")) - assert(row.getBigDecimal("as_big_decimal") == new JBigDecimal(i)) - - val recordsList = row.getList[JRowRecord]("as_list_of_records") - assert(recordsList.get(0).asInstanceOf[RowParquetRecordImpl].partitionValues.isEmpty) - assert(recordsList.get(0).getInt("val") == i) - - val nestedStruct = row.getRecord("as_nested_struct") - assert(nestedStruct.asInstanceOf[RowParquetRecordImpl].partitionValues.isEmpty) - val nestedNestedStruct = nestedStruct.getRecord("ac") - assert(nestedNestedStruct.asInstanceOf[RowParquetRecordImpl].partitionValues.isEmpty) - } - - private def checkDataTypeToJsonFromJson(dataType: DataType): Unit = { - test(s"DataType to Json and from Json - $dataType") { - assert(DataTypeParser.fromJson(dataType.toJson) === dataType) // internal API - assert(DataType.fromJson(dataType.toJson) === dataType) // public API - } - - test(s"DataType inside StructType to Json and from Json - $dataType") { - val field1 = new StructField("foo", dataType, true) - val field2 = new StructField("bar", dataType, true) - val struct = new StructType(Array(field1, field2)) - assert(DataTypeParser.fromJson(struct.toJson) === struct) // internal API - assert(DataType.fromJson(struct.toJson) === struct) // public API - } - } - - checkDataTypeToJsonFromJson(new BooleanType) - checkDataTypeToJsonFromJson(new ByteType) - checkDataTypeToJsonFromJson(new ShortType) - checkDataTypeToJsonFromJson(new IntegerType) - checkDataTypeToJsonFromJson(new LongType) - checkDataTypeToJsonFromJson(new FloatType) - checkDataTypeToJsonFromJson(new DoubleType) - checkDataTypeToJsonFromJson(new DecimalType(10, 5)) - checkDataTypeToJsonFromJson(DecimalType.USER_DEFAULT) - checkDataTypeToJsonFromJson(new DateType) - checkDataTypeToJsonFromJson(new TimestampType) - checkDataTypeToJsonFromJson(new StringType) - checkDataTypeToJsonFromJson(new BinaryType) - checkDataTypeToJsonFromJson(new ArrayType(new DoubleType, true)) - checkDataTypeToJsonFromJson(new ArrayType(new StringType, false)) - checkDataTypeToJsonFromJson(new MapType(new IntegerType, new StringType, true)) - checkDataTypeToJsonFromJson( - new MapType( - new IntegerType, - new ArrayType(new DoubleType, true), - false)) - - test("toJson fromJson for field metadata") { - val emptyMetadata = FieldMetadata.builder().build() - val singleStringMetadata = FieldMetadata.builder().putString("test", "test_value").build() - val singleBooleanMetadata = FieldMetadata.builder().putBoolean("test", true).build() - val singleIntegerMetadata = FieldMetadata.builder().putLong("test", 2L).build() - val singleDoubleMetadata = FieldMetadata.builder().putDouble("test", 2.0).build() - val singleMapMetadata = FieldMetadata.builder().putMetadata("test_outside", - FieldMetadata.builder().putString("test_inside", "test_inside_value").build()).build() - val singleListMetadata = FieldMetadata.builder().putLongArray("test", Array(0L, 1L, 2L)).build() - val multipleEntriesMetadata = FieldMetadata.builder().putString("test", "test_value") - .putDouble("test", 2.0).putLongArray("test", Array(0L, 1L, 2L)).build() - - val field_array = Array( - new StructField("emptyMetadata", new BooleanType, true, emptyMetadata), - new StructField("singleStringMetadata", new BooleanType, true, singleStringMetadata), - new StructField("singleBooleanMetadata", new BooleanType, true, singleBooleanMetadata), - new StructField("singleIntegerMetadata", new BooleanType, true, singleIntegerMetadata), - new StructField("singleDoubleMetadata", new BooleanType, true, singleDoubleMetadata), - new StructField("singleMapMetadata", new BooleanType, true, singleMapMetadata), - new StructField("singleListMetadata", new BooleanType, true, singleListMetadata), - new StructField("multipleEntriesMetadata", new BooleanType, true, multipleEntriesMetadata)) - val struct = new StructType(field_array) - assert(struct == DataTypeParser.fromJson(struct.toJson())) // internal API - assert(struct == DataType.fromJson(struct.toJson)) // public API - } - - test("DataType.fromJson - invalid json") { - assertThrows[JsonParseException] { - DataType.fromJson("foo" + new BooleanType().toJson + "bar") - } - assertThrows[JsonParseException] { - DataType.fromJson( - new StructType() - .add("col1", new IntegerType()) - .add("col2", new StringType()) - .toJson - .replaceAll("\"", "?") - ) - } - } - - test("#124: getBigDecimal decode correctly for LongValue") { - withLogForGoldenTable("124-decimal-decode-bug") { log => - val recordIter = log.snapshot().open() - val row = recordIter.next() - assert(row.getBigDecimal("large_decimal") == new JBigDecimal(1000000)) - assert(!recordIter.hasNext) - } - } - - // scalastyle:off line.size.limit - test("#125: CloseableParquetDataIterator should not stop iteration when processing an empty file") { - // scalastyle:on line.size.limit - withLogForGoldenTable("125-iterator-bug") { log => - var datas = new ListBuffer[Int]() - var dataIter: CloseableIterator[JRowRecord] = null - try { - dataIter = log.update().open() - while (dataIter.hasNext) { - datas += dataIter.next().getInt("col1") - } - - assert(datas.length == 5) - assert(datas.toSet == Set(1, 2, 3, 4, 5)) - } finally { - if (null != dataIter) { - dataIter.close() - } - } - } - } -} - diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaLogSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaLogSuite.scala deleted file mode 100644 index 5afb34a5f6f..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaLogSuite.scala +++ /dev/null @@ -1,849 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.io.File -import java.nio.file.Files -import java.sql.Timestamp -import java.util.UUID - -import scala.collection.JavaConverters._ -import scala.collection.mutable.ListBuffer -import scala.concurrent.duration._ - -import org.apache.commons.io.FileUtils -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.Path -import org.scalatest.FunSuite - -import io.delta.standalone.{DeltaLog, Operation, Snapshot} -import io.delta.standalone.actions.{AddFile => AddFileJ, JobInfo => JobInfoJ, Metadata => MetadataJ, NotebookInfo => NotebookInfoJ, Protocol => ProtocolJ, RemoveFile => RemoveFileJ} -import io.delta.standalone.exceptions.DeltaStandaloneException -import io.delta.standalone.types.{BooleanType, IntegerType, LongType, StringType, StructType} - -import io.delta.standalone.internal.actions.{Action, AddFile, Protocol, RemoveFile} -import io.delta.standalone.internal.exception.DeltaErrors -import io.delta.standalone.internal.util.{ConversionUtils, FakeFileSystem, FileNames} -import io.delta.standalone.internal.util.GoldenTableUtils._ -import io.delta.standalone.internal.util.TestUtils._ - -/** - * Instead of using Spark in this project to WRITE data and log files for tests, we have - * io.delta.golden.GoldenTables do it instead. During tests, we then refer by name to specific - * golden tables that that class is responsible for generating ahead of time. This allows us to - * focus on READING only so that we may fully decouple from Spark and not have it as a dependency. - * - * See io.delta.golden.GoldenTables for documentation on how to ensure that the needed files have - * been generated. - */ -abstract class DeltaLogSuiteBase extends FunSuite { - - val metadata = MetadataJ - .builder() - .schema(new StructType().add("x", new IntegerType())) - .build() - val engineInfo = "test-engine-info" - val manualUpdate = new Operation(Operation.Name.MANUAL_UPDATE) - - // We want to allow concrete child test suites to use their own "get all AddFiles" APIs. - // e.g. snapshot.getAllFiles or snapshot.scan.getFiles - // - // Child test suites should create their own concrete `CustomAddFilesAccessor` class and then - // override `createCustomAddFilesAccessor` to return a new instance of it. - abstract class CustomAddFilesAccessor(snapshot: Snapshot) { - def _getFiles(): java.util.List[AddFileJ] - } - - implicit def createCustomAddFilesAccessor(snapshot: Snapshot): CustomAddFilesAccessor - - private implicit def durationToLong(duration: FiniteDuration): Long = { - duration.toMillis - } - - // scalastyle:on funsuite - test("checkpoint") { - withLogForGoldenTable("checkpoint") { log => - assert(log.snapshot.getVersion == 14) - assert(log.snapshot._getFiles().size == 1) - log.snapshot._getFiles().hashCode() - } - } - - test("snapshot") { - def getDirDataFiles(tablePath: String): Array[File] = { - val correctTablePath = - if (tablePath.startsWith("file:")) tablePath.stripPrefix("file:") else tablePath - val dir = new File(correctTablePath) - dir.listFiles().filter(_.isFile).filter(_.getName.endsWith("snappy.parquet")) - } - - def verifySnapshot( - snapshot: Snapshot, - expectedFiles: Array[File], - expectedVersion: Int): Unit = { - assert(snapshot.getVersion == expectedVersion) - assert(snapshot._getFiles().size() == expectedFiles.length) - assert( - snapshot._getFiles().asScala.forall(f => expectedFiles.exists(_.getName == f.getPath))) - } - - // Append data0 - var data0_files: Array[File] = Array.empty - withLogForGoldenTable("snapshot-data0") { log => - data0_files = getDirDataFiles(log.getPath.toString) // data0 files - verifySnapshot(log.snapshot(), data0_files, 0) - } - - // Append data1 - var data0_data1_files: Array[File] = Array.empty - withLogForGoldenTable("snapshot-data1") { log => - data0_data1_files = getDirDataFiles(log.getPath.toString) // data0 & data1 files - verifySnapshot(log.snapshot(), data0_data1_files, 1) - } - - // Overwrite with data2 - var data2_files: Array[File] = Array.empty - withLogForGoldenTable("snapshot-data2") { log => - // we have overwritten files for data0 & data1; only data2 files should remain - data2_files = getDirDataFiles(log.getPath.toString) - .filterNot(f => data0_data1_files.exists(_.getName == f.getName)) - verifySnapshot(log.snapshot(), data2_files, 2) - } - - // Append data3 - withLogForGoldenTable("snapshot-data3") { log => - // we have overwritten files for data0 & data1; only data2 & data3 files should remain - val data2_data3_files = getDirDataFiles(log.getPath.toString) - .filterNot(f => data0_data1_files.exists(_.getName == f.getName)) - verifySnapshot(log.snapshot(), data2_data3_files, 3) - } - - // Delete data2 files - withLogForGoldenTable("snapshot-data2-deleted") { log => - // we have overwritten files for data0 & data1, and deleted data2 files; only data3 files - // should remain - val data3_files = getDirDataFiles(log.getPath.toString) - .filterNot(f => data0_data1_files.exists(_.getName == f.getName)) - .filterNot(f => data2_files.exists(_.getName == f.getName)) - verifySnapshot(log.snapshot(), data3_files, 4) - } - - // Repartition into 2 files - withLogForGoldenTable("snapshot-repartitioned") { log => - assert(log.snapshot()._getFiles().size == 2) - assert(log.snapshot().getVersion == 5) - } - - // Vacuum - withLogForGoldenTable("snapshot-vacuumed") { log => - // all remaining dir data files should be needed for current snapshot version - // vacuum doesn't change the snapshot version - verifySnapshot(log.snapshot(), getDirDataFiles(log.getPath.toString), 5) - } - } - - test("SC-8078: update deleted directory") { - withGoldenTable("update-deleted-directory") { tablePath => - val tempDir = Files.createTempDirectory(UUID.randomUUID().toString).toFile - try { - FileUtils.copyDirectory(new File(tablePath), tempDir) - val log = DeltaLog.forTable(new Configuration(), tempDir.getCanonicalPath) - FileUtils.deleteDirectory(tempDir) - assert(log.update().getVersion == -1) - } finally { - // just in case - FileUtils.deleteDirectory(tempDir) - } - } - } - - test("update shouldn't pick up delta files earlier than checkpoint") { - withTempDir { tempDir => - val log1 = DeltaLog.forTable(new Configuration(), new Path(tempDir.getCanonicalPath)) - - (1 to 5).foreach { i => - val txn = log1.startTransaction() - val file = AddFile(i.toString, Map.empty, 1, 1, true) :: Nil - val delete: Seq[Action] = if (i > 1) { - RemoveFile((i - 1).toString, Some(System.currentTimeMillis()), true) :: Nil - } else { - Nil - } - - val filesToCommit = (delete ++ file).map(ConversionUtils.convertAction) - - if (i == 1) { - txn.updateMetadata(metadata) - } - txn.commit(filesToCommit.asJava, manualUpdate, engineInfo) - } - - // DeltaOSS performs `DeltaLog.clearCache()` here, but we can't - val log2 = DeltaLogImpl.forTable(new Configuration(), new Path(tempDir.getCanonicalPath)) - - (6 to 15).foreach { i => - val txn = log1.startTransaction() - val file = AddFile(i.toString, Map.empty, 1, 1, true) :: Nil - val delete = RemoveFile((i - 1).toString, Some(System.currentTimeMillis()), true) :: Nil - - val filesToCommit = (delete ++ file).map(ConversionUtils.convertAction) - - txn.commit(filesToCommit.asJava, manualUpdate, engineInfo) - } - - // Since log2 is a separate instance, it shouldn't be updated to version 15 - assert(log2.snapshot.getVersion == 4) - val updateLog2 = log2.update() - assert(updateLog2.getVersion == log1.snapshot.getVersion, "Did not update to correct version") - - val deltas = log2.snapshot.logSegment.deltas - assert(deltas.length === 4, "Expected 4 files starting at version 11 to 14") - val versions = deltas.map(f => FileNames.deltaVersion(f.getPath)).sorted - assert(versions === Seq[Long](11, 12, 13, 14), "Received the wrong files for update") - } - } - - test("handle corrupted '_last_checkpoint' file") { - withLogImplForWritableGoldenTable("corrupted-last-checkpoint") { log1 => - assert(log1.lastCheckpoint.isDefined) - - val lastCheckpoint = log1.lastCheckpoint.get - - // Create an empty "_last_checkpoint" (corrupted) - val fs = log1.LAST_CHECKPOINT.getFileSystem(log1.hadoopConf) - fs.create(log1.LAST_CHECKPOINT, true /* overwrite */).close() - - // Create a new DeltaLog - val log2 = DeltaLogImpl.forTable(new Configuration(), new Path(log1.getPath.toString)) - - // Make sure we create a new DeltaLog in order to test the loading logic. - assert(log1 ne log2) - - // We should get the same metadata even if "_last_checkpoint" is corrupted. - assert(CheckpointInstance(log2.lastCheckpoint.get) === CheckpointInstance(lastCheckpoint)) - } - } - - test("paths should be canonicalized - normal characters") { - withLogForGoldenTable("canonicalized-paths-normal-a") { log => - assert(log.update().getVersion == 1) - assert(log.snapshot._getFiles().size == 0) - } - - withLogForGoldenTable("canonicalized-paths-normal-b") { log => - assert(log.update().getVersion == 1) - assert(log.snapshot._getFiles().size == 0) - } - } - - test("paths should be canonicalized - special characters") { - withLogForGoldenTable("canonicalized-paths-special-a") { log => - assert(log.update().getVersion == 1) - assert(log.snapshot._getFiles().size == 0) - } - - withLogForGoldenTable("canonicalized-paths-special-b") { log => - assert(log.update().getVersion == 1) - assert(log.snapshot._getFiles().size == 0) - } - } - - test("do not relativize paths in RemoveFiles") { - withTempDir { dir => - val log = DeltaLogImpl.forTable(new Configuration(), dir.getCanonicalPath) - assert(new File(log.logPath.toUri).mkdirs()) - val path = new File(dir, "a/b/c").getCanonicalPath - - val removeFile = new RemoveFileJ( - path, - java.util.Optional.of(System.currentTimeMillis()), - true, // dataChange - false, // extendedFileMetadata - null, // partitionValues - java.util.Optional.of(0L), // size - null // null - ) - - val actions = java.util.Arrays.asList(removeFile, metadata) - - log.startTransaction().commit(actions, manualUpdate, engineInfo) - - val committedRemove = log.update().tombstonesScala - assert(committedRemove.head.path === s"file://$path") - } - } - - test("delete and re-add the same file in different transactions") { - withLogForGoldenTable("delete-re-add-same-file-different-transactions") { log => - assert(log.snapshot()._getFiles().size() == 2) - - assert(log.snapshot()._getFiles().asScala.map(_.getPath).toSet == Set("foo", "bar")) - - // We added two add files with the same path `foo`. The first should have been removed. - // The second should remain, and should have a hard-coded modification time of 1700000000000L - assert(log.snapshot()._getFiles().asScala.find(_.getPath == "foo").get - .getModificationTime == 1700000000000L) - } - } - - test("error - versions not contiguous") { - val ex = intercept[IllegalStateException] { - withLogForGoldenTable("versions-not-contiguous") { _ => } - } - - assert(ex.getMessage === - DeltaErrors.deltaVersionsNotContiguousException(Vector(0, 2)).getMessage) - } - - Seq("protocol", "metadata").foreach { action => - test(s"state reconstruction without $action should fail") { - val e = intercept[IllegalStateException] { - // snapshot initialization triggers state reconstruction - withLogForGoldenTable(s"deltalog-state-reconstruction-without-$action") { _ => } - } - assert(e.getMessage === DeltaErrors.actionNotFoundException(action, 0).getMessage) - } - } - - Seq("protocol", "metadata").foreach { action => - test(s"state reconstruction from checkpoint with missing $action should fail") { - val e = intercept[IllegalStateException] { - val tblName = s"deltalog-state-reconstruction-from-checkpoint-missing-$action" - // snapshot initialization triggers state reconstruction - withLogForGoldenTable(tblName) { _ => } - } - assert(e.getMessage === DeltaErrors.actionNotFoundException(action, 10).getMessage) - } - } - - test("table protocol version greater than client reader protocol version") { - val e = intercept[DeltaErrors.InvalidProtocolVersionException] { - withLogForGoldenTable("deltalog-invalid-protocol-version") { _ => } - } - - assert(e.getMessage === new DeltaErrors.InvalidProtocolVersionException(Action.protocolVersion, - Protocol(99, 7)).getMessage) - } - - test("get commit info") { - // check all fields get deserialized properly - withLogForGoldenTable("deltalog-commit-info") { log => - val ci = log.getCommitInfoAt(0) - assert(ci.getVersion.get() == 0) - assert(ci.getTimestamp == new Timestamp(1540415658000L)) - assert(ci.getUserId.get() == "user_0") - assert(ci.getUserName.get() == "username_0") - assert(ci.getOperation == "WRITE") - assert(ci.getOperationParameters == Map("test" -> "test").asJava) - assert(ci.getJobInfo.get() == - new JobInfoJ("job_id_0", "job_name_0", "run_id_0", "job_owner_0", "trigger_type_0")) - assert(ci.getNotebookInfo.get() == new NotebookInfoJ("notebook_id_0")) - assert(ci.getClusterId.get() == "cluster_id_0") - assert(ci.getReadVersion.get() == -1) - assert(ci.getIsolationLevel.get() == "default") - assert(ci.getIsBlindAppend.get() == true) - assert(ci.getOperationMetrics.get() == Map("test" -> "test").asJava) - assert(ci.getUserMetadata.get() == "foo") - } - - // use an actual spark transaction example - withLogForGoldenTable("snapshot-vacuumed") { log => - // check that correct CommitInfo read - (0 to 5).foreach { i => - val ci = log.getCommitInfoAt(i) - - assert(ci.getVersion.get() == i) - if (i > 0) { - assert(ci.getReadVersion.get() == i - 1) - } - } - - // test illegal version - assertThrows[DeltaStandaloneException] { - log.getCommitInfoAt(99) - } - } - } - - test("getChanges - no data loss") { - withLogForGoldenTable("deltalog-getChanges") { log => - val versionToActionsMap = Map( - 0L -> Seq("CommitInfo", "Protocol", "Metadata", "AddFile"), - 1L -> Seq("CommitInfo", "AddCDCFile", "RemoveFile"), - 2L -> Seq("CommitInfo", "Protocol", "SetTransaction") - ) - - def verifyChanges(startVersion: Int): Unit = { - val versionLogs = log.getChanges(startVersion, false).asScala.toSeq - - assert(versionLogs.length == 3 - startVersion, - s"getChanges($startVersion) skipped some versions") - - val versionsInOrder = new ListBuffer[Long]() - - for (versionLog <- versionLogs) { - val version = versionLog.getVersion - val actions = versionLog.getActions.asScala.map(_.getClass.getSimpleName) - val expectedActions = versionToActionsMap(version) - assert(expectedActions == actions, - s"getChanges($startVersion) had incorrect actions at version $version.") - - versionsInOrder += version - } - - // ensure that versions are seen in increasing order - assert(versionsInOrder.toList == (startVersion to 2).map(_.toLong).toList) - } - - // standard cases - verifyChanges(0) - verifyChanges(1) - verifyChanges(2) - - // non-existant start version - val versionLogsIter = log.getChanges(3, false) - assert(!versionLogsIter.hasNext, - "getChanges with a non-existant start version did not return an empty iterator") - - // negative start version - assertThrows[IllegalArgumentException] { - log.getChanges(-1, false) - } - } - } - - test("getChanges - data loss") { - withGoldenTable("deltalog-getChanges") { tablePath => - val tempDir = Files.createTempDirectory(UUID.randomUUID().toString).toFile - try { - FileUtils.copyDirectory(new File(tablePath), tempDir) - val log = DeltaLog.forTable(new Configuration(), tempDir.getCanonicalPath) - - // we delete 2 files so that the `DeltaErrors.failOnDataLossException` is thrown - val logPath = new Path(log.getPath, "_delta_log") - new File(new Path(logPath, "00000000000000000000.json").toUri).delete() - new File(new Path(logPath, "00000000000000000001.json").toUri).delete() - - val versionLogs = log.getChanges(0, false).asScala.toSeq - assert(versionLogs.length == 1) - - assertThrows[IllegalStateException] { - val versionLogsIter = log.getChanges(0, true) - while (versionLogsIter.hasNext) { - versionLogsIter.next() - } - } - } finally { - // just in case - FileUtils.deleteDirectory(tempDir) - } - } - } - - test("DeltaLog.tableExists") { - withTempDir { dir => - - val conf = new Configuration() - val log = DeltaLog.forTable(conf, dir.getCanonicalPath) - - assert(!log.tableExists()) - - log.startTransaction().commit( - Seq(metadata).asJava, - new Operation(Operation.Name.CREATE_TABLE), - "test" - ) - assert(log.tableExists()) - } - } - - test("schema must contain all partition columns") { - val schema = new StructType() - .add("a", new StringType()) - .add("b", new LongType()) - .add("foo", new IntegerType()) - .add("bar", new BooleanType()) - - Seq( - // all partition columns are contained within schema - (Seq("a", "b"), Nil), - // no partition columns, so all partition columns are contained within schema - (Nil, Nil), - // partition columns c and d are not contained within the schema - (Seq("a", "b", "c", "d"), Seq("c", "d")) - ).foreach { case (inputPartCols, missingPartCols) => - withTempDir { dir => - val shouldThrow = missingPartCols.nonEmpty - - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val metadata = MetadataJ.builder() - .schema(schema) - .partitionColumns(inputPartCols.asJava) - .build() - - if (shouldThrow) { - val e = intercept[DeltaStandaloneException] { - log.startTransaction().updateMetadata(metadata) - }.getMessage - - assert( - e.contains(s"Partition column(s) ${missingPartCols.mkString(",")} not found in schema")) - } else { - log.startTransaction().updateMetadata(metadata) - } - } - } - } - - test("schema contains no data columns and only partition columns") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val schema = new StructType() - .add("part_1", new StringType()) - .add("part_2", new LongType()) - - val metadata1 = MetadataJ.builder() - .schema(schema) - .partitionColumns(Seq("part_1", "part_2").asJava) - .build() - - val txn = log.startTransaction() - val e = intercept[DeltaStandaloneException] { - txn.updateMetadata(metadata1) - }.getMessage - assert(e == "Data written into Delta needs to contain at least one non-partitioned column") - } - } - - test("getVersionBeforeOrAtTimestamp and getVersionAtOrAfterTimestamp") { - // Note: - // - all Xa test cases will test getVersionBeforeOrAtTimestamp - // - all Xb test cases will test getVersionAtOrAfterTimestamp - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - - // ========== case 0: delta table is empty ========== - assert(log.getVersionBeforeOrAtTimestamp(System.currentTimeMillis()) == -1) - assert(log.getVersionAtOrAfterTimestamp(System.currentTimeMillis()) == -1) - - // Setup part 1 of 2: create log files - (0 to 2).foreach { i => - val txn = log.startTransaction() - if (i == 0) txn.updateMetadata(metadata) - val files = AddFile(i.toString, Map.empty, 1, 1, true) :: Nil - txn.commit(files.map(ConversionUtils.convertAction).asJava, - manualUpdate, engineInfo - ) - } - - // Setup part 2 of 2: edit lastModified times - val logPath = new Path(dir.getCanonicalPath, "_delta_log") - val logDir = new File(dir.getCanonicalPath, "_delta_log") - // local file system truncates to seconds - val nowEpochMs = System.currentTimeMillis() / 1000 * 1000 - - val delta0 = FileNames.deltaFile(logPath, 0) - val delta1 = FileNames.deltaFile(logPath, 1) - val delta2 = FileNames.deltaFile(logPath, 2) - - new File(logDir, delta0.getName).setLastModified(1000) - new File(logDir, delta1.getName).setLastModified(2000) - new File(logDir, delta2.getName).setLastModified(3000) - - // ========== case 1: before first commit ========== - // case 1a - val e1 = intercept[IllegalArgumentException] { - log.getVersionBeforeOrAtTimestamp(500) - }.getMessage - assert(e1.contains("is before the earliest version")) - // case 1b - assert(log.getVersionAtOrAfterTimestamp(500) == 0) - - // ========== case 2: at first commit ========== - // case 2a - assert(log.getVersionBeforeOrAtTimestamp(1000) == 0) - // case 2b - assert(log.getVersionAtOrAfterTimestamp(1000) == 0) - - // ========== case 3: between two normal commits ========== - // case 3a - assert(log.getVersionBeforeOrAtTimestamp(1500) == 0) // round down to v0 - // case 3b - assert(log.getVersionAtOrAfterTimestamp(1500) == 1) // round up to v1 - - // ========== case 4: at last commit ========== - // case 4a - assert(log.getVersionBeforeOrAtTimestamp(3000) == 2) - // case 4b - assert(log.getVersionAtOrAfterTimestamp(3000) == 2) - - // ========== case 5: after last commit ========== - // case 5a - assert(log.getVersionBeforeOrAtTimestamp(4000) == 2) - // case 5b - val e2 = intercept[IllegalArgumentException] { - log.getVersionAtOrAfterTimestamp(4000) - }.getMessage - assert(e2.contains("is after the latest version")) - } - } - - test("getVersionBeforeOrAtTimestamp and getVersionAtOrAfterTimestamp - recoverability") { - withTempDir { dir => - // local file system truncates to seconds - val nowEpochMs = System.currentTimeMillis() / 1000 * 1000 - - val logPath = new Path(dir.getCanonicalPath, "_delta_log") - val logDir = new File(dir.getCanonicalPath, "_delta_log") - - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - (0 to 35).foreach { i => - val txn = log.startTransaction() - if (i == 0) txn.updateMetadata(metadata) - val files = AddFile(i.toString, Map.empty, 1, 1, true) :: Nil - txn.commit(files.map(ConversionUtils.convertAction).asJava, - manualUpdate, engineInfo - ) - } - - (0 to 35).foreach { i => - val delta = FileNames.deltaFile(logPath, i) - val file = new File(logDir, delta.getName) - val fs = logPath.getFileSystem(new Configuration()) - if (i >= 25) { - file.setLastModified(nowEpochMs + i * 1000) - } else { - file.delete() - assert(!fs.exists(delta)) - } - } - - // A checkpoint exists at version 30, so all versions [30, 35] are recoverable. - // Nonetheless, getVersionBeforeOrAtTimestamp and getVersionAtOrAfterTimestamp do not - // require that the version is recoverable, so we should still be able to get back versions - // [25-29] - - (25 to 34).foreach { i => - if (i == 25) { - assertThrows[IllegalArgumentException] { - log.getVersionBeforeOrAtTimestamp(nowEpochMs + i * 1000 - 1) - } - } else { - assert(log.getVersionBeforeOrAtTimestamp(nowEpochMs + i * 1000 - 1) == i - 1) - } - - assert(log.getVersionAtOrAfterTimestamp(nowEpochMs + i * 1000 - 1) == i) - - assert(log.getVersionBeforeOrAtTimestamp(nowEpochMs + i * 1000) == i) - assert(log.getVersionAtOrAfterTimestamp(nowEpochMs + i * 1000) == i) - - assert(log.getVersionBeforeOrAtTimestamp(nowEpochMs + i * 1000 + 1) == i) - - if (i == 35) { - log.getVersionAtOrAfterTimestamp(nowEpochMs + i * 1000 + 1) - } else { - assert(log.getVersionAtOrAfterTimestamp(nowEpochMs + i * 1000 + 1) == i + 1) - } - } - } - } - - test("checkpoint write should use DeltaLog.hadoopConf") { - withLogForWritableGoldenTable("data-reader-primitives") { _log => - val conf = FakeFileSystem.newConfiguration() - // Use `fake` scheme so that we will fail if we have any code that doesn't use the right conf - val path = new Path("fake://" + _log.getPath.toUri.getRawPath) - val log = DeltaLog.forTable(conf, path) - log.asInstanceOf[DeltaLogImpl].checkpoint() - log.startTransaction().commit(Nil, new Operation(Operation.Name.WRITE), "engineInfo") - val iter = log.snapshot().open() - try { - assert(iter.asScala.size == 11) - } finally { - iter.close() - } - } - } - - /** - * Handles all the relevant cases for this optimized reverse log replay for protocol & metadata - * loading. - * - * Case 1: Fresh snapshot created with no previous snapshot, replaying back to 0.json - * Case 2: Snapshot update, but there is a checkpoint newer than the previous cached snapshot - * Case 3: Snapshot update, but there is a cached snapshot newer than the latest checkpoint - * Case 4: Same as case 3, but there is also metadata action that's newer than the cached snapshot - * Case 5: Same as case 3, but there are metadata and protocol actions newer than the cached - * snapshot - */ - test("Snapshot should read the minimal number of log files needed when loading " + - "protocol & metadata") { - withTempDir { dir => - val conf = new Configuration() - def commit(i: Int, deltaLog: DeltaLog): Unit = { - val files = - ConversionUtils.convertAction(AddFile(i.toString, Map.empty, 1, 1, true)) :: Nil - deltaLog.startTransaction().commit(files.asJava, manualUpdate, engineInfo) - } - - // V0: Add protocol and metadata - val writerLog = DeltaLog.forTable(conf, dir.getCanonicalPath) - val metadataV0 = MetadataJ - .builder() - .schema(new StructType().add("x", new IntegerType())) - .build() - val protocolV0 = new ProtocolJ(1, 2) - writerLog.startTransaction() - .commit((metadataV0 :: protocolV0 :: Nil).asJava, manualUpdate, engineInfo) - - // Case 1 - // V1-V8: The latest protocol and metadata is still in V0 - for (i <- 1 to 8) { commit(i, writerLog) } - val readerLog = DeltaLog.forTable(conf, dir.getCanonicalPath) - val metrics1 = readerLog.snapshot().asInstanceOf[SnapshotImpl].protocolMetadataLoadMetrics - assert(metrics1.fileVersions.toList.sorted === (0 to 8).toList) - - // Case 2 - // V9-13: The latest protocol and metadata is now in V10 (checkpoint) - for (i <- 9 to 13) { commit(i, writerLog) } - val metrics2 = readerLog.update().asInstanceOf[SnapshotImpl].protocolMetadataLoadMetrics - assert(metrics2.fileVersions.toList.sorted === (10 to 13).toList) - - // Case 3 - // V14-19: The latest protocol and metadata should be saved in the current snapshot at V13 - // To emphasize: we should not scan all the way back to V10! We should scan to V14 - // and then stop, since we already know the latest protocol and metadata at V13. - for (i <- 14 to 19) { commit(i, writerLog) } - val metrics3 = readerLog.update().asInstanceOf[SnapshotImpl].protocolMetadataLoadMetrics - assert(metrics3.fileVersions.toList.sorted === (14 to 19).toList) - - // V20-22: Again, the latest protocol and metadata is now in the checkpoint - for (i <- 20 to 22) { commit(i, writerLog) } - val metrics4 = readerLog.update().asInstanceOf[SnapshotImpl].protocolMetadataLoadMetrics - assert(metrics4.fileVersions.toList.sorted === (20 to 22).toList) - - // Case 4 - // V26: Now, this has the latest metadata (but not the latest protocol). The current snapshot - // version is 22, so we should still read the new log files 26 -> 23 - for (i <- 23 to 25) { commit(i, writerLog) } - val metadataV26 = MetadataJ - .builder() - .schema(metadataV0.getSchema.add("y", new IntegerType())) - .build() - val txn26 = writerLog.startTransaction() - txn26.updateMetadata(metadataV26) - txn26.commit(Nil.asJava, manualUpdate, engineInfo) - val metrics5_snapshot = readerLog.update().asInstanceOf[SnapshotImpl] - val metrics5 = metrics5_snapshot.protocolMetadataLoadMetrics - assert(metrics5.fileVersions.toList.sorted === (23 to 26).toList) - // Check that we actually loaded the correct metadata at V26 instead of the hint at V22 - assert(metrics5_snapshot.getMetadata.getSchema === metadataV26.getSchema) - - // Case 5 - // V27: Just adds - // V28: This commit contains a new metadata AND protocol. - // V29: More adds - commit(27, writerLog) - val metadataV28 = MetadataJ - .builder() - .schema(metadataV26.getSchema.add("z", new IntegerType())) - .build() - // Note: same Protocol versions (1,2) as the previous protocol, due to the limited - // delta-standalone protocol support. - val protocolV28 = new ProtocolJ(1, 2) - writerLog.startTransaction() - .commit((metadataV28 :: protocolV28 :: Nil).asJava, manualUpdate, engineInfo) - commit(29, writerLog) - // The current snapshot is still at V26. We should read V29, V28, see the newest protocol and - // metadata, and stop early - val metrics6_snapshot = readerLog.update().asInstanceOf[SnapshotImpl] - val metrics6 = metrics6_snapshot.protocolMetadataLoadMetrics - assert(metrics6.fileVersions.toList.sorted === (28 to 29).toList) - assert(metrics6_snapshot.getMetadata.getSchema === metadataV28.getSchema) - // useless asserting the protocol, since they are the same - } - } - - test("skips checkpointing when flag set to false") { - withTempDir { dir => - def getFile(path: Path): File = { - new File(path.toString.stripPrefix("file:")) - } - - val conf1 = new Configuration() - val log1 = DeltaLogImpl.forTable(conf1, dir.getCanonicalPath) - - (0 to 10).foreach { i => - val txn = log1.startTransaction() - if (i == 0) txn.updateMetadata(metadata) - val files = AddFile(i.toString, Map.empty, 1, 1, true) :: Nil - txn.commit(files.map(ConversionUtils.convertAction).asJava, manualUpdate, engineInfo) - } - - // writes out checkpoint as normal - assert(log1.lastCheckpoint.exists(_.version == 10)) - assert(getFile(FileNames.deltaFile(log1.logPath, 10)).exists()) - assert(getFile(FileNames.checkpointFileSingular(log1.logPath, 10)).exists()) - - val conf2 = new Configuration() - conf2.set("io.delta.standalone.checkpointing.enabled", "false") - val log2 = DeltaLogImpl.forTable(conf2, dir.getCanonicalPath) - (10 to 20).foreach { i => - val txn = log2.startTransaction() - val files = AddFile(i.toString, Map.empty, 1, 1, true) :: Nil - txn.commit(files.map(ConversionUtils.convertAction).asJava, manualUpdate, engineInfo) - } - - // still the old one! - assert(log2.lastCheckpoint.exists(_.version == 10)) - - // new json file exists - assert(getFile(FileNames.deltaFile(log2.logPath, 20)).exists()) - - // new checkpoint file does NOT exist - assert(!getFile(FileNames.checkpointFileSingular(log2.logPath, 20)).exists()) - } - } -} - -/////////////////////////////////////////////////////////////////////////// -// Concrete Implementations -/////////////////////////////////////////////////////////////////////////// - -class StandardDeltaLogSuite extends DeltaLogSuiteBase { - class StandardSnapshot(snapshot: Snapshot) extends CustomAddFilesAccessor(snapshot) { - override def _getFiles(): java.util.List[AddFileJ] = snapshot.getAllFiles - } - - override implicit def createCustomAddFilesAccessor(snapshot: Snapshot): CustomAddFilesAccessor = { - new StandardSnapshot(snapshot) - } -} - -class MemoryOptimizedDeltaLogSuite extends DeltaLogSuiteBase { - class MemoryOptimizedSnapshot(snapshot: Snapshot) extends CustomAddFilesAccessor(snapshot) { - override def _getFiles(): java.util.List[AddFileJ] = { - import io.delta.standalone.internal.util.Implicits._ - - snapshot.scan().getFiles.toArray.toList.asJava - } - } - - override implicit def createCustomAddFilesAccessor(snapshot: Snapshot): CustomAddFilesAccessor = { - new MemoryOptimizedSnapshot(snapshot) - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaRetentionSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaRetentionSuite.scala deleted file mode 100644 index ecfb5bb4c3c..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaRetentionSuite.scala +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.io.File - -import io.delta.standalone.Operation - -import io.delta.standalone.internal.actions.{Action, AddFile, Metadata, RemoveFile} -import io.delta.standalone.internal.util.ManualClock -import io.delta.standalone.internal.util.TestUtils._ - -// scalastyle:off removeFile -class DeltaRetentionSuite extends DeltaRetentionSuiteBase { - - val writerId = "test-writer-id" - val manualUpdate = new Operation(Operation.Name.MANUAL_UPDATE) - - protected def getLogFiles(dir: File): Seq[File] = - getDeltaFiles(dir) ++ getCheckpointFiles(dir) - - test("delete expired logs") { - withTempDir { dir => - val clock = new ManualClock(System.currentTimeMillis()) - val log = DeltaLogImpl.forTable(hadoopConf, dir.getCanonicalPath, clock) - val logPath = new File(log.logPath.toUri) - (1 to 5).foreach { i => - val txn = if (i == 1) startTxnWithManualLogCleanup(log) else log.startTransaction() - val file = AddFile(i.toString, Map.empty, 1, 1, true) :: Nil - val delete: Seq[Action] = if (i > 1) { - RemoveFile((i - 1).toString, Some(System.currentTimeMillis()), true) :: Nil - } else { - Nil - } - txn.commit(delete ++ file, manualUpdate, writerId) - } - - val initialFiles = getLogFiles(logPath) - // Shouldn't clean up, no checkpoint, no expired files - log.cleanUpExpiredLogs() - - assert(initialFiles === getLogFiles(logPath)) - - clock.advance( - DeltaConfigs.getMilliSeconds( - DeltaConfigs.parseCalendarInterval(DeltaConfigs.LOG_RETENTION.defaultValue) - ) + util.DateTimeConstants.MILLIS_PER_DAY) // + 1 day - - // Shouldn't clean up, no checkpoint, although all files have expired - log.cleanUpExpiredLogs() - assert(initialFiles === getLogFiles(logPath)) - - log.checkpoint() - - val expectedFiles = Seq("04.json", "04.checkpoint.parquet") - // after checkpointing, the files should be cleared - log.cleanUpExpiredLogs() - val afterCleanup = getLogFiles(logPath) - assert(initialFiles !== afterCleanup) - assert(expectedFiles.forall(suffix => afterCleanup.exists(_.getName.endsWith(suffix))), - s"${afterCleanup.mkString("\n")}\n didn't contain files with suffixes: $expectedFiles") - } - } - - test("delete expired logs 2") { - withTempDir { dir => - val clock = new ManualClock(System.currentTimeMillis()) - val log = DeltaLogImpl.forTable(hadoopConf, dir.getCanonicalPath, clock) - val logPath = new File(log.logPath.toUri) - - // write 000.json to 009.json - (0 to 9).foreach { i => - val txn = if (i == 0) startTxnWithManualLogCleanup(log) else log.startTransaction() - txn.commit(AddFile(i.toString, Map.empty, 1, 1, true) :: Nil, manualUpdate, writerId) - } - - assert(log.update().version == 9) - assert(getDeltaFiles(logPath).size == 10) - assert(getCheckpointFiles(logPath).isEmpty) - - // Local filesystem will truncate the logFile last modified timestamps to the nearest second. - // This allows for contiguous log & checkpoint files to have the same timestamp. - // e.g. 00.json, 00.checkpoint, 01.json. 01.checkpoint have lastModified time 1630107078000. - // This breaks assumptions made in [[BufferingLogDeletionIterator]]. - // This will never happen in production, so let's just fix the timestamps - val now = clock.getTimeMillis() - getLogFiles(logPath).sortBy(_.getName).zipWithIndex.foreach { case (file, idx) => - file.setLastModified(now + 1000 * idx) - } - - // to expire log files, advance by the retention duration, then another day (since we - // truncate) - clock.advance(log.deltaRetentionMillis + 2*1000*60*60*24 + 1000*100) - // now, 000.json to 009.json have all expired - - // write 010.json and 010.checkpoint - log.startTransaction() - .commit(AddFile("10", Map.empty, 1, 1, true) :: Nil, manualUpdate, writerId) - - getLogFiles(logPath) - .filter(_.getName.contains("10.")) - .foreach(_.setLastModified(clock.getTimeMillis())) - - // Finally, clean up expired logs. this should delete 000.json to 009.json - log.cleanUpExpiredLogs() - - assert(log.update().version == 10) - assert(getDeltaFiles(logPath).size == 1) - assert(getCheckpointFiles(logPath).size == 1) - - val afterAutoCleanup = getLogFiles(logPath) - val expectedFiles = Seq("10.json", "10.checkpoint.parquet") - assert(expectedFiles.forall(suffix => afterAutoCleanup.exists(_.getName.endsWith(suffix))), - s"${afterAutoCleanup.mkString("\n")}\n didn't contain files with suffixes: $expectedFiles") - } - } - - test("Can set enableExpiredLogCleanup") { - withTempDir { tempDir => - val log = DeltaLogImpl.forTable(hadoopConf, tempDir.getCanonicalPath) - log.startTransaction().commit( - metadata.copy( - configuration = Map(DeltaConfigs.ENABLE_EXPIRED_LOG_CLEANUP.key -> "true") - ) :: Nil, - manualUpdate, writerId) - assert(log.enableExpiredLogCleanup) - - log.startTransaction().commit( - metadata.copy( - configuration = Map(DeltaConfigs.ENABLE_EXPIRED_LOG_CLEANUP.key -> "false") - ) :: Nil, - manualUpdate, writerId) - assert(!log.enableExpiredLogCleanup) - - log.startTransaction().commit(metadata :: Nil, manualUpdate, writerId) - assert(log.enableExpiredLogCleanup) - } - } - - test( - "RemoveFiles persist across checkpoints as tombstones if retention time hasn't expired") { - withTempDir { tempDir => - val clock = new ManualClock(System.currentTimeMillis()) - val log1 = DeltaLogImpl.forTable(hadoopConf, tempDir.getCanonicalPath, clock) - - val txn1 = startTxnWithManualLogCleanup(log1) - val files1 = (1 to 10).map(f => AddFile(f.toString, Map.empty, 1, 1, true)) - txn1.commit(files1, manualUpdate, writerId) - val txn2 = log1.startTransaction() - val files2 = (1 to 4).map(f => RemoveFile(f.toString, Some(clock.getTimeMillis()))) - txn2.commit(files2, manualUpdate, writerId) - log1.checkpoint() - - val log2 = DeltaLogImpl.forTable(hadoopConf, tempDir.getCanonicalPath, clock) - assert(log2.snapshot.tombstonesScala.size === 4) - assert(log2.snapshot.allFilesScala.size === 6) - } - } - - test("RemoveFiles get deleted during checkpoint if retention time has passed") { - withTempDir { tempDir => - val clock = new ManualClock(System.currentTimeMillis()) - val log1 = DeltaLogImpl.forTable(hadoopConf, tempDir.getCanonicalPath, clock) - - val txn1 = startTxnWithManualLogCleanup(log1) - val files1 = (1 to 10).map(f => AddFile(f.toString, Map.empty, 1, 1, true)) - txn1.commit(files1, manualUpdate, writerId) - val txn2 = log1.startTransaction() - val files2 = (1 to 4).map(f => RemoveFile(f.toString, Some(clock.getTimeMillis()))) - txn2.commit(files2, manualUpdate, writerId) - - clock.advance( - DeltaConfigs.getMilliSeconds( - DeltaConfigs.parseCalendarInterval(DeltaConfigs.LOG_RETENTION.defaultValue) - ) + 1000000L) - - log1.checkpoint() - - val log2 = DeltaLogImpl.forTable(hadoopConf, tempDir.getCanonicalPath, clock) - assert(log2.snapshot.tombstonesScala.size === 0) - assert(log2.snapshot.allFilesScala.size === 6) - } - } - - test("the checkpoint file for version 0 should be cleaned") { - withTempDir { tempDir => - val now = System.currentTimeMillis() - val clock = new ManualClock(now) - val log = DeltaLogImpl.forTable(hadoopConf, tempDir.getCanonicalPath, clock) - val logPath = new File(log.logPath.toUri) - startTxnWithManualLogCleanup(log) - .commit(AddFile("0", Map.empty, 1, 1, true) :: Nil, manualUpdate, writerId) - log.checkpoint() - - val initialFiles = getLogFiles(logPath) - clock.advance(log.deltaRetentionMillis + 1000*60*60*24) // 1 day - - // Create a new checkpoint so that the previous version can be deleted - log.startTransaction() - .commit(AddFile("1", Map.empty, 1, 1, true) :: Nil, manualUpdate, writerId) - log.checkpoint() - - // We need to manually set the last modified timestamp to match that expected by the manual - // clock. If we don't, then sometimes the version 00 and version 01 log files will have the - // exact same lastModified time, since the local filesystem truncates the lastModified time - // to seconds instead of milliseconds. Here's what that looks like: - // - // _delta_log/00000000000000000000.checkpoint.parquet 1632267876000 - // _delta_log/00000000000000000000.json 1632267876000 - // _delta_log/00000000000000000001.checkpoint.parquet 1632267876000 - // _delta_log/00000000000000000001.json 1632267876000 - // - // By modifying the lastModified time, this better resembles the real-world lastModified - // times that the latest log files should have. - getLogFiles(logPath) - .filter(_.getName.contains("001.")) - .foreach(_.setLastModified(now + log.deltaRetentionMillis + 1000*60*60*24)) - - log.cleanUpExpiredLogs() - val afterCleanup = getLogFiles(logPath) - initialFiles.foreach { file => - assert(!afterCleanup.contains(file)) - } - } - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaRetentionSuiteBase.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaRetentionSuiteBase.scala deleted file mode 100644 index f8e7df1308c..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaRetentionSuiteBase.scala +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.io.File - -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.Path -import org.scalatest.FunSuite - -import io.delta.standalone.{DeltaLog, Operation, OptimisticTransaction} -import io.delta.standalone.actions.{Metadata => MetadataJ} -import io.delta.standalone.types.{StringType, StructType} - -import io.delta.standalone.internal.util.{ConversionUtils, FileNames} -import io.delta.standalone.internal.util.TestUtils._ - -trait DeltaRetentionSuiteBase extends FunSuite { - - val metadataJ = MetadataJ.builder().schema(new StructType().add("part", new StringType())).build() - val metadata = ConversionUtils.convertMetadataJ(metadataJ) - - protected def hadoopConf: Configuration = { - val conf = new Configuration() - conf.set( - DeltaConfigs.hadoopConfPrefix + - DeltaConfigs.ENABLE_EXPIRED_LOG_CLEANUP.key.stripPrefix("delta."), - "false") - conf - } - - protected def getDeltaFiles(dir: File): Seq[File] = - dir.listFiles().filter(_.getName.endsWith(".json")) - - protected def getCheckpointFiles(dir: File): Seq[File] = - dir.listFiles().filter(f => FileNames.isCheckpointFile(new Path(f.getCanonicalPath))) - - /** - * Start a txn that disables automatic log cleanup. Some tests may need to manually clean up logs - * to get deterministic behaviors. - */ - protected def startTxnWithManualLogCleanup(log: DeltaLog): OptimisticTransaction = { - val txn = log.startTransaction() - txn.updateMetadata(metadataJ) - txn - } - - test("startTxnWithManualLogCleanup") { - withTempDir { dir => - val log = DeltaLogImpl.forTable(hadoopConf, dir.getCanonicalPath) - startTxnWithManualLogCleanup(log) - .commit(Nil, new Operation(Operation.Name.MANUAL_UPDATE), "test-writer-id") - assert(!log.enableExpiredLogCleanup) - } - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaScanSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaScanSuite.scala deleted file mode 100644 index 57b77415189..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaScanSuite.scala +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import scala.collection.JavaConverters._ - -import org.apache.hadoop.conf.Configuration -import org.scalatest.FunSuite - -import io.delta.standalone.{DeltaLog, Operation} -import io.delta.standalone.actions.{AddFile => AddFileJ} -import io.delta.standalone.expressions.{And, EqualTo, LessThan, Literal} -import io.delta.standalone.types.{IntegerType, StructField, StructType} - -import io.delta.standalone.internal.actions.{Action, AddFile, Metadata} -import io.delta.standalone.internal.sources.StandaloneHadoopConf -import io.delta.standalone.internal.util.{ConversionUtils, FileNames} -import io.delta.standalone.internal.util.TestUtils._ - -class DeltaScanSuite extends FunSuite { - - private val op = new Operation(Operation.Name.WRITE) - - private val schema = new StructType(Array( - new StructField("col1", new IntegerType(), true), - new StructField("col2", new IntegerType(), true), - new StructField("col3", new IntegerType(), true), - new StructField("col4", new IntegerType(), true) - )) - - private val partitionSchema = new StructType(Array( - new StructField("col1", new IntegerType(), true), - new StructField("col2", new IntegerType(), true) - )) - - val metadata = Metadata( - partitionColumns = partitionSchema.getFieldNames, schemaString = schema.toJson) - - private val files = (1 to 10).map { i => - val partitionValues = Map("col1" -> (i % 3).toString, "col2" -> (i % 2).toString) - AddFile(i.toString, partitionValues, 1L, 1L, dataChange = true) - } - - private val externalFileSystems = Seq("s3://", "wasbs://", "adls://") - - private val externalFiles = (1 to 10).map { i => - val partitionValues = Map("col1" -> (i % 3).toString, "col2" -> (i % 2).toString) - val schema = externalFileSystems(i % 3) - AddFile(s"${schema}path/to/$i.parquet", partitionValues, 1L, 1L, dataChange = true) - } - - private val filesDataChangeFalse = files.map(_.copy(dataChange = false)) - - private val metadataConjunct = new EqualTo(schema.column("col1"), Literal.of(0)) - private val dataConjunct = new EqualTo(schema.column("col3"), Literal.of(5)) - - def withLog( - actions: Seq[Action], - configuration: Configuration = new Configuration() - )(test: DeltaLog => Unit): Unit = { - withTempDir { dir => - val log = DeltaLog.forTable(configuration, dir.getCanonicalPath) - log.startTransaction().commit(metadata :: Nil, op, "engineInfo") - log.startTransaction().commit(actions, op, "engineInfo") - - test(log) - } - } - - test("properly splits metadata (pushed) and data (residual) predicates") { - withLog(files) { log => - val mixedConjunct = new LessThan(schema.column("col2"), schema.column("col4")) - val filter = new And(new And(metadataConjunct, dataConjunct), mixedConjunct) - val scan = log.update().scan(filter) - assert(scan.getPushedPredicate.get == metadataConjunct) - assert(scan.getResidualPredicate.get == new And(dataConjunct, mixedConjunct)) - } - } - - test("filtered scan with a metadata (pushed) conjunct should return matched files") { - withLog(files) { log => - val filter = new And(metadataConjunct, dataConjunct) - val scan = log.update().scan(filter) - - assert(scan.getFiles.asScala.toSeq.map(ConversionUtils.convertAddFileJ) == - filesDataChangeFalse.filter(_.partitionValues("col1").toInt == 0)) - - assert(scan.getPushedPredicate.get == metadataConjunct) - assert(scan.getResidualPredicate.get == dataConjunct) - } - } - - test("filtered scan with only data (residual) predicate should return all files") { - withLog(files) { log => - val filter = dataConjunct - val scan = log.update().scan(filter) - - assert(scan.getFiles.asScala.toSeq.map(ConversionUtils.convertAddFileJ) == - filesDataChangeFalse) - assert(!scan.getPushedPredicate.isPresent) - assert(scan.getResidualPredicate.get == filter) - } - } - - test("filtered scan with files stored in external file systems") { - val configuration = new Configuration() - configuration.setBoolean(StandaloneHadoopConf.RELATIVE_PATH_IGNORE, true) - withLog(externalFiles, configuration) { log => - val filter = dataConjunct - val scan = log.update().scan(filter) - val scannedFiles = scan.getFiles.asScala.map(_.getPath).toSet - val expectedFiles = externalFiles.map(_.path).toSet - assert(scannedFiles == expectedFiles, - "paths should not have been made qualified") - } - } - - /** - * This tests the following DeltaScan MemoryOptimized functionalities: - * - skipping AddFiles that don't match the given filter - * - returning AddFiles that do match the given filter - * - skipping AddFiles that were later removed - * - returning only the latest AddFile that was added across different commits - * - returning the first AddFile that was written in the same commit .json - */ - test("correct reverse replay") { - val filter = new And( - new EqualTo(partitionSchema.column("col1"), Literal.of(0)), - new EqualTo(partitionSchema.column("col2"), Literal.of(0)) - ) - - val addA_1 = AddFile("a", Map("col1" -> "0", "col2" -> "0"), 1L, 10L, dataChange = true) - val addA_2 = AddFile("a", Map("col1" -> "0", "col2" -> "0"), 1L, 20L, dataChange = true) - val addB_4 = AddFile("b", Map("col1" -> "0", "col2" -> "1"), 1L, 40L, dataChange = true) // FAIL - val addC_7 = AddFile("c", Map("col1" -> "0", "col2" -> "0"), 1L, 70L, dataChange = true) - val addD_8 = AddFile("d", Map("col1" -> "0", "col2" -> "0"), 1L, 80L, dataChange = true) - val removeD_9 = addD_8.removeWithTimestamp(90L) - val addE_13 = AddFile("e", Map("col1" -> "0", "col2" -> "0"), 1L, 10L, dataChange = true) - val addF_16_0 = AddFile("f", Map("col1" -> "0", "col2" -> "0"), 1L, 130L, dataChange = true) - val addF_16_1 = AddFile("f", Map("col1" -> "0", "col2" -> "0"), 1L, 131L, dataChange = true) - - withTempDir { dir => - val log = DeltaLogImpl.forTable(new Configuration(), dir.getCanonicalPath) - - def commit(actions: Seq[Action]): Unit = - log.startTransaction().commit(actions, op, "engineInfo") - - commit(metadata :: Nil) // v0 - commit(addA_1 :: Nil) // IGNORED - replaced later by addA_2 - commit(addA_2 :: Nil) // RETURNED - passes filter - commit(Nil) // v3 - commit(addB_4 :: Nil) // IGNORED - fails filter - commit(Nil) // v5 - commit(Nil) // v6 - commit(addC_7 :: Nil) // RETURNED - commit(addD_8 :: Nil) // IGNORED - deleted later - commit(removeD_9 :: Nil) - commit(Nil) // v10 - commit(Nil) // v11 - commit(Nil) // v12 - will be overwritten to be an empty file - commit(addE_13 :: Nil) // RETURNED - commit(Nil) // v14 - will be overwritten to be an empty file - commit(Nil) // v15 - will be overwritten to be an empty file - commit(addF_16_0 :: addF_16_1 :: Nil) // addF_16_0 RETURNED, addF_16_1 IGNORED - commit(Nil) // v17 - will be overwritten to be an empty file - - Seq(12, 14, 15, 17).foreach { i => - val path = FileNames.deltaFile(log.logPath, i) - log.store.write(path, Iterator().asJava, true, log.hadoopConf) - } - - val expectedSet = Set(addA_2, addC_7, addE_13, addF_16_0) - .map(_.copy(dataChange = false)) - .map(ConversionUtils.convertAddFile) - - val set = new scala.collection.mutable.HashSet[AddFileJ]() - val scan = log.update().scan(filter) - val iter = scan.getFiles - - while (iter.hasNext) { - iter.hasNext // let's use another hasNext call to make sure it is idempotent - - set += iter.next() - } - - assert(set == expectedSet) - - iter.close() - } - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaTimeTravelSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaTimeTravelSuite.scala deleted file mode 100644 index c3cab55e8dc..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/DeltaTimeTravelSuite.scala +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.io.File -import java.nio.file.Files -import java.sql.Timestamp -import java.util.{Locale, TimeZone, UUID} - -import scala.collection.JavaConverters._ -import scala.concurrent.duration._ -import scala.language.implicitConversions - -import org.apache.commons.io.FileUtils -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.Path -import org.scalatest.FunSuite - -import io.delta.standalone.{DeltaLog, Snapshot} -import io.delta.standalone.exceptions.DeltaStandaloneException - -import io.delta.standalone.internal.exception.DeltaErrors -import io.delta.standalone.internal.util.FileNames -import io.delta.standalone.internal.util.GoldenTableUtils._ - -/** - * Instead of using Spark in this project to WRITE data and log files for tests, we have - * io.delta.golden.GoldenTables do it instead. During tests, we then refer by name to specific - * golden tables that that class is responsible for generating ahead of time. This allows us to - * focus on READING only so that we may fully decouple from Spark and not have it as a dependency. - * - * See io.delta.golden.GoldenTables for documentation on how to ensure that the needed files have - * been generated. - */ -class DeltaTimeTravelSuite extends FunSuite { - // scalastyle:on funsuite - - // Timezone is fixed to America/Los_Angeles for timezone-sensitive tests - TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")) - // Add Locale setting - Locale.setDefault(Locale.US) - - /** Same start time as used in GoldenTables */ - private val start = 1540415658000L - - private implicit def durationToLong(duration: FiniteDuration): Long = { - duration.toMillis - } - - private def getDirDataFiles(tablePath: String): Array[File] = { - val dir = new File(tablePath) - dir.listFiles().filter(_.isFile).filter(_.getName.endsWith("snappy.parquet")) - } - - private def verifySnapshot( - snapshot: Snapshot, - expectedFiles: Array[File], - expectedVersion: Int): Unit = { - assert(snapshot.getVersion == expectedVersion) - assert(snapshot.getAllFiles.size() == expectedFiles.length) - assert( - snapshot.getAllFiles.asScala.forall(f => expectedFiles.exists(_.getName == f.getPath))) - } - - var data_files_version_0: Array[File] = Array.empty - var data_files_version_1: Array[File] = Array.empty - var data_files_version_2: Array[File] = Array.empty - - withGoldenTable("time-travel-start") { tablePath => - data_files_version_0 = getDirDataFiles(tablePath) - } - - withGoldenTable("time-travel-start-start20") { tablePath => - data_files_version_1 = getDirDataFiles(tablePath) - } - - withGoldenTable("time-travel-start-start20-start40") { tablePath => - data_files_version_2 = getDirDataFiles(tablePath) - } - - /** - * `Error case - not reproducible` needs to delete the log directory. Since we don't want to - * delete the golden tables, we instead copy the table into a temp directory, deleting that temp - * directory when we are done. - */ - test("versionAsOf") { - withGoldenTable("time-travel-start-start20-start40") { tablePath => - val tempDir = Files.createTempDirectory(UUID.randomUUID().toString).toFile - try { - FileUtils.copyDirectory(new File(tablePath), tempDir) - val log = DeltaLog.forTable(new Configuration(), tempDir.getCanonicalPath) - - // Correct cases - verifySnapshot(log.getSnapshotForVersionAsOf(0), data_files_version_0, 0) - verifySnapshot(log.getSnapshotForVersionAsOf(1), data_files_version_1, 1) - verifySnapshot(log.getSnapshotForVersionAsOf(2), data_files_version_2, 2) - - // Error case - version after latest commit - val e1 = intercept[DeltaStandaloneException] { - log.getSnapshotForVersionAsOf(3) - } - assert(e1.getMessage == DeltaErrors.versionNotExistException(3, 0, 2).getMessage) - - // Error case - version before earliest commit - val e2 = intercept[DeltaStandaloneException] { - log.getSnapshotForVersionAsOf(-1) - } - assert(e2.getMessage == DeltaErrors.versionNotExistException(-1, 0, 2).getMessage) - - // Error case - not reproducible - val logPath = new Path(log.getPath, "_delta_log") - new File(FileNames.deltaFile(logPath, 0).toUri).delete() - val e3 = intercept[RuntimeException] { - log.getSnapshotForVersionAsOf(0) - } - assert(e3.getMessage == DeltaErrors.noReproducibleHistoryFound(logPath).getMessage) - } finally { - FileUtils.deleteDirectory(tempDir) - } - } - } - - test("timestampAsOf with timestamp in between commits - should use commit before timestamp") { - withGoldenTable("time-travel-start-start20-start40") { tablePath => - val logDir = new File(tablePath, "_delta_log") - new File(logDir, "00000000000000000000.json").setLastModified(start) - new File(logDir, "00000000000000000001.json").setLastModified(start + 20.minutes) - new File(logDir, "00000000000000000002.json").setLastModified(start + 40.minutes) - val log = DeltaLog.forTable(new Configuration(), tablePath) - - verifySnapshot( - log.getSnapshotForTimestampAsOf(start + 10.minutes), data_files_version_0, 0) - verifySnapshot( - log.getSnapshotForTimestampAsOf(start + 30.minutes), data_files_version_1, 1) - } - } - - test("timestampAsOf with timestamp after last commit should fail") { - withGoldenTable("time-travel-start-start20-start40") { tablePath => - val logDir = new File(tablePath, "_delta_log") - new File(logDir, "00000000000000000000.json").setLastModified(start) - new File(logDir, "00000000000000000001.json").setLastModified(start + 20.minutes) - new File(logDir, "00000000000000000002.json").setLastModified(start + 40.minutes) - val log = DeltaLog.forTable(new Configuration(), tablePath) - - val e = intercept[IllegalArgumentException] { - log.getSnapshotForTimestampAsOf(start + 50.minutes) // later by 10 mins - } - - val latestTimestamp = new Timestamp(start + 40.minutes) - val usrTimestamp = new Timestamp(start + 50.minutes) - assert(e.getMessage == - DeltaErrors.timestampLaterThanTableLastCommit(usrTimestamp, latestTimestamp).getMessage) - } - } - - test("timestampAsOf with timestamp on exact commit timestamp") { - withGoldenTable("time-travel-start-start20-start40") { tablePath => - val logDir = new File(tablePath, "_delta_log") - new File(logDir, "00000000000000000000.json").setLastModified(start) - new File(logDir, "00000000000000000001.json").setLastModified(start + 20.minutes) - new File(logDir, "00000000000000000002.json").setLastModified(start + 40.minutes) - val log = DeltaLog.forTable(new Configuration(), tablePath) - - verifySnapshot( - log.getSnapshotForTimestampAsOf(start), data_files_version_0, 0) - verifySnapshot( - log.getSnapshotForTimestampAsOf(start + 20.minutes), data_files_version_1, 1) - verifySnapshot( - log.getSnapshotForTimestampAsOf(start + 40.minutes), data_files_version_2, 2) - } - } - - test("time travel with schema changes - should instantiate old schema") { - var orig_schema_data_files: Array[File] = Array.empty - // write data to a table with some original schema - withGoldenTable("time-travel-schema-changes-a") { tablePath => - orig_schema_data_files = getDirDataFiles(tablePath) - } - - // then append more data to that "same" table using a different schema - // reading version 0 should show only the original schema data files - withLogForGoldenTable("time-travel-schema-changes-b") { log => - verifySnapshot(log.getSnapshotForVersionAsOf(0), orig_schema_data_files, 0) - } - } - - test("time travel with partition changes - should instantiate old schema") { - def getPartitionDirDataFiles(tablePath: String): Array[File] = { - val dir = new File(tablePath) - dir.listFiles().filter(_.isDirectory).flatMap(_.listFiles).filter(_.isFile) - .filter(_.getName.endsWith("snappy.parquet")) - } - - var orig_partition_data_files: Array[File] = Array.empty - - // write data to a table with some original partition - withGoldenTable("time-travel-partition-changes-a") { tablePath => - orig_partition_data_files = getPartitionDirDataFiles(tablePath) - } - - // then append more data to that "same" table using a different partition - // reading version 0 should show only the original partition data files - withLogForGoldenTable("time-travel-partition-changes-b") { log => - val snapshot = log.getSnapshotForVersionAsOf(0) - assert(snapshot.getVersion == 0) - assert(snapshot.getAllFiles.size() == orig_partition_data_files.length) - assert( - snapshot.getAllFiles.asScala.forall( - // use `contains` instead of `==` as f.getPath contains partition, but o.getName does not - f => orig_partition_data_files.exists(o => f.getPath.contains(o.getName)))) - } - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/ExpressionSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/ExpressionSuite.scala deleted file mode 100644 index dd1a5aef78f..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/ExpressionSuite.scala +++ /dev/null @@ -1,597 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.math.{BigDecimal => BigDecimalJ} -import java.sql.{Date => DateJ, Timestamp => TimestampJ} -import java.util.{Arrays => ArraysJ, Objects} - -import scala.collection.JavaConverters._ - -import org.scalatest.FunSuite - -import io.delta.standalone.data.RowRecord -import io.delta.standalone.expressions.{Column, _} -import io.delta.standalone.types._ - -import io.delta.standalone.internal.actions.AddFile -import io.delta.standalone.internal.data.PartitionRowRecord -import io.delta.standalone.internal.util.PartitionUtils - -class ExpressionSuite extends FunSuite { - - private val partitionSchema = new StructType(Array( - new StructField("col1", new IntegerType(), true), - new StructField("col2", new IntegerType(), true))) - - private val dataSchema = new StructType(Array( - new StructField("col3", new IntegerType(), true), - new StructField("col4", new IntegerType(), true), - new StructField("col5", new IntegerType(), true))) - - private def testPredicate( - predicate: Expression, - expectedResult: Any, - record: RowRecord = null) = { - assert(predicate.eval(record) == expectedResult) - } - - private def testException[T <: Throwable](f: => Any, messageContains: String) - (implicit manifest: Manifest[T]) = { - val e = intercept[T]{ - f; - }.getMessage - assert(e.contains(messageContains)) - } - - test("logical predicates") { - // AND tests - testPredicate( - new And(Literal.ofNull(new BooleanType()), Literal.False), null) - testPredicate( - new And(Literal.False, Literal.ofNull(new BooleanType())), null) - testPredicate( - new And(Literal.True, Literal.ofNull(new BooleanType())), null) - testPredicate( - new And(Literal.ofNull(new BooleanType()), Literal.ofNull(new BooleanType())), null) - testPredicate(new And(Literal.False, Literal.False), false) - testPredicate(new And(Literal.True, Literal.False), false) - testPredicate(new And(Literal.False, Literal.True), false) - testPredicate(new And(Literal.True, Literal.True), true) - testException[IllegalArgumentException]( - new And(Literal.of(1), Literal.of(2)), - "AND expression requires bool type.") - testException[IllegalArgumentException]( - new And(Literal.False, Literal.ofNull(new IntegerType())), - "BinaryOperator left and right DataTypes must be the same") - - // OR tests - testPredicate( - new Or(Literal.ofNull(new BooleanType()), Literal.False), null) - testPredicate( - new Or(Literal.False, Literal.ofNull(new BooleanType())), null) - testPredicate( - new Or(Literal.ofNull(new BooleanType()), Literal.ofNull(new BooleanType())), null) - testPredicate( - new Or(Literal.ofNull(new BooleanType()), Literal.ofNull(new BooleanType())), null) - testPredicate(new Or(Literal.False, Literal.False), false) - testPredicate(new Or(Literal.True, Literal.False), true) - testPredicate(new Or(Literal.False, Literal.True), true) - testPredicate(new Or(Literal.True, Literal.True), true) - testException[IllegalArgumentException]( - new Or(Literal.of(1), Literal.of(2)), - "OR expression requires bool type.") - testException[IllegalArgumentException]( - new Or(Literal.False, Literal.ofNull(new IntegerType())), - "BinaryOperator left and right DataTypes must be the same") - - // NOT tests - testPredicate(new Not(Literal.False), true) - testPredicate(new Not(Literal.True), false) - testPredicate(new Not(Literal.ofNull(new BooleanType())), null) - testException[IllegalArgumentException]( - new Not(Literal.of(1)), - "NOT expression requires bool type.") - } - - test("comparison predicates") { - // (small, big, small, null) - val literals = Seq( - (Literal.of(1), Literal.of(2), Literal.of(1), Literal.ofNull(new IntegerType())), - (Literal.of(1.0F), Literal.of(2.0F), Literal.of(1.0F), Literal.ofNull(new FloatType())), - (Literal.of(1L), Literal.of(2L), Literal.of(1L), Literal.ofNull(new LongType())), - (Literal.of(1.toShort), Literal.of(2.toShort), Literal.of(1.toShort), - Literal.ofNull(new ShortType())), - (Literal.of(1.0), Literal.of(2.0), Literal.of(1.0), Literal.ofNull(new DoubleType())), - (Literal.of(1.toByte), Literal.of(2.toByte), Literal.of(1.toByte), - Literal.ofNull(new ByteType())), - (Literal.False, Literal.True, Literal.False, Literal.ofNull(new BooleanType())), - (Literal.of(new TimestampJ(0)), Literal.of(new TimestampJ(1000000)), - Literal.of(new TimestampJ(0)), Literal.ofNull(new TimestampType())), - (Literal.of(new DateJ(0)), Literal.of(new DateJ(1000000)), - Literal.of(new DateJ(0)), Literal.ofNull(new DateType())), - (Literal.of("apples"), Literal.of("oranges"), Literal.of("apples"), - Literal.ofNull(new StringType())), - (Literal.of("apples".getBytes()), Literal.of("oranges".getBytes()), - Literal.of("apples".getBytes()), Literal.ofNull(new BinaryType())), - // same scales - (Literal.of(BigDecimalJ.valueOf(1).setScale(2)), - Literal.of(BigDecimalJ.valueOf(3).setScale(2)), - Literal.of(BigDecimalJ.valueOf(1).setScale(2)), - Literal.ofNull(new DecimalType(1, 2))), - // different scales - (Literal.of(BigDecimalJ.valueOf(1).setScale(2)), - Literal.of(BigDecimalJ.valueOf(3).setScale(3)), - Literal.of(BigDecimalJ.valueOf(1).setScale(4)), - Literal.ofNull(new DecimalType(2, 5))) - ) - - // Literal creation: (Literal, Literal) -> Expr(a, b) , - // Expected result: (Expr(small, big).eval(), Expr(big, small).eval(), Expr(small, small).eval() - // (Literal creation, Expected result) - val predicates = Seq( - ((a: Literal, b: Literal) => new LessThan(a, b), (true, false, false)), - ((a: Literal, b: Literal) => new LessThanOrEqual(a, b), (true, false, true)), - ((a: Literal, b: Literal) => new GreaterThan(a, b), (false, true, false)), - ((a: Literal, b: Literal) => new GreaterThanOrEqual(a, b), (false, true, true)), - ((a: Literal, b: Literal) => new EqualTo(a, b), (false, false, true)) - ) - - literals.foreach { case (small, big, small2, nullLit) => - predicates.foreach { case (predicateCreator, (smallBig, bigSmall, smallSmall)) => - testPredicate(predicateCreator(small, big), smallBig) - testPredicate(predicateCreator(big, small), bigSmall) - testPredicate(predicateCreator(small, small2), smallSmall) - testPredicate(predicateCreator(small, nullLit), null) - testPredicate(predicateCreator(nullLit, small), null) - } - } - - // more extensive comparison tests for custom-implemented binary comparison - - // in the Databricks SQL guide, BINARY values are initiated from a hexadecimal string, where - // each byte is represented by 2 digits (for a string of odd length, a 0 is prepended) - // A few examples: - // - X'0' == X'00' == [0] - // - X'001' == X'0001' == [0, 1] - // (see: https://docs.databricks.com/sql/language-manual/data-types/binary-type.html) - - // (small, big, small2) - val binaryLiterals = Seq( - (Array.empty[Int], Array(0), Array.empty[Int]), // [] < [0] or X'' < X'0' - (Array.empty[Int], Array(1), Array.empty[Int]), // [] < [1] or X'' < X'1' - (Array(0), Array(1), Array(0)), // [0] < [1] or X'0' < X'1' - (Array(0, 1), Array(1), Array(0, 1)), // [0, 1] < [1] or X'001' < X'1' - (Array(0), Array(0, 0), Array(0)), // [0] < [0, 0] or X'0' < X'000' - (Array(0), Array(0, 1), Array(0)), // [0] < [0, 1] or X'0' < X'001' - (Array(0, 1), Array(1, 0), Array(0, 1)), // [0, 1] < [1, 0] or X'001' < X'100' - (Array(0, 1), Array(0, 2), Array(0, 1)), // [0, 1] < [0, 2] or X'001' < X'002' - // [0, 0, 2] < [0, 1, 0] or X'00002' < X'00100' - (Array(0, 0, 2), Array(0, 1, 0), Array(0, 0, 2)) - ).map{ case (small, big, small2) => - (small.map(_.toByte), big.map(_.toByte), small2.map(_.toByte)) - } - - binaryLiterals.foreach { case (small, big, small2) => - predicates.foreach { case (predicateCreator, (smallBig, bigSmall, smallSmall)) => - testPredicate(predicateCreator(Literal.of(small), Literal.of(big)), smallBig) - testPredicate(predicateCreator(Literal.of(big), Literal.of(small)), bigSmall) - testPredicate(predicateCreator(Literal.of(small), Literal.of(small2)), smallSmall) - } - } - } - - test("null predicates") { - // ISNOTNULL tests - testPredicate(new IsNotNull(Literal.ofNull(new BooleanType())), false) - testPredicate(new IsNotNull(Literal.False), true) - - // ISNULL tests - testPredicate(new IsNull(Literal.ofNull(new BooleanType())), true) - testPredicate(new IsNull(Literal.False), false) - } - - test("In predicate") { - // invalid List param - testException[IllegalArgumentException]( - new In(null, List(Literal.True, Literal.True).asJava), - "'In' expression 'value' cannot be null") - testException[IllegalArgumentException]( - new In(Literal.True, null), - "'In' expression 'elems' cannot be null") - testException[IllegalArgumentException]( - new In(Literal.True, List().asJava), - "'In' expression 'elems' cannot be empty") - - // mismatched DataTypes throws exception - testException[IllegalArgumentException]( - new In(Literal.of(1), List(Literal.True, Literal.True).asJava), - "In expression 'elems' and 'value' must all be of the same DataType") - testException[IllegalArgumentException]( - new In(Literal.True, List(Literal.of(1), Literal.True).asJava), - "In expression 'elems' and 'value' must all be of the same DataType") - - // value.eval() null -> null - testPredicate(new In(Literal.ofNull(new BooleanType()), List(Literal.True).asJava), null) - - // value in list (with null in list) - testPredicate(new In(Literal.True, List(Literal.True, - Literal.ofNull(new BooleanType())).asJava), true) - - // value not in list (with null in list) - testPredicate(new In(Literal.False, List(Literal.True, - Literal.ofNull(new BooleanType())).asJava), null) - - // non-null cases - testPredicate( new In(Literal.of(1), - (0 to 10).map{Literal.of}.asJava), true) - testPredicate( new In(Literal.of(100), - (0 to 10).map{Literal.of}.asJava), false) - testPredicate( new In(Literal.of(10), - (0 to 10).map{Literal.of}.asJava), true) - - // Here we test In specifically with the BigDecimal data type to make sure we cover - // the different cases with values and elements of varying precision and scales - testPredicate( - new In( - Literal.of(BigDecimalJ.valueOf(2).setScale(1)), - List( - Literal.of(BigDecimalJ.valueOf(1).setScale(1)), - Literal.of(BigDecimalJ.valueOf(2).setScale(1)), - Literal.of(BigDecimalJ.valueOf(3).setScale(1)), - Literal.of(BigDecimalJ.valueOf(4).setScale(1)), - Literal.of(BigDecimalJ.valueOf(5).setScale(1)) - ).asJava), true) - - testPredicate( - new In( - Literal.of(BigDecimalJ.valueOf(2).setScale(1)), - List( - Literal.of(BigDecimalJ.valueOf(1).setScale(2)), - Literal.of(BigDecimalJ.valueOf(2).setScale(2)), - Literal.of(BigDecimalJ.valueOf(3).setScale(2)), - Literal.of(BigDecimalJ.valueOf(4).setScale(2)), - Literal.of(BigDecimalJ.valueOf(5).setScale(2)) - ).asJava), true) - } - - private def testLiteral(literal: Literal, expectedResult: Any) = { - assert(Objects.equals(literal.eval(null), expectedResult)) - } - - test("Literal tests") { - // LITERAL tests - testLiteral(Literal.True, true) - testLiteral(Literal.False, false) - testLiteral(Literal.of(8.toByte), 8.toByte) - testLiteral(Literal.of(1.0), 1.0) - testLiteral(Literal.of(2.0F), 2.0F) - testLiteral(Literal.of(5), 5) - testLiteral(Literal.of(10L), 10L) - testLiteral(Literal.ofNull(new BooleanType()), null) - testLiteral(Literal.ofNull(new IntegerType()), null) - testLiteral(Literal.of(5.toShort), 5.toShort) - testLiteral(Literal.of("test"), "test") - val now = System.currentTimeMillis() - testLiteral( - Literal.of(new TimestampJ(now)), new TimestampJ(now)) - testLiteral(Literal.of(new DateJ(now)), new DateJ(now)) - testLiteral(Literal.of(new BigDecimalJ("0.1")), - new BigDecimalJ("0.1")) - assert(ArraysJ.equals( - Literal.of("test".getBytes()).eval(null).asInstanceOf[Array[Byte]], - "test".getBytes())) - - // Literal.ofNull(NullType) is prohibited - testException[IllegalArgumentException]( - Literal.ofNull(new NullType()), - "null is an invalid data type for Literal" - ) - - // Literal.ofNull(ArrayType) is prohibited - testException[IllegalArgumentException]( - Literal.ofNull(new ArrayType(new IntegerType(), true)), - "array is an invalid data type for Literal" - ) - - // Literal.ofNull(MapType) is prohibited - testException[IllegalArgumentException]( - Literal.ofNull(new MapType(new IntegerType(), new IntegerType(), true)), - "map is an invalid data type for Literal" - ) - - // Literal.ofNull(StructType) is prohibited - testException[IllegalArgumentException]( - Literal.ofNull(new StructType(Array())), - "struct is an invalid data type for Literal" - ) - } - - test("Column tests") { - def testColumn( - fieldName: String, - dataType: DataType, - record: RowRecord, - expectedResult: Any): Unit = { - assert(Objects.equals(new Column(fieldName, dataType).eval(record), expectedResult)) - } - - val schema = new StructType(Array( - new StructField("testInt", new IntegerType(), true), - new StructField("testLong", new LongType(), true), - new StructField("testByte", new ByteType(), true), - new StructField("testShort", new ShortType(), true), - new StructField("testBoolean", new BooleanType(), true), - new StructField("testFloat", new FloatType(), true), - new StructField("testDouble", new DoubleType(), true), - new StructField("testString", new StringType(), true), - new StructField("testBinary", new BinaryType(), true), - new StructField("testDecimal", DecimalType.USER_DEFAULT, true), - new StructField("testTimestamp", new TimestampType(), true), - new StructField("testDate", new DateType(), true))) - - val partRowRecord = new PartitionRowRecord(schema, - Map("testInt"->"1", - "testLong"->"10", - "testByte" ->"8", - "testShort" -> "100", - "testBoolean" -> "true", - "testFloat" -> "20.0", - "testDouble" -> "22.0", - "testString" -> "onetwothree", - "testBinary" -> "\u0001\u0005\u0008", - "testDecimal" -> "0.123", - "testTimestamp" -> (new TimestampJ(12345678)).toString, - "testDate" -> "1970-01-01")) - - testColumn("testInt", new IntegerType(), partRowRecord, 1) - testColumn("testLong", new LongType(), partRowRecord, 10L) - testColumn("testByte", new ByteType(), partRowRecord, 8.toByte) - testColumn("testShort", new ShortType(), partRowRecord, 100.toShort) - testColumn("testBoolean", new BooleanType(), partRowRecord, true) - testColumn("testFloat", new FloatType(), partRowRecord, 20.0F) - testColumn("testDouble", new DoubleType(), partRowRecord, 22.0) - testColumn("testString", new StringType(), partRowRecord, "onetwothree") - assert(Array(1.toByte, 5.toByte, 8.toByte) sameElements - (new Column("testBinary", new BinaryType())).eval(partRowRecord).asInstanceOf[Array[Byte]]) - testColumn("testDecimal", new DecimalType(4, 3), partRowRecord, new BigDecimalJ("0.123")) - testColumn("testTimestamp", new TimestampType(), partRowRecord, new TimestampJ(12345678)) - testColumn("testDate", new DateType(), partRowRecord, new DateJ(70, 0, 1)) - - testException[UnsupportedOperationException]( - new Column("testArray", new ArrayType(new BooleanType(), true)), - "The data type of column testArray is array. This is not supported yet") - testException[UnsupportedOperationException]( - new Column("testMap", new MapType(new StringType(), new StringType(), true)), - "The data type of column testMap is map. This is not supported yet") - testException[UnsupportedOperationException]( - new Column("testStruct", new StructType(Array(new StructField("test", new BooleanType())))), - "The data type of column testStruct is struct. This is not supported yet") - } - - test("PartitionRowRecord tests") { - def buildPartitionRowRecord( - dataType: DataType, - nullable: Boolean, - value: String, - name: String = "test"): PartitionRowRecord = { - new PartitionRowRecord( - new StructType(Array(new StructField(name, dataType, nullable))), - Map(name -> value)) - } - - val testPartitionRowRecord = buildPartitionRowRecord(new IntegerType(), nullable = true, "5") - assert(buildPartitionRowRecord(new IntegerType(), nullable = true, null).isNullAt("test")) - assert(!buildPartitionRowRecord(new IntegerType(), nullable = true, "5").isNullAt("test")) - // non-nullable field - assert(buildPartitionRowRecord(new IntegerType(), nullable = false, null).isNullAt("test")) - - assert(!testPartitionRowRecord.isNullAt("test")) - testException[IllegalArgumentException]( - testPartitionRowRecord.isNullAt("foo"), - "Field \"foo\" does not exist.") - - // primitive types can't be null - // for primitive type T: (DataType, getter: partitionRowRecord => T, value: String, value: T) - val primTypes = Seq( - (new IntegerType(), (x: PartitionRowRecord) => x.getInt("test"), "0", 0), - (new LongType(), (x: PartitionRowRecord) => x.getLong("test"), "0", 0L), - (new ByteType(), (x: PartitionRowRecord) => x.getByte("test"), "0", 0.toByte), - (new ShortType(), (x: PartitionRowRecord) => x.getShort("test"), "0", 0.toShort), - (new BooleanType(), (x: PartitionRowRecord) => x.getBoolean("test"), "true", true), - (new FloatType(), (x: PartitionRowRecord) => x.getFloat("test"), "0", 0.0F), - (new DoubleType(), (x: PartitionRowRecord) => x.getDouble("test"), "0.0", 0.0) - ) - - primTypes.foreach { case (dataType: DataType, f: (PartitionRowRecord => Any), s: String, v) => - assert(f(buildPartitionRowRecord(dataType, nullable = true, s)) == v) - testException[NullPointerException]( - f(buildPartitionRowRecord(dataType, nullable = true, null)), - s"Read a null value for field test which is a primitive type") - testException[ClassCastException]( - f(buildPartitionRowRecord(new StringType(), nullable = true, "test")), - s"The data type of field test is string. Cannot cast it to ${dataType.getTypeName}") - testException[IllegalArgumentException]( - f(buildPartitionRowRecord(dataType, nullable = true, s, "foo")), - "Field \"test\" does not exist.") - } - - val now = System.currentTimeMillis() - // non primitive types can be null ONLY when nullable (test both) - // for non-primitive type T: - // (DataType, getter: partitionRowRecord => T, value: String, value: T) - val nonPrimTypes = Seq( - (new StringType(), (x: PartitionRowRecord) => x.getString("test"), "foo", "foo"), - (DecimalType.USER_DEFAULT, (x: PartitionRowRecord) => x.getBigDecimal("test"), "0.01", - new BigDecimalJ("0.01")), - (new TimestampType(), (x: PartitionRowRecord) => x.getTimestamp("test"), - (new TimestampJ(now)).toString, new TimestampJ(now)), - (new DateType(), (x: PartitionRowRecord) => x.getDate("test"), "1970-01-01", - DateJ.valueOf("1970-01-01")) - ) - nonPrimTypes.foreach { - case (dataType: DataType, f: (PartitionRowRecord => Any), s: String, v: Any) => - assert(Objects.equals(f(buildPartitionRowRecord(dataType, nullable = true, s)), v)) - assert(f(buildPartitionRowRecord(dataType, nullable = true, null)) == null) - testException[NullPointerException]( - f(buildPartitionRowRecord(dataType, nullable = false, null)), - "Read a null value for field test, yet schema indicates that this field can't be null.") - testException[ClassCastException]( - f(buildPartitionRowRecord(new IntegerType(), nullable = true, "test")), - s"The data type of field test is integer. Cannot cast it to ${dataType.getTypeName}") - testException[IllegalArgumentException]( - f(buildPartitionRowRecord(dataType, nullable = true, s, "foo")), - "Field \"test\" does not exist.") - } - - assert(buildPartitionRowRecord(new BinaryType(), nullable = true, "") - .getBinary("test").isEmpty) - assert(buildPartitionRowRecord(new BinaryType(), nullable = true, "\u0001\u0002") - .getBinary("test") sameElements Array(1.toByte, 2.toByte)) - testException[NullPointerException]( - buildPartitionRowRecord(new BinaryType(), nullable = false, null).getBinary("test"), - "Read a null value for field test, yet schema indicates that this field can't be null.") - testException[ClassCastException]( - buildPartitionRowRecord(new IntegerType(), nullable = true, "test").getBinary("test"), - s"The data type of field test is integer. Cannot cast it to binary") - testException[IllegalArgumentException]( - buildPartitionRowRecord(new BinaryType, nullable = true, "", "foo").getBinary("test"), - "Field \"test\" does not exist.") - - testException[UnsupportedOperationException]( - testPartitionRowRecord.getRecord("test"), - "Struct is not a supported partition type.") - testException[UnsupportedOperationException]( - testPartitionRowRecord.getList("test"), - "Array is not a supported partition type.") - intercept[UnsupportedOperationException]( - testPartitionRowRecord.getMap("test"), - "Map is not a supported partition type.") - } - - // TODO: nested expression tree tests - - private def testPartitionFilter( - partitionSchema: StructType, - inputFiles: Seq[AddFile], - filter: Expression, - expectedMatchedFiles: Seq[AddFile]) = { - val matchedFiles = PartitionUtils.filterFileList(partitionSchema, inputFiles, filter) - assert(matchedFiles.length == expectedMatchedFiles.length) - assert(matchedFiles.forall(expectedMatchedFiles.contains(_))) - } - - test("basic partition filter") { - val schema = new StructType(Array( - new StructField("col1", new IntegerType()), - new StructField("col2", new IntegerType()))) - - val add00 = AddFile("1", Map("col1" -> "0", "col2" -> "0"), 0, 0, dataChange = true) - val add01 = AddFile("2", Map("col1" -> "0", "col2" -> "1"), 0, 0, dataChange = true) - val add02 = AddFile("2", Map("col1" -> "0", "col2" -> "2"), 0, 0, dataChange = true) - val add10 = AddFile("3", Map("col1" -> "1", "col2" -> "0"), 0, 0, dataChange = true) - val add11 = AddFile("4", Map("col1" -> "1", "col2" -> "1"), 0, 0, dataChange = true) - val add12 = AddFile("4", Map("col1" -> "1", "col2" -> "2"), 0, 0, dataChange = true) - val add20 = AddFile("4", Map("col1" -> "2", "col2" -> "0"), 0, 0, dataChange = true) - val add21 = AddFile("4", Map("col1" -> "2", "col2" -> "1"), 0, 0, dataChange = true) - val add22 = AddFile("4", Map("col1" -> "2", "col2" -> "2"), 0, 0, dataChange = true) - val inputFiles = Seq(add00, add01, add02, add10, add11, add12, add20, add21, add22) - - val f1Expr1 = new EqualTo(partitionSchema.column("col1"), Literal.of(0)) - val f1Expr2 = new EqualTo(partitionSchema.column("col2"), Literal.of(1)) - val f1 = new And(f1Expr1, f1Expr2) - - testPartitionFilter(partitionSchema, inputFiles, f1, add01 :: Nil) - - val f2Expr1 = new LessThan(partitionSchema.column("col1"), Literal.of(1)) - val f2Expr2 = new LessThan(partitionSchema.column("col2"), Literal.of(1)) - val f2 = new And(f2Expr1, f2Expr2) - testPartitionFilter(partitionSchema, inputFiles, f2, add00 :: Nil) - - val f3Expr1 = new EqualTo(partitionSchema.column("col1"), Literal.of(2)) - val f3Expr2 = new LessThan(partitionSchema.column("col2"), Literal.of(1)) - val f3 = new Or(f3Expr1, f3Expr2) - testPartitionFilter( - partitionSchema, inputFiles, f3, Seq(add20, add21, add22, add00, add10)) - - val inSet4 = (2 to 10).map(Literal.of).asJava - val f4 = new In(partitionSchema.column("col1"), inSet4) - testPartitionFilter(partitionSchema, inputFiles, f4, add20 :: add21 :: add22 :: Nil) - - val inSet5 = (100 to 110).map(Literal.of).asJava - val f5 = new In(partitionSchema.column("col1"), inSet5) - testPartitionFilter(partitionSchema, inputFiles, f5, Nil) - } - - test("not null partition filter") { - val add0Null = AddFile("1", Map("col1" -> "0", "col2" -> null), 0, 0, dataChange = true) - val addNull1 = AddFile("1", Map("col1" -> null, "col2" -> "1"), 0, 0, dataChange = true) - val inputFiles = Seq(add0Null, addNull1) - - val f1 = new IsNotNull(partitionSchema.column("col1")) - testPartitionFilter(partitionSchema, inputFiles, f1, add0Null :: Nil) - } - - test("Expr.references() and PredicateUtils.isPredicateMetadataOnly()") { - val dataExpr = new And( - new LessThan(dataSchema.column("col3"), Literal.of(5)), - new Or( - new EqualTo(dataSchema.column("col3"), dataSchema.column("col4")), - new EqualTo(dataSchema.column("col3"), dataSchema.column("col5")) - ) - ) - - assert(dataExpr.references().size() == 3) - - val partitionExpr = new EqualTo(partitionSchema.column("col1"), partitionSchema.column("col2")) - - assert( - !PartitionUtils.isPredicateMetadataOnly(dataExpr, partitionSchema.getFieldNames.toSeq)) - - assert( - PartitionUtils.isPredicateMetadataOnly(partitionExpr, partitionSchema.getFieldNames.toSeq)) - } - - test("expression content equality") { - // BinaryExpression - val equalTo = new EqualTo(partitionSchema.column("col1"), partitionSchema.column("col2")) - val equalToCopy = new EqualTo(partitionSchema.column("col1"), partitionSchema.column("col2")) - val equalTo2 = new EqualTo(dataSchema.column("col3"), Literal.of(44)) - assert(equalTo == equalToCopy) - assert(equalTo != equalTo2) - - // UnaryExpression - val not = new Not(new EqualTo(Literal.of(1), Literal.of(1))) - val notCopy = new Not(new EqualTo(Literal.of(1), Literal.of(1))) - val not2 = new Not(new EqualTo(Literal.of(45), dataSchema.column("col4"))) - assert(not == notCopy) - assert(not != not2) - - // LeafExpression - val col1 = partitionSchema.column("col1") - val col1Copy = partitionSchema.column("col1") - val col2 = partitionSchema.column("col2") - assert(col1 == col1Copy) - assert(col1 != col2) - } - - test("decimal literal creation") { - val dec52 = new BigDecimalJ("123.45") - val lit52 = Literal.of(dec52) - assert(lit52.dataType().equals(new DecimalType(5, 2))) - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/LogStoreProviderSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/LogStoreProviderSuite.scala deleted file mode 100644 index 7b1c9337d50..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/LogStoreProviderSuite.scala +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.Path -import org.scalatest.FunSuite - -import io.delta.standalone.exceptions.DeltaStandaloneException - -import io.delta.standalone.internal.sources.StandaloneHadoopConf -import io.delta.standalone.internal.storage.{DelegatingLogStore, LogStoreProvider} - -class LogStoreProviderSuite extends FunSuite { - - private def fakeSchemeWithNoDefault = "fake" - private val customLogStoreClassName = classOf[UserDefinedLogStore].getName - - private val sparkClassKey = "spark." + LogStoreProvider.logStoreClassConfKey - private val legacyClassKey = StandaloneHadoopConf.LEGACY_LOG_STORE_CLASS_KEY - private val normalClassKey = LogStoreProvider.logStoreClassConfKey - - private def sparkPrefixLogStoreSchemeConfKey(scheme: String) = - "spark." + LogStoreProvider.logStoreSchemeConfKey(scheme) - - private def newHadoopConf(confs: Seq[(String, String)]): Configuration = { - val hadoopConf = new Configuration() - confs.foreach{ case (key, value) => hadoopConf.set(key, value)} - hadoopConf - } - - private def testClassAndSchemeConfSet(scheme: String, classConf: String, schemeConf: String) - : Unit = { - - val schemeConfKeys = Seq(LogStoreProvider.logStoreSchemeConfKey(scheme), - sparkPrefixLogStoreSchemeConfKey(scheme)) - val classConfKeys = Seq(legacyClassKey, sparkClassKey, normalClassKey) - schemeConfKeys.foreach{ schemeKey => - classConfKeys.foreach { classKey => - val hadoopConf = newHadoopConf( - Seq((classKey, classConf), (schemeKey, schemeConf)) - ) - val e = intercept[IllegalArgumentException]( - LogStoreProvider.createLogStore(hadoopConf) - ) - assert(e.getMessage.contains( - s"(`$classKey`) and (`$schemeKey`) cannot be set at the same time" - )) - } - } - } - - test("class-conf = set, scheme has no default, scheme-conf = set") { - testClassAndSchemeConfSet(fakeSchemeWithNoDefault, customLogStoreClassName, - DelegatingLogStore.defaultAzureLogStoreClassName - ) - } - - test("class-conf = set, scheme has default, scheme-conf = set") { - testClassAndSchemeConfSet("s3a", customLogStoreClassName, - DelegatingLogStore.defaultAzureLogStoreClassName - ) - } - - test("normalizeHadoopConf - scheme conf keys") { - Seq( - fakeSchemeWithNoDefault, // scheme with no default - "s3a" // scheme with default - ).foreach { scheme => - - for (hadoopConf <- Seq( - // set only spark-prefixed key - newHadoopConf(Seq( - (sparkPrefixLogStoreSchemeConfKey(scheme), customLogStoreClassName) - )), - // set both spark-prefixed key and normalized key to same value - newHadoopConf(Seq( - (sparkPrefixLogStoreSchemeConfKey(scheme), customLogStoreClassName), - (LogStoreProvider.logStoreSchemeConfKey(scheme), customLogStoreClassName) - )) - )) { - val logStore = - LogStoreProvider.createLogStore(hadoopConf).asInstanceOf[DelegatingLogStore] - assert(logStore.getDelegate(new Path(s"$scheme://dummy")).getClass.getName == - customLogStoreClassName) - // normalized key is set - assert(hadoopConf.get(LogStoreProvider.logStoreSchemeConfKey(scheme)) == - customLogStoreClassName) - } - - // set both spark-prefixed key and normalized key to inconsistent values - val hadoopConf = newHadoopConf(Seq( - (sparkPrefixLogStoreSchemeConfKey(scheme), customLogStoreClassName), - (LogStoreProvider.logStoreSchemeConfKey(scheme), - "io.delta.standalone.internal.storage.AzureLogStore") - )) - val e = intercept[IllegalArgumentException]( - LogStoreProvider.createLogStore(hadoopConf) - ) - assert(e.getMessage.contains( - s"(${sparkPrefixLogStoreSchemeConfKey(scheme)} = $customLogStoreClassName, " + - s"${LogStoreProvider.logStoreSchemeConfKey(scheme)} = " + - s"io.delta.standalone.internal.storage.AzureLogStore) cannot be set to different " + - s"values. Please only set one of them, or set them to the same value." - )) - } - } - - test("normalizeHadoopConf - class conf keys") { - // combinations of legacy, spark-prefixed and normalized class conf set to same value - Seq(Some(legacyClassKey), None).foreach { legacyConf => - Seq(Some(sparkClassKey), None).foreach { sparkPrefixConf => - Seq(Some(normalClassKey), None).foreach { normalConf => - if (legacyConf.nonEmpty || sparkPrefixConf.nonEmpty || normalConf.nonEmpty) { - val hadoopConf = new Configuration() - legacyConf.foreach(hadoopConf.set(_, customLogStoreClassName)) - sparkPrefixConf.foreach(hadoopConf.set(_, customLogStoreClassName)) - normalConf.foreach(hadoopConf.set(_, customLogStoreClassName)) - - assert(LogStoreProvider.createLogStore(hadoopConf).getClass.getName == - customLogStoreClassName) - // normalized key is set - assert(hadoopConf.get(normalClassKey) == customLogStoreClassName) - } - } - } - } - - // combinations of legacy, spark-prefixed and normalized class conf set to inconsistent values - for ((key1, key2) <- Seq( - (legacyClassKey, sparkClassKey), - (normalClassKey, legacyClassKey), - (normalClassKey, sparkClassKey) - )) { - val hadoopConf = newHadoopConf(Seq( - (key1, customLogStoreClassName), - (key2, "io.delta.standalone.internal.storage.AzureLogStore") - )) - val e = intercept[IllegalArgumentException] { - LogStoreProvider.createLogStore((hadoopConf)) - } - assert( - e.getMessage.contains("cannot be set to different values. Please only set one of them, " + - "or set them to the same value.") - && e.getMessage.contains(s"$key1 = $customLogStoreClassName") - &&e.getMessage.contains(s"$key2 = io.delta.standalone.internal.storage.AzureLogStore") - - ) - } - } - - test("DelegatingLogStore is default") { - val hadoopConf = new Configuration() - assert(LogStoreProvider.createLogStore(hadoopConf).getClass.getName - == "io.delta.standalone.internal.storage.DelegatingLogStore") - } - - test("Set class Conf to class that doesn't extend LogStore") { - val hadoopConf = newHadoopConf( - Seq((LogStoreProvider.logStoreClassConfKey, "io.delta.standalone.DeltaLog"))) - val e = intercept[DeltaStandaloneException]( - LogStoreProvider.createLogStore(hadoopConf) - ) - assert(e.getMessage.contains( - "Can't instantiate a LogStore with classname io.delta.standalone.DeltaLog" - )) - } - - test("Set (deprecated) scala class with class Conf") { - val hadoopConf = newHadoopConf( - Seq((LogStoreProvider.logStoreClassConfKey, - "io.delta.standalone.internal.storage.AzureLogStore"))) - assert(LogStoreProvider.createLogStore(hadoopConf).getClass.getName - == "io.delta.standalone.internal.storage.AzureLogStore") - } - - test("Set delta-storage class with class Conf") { - val hadoopConf = newHadoopConf( - Seq((LogStoreProvider.logStoreClassConfKey, - "io.delta.storage.AzureLogStore"))) - assert(LogStoreProvider.createLogStore(hadoopConf).getClass.getName - == "io.delta.storage.AzureLogStore") - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/LogStoreSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/LogStoreSuite.scala deleted file mode 100644 index b1fd07e109c..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/LogStoreSuite.scala +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.io.File - -import scala.collection.JavaConverters._ - -import io.delta.storage.{CloseableIterator, LogStore} -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.{FileStatus, Path, RawLocalFileSystem} -import org.scalatest.FunSuite - -import io.delta.standalone.Operation -import io.delta.standalone.actions.{AddFile => AddFileJ, Metadata => MetadataJ} -import io.delta.standalone.types.{StringType, StructType} - -import io.delta.standalone.internal.sources.StandaloneHadoopConf -import io.delta.standalone.internal.storage.{AzureLogStore, HDFSLogStore, LocalLogStore, LogStoreProvider, S3SingleDriverLogStore} -import io.delta.standalone.internal.util.TestUtils._ - -abstract class LogStoreSuiteBase extends FunSuite with LogStoreProvider { - - def logStoreClassName: Option[String] - - def hadoopConf: Configuration = { - val conf = new Configuration() - if (logStoreClassName.isDefined) { - conf.set(StandaloneHadoopConf.LOG_STORE_CLASS_KEY, logStoreClassName.get) - } - conf - } - - /** - * Whether the log store being tested should use rename to write checkpoint or not. The following - * test is using this method to verify the behavior of `checkpoint`. - */ - protected def shouldUseRenameToWriteCheckpoint: Boolean - - test("instantiation through HadoopConf") { - val expectedClassName = logStoreClassName.getOrElse(LogStoreProvider.defaultLogStoreClass) - assert(createLogStore(hadoopConf).getClass.getName == expectedClassName) - } - - test("read / write") { - def assertNoLeakedCrcFiles(dir: File): Unit = { - // crc file should not be leaked when origin file doesn't exist. - // The implementation of Hadoop filesystem may filter out checksum file, so - // listing files from local filesystem. - val fileNames = dir.listFiles().toSeq.filter(p => p.isFile).map(p => p.getName) - val crcFiles = fileNames.filter(n => n.startsWith(".") && n.endsWith(".crc")) - val originFileNamesForExistingCrcFiles = crcFiles.map { name => - // remove first "." and last ".crc" - name.substring(1, name.length - 4) - } - - // Check all origin files exist for all crc files. - assert(originFileNamesForExistingCrcFiles.toSet.subsetOf(fileNames.toSet), - s"Some of origin files for crc files don't exist - crc files: $crcFiles / " + - s"expected origin files: $originFileNamesForExistingCrcFiles / actual files: $fileNames") - } - - withTempDir { dir => - import io.delta.standalone.internal.util.Implicits._ - - val store = createLogStore(hadoopConf) - - val deltas = Seq(0, 1).map(i => new File(dir, i.toString)).map(_.getCanonicalPath) - store.write(new Path(deltas.head), Iterator("zero", "none").asJava, false, hadoopConf) - store.write(new Path(deltas(1)), Iterator("one").asJava, false, hadoopConf) - - assert(store.read(new Path(deltas.head), hadoopConf).toArray sameElements - Array("zero", "none")) - assert(store.read(new Path(deltas(1)), hadoopConf).toArray sameElements Array("one")) - - assertNoLeakedCrcFiles(dir) - } - } - - test("detects conflict") { - withTempDir { dir => - val store = createLogStore(hadoopConf) - - val deltas = Seq(0, 1).map(i => new File(dir, i.toString)).map(_.getCanonicalPath) - store.write(new Path(deltas.head), Iterator("zero").asJava, false, hadoopConf) - store.write(new Path(deltas(1)), Iterator("one").asJava, false, hadoopConf) - - intercept[java.nio.file.FileAlreadyExistsException] { - store.write(new Path(deltas(1)), Iterator("uno").asJava, false, hadoopConf) - } - } - } - - test("listFrom") { - withTempDir { tempDir => - val logStore = createLogStore(hadoopConf) - val deltas = - Seq(0, 1, 2, 3, 4).map(i => new File(tempDir, i.toString)).map(_.toURI).map(new Path(_)) - logStore.write(deltas(1), Iterator("zero").asJava, false, hadoopConf) - logStore.write(deltas(2), Iterator("one").asJava, false, hadoopConf) - logStore.write(deltas(3), Iterator("two").asJava, false, hadoopConf) - - assert(logStore.listFrom(deltas.head, hadoopConf).asScala.map(_.getPath.getName) - .filterNot(_ == "_delta_log").toArray === Seq(1, 2, 3).map(_.toString)) - assert(logStore.listFrom(deltas(1), hadoopConf).asScala.map(_.getPath.getName) - .filterNot(_ == "_delta_log").toArray === Seq(1, 2, 3).map(_.toString)) - assert(logStore.listFrom(deltas(2), hadoopConf).asScala.map(_.getPath.getName) - .filterNot(_ == "_delta_log").toArray === Seq(2, 3).map(_.toString)) - assert(logStore.listFrom(deltas(3), hadoopConf).asScala.map(_.getPath.getName) - .filterNot(_ == "_delta_log").toArray === Seq(3).map(_.toString)) - assert(logStore.listFrom(deltas(4), hadoopConf).asScala.map(_.getPath.getName) - .filterNot(_ == "_delta_log").toArray === Nil) - } - } - - test("use isPartialWriteVisible to decide whether use rename") { - withTempDir { tempDir => - val conf = hadoopConf - conf.set("fs.file.impl", classOf[TrackingRenameFileSystem].getName) - conf.set("fs.file.impl.disable.cache", "true") - - val log = DeltaLogImpl.forTable(conf, tempDir.getCanonicalPath) - val addFile = AddFileJ.builder("/path", Map.empty[String, String].asJava, 100L, - System.currentTimeMillis(), true).build() - val metadata = MetadataJ - .builder() - .schema(new StructType().add("foo", new StringType())) - .build() - - log.startTransaction().commit((metadata :: addFile :: Nil).asJava, - new Operation(Operation.Name.MANUAL_UPDATE), "engineInfo") - - TrackingRenameFileSystem.numOfRename = 0 - - log.checkpoint() - - val expectedNumOfRename = if (shouldUseRenameToWriteCheckpoint) 1 else 0 - assert(TrackingRenameFileSystem.numOfRename === expectedNumOfRename) - } - } -} - -/** - * A file system allowing to track how many times `rename` is called. - * `TrackingRenameFileSystem.numOfRename` should be reset to 0 before starting to trace. - */ -class TrackingRenameFileSystem extends RawLocalFileSystem { - override def rename(src: Path, dst: Path): Boolean = { - TrackingRenameFileSystem.numOfRename += 1 - super.rename(src, dst) - } -} - -object TrackingRenameFileSystem { - @volatile var numOfRename = 0 -} - -class HDFSLogStoreSuite extends LogStoreSuiteBase { - override def logStoreClassName: Option[String] = Some(classOf[HDFSLogStore].getName) - override protected def shouldUseRenameToWriteCheckpoint: Boolean = true -} - -class AzureLogStoreSuite extends LogStoreSuiteBase { - override def logStoreClassName: Option[String] = Some(classOf[AzureLogStore].getName) - override protected def shouldUseRenameToWriteCheckpoint: Boolean = true -} - -class S3SingleDriverLogStoreSuite extends LogStoreSuiteBase { - override def logStoreClassName: Option[String] = Some(classOf[S3SingleDriverLogStore].getName) - override protected def shouldUseRenameToWriteCheckpoint: Boolean = false -} - -class LocalLogStoreSuite extends LogStoreSuiteBase { - override def logStoreClassName: Option[String] = Some(classOf[LocalLogStore].getName) - override protected def shouldUseRenameToWriteCheckpoint: Boolean = true -} - -/** - * Test not providing a LogStore classname, in which case [[LogStoreProvider]] will use - * the default value. - * - * This tests [[DelegatingLogStore]]. - */ -class DefaultLogStoreSuite extends LogStoreSuiteBase { - override def logStoreClassName: Option[String] = None - override protected def shouldUseRenameToWriteCheckpoint: Boolean = true -} - -class PublicHDFSLogStoreSuite extends LogStoreSuiteBase { - override def logStoreClassName: Option[String] = - Some(classOf[io.delta.storage.HDFSLogStore].getName) - override protected def shouldUseRenameToWriteCheckpoint: Boolean = true -} - -class PublicS3SingleDriverLogStoreSuite extends LogStoreSuiteBase { - override def logStoreClassName: Option[String] = - Some(classOf[io.delta.storage.S3SingleDriverLogStore].getName) - override protected def shouldUseRenameToWriteCheckpoint: Boolean = false -} - -class PublicAzureLogStoreSuite extends LogStoreSuiteBase { - override def logStoreClassName: Option[String] = - Some(classOf[io.delta.storage.AzureLogStore].getName) - override protected def shouldUseRenameToWriteCheckpoint: Boolean = true -} - -class PublicLocalLogStoreSuite extends LogStoreSuiteBase { - override def logStoreClassName: Option[String] = - Some(classOf[io.delta.storage.LocalLogStore].getName) - override protected def shouldUseRenameToWriteCheckpoint: Boolean = true -} - -class PublicGCSLogStoreSuite extends LogStoreSuiteBase { - override def logStoreClassName: Option[String] = - Some(classOf[io.delta.storage.GCSLogStore].getName) - override protected def shouldUseRenameToWriteCheckpoint: Boolean = false -} - -/** - * Test having the user provide their own LogStore. - */ -class UserDefinedLogStoreSuite extends LogStoreSuiteBase { - override def logStoreClassName: Option[String] = Some(classOf[UserDefinedLogStore].getName) - - // In [[UserDefinedLogStore]], we purposefully set isPartialWriteVisible to false, so this - // should be false as well - override protected def shouldUseRenameToWriteCheckpoint: Boolean = false -} - -/** - * Sample user-defined log store implementing [[LogStore]]. - */ -class UserDefinedLogStore(override val initHadoopConf: Configuration) - extends LogStore(initHadoopConf) { - - private val logStoreInternal = new HDFSLogStore(initHadoopConf) - - override def read(path: Path, hadoopConf: Configuration): CloseableIterator[String] = { - logStoreInternal.read(path, hadoopConf) - } - - override def write( - path: Path, - actions: java.util.Iterator[String], - overwrite: java.lang.Boolean, - hadoopConf: Configuration): Unit = { - logStoreInternal.write(path, actions, overwrite, hadoopConf) - } - - override def listFrom(path: Path, hadoopConf: Configuration): java.util.Iterator[FileStatus] = { - logStoreInternal.listFrom(path, hadoopConf) - } - - override def resolvePathOnPhysicalStorage(path: Path, hadoopConf: Configuration): Path = { - logStoreInternal.resolvePathOnPhysicalStorage(path, hadoopConf) - } - - override def isPartialWriteVisible(path: Path, hadoopConf: Configuration): java.lang.Boolean = { - // mockImpl.isPartialWriteVisible is true, but let's add some test diversity for better branch - // coverage and return false instead - false - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionLegacySuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionLegacySuite.scala deleted file mode 100644 index 7e64ecd8d5f..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionLegacySuite.scala +++ /dev/null @@ -1,775 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.util.Collections - -import scala.collection.JavaConverters._ -import scala.reflect.ClassTag - -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.Path -import org.scalatest.FunSuite - -import io.delta.standalone.{DeltaLog, NAME, Operation, VERSION} -import io.delta.standalone.actions.{AddFile => AddFileJ, CommitInfo => CommitInfoJ, Metadata => MetadataJ, Protocol => ProtocolJ, RemoveFile => RemoveFileJ} -import io.delta.standalone.exceptions.{ConcurrentAppendException, ConcurrentDeleteDeleteException, ConcurrentDeleteReadException, ConcurrentTransactionException, MetadataChangedException, ProtocolChangedException} -import io.delta.standalone.expressions.{EqualTo, Literal} -import io.delta.standalone.types._ - -import io.delta.standalone.internal.actions._ -import io.delta.standalone.internal.exception.DeltaErrors -import io.delta.standalone.internal.util.{ConversionUtils, SchemaUtils} -import io.delta.standalone.internal.util.TestUtils._ - -class OptimisticTransactionLegacySuite extends FunSuite { - val metadataJ = MetadataJ.builder().schema(new StructType().add("part", new StringType())).build() - val metadata = ConversionUtils.convertMetadataJ(metadataJ) - - val metadataJ_2 = MetadataJ.builder().schema(new StructType().add("y", new StringType())).build() - val metadata_2 = ConversionUtils.convertMetadataJ(metadataJ_2) - - val engineInfo = "test-engine-info" - val manualUpdate = new Operation(Operation.Name.MANUAL_UPDATE) - - val A_P1 = "part=1/a" - val B_P1 = "part=1/b" - val C_P1 = "part=1/c" - val C_P2 = "part=2/c" - val D_P2 = "part=2/d" - val E_P3 = "part=3/e" - val F_P3 = "part=3/f" - val G_P4 = "part=4/g" - - private val addA_P1 = AddFile(A_P1, Map("part" -> "1"), 1, 1, dataChange = true) - private val addB_P1 = AddFile(B_P1, Map("part" -> "1"), 1, 1, dataChange = true) - private val addC_P1 = AddFile(C_P1, Map("part" -> "1"), 1, 1, dataChange = true) - private val addC_P2 = AddFile(C_P2, Map("part" -> "2"), 1, 1, dataChange = true) - private val addD_P2 = AddFile(D_P2, Map("part" -> "2"), 1, 1, dataChange = true) - private val addE_P3 = AddFile(E_P3, Map("part" -> "3"), 1, 1, dataChange = true) - private val addF_P3 = AddFile(F_P3, Map("part" -> "3"), 1, 1, dataChange = true) - - def withLog( - actions: Seq[Action], - partitionCols: Seq[String] = "part" :: Nil)( - test: DeltaLog => Unit): Unit = { - val schemaFields = partitionCols.map { p => new StructField(p, new StringType()) }.toArray - val schema = new StructType(schemaFields).add("non_part_col", new StringType()) - val metadata = Metadata(partitionColumns = partitionCols, schemaString = schema.toJson) - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - log.startTransaction().commit(metadata :: Nil, manualUpdate, engineInfo) - log.startTransaction().commit(actions, manualUpdate, engineInfo) - - test(log) - } - } - - /** - * @tparam T expected exception type - */ - def testMetadata[T <: Throwable : ClassTag]( - metadata: Metadata, - expectedExceptionMessageSubStr: String): Unit = { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val e1 = intercept[T] { - log.startTransaction().commit(metadata :: Nil, manualUpdate, engineInfo) - } - assert(e1.getMessage.contains(expectedExceptionMessageSubStr)) - - val e2 = intercept[T] { - log.startTransaction().updateMetadata(ConversionUtils.convertMetadata(metadata)) - } - assert(e2.getMessage.contains(expectedExceptionMessageSubStr)) - } - } - - test("basic commit") { - withLog(addA_P1 :: addB_P1 :: Nil) { log => - log.startTransaction().commit(addA_P1.remove :: Nil, manualUpdate, engineInfo) - - // [...] is what is automatically added by OptimisticTransaction - // 0 -> metadata [CommitInfo, Protocol] - // 1 -> addA_P1, addB_P1 [CommitInfo] - // 2 -> removeA_P1 [CommitInfo] - val versionLogs = log.getChanges(0, true).asScala.toList - - assert(versionLogs(0).getActions.asScala.count(_.isInstanceOf[MetadataJ]) == 1) - assert(versionLogs(0).getActions.asScala.count(_.isInstanceOf[CommitInfoJ]) == 1) - assert(versionLogs(0).getActions.asScala.count(_.isInstanceOf[ProtocolJ]) == 1) - - assert(versionLogs(1).getActions.asScala.count(_.isInstanceOf[AddFileJ]) == 2) - assert(versionLogs(1).getActions.asScala.count(_.isInstanceOf[CommitInfoJ]) == 1) - - assert(versionLogs(2).getActions.asScala.count(_.isInstanceOf[RemoveFileJ]) == 1) - assert(versionLogs(2).getActions.asScala.count(_.isInstanceOf[CommitInfoJ]) == 1) - } - } - - test("basic checkpoint") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - (1 to 15).foreach { i => - val meta = if (i == 1) metadata :: Nil else Nil - val txn = log.startTransaction() - val file = AddFile(i.toString, Map.empty, 1, 1, dataChange = true) :: Nil - val delete: Seq[Action] = if (i > 1) { - RemoveFile((i - 1).toString, Some(System.currentTimeMillis()), true) :: Nil - } else { - Nil - } - txn.commit(meta ++ delete ++ file, manualUpdate, engineInfo) - } - - val log2 = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - assert(log2.snapshot.getVersion == 14) - assert(log2.snapshot.getAllFiles.size == 1) - } - } - - /////////////////////////////////////////////////////////////////////////// - // prepareCommit() tests - /////////////////////////////////////////////////////////////////////////// - - test("committing twice in the same transaction should fail") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val txn = log.startTransaction() - txn.commit(metadata :: Nil, manualUpdate, engineInfo) - val e = intercept[AssertionError] { - txn.commit(Iterable().asJava, manualUpdate, engineInfo) - } - assert(e.getMessage.contains("Transaction already committed.")) - } - } - - test("user cannot commit their own CommitInfo") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - log.startTransaction().commit(metadata :: Nil, manualUpdate, engineInfo) - val e = intercept[AssertionError] { - log.startTransaction().commit(CommitInfo.empty() :: Nil, manualUpdate, engineInfo) - } - assert(e.getMessage.contains("Cannot commit a custom CommitInfo in a transaction.")) - } - } - - test("commits shouldn't have more than one unique Metadata") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val txn = log.startTransaction() - val e = intercept[AssertionError] { - txn.commit(metadata :: metadata_2 :: Nil, manualUpdate, engineInfo) - } - assert(e.getMessage.contains("Cannot change the metadata more than once in a transaction.")) - } - } - - test("can't commit a second different Metadata if used updateMetadata") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val txn = log.startTransaction() - txn.updateMetadata(metadataJ) - val e = intercept[AssertionError] { - txn.commit(metadata_2 :: Nil, manualUpdate, engineInfo) - } - assert(e.getMessage.contains("Cannot change the metadata more than once in a transaction.")) - } - } - - test("can commit the same Metadata as used for updateMetadata ") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val txn = log.startTransaction() - txn.updateMetadata(metadataJ) - val result = txn.commit( - (metadataJ.copyBuilder().build() :: Nil).asJava, - manualUpdate, - engineInfo) - assert(result.getVersion == 0) - } - } - - // DeltaLog::ensureLogDirectoryExists - test("transaction should throw if it cannot read log directory during first commit") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - dir.setReadOnly() - - val txn = log.startTransaction() - val e = intercept[java.io.IOException] { - txn.commit(metadata :: Nil, manualUpdate, engineInfo) - } - - val logPath = new Path(log.getPath, "_delta_log") - assert(e.getMessage == s"Cannot create ${logPath.toString}") - } - } - - test("initial commit without metadata should fail") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val txn = log.startTransaction() - val e = intercept[IllegalStateException] { - txn.commit(Iterable().asJava, manualUpdate, engineInfo) - } - assert(e.getMessage == DeltaErrors.metadataAbsentException().getMessage) - } - } - - test("AddFile with different partition schema compared to metadata should fail") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - - // Note that Metadata() has no partition schema specified and addA_P1 does - log.startTransaction().commit(metadata :: Nil, manualUpdate, engineInfo) - val e = intercept[IllegalStateException] { - log.startTransaction().commit(addA_P1 :: Nil, manualUpdate, engineInfo) - } - assert(e.getMessage.contains("The AddFile contains partitioning schema different from the " + - "table's partitioning schema")) - } - } - - test("Can't create table with invalid protocol version") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - - Seq(Protocol(1, 3), Protocol(1, 1), Protocol(2, 2)).foreach { protocol => - val e = intercept[AssertionError] { - log.startTransaction().commit(metadata :: protocol :: Nil, manualUpdate, engineInfo) - } - assert(e.getMessage.contains("Invalid Protocol")) - } - } - } - - test("can't change protocol to invalid version") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - log.startTransaction().commit(metadata :: Protocol() :: Nil, manualUpdate, engineInfo) - - Seq(Protocol(1, 3), Protocol(1, 1), Protocol(2, 2)).foreach { protocol => - val e = intercept[AssertionError] { - log.startTransaction().commit(protocol :: Nil, manualUpdate, engineInfo) - } - assert(e.getMessage.contains("Invalid Protocol")) - } - } - } - - test("Removing from an append-only table") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val _metadata = metadata.copy(configuration = Map(DeltaConfigs.IS_APPEND_ONLY.key -> "true")) - - log.startTransaction().commit(_metadata :: Nil, manualUpdate, engineInfo) - - val removeWithDataChange = addA_P1.remove.copy(dataChange = true) - val e = intercept[UnsupportedOperationException] { - log.startTransaction().commit(removeWithDataChange :: Nil, manualUpdate, engineInfo) - } - assert(e.getMessage.contains("This table is configured to only allow appends")) - - val removeWithoutDataChange = addA_P1.remove.copy(dataChange = false) - log.startTransaction().commit(removeWithoutDataChange :: Nil, manualUpdate, engineInfo) - } - } - - /////////////////////////////////////////////////////////////////////////// - // updateMetadata() tests - /////////////////////////////////////////////////////////////////////////// - - test("initial commit with multiple metadata actions should fail") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val txn = log.startTransaction() - txn.updateMetadata(metadataJ) - val e = intercept[AssertionError] { - txn.updateMetadata(metadataJ_2) - } - - assert(e.getMessage.contains("Cannot change the metadata more than once in a transaction.")) - } - } - - test("Protocol Action should be automatically added to transaction for new table") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - log.startTransaction().commit(metadata :: Nil, manualUpdate, engineInfo) - assert(log.getChanges(0, true).asScala.next().getActions.contains(new ProtocolJ(1, 2))) - } - } - - test("updateMetadata fails for metadata with Protocol configuration properties") { - // Note: These Protocol properties are not currently exposed to the user. However, they - // might be in the future, and nothing is stopping the user now from seeing these - // properties in Delta OSS and adding them to the config map here. - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val txn = log.startTransaction() - val metadata = Metadata(configuration = Map( - Protocol.MIN_READER_VERSION_PROP -> "1", - Protocol.MIN_WRITER_VERSION_PROP -> "2" - )) - - val e = intercept[AssertionError] { - txn.updateMetadata(ConversionUtils.convertMetadata(metadata)) - } - assert(e.getMessage.contains(s"Should not have the protocol version " + - s"(${Protocol.MIN_READER_VERSION_PROP}) as part of table properties")) - } - } - - test("commit new metadata with Protocol properties should fail") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - log.startTransaction().commit(metadata :: Nil, manualUpdate, engineInfo) - val newMetadata = Metadata(configuration = Map( - Protocol.MIN_READER_VERSION_PROP -> "1", - Protocol.MIN_WRITER_VERSION_PROP -> "2" - )) - - val e = intercept[AssertionError] { - log.startTransaction().commit(newMetadata:: Nil, manualUpdate, engineInfo) - } - assert(e.getMessage.contains(s"Should not have the protocol version " + - s"(${Protocol.MIN_READER_VERSION_PROP}) as part of table properties")) - } - } - - test("unenforceable not null constraints") { - val validSchema = new StructType(Array( - new StructField( - "col1", - new MapType(new ArrayType(new StringType(), true), new IntegerType(), true), - true - ), - new StructField( - "col2", - new MapType(new IntegerType(), new ArrayType(new StringType(), true), true), - true - ), - new StructField( - "col3", - new ArrayType(new MapType(new StringType(), new IntegerType(), true), - true) - ) - )) - - SchemaUtils.checkUnenforceableNotNullConstraints(validSchema) // should not throw - - // case 1: not null within array - val inValidSchema1 = new StructType( - Array( - new StructField( - "arr", - new ArrayType( - new StructType( - Array( - new StructField("name", new StringType(), true), - new StructField("mailbox", new StringType(), false) - ) - ), - false // arr (ArrayType) containsNull - ) - ) - ) - ) - - val e1 = intercept[RuntimeException] { - SchemaUtils.checkUnenforceableNotNullConstraints(inValidSchema1) - }.getMessage - - assert(e1.contains("The element type of the field arr contains a NOT NULL constraint.")) - - // case 2: null within map key - val inValidSchema2 = new StructType( - Array( - new StructField( - "m", - new MapType( - new StructType( // m.key - Array( - new StructField("name", new StringType(), true), - new StructField("mailbox", new StringType(), false) - ) - ), - new IntegerType(), // m.value - false // m (MapType) valueContainsNull - ) - ) - ) - ) - - val e2 = intercept[RuntimeException] { - SchemaUtils.checkUnenforceableNotNullConstraints(inValidSchema2) - }.getMessage - - assert(e2.contains("The key type of the field m contains a NOT NULL constraint.")) - - // case 3: null within map key - val inValidSchema3 = new StructType( - Array( - new StructField( - "m", - new MapType( - new IntegerType(), // m.key - new StructType( // m.value - Array( - new StructField("name", new StringType(), true), - new StructField("mailbox", new StringType(), false) - ) - ), - false // m (MapType) valueContainsNull - ) - ) - ) - ) - - val e3 = intercept[RuntimeException] { - SchemaUtils.checkUnenforceableNotNullConstraints(inValidSchema3) - }.getMessage - - assert(e3.contains("The value type of the field m contains a NOT NULL constraint.")) - - // case 4: not null within nested array - val inValidSchema4 = new StructType( - Array( - new StructField( - "s", - new StructType( - Array( - new StructField("n", new IntegerType, false), - new StructField( - "arr", - new ArrayType( - new StructType( - Array( - new StructField("name", new StringType(), true), - new StructField("mailbox", new StringType(), false) - ) - ), - true // arr (ArrayType) containsNull - ), - false // arr (StructField) nullable - ) - ) - ), - true // s (StructField) nullable - ) - ) - ) - - val e4 = intercept[RuntimeException] { - SchemaUtils.checkUnenforceableNotNullConstraints(inValidSchema4) - }.getMessage - - assert(e4.contains("The element type of the field s.arr contains a NOT NULL constraint.")) - } - - test("updateMetadata withGlobalConfigDefaults") { - withTempDir { dir => - // note that the default for logRetentionDuration is 2592000000 - val hadoopConf = new Configuration() - hadoopConf.set( - DeltaConfigs.hadoopConfPrefix + DeltaConfigs.LOG_RETENTION.key.stripPrefix("delta."), - "1000 milliseconds") - val _metadata = metadata.copy( - configuration = Map(DeltaConfigs.LOG_RETENTION.key -> "2000 millisecond")) - - val log = DeltaLogImpl.forTable(hadoopConf, dir.getCanonicalPath) - log.startTransaction().commit(_metadata :: Nil, manualUpdate, engineInfo) - - assert(log.deltaRetentionMillis == 2000) - } - } - - /////////////////////////////////////////////////////////////////////////// - // verifyNewMetadata() tests - /////////////////////////////////////////////////////////////////////////// - - test("can't have duplicate column names") { - val schema = new StructType(Array( - new StructField("col1", new IntegerType(), true), - new StructField("col1", new StringType(), true) - )) - testMetadata[RuntimeException](Metadata(schemaString = schema.toJson), - "Found duplicate column(s)") - } - - test("can't have duplicate column names - case insensitive") { - val schema = new StructType(Array( - new StructField("col1", new IntegerType(), true), - new StructField("COL1", new StringType(), true) - )) - testMetadata[RuntimeException](Metadata(schemaString = schema.toJson), - "Found duplicate column(s)") - } - - test("column names (both data and partition) must be acceptable by parquet") { - val schema = new StructType(Array(new StructField("bad;column,name", new IntegerType(), true))) - - // test DATA columns - testMetadata[RuntimeException](Metadata(schemaString = schema.toJson), - """Attribute name "bad;column,name" contains invalid character(s)""") - - // test PARTITION columns - testMetadata[RuntimeException](Metadata(partitionColumns = "bad;column,name" :: Nil), - "Found partition columns having invalid character(s)") - } - - /////////////////////////////////////////////////////////////////////////// - // commit() tests - /////////////////////////////////////////////////////////////////////////// - - test("CommitInfo operation and engineInfo is persisted to the delta log correctly") { - withTempDir { dir => - val opParams = Collections.singletonMap(Operation.Metrics.numAddedFiles, "0") - val op = new Operation(Operation.Name.MANUAL_UPDATE, opParams) - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - log.startTransaction().commit(metadata :: Nil, op, "Foo Connector/1.1.0") - - val log2 = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val commitInfo = log2.getCommitInfoAt(0) - assert(commitInfo.getEngineInfo.isPresent) - assert(commitInfo.getEngineInfo.get() == - s"Foo-Connector/1.1.0 ${NAME.replaceAll("\\s", "-")}/$VERSION") - assert(commitInfo.getOperation == op.getName.toString) - assert(commitInfo.getOperationParameters.asScala == Map("numAddedFiles" -> "0")) - } - } - - test("CommitInfo isBlindAppend is correctly set") { - withTempDir { dir => - def verifyIsBlindAppend(version: Int, expected: Boolean): Unit = { - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - assert(log.getCommitInfoAt(version).getIsBlindAppend.get() == expected) - } - - val add = AddFile("test", Map.empty, 1, 1, dataChange = false) - - val log0 = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - log0.startTransaction().commit(metadata :: add :: Nil, manualUpdate, engineInfo) - verifyIsBlindAppend(0, expected = true) - - val log1 = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - log1.startTransaction().commit(add.remove :: Nil, manualUpdate, engineInfo) - verifyIsBlindAppend(1, expected = false) - - val log2 = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val txn2 = log2.startTransaction() - txn2.markFilesAsRead(Literal.True) - txn2.commit(add :: Nil, manualUpdate, engineInfo) - verifyIsBlindAppend(2, expected = false) - } - } - - /////////////////////////////////////////////////////////////////////////// - // checkForConflicts() tests - /////////////////////////////////////////////////////////////////////////// - - private def setDataChangeFalse(fileActions: Seq[FileAction]): Seq[FileAction] = { - fileActions.map { - case a: AddFile => a.copy(dataChange = false) - case r: RemoveFile => r.copy(dataChange = false) - case cdc: AddCDCFile => cdc // change files are always dataChange = false - } - } - - ////////////////////////////////// - // protocolChangedException tests - ////////////////////////////////// - - test("concurrent protocol update should fail") { - withLog(Nil) { log => - val tx1 = log.startTransaction() - val tx2 = log.startTransaction() - tx2.commit(Protocol(1, 2) :: Nil, manualUpdate, engineInfo) - - assertThrows[ProtocolChangedException] { - tx1.commit(Protocol(1, 2) :: Nil, manualUpdate, engineInfo) - } - } - } - - ////////////////////////////////// - // metadataChangedException tests - ////////////////////////////////// - - test("concurrent metadata update should fail") { - Seq( - (metadataJ, metadataJ), // using exact same metadata - (metadataJ, metadataJ_2) // using a metadata with a different schema - ).foreach { case (m1, m2) => - withLog(actions = Nil, partitionCols = Nil) { log => - val tx1 = log.startTransaction() - - val tx2 = log.startTransaction() - tx2.updateMetadata(m1) - tx2.commit(Iterable().asJava, manualUpdate, engineInfo) - - assertThrows[MetadataChangedException] { - tx1.updateMetadata(m2) - tx1.commit(Iterable().asJava, manualUpdate, engineInfo) - } - } - } - } - - ////////////////////////////////// - // concurrentAppend tests - ////////////////////////////////// - - test("block concurrent commit when read partition was appended to by concurrent write") { - withLog(addA_P1 :: addD_P2 :: addE_P3 :: Nil) { log => - val schema = log.update().getMetadata.getSchema - val tx1 = log.startTransaction() - // TX1 reads only P1 - val tx1Read = tx1.markFilesAsRead(new EqualTo(schema.column("part"), Literal.of("1"))) - assert(tx1Read.getFiles.asScala.toSeq.map(_.getPath) == A_P1 :: Nil) - - val tx2 = log.startTransaction() - tx2.markFilesAsRead(Literal.True) - // TX2 modifies only P1 - tx2.commit(addB_P1 :: Nil, manualUpdate, engineInfo) - - intercept[ConcurrentAppendException] { - // P1 was modified - tx1.commit(addC_P2 :: addE_P3 :: Nil, manualUpdate, engineInfo) - } - } - } - - test("block concurrent commit on full table scan") { - withLog(addA_P1 :: addD_P2 :: Nil) { log => - val schema = log.update().getMetadata.getSchema - val tx1 = log.startTransaction() - // TX1 full table scan - tx1.markFilesAsRead(Literal.True) - tx1.markFilesAsRead(new EqualTo(schema.column("part"), Literal.of("1"))) - - val tx2 = log.startTransaction() - tx2.markFilesAsRead(Literal.True) - tx2.commit(addC_P2 :: addD_P2.remove :: Nil, manualUpdate, engineInfo) - - intercept[ConcurrentAppendException] { - tx1.commit(addE_P3 :: addF_P3 :: Nil, manualUpdate, engineInfo) - } - } - } - - test("no data change: allow data rearrange when new files concurrently added") { - // This tests the case when isolationLevel == SnapshotIsolation - withLog(addA_P1 :: addB_P1 :: Nil) { log => - val tx1 = log.startTransaction() - tx1.markFilesAsRead(Literal.True) - - val tx2 = log.startTransaction() - tx1.markFilesAsRead(Literal.True) - tx2.commit(addE_P3 :: Nil, manualUpdate, engineInfo) - - // tx1 rearranges files (dataChange = false) - tx1.commit( - setDataChangeFalse(addA_P1.remove :: addB_P1.remove :: addC_P1 :: Nil), - manualUpdate, engineInfo) - - assert(log.update().getAllFiles.asScala.map(_.getPath).sorted == C_P1 :: E_P3 :: Nil) - } - } - - ////////////////////////////////// - // concurrentDeleteRead tests - ////////////////////////////////// - - test("block concurrent commit on read & delete conflicting partitions") { - // txn.readFiles will be non-empty, so this covers the first ConcurrentDeleteReadException - // case in checkForDeletedFilesAgainstCurrentTxnReadFiles - withLog(addA_P1 :: addB_P1 :: Nil) { log => - val schema = log.update().getMetadata.getSchema - val tx1 = log.startTransaction() - // read P1 - tx1.markFilesAsRead(new EqualTo(schema.column("part"), Literal.of("1"))) - - // tx2 commits before tx1 - val tx2 = log.startTransaction() - tx2.markFilesAsRead(Literal.True) - tx2.commit(addA_P1.remove :: Nil, manualUpdate, engineInfo) - - intercept[ConcurrentDeleteReadException] { - // P1 read by TX1 was removed by TX2 - tx1.commit(addE_P3 :: Nil, manualUpdate, engineInfo) - } - } - } - - test("readWholeTable should block concurrent delete") { - // txn.readFiles will be empty, so this covers the second ConcurrentDeleteReadException - // case in checkForDeletedFilesAgainstCurrentTxnReadFiles - withLog(addA_P1 :: Nil) { log => - val tx1 = log.startTransaction() - tx1.readWholeTable() - - // tx2 removes file - val tx2 = log.startTransaction() - tx2.commit(addA_P1.remove :: Nil, manualUpdate, engineInfo) - - intercept[ConcurrentDeleteReadException] { - // tx1 reads the whole table but tx2 removes files before tx1 commits - tx1.commit(addB_P1 :: Nil, manualUpdate, engineInfo) - } - } - } - - ////////////////////////////////// - // concurrentDeleteDelete tests - ////////////////////////////////// - - test("block commit with concurrent removes on same file") { - withLog(addA_P1 :: Nil) { log => - val tx1 = log.startTransaction() - - // tx2 removes file - val tx2 = log.startTransaction() - tx2.commit(addA_P1.remove :: Nil, manualUpdate, engineInfo) - - intercept[ConcurrentDeleteDeleteException] { - // tx1 tries to remove the same file - tx1.commit(addA_P1.remove :: Nil, manualUpdate, engineInfo) - } - } - } - - ////////////////////////////////// - // concurrentTransaction tests - ////////////////////////////////// - - test("block concurrent set-txns with the same app id") { - withLog(Nil) { log => - val tx1 = log.startTransaction() - tx1.txnVersion("t1") - - val winningTxn = log.startTransaction() - winningTxn.commit(SetTransaction("t1", 1, Some(1234L)) :: Nil, manualUpdate, engineInfo) - - intercept[ConcurrentTransactionException] { - tx1.commit(Iterable().asJava, manualUpdate, engineInfo) - } - } - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionSuite.scala deleted file mode 100644 index 9e485ca3b5c..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionSuite.scala +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.util.Collections - -import scala.collection.JavaConverters._ - -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.Path - -import io.delta.standalone.DeltaLog -import io.delta.standalone.actions.{Action => ActionJ, AddFile => AddFileJ, CommitInfo, Metadata => MetadataJ, Protocol, SetTransaction => SetTransactionJ} -import io.delta.standalone.types.{IntegerType, StringType, StructField, StructType} - -import io.delta.standalone.internal.actions.AddFile -import io.delta.standalone.internal.sources.StandaloneHadoopConf -import io.delta.standalone.internal.util.TestUtils._ - - -class OptimisticTransactionSuite extends OptimisticTransactionSuiteBase { - - /////////////////////////////////////////////////////////////////////////// - // Allowed concurrent actions - /////////////////////////////////////////////////////////////////////////// - - check( - "append / append", - conflicts = false, - reads = Seq(t => t.metadata()), - concurrentWrites = Seq(addA), - actions = Seq(addB)) - - check( - "disjoint txns", - conflicts = false, - reads = Seq(t => t.txnVersion("t1")), - concurrentWrites = Seq( - new SetTransactionJ("t2", 0, java.util.Optional.of(1234L))), - actions = Nil) - - check( - "disjoint delete / read", - conflicts = false, - setup = Seq(metadata_partX, addA_partX2), - reads = Seq(t => t.markFilesAsRead(colXEq1Filter)), - concurrentWrites = Seq(removeA), - actions = Seq() - ) - - check( - "disjoint add / read", - conflicts = false, - setup = Seq(metadata_partX), - reads = Seq(t => t.markFilesAsRead(colXEq1Filter)), - concurrentWrites = Seq(addA_partX2), - actions = Seq() - ) - - check( - "add / read + no write", // no write = no real conflicting change even though data was added - conflicts = false, // so this should not conflict - setup = Seq(metadata_partX), - reads = Seq(t => t.markFilesAsRead(colXEq1Filter)), - concurrentWrites = Seq(addA_partX1), - actions = Seq()) - - /////////////////////////////////////////////////////////////////////////// - // Disallowed concurrent actions - /////////////////////////////////////////////////////////////////////////// - - check( - "delete / delete", - conflicts = true, - reads = Nil, - concurrentWrites = Seq(removeA), - actions = Seq(removeA_time5) - ) - - check( - "add / read + write", - conflicts = true, - setup = Seq(metadata_partX), - reads = Seq(t => t.markFilesAsRead(colXEq1Filter)), - concurrentWrites = Seq(addA_partX1), - actions = Seq(addB_partX1), - // commit info should show operation as "Manual Update", because that's the operation used by - // the harness - errorMessageHint = Some("[x=1]" :: "Manual Update" :: Nil)) - - check( - "delete / read", - conflicts = true, - setup = Seq(metadata_partX, addA_partX1), - reads = Seq(t => t.markFilesAsRead(colXEq1Filter)), - concurrentWrites = Seq(removeA), - actions = Seq(), - errorMessageHint = Some("a in partition [x=1]" :: "Manual Update" :: Nil)) - - check( - "schema change", - conflicts = true, - reads = Seq(t => t.metadata), - concurrentWrites = Seq( - MetadataJ.builder().schema(new StructType().add("foo", new IntegerType())).build()), - actions = Nil) - - check( - "conflicting txns", - conflicts = true, - reads = Seq(t => t.txnVersion("t1")), - concurrentWrites = Seq( - new SetTransactionJ("t1", 0, java.util.Optional.of(1234L)) - ), - actions = Nil) - - check( - "upgrade / upgrade", - conflicts = true, - reads = Seq(t => t.metadata), - concurrentWrites = Seq(new Protocol(1, 2)), - actions = Seq(new Protocol(1, 2))) - - check( - "taint whole table", - conflicts = true, - setup = Seq(metadata_partX, addA_partX2), - reads = Seq( - t => t.markFilesAsRead(colXEq1Filter), - // `readWholeTable` should disallow any concurrent change, even if the change - // is disjoint with the earlier filter - t => t.readWholeTable() - ), - concurrentWrites = Seq(addB_partX3), - actions = Seq(addC_partX4) - ) - - check( - "taint whole table + concurrent remove", - conflicts = true, - setup = Seq(metadata_colXY, addA), - reads = Seq( - // `readWholeTable` should disallow any concurrent `RemoveFile`s. - t => t.readWholeTable() - ), - concurrentWrites = Seq(removeA), - actions = Seq(addB)) - - // initial commit without metadata should fail - // --> see OptimisticTransactionLegacySuite - - // initial commit with multiple metadata actions should fail - // --> see OptimisticTransactionLegacySuite - - // AddFile with different partition schema compared to metadata should fail - // --> see OptimisticTransactionLegacySuite - - test("isolation level shouldn't be null") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - log.startTransaction().commit((metadata_colXY :: Nil).asJava, op, engineInfo) - log.startTransaction().commit((addA :: Nil).asJava, op, engineInfo) - - val versionLogs = log.getChanges(0, true).asScala.toList - - def getIsolationLevel(version: Int): String = { - versionLogs(version) - .getActions - .asScala - .collectFirst { case c: CommitInfo => c } - .map(_.getIsolationLevel.orElseGet(null)) - .get - } - - assert(getIsolationLevel(0) == "SnapshotIsolation") - assert(getIsolationLevel(1) == "Serializable") - } - } - - private def testSchemaChange( - schema1: StructType, - schema2: StructType, - shouldThrow: Boolean, - initialActions: Seq[ActionJ] = addA :: Nil, - commitActions: Seq[ActionJ] = Nil): Unit = { - withTempDir { dir => - val metadata1 = MetadataJ.builder().schema(schema1).build() - val metadata2 = MetadataJ.builder().schema(schema2).build() - - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - - log.startTransaction().commit((initialActions :+ metadata1).asJava, op, engineInfo) - - if (shouldThrow) { - intercept[IllegalStateException] { - log.startTransaction().commit((commitActions :+ metadata2).asJava, op, engineInfo) - } - } else { - log.startTransaction().commit((commitActions :+ metadata2).asJava, op, engineInfo) - } - } - } - - // Note: See SchemaUtilsSuite for thorough isWriteCompatible(existingSchema, newSchema) unit tests - test("can change schema to valid schema") { - // col a is non-nullable - val schema1 = new StructType(Array(new StructField("a", new IntegerType(), false))) - - // add nullable field - val schema2 = schema1.add(new StructField("b", new IntegerType(), true)) - testSchemaChange(schema1, schema2, shouldThrow = false) - - // relaxed nullability (from non-nullable to nullable) - val schema4 = new StructType(Array(new StructField("a", new IntegerType(), true))) - testSchemaChange(schema1, schema4, shouldThrow = false) - } - - // Note: See SchemaUtilsSuite for thorough isWriteCompatible(existingSchema, newSchema) unit tests - test("can't change schema to invalid schema - table non empty, files not removed") { - // col a is nullable - val schema1 = new StructType( - Array( - new StructField("a", new IntegerType(), true), - new StructField("b", new IntegerType(), true) - ) - ) - - // drop a field - val schema2 = new StructType(Array(new StructField("a", new IntegerType(), true))) - testSchemaChange(schema1, schema2, shouldThrow = true) - - // restricted nullability (from nullable to non-nullable) - val schema3 = new StructType(Array(new StructField("a", new IntegerType(), false))) - testSchemaChange(schema2, schema3, shouldThrow = true) - - // change of datatype - val schema4 = new StructType(Array(new StructField("a", new StringType(), true))) - testSchemaChange(schema2, schema4, shouldThrow = true) - - // add non-nullable field - val schema5 = schema1.add(new StructField("c", new IntegerType(), false)) - testSchemaChange(schema1, schema5, shouldThrow = true) - } - - test("can change schema to 'invalid' schema - table empty or all files removed") { - val schema1 = new StructType(Array(new StructField("a", new IntegerType()))) - val schema2 = new StructType(Array(new StructField("a", new StringType()))) - val addC = new AddFileJ("c", Collections.emptyMap(), 1, 1, true, null, null) - - // change of datatype - table is empty - testSchemaChange(schema1, schema2, shouldThrow = false, initialActions = Nil) - - // change of datatype - all files are removed and new file added - testSchemaChange(schema1, schema2, shouldThrow = false, commitActions = removeA :: addC :: Nil) - - // change of datatype - not all files are removed (should throw) - testSchemaChange(schema1, schema2, shouldThrow = true, initialActions = addA :: addB :: Nil, - commitActions = removeA :: Nil) - } - - /////////////////////////////////////////////////////////////////////////// - // prepareCommit() relativizes AddFile paths - /////////////////////////////////////////////////////////////////////////// - - test("converts absolute path to relative path when in table path") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val txn = log.startTransaction() - val addFile = AddFile(dir.getCanonicalPath + "/path/to/file/test.parquet", Map(), 0, 0, true) - txn.updateMetadata(metadata_colXY) - txn.commit(addFile :: Nil, op, "test") - - val committedAddFile = log.update().getAllFiles.asScala.head - assert(committedAddFile.getPath == "path/to/file/test.parquet") - } - } - - test("relative path is unchanged") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val txn = log.startTransaction() - val addFile = AddFile("path/to/file/test.parquet", Map(), 0, 0, true) - txn.updateMetadata(metadata_colXY) - txn.commit(addFile :: Nil, op, "test") - - val committedAddFile = log.update().getAllFiles.asScala.head - assert(committedAddFile.getPath == "path/to/file/test.parquet") - } - } - - test("absolute path is unaltered and made fully qualified when not in table path") { - withTempDir { dir => - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - val txn = log.startTransaction() - val addFile = AddFile("/absolute/path/to/file/test.parquet", Map(), 0, 0, true) - txn.updateMetadata(metadata_colXY) - txn.commit( addFile :: Nil, op, "test") - - val committedAddFile = log.update().getAllFiles.asScala.head - val committedPath = new Path(committedAddFile.getPath) - // Path is fully qualified - assert(committedPath.isAbsolute && !committedPath.isAbsoluteAndSchemeAuthorityNull) - // Path is unaltered - assert(committedAddFile.getPath === "file:/absolute/path/to/file/test.parquet") - } - } - - test("Can't create table with external files") { - val extFile = AddFile("s3://snip/snip.parquet", Map(), 0, 0, true) - val conf = new Configuration() - withTempDir { dir => - val log = DeltaLog.forTable(conf, dir.getCanonicalPath) - val txn = log.startTransaction() - val e = intercept[IllegalStateException] { - txn.updateMetadata(metadata_colXY) - txn.commit(List(extFile), op, engineInfo) - } - assert(e.getMessage.contains("Failed to relativize the path")) - } - } - - test("Create table with external files override") { - val extFile = AddFile("s3://snip/snip.parquet", Map(), 0, 0, true) - val conf = new Configuration() - conf.setBoolean(StandaloneHadoopConf.RELATIVE_PATH_IGNORE, true) - withTempDir { dir => - val log = DeltaLog.forTable(conf, dir.getCanonicalPath) - val txn = log.startTransaction() - txn.updateMetadata(metadata_colXY) - txn.commit(List(extFile), op, engineInfo) - val committedAddFile = log.update().getAllFiles.asScala.head - val committedPath = new Path(committedAddFile.getPath) - // Path is preserved - assert(committedPath.isAbsolute && !committedPath.isAbsoluteAndSchemeAuthorityNull) - assert(committedPath.toString == "s3://snip/snip.parquet") - } - } - -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionSuiteBase.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionSuiteBase.scala deleted file mode 100644 index 5c0882f006f..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionSuiteBase.scala +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.util.ConcurrentModificationException - -import scala.collection.JavaConverters._ - -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.Path -import org.scalatest.FunSuite - -import io.delta.standalone.{DeltaLog, Operation, OptimisticTransaction} -import io.delta.standalone.actions.{Action => ActionJ, Protocol => ProtocolJ} - -import io.delta.standalone.internal.util.TestUtils._ - -trait OptimisticTransactionSuiteBase extends FunSuite with OptimisticTransactionSuiteTestVals { - - val op = new Operation(Operation.Name.MANUAL_UPDATE) - val engineInfo = "test-engine-info" - - /** - * Check whether the test transaction conflict with the concurrent writes by executing the - * given params in the following order: - * - setup (including setting table isolation level - * - reads - * - concurrentWrites - * - actions - * - * When `conflicts` == true, this function checks to make sure the commit of `actions` fails with - * [[ConcurrentModificationException]], otherwise checks that the commit is successful. - * - * @param name test name - * @param conflicts should test transaction is expected to conflict or not - * @param setup sets up the initial delta log state (set schema, partitioning, etc.) - * @param reads reads made in the test transaction - * @param concurrentWrites writes made by concurrent transactions after the test txn reads - * @param actions actions to be committed by the test transaction - * @param errorMessageHint What to expect in the error message - * @param exceptionClass A substring to expect in the exception class name - */ - protected def check( - name: String, - conflicts: Boolean, - setup: Seq[ActionJ] = Seq(metadata_colXY, new ProtocolJ(1, 2)), - reads: Seq[OptimisticTransaction => Unit], - concurrentWrites: Seq[ActionJ], - actions: Seq[ActionJ], - errorMessageHint: Option[Seq[String]] = None, - exceptionClass: Option[String] = None): Unit = { - - val concurrentTxn: OptimisticTransaction => Unit = - (opt: OptimisticTransaction) => - opt.commit(concurrentWrites.asJava, op, engineInfo) - - def initialSetup(log: DeltaLog): Unit = { - // Setup the log - setup.foreach { action => - log.startTransaction().commit(Seq(action).asJava, op, engineInfo) - } - } - check( - name, - conflicts, - initialSetup _, - reads, - Seq(concurrentTxn), - actions.asJava, - errorMessageHint, - exceptionClass - ) - } - - /** - * Check whether the test transaction conflict with the concurrent writes by executing the - * given params in the following order: - * - sets up the initial delta log state using `initialSetup` (set schema, partitioning, etc.) - * - reads - * - concurrentWrites - * - actions - * - * When `conflicts` == true, this function checks to make sure the commit of `actions` fails with - * [[ConcurrentModificationException]], otherwise checks that the commit is successful. - * - * @param name test name - * @param conflicts should test transaction is expected to conflict or not - * @param initialSetup sets up the initial delta log state (set schema, partitioning, etc.) - * @param reads reads made in the test transaction - * @param concurrentTxns concurrent txns that may write data after the test txn reads - * @param actions actions to be committed by the test transaction - * @param errorMessageHint What to expect in the error message - * @param exceptionClass A substring to expect in the exception class name - */ - protected def check( - name: String, - conflicts: Boolean, - initialSetup: DeltaLog => Unit, - reads: Seq[OptimisticTransaction => Unit], - concurrentTxns: Seq[OptimisticTransaction => Unit], - actions: java.util.List[ActionJ], - errorMessageHint: Option[Seq[String]], - exceptionClass: Option[String]): Unit = { - - val conflict = if (conflicts) "should conflict" else "should not conflict" - test(s"$name - $conflict") { - withTempDir { tempDir => - val log = DeltaLog.forTable(new Configuration(), new Path(tempDir.getCanonicalPath)) - - // Setup the log - initialSetup(log) - - // Perform reads - val txn = log.startTransaction() - reads.foreach(_ (txn)) - - // Execute concurrent txn while current transaction is active - concurrentTxns.foreach(txn => txn(log.startTransaction())) - - // Try commit and check expected conflict behavior - if (conflicts) { - val e = intercept[ConcurrentModificationException] { - txn.commit(actions, op, engineInfo) - } - errorMessageHint.foreach { expectedParts => - assert(expectedParts.forall(part => e.getMessage.contains(part))) - } - if (exceptionClass.nonEmpty) { - assert(e.getClass.getName.contains(exceptionClass.get)) - } - } else { - txn.commit(actions, op, engineInfo) - } - } - } - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionSuiteTestVals.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionSuiteTestVals.scala deleted file mode 100644 index 2241b420aec..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/OptimisticTransactionSuiteTestVals.scala +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.util.Collections - -import scala.collection.JavaConverters._ - -import io.delta.standalone.actions.{AddFile => AddFileJ, Metadata => MetadataJ} -import io.delta.standalone.expressions.{EqualTo, Literal} -import io.delta.standalone.types.{IntegerType, StructField, StructType} - -/** - * By bundling these variables into a trait, we make it easier for other projects (specifically, the - * Delta Standalone / Delta OSS compatibility project) to reuse these variables in concurrent write - * tests. - */ -trait OptimisticTransactionSuiteTestVals { - val addA = new AddFileJ("a", Collections.emptyMap(), 1, 1, true, null, null) - val addB = new AddFileJ("b", Collections.emptyMap(), 1, 1, true, null, null) - - val removeA = addA.remove(4L) - val removeA_time5 = addA.remove(5L) - - val addA_partX1 = new AddFileJ("a", Map("x" -> "1").asJava, 1, 1, true, null, null) - val addA_partX2 = new AddFileJ("a", Map("x" -> "2").asJava, 1, 1, true, null, null) - val addB_partX1 = new AddFileJ("b", Map("x" -> "1").asJava, 1, 1, true, null, null) - val addB_partX3 = new AddFileJ("b", Map("x" -> "3").asJava, 1, 1, true, null, null) - val addC_partX4 = new AddFileJ("c", Map("x" -> "4").asJava, 1, 1, true, null, null) - - val schema = new StructType() - .add("x", new IntegerType()) - .add("y", new IntegerType()) - - val colXEq1Filter = new EqualTo(schema.column("x"), Literal.of(1)) - val metadata_colXY = MetadataJ.builder().schema(schema).build() - val metadata_partX = - MetadataJ.builder().schema(schema).partitionColumns(Seq("x").asJava).build() -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/SchemaUtilsSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/SchemaUtilsSuite.scala deleted file mode 100644 index 3cf54047248..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/SchemaUtilsSuite.scala +++ /dev/null @@ -1,399 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.util.Locale - -import org.scalatest.FunSuite - -import io.delta.standalone.exceptions.DeltaStandaloneException -import io.delta.standalone.types._ - -import io.delta.standalone.internal.util.SchemaMergingUtils.checkColumnNameDuplication -import io.delta.standalone.internal.util.SchemaUtils._ - -class SchemaUtilsSuite extends FunSuite { - - private def expectFailure(shouldContain: String*)(f: => Unit): Unit = { - val e = intercept[DeltaStandaloneException] { - f - } - val msg = e.getMessage.toLowerCase(Locale.ROOT) - assert(shouldContain.map(_.toLowerCase(Locale.ROOT)).forall(msg.contains), - s"Error message '$msg' didn't contain: $shouldContain") - } - - /////////////////////////////////////////////////////////////////////////// - // Duplicate Column Checks - /////////////////////////////////////////////////////////////////////////// - - test("duplicate column name in top level") { - val schema = new StructType() - .add("dupColName", new IntegerType()) - .add("b", new IntegerType()) - .add("dupColName", new StringType()) - expectFailure("dupColName") { checkColumnNameDuplication(schema, "") } - } - - test("duplicate column name in top level - case sensitivity") { - val schema = new StructType() - .add("dupColName", new IntegerType()) - .add("b", new IntegerType()) - .add("dupCOLNAME", new StringType()) - expectFailure("dupColName") { checkColumnNameDuplication(schema, "") } - } - - test("duplicate column name for nested column + non-nested column") { - val schema = new StructType() - .add("dupColName", new StructType() - .add("a", new IntegerType()) - .add("b", new IntegerType())) - .add("dupColName", new IntegerType()) - expectFailure("dupColName") { checkColumnNameDuplication(schema, "") } - } - - test("duplicate column name for nested column + non-nested column - case sensitivity") { - val schema = new StructType() - .add("dupColName", new StructType() - .add("a", new IntegerType()) - .add("b", new IntegerType())) - .add("dupCOLNAME", new IntegerType()) - expectFailure("dupCOLNAME") { checkColumnNameDuplication(schema, "") } - } - - test("duplicate column name in nested level") { - val schema = new StructType() - .add("top", new StructType() - .add("dupColName", new IntegerType()) - .add("b", new IntegerType()) - .add("dupColName", new StringType()) - ) - expectFailure("top.dupColName") { checkColumnNameDuplication(schema, "") } - } - - test("duplicate column name in nested level - case sensitivity") { - val schema = new StructType() - .add("top", new StructType() - .add("dupColName", new IntegerType()) - .add("b", new IntegerType()) - .add("dupCOLNAME", new StringType()) - ) - expectFailure("top.dupColName") { checkColumnNameDuplication(schema, "") } - } - - test("duplicate column name in double nested level") { - val schema = new StructType() - .add("top", new StructType() - .add("b", new StructType() - .add("dupColName", new StringType()) - .add("c", new IntegerType()) - .add("dupColName", new StringType())) - .add("d", new IntegerType()) - ) - expectFailure("top.b.dupColName") { checkColumnNameDuplication(schema, "") } - } - - test("duplicate column name in double nested array") { - val schema = new StructType() - .add("top", new StructType() - .add("b", new ArrayType( - new ArrayType(new StructType() - .add("dupColName", new StringType()) - .add("c", new IntegerType()) - .add("dupColName", new StringType()), - true), - true)) - .add("d", new IntegerType()) - ) - expectFailure("top.b.element.element.dupColName") { checkColumnNameDuplication(schema, "") } - } - - test("duplicate column name in double nested map") { - val keyType = new StructType() - .add("dupColName", new IntegerType()) - .add("d", new StringType()) - expectFailure("top.b.key.dupColName") { - val schema = new StructType() - .add("top", new StructType() - .add("b", new MapType(keyType.add("dupColName", new StringType()), keyType, true)) - ) - checkColumnNameDuplication(schema, "") - } - expectFailure("top.b.value.dupColName") { - val schema = new StructType() - .add("top", new StructType() - .add("b", new MapType(keyType, keyType.add("dupColName", new StringType()), true)) - ) - checkColumnNameDuplication(schema, "") - } - // This is okay - val schema = new StructType() - .add("top", new StructType() - .add("b", new MapType(keyType, keyType, true)) - ) - checkColumnNameDuplication(schema, "") - } - - test("duplicate column name in nested array") { - val schema = new StructType() - .add("top", new ArrayType(new StructType() - .add("dupColName", new IntegerType()) - .add("b", new IntegerType()) - .add("dupColName", new StringType()), true) - ) - expectFailure("top.element.dupColName") { checkColumnNameDuplication(schema, "") } - } - - test("duplicate column name in nested array - case sensitivity") { - val schema = new StructType() - .add("top", new ArrayType(new StructType() - .add("dupColName", new IntegerType()) - .add("b", new IntegerType()) - .add("dupCOLNAME", new StringType()), true) - ) - expectFailure("top.element.dupColName") { checkColumnNameDuplication(schema, "") } - } - - test("non duplicate column because of back tick") { - val schema = new StructType() - .add("top", new StructType() - .add("a", new IntegerType()) - .add("b", new IntegerType())) - .add("top.a", new IntegerType()) - checkColumnNameDuplication(schema, "") - } - - test("non duplicate column because of back tick - nested") { - val schema = new StructType() - .add("first", new StructType() - .add("top", new StructType() - .add("a", new IntegerType()) - .add("b", new IntegerType())) - .add("top.a", new IntegerType())) - checkColumnNameDuplication(schema, "") - } - - test("duplicate column with back ticks - nested") { - val schema = new StructType() - .add("first", new StructType() - .add("top.a", new StringType()) - .add("b", new IntegerType()) - .add("top.a", new IntegerType())) - expectFailure("first.`top.a`") { checkColumnNameDuplication(schema, "") } - } - - test("duplicate column with back ticks - nested and case sensitivity") { - val schema = new StructType() - .add("first", new StructType() - .add("TOP.a", new StringType()) - .add("b", new IntegerType()) - .add("top.a", new IntegerType())) - expectFailure("first.`top.a`") { checkColumnNameDuplication(schema, "") } - } - - /////////////////////////////////////////////////////////////////////////// - // checkFieldNames - /////////////////////////////////////////////////////////////////////////// - - test("check non alphanumeric column characters") { - val badCharacters = " ,;{}()\n\t=" - val goodCharacters = "#.`!@$%^&*~_<>?/:" - - badCharacters.foreach { char => - Seq(s"a${char}b", s"${char}ab", s"ab${char}", char.toString).foreach { name => - val e = intercept[DeltaStandaloneException] { - checkFieldNames(Seq(name)) - } - assert(e.getMessage.contains("invalid character")) - } - } - - goodCharacters.foreach { char => - // no issues here - checkFieldNames(Seq(s"a${char}b", s"${char}ab", s"ab${char}", char.toString)) - } - } - - /////////////////////////////////////////////////////////////////////////// - // Write Compatibility Checks - /////////////////////////////////////////////////////////////////////////// - - /** - * Tests change of datatype within a schema. - * - the make() function is a "factory" function to create schemas that vary only by the - * given datatype in a specific position in the schema. - * - other tests will call this method with different make() functions to test datatype - * incompatibility in all the different places within a schema (in a top-level struct, - * in a nested struct, as the element type of an array, etc.) - */ - def testDatatypeChange(scenario: String)(make: DataType => StructType): Unit = { - val schemas = Map( - ("int", make(new IntegerType())), - ("string", make(new StringType())), - ("struct", make(new StructType().add("a", new StringType()))), - ("array", make(new ArrayType(new IntegerType(), true))), // containsNull - ("map", make(new MapType(new StringType(), new FloatType(), true))) // valueContainsNull - ) - test(s"change of datatype should fail write compatibility - $scenario") { - for (a <- schemas.keys; b <- schemas.keys if a != b) { - assert(!schemas(a).isWriteCompatible(schemas(b)), - s"isWriteCompatible should have failed for: ${schemas(a)}, ${schemas(b)}") - } - } - } - - /** - * Tests change of nullability within a schema. - * - ALLOWED: making a non-nullable field nullable - * - NOT ALLOWED: making a nullable field non-nullable - * - * Implementation details: - * - the make() function is a "factory" function to create schemas that vary only by the - * nullability (of a field, array element, or map values) in a specific position in the schema. - * - other tests will call this method with different make() functions to test nullability - * incompatibility in all the different places within a schema (in a top-level struct, - * in a nested struct, for the element type of an array, etc.) - */ - def testNullability (scenario: String)(make: Boolean => StructType): Unit = { - val nullable = make(true) - val nonNullable = make(false) - - // restricted: nullable=true ==> nullable=false - test(s"restricted nullability should fail write compatibility - $scenario") { - assert(!nullable.isWriteCompatible(nonNullable)) - } - - // relaxed: nullable=false ==> nullable=true - test(s"relaxed nullability should not fail write compatibility - $scenario") { - assert(nonNullable.isWriteCompatible(nullable)) - } - } - - /** - * Tests for fields of a struct: adding/dropping fields, changing nullability, case variation - * - The make() function is a "factory" method to produce schemas. It takes a function that - * mutates a struct (for example, but adding a column, or it could just not make any change). - * - Following tests will call this method with different factory methods, to mutate the - * various places where a struct can appear (at the top-level, nested in another struct, - * within an array, etc.) - * - This allows us to have one shared code to test compatibility of a struct field in all the - * different places where it may occur. - */ - def testColumnVariations(scenario: String) - (make: (StructType => StructType) => StructType): Unit = { - - // generate one schema without extra column, one with, one nullable, and one with mixed case - val withoutExtra = make(struct => struct) // produce struct WITHOUT extra field - val withExtraNullable = make(struct => struct.add("extra", new StringType())) - val withExtraMixedCase = make(struct => struct.add("eXtRa", new StringType())) - val withExtraNonNullable = - make(struct => struct.add("extra", new StringType(), false)) // nullable = false - - test(s"dropping a field should fail write compatibility - $scenario") { - assert(!withExtraNullable.isWriteCompatible(withoutExtra)) - } - test(s"adding a nullable field should not fail write compatibility - $scenario") { - assert(withoutExtra.isWriteCompatible(withExtraNullable)) - } - test(s"adding a non-nullable field should fail write compatibility - $scenario") { - assert(!withoutExtra.isWriteCompatible(withExtraNonNullable)) - } - test(s"case variation of field name should fail write compatibility - $scenario") { - assert(!withExtraNullable.isWriteCompatible(withExtraMixedCase)) - } - - testNullability(scenario) { nullable => - make(struct => struct.add("extra", new StringType(), nullable)) - } - testDatatypeChange(scenario) { datatype => - make(struct => struct.add("extra", datatype)) - } - } - - // -------------------------------------------------------------------- - // tests for all kinds of places where a field can appear in a struct - // -------------------------------------------------------------------- - - testColumnVariations("top level")( - f => f(new StructType().add("a", new IntegerType()))) - - testColumnVariations("nested struct")( - f => new StructType() - .add("a", f(new StructType().add("b", new IntegerType())))) - - testColumnVariations("nested in array")( - f => new StructType() - .add("array", new ArrayType( - f(new StructType().add("b", new IntegerType())), true) // containsNull - ) - ) - - testColumnVariations("nested in map key")( - f => new StructType() - .add("map", new MapType( - f(new StructType().add("b", new IntegerType())), - new StringType(), true) // valueContainsNull - ) - ) - - testColumnVariations("nested in map value")( - f => new StructType() - .add("map", new MapType( - new StringType(), - f(new StructType().add("b", new IntegerType())), true) // valueContainsNull - ) - ) - - // -------------------------------------------------------------------- - // tests for data type change in places other than struct - // -------------------------------------------------------------------- - - testDatatypeChange("array element")( - datatype => new StructType() - .add("array", new ArrayType(datatype, true))) // containsNull - - testDatatypeChange("map key")( - datatype => new StructType() - .add("map", new MapType(datatype, new StringType(), true))) // valueContainsNull - - testDatatypeChange("map value")( - datatype => new StructType() - .add("map", new MapType(new StringType(), datatype, true))) // valueContainsNull - - // -------------------------------------------------------------------- - // tests for nullability change in places other than struct - // -------------------------------------------------------------------- - - testNullability("array contains null")( - containsNull => new StructType() - .add("array", new ArrayType(new StringType(), containsNull))) - - testNullability("map contains null values")( - valueContainsNull => new StructType() - .add("map", new MapType(new IntegerType(), new StringType(), valueContainsNull))) - - testNullability("map nested in array")( - valueContainsNull => new StructType() - .add("map", new ArrayType( - new MapType(new IntegerType(), new StringType(), valueContainsNull), true))) // containsNull - - testNullability("array nested in map")( - containsNull => new StructType() - .add("map", new MapType( - new IntegerType(), - new ArrayType(new StringType(), containsNull), true))) // valueContainsNull -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/VersionLogSuite.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/VersionLogSuite.scala deleted file mode 100644 index 20902648bf7..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/VersionLogSuite.scala +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal - -import java.util.Collections - -import scala.collection.JavaConverters._ - -import io.delta.storage.CloseableIterator -import org.scalatest.FunSuite - -import io.delta.standalone.VersionLog -import io.delta.standalone.actions.{Action => ActionJ, AddFile => AddFileJ} - -import io.delta.standalone.internal.actions.{Action, AddFile} -import io.delta.standalone.internal.util.ConversionUtils - -class VersionLogSuite extends FunSuite { - private val defaultVersionNumber = 33 - private val listLength = 10 - private val stringList: java.util.List[String] = Collections.unmodifiableList( - (0 until listLength).map { x => - AddFile(x.toString, Map.empty, 1, 1, dataChange = true).json - }.asJava - ) - private val actionList: java.util.List[ActionJ] = stringList - .toArray - .map(x => ConversionUtils.convertAction(Action.fromJson(x.toString))) - .toList - .asJava - - private val stringIterator = () => stringList.iterator - - private def stringCloseableIterator: CloseableIterator[String] = - new CloseableIterator[String]() { - val wrap: Iterator[String] = stringIterator().asScala - - override def next(): String = { - wrap.next - } - - override def close(): Unit = {} - - override def hasNext: Boolean = { - wrap.hasNext - } - } - - private def actionCloseableIterator: CloseableIterator[ActionJ] = - new CloseableIterator[ActionJ]() { - val wrap: Iterator[String] = stringIterator().asScala - - override def next(): ActionJ = { - ConversionUtils.convertAction(Action.fromJson(wrap.next)) - } - - override def close(): Unit = {} - - override def hasNext: Boolean = { - wrap.hasNext - } - } - - /** - * The method compares newVersionLog with default [[VersionLog]] property objects - * @param newVersionLog the new VersionLog object generated in tests - */ - private def checkVersionLog( - newVersionLog: VersionLog, - defaultActionIterator: CloseableIterator[ActionJ] - ): Unit = { - val newActionList = newVersionLog.getActions - - assert(newVersionLog.getVersion == defaultVersionNumber) - assert(newActionList.size() == actionList.size()) - assert( - newActionList - .toArray() - .zip(actionList.toArray()) - .count(x => x._1 == x._2) == newActionList.size() - ) - - val newActionIterator = newVersionLog.getActionsIterator - - (0 until listLength).foreach(_ => { - assert(newActionIterator.hasNext && defaultActionIterator.hasNext) - assert( - newActionIterator.next().asInstanceOf[AddFileJ].getPath == - defaultActionIterator.next().asInstanceOf[AddFileJ].getPath - ) - }) - } - - test("basic operation for VersionLog.java") { - checkVersionLog( - new VersionLog(defaultVersionNumber, actionList), - actionCloseableIterator - ) - } - - test("basic operation for MemoryOptimizedVersionLog.scala") { - checkVersionLog( - new MemoryOptimizedVersionLog( - defaultVersionNumber, - () => stringCloseableIterator - ), - actionCloseableIterator - ) - } - - test("CloseableIterator should not be instantiated when supplier is not used") { - var applyCounter: Int = 0 - val supplierWithCounter: () => CloseableIterator[String] = - () => { - applyCounter += 1 - stringCloseableIterator - } - val versionLogWithIterator = new MemoryOptimizedVersionLog( - defaultVersionNumber, - supplierWithCounter - ) - - assert(versionLogWithIterator.getVersion == defaultVersionNumber) - - // Calling counter increased only when a new CloseableIterator is instantiated. - // i.e. MemoryOptimizedVersionLog.getActions() or MemoryOptimizedVersionLog.getActionsIterator() - // is called. See supplierWithCounter for details. - assert(applyCounter == 0) - versionLogWithIterator.getActions - assert(applyCounter == 1) - versionLogWithIterator.getActionsIterator - assert(applyCounter == 2) - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/util/FakeFileSystem.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/util/FakeFileSystem.scala deleted file mode 100644 index 0812f3cf142..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/util/FakeFileSystem.scala +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import java.net.URI - -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.{DelegateToFileSystem, FsServerDefaults, RawLocalFileSystem} - -/** - * A fake file system that delegates the calls to local file system but uses a different scheme. - * This can be used to test whether Hadoop configuration will be picked up. - */ -class FakeFileSystem extends RawLocalFileSystem { - override def getScheme: String = FakeFileSystem.scheme - override def getUri: URI = URI.create(s"$getScheme:///") -} - -object FakeFileSystem { - val scheme = "fake" - - def newConfiguration(): Configuration = { - val conf = new Configuration() - conf.set("fs.fake.impl", classOf[FakeFileSystem].getName) - conf.set("fs.fake.impl.disable.cache", "true") - conf.set("fs.AbstractFileSystem.fake.impl", classOf[FakeAbstractFileSystem].getName) - conf - } -} - -/** - * A fake AbstractFileSystem for [[FakeFileSystem]] to use the default log store. This is a wrapper - * around [[FakeFileSystem]]. - */ -class FakeAbstractFileSystem(uri: URI, conf: Configuration) extends DelegateToFileSystem( - uri, - new FakeFileSystem, - conf, - FakeFileSystem.scheme, - false) diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/util/GoldenTableUtils.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/util/GoldenTableUtils.scala deleted file mode 100644 index 3b5f1726311..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/util/GoldenTableUtils.scala +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import java.io.File - -import org.apache.commons.io.FileUtils -import org.apache.hadoop.conf.Configuration - -import io.delta.standalone.DeltaLog - -import io.delta.standalone.internal.DeltaLogImpl -import io.delta.standalone.internal.util.TestUtils._ - -object GoldenTableUtils { - - /** - * Create a [[DeltaLog]] (with Java interface) for the given golden table and execute the test - * function. The caller SHOULD NOT modify the table. - * - * @param name The name of the golden table to load. - * @param testFunc The test to execute which takes the [[DeltaLog]] as input arg. - */ - def withLogForGoldenTable(name: String)(testFunc: DeltaLog => Unit): Unit = { - val tablePath = io.delta.golden.GoldenTableUtils.goldenTablePath(name) - val log = DeltaLog.forTable(new Configuration(), tablePath) - testFunc(log) - } - - /** - * Create a [[DeltaLog]] (with Java interface) for the given golden table and execute the test - * function. The table will be put on a temp location and it can be modified. - * - * @param name The name of the golden table to load. - * @param testFunc The test to execute which takes the [[DeltaLog]] as input arg. - */ - def withLogForWritableGoldenTable(name: String)(testFunc: DeltaLog => Unit): Unit = - withTempDir { tempDir => - val tableFile = io.delta.golden.GoldenTableUtils.goldenTableFile(name) - FileUtils.copyDirectory(tableFile, tempDir) - val log = DeltaLog.forTable(new Configuration(), tempDir.getCanonicalPath) - testFunc(log) - } - - /** - * Create a [[DeltaLogImpl]] for the given golden table and execute the test function. The caller - * SHOULD NOT modify the table. - * - * This should only be used when `private[internal]` methods and variables (which [[DeltaLog]] - * doesn't expose but [[DeltaLogImpl]] does) are needed by the test function. - * - * @param name The name of the golden table to load. - * @param testFunc The test to execute which takes the [[DeltaLogImpl]] as input arg. - */ - def withLogImplForGoldenTable(name: String)(testFunc: DeltaLogImpl => Unit): Unit = { - val tablePath = io.delta.golden.GoldenTableUtils.goldenTablePath(name) - val log = DeltaLogImpl.forTable(new Configuration(), tablePath) - testFunc(log) - } - - /** - * Create a [[DeltaLogImpl]] for the given golden table and execute the test function. The table - * will be put on a temp location and it can be modified. - * - * This should only be used when `private[internal]` methods and variables (which [[DeltaLog]] - * doesn't expose but [[DeltaLogImpl]] does) are needed by the test function. - * - * @param name The name of the golden table to load. - * @param testFunc The test to execute which takes the [[DeltaLogImpl]] as input arg. - */ - def withLogImplForWritableGoldenTable(name: String)(testFunc: DeltaLogImpl => Unit): Unit = - withTempDir { tempDir => - val tableFile = io.delta.golden.GoldenTableUtils.goldenTableFile(name) - FileUtils.copyDirectory(tableFile, tempDir) - val log = DeltaLogImpl.forTable(new Configuration(), tempDir.getCanonicalPath) - testFunc(log) - } - - /** - * Create the full table path for the given golden table and execute the test function. - * - * @param name The name of the golden table to load. - * @param testFunc The test to execute which takes the full table path as input arg. - */ - def withGoldenTable(name: String)(testFunc: String => Unit): Unit = { - val tablePath = io.delta.golden.GoldenTableUtils.goldenTablePath(name) - testFunc(tablePath) - } -} diff --git a/connectors/standalone/src/test/scala/io/delta/standalone/internal/util/TestUtils.scala b/connectors/standalone/src/test/scala/io/delta/standalone/internal/util/TestUtils.scala deleted file mode 100644 index cec90ef0bcc..00000000000 --- a/connectors/standalone/src/test/scala/io/delta/standalone/internal/util/TestUtils.scala +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone.internal.util - -import java.io.File -import java.nio.file.Files -import java.util.UUID - -import scala.collection.JavaConverters._ - -import org.apache.commons.io.FileUtils - -import io.delta.standalone.actions.{Action => ActionJ, AddFile => AddFileJ} - -import io.delta.standalone.internal.actions.{Action, AddFile} - -object TestUtils { - - /** - * Creates a temporary directory, which is then passed to `f` and will be deleted after `f` - * returns. - */ - def withTempDir(f: File => Unit): Unit = { - val dir = Files.createTempDirectory(UUID.randomUUID().toString).toFile - try f(dir) finally { - FileUtils.deleteDirectory(dir) - } - } - - implicit def actionSeqToList[T <: Action](seq: Seq[T]): java.util.List[ActionJ] = - seq.map(ConversionUtils.convertAction).asJava - - implicit def addFileSeqToList(seq: Seq[AddFile]): java.util.List[AddFileJ] = - seq.map(ConversionUtils.convertAddFile).asJava - -} diff --git a/connectors/testParquetUtilsWithStandaloneCosmetic/src/test/scala/io/delta/standalone/ParquetSchemaConverterSuite.scala b/connectors/testParquetUtilsWithStandaloneCosmetic/src/test/scala/io/delta/standalone/ParquetSchemaConverterSuite.scala deleted file mode 100644 index 308e8491136..00000000000 --- a/connectors/testParquetUtilsWithStandaloneCosmetic/src/test/scala/io/delta/standalone/ParquetSchemaConverterSuite.scala +++ /dev/null @@ -1,305 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.delta.standalone - -import org.apache.parquet.schema.MessageTypeParser -import org.scalatest.FunSuite - -import io.delta.standalone.types._ -import io.delta.standalone.util.ParquetSchemaConverter - -class ParquetSchemaConverterSuite extends FunSuite { - - private def testCatalystToParquet( - testName: String, - sqlSchema: StructType, - parquetSchema: String, - writeLegacyParquetFormat: Boolean, - outputTimestampType: ParquetSchemaConverter.ParquetOutputTimestampType = - ParquetSchemaConverter.ParquetOutputTimestampType.INT96): Unit = { - - test(s"sql => parquet: $testName") { - val actual = ParquetSchemaConverter.deltaToParquet( - sqlSchema, - writeLegacyParquetFormat, - outputTimestampType) - val expected = MessageTypeParser.parseMessageType(parquetSchema) - actual.checkContains(expected) - expected.checkContains(actual) - } - } - - // ======================================================= - // Tests for converting Catalyst ArrayType to Parquet LIST - // ======================================================= - - testCatalystToParquet( - "Backwards-compatibility: LIST with nullable element type - 1 - standard", - new StructType(Array( - new StructField( - "f1", - new ArrayType(new IntegerType(), true), - true))), - """message root { - | optional group f1 (LIST) { - | repeated group list { - | optional int32 element; - | } - | } - |} - """.stripMargin, - writeLegacyParquetFormat = false) - - testCatalystToParquet( - "Backwards-compatibility: LIST with nullable element type - 2 - prior to 1.4.x", - new StructType(Array( - new StructField( - "f1", - new ArrayType(new IntegerType(), true), - true))), - """message root { - | optional group f1 (LIST) { - | repeated group bag { - | optional int32 array; - | } - | } - |} - """.stripMargin, - writeLegacyParquetFormat = true) - - testCatalystToParquet( - "Backwards-compatibility: LIST with non-nullable element type - 1 - standard", - new StructType(Array( - new StructField( - "f1", - new ArrayType(new IntegerType(), false), - true))), - """message root { - | optional group f1 (LIST) { - | repeated group list { - | required int32 element; - | } - | } - |} - """.stripMargin, - writeLegacyParquetFormat = false) - - testCatalystToParquet( - "Backwards-compatibility: LIST with non-nullable element type - 2 - prior to 1.4.x", - new StructType(Array( - new StructField( - "f1", - new ArrayType(new IntegerType(), false), - true))), - """message root { - | optional group f1 (LIST) { - | repeated int32 array; - | } - |} - """.stripMargin, - writeLegacyParquetFormat = true) - - // ==================================================== - // Tests for converting Catalyst MapType to Parquet Map - // ==================================================== - - testCatalystToParquet( - "Backwards-compatibility: MAP with non-nullable value type - 1 - standard", - new StructType(Array( - new StructField( - "f1", - new MapType(new IntegerType(), new StringType(), false), - true))), - """message root { - | optional group f1 (MAP) { - | repeated group key_value { - | required int32 key; - | required binary value (UTF8); - | } - | } - |} - """.stripMargin, - writeLegacyParquetFormat = false) - - testCatalystToParquet( - "Backwards-compatibility: MAP with non-nullable value type - 2 - prior to 1.4.x", - new StructType(Array( - new StructField( - "f1", - new MapType(new IntegerType(), new StringType(), false), - true))), - """message root { - | optional group f1 (MAP) { - | repeated group key_value (MAP_KEY_VALUE) { - | required int32 key; - | required binary value (UTF8); - | } - | } - |} - """.stripMargin, - writeLegacyParquetFormat = true) - - testCatalystToParquet( - "Backwards-compatibility: MAP with nullable value type - 1 - standard", - new StructType(Array( - new StructField( - "f1", - new MapType(new IntegerType(), new StringType(), true), - true))), - """message root { - | optional group f1 (MAP) { - | repeated group key_value { - | required int32 key; - | optional binary value (UTF8); - | } - | } - |} - """.stripMargin, - writeLegacyParquetFormat = false) - - testCatalystToParquet( - "Backwards-compatibility: MAP with nullable value type - 3 - prior to 1.4.x", - new StructType(Array( - new StructField( - "f1", - new MapType(new IntegerType(), new StringType(), true), - true))), - """message root { - | optional group f1 (MAP) { - | repeated group key_value (MAP_KEY_VALUE) { - | required int32 key; - | optional binary value (UTF8); - | } - | } - |} - """.stripMargin, - writeLegacyParquetFormat = true) - - // ================================= - // Tests for conversion for decimals - // ================================= - - testCatalystToParquet( - "DECIMAL(1, 0) - standard", - new StructType(Array(new StructField("f1", new DecimalType(1, 0)))), - """message root { - | optional int32 f1 (DECIMAL(1, 0)); - |} - """.stripMargin, - writeLegacyParquetFormat = false) - - testCatalystToParquet( - "DECIMAL(8, 3) - standard", - new StructType(Array(new StructField("f1", new DecimalType(8, 3)))), - """message root { - | optional int32 f1 (DECIMAL(8, 3)); - |} - """.stripMargin, - writeLegacyParquetFormat = false) - - testCatalystToParquet( - "DECIMAL(9, 3) - standard", - new StructType(Array(new StructField("f1", new DecimalType(9, 3)))), - """message root { - | optional int32 f1 (DECIMAL(9, 3)); - |} - """.stripMargin, - writeLegacyParquetFormat = false) - - testCatalystToParquet( - "DECIMAL(18, 3) - standard", - new StructType(Array(new StructField("f1", new DecimalType(18, 3)))), - """message root { - | optional int64 f1 (DECIMAL(18, 3)); - |} - """.stripMargin, - writeLegacyParquetFormat = false) - - testCatalystToParquet( - "DECIMAL(19, 3) - standard", - new StructType(Array(new StructField("f1", new DecimalType(19, 3)))), - """message root { - | optional fixed_len_byte_array(9) f1 (DECIMAL(19, 3)); - |} - """.stripMargin, - writeLegacyParquetFormat = false) - - testCatalystToParquet( - "DECIMAL(1, 0) - prior to 1.4.x", - new StructType(Array(new StructField("f1", new DecimalType(1, 0)))), - """message root { - | optional fixed_len_byte_array(1) f1 (DECIMAL(1, 0)); - |} - """.stripMargin, - writeLegacyParquetFormat = true) - - testCatalystToParquet( - "DECIMAL(8, 3) - prior to 1.4.x", - new StructType(Array(new StructField("f1", new DecimalType(8, 3)))), - """message root { - | optional fixed_len_byte_array(4) f1 (DECIMAL(8, 3)); - |} - """.stripMargin, - writeLegacyParquetFormat = true) - - testCatalystToParquet( - "DECIMAL(9, 3) - prior to 1.4.x", - new StructType(Array(new StructField("f1", new DecimalType(9, 3)))), - """message root { - | optional fixed_len_byte_array(5) f1 (DECIMAL(9, 3)); - |} - """.stripMargin, - writeLegacyParquetFormat = true) - - testCatalystToParquet( - "DECIMAL(18, 3) - prior to 1.4.x", - new StructType(Array(new StructField("f1", new DecimalType(18, 3)))), - """message root { - | optional fixed_len_byte_array(8) f1 (DECIMAL(18, 3)); - |} - """.stripMargin, - writeLegacyParquetFormat = true) - - testCatalystToParquet( - "Timestamp written and read as INT64 with TIMESTAMP_MILLIS", - new StructType(Array(new StructField("f1", new TimestampType()))), - """message root { - | optional INT64 f1 (TIMESTAMP_MILLIS); - |} - """.stripMargin, - writeLegacyParquetFormat = true, - outputTimestampType = ParquetSchemaConverter.ParquetOutputTimestampType.TIMESTAMP_MILLIS) - - testCatalystToParquet( - "Timestamp written and read as INT64 with TIMESTAMP_MICROS", - new StructType(Array(new StructField("f1", new TimestampType()))), - """message root { - | optional INT64 f1 (TIMESTAMP_MICROS); - |} - """.stripMargin, - writeLegacyParquetFormat = true, - outputTimestampType = ParquetSchemaConverter.ParquetOutputTimestampType.TIMESTAMP_MICROS) - - testCatalystToParquet( - "SPARK-36825: Year-month interval written and read as INT32", - new StructType(Array(new StructField("f1", new DateType()))), - """message root { - | optional INT32 f1; - |} - """.stripMargin, - writeLegacyParquetFormat = false) -} diff --git a/connectors/testStandaloneCosmetic/src/test/scala/io/delta/standalone/internal/ShadedJarSuite.scala b/connectors/testStandaloneCosmetic/src/test/scala/io/delta/standalone/internal/ShadedJarSuite.scala deleted file mode 100644 index 65052f3ccf2..00000000000 --- a/connectors/testStandaloneCosmetic/src/test/scala/io/delta/standalone/internal/ShadedJarSuite.scala +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (2020-present) The Delta Lake Project Authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.delta.standalone.internal - -import java.io.File -import java.net.JarURLConnection -import java.nio.file.Files -import java.util.{Collections, UUID} -import java.util.jar.JarFile - -import scala.collection.JavaConverters._ - -import org.apache.commons.io.FileUtils -import org.apache.hadoop.conf.Configuration -import org.scalatest.FunSuite - -import io.delta.standalone.{DeltaLog, Operation, Snapshot} - -import io.delta.standalone.internal.DeltaLogImpl - -class ShadedJarSuite extends FunSuite { - test("audit files in delta-standalone jar") { - val allowedFilePrefixes = Seq( - "META-INF/MANIFEST.MF", - "META-INF/LICENSE", - "META-INF/NOTICE", - "io/delta/standalone/", - "shadedelta/" - ) - // scalastyle:off classforname - val classUrl = Class.forName("io.delta.standalone.DeltaLog").getResource("DeltaLog.class") - // scalastyle:on classforname - assert(classUrl != null, "Cannot find delta-standalone jar") - val connection = classUrl.openConnection().asInstanceOf[JarURLConnection] - val url = connection.getJarFileURL() - val jarFile = new JarFile(new File(url.toURI)) - var numOfAllowedFiles = 0 - var foundParquetUtils = false - try { - jarFile.entries().asScala.filter(!_.isDirectory).map(_.toString).foreach(e => { - val allowed = allowedFilePrefixes.exists(e.startsWith) - if (allowed) numOfAllowedFiles += 1 - assert(allowed, s"$e is not expected to appear in delta-standalone jar") - if (e.startsWith("io/delta/standalone/util/ParquetSchemaConverter")) { - foundParquetUtils = true - } - }) - assert( - numOfAllowedFiles > 20, - "Found no enough files. The test might be broken as we picked up a wrong jar file to check") - assert(foundParquetUtils, "cannot find ParquetSchemaConverter in the jar") - } finally { - jarFile.close() - } - } - - test("basic read and write to verify the final delta-standalone jar is working") { - val dir = Files.createTempDirectory(UUID.randomUUID().toString).toFile - try { - val tablePath = io.delta.golden.GoldenTableUtils.goldenTableFile("data-reader-primitives") - FileUtils.copyDirectory(tablePath, dir) - val log = DeltaLog.forTable(new Configuration(), dir.getCanonicalPath) - log.asInstanceOf[DeltaLogImpl].checkpoint() - log.startTransaction().commit( - Collections.emptyList(), - new Operation(Operation.Name.WRITE), - "engineInfo") - val iter = log.snapshot().open() - try { - assert(iter.asScala.size == 11) - } finally { - iter.close() - } - } finally { - FileUtils.deleteDirectory(dir) - } - } -} From a54d2a0f1744b3a8bd05d72a396d617976166c98 Mon Sep 17 00:00:00 2001 From: Allison Portis Date: Tue, 2 Dec 2025 18:08:17 -0800 Subject: [PATCH 2/3] Update build.sbt --- build.sbt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/build.sbt b/build.sbt index 71d933af0a4..add96f8d7c4 100644 --- a/build.sbt +++ b/build.sbt @@ -1010,8 +1010,6 @@ lazy val storageS3DynamoDB = (project in file("storage-s3-dynamodb")) ) ).configureUnidoc() -/* -TODO: re-add iceberg on Spark 4.0+ val icebergSparkRuntimeArtifactName = { val (expMaj, expMin, _) = getMajorMinorPatch(defaultSparkVersion) s"iceberg-spark-runtime-$expMaj.$expMin" @@ -1167,7 +1165,6 @@ lazy val icebergShaded = (project in file("icebergShaded")) assembly / assemblyMergeStrategy := updateMergeStrategy((assembly / assemblyMergeStrategy).value), assemblyPackageScala / assembleArtifact := false, ) - */ lazy val hudi = (project in file("hudi")) .dependsOn(spark % "compile->compile;test->test;provided->provided") @@ -1276,7 +1273,6 @@ lazy val sparkGroup = project publish / skip := false, ) -/* lazy val icebergGroup = project .aggregate(iceberg, testDeltaIcebergJar) .settings( @@ -1285,7 +1281,6 @@ lazy val icebergGroup = project publishArtifact := false, publish / skip := false, ) -*/ lazy val kernelGroup = project .aggregate(kernelApi, kernelDefaults, kernelBenchmarks) From 9f0ed8b5450c17dc8e6c97d07f0344568aea7e01 Mon Sep 17 00:00:00 2001 From: Allison Portis Date: Tue, 2 Dec 2025 18:38:27 -0800 Subject: [PATCH 3/3] No standalone jar expected --- project/tests/test_cross_spark_publish.py | 1 - 1 file changed, 1 deletion(-) diff --git a/project/tests/test_cross_spark_publish.py b/project/tests/test_cross_spark_publish.py index 5541f1cd349..9a317b8c207 100755 --- a/project/tests/test_cross_spark_publish.py +++ b/project/tests/test_cross_spark_publish.py @@ -42,7 +42,6 @@ NON_SPARK_RELATED_JAR_TEMPLATES = [ # Scala modules "delta-hudi_2.13-{version}.jar", - "delta-standalone_2.13-{version}.jar", # Java-only modules (no Scala version) "delta-storage-{version}.jar",