@@ -2082,3 +2082,93 @@ TEST(RNTuple, SerializeAttrSets)
2082
2082
2083
2083
ASSERT_EQ (attrSetDesc, deserializedDesc);
2084
2084
}
2085
+
2086
+ TEST (RNTuple, SerializeDescriptorWithAttrSets)
2087
+ {
2088
+ RNTupleDescriptorBuilder builder;
2089
+ builder.SetVersionForWriting ();
2090
+ builder.SetNTuple (" ntpl" , " " );
2091
+
2092
+ builder.AddField (RFieldDescriptorBuilder ()
2093
+ .FieldId (0 )
2094
+ .FieldName (" " )
2095
+ .Structure (ROOT::ENTupleStructure::kRecord )
2096
+ .MakeDescriptor ()
2097
+ .Unwrap ());
2098
+
2099
+ builder.AddField (RFieldDescriptorBuilder ()
2100
+ .FieldId (5 )
2101
+ .FieldName (" pt" )
2102
+ .TypeName (" float" )
2103
+ .Structure (ROOT::ENTupleStructure::kPlain )
2104
+ .MakeDescriptor ()
2105
+ .Unwrap ());
2106
+ builder.AddFieldLink (0 , 5 );
2107
+ builder.AddColumn (RColumnDescriptorBuilder ()
2108
+ .LogicalColumnId (0 )
2109
+ .PhysicalColumnId (0 )
2110
+ .FieldId (5 )
2111
+ .BitsOnStorage (32 )
2112
+ .Type (ROOT::ENTupleColumnType::kReal32 )
2113
+ .FirstElementIndex (1 )
2114
+ .MakeDescriptor ()
2115
+ .Unwrap ());
2116
+ builder.AddColumn (RColumnDescriptorBuilder ()
2117
+ .LogicalColumnId (1 )
2118
+ .PhysicalColumnId (1 )
2119
+ .FieldId (5 )
2120
+ .BitsOnStorage (16 )
2121
+ .Type (ROOT::ENTupleColumnType::kReal16 )
2122
+ .RepresentationIndex (1 )
2123
+ .FirstElementIndex (1 )
2124
+ .SetSuppressedDeferred ()
2125
+ .MakeDescriptor ()
2126
+ .Unwrap ());
2127
+
2128
+ RNTupleLocator locator;
2129
+ locator.SetType (ROOT::RNTupleLocator::kTypeFile );
2130
+ locator.SetPosition (128ul );
2131
+ auto attrSetDesc = ROOT::Experimental::Internal::RNTupleAttrSetDescriptor{1 , // schema version major
2132
+ 0 , // schema version minor
2133
+ 1024 , // uncomp len
2134
+ locator, " AttrSetName" };
2135
+ // First cluster
2136
+ RClusterDescriptorBuilder clusterBuilder;
2137
+ clusterBuilder.ClusterId (0 ).FirstEntryIndex (0 ).NEntries (1 );
2138
+ builder.AddCluster (clusterBuilder.MoveDescriptor ().Unwrap ());
2139
+
2140
+ RClusterGroupDescriptorBuilder cgBuilder;
2141
+ cgBuilder.ClusterGroupId (0 ).NClusters (1 ).EntrySpan (3 );
2142
+ cgBuilder.AddSortedClusters ({0 });
2143
+ builder.AddClusterGroup (cgBuilder.MoveDescriptor ().Unwrap ());
2144
+
2145
+ builder.AddAttributeSet (std::move (attrSetDesc));
2146
+ auto desc = builder.MoveDescriptor ();
2147
+
2148
+ auto context = RNTupleSerializer::SerializeHeader (nullptr , desc).Unwrap ();
2149
+ auto bufHeader = MakeUninitArray<unsigned char >(context.GetHeaderSize ());
2150
+ context = RNTupleSerializer::SerializeHeader (bufHeader.get (), desc).Unwrap ();
2151
+
2152
+ std::vector<ROOT::DescriptorId_t> physClusterIDs{context.MapClusterId (0 )};
2153
+ context.MapClusterGroupId (0 );
2154
+ auto sizePageList = RNTupleSerializer::SerializePageList (nullptr , desc, physClusterIDs, context).Unwrap ();
2155
+ EXPECT_GT (sizePageList, 0 );
2156
+ auto bufPageList = MakeUninitArray<unsigned char >(sizePageList);
2157
+ EXPECT_EQ (sizePageList,
2158
+ RNTupleSerializer::SerializePageList (bufPageList.get (), desc, physClusterIDs, context).Unwrap ());
2159
+
2160
+ auto sizeFooter = RNTupleSerializer::SerializeFooter (nullptr , desc, context).Unwrap ();
2161
+ EXPECT_GT (sizeFooter, 0 );
2162
+ auto bufFooter = MakeUninitArray<unsigned char >(sizeFooter);
2163
+ EXPECT_EQ (sizeFooter, RNTupleSerializer::SerializeFooter (bufFooter.get (), desc, context).Unwrap ());
2164
+
2165
+ builder.SetVersionForWriting ();
2166
+ RNTupleSerializer::DeserializeHeader (bufHeader.get (), context.GetHeaderSize (), builder).ThrowOnError ();
2167
+ RNTupleSerializer::DeserializeFooter (bufFooter.get (), sizeFooter, builder);
2168
+ auto deserializedDesc = builder.MoveDescriptor ();
2169
+ RNTupleSerializer::DeserializePageList (bufPageList.get (), sizePageList, 0 , deserializedDesc,
2170
+ EDeserializeMode::kForReading );
2171
+
2172
+ ASSERT_EQ (ROOT::Experimental::Internal::GetAttributeSets (desc),
2173
+ ROOT::Experimental::Internal::GetAttributeSets (deserializedDesc));
2174
+ }
0 commit comments