Skip to content

Commit

Permalink
Add headers for type/field/schema
Browse files Browse the repository at this point in the history
  • Loading branch information
lidavidm committed Jan 21, 2025
1 parent f17fd2f commit a32ed60
Show file tree
Hide file tree
Showing 9 changed files with 997 additions and 3 deletions.
4 changes: 2 additions & 2 deletions docs/Doxyfile
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ INLINE_INHERITED_MEMB = NO
# shortest path that makes the file name unique will be used
# The default value is: YES.

FULL_PATH_NAMES = NO
FULL_PATH_NAMES = YES

# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
# Stripping is only done if one of the specified strings matches the left-hand
Expand All @@ -207,7 +207,7 @@ FULL_PATH_NAMES = NO
# will be relative from the directory where doxygen is started.
# This tag requires that the tag FULL_PATH_NAMES is set to YES.

STRIP_FROM_PATH =
STRIP_FROM_PATH = ../src

# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
# path mentioned in the documentation of a class, which tells the reader which
Expand Down
2 changes: 1 addition & 1 deletion src/iceberg/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
# specific language governing permissions and limitations
# under the License.

set(ICEBERG_SOURCES demo_table.cc)
set(ICEBERG_SOURCES demo_table.cc type.cc)

add_iceberg_lib(iceberg
SOURCES
Expand Down
63 changes: 63 additions & 0 deletions src/iceberg/schema.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*
* 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

/// \file iceberg/schema.h
/// Schemas for Iceberg tables. This header contains the definition of Schema
/// and any utility functions. See iceberg/type.h and iceberg/field.h as well.

#include <cstdint>
#include <string>
#include <vector>

#include "iceberg/iceberg_export.h"
#include "iceberg/schema_field.h"
#include "iceberg/type.h"

namespace iceberg {

/// \brief A schema for a Table.
///
/// A schema is a list of typed columns, along with a unique integer ID. A
/// Table may have different schemas over its lifetime due to schema
/// evolution.
class ICEBERG_EXPORT Schema : public StructType {
public:
Schema(int32_t schema_id, std::vector<SchemaField> fields);

/// \brief Get the schema ID.
///
/// Schemas are identified by a unique ID for the purposes of schema
/// evolution.
[[nodiscard]] int32_t schema_id() const;

/// \brief Get a user-readable string representation of the schema.
[[nodiscard]] std::string ToString() const;

friend bool operator==(const Schema& lhs, const Schema& rhs) { return lhs.Equals(rhs); }

friend bool operator!=(const Schema& lhs, const Schema& rhs) { return !(lhs == rhs); }

private:
/// \brief Compare two schemas for equality.
[[nodiscard]] bool Equals(const Schema& other) const;
};

} // namespace iceberg
88 changes: 88 additions & 0 deletions src/iceberg/schema_field.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
* 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

/// \file iceberg/field.h
/// A (schema) field is a name and a type and is part of a schema or nested
/// type (e.g. a struct).

#include <cstdint>
#include <memory>
#include <string>
#include <string_view>

#include "iceberg/iceberg_export.h"
#include "iceberg/type_fwd.h"
#include "iceberg/util/formattable.h"

namespace iceberg {

/// \brief A type combined with a name.
class ICEBERG_EXPORT SchemaField : public iceberg::util::Formattable {
public:
/// \brief Construct a field.
/// \param[in] field_id The field ID.
/// \param[in] name The field name.
/// \param[in] type The field type.
/// \param[in] optional Whether values of this field are required or nullable.
SchemaField(int32_t field_id, std::string name, std::shared_ptr<Type> type,
bool optional);

/// \brief Construct an optional (nullable) field.
static SchemaField MakeOptional(int32_t field_id, std::string name,
std::shared_ptr<Type> type);
/// \brief Construct a required (non-null) field.
static SchemaField MakeRequired(int32_t field_id, std::string name,
std::shared_ptr<Type> type);

/// \brief Get the field ID.
[[nodiscard]] int32_t field_id() const;

/// \brief Get the field name.
[[nodiscard]] std::string_view name() const;

/// \brief Get the field type.
[[nodiscard]] const std::shared_ptr<Type>& type() const;

/// \brief Get whether the field is optional.
[[nodiscard]] bool optional() const;

/// \brief Get a user-readable string representation of the field.
[[nodiscard]] std::string ToString() const;

friend bool operator==(const SchemaField& lhs, const SchemaField& rhs) {
return lhs.Equals(rhs);
}

friend bool operator!=(const SchemaField& lhs, const SchemaField& rhs) {
return !(lhs == rhs);
}

private:
/// \brief Compare two fields for equality.
[[nodiscard]] bool Equals(const SchemaField& other) const;

int32_t field_id_;
std::string name_;
std::shared_ptr<Type> type_;
bool optional_;
};

} // namespace iceberg
Loading

0 comments on commit a32ed60

Please sign in to comment.