From 36dba537effa2991ab346ba1988e87cc4cf92ae3 Mon Sep 17 00:00:00 2001 From: Ruihang Xia Date: Sat, 10 Feb 2024 23:53:26 +0800 Subject: [PATCH 01/11] feat: replace std Instant with wasm-compatible wrapper Signed-off-by: Ruihang Xia --- Cargo.toml | 1 + datafusion/core/Cargo.toml | 1 + datafusion/core/benches/parquet_query_sql.rs | 2 +- datafusion/core/src/datasource/physical_plan/file_stream.rs | 2 +- datafusion/optimizer/Cargo.toml | 1 + datafusion/optimizer/src/analyzer/mod.rs | 2 +- datafusion/optimizer/src/optimizer.rs | 2 +- datafusion/physical-plan/Cargo.toml | 1 + datafusion/physical-plan/src/analyze.rs | 4 +++- datafusion/physical-plan/src/metrics/value.rs | 4 +++- 10 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e99618dd9f9e..1fa2aa674594 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -63,6 +63,7 @@ env_logger = "0.11" futures = "0.3" half = "2.2.1" indexmap = "2.0.0" +instant = { version = "0.1.12", features = ["wasm-bindgen"] } itertools = "0.12" log = "^0.4" num_cpus = "1.13.0" diff --git a/datafusion/core/Cargo.toml b/datafusion/core/Cargo.toml index 2d795d0f8369..bda5e0a4c9fe 100644 --- a/datafusion/core/Cargo.toml +++ b/datafusion/core/Cargo.toml @@ -79,6 +79,7 @@ glob = "0.3.0" half = { version = "2.1", default-features = false } hashbrown = { version = "0.14", features = ["raw"] } indexmap = { workspace = true } +instant = { workspace = true } itertools = { workspace = true } log = { workspace = true } num-traits = { version = "0.2", optional = true } diff --git a/datafusion/core/benches/parquet_query_sql.rs b/datafusion/core/benches/parquet_query_sql.rs index 6c9ab315761e..22acbcd87e4a 100644 --- a/datafusion/core/benches/parquet_query_sql.rs +++ b/datafusion/core/benches/parquet_query_sql.rs @@ -26,6 +26,7 @@ use arrow::record_batch::RecordBatch; use criterion::{criterion_group, criterion_main, Criterion}; use datafusion::prelude::{SessionConfig, SessionContext}; use futures::stream::StreamExt; +use instant::Instant; use parquet::arrow::ArrowWriter; use parquet::file::properties::{WriterProperties, WriterVersion}; use rand::distributions::uniform::SampleUniform; @@ -36,7 +37,6 @@ use std::io::Read; use std::ops::Range; use std::path::Path; use std::sync::Arc; -use std::time::Instant; use tempfile::NamedTempFile; /// The number of batches to write diff --git a/datafusion/core/src/datasource/physical_plan/file_stream.rs b/datafusion/core/src/datasource/physical_plan/file_stream.rs index 9cb58e7032db..f8e90bacabc6 100644 --- a/datafusion/core/src/datasource/physical_plan/file_stream.rs +++ b/datafusion/core/src/datasource/physical_plan/file_stream.rs @@ -21,11 +21,11 @@ //! Note: Most traits here need to be marked `Sync + Send` to be //! compliant with the `SendableRecordBatchStream` trait. +use instant::Instant; use std::collections::VecDeque; use std::mem; use std::pin::Pin; use std::task::{Context, Poll}; -use std::time::Instant; use crate::datasource::listing::PartitionedFile; use crate::datasource::physical_plan::{ diff --git a/datafusion/optimizer/Cargo.toml b/datafusion/optimizer/Cargo.toml index e4e9660f93b4..c1d1b591b36d 100644 --- a/datafusion/optimizer/Cargo.toml +++ b/datafusion/optimizer/Cargo.toml @@ -46,6 +46,7 @@ datafusion-common = { workspace = true } datafusion-expr = { workspace = true } datafusion-physical-expr = { path = "../physical-expr", version = "35.0.0", default-features = false } hashbrown = { version = "0.14", features = ["raw"] } +instant = { workspace = true } itertools = { workspace = true } log = { workspace = true } regex-syntax = "0.8.0" diff --git a/datafusion/optimizer/src/analyzer/mod.rs b/datafusion/optimizer/src/analyzer/mod.rs index 9d47299a5616..c50fbb467112 100644 --- a/datafusion/optimizer/src/analyzer/mod.rs +++ b/datafusion/optimizer/src/analyzer/mod.rs @@ -34,9 +34,9 @@ use datafusion_expr::expr::Exists; use datafusion_expr::expr::InSubquery; use datafusion_expr::utils::inspect_expr_pre; use datafusion_expr::{Expr, LogicalPlan}; +use instant::Instant; use log::debug; use std::sync::Arc; -use std::time::Instant; use self::rewrite_expr::OperatorToFunction; diff --git a/datafusion/optimizer/src/optimizer.rs b/datafusion/optimizer/src/optimizer.rs index 633a32996d1c..50dd995229ad 100644 --- a/datafusion/optimizer/src/optimizer.rs +++ b/datafusion/optimizer/src/optimizer.rs @@ -17,9 +17,9 @@ //! Query optimizer traits +use instant::Instant; use std::collections::HashSet; use std::sync::Arc; -use std::time::Instant; use crate::common_subexpr_eliminate::CommonSubexprEliminate; use crate::decorrelate_predicate_subquery::DecorrelatePredicateSubquery; diff --git a/datafusion/physical-plan/Cargo.toml b/datafusion/physical-plan/Cargo.toml index 1c638d9c184e..b90ebce0ee71 100644 --- a/datafusion/physical-plan/Cargo.toml +++ b/datafusion/physical-plan/Cargo.toml @@ -50,6 +50,7 @@ futures = { workspace = true } half = { version = "2.1", default-features = false } hashbrown = { version = "0.14", features = ["raw"] } indexmap = { workspace = true } +instant = { workspace = true } itertools = { version = "0.12", features = ["use_std"] } log = { workspace = true } once_cell = "1.18.0" diff --git a/datafusion/physical-plan/src/analyze.rs b/datafusion/physical-plan/src/analyze.rs index 4f1578e220dd..73a01d0598fe 100644 --- a/datafusion/physical-plan/src/analyze.rs +++ b/datafusion/physical-plan/src/analyze.rs @@ -17,8 +17,10 @@ //! Defines the ANALYZE operator +use std::any::Any; use std::sync::Arc; -use std::{any::Any, time::Instant}; + +use instant::Instant; use super::expressions::PhysicalSortExpr; use super::stream::{RecordBatchReceiverStream, RecordBatchStreamAdapter}; diff --git a/datafusion/physical-plan/src/metrics/value.rs b/datafusion/physical-plan/src/metrics/value.rs index 899ceb60b49f..6efafc7f7c6a 100644 --- a/datafusion/physical-plan/src/metrics/value.rs +++ b/datafusion/physical-plan/src/metrics/value.rs @@ -24,9 +24,11 @@ use std::{ atomic::{AtomicUsize, Ordering}, Arc, }, - time::{Duration, Instant}, + time::Duration, }; +use instant::Instant; + use parking_lot::Mutex; use chrono::{DateTime, Utc}; From 4394ad88ff4ab1faeacc674a9cc43e350fabab5d Mon Sep 17 00:00:00 2001 From: Ruihang Xia Date: Sun, 11 Feb 2024 00:08:26 +0800 Subject: [PATCH 02/11] update cli's lock file Signed-off-by: Ruihang Xia --- datafusion-cli/Cargo.lock | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/datafusion-cli/Cargo.lock b/datafusion-cli/Cargo.lock index 072898cda46d..9cbc93670f27 100644 --- a/datafusion-cli/Cargo.lock +++ b/datafusion-cli/Cargo.lock @@ -1126,6 +1126,7 @@ dependencies = [ "half", "hashbrown 0.14.3", "indexmap 2.2.2", + "instant", "itertools", "log", "num-traits", @@ -1249,6 +1250,7 @@ dependencies = [ "datafusion-expr", "datafusion-physical-expr", "hashbrown 0.14.3", + "instant", "itertools", "log", "regex-syntax", @@ -1307,6 +1309,7 @@ dependencies = [ "half", "hashbrown 0.14.3", "indexmap 2.2.2", + "instant", "itertools", "log", "once_cell", @@ -1910,6 +1913,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", ] [[package]] From a556ae65b5a72e77cca3e2e999d3a54cdc728aa6 Mon Sep 17 00:00:00 2001 From: Ruihang Xia Date: Sun, 18 Feb 2024 19:58:56 +0800 Subject: [PATCH 03/11] wrap instant in datafusion_common Signed-off-by: Ruihang Xia --- Cargo.toml | 1 - datafusion/common/Cargo.toml | 3 +++ datafusion/common/src/lib.rs | 1 + datafusion/common/src/wasm.rs | 27 +++++++++++++++++++ datafusion/core/Cargo.toml | 2 +- datafusion/core/benches/parquet_query_sql.rs | 2 +- .../datasource/physical_plan/file_stream.rs | 2 +- datafusion/optimizer/Cargo.toml | 1 - datafusion/optimizer/src/analyzer/mod.rs | 2 +- datafusion/optimizer/src/optimizer.rs | 2 +- datafusion/physical-plan/Cargo.toml | 1 - datafusion/physical-plan/src/analyze.rs | 3 +-- datafusion/physical-plan/src/metrics/value.rs | 6 ++--- 13 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 datafusion/common/src/wasm.rs diff --git a/Cargo.toml b/Cargo.toml index 1fa2aa674594..e99618dd9f9e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -63,7 +63,6 @@ env_logger = "0.11" futures = "0.3" half = "2.2.1" indexmap = "2.0.0" -instant = { version = "0.1.12", features = ["wasm-bindgen"] } itertools = "0.12" log = "^0.4" num_cpus = "1.13.0" diff --git a/datafusion/common/Cargo.toml b/datafusion/common/Cargo.toml index b69e1f7f3d10..7ad0ca7105ee 100644 --- a/datafusion/common/Cargo.toml +++ b/datafusion/common/Cargo.toml @@ -60,5 +60,8 @@ parquet = { workspace = true, optional = true, default-features = true } pyo3 = { version = "0.20.0", optional = true } sqlparser = { workspace = true } +[target.wasm32-unknown-unknown.dependencies] +instant = { version = "0.1", optional = true, features = ["wasm-bindgen"] } + [dev-dependencies] rand = "0.8.4" diff --git a/datafusion/common/src/lib.rs b/datafusion/common/src/lib.rs index ed547782e4a5..5f8232afa339 100644 --- a/datafusion/common/src/lib.rs +++ b/datafusion/common/src/lib.rs @@ -41,6 +41,7 @@ pub mod stats; pub mod test_util; pub mod tree_node; pub mod utils; +pub mod wasm; /// Reexport arrow crate pub use arrow; diff --git a/datafusion/common/src/wasm.rs b/datafusion/common/src/wasm.rs new file mode 100644 index 000000000000..ed5b86be9bf2 --- /dev/null +++ b/datafusion/common/src/wasm.rs @@ -0,0 +1,27 @@ +// 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. + +//! WASM-related utilities + +#[cfg(target_family = "wasm")] +/// DataFusion wrapper around [`std::time::Instant`]. Uses [`instant::Instant`] +/// under `wasm` feature gate. It provides the same API as [`std::time::Instant`]. +pub type Instant = instant::Instant; + +#[cfg(not(target_family = "wasm"))] +/// DataFusion wrapper around [`std::time::Instant`]. This is only a type alias. +pub type Instant = std::time::Instant; diff --git a/datafusion/core/Cargo.toml b/datafusion/core/Cargo.toml index bda5e0a4c9fe..de98d4de88cc 100644 --- a/datafusion/core/Cargo.toml +++ b/datafusion/core/Cargo.toml @@ -79,7 +79,6 @@ glob = "0.3.0" half = { version = "2.1", default-features = false } hashbrown = { version = "0.14", features = ["raw"] } indexmap = { workspace = true } -instant = { workspace = true } itertools = { workspace = true } log = { workspace = true } num-traits = { version = "0.2", optional = true } @@ -119,6 +118,7 @@ test-utils = { path = "../../test-utils" } thiserror = { workspace = true } tokio = { version = "1.28", features = ["macros", "rt", "rt-multi-thread", "sync", "fs", "parking_lot"] } tokio-postgres = "0.7.7" + [target.'cfg(not(target_os = "windows"))'.dev-dependencies] nix = { version = "0.27.1", features = ["fs"] } diff --git a/datafusion/core/benches/parquet_query_sql.rs b/datafusion/core/benches/parquet_query_sql.rs index 22acbcd87e4a..a86f0b72a30b 100644 --- a/datafusion/core/benches/parquet_query_sql.rs +++ b/datafusion/core/benches/parquet_query_sql.rs @@ -25,8 +25,8 @@ use arrow::datatypes::{ use arrow::record_batch::RecordBatch; use criterion::{criterion_group, criterion_main, Criterion}; use datafusion::prelude::{SessionConfig, SessionContext}; +use datafusion_common::wasm::Instant; use futures::stream::StreamExt; -use instant::Instant; use parquet::arrow::ArrowWriter; use parquet::file::properties::{WriterProperties, WriterVersion}; use rand::distributions::uniform::SampleUniform; diff --git a/datafusion/core/src/datasource/physical_plan/file_stream.rs b/datafusion/core/src/datasource/physical_plan/file_stream.rs index f8e90bacabc6..c0fefc4a6155 100644 --- a/datafusion/core/src/datasource/physical_plan/file_stream.rs +++ b/datafusion/core/src/datasource/physical_plan/file_stream.rs @@ -21,7 +21,6 @@ //! Note: Most traits here need to be marked `Sync + Send` to be //! compliant with the `SendableRecordBatchStream` trait. -use instant::Instant; use std::collections::VecDeque; use std::mem; use std::pin::Pin; @@ -40,6 +39,7 @@ use crate::physical_plan::RecordBatchStream; use arrow::datatypes::SchemaRef; use arrow::error::ArrowError; use arrow::record_batch::RecordBatch; +use datafusion_common::wasm::Instant; use datafusion_common::ScalarValue; use futures::future::BoxFuture; diff --git a/datafusion/optimizer/Cargo.toml b/datafusion/optimizer/Cargo.toml index c1d1b591b36d..e4e9660f93b4 100644 --- a/datafusion/optimizer/Cargo.toml +++ b/datafusion/optimizer/Cargo.toml @@ -46,7 +46,6 @@ datafusion-common = { workspace = true } datafusion-expr = { workspace = true } datafusion-physical-expr = { path = "../physical-expr", version = "35.0.0", default-features = false } hashbrown = { version = "0.14", features = ["raw"] } -instant = { workspace = true } itertools = { workspace = true } log = { workspace = true } regex-syntax = "0.8.0" diff --git a/datafusion/optimizer/src/analyzer/mod.rs b/datafusion/optimizer/src/analyzer/mod.rs index c50fbb467112..735919f9d722 100644 --- a/datafusion/optimizer/src/analyzer/mod.rs +++ b/datafusion/optimizer/src/analyzer/mod.rs @@ -29,12 +29,12 @@ use crate::analyzer::type_coercion::TypeCoercion; use crate::utils::log_plan; use datafusion_common::config::ConfigOptions; use datafusion_common::tree_node::{TreeNode, VisitRecursion}; +use datafusion_common::wasm::Instant; use datafusion_common::{DataFusionError, Result}; use datafusion_expr::expr::Exists; use datafusion_expr::expr::InSubquery; use datafusion_expr::utils::inspect_expr_pre; use datafusion_expr::{Expr, LogicalPlan}; -use instant::Instant; use log::debug; use std::sync::Arc; diff --git a/datafusion/optimizer/src/optimizer.rs b/datafusion/optimizer/src/optimizer.rs index 50dd995229ad..3f3b1033a32b 100644 --- a/datafusion/optimizer/src/optimizer.rs +++ b/datafusion/optimizer/src/optimizer.rs @@ -17,7 +17,6 @@ //! Query optimizer traits -use instant::Instant; use std::collections::HashSet; use std::sync::Arc; @@ -48,6 +47,7 @@ use crate::utils::log_plan; use datafusion_common::alias::AliasGenerator; use datafusion_common::config::ConfigOptions; +use datafusion_common::wasm::Instant; use datafusion_common::{DataFusionError, Result}; use datafusion_expr::logical_plan::LogicalPlan; diff --git a/datafusion/physical-plan/Cargo.toml b/datafusion/physical-plan/Cargo.toml index b90ebce0ee71..1c638d9c184e 100644 --- a/datafusion/physical-plan/Cargo.toml +++ b/datafusion/physical-plan/Cargo.toml @@ -50,7 +50,6 @@ futures = { workspace = true } half = { version = "2.1", default-features = false } hashbrown = { version = "0.14", features = ["raw"] } indexmap = { workspace = true } -instant = { workspace = true } itertools = { version = "0.12", features = ["use_std"] } log = { workspace = true } once_cell = "1.18.0" diff --git a/datafusion/physical-plan/src/analyze.rs b/datafusion/physical-plan/src/analyze.rs index 73a01d0598fe..32ea5c9f1415 100644 --- a/datafusion/physical-plan/src/analyze.rs +++ b/datafusion/physical-plan/src/analyze.rs @@ -20,8 +20,6 @@ use std::any::Any; use std::sync::Arc; -use instant::Instant; - use super::expressions::PhysicalSortExpr; use super::stream::{RecordBatchReceiverStream, RecordBatchStreamAdapter}; use super::{DisplayAs, Distribution, SendableRecordBatchStream}; @@ -30,6 +28,7 @@ use crate::display::DisplayableExecutionPlan; use crate::{DisplayFormatType, ExecutionPlan, Partitioning}; use arrow::{array::StringBuilder, datatypes::SchemaRef, record_batch::RecordBatch}; +use datafusion_common::wasm::Instant; use datafusion_common::{internal_err, DataFusionError, Result}; use datafusion_execution::TaskContext; diff --git a/datafusion/physical-plan/src/metrics/value.rs b/datafusion/physical-plan/src/metrics/value.rs index 6efafc7f7c6a..5e10813f72f9 100644 --- a/datafusion/physical-plan/src/metrics/value.rs +++ b/datafusion/physical-plan/src/metrics/value.rs @@ -27,11 +27,9 @@ use std::{ time::Duration, }; -use instant::Instant; - -use parking_lot::Mutex; - use chrono::{DateTime, Utc}; +use datafusion_common::wasm::Instant; +use parking_lot::Mutex; /// A counter to record things such as number of input or output rows /// From 63872b2488cd40d8378a11d91abc9b3ba7b6b7d2 Mon Sep 17 00:00:00 2001 From: Ruihang Xia Date: Sun, 18 Feb 2024 21:40:19 +0800 Subject: [PATCH 04/11] write unit test Signed-off-by: Ruihang Xia --- datafusion/common/Cargo.toml | 4 +- datafusion/wasmtest/Cargo.toml | 7 +++ datafusion/wasmtest/README.md | 26 +++++++- .../wasmtest/datafusion-wasm-app/index.js | 3 +- datafusion/wasmtest/src/lib.rs | 59 ++++++++++++++++++- 5 files changed, 92 insertions(+), 7 deletions(-) diff --git a/datafusion/common/Cargo.toml b/datafusion/common/Cargo.toml index 7ad0ca7105ee..7b1a1586ba62 100644 --- a/datafusion/common/Cargo.toml +++ b/datafusion/common/Cargo.toml @@ -60,8 +60,8 @@ parquet = { workspace = true, optional = true, default-features = true } pyo3 = { version = "0.20.0", optional = true } sqlparser = { workspace = true } -[target.wasm32-unknown-unknown.dependencies] -instant = { version = "0.1", optional = true, features = ["wasm-bindgen"] } +[target.'cfg(target_family = "wasm")'.dependencies] +instant = { version = "0.1", features = ["wasm-bindgen"] } [dev-dependencies] rand = "0.8.4" diff --git a/datafusion/wasmtest/Cargo.toml b/datafusion/wasmtest/Cargo.toml index c47dcf83c84b..5b7f16eb6b54 100644 --- a/datafusion/wasmtest/Cargo.toml +++ b/datafusion/wasmtest/Cargo.toml @@ -49,5 +49,12 @@ datafusion-sql = { workspace = true } # getrandom must be compiled with js feature getrandom = { version = "0.2.8", features = ["js"] } +# chrono must be compiled with wasmbind feature +chrono = { version = "0.4", features = ["wasmbind"] } + parquet = { workspace = true } wasm-bindgen = "0.2.87" +wasm-bindgen-futures = "0.4.40" + +[dev-dependencies] +wasm-bindgen-test = "0.3" diff --git a/datafusion/wasmtest/README.md b/datafusion/wasmtest/README.md index 4af0f94db9e9..2e525ee909f3 100644 --- a/datafusion/wasmtest/README.md +++ b/datafusion/wasmtest/README.md @@ -36,7 +36,7 @@ First, [install wasm-pack](https://rustwasm.github.io/wasm-pack/installer/) Then use wasm-pack to compile the crate from within this directory -``` +```shell wasm-pack build ``` @@ -46,14 +46,34 @@ The `datafusion-wasm-app` directory contains a simple app (created with [`create From within the `datafusion/wasmtest/datafusion-wasm-app` directory: -``` +```shell npm install npm run start ``` Then open http://localhost:8080/ in a web browser and check the console to see the results of using various DataFusion crates. -**Note:** In GitHub Actions we test the compilation with `wasm-build`, but we don't currently invoke `datafusion-wasm-app`. In the future we may want to test the behavior of the WASM build using [`wasm-pack test`](https://rustwasm.github.io/wasm-pack/book/tutorials/npm-browser-packages/testing-your-project.html). +## Test + +This crate uses `wasm-pack test` to run tests. Try it out with one of the following commands depending on your browser of choice: + +```shell +wasm-pack test --firefox +wasm-pack test --chrome +wasm-pack test --safari +``` + +To run the tests in headless mode, add the `--headless` flag: + +```shell +wasm-pack test --headless --firefox +wasm-pack test --headless --chrome +wasm-pack test --headless --safari +``` + +**Note:** In GitHub Actions we test the compilation with `wasm-build`, but we don't currently invoke `wasm-pack test`. This is because the headless mode is not yet working. Document of adding a GitHub Action job: https://rustwasm.github.io/docs/wasm-bindgen/wasm-bindgen-test/continuous-integration.html#github-actions. + +To tweak timeout setting, use `WASM_BINDGEN_TEST_TIMEOUT` environment variable. E.g., `WASM_BINDGEN_TEST_TIMEOUT=300 wasm-pack test --firefox --headless`. ## Compatibility diff --git a/datafusion/wasmtest/datafusion-wasm-app/index.js b/datafusion/wasmtest/datafusion-wasm-app/index.js index 7ee31b7d3802..f51cb3081a34 100644 --- a/datafusion/wasmtest/datafusion-wasm-app/index.js +++ b/datafusion/wasmtest/datafusion-wasm-app/index.js @@ -17,4 +17,5 @@ import * as wasm from "datafusion-wasmtest"; -wasm.try_datafusion(); +wasm.basic_exprs(); +wasm.basic_parse(); diff --git a/datafusion/wasmtest/src/lib.rs b/datafusion/wasmtest/src/lib.rs index 5bf9a18f8c6e..351518c5072b 100644 --- a/datafusion/wasmtest/src/lib.rs +++ b/datafusion/wasmtest/src/lib.rs @@ -44,7 +44,7 @@ extern "C" { } #[wasm_bindgen] -pub fn try_datafusion() { +pub fn basic_exprs() { set_panic_hook(); // Create a scalar value (from datafusion-common) let scalar = ScalarValue::from("Hello, World!"); @@ -61,10 +61,67 @@ pub fn try_datafusion() { ExprSimplifier::new(SimplifyContext::new(&execution_props).with_schema(schema)); let simplified_expr = simplifier.simplify(expr).unwrap(); log(&format!("Simplified Expr: {simplified_expr:?}")); +} +#[wasm_bindgen] +pub fn basic_parse() { // Parse SQL (using datafusion-sql) let sql = "SELECT 2 + 37"; let dialect = GenericDialect {}; // or AnsiDialect, or your own dialect ... let ast = Parser::parse_sql(&dialect, sql).unwrap(); log(&format!("Parsed SQL: {ast:?}")); } + +#[cfg(test)] +mod test { + use super::*; + use datafusion::execution::context::SessionContext; + use datafusion_execution::{ + config::SessionConfig, + disk_manager::DiskManagerConfig, + runtime_env::{RuntimeConfig, RuntimeEnv}, + }; + use datafusion_physical_plan::collect; + use datafusion_sql::parser::DFParser; + use wasm_bindgen_test::wasm_bindgen_test; + + wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser); + + #[wasm_bindgen_test] + fn datafusion_test() { + basic_exprs(); + basic_parse(); + } + + #[wasm_bindgen_test] + async fn basic_execute() { + let sql = "SELECT 2 + 2;"; + + // Execute SQL (using datafusion) + let rt = Arc::new( + RuntimeEnv::new( + RuntimeConfig::new().with_disk_manager(DiskManagerConfig::Disabled), + ) + .unwrap(), + ); + let session_config = SessionConfig::new().with_target_partitions(1); + let session_context = + Arc::new(SessionContext::new_with_config_rt(session_config, rt)); + + let statement = DFParser::parse_sql(&sql).unwrap().pop_back().unwrap(); + + let logical_plan = session_context + .state() + .statement_to_plan(statement) + .await + .unwrap(); + let data_frame = session_context + .execute_logical_plan(logical_plan) + .await + .unwrap(); + let physical_plan = data_frame.create_physical_plan().await.unwrap(); + + let task_ctx = session_context.task_ctx(); + let _ = collect(physical_plan, task_ctx).await.unwrap(); + } +} From 7e3bf084d4d6360c75762c7311f12b4be01b3115 Mon Sep 17 00:00:00 2001 From: Ruihang Xia Date: Sun, 18 Feb 2024 21:47:52 +0800 Subject: [PATCH 05/11] update lock file Signed-off-by: Ruihang Xia --- datafusion-cli/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datafusion-cli/Cargo.lock b/datafusion-cli/Cargo.lock index 1a6e01304be6..a4a70540c8ce 100644 --- a/datafusion-cli/Cargo.lock +++ b/datafusion-cli/Cargo.lock @@ -1186,6 +1186,7 @@ dependencies = [ "arrow-schema", "chrono", "half", + "instant", "libc", "num_cpus", "object_store", @@ -1262,7 +1263,6 @@ dependencies = [ "datafusion-expr", "datafusion-physical-expr", "hashbrown 0.14.3", - "instant", "itertools", "log", "regex-syntax", From cb162523ba63447469e669dccbee5c61b53a91d9 Mon Sep 17 00:00:00 2001 From: Ruihang Xia Date: Sun, 18 Feb 2024 22:02:14 +0800 Subject: [PATCH 06/11] format toml Signed-off-by: Ruihang Xia --- Cargo.toml | 2 +- datafusion/wasmtest/Cargo.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 31c0005d582d..29b51189c7d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ [workspace] exclude = ["datafusion-cli"] -members = ["datafusion/common", "datafusion/core", "datafusion/expr", "datafusion/execution", "datafusion/functions", "datafusion/functions-array", "datafusion/optimizer", "datafusion/physical-expr", "datafusion/physical-plan", "datafusion/proto", "datafusion/proto/gen", "datafusion/sql", "datafusion/sqllogictest", "datafusion/substrait", "datafusion/wasmtest", "datafusion-examples", "docs", "test-utils", "benchmarks", +members = ["datafusion/common", "datafusion/core", "datafusion/expr", "datafusion/execution", "datafusion/functions", "datafusion/functions-array", "datafusion/optimizer", "datafusion/physical-expr", "datafusion/physical-plan", "datafusion/proto", "datafusion/proto/gen", "datafusion/sql", "datafusion/sqllogictest", "datafusion/substrait", "datafusion/wasmtest", "datafusion-examples", "docs", "test-utils", "benchmarks", ] resolver = "2" diff --git a/datafusion/wasmtest/Cargo.toml b/datafusion/wasmtest/Cargo.toml index 5b7f16eb6b54..ed5dcc21a22c 100644 --- a/datafusion/wasmtest/Cargo.toml +++ b/datafusion/wasmtest/Cargo.toml @@ -31,6 +31,8 @@ rust-version = { workspace = true } crate-type = ["cdylib", "rlib"] [dependencies] +# chrono must be compiled with wasmbind feature +chrono = { version = "0.4", features = ["wasmbind"] } # The `console_error_panic_hook` crate provides better debugging of panics by # logging them with `console.error`. This is great for development, but requires @@ -49,8 +51,6 @@ datafusion-sql = { workspace = true } # getrandom must be compiled with js feature getrandom = { version = "0.2.8", features = ["js"] } -# chrono must be compiled with wasmbind feature -chrono = { version = "0.4", features = ["wasmbind"] } parquet = { workspace = true } wasm-bindgen = "0.2.87" From d19c1ef32a0ea6b6d3c4e98fb28d33d2aac5e7d6 Mon Sep 17 00:00:00 2001 From: Ruihang Xia Date: Mon, 19 Feb 2024 00:29:25 +0800 Subject: [PATCH 07/11] Update datafusion/wasmtest/src/lib.rs --- datafusion/wasmtest/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datafusion/wasmtest/src/lib.rs b/datafusion/wasmtest/src/lib.rs index 351518c5072b..86e29420e8e6 100644 --- a/datafusion/wasmtest/src/lib.rs +++ b/datafusion/wasmtest/src/lib.rs @@ -108,7 +108,7 @@ mod test { let session_context = Arc::new(SessionContext::new_with_config_rt(session_config, rt)); - let statement = DFParser::parse_sql(&sql).unwrap().pop_back().unwrap(); + let statement = DFParser::parse_sql(sql).unwrap().pop_back().unwrap(); let logical_plan = session_context .state() From edb67fae06bbddb080fae7e6b57b97d5236f8c56 Mon Sep 17 00:00:00 2001 From: Ruihang Xia Date: Wed, 28 Feb 2024 11:50:04 +0800 Subject: [PATCH 08/11] add clippy lint to prevent from using std Instant Signed-off-by: Ruihang Xia --- benchmarks/src/clickbench.rs | 3 ++- benchmarks/src/parquet_filter.rs | 2 +- benchmarks/src/sort.rs | 2 +- benchmarks/src/tpch/convert.rs | 2 +- benchmarks/src/tpch/run.rs | 2 +- clippy.toml | 4 ++++ datafusion/common/src/wasm.rs | 1 + 7 files changed, 11 insertions(+), 5 deletions(-) diff --git a/benchmarks/src/clickbench.rs b/benchmarks/src/clickbench.rs index 69a650a106c7..398e9d23c820 100644 --- a/benchmarks/src/clickbench.rs +++ b/benchmarks/src/clickbench.rs @@ -16,13 +16,14 @@ // under the License. use std::path::Path; -use std::{path::PathBuf, time::Instant}; +use std::path::PathBuf; use datafusion::{ error::{DataFusionError, Result}, prelude::SessionContext, }; use datafusion_common::exec_datafusion_err; +use datafusion_common::wasm::Instant; use structopt::StructOpt; use crate::{BenchmarkRun, CommonOpt}; diff --git a/benchmarks/src/parquet_filter.rs b/benchmarks/src/parquet_filter.rs index 1d816908e2b0..20e92c5d0dc3 100644 --- a/benchmarks/src/parquet_filter.rs +++ b/benchmarks/src/parquet_filter.rs @@ -24,8 +24,8 @@ use datafusion::logical_expr::{lit, or, Expr}; use datafusion::physical_plan::collect; use datafusion::prelude::{col, SessionContext}; use datafusion::test_util::parquet::{ParquetScanOptions, TestParquetFile}; +use datafusion_common::wasm::Instant; use std::path::PathBuf; -use std::time::Instant; use structopt::StructOpt; /// Test performance of parquet filter pushdown diff --git a/benchmarks/src/sort.rs b/benchmarks/src/sort.rs index 224f2b19c72e..233e2b91e66f 100644 --- a/benchmarks/src/sort.rs +++ b/benchmarks/src/sort.rs @@ -25,9 +25,9 @@ use datafusion::physical_plan::collect; use datafusion::physical_plan::sorts::sort::SortExec; use datafusion::prelude::{SessionConfig, SessionContext}; use datafusion::test_util::parquet::TestParquetFile; +use datafusion_common::wasm::Instant; use std::path::PathBuf; use std::sync::Arc; -use std::time::Instant; use structopt::StructOpt; /// Test performance of sorting large datasets diff --git a/benchmarks/src/tpch/convert.rs b/benchmarks/src/tpch/convert.rs index 2fc74ce38888..97992be62534 100644 --- a/benchmarks/src/tpch/convert.rs +++ b/benchmarks/src/tpch/convert.rs @@ -15,9 +15,9 @@ // specific language governing permissions and limitations // under the License. +use datafusion_common::wasm::Instant; use std::fs; use std::path::{Path, PathBuf}; -use std::time::Instant; use datafusion::common::not_impl_err; use datafusion::error::DataFusionError; diff --git a/benchmarks/src/tpch/run.rs b/benchmarks/src/tpch/run.rs index 5193d578fb48..5fb8387dbb93 100644 --- a/benchmarks/src/tpch/run.rs +++ b/benchmarks/src/tpch/run.rs @@ -31,9 +31,9 @@ use datafusion::physical_plan::{collect, displayable}; use datafusion_common::{DEFAULT_CSV_EXTENSION, DEFAULT_PARQUET_EXTENSION}; use log::info; +use datafusion_common::wasm::Instant; use std::path::PathBuf; use std::sync::Arc; -use std::time::Instant; use datafusion::error::Result; use datafusion::prelude::*; diff --git a/clippy.toml b/clippy.toml index c6c754e440c7..6eb9906c89cf 100644 --- a/clippy.toml +++ b/clippy.toml @@ -2,3 +2,7 @@ disallowed-methods = [ { path = "tokio::task::spawn", reason = "To provide cancel-safety, use `SpawnedTask::spawn` instead (https://github.com/apache/arrow-datafusion/issues/6513)" }, { path = "tokio::task::spawn_blocking", reason = "To provide cancel-safety, use `SpawnedTask::spawn` instead (https://github.com/apache/arrow-datafusion/issues/6513)" }, ] + +disallowed-types = [ + { path = "std::time::Instant", reason = "Use `datafusion_common::instant::Instant` instead for WASM compatibility" }, +] diff --git a/datafusion/common/src/wasm.rs b/datafusion/common/src/wasm.rs index ed5b86be9bf2..47b76de001fe 100644 --- a/datafusion/common/src/wasm.rs +++ b/datafusion/common/src/wasm.rs @@ -22,6 +22,7 @@ /// under `wasm` feature gate. It provides the same API as [`std::time::Instant`]. pub type Instant = instant::Instant; +#[allow(clippy::disallowed_types)] #[cfg(not(target_family = "wasm"))] /// DataFusion wrapper around [`std::time::Instant`]. This is only a type alias. pub type Instant = std::time::Instant; From c823e3885b09a5df1e5508ab32813e3a7f17ca7a Mon Sep 17 00:00:00 2001 From: Ruihang Xia Date: Wed, 28 Feb 2024 11:57:35 +0800 Subject: [PATCH 09/11] rename mod name from wasm to instant Signed-off-by: Ruihang Xia --- benchmarks/src/clickbench.rs | 2 +- benchmarks/src/parquet_filter.rs | 2 +- benchmarks/src/sort.rs | 2 +- benchmarks/src/tpch/convert.rs | 2 +- benchmarks/src/tpch/run.rs | 2 +- datafusion/common/src/{wasm.rs => instant.rs} | 2 +- datafusion/common/src/lib.rs | 2 +- datafusion/core/benches/parquet_query_sql.rs | 2 +- datafusion/core/src/datasource/physical_plan/file_stream.rs | 2 +- datafusion/optimizer/src/analyzer/mod.rs | 2 +- datafusion/optimizer/src/optimizer.rs | 2 +- datafusion/physical-plan/src/analyze.rs | 2 +- datafusion/physical-plan/src/metrics/value.rs | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) rename datafusion/common/src/{wasm.rs => instant.rs} (96%) diff --git a/benchmarks/src/clickbench.rs b/benchmarks/src/clickbench.rs index 398e9d23c820..41dffc55f371 100644 --- a/benchmarks/src/clickbench.rs +++ b/benchmarks/src/clickbench.rs @@ -23,7 +23,7 @@ use datafusion::{ prelude::SessionContext, }; use datafusion_common::exec_datafusion_err; -use datafusion_common::wasm::Instant; +use datafusion_common::instant::Instant; use structopt::StructOpt; use crate::{BenchmarkRun, CommonOpt}; diff --git a/benchmarks/src/parquet_filter.rs b/benchmarks/src/parquet_filter.rs index 20e92c5d0dc3..eb9e09a7cb7c 100644 --- a/benchmarks/src/parquet_filter.rs +++ b/benchmarks/src/parquet_filter.rs @@ -24,7 +24,7 @@ use datafusion::logical_expr::{lit, or, Expr}; use datafusion::physical_plan::collect; use datafusion::prelude::{col, SessionContext}; use datafusion::test_util::parquet::{ParquetScanOptions, TestParquetFile}; -use datafusion_common::wasm::Instant; +use datafusion_common::instant::Instant; use std::path::PathBuf; use structopt::StructOpt; diff --git a/benchmarks/src/sort.rs b/benchmarks/src/sort.rs index 233e2b91e66f..bda0f4ae3f43 100644 --- a/benchmarks/src/sort.rs +++ b/benchmarks/src/sort.rs @@ -25,7 +25,7 @@ use datafusion::physical_plan::collect; use datafusion::physical_plan::sorts::sort::SortExec; use datafusion::prelude::{SessionConfig, SessionContext}; use datafusion::test_util::parquet::TestParquetFile; -use datafusion_common::wasm::Instant; +use datafusion_common::instant::Instant; use std::path::PathBuf; use std::sync::Arc; use structopt::StructOpt; diff --git a/benchmarks/src/tpch/convert.rs b/benchmarks/src/tpch/convert.rs index 97992be62534..294842ceed5b 100644 --- a/benchmarks/src/tpch/convert.rs +++ b/benchmarks/src/tpch/convert.rs @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -use datafusion_common::wasm::Instant; +use datafusion_common::instant::Instant; use std::fs; use std::path::{Path, PathBuf}; diff --git a/benchmarks/src/tpch/run.rs b/benchmarks/src/tpch/run.rs index 5fb8387dbb93..5497315fa3ba 100644 --- a/benchmarks/src/tpch/run.rs +++ b/benchmarks/src/tpch/run.rs @@ -31,7 +31,7 @@ use datafusion::physical_plan::{collect, displayable}; use datafusion_common::{DEFAULT_CSV_EXTENSION, DEFAULT_PARQUET_EXTENSION}; use log::info; -use datafusion_common::wasm::Instant; +use datafusion_common::instant::Instant; use std::path::PathBuf; use std::sync::Arc; diff --git a/datafusion/common/src/wasm.rs b/datafusion/common/src/instant.rs similarity index 96% rename from datafusion/common/src/wasm.rs rename to datafusion/common/src/instant.rs index 47b76de001fe..54d8db4fb4b0 100644 --- a/datafusion/common/src/wasm.rs +++ b/datafusion/common/src/instant.rs @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -//! WASM-related utilities +//! WASM-compatible `Instant` warpper. #[cfg(target_family = "wasm")] /// DataFusion wrapper around [`std::time::Instant`]. Uses [`instant::Instant`] diff --git a/datafusion/common/src/lib.rs b/datafusion/common/src/lib.rs index 5f8232afa339..ef77d25f1ec0 100644 --- a/datafusion/common/src/lib.rs +++ b/datafusion/common/src/lib.rs @@ -34,6 +34,7 @@ pub mod display; pub mod file_options; pub mod format; pub mod hash_utils; +pub mod instant; pub mod parsers; pub mod rounding; pub mod scalar; @@ -41,7 +42,6 @@ pub mod stats; pub mod test_util; pub mod tree_node; pub mod utils; -pub mod wasm; /// Reexport arrow crate pub use arrow; diff --git a/datafusion/core/benches/parquet_query_sql.rs b/datafusion/core/benches/parquet_query_sql.rs index a86f0b72a30b..bc4298786002 100644 --- a/datafusion/core/benches/parquet_query_sql.rs +++ b/datafusion/core/benches/parquet_query_sql.rs @@ -25,7 +25,7 @@ use arrow::datatypes::{ use arrow::record_batch::RecordBatch; use criterion::{criterion_group, criterion_main, Criterion}; use datafusion::prelude::{SessionConfig, SessionContext}; -use datafusion_common::wasm::Instant; +use datafusion_common::instant::Instant; use futures::stream::StreamExt; use parquet::arrow::ArrowWriter; use parquet::file::properties::{WriterProperties, WriterVersion}; diff --git a/datafusion/core/src/datasource/physical_plan/file_stream.rs b/datafusion/core/src/datasource/physical_plan/file_stream.rs index c0fefc4a6155..59d62aa8cc7a 100644 --- a/datafusion/core/src/datasource/physical_plan/file_stream.rs +++ b/datafusion/core/src/datasource/physical_plan/file_stream.rs @@ -39,7 +39,7 @@ use crate::physical_plan::RecordBatchStream; use arrow::datatypes::SchemaRef; use arrow::error::ArrowError; use arrow::record_batch::RecordBatch; -use datafusion_common::wasm::Instant; +use datafusion_common::instant::Instant; use datafusion_common::ScalarValue; use futures::future::BoxFuture; diff --git a/datafusion/optimizer/src/analyzer/mod.rs b/datafusion/optimizer/src/analyzer/mod.rs index 735919f9d722..4c480017fc3a 100644 --- a/datafusion/optimizer/src/analyzer/mod.rs +++ b/datafusion/optimizer/src/analyzer/mod.rs @@ -28,8 +28,8 @@ use crate::analyzer::subquery::check_subquery_expr; use crate::analyzer::type_coercion::TypeCoercion; use crate::utils::log_plan; use datafusion_common::config::ConfigOptions; +use datafusion_common::instant::Instant; use datafusion_common::tree_node::{TreeNode, VisitRecursion}; -use datafusion_common::wasm::Instant; use datafusion_common::{DataFusionError, Result}; use datafusion_expr::expr::Exists; use datafusion_expr::expr::InSubquery; diff --git a/datafusion/optimizer/src/optimizer.rs b/datafusion/optimizer/src/optimizer.rs index 3f3b1033a32b..c47f47bea3d5 100644 --- a/datafusion/optimizer/src/optimizer.rs +++ b/datafusion/optimizer/src/optimizer.rs @@ -47,7 +47,7 @@ use crate::utils::log_plan; use datafusion_common::alias::AliasGenerator; use datafusion_common::config::ConfigOptions; -use datafusion_common::wasm::Instant; +use datafusion_common::instant::Instant; use datafusion_common::{DataFusionError, Result}; use datafusion_expr::logical_plan::LogicalPlan; diff --git a/datafusion/physical-plan/src/analyze.rs b/datafusion/physical-plan/src/analyze.rs index 32ea5c9f1415..b16c9325ff8f 100644 --- a/datafusion/physical-plan/src/analyze.rs +++ b/datafusion/physical-plan/src/analyze.rs @@ -28,7 +28,7 @@ use crate::display::DisplayableExecutionPlan; use crate::{DisplayFormatType, ExecutionPlan, Partitioning}; use arrow::{array::StringBuilder, datatypes::SchemaRef, record_batch::RecordBatch}; -use datafusion_common::wasm::Instant; +use datafusion_common::instant::Instant; use datafusion_common::{internal_err, DataFusionError, Result}; use datafusion_execution::TaskContext; diff --git a/datafusion/physical-plan/src/metrics/value.rs b/datafusion/physical-plan/src/metrics/value.rs index 5e10813f72f9..ab87cd9e3780 100644 --- a/datafusion/physical-plan/src/metrics/value.rs +++ b/datafusion/physical-plan/src/metrics/value.rs @@ -28,7 +28,7 @@ use std::{ }; use chrono::{DateTime, Utc}; -use datafusion_common::wasm::Instant; +use datafusion_common::instant::Instant; use parking_lot::Mutex; /// A counter to record things such as number of input or output rows From d620e3214bbd0f7d44ea809dbcaeb8e68d371b8b Mon Sep 17 00:00:00 2001 From: Ruihang Xia Date: Wed, 28 Feb 2024 14:51:23 +0800 Subject: [PATCH 10/11] fix existing std instant reference Signed-off-by: Ruihang Xia --- datafusion-cli/src/command.rs | 2 +- datafusion-cli/src/exec.rs | 2 +- datafusion-cli/src/print_options.rs | 2 +- datafusion/core/tests/fifo.rs | 3 ++- datafusion/core/tests/parquet/filter_pushdown.rs | 3 +-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/datafusion-cli/src/command.rs b/datafusion-cli/src/command.rs index feef137e6195..a52c9d53bc25 100644 --- a/datafusion-cli/src/command.rs +++ b/datafusion-cli/src/command.rs @@ -28,11 +28,11 @@ use datafusion::arrow::record_batch::RecordBatch; use datafusion::common::exec_err; use datafusion::error::{DataFusionError, Result}; use datafusion::prelude::SessionContext; +use datafusion_common::instant::Instant; use std::fs::File; use std::io::BufReader; use std::str::FromStr; use std::sync::Arc; -use std::time::Instant; /// Command #[derive(Debug)] diff --git a/datafusion-cli/src/exec.rs b/datafusion-cli/src/exec.rs index d1e4a5b3638e..edeff16af12f 100644 --- a/datafusion-cli/src/exec.rs +++ b/datafusion-cli/src/exec.rs @@ -17,11 +17,11 @@ //! Execution functions +use datafusion_common::instant::Instant; use std::collections::HashMap; use std::fs::File; use std::io::prelude::*; use std::io::BufReader; -use std::time::Instant; use crate::print_format::PrintFormat; use crate::{ diff --git a/datafusion-cli/src/print_options.rs b/datafusion-cli/src/print_options.rs index f8cd9b3258ef..02cb0fb9c63e 100644 --- a/datafusion-cli/src/print_options.rs +++ b/datafusion-cli/src/print_options.rs @@ -15,11 +15,11 @@ // specific language governing permissions and limitations // under the License. +use datafusion_common::instant::Instant; use std::fmt::{Display, Formatter}; use std::io::Write; use std::pin::Pin; use std::str::FromStr; -use std::time::Instant; use crate::print_format::PrintFormat; diff --git a/datafusion/core/tests/fifo.rs b/datafusion/core/tests/fifo.rs index c9ad95a3a042..9b132f18c7a5 100644 --- a/datafusion/core/tests/fifo.rs +++ b/datafusion/core/tests/fifo.rs @@ -20,13 +20,14 @@ #[cfg(target_family = "unix")] #[cfg(test)] mod unix_test { + use datafusion_common::instant::Instant; use std::fs::{File, OpenOptions}; use std::io::Write; use std::path::PathBuf; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use std::thread; - use std::time::{Duration, Instant}; + use std::time::Duration; use arrow::array::Array; use arrow::csv::ReaderBuilder; diff --git a/datafusion/core/tests/parquet/filter_pushdown.rs b/datafusion/core/tests/parquet/filter_pushdown.rs index f214e8903a4f..64d3f45dee12 100644 --- a/datafusion/core/tests/parquet/filter_pushdown.rs +++ b/datafusion/core/tests/parquet/filter_pushdown.rs @@ -26,14 +26,13 @@ //! select * from data limit 10; //! ``` -use std::time::Instant; - use arrow::compute::concat_batches; use arrow::record_batch::RecordBatch; use datafusion::physical_plan::collect; use datafusion::physical_plan::metrics::MetricsSet; use datafusion::prelude::{col, lit, lit_timestamp_nano, Expr, SessionContext}; use datafusion::test_util::parquet::{ParquetScanOptions, TestParquetFile}; +use datafusion_common::instant::Instant; use datafusion_expr::utils::{conjunction, disjunction, split_conjunction}; use itertools::Itertools; use parquet::file::properties::WriterProperties; From ad0686afa9abe0c34f396ccebd0821cad3f61390 Mon Sep 17 00:00:00 2001 From: Ruihang Xia Date: Wed, 28 Feb 2024 20:22:02 +0800 Subject: [PATCH 11/11] Update datafusion/common/src/instant.rs Co-authored-by: Artem Medvedev --- datafusion/common/src/instant.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datafusion/common/src/instant.rs b/datafusion/common/src/instant.rs index 54d8db4fb4b0..6401bc29c942 100644 --- a/datafusion/common/src/instant.rs +++ b/datafusion/common/src/instant.rs @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -//! WASM-compatible `Instant` warpper. +//! WASM-compatible `Instant` wrapper. #[cfg(target_family = "wasm")] /// DataFusion wrapper around [`std::time::Instant`]. Uses [`instant::Instant`]