diff --git a/Cargo.lock b/Cargo.lock index 25648261a32..96cb6f6f53b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -317,6 +317,7 @@ dependencies = [ "arrow-schema", "flatbuffers", "lz4_flex", + "zstd", ] [[package]] @@ -1571,9 +1572,9 @@ dependencies = [ [[package]] name = "datafusion" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a11e19a7ccc5bb979c95c1dceef663eab39c9061b3bbf8d1937faf0f03bf41f" +checksum = "0f47772c28553d837e12cdcc0fb04c2a0fe8eca8b704a30f721d076f32407435" dependencies = [ "arrow", "arrow-ipc", @@ -1620,9 +1621,9 @@ dependencies = [ [[package]] name = "datafusion-catalog" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94985e67cab97b1099db2a7af11f31a45008b282aba921c1e1d35327c212ec18" +checksum = "4b6b29c9c922959285fac53139e12c81014e2ca54704f20355edd7e9d11fd773" dependencies = [ "arrow", "async-trait", @@ -1646,9 +1647,9 @@ dependencies = [ [[package]] name = "datafusion-catalog-listing" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e002df133bdb7b0b9b429d89a69aa77b35caeadee4498b2ce1c7c23a99516988" +checksum = "7313553e4c01d184dd49183afdfa22f23204a10a26dd12e6f799203d8fdb95c2" dependencies = [ "arrow", "async-trait", @@ -1669,14 +1670,15 @@ dependencies = [ [[package]] name = "datafusion-common" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13242fc58fd753787b0a538e5ae77d356cb9d0656fa85a591a33c5f106267f6" +checksum = "3d66104731b7476a8c86fbe7a6fd741e6329791166ac89a91fcd8336a560ddaf" dependencies = [ "ahash", "arrow", "arrow-ipc", "base64", + "chrono", "half", "hashbrown 0.14.5", "indexmap", @@ -1692,9 +1694,9 @@ dependencies = [ [[package]] name = "datafusion-common-runtime" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2239f964e95c3a5d6b4a8cde07e646de8995c1396a7fd62c6e784f5341db499" +checksum = "0e7527ecdfeae6961a8564d3b036507a67bd467fd36a9f10cf8ad7a99db1f1bc" dependencies = [ "futures", "log", @@ -1703,9 +1705,9 @@ dependencies = [ [[package]] name = "datafusion-datasource" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cf792579bc8bf07d1b2f68c2d5382f8a63679cce8fbebfd4ba95742b6e08864" +checksum = "40e5076be33d8eb9f4d99858e5f3477b36c07e61eee8eb93c4320428d9e1e344" dependencies = [ "arrow", "async-trait", @@ -1733,9 +1735,9 @@ dependencies = [ [[package]] name = "datafusion-datasource-csv" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfc114f9a1415174f3e8d2719c371fc72092ef2195a7955404cfe6b2ba29a706" +checksum = "785518d0f2f136c19b9389a10762c01a5aeb5fcdebdb244297bb656b2862dc88" dependencies = [ "arrow", "async-trait", @@ -1758,9 +1760,9 @@ dependencies = [ [[package]] name = "datafusion-datasource-json" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d88dd5e215c420a52362b9988ecd4cefd71081b730663d4f7d886f706111fc75" +checksum = "71cb7c3bad0951bf5c52505d0e6d87e6c0098156d2a195924cbcdc82238d29ba" dependencies = [ "arrow", "async-trait", @@ -1783,9 +1785,9 @@ dependencies = [ [[package]] name = "datafusion-datasource-parquet" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33692acdd1fbe75280d14f4676fe43f39e9cb36296df56575aa2cac9a819e4cf" +checksum = "ea76ad2c5189c98a6b1d4bdf6c3b3caacc9701c417af6661597c946a201bc328" dependencies = [ "arrow", "async-trait", @@ -1801,6 +1803,7 @@ dependencies = [ "datafusion-physical-expr-common", "datafusion-physical-optimizer", "datafusion-physical-plan", + "datafusion-pruning", "datafusion-session", "futures", "itertools 0.14.0", @@ -1814,15 +1817,15 @@ dependencies = [ [[package]] name = "datafusion-doc" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0e7b648387b0c1937b83cb328533c06c923799e73a9e3750b762667f32662c0" +checksum = "6bcc45e380db5c6033c3f39e765a3d752679f14315060a7f4030a60066a36946" [[package]] name = "datafusion-execution" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9609d83d52ff8315283c6dad3b97566e877d8f366fab4c3297742f33dcd636c7" +checksum = "8209805fdce3d5c6e1625f674d3e4ce93e995a56d3709a0bb8d4361062652596" dependencies = [ "arrow", "dashmap", @@ -1839,11 +1842,12 @@ dependencies = [ [[package]] name = "datafusion-expr" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e75230cd67f650ef0399eb00f54d4a073698f2c0262948298e5299fc7324da63" +checksum = "7879a845e72a00cacffacbdf5f40626049cb9584d2ba8aa0b9172f09833110ab" dependencies = [ "arrow", + "async-trait", "chrono", "datafusion-common", "datafusion-doc", @@ -1859,9 +1863,9 @@ dependencies = [ [[package]] name = "datafusion-expr-common" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70fafb3a045ed6c49cfca0cd090f62cf871ca6326cc3355cb0aaf1260fa760b6" +checksum = "6da7e47e70ef2c7678735c82c392bd74687004043f5fc8072ab8678dc6fa459d" dependencies = [ "arrow", "datafusion-common", @@ -1872,9 +1876,9 @@ dependencies = [ [[package]] name = "datafusion-functions" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf9a9cf655265861a20453b1e58357147eab59bdc90ce7f2f68f1f35104d3bb" +checksum = "5e7b92b04c5c3b1151f055251b36e272071f9088d9701826a533cb4f764af1c8" dependencies = [ "arrow", "arrow-buffer", @@ -1897,9 +1901,9 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f07e49733d847be0a05235e17b884d326a2fd402c97a89fe8bcf0bfba310005" +checksum = "3f16cb922b62e535a4d484961ac2c1c6d188dbe02e85e026c05f0fabbc8f814e" dependencies = [ "ahash", "arrow", @@ -1918,9 +1922,9 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate-common" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4512607e10d72b0b0a1dc08f42cb5bd5284cb8348b7fea49dc83409493e32b1b" +checksum = "6f71bb59dc8b4dc985c911f2e0d8cf426c21f565b56dca4b852c244101a1a7a2" dependencies = [ "ahash", "arrow", @@ -1931,9 +1935,9 @@ dependencies = [ [[package]] name = "datafusion-functions-table" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4ac2c0be983a06950ef077e34e0174aa0cb9e346f3aeae459823158037ade37" +checksum = "350e0940fc3e2fa4645a4d323f9ebf9258b2d7fdad12013a471cae4ae5568683" dependencies = [ "arrow", "async-trait", @@ -1947,9 +1951,9 @@ dependencies = [ [[package]] name = "datafusion-functions-window" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f3d92731de384c90906941d36dcadf6a86d4128409a9c5cd916662baed5f53" +checksum = "df03c6c62039578fd110b327c474846fdf3d9077a568f1e8706e585ed30cb98d" dependencies = [ "arrow", "datafusion-common", @@ -1965,9 +1969,9 @@ dependencies = [ [[package]] name = "datafusion-functions-window-common" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c679f8bf0971704ec8fd4249fcbb2eb49d6a12cc3e7a840ac047b4928d3541b5" +checksum = "083659a95914bf3ca568a72b085cb8654576fef1236b260dc2379cb8e5f922b2" dependencies = [ "datafusion-common", "datafusion-physical-expr-common", @@ -1975,9 +1979,9 @@ dependencies = [ [[package]] name = "datafusion-macros" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2821de7cb0362d12e75a5196b636a59ea3584ec1e1cc7dc6f5e34b9e8389d251" +checksum = "4cabe1f32daa2fa54e6b20d14a13a9e85bef97c4161fe8a90d76b6d9693a5ac4" dependencies = [ "datafusion-expr", "quote", @@ -1986,14 +1990,15 @@ dependencies = [ [[package]] name = "datafusion-optimizer" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1594c7a97219ede334f25347ad8d57056621e7f4f35a0693c8da876e10dd6a53" +checksum = "6e12a97dcb0ccc569798be1289c744829cce5f18cc9b037054f8d7f93e1d57be" dependencies = [ "arrow", "chrono", "datafusion-common", "datafusion-expr", + "datafusion-expr-common", "datafusion-physical-expr", "indexmap", "itertools 0.14.0", @@ -2004,9 +2009,9 @@ dependencies = [ [[package]] name = "datafusion-physical-expr" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6da0f2412088d23f6b01929dedd687b5aee63b19b674eb73d00c3eb3c883b7" +checksum = "41312712b8659a82b4e9faa8d97a018e7f2ccbdedf2f7cb93ecf256e39858c86" dependencies = [ "ahash", "arrow", @@ -2026,9 +2031,9 @@ dependencies = [ [[package]] name = "datafusion-physical-expr-common" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb0dbd9213078a593c3fe28783beaa625a4e6c6a6c797856ee2ba234311fb96" +checksum = "be1649a60ea0319496d616ae3554e84dfcc262c201ab4439abcd83cca989b85b" dependencies = [ "ahash", "arrow", @@ -2040,9 +2045,9 @@ dependencies = [ [[package]] name = "datafusion-physical-optimizer" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d140854b2db3ef8ac611caad12bfb2e1e1de827077429322a6188f18fc0026a" +checksum = "ea3f5b8ba6122426774aaaf11325740b8e5d3afaab9ab39dc63423adca554748" dependencies = [ "arrow", "datafusion-common", @@ -2052,15 +2057,16 @@ dependencies = [ "datafusion-physical-expr", "datafusion-physical-expr-common", "datafusion-physical-plan", + "datafusion-pruning", "itertools 0.14.0", "log", ] [[package]] name = "datafusion-physical-plan" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b46cbdf21a01206be76d467f325273b22c559c744a012ead5018dfe79597de08" +checksum = "6a595f296929d6cffa12b993ea53e9fe8215fada050d78626c5cf0e2f02b0205" dependencies = [ "ahash", "arrow", @@ -2086,11 +2092,29 @@ dependencies = [ "tokio", ] +[[package]] +name = "datafusion-pruning" +version = "49.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "391a457b9d23744c53eeb89edd1027424cba100581488d89800ed841182df905" +dependencies = [ + "arrow", + "arrow-schema", + "datafusion-common", + "datafusion-datasource", + "datafusion-expr-common", + "datafusion-physical-expr", + "datafusion-physical-expr-common", + "datafusion-physical-plan", + "itertools 0.14.0", + "log", +] + [[package]] name = "datafusion-session" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a72733766ddb5b41534910926e8da5836622316f6283307fd9fb7e19811a59c" +checksum = "dd5f2fe790f43839c70fb9604c4f9b59ad290ef64e1d2f927925dd34a9245406" dependencies = [ "arrow", "async-trait", @@ -2112,9 +2136,9 @@ dependencies = [ [[package]] name = "datafusion-sql" -version = "48.0.1" +version = "49.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5162338cdec9cc7ea13a0e6015c361acad5ec1d88d83f7c86301f789473971f" +checksum = "2ebebb82fda37f62f06fe14339f4faa9f197a0320cc4d26ce2a5fd53a5ccd27c" dependencies = [ "arrow", "bigdecimal", @@ -4180,6 +4204,7 @@ dependencies = [ "num-bigint", "object_store", "paste", + "ring", "seq-macro", "simdutf8", "snap", @@ -4480,15 +4505,6 @@ dependencies = [ "prost 0.14.1", ] -[[package]] -name = "psm" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f" -dependencies = [ - "cc", -] - [[package]] name = "pyo3" version = "0.24.2" @@ -4758,26 +4774,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "recursive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0786a43debb760f491b1bc0269fe5e84155353c67482b9e60d0cfb596054b43e" -dependencies = [ - "recursive-proc-macro-impl", - "stacker", -] - -[[package]] -name = "recursive-proc-macro-impl" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76009fbe0614077fc1a2ce255e3a1881a2e3a3527097d5dc6d8212c585e7e38b" -dependencies = [ - "quote", - "syn 2.0.104", -] - [[package]] name = "redox_syscall" version = "0.5.16" @@ -5402,7 +5398,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4521174166bac1ff04fe16ef4524c70144cd29682a45978978ca3d7f4e0be11" dependencies = [ "log", - "recursive", "sqlparser_derive", ] @@ -5423,19 +5418,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "stacker" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cddb07e32ddb770749da91081d8d0ac3a16f1a569a18b20348cd371f5dead06b" -dependencies = [ - "cc", - "cfg-if", - "libc", - "psm", - "windows-sys 0.59.0", -] - [[package]] name = "static_assertions" version = "1.1.0" diff --git a/Cargo.toml b/Cargo.toml index da1f159ed76..18e87c54e43 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -86,9 +86,9 @@ crossbeam-deque = "0.8.6" crossbeam-queue = "0.3.12" crossterm = "0.28" dashmap = "6.1.0" -datafusion = { version = "48", default-features = false } -datafusion-common = { version = "48" } -datafusion-physical-plan = { version = "48" } +datafusion = { version = "49", default-features = false } +datafusion-common = { version = "49" } +datafusion-physical-plan = { version = "49" } dirs = "6.0.0" divan = { package = "codspeed-divan-compat", version = "3.0" } dyn-eq = "0.1.3" @@ -120,7 +120,7 @@ moka = { version = "0.12.10", default-features = false } multiversion = "0.8.0" num-traits = "0.2.19" num_enum = { version = "0.7.3", default-features = false } -object_store = "0.12.1" +object_store = "0.12.3" once_cell = "1.21" opentelemetry = "0.30.0" opentelemetry-otlp = "0.30.0" @@ -170,7 +170,7 @@ tar = "0.4" target-lexicon = "0.13" tempfile = "3" thiserror = "2.0.3" -tokio = { version = "1.45.1" } +tokio = { version = "1.46" } tokio-stream = "0.1.17" # replace these with releases tpchgen = { git = "https://github.com/clflushopt/tpchgen-rs.git", rev = "d849ff430cd52250f6891ed4d5e3adad77bb2698" } diff --git a/vortex-datafusion/src/persistent/format.rs b/vortex-datafusion/src/persistent/format.rs index dd620acf821..e95144fd5c0 100644 --- a/vortex-datafusion/src/persistent/format.rs +++ b/vortex-datafusion/src/persistent/format.rs @@ -146,6 +146,10 @@ impl FileFormat for VortexFormat { self } + fn compression_type(&self) -> Option { + None + } + fn get_ext(&self) -> String { VORTEX_FILE_EXTENSION.to_string() } diff --git a/vortex-datafusion/src/persistent/opener.rs b/vortex-datafusion/src/persistent/opener.rs index 2d3c6f44a06..11777155422 100644 --- a/vortex-datafusion/src/persistent/opener.rs +++ b/vortex-datafusion/src/persistent/opener.rs @@ -8,6 +8,7 @@ use dashmap::{DashMap, Entry}; use datafusion::arrow::datatypes::SchemaRef; use datafusion::arrow::error::ArrowError; use datafusion::common::{DataFusionError, Result as DFResult}; +use datafusion::datasource::listing::PartitionedFile; use datafusion::datasource::physical_plan::{FileMeta, FileOpenFuture, FileOpener}; use futures::{FutureExt as _, StreamExt, TryStreamExt, stream}; use object_store::ObjectStore; @@ -63,7 +64,7 @@ impl VortexFileOpener { } impl FileOpener for VortexFileOpener { - fn open(&self, file_meta: FileMeta) -> DFResult { + fn open(&self, file_meta: FileMeta, _file: PartitionedFile) -> DFResult { let filter = self.filter.clone(); let projection = self.projection.clone(); let file_cache = self.file_cache.clone(); diff --git a/vortex-datafusion/src/persistent/sink.rs b/vortex-datafusion/src/persistent/sink.rs index 67b419b1e88..c99359365d4 100644 --- a/vortex-datafusion/src/persistent/sink.rs +++ b/vortex-datafusion/src/persistent/sink.rs @@ -7,8 +7,8 @@ use std::sync::atomic::{AtomicU64, Ordering}; use async_trait::async_trait; use datafusion::arrow::datatypes::SchemaRef; -use datafusion::common::DataFusionError; use datafusion::common::runtime::SpawnedTask; +use datafusion::common::{DataFusionError, Result as DFResult}; use datafusion::datasource::file_format::write::demux::DemuxedStreamReceiver; use datafusion::datasource::physical_plan::{FileSink, FileSinkConfig}; use datafusion::datasource::sink::DataSink; @@ -74,7 +74,7 @@ impl DataSink for VortexSink { &self, data: SendableRecordBatchStream, context: &Arc, - ) -> datafusion::common::Result { + ) -> DFResult { FileSink::write_all(self, data, context).await } } @@ -88,10 +88,10 @@ impl FileSink for VortexSink { async fn spawn_writer_tasks_and_join( &self, _context: &Arc, - demux_task: SpawnedTask>, + demux_task: SpawnedTask>, mut file_stream_rx: DemuxedStreamReceiver, object_store: Arc, - ) -> datafusion::common::Result { + ) -> DFResult { // This is a hack let row_counter = Arc::new(AtomicU64::new(0)); @@ -118,7 +118,7 @@ impl FileSink for VortexSink { demux_task .join_unwind() .await - .map_err(DataFusionError::ExecutionJoin)??; + .map_err(|e| DataFusionError::ExecutionJoin(Box::new(e)))??; Ok(row_counter.load(Ordering::SeqCst)) } diff --git a/vortex-datafusion/src/persistent/source.rs b/vortex-datafusion/src/persistent/source.rs index 621f6bfa6c2..dc99273a6dd 100644 --- a/vortex-datafusion/src/persistent/source.rs +++ b/vortex-datafusion/src/persistent/source.rs @@ -11,7 +11,7 @@ use datafusion::common::{Result as DFResult, Statistics}; use datafusion::config::ConfigOptions; use datafusion::datasource::physical_plan::{FileOpener, FileScanConfig, FileSource}; use datafusion::physical_plan::filter_pushdown::{ - FilterPushdownPropagation, PredicateSupport, PredicateSupports, + FilterPushdownPropagation, PushedDown, PushedDownPredicate, }; use datafusion::physical_plan::metrics::ExecutionPlanMetricsSet; use datafusion::physical_plan::{DisplayFormatType, PhysicalExpr}; @@ -193,29 +193,47 @@ impl FileSource for VortexSource { _config: &ConfigOptions, ) -> DFResult>> { let Some(schema) = self.arrow_schema.as_ref() else { - return Ok(FilterPushdownPropagation::unsupported(filters)); + return Ok(FilterPushdownPropagation::with_parent_pushdown_result( + vec![PushedDown::No; filters.len()], + )); }; - let (supported, unsupported): (Vec<_>, Vec<_>) = filters + + let filters = filters + .into_iter() + .map(|expr| { + if can_be_pushed_down(&expr, schema) { + PushedDownPredicate::supported(expr) + } else { + PushedDownPredicate::unsupported(expr) + } + }) + .collect::>(); + + if filters .iter() - .partition(|expr| can_be_pushed_down(expr, schema)); + .all(|p| matches!(p.discriminant, PushedDown::No)) + { + return Ok(FilterPushdownPropagation::with_parent_pushdown_result( + vec![PushedDown::No; filters.len()], + )); + } + + let supported = filters + .iter() + .filter_map(|p| match p.discriminant { + PushedDown::Yes => Some(&p.predicate), + PushedDown::No => None, + }) + .collect::>(); match make_vortex_predicate(&supported) { - Some(predicate) => { - let supports = PredicateSupports::new( - supported - .into_iter() - .map(|expr| PredicateSupport::Supported(expr.clone())) - .chain( - unsupported - .into_iter() - .map(|expr| PredicateSupport::Unsupported(expr.clone())), - ) - .collect(), - ); - Ok(FilterPushdownPropagation::with_filters(supports) - .with_updated_node(Arc::new(self.with_predicate(predicate)))) - } - None => Ok(FilterPushdownPropagation::unsupported(filters)), + Some(predicate) => Ok(FilterPushdownPropagation::with_parent_pushdown_result( + filters.iter().map(|f| f.discriminant).collect(), + ) + .with_updated_node(Arc::new(self.with_predicate(predicate)))), + _ => Ok(FilterPushdownPropagation::with_parent_pushdown_result( + vec![PushedDown::No; filters.len()], + )), } } }