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

tison pushed a commit to branch adopt-jiff
in repository https://gitbox.apache.org/repos/asf/fluss-rust.git

commit 0165b4e5cf6549e095ab6bc92d1c0533ab63e528
Author: tison <[email protected]>
AuthorDate: Sun Dec 14 20:23:32 2025 +0800

    chore: upgrade opendal and adopt jiff
    
    Signed-off-by: tison <[email protected]>
---
 Cargo.toml                                         |  4 +---
 bindings/python/Cargo.toml                         |  3 +--
 bindings/python/src/lib.rs                         |  5 +++--
 crates/fluss/Cargo.toml                            | 13 +++++------
 crates/fluss/{src => }/build.rs                    |  0
 crates/fluss/src/io/file_io.rs                     |  6 +++---
 crates/fluss/src/row/datum.rs                      | 25 +++++++++++-----------
 crates/fluss/tests/integration/admin.rs            |  7 +++---
 crates/fluss/tests/integration/table.rs            |  6 +++---
 .../fluss/tests/integration/table_remote_scan.rs   |  6 +++---
 10 files changed, 37 insertions(+), 38 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml
index b4ac03b..284a836 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -19,13 +19,11 @@
 categories = ["command-line-utilities"]
 description = "The rust implementation of fluss"
 repository = "https://github.com/apache/fluss-rust";
-name = "fluss"
 edition = "2024"
 version = "0.1.0"
 license = "Apache-2.0"
 rust-version = "1.85"
 
-
 [workspace]
 resolver = "2"
 members = ["crates/fluss", "crates/examples", "bindings/python", 
"bindings/cpp"]
@@ -35,4 +33,4 @@ fluss = { version = "0.1.0", path = "./crates/fluss" }
 tokio = { version = "1.44.2", features = ["full"] }
 clap = { version = "4.5.37", features = ["derive"] }
 arrow = { version = "57.0.0", features = ["ipc_compression"] }
-chrono = { version = "0.4", features = ["clock", "std", "wasmbind"] }
+jiff = { version = "0.2" }
diff --git a/bindings/python/Cargo.toml b/bindings/python/Cargo.toml
index 9ecc629..4da8bf8 100644
--- a/bindings/python/Cargo.toml
+++ b/bindings/python/Cargo.toml
@@ -35,5 +35,4 @@ arrow-pyarrow = "57.0.0"
 arrow-schema = "57.0.0"
 arrow-array = "57.0.0"
 pyo3-async-runtimes = { version = "0.26.0", features = ["tokio-runtime"] }
-chrono = { workspace = true }
-once_cell = "1.21.3"
+jiff = { workspace = true }
diff --git a/bindings/python/src/lib.rs b/bindings/python/src/lib.rs
index 63e84b1..49d5179 100644
--- a/bindings/python/src/lib.rs
+++ b/bindings/python/src/lib.rs
@@ -15,8 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use std::sync::LazyLock;
+
 pub use ::fluss as fcore;
-use once_cell::sync::Lazy;
 use pyo3::prelude::*;
 use tokio::runtime::Runtime;
 
@@ -36,7 +37,7 @@ pub use metadata::*;
 pub use table::*;
 pub use utils::*;
 
-static TOKIO_RUNTIME: Lazy<Runtime> = Lazy::new(|| {
+static TOKIO_RUNTIME: LazyLock<Runtime> = LazyLock::new(|| {
     tokio::runtime::Builder::new_multi_thread()
         .enable_all()
         .build()
diff --git a/crates/fluss/Cargo.toml b/crates/fluss/Cargo.toml
index 4547b9c..54235c4 100644
--- a/crates/fluss/Cargo.toml
+++ b/crates/fluss/Cargo.toml
@@ -20,7 +20,6 @@ edition = { workspace = true }
 rust-version = { workspace = true }
 version = { workspace = true }
 name = "fluss"
-build = "src/build.rs"
 
 [features]
 default = ["storage-memory", "storage-fs"]
@@ -52,18 +51,20 @@ rust_decimal = "1"
 ordered-float = { version = "4", features = ["serde"] }
 parse-display = "0.10"
 ref-cast = "1.0"
-chrono = { workspace = true }
-opendal = "0.53.3"
+jiff = { workspace = true }
+opendal = "0.55.0"
 url = "2.5.7"
 async-trait = "0.1.89"
 uuid = { version = "1.10", features = ["v4"] }
-tempfile= "3.23.0"
+tempfile = "3.23.0"
+
+[target.'cfg(target_arch = "wasm32")'.dependencies]
+jiff = { workspace = true, features = ["js"] }
 
 [dev-dependencies]
 testcontainers = "0.25.0"
-once_cell = "1.19"
 test-env-helpers = "0.2.2"
 
 
 [build-dependencies]
-prost-build = {  version = "0.13.5"  }
+prost-build = { version = "0.13.5" }
diff --git a/crates/fluss/src/build.rs b/crates/fluss/build.rs
similarity index 100%
rename from crates/fluss/src/build.rs
rename to crates/fluss/build.rs
diff --git a/crates/fluss/src/io/file_io.rs b/crates/fluss/src/io/file_io.rs
index 69a4c97..96be06f 100644
--- a/crates/fluss/src/io/file_io.rs
+++ b/crates/fluss/src/io/file_io.rs
@@ -22,7 +22,7 @@ use std::ops::Range;
 use std::sync::Arc;
 
 use bytes::Bytes;
-use chrono::{DateTime, Utc};
+use jiff::Timestamp;
 use opendal::Operator;
 
 use url::Url;
@@ -132,7 +132,7 @@ impl InputFile {
             size: meta.content_length(),
             is_dir: meta.is_dir(),
             path: self.path.clone(),
-            last_modified: meta.last_modified(),
+            last_modified: meta.last_modified().map(Into::into),
         })
     }
 
@@ -154,5 +154,5 @@ pub struct FileStatus {
     pub size: u64,
     pub is_dir: bool,
     pub path: String,
-    pub last_modified: Option<DateTime<Utc>>,
+    pub last_modified: Option<Timestamp>,
 }
diff --git a/crates/fluss/src/row/datum.rs b/crates/fluss/src/row/datum.rs
index 3e48703..6929b57 100644
--- a/crates/fluss/src/row/datum.rs
+++ b/crates/fluss/src/row/datum.rs
@@ -15,15 +15,13 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use chrono::Datelike;
-
 use crate::error::Error::RowConvertError;
 use crate::error::Result;
 use arrow::array::{
     ArrayBuilder, BinaryBuilder, BooleanBuilder, Float32Builder, 
Float64Builder, Int8Builder,
     Int16Builder, Int32Builder, Int64Builder, StringBuilder,
 };
-use chrono::NaiveDate;
+use jiff::ToSpan;
 use ordered_float::OrderedFloat;
 use parse_display::Display;
 use ref_cast::RefCast;
@@ -35,8 +33,6 @@ use std::ops::Deref;
 #[allow(dead_code)]
 const THIRTY_YEARS_MICROSECONDS: i64 = 946_684_800_000_000;
 
-pub const UNIX_EPOCH_DAYS: i32 = 719_163;
-
 #[derive(Debug, Clone, Display, PartialEq, Eq, PartialOrd, Ord, Hash, 
Serialize)]
 pub enum Datum<'a> {
     #[display("null")]
@@ -404,6 +400,8 @@ impl From<Vec<u8>> for Blob {
     }
 }
 
+const UNIX_EPOCH_DAY: jiff::civil::Date = jiff::civil::date(1970, 1, 1);
+
 impl Date {
     pub const fn new(inner: i32) -> Self {
         Date(inner)
@@ -414,16 +412,17 @@ impl Date {
         self.0
     }
 
-    pub fn year(&self) -> i32 {
-        let date = NaiveDate::from_num_days_from_ce_opt(self.0 + 
UNIX_EPOCH_DAYS).unwrap();
+    pub fn year(&self) -> i16 {
+        let date = UNIX_EPOCH_DAY + self.0.days();
         date.year()
     }
-    pub fn month(&self) -> i32 {
-        let date = NaiveDate::from_num_days_from_ce_opt(self.0 + 
UNIX_EPOCH_DAYS).unwrap();
-        date.month() as i32
+    pub fn month(&self) -> i8 {
+        let date = UNIX_EPOCH_DAY + self.0.days();
+        date.month()
     }
-    pub fn day(&self) -> i32 {
-        let date = NaiveDate::from_num_days_from_ce_opt(self.0 + 
UNIX_EPOCH_DAYS).unwrap();
-        date.day() as i32
+
+    pub fn day(&self) -> i8 {
+        let date = UNIX_EPOCH_DAY + self.0.days();
+        date.day()
     }
 }
diff --git a/crates/fluss/tests/integration/admin.rs 
b/crates/fluss/tests/integration/admin.rs
index c51373d..0086d9c 100644
--- a/crates/fluss/tests/integration/admin.rs
+++ b/crates/fluss/tests/integration/admin.rs
@@ -16,16 +16,17 @@
 // under the License.
 
 use crate::integration::fluss_cluster::FlussTestingCluster;
-use once_cell::sync::Lazy;
 use parking_lot::RwLock;
+
 use std::sync::Arc;
+use std::sync::LazyLock;
 
 #[cfg(test)]
 use test_env_helpers::*;
 
 // Module-level shared cluster instance (only for this test file)
-static SHARED_FLUSS_CLUSTER: Lazy<Arc<RwLock<Option<FlussTestingCluster>>>> =
-    Lazy::new(|| Arc::new(RwLock::new(None)));
+static SHARED_FLUSS_CLUSTER: 
LazyLock<Arc<RwLock<Option<FlussTestingCluster>>>> =
+    LazyLock::new(|| Arc::new(RwLock::new(None)));
 
 #[cfg(test)]
 #[before_all]
diff --git a/crates/fluss/tests/integration/table.rs 
b/crates/fluss/tests/integration/table.rs
index b23fd79..a058bfe 100644
--- a/crates/fluss/tests/integration/table.rs
+++ b/crates/fluss/tests/integration/table.rs
@@ -16,17 +16,17 @@
  * limitations under the License.
  */
 
-use once_cell::sync::Lazy;
 use parking_lot::RwLock;
 use std::sync::Arc;
+use std::sync::LazyLock;
 
 use crate::integration::fluss_cluster::FlussTestingCluster;
 #[cfg(test)]
 use test_env_helpers::*;
 
 // Module-level shared cluster instance (only for this test file)
-static SHARED_FLUSS_CLUSTER: Lazy<Arc<RwLock<Option<FlussTestingCluster>>>> =
-    Lazy::new(|| Arc::new(RwLock::new(None)));
+static SHARED_FLUSS_CLUSTER: 
LazyLock<Arc<RwLock<Option<FlussTestingCluster>>>> =
+    LazyLock::new(|| Arc::new(RwLock::new(None)));
 
 #[cfg(test)]
 #[before_all]
diff --git a/crates/fluss/tests/integration/table_remote_scan.rs 
b/crates/fluss/tests/integration/table_remote_scan.rs
index f33d440..f52d526 100644
--- a/crates/fluss/tests/integration/table_remote_scan.rs
+++ b/crates/fluss/tests/integration/table_remote_scan.rs
@@ -16,16 +16,16 @@
  * limitations under the License.
  */
 use crate::integration::fluss_cluster::FlussTestingCluster;
-use once_cell::sync::Lazy;
 use parking_lot::RwLock;
 use std::sync::Arc;
+use std::sync::LazyLock;
 
 #[cfg(test)]
 use test_env_helpers::*;
 
 // Module-level shared cluster instance (only for this test file)
-static SHARED_FLUSS_CLUSTER: Lazy<Arc<RwLock<Option<FlussTestingCluster>>>> =
-    Lazy::new(|| Arc::new(RwLock::new(None)));
+static SHARED_FLUSS_CLUSTER: 
LazyLock<Arc<RwLock<Option<FlussTestingCluster>>>> =
+    LazyLock::new(|| Arc::new(RwLock::new(None)));
 
 #[cfg(test)]
 #[before_all]

Reply via email to