| /* |
| * 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/catalog/table.h" |
| |
| #include "arrow/api.h" |
| #include "gtest/gtest.h" |
| #include "paimon/core/schema/schema_manager.h" |
| #include "paimon/core/schema/table_schema.h" |
| #include "paimon/schema/schema.h" |
| #include "paimon/testing/utils/testharness.h" |
| |
| namespace paimon::test { |
| |
| TEST(TableTest, TestCreateWithUnknownDatabase) { |
| auto dir = UniqueTestDirectory::Create(); |
| ASSERT_TRUE(dir); |
| |
| SchemaManager schema_manager(dir->GetFileSystem(), dir->Str()); |
| auto schema = |
| arrow::schema({arrow::field("id", arrow::int32(), /*nullable=*/false), |
| arrow::field("name", arrow::utf8()), arrow::field("value", arrow::int64())}); |
| std::vector<std::string> partition_keys = {"name"}; |
| std::vector<std::string> primary_keys = {"id"}; |
| std::map<std::string, std::string> options = { |
| {"file.format", "orc"}, |
| {"commit.force-compact", "true"}, |
| }; |
| |
| ASSERT_OK_AND_ASSIGN([[maybe_unused]] std::unique_ptr<TableSchema> created_schema, |
| schema_manager.CreateTable(schema, partition_keys, primary_keys, options)); |
| |
| ASSERT_OK_AND_ASSIGN(std::shared_ptr<Table> table, |
| Table::Create(dir->GetFileSystem(), dir->Str(), Identifier("tbl1"))); |
| |
| EXPECT_EQ(table->Name(), "tbl1"); |
| EXPECT_EQ(table->FullName(), "tbl1"); |
| |
| std::shared_ptr<Schema> latest_schema = table->LatestSchema(); |
| ASSERT_NE(latest_schema, nullptr); |
| auto data_schema = std::dynamic_pointer_cast<DataSchema>(latest_schema); |
| ASSERT_TRUE(data_schema != nullptr); |
| ASSERT_TRUE(std::dynamic_pointer_cast<TableSchema>(latest_schema) != nullptr); |
| EXPECT_EQ(data_schema->Id(), 0); |
| EXPECT_EQ(data_schema->PartitionKeys(), partition_keys); |
| EXPECT_EQ(data_schema->PrimaryKeys(), primary_keys); |
| } |
| |
| TEST(TableTest, TestCreateFailedWithNonExistSchema) { |
| auto dir = UniqueTestDirectory::Create(); |
| ASSERT_TRUE(dir); |
| auto fs = dir->GetFileSystem(); |
| SchemaManager schema_manager(fs, dir->Str()); |
| auto schema = |
| arrow::schema({arrow::field("id", arrow::int32(), /*nullable=*/false), |
| arrow::field("name", arrow::utf8()), arrow::field("value", arrow::int64())}); |
| std::vector<std::string> partition_keys = {"name"}; |
| std::vector<std::string> primary_keys = {"id"}; |
| std::map<std::string, std::string> options = { |
| {"file.format", "orc"}, |
| {"commit.force-compact", "true"}, |
| }; |
| |
| ASSERT_OK_AND_ASSIGN([[maybe_unused]] std::unique_ptr<TableSchema> created_schema, |
| schema_manager.CreateTable(schema, partition_keys, primary_keys, options)); |
| |
| // remove schema |
| std::string schema_path = schema_manager.ToSchemaPath(0); |
| ASSERT_OK(fs->Delete(schema_path, /*recursive=*/false)); |
| // check create table failed |
| ASSERT_NOK_WITH_MSG( |
| Table::Create(fs, dir->Str(), Identifier("tbl1")), |
| "load table schema for Identifier{database='unknown', table='tbl1'} failed"); |
| } |
| |
| } // namespace paimon::test |