blob: cc4c092a07a92f17759925f37736c599aae7cadf [file] [log] [blame]
/*
* Copyright 2024-present Alibaba Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <cassert>
#include <chrono>
#include <cstdint>
#include <string>
#include "paimon/result.h"
#include "paimon/visibility.h"
namespace paimon {
/// A data structure representing data of Timestamp without timezone.
///
/// This data structure is immutable and consists of a milliseconds and nanos-of-millisecond since
/// `1970-01-01 00:00:00`. It might be stored in a compact representation (as a long value) if
/// values are small enough. Timestamp range from 0000-01-01 00:00:00.000000000 to 9999-12-31
/// 23:59:59.999999999.
///
class PAIMON_EXPORT Timestamp {
public:
Timestamp() : Timestamp(0, 0) {}
Timestamp(int64_t millisecond, int32_t nano_of_millisecond)
: millisecond_(millisecond), nano_of_millisecond_(nano_of_millisecond) {
assert(nano_of_millisecond >= 0 && nano_of_millisecond <= 999999ll);
}
/// Get the number of milliseconds since `1970-01-01 00:00:00`.
int64_t GetMillisecond() const {
return millisecond_;
}
/// Get the number of nanoseconds (the nanoseconds within the milliseconds).
///
/// The value range is from 0 to 999,999.
int32_t GetNanoOfMillisecond() const {
return nano_of_millisecond_;
}
/// Creates an instance of `Timestamp` from milliseconds.
///
/// The nanos-of-millisecond field will be set to zero.
///
/// @param milliseconds The number of milliseconds since `1970-01-01 00:00:00`; a
/// negative number is the number of milliseconds before `1970-01-01 00:00:00`.
static Timestamp FromEpochMillis(int64_t milliseconds) {
return {milliseconds, 0};
}
/// Creates an instance of `Timestamp` from milliseconds and a nanos-of-millisecond.
///
/// @param milliseconds The number of milliseconds since `1970-01-01 00:00:00`; a
/// negative number is the number of milliseconds before `1970-01-01 00:00:00`.
/// @param nanos_of_millisecond The nanoseconds within the millisecond, from 0 to 999,999.
static Timestamp FromEpochMillis(int64_t milliseconds, int32_t nanos_of_millisecond) {
return {milliseconds, nanos_of_millisecond};
}
/// Converts this `Timestamp` object to millis `Timestamp` object (ignore
/// `nanos_of_millisecond`).
Timestamp ToMillisTimestamp() const {
return FromEpochMillis(millisecond_);
}
/// Converts this `Timestamp` object to microsecond.
int64_t ToMicrosecond() const;
/// Converts this `Timestamp` object to nanoseconds.
int64_t ToNanosecond() const {
std::chrono::nanoseconds nanosecond = std::chrono::nanoseconds(nano_of_millisecond_) +
std::chrono::milliseconds(millisecond_);
return nanosecond.count();
}
/// @return Whether the timestamp data is small enough to be stored in a long of
/// milliseconds.
static bool IsCompact(int32_t precision) {
return precision <= MAX_COMPACT_PRECISION;
}
bool operator==(const Timestamp& other) const {
if (this == &other) {
return true;
}
return millisecond_ == other.millisecond_ &&
nano_of_millisecond_ == other.nano_of_millisecond_;
}
bool operator<(const Timestamp& other) const {
if (millisecond_ == other.millisecond_) {
return nano_of_millisecond_ < other.nano_of_millisecond_;
}
return millisecond_ < other.millisecond_;
}
/// Converts the Timestamp object to a string representation in UTC (GMT).
///
/// The format of the returned string is "YYYY-MM-DD HH:MM:SS.nnnnnnnnn",
/// where the date and time are in UTC (GMT), and the nanoseconds are derived
/// from the millisecond and nanosecond parts of the timestamp.
///
/// @note This method uses UTC (GMT) time zone when formatting the time.
/// This is different from the Java Paimon implementation, which may convert
/// the timestamp to the local time zone of the machine running the Java process.
std::string ToString() const;
static const int32_t DEFAULT_PRECISION;
static const int32_t MILLIS_PRECISION;
static const int32_t MIN_PRECISION;
static const int32_t MAX_PRECISION;
static const int32_t MAX_COMPACT_PRECISION;
private:
int64_t millisecond_ = 0;
int32_t nano_of_millisecond_ = 0;
};
} // namespace paimon