This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new 2d57a0bb0a refactor: replace OnceLock with LazyLock (#14880)
2d57a0bb0a is described below

commit 2d57a0bb0a545e74592227e9385e50d1ce9e8ad8
Author: Amos Aidoo <aidooamo...@gmail.com>
AuthorDate: Tue Feb 25 21:07:02 2025 +0100

    refactor: replace OnceLock with LazyLock (#14880)
    
    this commit replaces all the remaining references of
    OnceLock with LazyLock
---
 datafusion/core/tests/fuzz_cases/pruning.rs        | 102 +++++++++---------
 datafusion/expr/src/udaf.rs                        |  12 +--
 datafusion/expr/src/udf.rs                         |  12 +--
 datafusion/expr/src/udwf.rs                        |  14 +--
 .../functions-aggregate/src/bit_and_or_xor.rs      |  62 +++++------
 datafusion/functions-aggregate/src/regr.rs         | 118 ++++++++++-----------
 datafusion/functions-window/src/lead_lag.rs        |  54 +++++-----
 datafusion/functions-window/src/nth_value.rs       |  78 +++++++-------
 datafusion/functions-window/src/rank.rs            |  50 ++++-----
 datafusion/substrait/src/logical_plan/consumer.rs  |  11 +-
 datafusion/substrait/src/logical_plan/producer.rs  |  11 +-
 11 files changed, 263 insertions(+), 261 deletions(-)

diff --git a/datafusion/core/tests/fuzz_cases/pruning.rs 
b/datafusion/core/tests/fuzz_cases/pruning.rs
index c6876d4a7e..f87572631b 100644
--- a/datafusion/core/tests/fuzz_cases/pruning.rs
+++ b/datafusion/core/tests/fuzz_cases/pruning.rs
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use std::sync::{Arc, OnceLock};
+use std::sync::{Arc, LazyLock};
 
 use arrow::array::{Array, RecordBatch, StringArray};
 use arrow::datatypes::{DataType, Field, Schema};
@@ -204,65 +204,24 @@ impl Utf8Test {
 
     ///  all combinations of interesting charactes  with lengths ranging from 
1 to 4
     fn values() -> &'static [String] {
-        VALUES.get_or_init(|| {
-            let mut rng = rand::thread_rng();
-
-            let characters = [
-                "z",
-                "0",
-                "~",
-                "ß",
-                "℣",
-                "%", // this one is useful for like/not like tests since it 
will result in randomly inserted wildcards
-                "_", // this one is useful for like/not like tests since it 
will result in randomly inserted wildcards
-                "\u{7F}",
-                "\u{7FF}",
-                "\u{FF}",
-                "\u{10FFFF}",
-                "\u{D7FF}",
-                "\u{FDCF}",
-                // null character
-                "\u{0}",
-            ];
-            let value_lengths = [1, 2, 3];
-            let mut values = vec![];
-            for length in &value_lengths {
-                values.extend(
-                    characters
-                        .iter()
-                        .cloned()
-                        .combinations(*length)
-                        // now get all permutations of each combination
-                        .flat_map(|c| c.into_iter().permutations(*length))
-                        // and join them into strings
-                        .map(|c| c.join("")),
-                );
-            }
-            println!("Generated {} values", values.len());
-            // randomly pick 100 values
-            values.shuffle(&mut rng);
-            values.truncate(100);
-            values
-        })
+        &VALUES
     }
 
     /// return the in memory object store
     fn memory_store() -> &'static Arc<dyn ObjectStore> {
-        MEMORY_STORE.get_or_init(|| Arc::new(InMemory::new()))
+        &MEMORY_STORE
     }
 
     /// return the schema of the created test files
     fn schema() -> Arc<Schema> {
-        let schema = SCHEMA.get_or_init(|| {
-            Arc::new(Schema::new(vec![Field::new("a", DataType::Utf8, false)]))
-        });
+        let schema = &SCHEMA;
         Arc::clone(schema)
     }
 
     /// Return a list of test files with UTF8 data and combinations of
     /// [`Self::values`]
     async fn test_files() -> Vec<TestFile> {
-        let files_mutex = TESTFILES.get_or_init(|| Mutex::new(vec![]));
+        let files_mutex = &TESTFILES;
         let mut files = files_mutex.lock().await;
         if !files.is_empty() {
             return (*files).clone();
@@ -385,16 +344,57 @@ async fn write_parquet_file(
 }
 
 /// The string values for [Utf8Test::values]
-static VALUES: OnceLock<Vec<String>> = OnceLock::new();
+static VALUES: LazyLock<Vec<String>> = LazyLock::new(|| {
+    let mut rng = rand::thread_rng();
+
+    let characters = [
+        "z",
+        "0",
+        "~",
+        "ß",
+        "℣",
+        "%", // this one is useful for like/not like tests since it will 
result in randomly inserted wildcards
+        "_", // this one is useful for like/not like tests since it will 
result in randomly inserted wildcards
+        "\u{7F}",
+        "\u{7FF}",
+        "\u{FF}",
+        "\u{10FFFF}",
+        "\u{D7FF}",
+        "\u{FDCF}",
+        // null character
+        "\u{0}",
+    ];
+    let value_lengths = [1, 2, 3];
+    let mut values = vec![];
+    for length in &value_lengths {
+        values.extend(
+            characters
+                .iter()
+                .cloned()
+                .combinations(*length)
+                // now get all permutations of each combination
+                .flat_map(|c| c.into_iter().permutations(*length))
+                // and join them into strings
+                .map(|c| c.join("")),
+        );
+    }
+    println!("Generated {} values", values.len());
+    // randomly pick 100 values
+    values.shuffle(&mut rng);
+    values.truncate(100);
+    values
+});
 /// The schema for the [Utf8Test::schema]
-static SCHEMA: OnceLock<Arc<Schema>> = OnceLock::new();
+static SCHEMA: LazyLock<Arc<Schema>> =
+    LazyLock::new(|| Arc::new(Schema::new(vec![Field::new("a", DataType::Utf8, 
false)])));
 
 /// The InMemory object store
-static MEMORY_STORE: OnceLock<Arc<dyn ObjectStore>> = OnceLock::new();
+static MEMORY_STORE: LazyLock<Arc<dyn ObjectStore>> =
+    LazyLock::new(|| Arc::new(InMemory::new()));
 
 /// List of in memory parquet files with UTF8 data
-// Use a mutex rather than OnceLock to allow for async initialization
-static TESTFILES: OnceLock<Mutex<Vec<TestFile>>> = OnceLock::new();
+// Use a mutex rather than LazyLock to allow for async initialization
+static TESTFILES: LazyLock<Mutex<Vec<TestFile>>> = LazyLock::new(|| 
Mutex::new(vec![]));
 
 /// Holds a temporary parquet file path and its size
 #[derive(Debug, Clone)]
diff --git a/datafusion/expr/src/udaf.rs b/datafusion/expr/src/udaf.rs
index ae7196c9b1..b4bbbf30f9 100644
--- a/datafusion/expr/src/udaf.rs
+++ b/datafusion/expr/src/udaf.rs
@@ -338,7 +338,7 @@ where
 /// # Basic Example
 /// ```
 /// # use std::any::Any;
-/// # use std::sync::OnceLock;
+/// # use std::sync::LazyLock;
 /// # use arrow::datatypes::DataType;
 /// # use datafusion_common::{DataFusionError, plan_err, Result};
 /// # use datafusion_expr::{col, ColumnarValue, Signature, Volatility, Expr, 
Documentation};
@@ -360,14 +360,14 @@ where
 ///   }
 /// }
 ///
-/// static DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
-///
-/// fn get_doc() -> &'static Documentation {
-///     DOCUMENTATION.get_or_init(|| {
+/// static DOCUMENTATION: LazyLock<Documentation> = LazyLock::new(|| {
 ///         Documentation::builder(DOC_SECTION_AGGREGATE, "calculates a 
geometric mean", "geo_mean(2.0)")
 ///             .with_argument("arg1", "The Float64 number for the geometric 
mean")
 ///             .build()
-///     })
+///     });
+///
+/// fn get_doc() -> &'static Documentation {
+///     &DOCUMENTATION
 /// }
 ///    
 /// /// Implement the AggregateUDFImpl trait for GeoMeanUdf
diff --git a/datafusion/expr/src/udf.rs b/datafusion/expr/src/udf.rs
index 74c3c2775c..8215b671a3 100644
--- a/datafusion/expr/src/udf.rs
+++ b/datafusion/expr/src/udf.rs
@@ -433,7 +433,7 @@ impl ReturnInfo {
 /// # Basic Example
 /// ```
 /// # use std::any::Any;
-/// # use std::sync::OnceLock;
+/// # use std::sync::LazyLock;
 /// # use arrow::datatypes::DataType;
 /// # use datafusion_common::{DataFusionError, plan_err, Result};
 /// # use datafusion_expr::{col, ColumnarValue, Documentation, 
ScalarFunctionArgs, Signature, Volatility};
@@ -453,14 +453,14 @@ impl ReturnInfo {
 ///   }
 /// }
 ///
-/// static DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
-///
-/// fn get_doc() -> &'static Documentation {
-///     DOCUMENTATION.get_or_init(|| {
+/// static DOCUMENTATION: LazyLock<Documentation> = LazyLock::new(|| {
 ///         Documentation::builder(DOC_SECTION_MATH, "Add one to an int32", 
"add_one(2)")
 ///             .with_argument("arg1", "The int32 number to add one to")
 ///             .build()
-///     })
+///     });
+///
+/// fn get_doc() -> &'static Documentation {
+///     &DOCUMENTATION
 /// }
 ///
 /// /// Implement the ScalarUDFImpl trait for AddOne
diff --git a/datafusion/expr/src/udwf.rs b/datafusion/expr/src/udwf.rs
index 96929ffeb0..4da63d7955 100644
--- a/datafusion/expr/src/udwf.rs
+++ b/datafusion/expr/src/udwf.rs
@@ -235,7 +235,7 @@ where
 /// # Basic Example
 /// ```
 /// # use std::any::Any;
-/// # use std::sync::OnceLock;
+/// # use std::sync::LazyLock;
 /// # use arrow::datatypes::{DataType, Field};
 /// # use datafusion_common::{DataFusionError, plan_err, Result};
 /// # use datafusion_expr::{col, Signature, Volatility, PartitionEvaluator, 
WindowFrame, ExprFunctionExt, Documentation};
@@ -257,14 +257,14 @@ where
 ///   }
 /// }
 ///
-/// static DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
+/// static DOCUMENTATION: LazyLock<Documentation> = LazyLock::new(|| {
+///     Documentation::builder(DOC_SECTION_ANALYTICAL, "smooths the windows", 
"smooth_it(2)")
+///         .with_argument("arg1", "The int32 number to smooth by")
+///         .build()
+/// });
 ///
 /// fn get_doc() -> &'static Documentation {
-///     DOCUMENTATION.get_or_init(|| {
-///         Documentation::builder(DOC_SECTION_ANALYTICAL, "smooths the 
windows", "smooth_it(2)")
-///             .with_argument("arg1", "The int32 number to smooth by")
-///             .build()
-///     })
+///     &DOCUMENTATION
 /// }
 ///
 /// /// Implement the WindowUDFImpl trait for SmoothIt
diff --git a/datafusion/functions-aggregate/src/bit_and_or_xor.rs 
b/datafusion/functions-aggregate/src/bit_and_or_xor.rs
index 6319a9c07d..50ab50abc9 100644
--- a/datafusion/functions-aggregate/src/bit_and_or_xor.rs
+++ b/datafusion/functions-aggregate/src/bit_and_or_xor.rs
@@ -42,7 +42,7 @@ use datafusion_expr::{
 use datafusion_expr::aggregate_doc_sections::DOC_SECTION_GENERAL;
 use 
datafusion_functions_aggregate_common::aggregate::groups_accumulator::prim_op::PrimitiveGroupsAccumulator;
 use std::ops::{BitAndAssign, BitOrAssign, BitXorAssign};
-use std::sync::OnceLock;
+use std::sync::LazyLock;
 
 /// This macro helps create group accumulators based on bitwise operations 
typically used internally
 /// and might not be necessary for users to call directly.
@@ -134,46 +134,46 @@ macro_rules! make_bitwise_udaf_expr_and_func {
     };
 }
 
-static BIT_AND_DOC: OnceLock<Documentation> = OnceLock::new();
+static BIT_AND_DOC: LazyLock<Documentation> = LazyLock::new(|| {
+    Documentation::builder(
+        DOC_SECTION_GENERAL,
+        "Computes the bitwise AND of all non-null input values.",
+        "bit_and(expression)",
+    )
+    .with_standard_argument("expression", Some("Integer"))
+    .build()
+});
 
 fn get_bit_and_doc() -> &'static Documentation {
-    BIT_AND_DOC.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_GENERAL,
-            "Computes the bitwise AND of all non-null input values.",
-            "bit_and(expression)",
-        )
-        .with_standard_argument("expression", Some("Integer"))
-        .build()
-    })
+    &BIT_AND_DOC
 }
 
-static BIT_OR_DOC: OnceLock<Documentation> = OnceLock::new();
+static BIT_OR_DOC: LazyLock<Documentation> = LazyLock::new(|| {
+    Documentation::builder(
+        DOC_SECTION_GENERAL,
+        "Computes the bitwise OR of all non-null input values.",
+        "bit_or(expression)",
+    )
+    .with_standard_argument("expression", Some("Integer"))
+    .build()
+});
 
 fn get_bit_or_doc() -> &'static Documentation {
-    BIT_OR_DOC.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_GENERAL,
-            "Computes the bitwise OR of all non-null input values.",
-            "bit_or(expression)",
-        )
-        .with_standard_argument("expression", Some("Integer"))
-        .build()
-    })
+    &BIT_OR_DOC
 }
 
-static BIT_XOR_DOC: OnceLock<Documentation> = OnceLock::new();
+static BIT_XOR_DOC: LazyLock<Documentation> = LazyLock::new(|| {
+    Documentation::builder(
+        DOC_SECTION_GENERAL,
+        "Computes the bitwise exclusive OR of all non-null input values.",
+        "bit_xor(expression)",
+    )
+    .with_standard_argument("expression", Some("Integer"))
+    .build()
+});
 
 fn get_bit_xor_doc() -> &'static Documentation {
-    BIT_XOR_DOC.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_GENERAL,
-            "Computes the bitwise exclusive OR of all non-null input values.",
-            "bit_xor(expression)",
-        )
-        .with_standard_argument("expression", Some("Integer"))
-        .build()
-    })
+    &BIT_XOR_DOC
 }
 
 make_bitwise_udaf_expr_and_func!(
diff --git a/datafusion/functions-aggregate/src/regr.rs 
b/datafusion/functions-aggregate/src/regr.rs
index f302b72f94..82575d15e5 100644
--- a/datafusion/functions-aggregate/src/regr.rs
+++ b/datafusion/functions-aggregate/src/regr.rs
@@ -38,7 +38,7 @@ use datafusion_expr::{
 use std::any::Any;
 use std::fmt::Debug;
 use std::mem::size_of_val;
-use std::sync::OnceLock;
+use std::sync::LazyLock;
 
 macro_rules! make_regr_udaf_expr_and_func {
     ($EXPR_FN:ident, $AGGREGATE_UDF_FN:ident, $REGR_TYPE:expr) => {
@@ -132,11 +132,9 @@ impl RegrType {
     }
 }
 
-static DOCUMENTATION: OnceLock<HashMap<RegrType, Documentation>> = 
OnceLock::new();
-fn get_regr_docs() -> &'static HashMap<RegrType, Documentation> {
-    DOCUMENTATION.get_or_init(|| {
-        let mut hash_map = HashMap::new();
-        hash_map.insert(
+static DOCUMENTATION: LazyLock<HashMap<RegrType, Documentation>> = 
LazyLock::new(|| {
+    let mut hash_map = HashMap::new();
+    hash_map.insert(
             RegrType::Slope,
             Documentation::builder(
                 DOC_SECTION_STATISTICAL,
@@ -149,7 +147,7 @@ fn get_regr_docs() -> &'static HashMap<RegrType, 
Documentation> {
                 .build()
         );
 
-        hash_map.insert(
+    hash_map.insert(
             RegrType::Intercept,
             Documentation::builder(
                 DOC_SECTION_STATISTICAL,
@@ -162,19 +160,19 @@ fn get_regr_docs() -> &'static HashMap<RegrType, 
Documentation> {
                 .build()
         );
 
-        hash_map.insert(
-            RegrType::Count,
-            Documentation::builder(
-                DOC_SECTION_STATISTICAL,
-                    "Counts the number of non-null paired data points.",
-
-                "regr_count(expression_y, expression_x)")
-                .with_standard_argument("expression_y", Some("Dependent 
variable"))
-                .with_standard_argument("expression_x", Some("Independent 
variable"))
-                .build()
-        );
-
-        hash_map.insert(
+    hash_map.insert(
+        RegrType::Count,
+        Documentation::builder(
+            DOC_SECTION_STATISTICAL,
+            "Counts the number of non-null paired data points.",
+            "regr_count(expression_y, expression_x)",
+        )
+        .with_standard_argument("expression_y", Some("Dependent variable"))
+        .with_standard_argument("expression_x", Some("Independent variable"))
+        .build(),
+    );
+
+    hash_map.insert(
             RegrType::R2,
             Documentation::builder(
                 DOC_SECTION_STATISTICAL,
@@ -186,7 +184,7 @@ fn get_regr_docs() -> &'static HashMap<RegrType, 
Documentation> {
                 .build()
         );
 
-        hash_map.insert(
+    hash_map.insert(
             RegrType::AvgX,
             Documentation::builder(
                 DOC_SECTION_STATISTICAL,
@@ -198,7 +196,7 @@ fn get_regr_docs() -> &'static HashMap<RegrType, 
Documentation> {
                 .build()
         );
 
-        hash_map.insert(
+    hash_map.insert(
             RegrType::AvgY,
             Documentation::builder(
                 DOC_SECTION_STATISTICAL,
@@ -210,43 +208,45 @@ fn get_regr_docs() -> &'static HashMap<RegrType, 
Documentation> {
                 .build()
         );
 
-        hash_map.insert(
-            RegrType::SXX,
-            Documentation::builder(
-                DOC_SECTION_STATISTICAL,
-                    "Computes the sum of squares of the independent variable.",
-
-                "regr_sxx(expression_y, expression_x)")
-                .with_standard_argument("expression_y", Some("Dependent 
variable"))
-                .with_standard_argument("expression_x", Some("Independent 
variable"))
-                .build()
-        );
-
-        hash_map.insert(
-            RegrType::SYY,
-            Documentation::builder(
-                DOC_SECTION_STATISTICAL,
-                    "Computes the sum of squares of the dependent variable.",
-
-                "regr_syy(expression_y, expression_x)")
-                .with_standard_argument("expression_y", Some("Dependent 
variable"))
-                .with_standard_argument("expression_x", Some("Independent 
variable"))
-                .build()
-        );
-
-        hash_map.insert(
-            RegrType::SXY,
-            Documentation::builder(
-                DOC_SECTION_STATISTICAL,
-                    "Computes the sum of products of paired data points.",
-
-                "regr_sxy(expression_y, expression_x)")
-                .with_standard_argument("expression_y", Some("Dependent 
variable"))
-                .with_standard_argument("expression_x", Some("Independent 
variable"))
-                .build()
-        );
-        hash_map
-    })
+    hash_map.insert(
+        RegrType::SXX,
+        Documentation::builder(
+            DOC_SECTION_STATISTICAL,
+            "Computes the sum of squares of the independent variable.",
+            "regr_sxx(expression_y, expression_x)",
+        )
+        .with_standard_argument("expression_y", Some("Dependent variable"))
+        .with_standard_argument("expression_x", Some("Independent variable"))
+        .build(),
+    );
+
+    hash_map.insert(
+        RegrType::SYY,
+        Documentation::builder(
+            DOC_SECTION_STATISTICAL,
+            "Computes the sum of squares of the dependent variable.",
+            "regr_syy(expression_y, expression_x)",
+        )
+        .with_standard_argument("expression_y", Some("Dependent variable"))
+        .with_standard_argument("expression_x", Some("Independent variable"))
+        .build(),
+    );
+
+    hash_map.insert(
+        RegrType::SXY,
+        Documentation::builder(
+            DOC_SECTION_STATISTICAL,
+            "Computes the sum of products of paired data points.",
+            "regr_sxy(expression_y, expression_x)",
+        )
+        .with_standard_argument("expression_y", Some("Dependent variable"))
+        .with_standard_argument("expression_x", Some("Independent variable"))
+        .build(),
+    );
+    hash_map
+});
+fn get_regr_docs() -> &'static HashMap<RegrType, Documentation> {
+    &DOCUMENTATION
 }
 
 impl AggregateUDFImpl for Regr {
diff --git a/datafusion/functions-window/src/lead_lag.rs 
b/datafusion/functions-window/src/lead_lag.rs
index d73a5d86bb..5df20cf5b9 100644
--- a/datafusion/functions-window/src/lead_lag.rs
+++ b/datafusion/functions-window/src/lead_lag.rs
@@ -35,7 +35,7 @@ use std::any::Any;
 use std::cmp::min;
 use std::collections::VecDeque;
 use std::ops::{Neg, Range};
-use std::sync::{Arc, OnceLock};
+use std::sync::{Arc, LazyLock};
 
 get_or_init_udwf!(
     Lag,
@@ -148,38 +148,38 @@ impl WindowShift {
     }
 }
 
-static LAG_DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
+static LAG_DOCUMENTATION: LazyLock<Documentation> = LazyLock::new(|| {
+    Documentation::builder(DOC_SECTION_ANALYTICAL, "Returns value evaluated at 
the row that is offset rows before the \
+            current row within the partition; if there is no such row, instead 
return default \
+            (which must be of the same type as value).", "lag(expression, 
offset, default)")
+        .with_argument("expression", "Expression to operate on")
+        .with_argument("offset", "Integer. Specifies how many rows back \
+        the value of expression should be retrieved. Defaults to 1.")
+        .with_argument("default", "The default value if the offset is \
+        not within the partition. Must be of the same type as expression.")
+        .build()
+});
 
 fn get_lag_doc() -> &'static Documentation {
-    LAG_DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(DOC_SECTION_ANALYTICAL, "Returns value 
evaluated at the row that is offset rows before the \
-                current row within the partition; if there is no such row, 
instead return default \
-                (which must be of the same type as value).", "lag(expression, 
offset, default)")
-            .with_argument("expression", "Expression to operate on")
-            .with_argument("offset", "Integer. Specifies how many rows back \
-            the value of expression should be retrieved. Defaults to 1.")
-            .with_argument("default", "The default value if the offset is \
-            not within the partition. Must be of the same type as expression.")
-            .build()
-    })
+    &LAG_DOCUMENTATION
 }
 
-static LEAD_DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
+static LEAD_DOCUMENTATION: LazyLock<Documentation> = LazyLock::new(|| {
+    Documentation::builder(DOC_SECTION_ANALYTICAL,
+            "Returns value evaluated at the row that is offset rows after the \
+            current row within the partition; if there is no such row, instead 
return default \
+            (which must be of the same type as value).",
+        "lead(expression, offset, default)")
+        .with_argument("expression", "Expression to operate on")
+        .with_argument("offset", "Integer. Specifies how many rows \
+        forward the value of expression should be retrieved. Defaults to 1.")
+        .with_argument("default", "The default value if the offset is \
+        not within the partition. Must be of the same type as expression.")
+        .build()
+});
 
 fn get_lead_doc() -> &'static Documentation {
-    LEAD_DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(DOC_SECTION_ANALYTICAL,
-                "Returns value evaluated at the row that is offset rows after 
the \
-                current row within the partition; if there is no such row, 
instead return default \
-                (which must be of the same type as value).",
-            "lead(expression, offset, default)")
-            .with_argument("expression", "Expression to operate on")
-            .with_argument("offset", "Integer. Specifies how many rows \
-            forward the value of expression should be retrieved. Defaults to 
1.")
-            .with_argument("default", "The default value if the offset is \
-            not within the partition. Must be of the same type as expression.")
-            .build()
-    })
+    &LEAD_DOCUMENTATION
 }
 
 impl WindowUDFImpl for WindowShift {
diff --git a/datafusion/functions-window/src/nth_value.rs 
b/datafusion/functions-window/src/nth_value.rs
index 16caa5293e..1c781bd8e5 100644
--- a/datafusion/functions-window/src/nth_value.rs
+++ b/datafusion/functions-window/src/nth_value.rs
@@ -23,7 +23,7 @@ use std::any::Any;
 use std::cmp::Ordering;
 use std::fmt::Debug;
 use std::ops::Range;
-use std::sync::OnceLock;
+use std::sync::LazyLock;
 
 use datafusion_common::arrow::array::ArrayRef;
 use datafusion_common::arrow::datatypes::{DataType, Field};
@@ -127,54 +127,54 @@ impl NthValue {
     }
 }
 
-static FIRST_VALUE_DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
+static FIRST_VALUE_DOCUMENTATION: LazyLock<Documentation> = LazyLock::new(|| {
+    Documentation::builder(
+        DOC_SECTION_ANALYTICAL,
+        "Returns value evaluated at the row that is the first row of the 
window \
+            frame.",
+        "first_value(expression)",
+    )
+    .with_argument("expression", "Expression to operate on")
+    .build()
+});
 
 fn get_first_value_doc() -> &'static Documentation {
-    FIRST_VALUE_DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ANALYTICAL,
-            "Returns value evaluated at the row that is the first row of the 
window \
-                frame.",
-            "first_value(expression)",
-        )
-        .with_argument("expression", "Expression to operate on")
-        .build()
-    })
+    &FIRST_VALUE_DOCUMENTATION
 }
 
-static LAST_VALUE_DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
+static LAST_VALUE_DOCUMENTATION: LazyLock<Documentation> = LazyLock::new(|| {
+    Documentation::builder(
+        DOC_SECTION_ANALYTICAL,
+        "Returns value evaluated at the row that is the last row of the window 
\
+            frame.",
+        "last_value(expression)",
+    )
+    .with_argument("expression", "Expression to operate on")
+    .build()
+});
 
 fn get_last_value_doc() -> &'static Documentation {
-    LAST_VALUE_DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ANALYTICAL,
-            "Returns value evaluated at the row that is the last row of the 
window \
-                frame.",
-            "last_value(expression)",
-        )
-        .with_argument("expression", "Expression to operate on")
-        .build()
-    })
+    &LAST_VALUE_DOCUMENTATION
 }
 
-static NTH_VALUE_DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
+static NTH_VALUE_DOCUMENTATION: LazyLock<Documentation> = LazyLock::new(|| {
+    Documentation::builder(
+        DOC_SECTION_ANALYTICAL,
+        "Returns value evaluated at the row that is the nth row of the window \
+            frame (counting from 1); null if no such row.",
+        "nth_value(expression, n)",
+    )
+    .with_argument(
+        "expression",
+        "The name the column of which nth \
+        value to retrieve",
+    )
+    .with_argument("n", "Integer. Specifies the n in nth")
+    .build()
+});
 
 fn get_nth_value_doc() -> &'static Documentation {
-    NTH_VALUE_DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_ANALYTICAL,
-            "Returns value evaluated at the row that is the nth row of the 
window \
-                frame (counting from 1); null if no such row.",
-            "nth_value(expression, n)",
-        )
-        .with_argument(
-            "expression",
-            "The name the column of which nth \
-            value to retrieve",
-        )
-        .with_argument("n", "Integer. Specifies the n in nth")
-        .build()
-    })
+    &NTH_VALUE_DOCUMENTATION
 }
 
 impl WindowUDFImpl for NthValue {
diff --git a/datafusion/functions-window/src/rank.rs 
b/datafusion/functions-window/src/rank.rs
index dacee90bfa..bd2edc5722 100644
--- a/datafusion/functions-window/src/rank.rs
+++ b/datafusion/functions-window/src/rank.rs
@@ -22,7 +22,7 @@ use std::any::Any;
 use std::fmt::Debug;
 use std::iter;
 use std::ops::Range;
-use std::sync::{Arc, OnceLock};
+use std::sync::{Arc, LazyLock};
 
 use crate::define_udwf_and_expr;
 use datafusion_common::arrow::array::ArrayRef;
@@ -102,40 +102,40 @@ pub enum RankType {
     Percent,
 }
 
-static RANK_DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
+static RANK_DOCUMENTATION: LazyLock<Documentation> = LazyLock::new(|| {
+    Documentation::builder(
+        DOC_SECTION_RANKING,
+            "Returns the rank of the current row within its partition, 
allowing \
+            gaps between ranks. This function provides a ranking similar to 
`row_number`, but \
+            skips ranks for identical values.",
+
+        "rank()")
+        .build()
+});
 
 fn get_rank_doc() -> &'static Documentation {
-    RANK_DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(
-            DOC_SECTION_RANKING,
-                "Returns the rank of the current row within its partition, 
allowing \
-                gaps between ranks. This function provides a ranking similar 
to `row_number`, but \
-                skips ranks for identical values.",
-
-            "rank()")
-            .build()
-    })
+    &RANK_DOCUMENTATION
 }
 
-static DENSE_RANK_DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
+static DENSE_RANK_DOCUMENTATION: LazyLock<Documentation> = LazyLock::new(|| {
+    Documentation::builder(DOC_SECTION_RANKING, "Returns the rank of the 
current row without gaps. This function ranks \
+            rows in a dense manner, meaning consecutive ranks are assigned 
even for identical \
+            values.", "dense_rank()")
+        .build()
+});
 
 fn get_dense_rank_doc() -> &'static Documentation {
-    DENSE_RANK_DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(DOC_SECTION_RANKING, "Returns the rank of the 
current row without gaps. This function ranks \
-                rows in a dense manner, meaning consecutive ranks are assigned 
even for identical \
-                values.", "dense_rank()")
-            .build()
-    })
+    &DENSE_RANK_DOCUMENTATION
 }
 
-static PERCENT_RANK_DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
+static PERCENT_RANK_DOCUMENTATION: LazyLock<Documentation> = LazyLock::new(|| {
+    Documentation::builder(DOC_SECTION_RANKING, "Returns the percentage rank 
of the current row within its partition. \
+            The value ranges from 0 to 1 and is computed as `(rank - 1) / 
(total_rows - 1)`.", "percent_rank()")
+        .build()
+});
 
 fn get_percent_rank_doc() -> &'static Documentation {
-    PERCENT_RANK_DOCUMENTATION.get_or_init(|| {
-        Documentation::builder(DOC_SECTION_RANKING, "Returns the percentage 
rank of the current row within its partition. \
-                The value ranges from 0 to 1 and is computed as `(rank - 1) / 
(total_rows - 1)`.", "percent_rank()")
-            .build()
-    })
+    &PERCENT_RANK_DOCUMENTATION
 }
 
 impl WindowUDFImpl for Rank {
diff --git a/datafusion/substrait/src/logical_plan/consumer.rs 
b/datafusion/substrait/src/logical_plan/consumer.rs
index da8613781d..e4984011be 100644
--- a/datafusion/substrait/src/logical_plan/consumer.rs
+++ b/datafusion/substrait/src/logical_plan/consumer.rs
@@ -3293,7 +3293,7 @@ mod test {
     use datafusion::execution::SessionState;
     use datafusion::prelude::{Expr, SessionContext};
     use datafusion::scalar::ScalarValue;
-    use std::sync::OnceLock;
+    use std::sync::LazyLock;
     use substrait::proto::expression::literal::{
         interval_day_to_second, IntervalCompound, IntervalDayToSecond,
         IntervalYearToMonth, LiteralType,
@@ -3301,11 +3301,12 @@ mod test {
     use substrait::proto::expression::window_function::BoundsType;
     use substrait::proto::expression::Literal;
 
-    static TEST_SESSION_STATE: OnceLock<SessionState> = OnceLock::new();
-    static TEST_EXTENSIONS: OnceLock<Extensions> = OnceLock::new();
+    static TEST_SESSION_STATE: LazyLock<SessionState> =
+        LazyLock::new(|| SessionContext::default().state());
+    static TEST_EXTENSIONS: LazyLock<Extensions> = 
LazyLock::new(Extensions::default);
     fn test_consumer() -> DefaultSubstraitConsumer<'static> {
-        let extensions = TEST_EXTENSIONS.get_or_init(Extensions::default);
-        let state = TEST_SESSION_STATE.get_or_init(|| 
SessionContext::default().state());
+        let extensions = &TEST_EXTENSIONS;
+        let state = &TEST_SESSION_STATE;
         DefaultSubstraitConsumer::new(extensions, state)
     }
 
diff --git a/datafusion/substrait/src/logical_plan/producer.rs 
b/datafusion/substrait/src/logical_plan/producer.rs
index 36e89b8205..9dbb246453 100644
--- a/datafusion/substrait/src/logical_plan/producer.rs
+++ b/datafusion/substrait/src/logical_plan/producer.rs
@@ -2552,13 +2552,14 @@ mod test {
     use datafusion::common::DFSchema;
     use datafusion::execution::{SessionState, SessionStateBuilder};
     use datafusion::prelude::SessionContext;
-    use std::sync::OnceLock;
+    use std::sync::LazyLock;
 
-    static TEST_SESSION_STATE: OnceLock<SessionState> = OnceLock::new();
-    static TEST_EXTENSIONS: OnceLock<Extensions> = OnceLock::new();
+    static TEST_SESSION_STATE: LazyLock<SessionState> =
+        LazyLock::new(|| SessionContext::default().state());
+    static TEST_EXTENSIONS: LazyLock<Extensions> = 
LazyLock::new(Extensions::default);
     fn test_consumer() -> DefaultSubstraitConsumer<'static> {
-        let extensions = TEST_EXTENSIONS.get_or_init(Extensions::default);
-        let state = TEST_SESSION_STATE.get_or_init(|| 
SessionContext::default().state());
+        let extensions = &TEST_EXTENSIONS;
+        let state = &TEST_SESSION_STATE;
         DefaultSubstraitConsumer::new(extensions, state)
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@datafusion.apache.org
For additional commands, e-mail: commits-h...@datafusion.apache.org

Reply via email to