blob: f16cb2547c325ac5c5ba8dc2f254ac23aad14d96 [file]
/*
* 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.
*/
#pragma once
#include <cassert>
#include <cstdint>
#include <memory>
#include <optional>
#include <string>
#include "paimon/data/decimal.h"
#include "paimon/data/timestamp.h"
#include "paimon/defs.h"
#include "paimon/visibility.h"
namespace paimon {
/// ColumnStats is an abstract base class that represents statistical information for data columns
/// in Paimon tables. It provides min/max values and null count statistics
///
/// Only primitive data types support min/max statistics. Nested types (arrays, maps, structs) only
/// track null counts through `NestedColumnStats`.
///
/// @note This is an abstract base class. Use the static factory methods `CreateXXXColumnStats()` to
/// create concrete instances for specific data types.
class PAIMON_EXPORT ColumnStats {
public:
virtual ~ColumnStats() = default;
/// Gets the number of null values in this column.
virtual std::optional<int64_t> NullCount() const = 0;
virtual std::string ToString() const = 0;
/// Gets the field type that this column statistics instance represents.
virtual FieldType GetFieldType() const = 0;
/// @name CreateXXXColumnStats()
/// %Factory methods `CreateXXXColumnStats()` to create column statistics.
/// - min/max/null_count for primitive data types
/// - null_count for nested data types (arrays, maps, structs)
///
/// @{
static std::unique_ptr<ColumnStats> CreateBooleanColumnStats(std::optional<bool> min,
std::optional<bool> max,
std::optional<int64_t> null_count);
static std::unique_ptr<ColumnStats> CreateTinyIntColumnStats(std::optional<int8_t> min,
std::optional<int8_t> max,
std::optional<int64_t> null_count);
static std::unique_ptr<ColumnStats> CreateSmallIntColumnStats(
std::optional<int16_t> min, std::optional<int16_t> max, std::optional<int64_t> null_count);
static std::unique_ptr<ColumnStats> CreateIntColumnStats(std::optional<int32_t> min,
std::optional<int32_t> max,
std::optional<int64_t> null_count);
static std::unique_ptr<ColumnStats> CreateBigIntColumnStats(std::optional<int64_t> min,
std::optional<int64_t> max,
std::optional<int64_t> null_count);
static std::unique_ptr<ColumnStats> CreateFloatColumnStats(std::optional<float> min,
std::optional<float> max,
std::optional<int64_t> null_count);
static std::unique_ptr<ColumnStats> CreateDoubleColumnStats(std::optional<double> min,
std::optional<double> max,
std::optional<int64_t> null_count);
static std::unique_ptr<ColumnStats> CreateStringColumnStats(
const std::optional<std::string>& min, const std::optional<std::string>& max,
std::optional<int64_t> null_count);
static std::unique_ptr<ColumnStats> CreateTimestampColumnStats(
const std::optional<Timestamp>& min, const std::optional<Timestamp>& max,
std::optional<int64_t> null_count, int32_t precision);
static std::unique_ptr<ColumnStats> CreateDecimalColumnStats(const std::optional<Decimal>& min,
const std::optional<Decimal>& max,
std::optional<int64_t> null_count,
int32_t precision, int32_t scale);
static std::unique_ptr<ColumnStats> CreateDateColumnStats(std::optional<int32_t> min,
std::optional<int32_t> max,
std::optional<int64_t> null_count);
/// Creates column statistics for nested data types (arrays, maps, structs), which only track
/// null counts.
static std::unique_ptr<ColumnStats> CreateNestedColumnStats(const FieldType& nested_type,
std::optional<int64_t> null_count);
/// @}
};
class PAIMON_EXPORT BooleanColumnStats : public ColumnStats {
public:
virtual std::optional<bool> Min() const = 0;
virtual std::optional<bool> Max() const = 0;
virtual void Collect(std::optional<bool> value) = 0;
};
class PAIMON_EXPORT TinyIntColumnStats : public ColumnStats {
public:
virtual std::optional<int8_t> Min() const = 0;
virtual std::optional<int8_t> Max() const = 0;
virtual void Collect(std::optional<int8_t> value) = 0;
};
class PAIMON_EXPORT SmallIntColumnStats : public ColumnStats {
public:
virtual std::optional<int16_t> Min() const = 0;
virtual std::optional<int16_t> Max() const = 0;
virtual void Collect(std::optional<int16_t> value) = 0;
};
class PAIMON_EXPORT IntColumnStats : public ColumnStats {
public:
virtual std::optional<int32_t> Min() const = 0;
virtual std::optional<int32_t> Max() const = 0;
virtual void Collect(std::optional<int32_t> value) = 0;
};
class PAIMON_EXPORT BigIntColumnStats : public ColumnStats {
public:
virtual std::optional<int64_t> Min() const = 0;
virtual std::optional<int64_t> Max() const = 0;
virtual void Collect(std::optional<int64_t> value) = 0;
};
class PAIMON_EXPORT FloatColumnStats : public ColumnStats {
public:
virtual std::optional<float> Min() const = 0;
virtual std::optional<float> Max() const = 0;
virtual void Collect(std::optional<float> value) = 0;
};
class PAIMON_EXPORT DoubleColumnStats : public ColumnStats {
public:
virtual std::optional<double> Min() const = 0;
virtual std::optional<double> Max() const = 0;
virtual void Collect(std::optional<double> value) = 0;
};
class PAIMON_EXPORT StringColumnStats : public ColumnStats {
public:
virtual const std::optional<std::string>& Min() const = 0;
virtual const std::optional<std::string>& Max() const = 0;
virtual void Collect(const std::optional<std::string>& value) = 0;
};
class PAIMON_EXPORT TimestampColumnStats : public ColumnStats {
public:
virtual std::optional<Timestamp> Min() const = 0;
virtual std::optional<Timestamp> Max() const = 0;
virtual void Collect(const std::optional<Timestamp>& value) = 0;
virtual int32_t GetPrecision() const = 0;
};
class PAIMON_EXPORT DecimalColumnStats : public ColumnStats {
public:
virtual std::optional<Decimal> Min() const = 0;
virtual std::optional<Decimal> Max() const = 0;
virtual void Collect(const std::optional<Decimal>& value) = 0;
virtual int32_t GetPrecision() const = 0;
virtual int32_t GetScale() const = 0;
};
class PAIMON_EXPORT DateColumnStats : public ColumnStats {
public:
virtual std::optional<int32_t> Min() const = 0;
virtual std::optional<int32_t> Max() const = 0;
virtual void Collect(std::optional<int32_t> value) = 0;
};
class PAIMON_EXPORT NestedColumnStats : public ColumnStats {
public:
NestedColumnStats(const FieldType& nested_type, std::optional<int64_t> null_count)
: nested_type_(nested_type), null_count_(null_count) {
assert(nested_type == FieldType::ARRAY || nested_type == FieldType::MAP ||
nested_type == FieldType::STRUCT);
}
std::optional<int64_t> NullCount() const override {
return null_count_;
}
std::string ToString() const override;
FieldType GetFieldType() const override;
private:
FieldType nested_type_;
std::optional<int64_t> null_count_;
};
} // namespace paimon