Skip to content

Commit b8895e2

Browse files
committed
feat: implement literal expressions with binary serialization support
1 parent 3b945a0 commit b8895e2

File tree

13 files changed

+841
-68
lines changed

13 files changed

+841
-68
lines changed

src/iceberg/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ set(ICEBERG_SOURCES
5252
util/decimal.cc
5353
util/murmurhash3_internal.cc
5454
util/timepoint.cc
55-
util/gzip_internal.cc)
55+
util/gzip_internal.cc
56+
util/conversions.cc
57+
util/literal_format.cc)
5658

5759
set(ICEBERG_STATIC_BUILD_INTERFACE_LIBS)
5860
set(ICEBERG_SHARED_BUILD_INTERFACE_LIBS)

src/iceberg/expression/literal.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#include <concepts>
2424

2525
#include "iceberg/exception.h"
26+
#include "iceberg/util/conversions.h"
27+
#include "iceberg/util/literal_format.h"
2628

2729
namespace iceberg {
2830

@@ -151,11 +153,11 @@ Literal Literal::Binary(std::vector<uint8_t> value) {
151153

152154
Result<Literal> Literal::Deserialize(std::span<const uint8_t> data,
153155
std::shared_ptr<PrimitiveType> type) {
154-
return NotImplemented("Deserialization of Literal is not implemented yet");
156+
return Conversions::FromBytes(type, data);
155157
}
156158

157159
Result<std::vector<uint8_t>> Literal::Serialize() const {
158-
return NotImplemented("Serialization of Literal is not implemented yet");
160+
return Conversions::ToBytes(*this);
159161
}
160162

161163
// Getters

src/iceberg/expression/literal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,8 @@ class ICEBERG_EXPORT Literal {
144144
Literal(Value value, std::shared_ptr<PrimitiveType> type);
145145

146146
friend class LiteralCaster;
147+
friend class Conversions;
147148

148-
private:
149149
Value value_;
150150
std::shared_ptr<PrimitiveType> type_;
151151
};

src/iceberg/type.cc

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <format>
2323
#include <iterator>
2424
#include <memory>
25+
#include <utility>
2526

2627
#include "iceberg/exception.h"
2728
#include "iceberg/util/formatter.h" // IWYU pragma: keep
@@ -390,4 +391,45 @@ std::shared_ptr<StructType> struct_(std::vector<SchemaField> fields) {
390391
return std::make_shared<StructType>(std::move(fields));
391392
}
392393

394+
std::string_view ToString(TypeId id) {
395+
switch (id) {
396+
case TypeId::kStruct:
397+
return "struct";
398+
case TypeId::kList:
399+
return "list";
400+
case TypeId::kMap:
401+
return "map";
402+
case TypeId::kBoolean:
403+
return "boolean";
404+
case TypeId::kInt:
405+
return "int";
406+
case TypeId::kLong:
407+
return "long";
408+
case TypeId::kFloat:
409+
return "float";
410+
case TypeId::kDouble:
411+
return "double";
412+
case TypeId::kDecimal:
413+
return "decimal";
414+
case TypeId::kDate:
415+
return "date";
416+
case TypeId::kTime:
417+
return "time";
418+
case TypeId::kTimestamp:
419+
return "timestamp";
420+
case TypeId::kTimestampTz:
421+
return "timestamptz";
422+
case TypeId::kString:
423+
return "string";
424+
case TypeId::kUuid:
425+
return "uuid";
426+
case TypeId::kFixed:
427+
return "fixed";
428+
case TypeId::kBinary:
429+
return "binary";
430+
}
431+
432+
std::unreachable();
433+
}
434+
393435
} // namespace iceberg

src/iceberg/type.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,4 +520,13 @@ ICEBERG_EXPORT std::shared_ptr<MapType> map(SchemaField key, SchemaField value);
520520

521521
/// @}
522522

523+
/// \brief Get the lowercase string representation of a TypeId.
524+
///
525+
/// This returns the same lowercase string as used by Type::ToString() methods.
526+
/// For example: TypeId::kBoolean -> "boolean", TypeId::kInt -> "int", etc.
527+
///
528+
/// \param id The TypeId to convert to string
529+
/// \return A string_view containing the lowercase type name
530+
ICEBERG_EXPORT std::string_view ToString(TypeId id);
531+
523532
} // namespace iceberg

0 commit comments

Comments
 (0)