blob: b8a5ee3f0ad7302815e5cbfad5e4711875f34876 [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.
*/
#include "paimon/core/stats/simple_stats.h"
#include <utility>
#include <vector>
#include "arrow/api.h"
#include "paimon/common/data/binary_row_writer.h"
#include "paimon/common/data/binary_section.h"
#include "paimon/common/data/internal_array.h"
#include "paimon/common/data/internal_row.h"
#include "paimon/common/utils/murmurhash_utils.h"
#include "paimon/common/utils/serialization_utils.h"
#include "paimon/macros.h"
#include "paimon/memory/memory_pool.h"
#include "paimon/status.h"
namespace paimon {
class Bytes;
const SimpleStats& SimpleStats::EmptyStats() {
static const SimpleStats kEmptyStats(
BinaryRow::EmptyRow(), BinaryRow::EmptyRow(),
BinaryArray::FromLongArray(std::vector<int64_t>(), GetDefaultPool().get()));
return kEmptyStats;
}
BinaryRow SimpleStats::ToRow() const {
BinaryRow row(3);
std::shared_ptr<MemoryPool> pool = GetDefaultPool();
BinaryRowWriter writer(&row, 32 * 1024, pool.get());
auto min_value_bytes = SerializationUtils::SerializeBinaryRow(min_values_, pool.get());
writer.WriteBinary(0, *min_value_bytes);
auto max_value_bytes = SerializationUtils::SerializeBinaryRow(max_values_, pool.get());
writer.WriteBinary(1, *max_value_bytes);
writer.WriteArray(2, null_counts_);
writer.Complete();
return row;
}
Result<SimpleStats> SimpleStats::FromRow(const InternalRow* row, MemoryPool* pool) {
if (PAIMON_UNLIKELY(row == nullptr)) {
return Status::Invalid("internal row is null pointer");
}
if (PAIMON_UNLIKELY(pool == nullptr)) {
return Status::Invalid("memory pool is null pointer");
}
std::shared_ptr<Bytes> min_value = row->GetBinary(0);
if (PAIMON_UNLIKELY(min_value == nullptr)) {
return Status::Invalid("get min value from internal row failed.");
}
std::shared_ptr<Bytes> max_value = row->GetBinary(1);
if (PAIMON_UNLIKELY(max_value == nullptr)) {
return Status::Invalid("get max value from internal row failed.");
}
std::shared_ptr<InternalArray> null_counts = row->GetArray(2);
if (PAIMON_UNLIKELY(null_counts == nullptr)) {
return Status::Invalid("get null counts from internal row failed.");
}
PAIMON_ASSIGN_OR_RAISE(BinaryRow min_values,
SerializationUtils::DeserializeBinaryRow(min_value));
PAIMON_ASSIGN_OR_RAISE(BinaryRow max_values,
SerializationUtils::DeserializeBinaryRow(max_value));
if (min_values.GetFieldCount() == 0 && max_values.GetFieldCount() == 0 &&
null_counts->Size() == 0) {
return SimpleStats::EmptyStats();
}
return SimpleStats(min_values, max_values, BinaryArray::FromLongArray(null_counts.get(), pool));
}
int32_t SimpleStats::HashCode() const {
int32_t min_hash = min_values_.HashCode();
int32_t max_hash = max_values_.HashCode();
int32_t null_hash = null_counts_.HashCode();
int32_t hash = MurmurHashUtils::HashUnsafeBytes(reinterpret_cast<void*>(&max_hash), 0,
sizeof(max_hash), min_hash);
return MurmurHashUtils::HashUnsafeBytes(reinterpret_cast<void*>(&null_hash), 0,
sizeof(null_hash), hash);
}
bool SimpleStats::operator==(const SimpleStats& other) const {
if (this == &other) {
return true;
}
return min_values_ == other.min_values_ && max_values_ == other.max_values_ &&
null_counts_ == other.null_counts_;
}
const std::shared_ptr<arrow::DataType>& SimpleStats::DataType() {
static std::shared_ptr<arrow::DataType> data_type = arrow::struct_(
{arrow::field("_MIN_VALUES", arrow::binary(), /*nullable=*/false),
arrow::field("_MAX_VALUES", arrow::binary(), /*nullable=*/false),
arrow::field("_NULL_COUNTS", arrow::list(arrow::field("item", arrow::int64(), true)),
/*nullable=*/true)});
return data_type;
}
} // namespace paimon