This is an automated email from the ASF dual-hosted git repository.

mgrigorov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/avro.git


The following commit(s) were added to refs/heads/main by this push:
     new 2205c20dd AVRO-4037: [C++] Add local-timestamp-millis, 
local-timestamp-micros logical types (#3053)
2205c20dd is described below

commit 2205c20dd6b60fb7a04f902b52e6746d29ca284c
Author: glywk <[email protected]>
AuthorDate: Mon Aug 19 10:41:47 2024 +0200

    AVRO-4037: [C++] Add local-timestamp-millis, local-timestamp-micros logical 
types (#3053)
    
    * [C++] Add local-timestamp-millis, local-timestamp-micros logical types as 
defined since specification 1.10.0
    
    * Align exception comment on logical type names
    
    Co-authored-by: Kalle Olavi Niemitalo <[email protected]>
    
    * [C++] Fix local-timestamp-micros exception comment
    
    * [C++] Fix include vector dependency location
    
    ---------
    
    Co-authored-by: Kalle Olavi Niemitalo <[email protected]>
---
 lang/c++/impl/Compiler.cc            |  4 ++++
 lang/c++/impl/LogicalType.cc         |  6 ++++++
 lang/c++/impl/Node.cc                | 12 ++++++++++++
 lang/c++/include/avro/LogicalType.hh |  2 ++
 lang/c++/include/avro/Node.hh        |  1 +
 lang/c++/test/SchemaTests.cc         | 28 ++++++++++++++++++++++++++++
 6 files changed, 53 insertions(+)

diff --git a/lang/c++/impl/Compiler.cc b/lang/c++/impl/Compiler.cc
index 3b287c9ee..2599f7cc6 100644
--- a/lang/c++/impl/Compiler.cc
+++ b/lang/c++/impl/Compiler.cc
@@ -369,6 +369,10 @@ static LogicalType makeLogicalType(const Entity &e, const 
Object &m) {
         t = LogicalType::TIMESTAMP_MILLIS;
     else if (typeField == "timestamp-micros")
         t = LogicalType::TIMESTAMP_MICROS;
+    else if (typeField == "local-timestamp-millis")
+        t = LogicalType::LOCAL_TIMESTAMP_MILLIS;
+    else if (typeField == "local-timestamp-micros")
+        t = LogicalType::LOCAL_TIMESTAMP_MICROS;
     else if (typeField == "duration")
         t = LogicalType::DURATION;
     else if (typeField == "uuid")
diff --git a/lang/c++/impl/LogicalType.cc b/lang/c++/impl/LogicalType.cc
index 5e03a313d..a7260accd 100644
--- a/lang/c++/impl/LogicalType.cc
+++ b/lang/c++/impl/LogicalType.cc
@@ -71,6 +71,12 @@ void LogicalType::printJson(std::ostream &os) const {
         case TIMESTAMP_MICROS:
             os << R"("logicalType": "timestamp-micros")";
             break;
+        case LOCAL_TIMESTAMP_MILLIS:
+            os << R"("logicalType": "local-timestamp-millis")";
+            break;
+        case LOCAL_TIMESTAMP_MICROS:
+            os << R"("logicalType": "local-timestamp-micros")";
+            break;
         case DURATION:
             os << R"("logicalType": "duration")";
             break;
diff --git a/lang/c++/impl/Node.cc b/lang/c++/impl/Node.cc
index 14ce6ecf0..9f641e295 100644
--- a/lang/c++/impl/Node.cc
+++ b/lang/c++/impl/Node.cc
@@ -189,6 +189,18 @@ void Node::setLogicalType(LogicalType logicalType) {
                                 "LONG type");
             }
             break;
+        case LogicalType::LOCAL_TIMESTAMP_MILLIS:
+            if (type_ != AVRO_LONG) {
+                throw Exception("LOCAL-TIMESTAMP-MILLIS logical type can only 
annotate "
+                                "LONG type");
+            }
+            break;
+        case LogicalType::LOCAL_TIMESTAMP_MICROS:
+            if (type_ != AVRO_LONG) {
+                throw Exception("LOCAL-TIMESTAMP-MICROS logical type can only 
annotate "
+                                "LONG type");
+            }
+            break;
         case LogicalType::DURATION:
             if (type_ != AVRO_FIXED || fixedSize() != 12) {
                 throw Exception("DURATION logical type can only annotate "
diff --git a/lang/c++/include/avro/LogicalType.hh 
b/lang/c++/include/avro/LogicalType.hh
index ff430fd08..3156f164e 100644
--- a/lang/c++/include/avro/LogicalType.hh
+++ b/lang/c++/include/avro/LogicalType.hh
@@ -35,6 +35,8 @@ public:
         TIME_MICROS,
         TIMESTAMP_MILLIS,
         TIMESTAMP_MICROS,
+        LOCAL_TIMESTAMP_MILLIS,
+        LOCAL_TIMESTAMP_MICROS,
         DURATION,
         UUID
     };
diff --git a/lang/c++/include/avro/Node.hh b/lang/c++/include/avro/Node.hh
index f76078b05..e1a8e660f 100644
--- a/lang/c++/include/avro/Node.hh
+++ b/lang/c++/include/avro/Node.hh
@@ -25,6 +25,7 @@
 #include <cassert>
 #include <memory>
 #include <utility>
+#include <vector>
 
 #include "CustomAttributes.hh"
 #include "Exception.hh"
diff --git a/lang/c++/test/SchemaTests.cc b/lang/c++/test/SchemaTests.cc
index 543f9e050..f57cfd135 100644
--- a/lang/c++/test/SchemaTests.cc
+++ b/lang/c++/test/SchemaTests.cc
@@ -217,6 +217,8 @@ const char *roundTripSchemas[] = {
     R"({"type":"long","logicalType":"time-micros"})",
     R"({"type":"long","logicalType":"timestamp-millis"})",
     R"({"type":"long","logicalType":"timestamp-micros"})",
+    R"({"type":"long","logicalType":"local-timestamp-millis"})",
+    R"({"type":"long","logicalType":"local-timestamp-micros"})",
     R"({"type":"fixed","name":"test","size":12,"logicalType":"duration"})",
     R"({"type":"string","logicalType":"uuid"})",
 
@@ -242,6 +244,8 @@ const char *malformedLogicalTypes[] = {
     R"({"type":"string","logicalType":"time-micros"})",
     R"({"type":"string","logicalType":"timestamp-millis"})",
     R"({"type":"string","logicalType":"timestamp-micros"})",
+    R"({"type":"string","logicalType":"local-timestamp-millis"})",
+    R"({"type":"string","logicalType":"local-timestamp-micros"})",
     R"({"type":"string","logicalType":"duration"})",
     R"({"type":"long","logicalType":"uuid"})",
     // Missing the required field 'precision'.
@@ -356,6 +360,12 @@ static void testLogicalTypes() {
     const char *timestampMicrosType = "{\n\
         \"type\": \"long\", \"logicalType\": \"timestamp-micros\"\n\
     }";
+    const char *localTimestampMillisType = "{\n\
+        \"type\": \"long\", \"logicalType\": \"local-timestamp-millis\"\n\
+    }";
+    const char *localTimestampMicrosType = "{\n\
+        \"type\": \"long\", \"logicalType\": \"local-timestamp-micros\"\n\
+    }";
     const char *durationType = "{\n\
         \"type\": \"fixed\",\n\
         \"size\": 12,\n\
@@ -436,6 +446,24 @@ static void testLogicalTypes() {
         GenericDatum datum(schema);
         BOOST_CHECK(datum.logicalType().type() == 
LogicalType::TIMESTAMP_MICROS);
     }
+    {
+        BOOST_TEST_CHECKPOINT(localTimestampMillisType);
+        ValidSchema schema = 
compileJsonSchemaFromString(localTimestampMillisType);
+        BOOST_CHECK(schema.root()->type() == AVRO_LONG);
+        LogicalType logicalType = schema.root()->logicalType();
+        BOOST_CHECK(logicalType.type() == LogicalType::LOCAL_TIMESTAMP_MILLIS);
+        GenericDatum datum(schema);
+        BOOST_CHECK(datum.logicalType().type() == 
LogicalType::LOCAL_TIMESTAMP_MILLIS);
+    }
+    {
+        BOOST_TEST_CHECKPOINT(localTimestampMicrosType);
+        ValidSchema schema = 
compileJsonSchemaFromString(localTimestampMicrosType);
+        BOOST_CHECK(schema.root()->type() == AVRO_LONG);
+        LogicalType logicalType = schema.root()->logicalType();
+        BOOST_CHECK(logicalType.type() == LogicalType::LOCAL_TIMESTAMP_MICROS);
+        GenericDatum datum(schema);
+        BOOST_CHECK(datum.logicalType().type() == 
LogicalType::LOCAL_TIMESTAMP_MICROS);
+    }
     {
         BOOST_TEST_CHECKPOINT(durationType);
         ValidSchema schema = compileJsonSchemaFromString(durationType);

Reply via email to