blob: 8131c4c1c4871529a6cae0e781110b43ce5a6edc [file] [log] [blame]
/*
* 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 <zlib.h>
#include <Core/Settings.h>
#include <IO/ReadBufferFromString.h>
#include <IO/ReadHelpers.h>
#include <Interpreters/Context.h>
#include <Parser/SerializedPlanParser.h>
#include <Storages/SubstraitSource/Delta/Bitmap/DeltaDVRoaringBitmapArray.h>
#include <Storages/SubstraitSource/ReadBufferBuilder.h>
#include <gtest/gtest.h>
#include <tests/utils/gluten_test_util.h>
#include <roaring.hh>
#include <Common/Base85Codec.h>
#include <Common/QueryContext.h>
namespace DB::Setting
{
extern const SettingsBool enable_named_columns_in_function_tuple;
}
using namespace local_engine;
using namespace DB;
TEST(Delta_DV, roaring_bitmap_test)
{
const auto context = DB::Context::createCopy(QueryContext::globalContext());
const Poco::URI file_uri(test::gtest_data("deletion_vector_only_one.bin"));
ReadBufferFromFile in(file_uri.getPath());
char a;
readBinary(a, in);
EXPECT_EQ('\x01', a);
int size;
readBinaryBigEndian(size, in);
EXPECT_EQ(539, size);
int magic_num;
readBinaryLittleEndian(magic_num, in);
EXPECT_EQ(1681511377, magic_num);
int64_t bitmap_array_size;
readBinaryLittleEndian(bitmap_array_size, in);
EXPECT_EQ(1, bitmap_array_size);
std::vector<roaring::Roaring> roaring_bitmap_array;
roaring_bitmap_array.reserve(bitmap_array_size);
for (size_t i = 0; i < bitmap_array_size; ++i)
{
int bitmap_index;
readBinaryLittleEndian(bitmap_index, in);
roaring::Roaring r = roaring::Roaring::read(in.position());
size_t current_bitmap_size = r.getSizeInBytes();
in.ignore(current_bitmap_size);
roaring_bitmap_array.push_back(r);
int check_sum;
readBinaryBigEndian(check_sum, in);
EXPECT_EQ(1722047305, check_sum);
EXPECT_TRUE(r.contains(0));
EXPECT_TRUE(r.contains(1003));
EXPECT_TRUE(r.contains(666));
EXPECT_FALSE(r.contains(6));
EXPECT_FALSE(r.contains(26));
EXPECT_FALSE(r.contains(188));
}
}
TEST(Delta_DV, multi_roaring_bitmap_test)
{
const auto context = DB::Context::createCopy(QueryContext::globalContext());
const Poco::URI file_uri(test::gtest_data("deletion_vector_multiple.bin"));
ReadBufferFromFile in(file_uri.getPath());
in.seek(426433, SEEK_SET);
int size;
readBinaryBigEndian(size, in);
EXPECT_EQ(426424, size);
int checksum_value = static_cast<Int32>(crc32_z(0L, reinterpret_cast<unsigned char*>(in.position()), size));
int magic_num;
readBinaryLittleEndian(magic_num, in);
EXPECT_EQ(1681511377, magic_num);
int64_t bitmap_array_size;
readBinaryLittleEndian(bitmap_array_size, in);
EXPECT_EQ(1, bitmap_array_size);
std::vector<roaring::Roaring> roaring_bitmap_array;
roaring_bitmap_array.reserve(bitmap_array_size);
for (size_t i = 0; i < bitmap_array_size; ++i)
{
int bitmap_index;
readBinaryLittleEndian(bitmap_index, in);
roaring::Roaring r = roaring::Roaring::read(in.position());
size_t current_bitmap_size = r.getSizeInBytes();
in.ignore(current_bitmap_size);
roaring_bitmap_array.push_back(r);
EXPECT_TRUE(r.contains(5));
EXPECT_TRUE(r.contains(3618));
EXPECT_TRUE(r.contains(155688));
EXPECT_FALSE(r.contains(3));
EXPECT_FALSE(r.contains(6886));
EXPECT_FALSE(r.contains(129900));
}
int expected_checksum;
readBinaryBigEndian(expected_checksum, in);
EXPECT_EQ(expected_checksum, checksum_value);
}
TEST(Delta_DV, DeltaDVRoaringBitmapArray)
{
const auto context = DB::Context::createCopy(QueryContext::globalContext());
const std::string file_uri(test::gtest_uri("deletion_vector_multiple.bin"));
const std::string file_uri1(test::gtest_uri("deletion_vector_only_one.bin"));
DeltaDVRoaringBitmapArray bitmap_array{};
bitmap_array.rb_read(file_uri, 426433, 426424, context);
EXPECT_TRUE(bitmap_array.rb_contains(5));
EXPECT_TRUE(bitmap_array.rb_contains(3618));
EXPECT_TRUE(bitmap_array.rb_contains(155688));
EXPECT_FALSE(bitmap_array.rb_contains(3));
EXPECT_FALSE(bitmap_array.rb_contains(6886));
EXPECT_FALSE(bitmap_array.rb_contains(129900));
EXPECT_FALSE(bitmap_array.rb_contains(0));
EXPECT_FALSE(bitmap_array.rb_contains(1003));
EXPECT_FALSE(bitmap_array.rb_contains(880));
bitmap_array.rb_add(3000000000);
EXPECT_TRUE(bitmap_array.rb_contains(3000000000));
bitmap_array.rb_add(5000000000);
EXPECT_TRUE(bitmap_array.rb_contains(5000000000));
bitmap_array.rb_add(10000000000);
EXPECT_TRUE(bitmap_array.rb_contains(10000000000));
DeltaDVRoaringBitmapArray bitmap_array1{};
bitmap_array1.rb_read(file_uri1, 1, 539, context);
EXPECT_TRUE(bitmap_array1.rb_contains(0));
EXPECT_TRUE(bitmap_array1.rb_contains(1003));
EXPECT_TRUE(bitmap_array1.rb_contains(880));
EXPECT_FALSE(bitmap_array1.rb_contains(6));
EXPECT_FALSE(bitmap_array1.rb_contains(26));
EXPECT_FALSE(bitmap_array1.rb_contains(188));
bitmap_array.rb_merge(bitmap_array1);
EXPECT_TRUE(bitmap_array.rb_contains(0));
EXPECT_TRUE(bitmap_array.rb_contains(1003));
EXPECT_TRUE(bitmap_array.rb_contains(880));
const std::string file_uri2(test::gtest_uri("deletion_vector_long_values.bin"));
DeltaDVRoaringBitmapArray bitmap_array2{};
bitmap_array2.rb_read(file_uri2, 1, 4047, context);
EXPECT_FALSE(bitmap_array2.rb_is_empty());
EXPECT_EQ(2098, bitmap_array2.cardinality());
EXPECT_TRUE(bitmap_array2.rb_contains(0));
EXPECT_TRUE(bitmap_array2.rb_contains(1003));
EXPECT_TRUE(bitmap_array2.rb_contains(880));
Int64 v = 2000000010;
EXPECT_TRUE(bitmap_array2.rb_contains(v));
UInt64 vv = 2000000010;
EXPECT_TRUE(bitmap_array2.rb_contains(vv));
v = 3000000990;
EXPECT_TRUE(bitmap_array2.rb_contains(v));
vv = 3000000990;
EXPECT_TRUE(bitmap_array2.rb_contains(vv));
v = 3000000990;
EXPECT_TRUE(bitmap_array2.rb_contains(v));
vv = 3000000990;
EXPECT_TRUE(bitmap_array2.rb_contains(vv));
v = 5000000298;
EXPECT_TRUE(bitmap_array2.rb_contains(v));
vv = 5000000298;
EXPECT_TRUE(bitmap_array2.rb_contains(vv));
v = 10000000099;
EXPECT_TRUE(bitmap_array2.rb_contains(v));
vv = 10000000099;
EXPECT_TRUE(bitmap_array2.rb_contains(vv));
v = 100000000050;
EXPECT_TRUE(bitmap_array2.rb_contains(v));
vv = 100000000050;
EXPECT_TRUE(bitmap_array2.rb_contains(vv));
EXPECT_FALSE(bitmap_array2.rb_contains(6));
EXPECT_FALSE(bitmap_array2.rb_contains(26));
EXPECT_FALSE(bitmap_array2.rb_contains(188));
bitmap_array2.rb_clear();
EXPECT_TRUE(bitmap_array2.rb_is_empty());
DeltaDVRoaringBitmapArray bitmap_array3{};
bitmap_array3.rb_add(3000000000);
bitmap_array3.rb_add(5000000000);
bitmap_array3.rb_add(10000000000);
EXPECT_TRUE(bitmap_array3.rb_contains(3000000000));
EXPECT_TRUE(bitmap_array3.rb_contains(5000000000));
EXPECT_TRUE(bitmap_array3.rb_contains(10000000000));
EXPECT_FALSE(bitmap_array3.rb_contains(10000000001));
EXPECT_FALSE(bitmap_array3.rb_contains(5000000001));
EXPECT_FALSE(bitmap_array3.rb_contains(3000000001));
}
TEST(Delta_DV, Base85Codec)
{
const String uuid_str = "a5d455b6-92f1-4c89-a26d-93a1d5ce3e89";
DB::ReadBufferFromString rb = DB::ReadBufferFromString(uuid_str);
UUID uuid;
readUUIDText(uuid, rb);
const String encoded = Base85Codec::encodeUUID(uuid);
EXPECT_EQ("RpnINLjqk5Qhu9/!Y{vn", encoded);
auto decodeUUID = Base85Codec::decodeUUID(encoded);
EXPECT_EQ(uuid_str, toString(decodeUUID));
}