23#include <boost/property_tree/json_parser.hpp>
25#include "hazelcast/client/serialization/serialization.h"
26#include "hazelcast/client/serialization/field_kind.h"
27#include "hazelcast/client/serialization/pimpl/compact/schema.h"
28#include "hazelcast/client/serialization/generic_record_builder.h"
29#include "hazelcast/client/serialization/generic_record.h"
30#include "hazelcast/client/protocol/codec/codecs.h"
31#include "hazelcast/client/spi/impl/ClientInvocation.h"
32#include "hazelcast/client/spi/ClientContext.h"
33#include "hazelcast/client/cluster.h"
34#include "hazelcast/client/spi/impl/ClientExecutionServiceImpl.h"
35#include "hazelcast/util/Bits.h"
36#include "hazelcast/client/client_properties.h"
40namespace serialization {
43field_descriptor::field_descriptor(field_kind k, int32_t i, int32_t o, int8_t b)
52operator==(
const field_descriptor& x,
const field_descriptor& y)
54 return x.kind == y.kind;
58operator<<(std::ostream& os,
const field_descriptor& fd)
60 return os <<
"FieldDescriptor{"
61 <<
"kind=" << fd.kind <<
", index=" << fd.index
62 <<
", offset=" << fd.offset <<
", bitOffset=" << fd.bit_offset
73namespace serialization {
74namespace generic_record {
80 cstr ? boost::optional<std::string>{ std::string{ cstr } }
85 : strategy_{ strategy::default_builder }
86 , already_built_{ false }
87 , writer_or_schema_{ pimpl::schema_writer{
std::move(type_name) } }
92 : strategy_{ strategy::schema_bounded }
93 , already_built_{ false }
94 , writer_or_schema_{
std::move(record_schema) }
99 std::shared_ptr<pimpl::schema> record_schema,
100 std::unordered_map<std::string, boost::any> objects)
101 : strategy_{ strategy::cloner }
102 , already_built_{ false }
103 , objects_{
std::move(objects) }
104 , writer_or_schema_{
std::move(record_schema) }
109generic_record_builder::check_type_with_schema(
const pimpl::schema& schema,
110 const std::string& field_name,
111 field_kind kind)
const
113 boost::optional<pimpl::field_descriptor> fd = schema.get_field(field_name);
116 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization{
117 boost::str(boost::format(
"Invalid field name: '%1%' for %2%") %
118 field_name % schema) });
121 if (fd->kind != kind) {
122 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization{ boost::str(
124 "Invalid field kind: '%1%' for %2%, expected : %3%, given : %4%") %
125 field_name % schema % fd->kind % kind) });
132 if (strategy_ == strategy::default_builder) {
133 pimpl::schema_writer& writer =
134 boost::get<pimpl::schema_writer>(writer_or_schema_);
136 already_built_ =
true;
137 return generic_record{ std::make_shared<pimpl::schema>(std::move(writer).
build()), std::move(objects_) };
139 std::shared_ptr<pimpl::schema> schema = boost::get<std::shared_ptr<pimpl::schema>>(writer_or_schema_);
141 if (strategy_ == strategy::schema_bounded) {
142 const auto& fields = schema->fields();
144 for (
const auto& p : fields) {
145 const std::string& field_name = p.first;
147 if (objects_.find(field_name) == end(objects_)) {
148 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization{
149 "Found an unset field " + field_name +
150 ". All the fields must be set before build" });
155 already_built_ =
true;
156 return generic_record{ std::move(schema), std::move(objects_) };
163 return write(std::move(field_name), value, field_kind::BOOLEAN);
169 return write(std::move(field_name), value, field_kind::INT8);
175 return write(std::move(field_name), value, field_kind::INT16);
181 return write(std::move(field_name), value, field_kind::INT32);
187 return write(std::move(field_name), value, field_kind::INT64);
193 return write(std::move(field_name), value, field_kind::FLOAT32);
199 return write(std::move(field_name), value, field_kind::FLOAT64);
204 boost::optional<bool> value)
206 return write(std::move(field_name), value, field_kind::NULLABLE_BOOLEAN);
211 boost::optional<int8_t> value)
213 return write(std::move(field_name), value, field_kind::NULLABLE_INT8);
218 boost::optional<int16_t> value)
220 return write(std::move(field_name), value, field_kind::NULLABLE_INT16);
225 boost::optional<int32_t> value)
227 return write(std::move(field_name), value, field_kind::NULLABLE_INT32);
232 boost::optional<int64_t> value)
234 return write(std::move(field_name), value, field_kind::NULLABLE_INT64);
239 boost::optional<float> value)
241 return write(std::move(field_name), value, field_kind::NULLABLE_FLOAT32);
246 boost::optional<double> value)
248 return write(std::move(field_name), value, field_kind::NULLABLE_FLOAT64);
253 std::string field_name,
254 boost::optional<generic_record> value)
256 return write(std::move(field_name), std::move(value), field_kind::COMPACT);
261 boost::optional<big_decimal> value)
263 return write(std::move(field_name), value, field_kind::DECIMAL);
268 boost::optional<local_time> value)
270 return write(std::move(field_name), value, field_kind::TIME);
275 boost::optional<local_date> value)
277 return write(std::move(field_name), value, field_kind::DATE);
282 boost::optional<local_date_time> value)
284 return write(std::move(field_name), value, field_kind::TIMESTAMP);
289 std::string field_name,
290 boost::optional<offset_date_time> value)
292 return write(std::move(field_name), value, field_kind::TIMESTAMP_WITH_TIMEZONE);
297 boost::optional<std::string> value)
299 return write(std::move(field_name), std::move(value), field_kind::STRING);
304 std::string field_name,
305 boost::optional<std::vector<bool>> value)
308 std::move(field_name), std::move(value), field_kind::ARRAY_OF_BOOLEAN);
313 std::vector<bool> value)
316 std::move(field_name), boost::optional<std::vector<bool>>(std::move(value)));
321 std::initializer_list<bool> value)
324 std::move(field_name), std::vector<bool>(value));
329 std::string field_name,
330 boost::optional<std::vector<int8_t>> value)
332 return write(std::move(field_name), std::move(value), field_kind::ARRAY_OF_INT8);
337 std::vector<int8_t> value)
340 boost::optional<std::vector<int8_t>>(std::move(value)));
345 std::initializer_list<int8_t> value)
348 std::vector<int8_t>(value));
353 std::string field_name,
354 boost::optional<std::vector<int16_t>> value)
357 std::move(field_name), std::move(value), field_kind::ARRAY_OF_INT16);
362 std::vector<int16_t> value)
365 std::move(field_name), boost::optional<std::vector<int16_t>>(std::move(value)));
370 std::initializer_list<int16_t> value)
373 std::move(field_name), std::vector<int16_t>(value));
378 std::string field_name,
379 boost::optional<std::vector<int32_t>> value)
382 std::move(field_name), std::move(value), field_kind::ARRAY_OF_INT32);
387 std::vector<int32_t> value)
390 std::move(field_name), boost::optional<std::vector<int32_t>>(std::move(value)));
395 std::initializer_list<int32_t> value)
398 std::move(field_name), std::vector<int32_t>(value));
403 std::string field_name,
404 boost::optional<std::vector<int64_t>> value)
407 std::move(field_name), std::move(value), field_kind::ARRAY_OF_INT64);
412 std::vector<int64_t> value)
415 std::move(field_name), boost::optional<std::vector<int64_t>>(std::move(value)));
420 std::initializer_list<int64_t> value)
423 std::move(field_name), std::vector<int64_t>(value));
428 std::string field_name,
429 boost::optional<std::vector<float>> value)
432 std::move(field_name), std::move(value), field_kind::ARRAY_OF_FLOAT32);
437 std::vector<float> value)
440 std::move(field_name), boost::optional<std::vector<float>>(std::move(value)));
445 std::initializer_list<float> value)
448 std::move(field_name), std::vector<float>(value));
453 std::string field_name,
454 boost::optional<std::vector<double>> value)
457 std::move(field_name), std::move(value), field_kind::ARRAY_OF_FLOAT64);
462 std::vector<double> value)
465 std::move(field_name), boost::optional<std::vector<double>>(std::move(value)));
470 std::initializer_list<double> value)
473 std::move(field_name), std::vector<double>(value));
477std::vector<boost::optional<T>>
478to_nullable(std::vector<T> value)
480 std::vector<boost::optional<T>> value_opt;
482 value_opt.reserve(value.size());
484 transform(begin(value), end(value), back_inserter(value_opt), [](T value) {
485 return boost::optional<T>{ value };
491generic_record_builder&
493 std::string field_name,
494 boost::optional<std::vector<boost::optional<bool>>> value)
496 return write(std::move(field_name),
498 field_kind::ARRAY_OF_NULLABLE_BOOLEAN);
503 std::vector<bool> value)
506 to_nullable(std::move(value)));
511 std::initializer_list<bool> value)
514 std::vector<bool>(value));
519 std::string field_name,
520 boost::optional<std::vector<boost::optional<int8_t>>> value)
523 std::move(field_name), std::move(value), field_kind::ARRAY_OF_NULLABLE_INT8);
528 std::vector<int8_t> value)
531 to_nullable(std::move(value)));
536 std::initializer_list<int8_t> value)
539 std::vector<int8_t>(value));
544 std::string field_name,
545 boost::optional<std::vector<boost::optional<int16_t>>> value)
548 std::move(field_name), std::move(value), field_kind::ARRAY_OF_NULLABLE_INT16);
553 std::vector<int16_t> value)
556 to_nullable(std::move(value)));
561 std::initializer_list<int16_t> value)
564 std::vector<int16_t>(value));
569 std::string field_name,
570 boost::optional<std::vector<boost::optional<int32_t>>> value)
573 std::move(field_name), std::move(value), field_kind::ARRAY_OF_NULLABLE_INT32);
578 std::vector<int32_t> value)
581 to_nullable(std::move(value)));
586 std::initializer_list<int32_t> value)
589 std::vector<int32_t>(value));
594 std::string field_name,
595 boost::optional<std::vector<boost::optional<int64_t>>> value)
598 std::move(field_name), std::move(value), field_kind::ARRAY_OF_NULLABLE_INT64);
603 std::vector<int64_t> value)
606 to_nullable(std::move(value)));
611 std::initializer_list<int64_t> value)
614 std::vector<int64_t>(value));
619 std::string field_name,
620 boost::optional<std::vector<boost::optional<float>>> value)
622 return write(std::move(field_name),
624 field_kind::ARRAY_OF_NULLABLE_FLOAT32);
629 std::vector<float> value)
632 to_nullable(std::move(value)));
637 std::initializer_list<float> value)
640 std::vector<float>(value));
645 std::string field_name,
646 boost::optional<std::vector<boost::optional<double>>> value)
648 return write(std::move(field_name),
650 field_kind::ARRAY_OF_NULLABLE_FLOAT64);
655 std::vector<double> value)
658 to_nullable(std::move(value)));
663 std::initializer_list<double> value)
666 std::vector<double>(value));
671 std::string field_name,
672 boost::optional<std::vector<boost::optional<std::string>>> value)
675 std::move(field_name), std::move(value), field_kind::ARRAY_OF_STRING);
680 std::string field_name,
681 boost::optional<std::vector<boost::optional<big_decimal>>> value)
684 std::move(field_name), std::move(value), field_kind::ARRAY_OF_DECIMAL);
689 std::string field_name,
690 boost::optional<std::vector<boost::optional<local_time>>> value)
692 return write(std::move(field_name), std::move(value), field_kind::ARRAY_OF_TIME);
697 std::string field_name,
698 boost::optional<std::vector<boost::optional<local_date>>> value)
700 return write(std::move(field_name), std::move(value), field_kind::ARRAY_OF_DATE);
705 std::string field_name,
706 boost::optional<std::vector<boost::optional<local_date_time>>> value)
709 std::move(field_name), std::move(value), field_kind::ARRAY_OF_TIMESTAMP);
714 std::string field_name,
715 boost::optional<std::vector<boost::optional<offset_date_time>>> value)
717 return write(std::move(field_name),
719 field_kind::ARRAY_OF_TIMESTAMP_WITH_TIMEZONE);
724 std::string field_name,
725 boost::optional<std::vector<boost::optional<generic_record>>> value)
728 std::move(field_name), std::move(value), field_kind::ARRAY_OF_COMPACT);
731generic_record::generic_record(
732 std::shared_ptr<pimpl::schema> s,
733 std::unordered_map<std::string, boost::any> objects)
734 : schema_{
std::move(s) }
735 , objects_{
std::move(objects) }
740generic_record::get_schema()
const
745generic_record_builder
748 return generic_record_builder{ schema_ };
754 return generic_record_builder{ schema_, objects_ };
757std::unordered_set<std::string>
760 std::unordered_set<std::string> field_names;
762 const auto& fields = schema_->fields();
764 transform(begin(fields),
766 inserter(field_names, end(field_names)),
767 [](
const std::pair<std::string, pimpl::field_descriptor>& p) {
777 auto descriptor = schema_->get_field(field_name);
780 return field_kind::NOT_AVAILABLE;
783 return descriptor->kind;
789 return objects_.find(field_name) != end(objects_);
795 return get_non_null<bool>(
796 field_name, field_kind::BOOLEAN, field_kind::NULLABLE_BOOLEAN,
"Boolean");
802 return get_non_null<bool>(
803 field_name, field_kind::BOOLEAN, field_kind::NULLABLE_BOOLEAN,
"Boolean");
809 return get_non_null<int8_t>(
810 field_name, field_kind::INT8, field_kind::NULLABLE_INT8,
"Int8");
816 return get_non_null<int8_t>(
817 field_name, field_kind::INT8, field_kind::NULLABLE_INT8,
"Int8");
823 return get_non_null<int16_t>(
824 field_name, field_kind::INT16, field_kind::NULLABLE_INT16,
"Int16");
830 return get_non_null<int16_t>(
831 field_name, field_kind::INT16, field_kind::NULLABLE_INT16,
"Int16");
837 return get_non_null<int32_t>(
838 field_name, field_kind::INT32, field_kind::NULLABLE_INT32,
"Int32");
844 return get_non_null<int32_t>(
845 field_name, field_kind::INT32, field_kind::NULLABLE_INT32,
"Int32");
851 return get_non_null<int64_t>(
852 field_name, field_kind::INT64, field_kind::NULLABLE_INT64,
"Int64");
858 return get_non_null<int64_t>(
859 field_name, field_kind::INT64, field_kind::NULLABLE_INT64,
"Int64");
865 return get_non_null<float>(
866 field_name, field_kind::FLOAT32, field_kind::NULLABLE_FLOAT32,
"Float32");
872 return get_non_null<float>(
873 field_name, field_kind::FLOAT32, field_kind::NULLABLE_FLOAT32,
"Float32");
879 return get_non_null<double>(
880 field_name, field_kind::FLOAT64, field_kind::NULLABLE_FLOAT64,
"Float64");
886 return get_non_null<double>(
887 field_name, field_kind::FLOAT64, field_kind::NULLABLE_FLOAT64,
"Float64");
893 return get<boost::optional<bool>>(field_name, field_kind::NULLABLE_BOOLEAN);
896boost::optional<bool>&
899 return get<boost::optional<bool>>(field_name, field_kind::NULLABLE_BOOLEAN);
902boost::optional<int8_t>
905 return get<boost::optional<int8_t>>(field_name, field_kind::NULLABLE_INT8);
908boost::optional<int8_t>&
911 return get<boost::optional<int8_t>>(field_name, field_kind::NULLABLE_INT8);
914boost::optional<int16_t>
917 return get<boost::optional<int16_t>>(field_name,
918 field_kind::NULLABLE_INT16);
921boost::optional<int16_t>&
924 return get<boost::optional<int16_t>>(field_name,
925 field_kind::NULLABLE_INT16);
928boost::optional<int32_t>
931 return get<boost::optional<int32_t>>(field_name,
932 field_kind::NULLABLE_INT32);
935boost::optional<int32_t>&
938 return get<boost::optional<int32_t>>(field_name,
939 field_kind::NULLABLE_INT32);
942boost::optional<int64_t>
945 return get<boost::optional<int64_t>>(field_name,
946 field_kind::NULLABLE_INT64);
949boost::optional<int64_t>&
952 return get<boost::optional<int64_t>>(field_name,
953 field_kind::NULLABLE_INT64);
956boost::optional<float>
959 return get<boost::optional<float>>(field_name,
960 field_kind::NULLABLE_FLOAT32);
963boost::optional<float>&
966 return get<boost::optional<float>>(field_name,
967 field_kind::NULLABLE_FLOAT32);
970boost::optional<double>
973 return get<boost::optional<double>>(field_name,
974 field_kind::NULLABLE_FLOAT64);
977boost::optional<double>&
980 return get<boost::optional<double>>(field_name,
981 field_kind::NULLABLE_FLOAT64);
984const boost::optional<std::string>&
987 return get<boost::optional<std::string>>(field_name, field_kind::STRING);
990boost::optional<std::string>&
993 return get<boost::optional<std::string>>(field_name, field_kind::STRING);
996const boost::optional<generic_record>&
999 return get<boost::optional<generic_record>>(field_name,
1000 field_kind::COMPACT);
1003boost::optional<generic_record>&
1006 return get<boost::optional<generic_record>>(field_name,
1007 field_kind::COMPACT);
1010const boost::optional<big_decimal>&
1013 return get<boost::optional<big_decimal>>(field_name, field_kind::DECIMAL);
1016boost::optional<big_decimal>&
1019 return get<boost::optional<big_decimal>>(field_name, field_kind::DECIMAL);
1022const boost::optional<local_time>&
1025 return get<boost::optional<local_time>>(field_name, field_kind::TIME);
1028boost::optional<local_time>&
1031 return get<boost::optional<local_time>>(field_name, field_kind::TIME);
1034const boost::optional<local_date>&
1037 return get<boost::optional<local_date>>(field_name, field_kind::DATE);
1040boost::optional<local_date>&
1043 return get<boost::optional<local_date>>(field_name, field_kind::DATE);
1046const boost::optional<local_date_time>&
1049 return get<boost::optional<local_date_time>>(field_name,
1050 field_kind::TIMESTAMP);
1053boost::optional<local_date_time>&
1056 return get<boost::optional<local_date_time>>(field_name,
1057 field_kind::TIMESTAMP);
1060const boost::optional<offset_date_time>&
1063 return get<boost::optional<offset_date_time>>(
1064 field_name, field_kind::TIMESTAMP_WITH_TIMEZONE);
1067boost::optional<offset_date_time>&
1070 return get<boost::optional<offset_date_time>>(
1071 field_name, field_kind::TIMESTAMP_WITH_TIMEZONE);
1074const boost::optional<std::vector<bool>>&
1077 return get_array_of_primitive<bool>(field_name,
1078 field_kind::ARRAY_OF_BOOLEAN,
1079 field_kind::ARRAY_OF_NULLABLE_BOOLEAN,
1083boost::optional<std::vector<bool>>&
1086 return get_array_of_primitive<bool>(field_name,
1087 field_kind::ARRAY_OF_BOOLEAN,
1088 field_kind::ARRAY_OF_NULLABLE_BOOLEAN,
1092const boost::optional<std::vector<int8_t>>&
1095 return get_array_of_primitive<int8_t>(field_name,
1096 field_kind::ARRAY_OF_INT8,
1097 field_kind::ARRAY_OF_NULLABLE_INT8,
1101boost::optional<std::vector<int8_t>>&
1104 return get_array_of_primitive<int8_t>(field_name,
1105 field_kind::ARRAY_OF_INT8,
1106 field_kind::ARRAY_OF_NULLABLE_INT8,
1110const boost::optional<std::vector<int16_t>>&
1113 return get_array_of_primitive<int16_t>(field_name,
1114 field_kind::ARRAY_OF_INT16,
1115 field_kind::ARRAY_OF_NULLABLE_INT16,
1119boost::optional<std::vector<int16_t>>&
1122 return get_array_of_primitive<int16_t>(field_name,
1123 field_kind::ARRAY_OF_INT16,
1124 field_kind::ARRAY_OF_NULLABLE_INT16,
1128const boost::optional<std::vector<int32_t>>&
1131 return get_array_of_primitive<int32_t>(field_name,
1132 field_kind::ARRAY_OF_INT32,
1133 field_kind::ARRAY_OF_NULLABLE_INT32,
1137boost::optional<std::vector<int32_t>>&
1140 return get_array_of_primitive<int32_t>(field_name,
1141 field_kind::ARRAY_OF_INT32,
1142 field_kind::ARRAY_OF_NULLABLE_INT32,
1146const boost::optional<std::vector<int64_t>>&
1149 return get_array_of_primitive<int64_t>(field_name,
1150 field_kind::ARRAY_OF_INT64,
1151 field_kind::ARRAY_OF_NULLABLE_INT64,
1155boost::optional<std::vector<int64_t>>&
1158 return get_array_of_primitive<int64_t>(field_name,
1159 field_kind::ARRAY_OF_INT64,
1160 field_kind::ARRAY_OF_NULLABLE_INT64,
1164const boost::optional<std::vector<float>>&
1167 return get_array_of_primitive<float>(field_name,
1168 field_kind::ARRAY_OF_FLOAT32,
1169 field_kind::ARRAY_OF_NULLABLE_FLOAT32,
1173boost::optional<std::vector<float>>&
1176 return get_array_of_primitive<float>(field_name,
1177 field_kind::ARRAY_OF_FLOAT32,
1178 field_kind::ARRAY_OF_NULLABLE_FLOAT32,
1182const boost::optional<std::vector<double>>&
1185 return get_array_of_primitive<double>(field_name,
1186 field_kind::ARRAY_OF_FLOAT64,
1187 field_kind::ARRAY_OF_NULLABLE_FLOAT64,
1191boost::optional<std::vector<double>>&
1194 return get_array_of_primitive<double>(field_name,
1195 field_kind::ARRAY_OF_FLOAT64,
1196 field_kind::ARRAY_OF_NULLABLE_FLOAT64,
1200const boost::optional<std::vector<boost::optional<bool>>>&
1202 const std::string& field_name)
const
1204 return get_array_of_nullable<bool>(field_name,
1205 field_kind::ARRAY_OF_BOOLEAN,
1206 field_kind::ARRAY_OF_NULLABLE_BOOLEAN,
1210boost::optional<std::vector<boost::optional<bool>>>&
1213 return get_array_of_nullable<bool>(field_name,
1214 field_kind::ARRAY_OF_BOOLEAN,
1215 field_kind::ARRAY_OF_NULLABLE_BOOLEAN,
1219const boost::optional<std::vector<boost::optional<int8_t>>>&
1222 return get_array_of_nullable<int8_t>(field_name,
1223 field_kind::ARRAY_OF_INT8,
1224 field_kind::ARRAY_OF_NULLABLE_INT8,
1228boost::optional<std::vector<boost::optional<int8_t>>>&
1231 return get_array_of_nullable<int8_t>(field_name,
1232 field_kind::ARRAY_OF_INT8,
1233 field_kind::ARRAY_OF_NULLABLE_INT8,
1237const boost::optional<std::vector<boost::optional<int16_t>>>&
1240 return get_array_of_nullable<int16_t>(field_name,
1241 field_kind::ARRAY_OF_INT16,
1242 field_kind::ARRAY_OF_NULLABLE_INT16,
1246boost::optional<std::vector<boost::optional<int16_t>>>&
1249 return get_array_of_nullable<int16_t>(field_name,
1250 field_kind::ARRAY_OF_INT16,
1251 field_kind::ARRAY_OF_NULLABLE_INT16,
1255const boost::optional<std::vector<boost::optional<int32_t>>>&
1258 return get_array_of_nullable<int32_t>(field_name,
1259 field_kind::ARRAY_OF_INT32,
1260 field_kind::ARRAY_OF_NULLABLE_INT32,
1264boost::optional<std::vector<boost::optional<int32_t>>>&
1267 return get_array_of_nullable<int32_t>(field_name,
1268 field_kind::ARRAY_OF_INT32,
1269 field_kind::ARRAY_OF_NULLABLE_INT32,
1273const boost::optional<std::vector<boost::optional<int64_t>>>&
1276 return get_array_of_nullable<int64_t>(field_name,
1277 field_kind::ARRAY_OF_INT64,
1278 field_kind::ARRAY_OF_NULLABLE_INT64,
1282boost::optional<std::vector<boost::optional<int64_t>>>&
1285 return get_array_of_nullable<int64_t>(field_name,
1286 field_kind::ARRAY_OF_INT64,
1287 field_kind::ARRAY_OF_NULLABLE_INT64,
1291const boost::optional<std::vector<boost::optional<float>>>&
1293 const std::string& field_name)
const
1295 return get_array_of_nullable<float>(field_name,
1296 field_kind::ARRAY_OF_FLOAT32,
1297 field_kind::ARRAY_OF_NULLABLE_FLOAT32,
1301boost::optional<std::vector<boost::optional<float>>>&
1304 return get_array_of_nullable<float>(field_name,
1305 field_kind::ARRAY_OF_FLOAT32,
1306 field_kind::ARRAY_OF_NULLABLE_FLOAT32,
1310const boost::optional<std::vector<boost::optional<double>>>&
1312 const std::string& field_name)
const
1314 return get_array_of_nullable<double>(field_name,
1315 field_kind::ARRAY_OF_FLOAT64,
1316 field_kind::ARRAY_OF_NULLABLE_FLOAT64,
1320boost::optional<std::vector<boost::optional<double>>>&
1323 return get_array_of_nullable<double>(field_name,
1324 field_kind::ARRAY_OF_FLOAT64,
1325 field_kind::ARRAY_OF_NULLABLE_FLOAT64,
1329const boost::optional<std::vector<boost::optional<std::string>>>&
1332 return get<boost::optional<std::vector<boost::optional<std::string>>>>(
1333 field_name, field_kind::ARRAY_OF_STRING);
1336boost::optional<std::vector<boost::optional<std::string>>>&
1339 return get<boost::optional<std::vector<boost::optional<std::string>>>>(
1340 field_name, field_kind::ARRAY_OF_STRING);
1343const boost::optional<std::vector<boost::optional<big_decimal>>>&
1346 return get<boost::optional<std::vector<boost::optional<big_decimal>>>>(
1347 field_name, field_kind::ARRAY_OF_DECIMAL);
1350boost::optional<std::vector<boost::optional<big_decimal>>>&
1353 return get<boost::optional<std::vector<boost::optional<big_decimal>>>>(
1354 field_name, field_kind::ARRAY_OF_DECIMAL);
1357const boost::optional<std::vector<boost::optional<local_time>>>&
1360 return get<boost::optional<std::vector<boost::optional<local_time>>>>(
1361 field_name, field_kind::ARRAY_OF_TIME);
1364boost::optional<std::vector<boost::optional<local_time>>>&
1367 return get<boost::optional<std::vector<boost::optional<local_time>>>>(
1368 field_name, field_kind::ARRAY_OF_TIME);
1371const boost::optional<std::vector<boost::optional<local_date>>>&
1374 return get<boost::optional<std::vector<boost::optional<local_date>>>>(
1375 field_name, field_kind::ARRAY_OF_DATE);
1378boost::optional<std::vector<boost::optional<local_date>>>&
1381 return get<boost::optional<std::vector<boost::optional<local_date>>>>(
1382 field_name, field_kind::ARRAY_OF_DATE);
1385const boost::optional<std::vector<boost::optional<local_date_time>>>&
1388 return get<boost::optional<std::vector<boost::optional<local_date_time>>>>(
1389 field_name, field_kind::ARRAY_OF_TIMESTAMP);
1392boost::optional<std::vector<boost::optional<local_date_time>>>&
1395 return get<boost::optional<std::vector<boost::optional<local_date_time>>>>(
1396 field_name, field_kind::ARRAY_OF_TIMESTAMP);
1399const boost::optional<std::vector<boost::optional<offset_date_time>>>&
1401 const std::string& field_name)
const
1403 return get<boost::optional<std::vector<boost::optional<offset_date_time>>>>(
1404 field_name, field_kind::ARRAY_OF_TIMESTAMP_WITH_TIMEZONE);
1407boost::optional<std::vector<boost::optional<offset_date_time>>>&
1409 const std::string& field_name)
1411 return get<boost::optional<std::vector<boost::optional<offset_date_time>>>>(
1412 field_name, field_kind::ARRAY_OF_TIMESTAMP_WITH_TIMEZONE);
1415const boost::optional<std::vector<boost::optional<generic_record>>>&
1418 return get<boost::optional<std::vector<boost::optional<generic_record>>>>(
1419 field_name, field_kind::ARRAY_OF_COMPACT);
1422boost::optional<std::vector<boost::optional<generic_record>>>&
1425 return get<boost::optional<std::vector<boost::optional<generic_record>>>>(
1426 field_name, field_kind::ARRAY_OF_COMPACT);
1429boost::property_tree::ptree
1432 boost::property_tree::ptree node;
1434 for (
const std::pair<const std::string, boost::any>& p : record.objects_) {
1435 const std::string& field_name = p.first;
1437 field_kind kind = record.get_schema().get_field(field_name)->kind;
1439 pimpl::field_operations::get(kind).write_json_formatted_field(
1440 node, record, field_name);
1447operator<<(std::ostream& os,
const generic_record& record)
1449 boost::property_tree::ptree pt;
1451 pt.put_child(record.get_schema().type_name(), write_generic_record(record));
1453 boost::property_tree::write_json(os, pt);
1459operator==(
const generic_record& x,
const generic_record& y)
1461 static const std::function<bool(
const boost::any&,
const boost::any&)>
1463 [](
const boost::any&,
const boost::any&) {
1466 [](
const boost::any& x,
const boost::any& y) {
1467 return boost::any_cast<bool>(x) == boost::any_cast<bool>(y);
1469 [](
const boost::any& x,
const boost::any& y) {
1470 return boost::any_cast<boost::optional<std::vector<bool>>>(x) ==
1471 boost::any_cast<boost::optional<std::vector<bool>>>(y);
1473 [](
const boost::any& x,
const boost::any& y) {
1474 return boost::any_cast<int8_t>(x) == boost::any_cast<int8_t>(y);
1476 [](
const boost::any& x,
const boost::any& y) {
1477 return boost::any_cast<boost::optional<std::vector<int8_t>>>(x) ==
1478 boost::any_cast<boost::optional<std::vector<int8_t>>>(y);
1480 [](
const boost::any&,
const boost::any&) {
return false; },
1481 [](
const boost::any&,
const boost::any&) {
return false; },
1482 [](
const boost::any& x,
const boost::any& y) {
1483 return boost::any_cast<int16_t>(x) == boost::any_cast<int16_t>(y);
1485 [](
const boost::any& x,
const boost::any& y) {
1486 return boost::any_cast<boost::optional<std::vector<int16_t>>>(
1488 boost::any_cast<boost::optional<std::vector<int16_t>>>(y);
1490 [](
const boost::any& x,
const boost::any& y) {
1491 return boost::any_cast<int32_t>(x) == boost::any_cast<int32_t>(y);
1493 [](
const boost::any& x,
const boost::any& y) {
1494 return boost::any_cast<boost::optional<std::vector<int32_t>>>(
1496 boost::any_cast<boost::optional<std::vector<int32_t>>>(y);
1498 [](
const boost::any& x,
const boost::any& y) {
1499 return boost::any_cast<int64_t>(x) == boost::any_cast<int64_t>(y);
1501 [](
const boost::any& x,
const boost::any& y) {
1502 return boost::any_cast<boost::optional<std::vector<int64_t>>>(
1504 boost::any_cast<boost::optional<std::vector<int64_t>>>(y);
1506 [](
const boost::any& x,
const boost::any& y) {
1507 return boost::any_cast<float>(x) == boost::any_cast<float>(y);
1509 [](
const boost::any& x,
const boost::any& y) {
1510 return boost::any_cast<boost::optional<std::vector<float>>>(x) ==
1511 boost::any_cast<boost::optional<std::vector<float>>>(y);
1513 [](
const boost::any& x,
const boost::any& y) {
1514 return boost::any_cast<double>(x) == boost::any_cast<double>(y);
1516 [](
const boost::any& x,
const boost::any& y) {
1517 return boost::any_cast<boost::optional<std::vector<double>>>(x) ==
1518 boost::any_cast<boost::optional<std::vector<double>>>(y);
1520 [](
const boost::any& x,
const boost::any& y) {
1521 return boost::any_cast<boost::optional<std::string>>(x) ==
1522 boost::any_cast<boost::optional<std::string>>(y);
1524 [](
const boost::any& x,
const boost::any& y) {
1525 return boost::any_cast<boost::optional<
1526 std::vector<boost::optional<std::string>>>>(x) ==
1527 boost::any_cast<boost::optional<
1528 std::vector<boost::optional<std::string>>>>(y);
1530 [](
const boost::any& x,
const boost::any& y) {
1531 return boost::any_cast<boost::optional<big_decimal>>(x) ==
1532 boost::any_cast<boost::optional<big_decimal>>(y);
1534 [](
const boost::any& x,
const boost::any& y) {
1535 return boost::any_cast<boost::optional<
1536 std::vector<boost::optional<big_decimal>>>>(x) ==
1537 boost::any_cast<boost::optional<
1538 std::vector<boost::optional<big_decimal>>>>(y);
1540 [](
const boost::any& x,
const boost::any& y) {
1541 return boost::any_cast<boost::optional<local_time>>(x) ==
1542 boost::any_cast<boost::optional<local_time>>(y);
1544 [](
const boost::any& x,
const boost::any& y) {
1545 return boost::any_cast<boost::optional<
1546 std::vector<boost::optional<local_time>>>>(x) ==
1547 boost::any_cast<boost::optional<
1548 std::vector<boost::optional<local_time>>>>(y);
1550 [](
const boost::any& x,
const boost::any& y) {
1551 return boost::any_cast<boost::optional<local_date>>(x) ==
1552 boost::any_cast<boost::optional<local_date>>(y);
1554 [](
const boost::any& x,
const boost::any& y) {
1555 return boost::any_cast<boost::optional<
1556 std::vector<boost::optional<local_date>>>>(x) ==
1557 boost::any_cast<boost::optional<
1558 std::vector<boost::optional<local_date>>>>(y);
1560 [](
const boost::any& x,
const boost::any& y) {
1561 return boost::any_cast<boost::optional<local_date_time>>(x) ==
1562 boost::any_cast<boost::optional<local_date_time>>(y);
1564 [](
const boost::any& x,
1565 const boost::any& y) {
1566 return boost::any_cast<boost::optional<
1567 std::vector<boost::optional<local_date_time>>>>(x) ==
1568 boost::any_cast<boost::optional<
1569 std::vector<boost::optional<local_date_time>>>>(y);
1571 [](
const boost::any& x,
1572 const boost::any& y) {
1573 return boost::any_cast<boost::optional<offset_date_time>>(x) ==
1574 boost::any_cast<boost::optional<offset_date_time>>(y);
1576 [](
const boost::any& x,
1577 const boost::any& y) {
1578 return boost::any_cast<boost::optional<
1579 std::vector<boost::optional<offset_date_time>>>>(x) ==
1580 boost::any_cast<boost::optional<
1581 std::vector<boost::optional<offset_date_time>>>>(y);
1583 [](
const boost::any& x,
const boost::any& y) {
1584 return boost::any_cast<boost::optional<generic_record>>(x) ==
1585 boost::any_cast<boost::optional<generic_record>>(y);
1587 [](
const boost::any& x,
const boost::any& y) {
1588 return boost::any_cast<boost::optional<
1589 std::vector<boost::optional<generic_record>>>>(x) ==
1590 boost::any_cast<boost::optional<
1591 std::vector<boost::optional<generic_record>>>>(y);
1593 [](
const boost::any& ,
const boost::any& ) {
return false; },
1594 [](
const boost::any& ,
const boost::any& ) {
return false; },
1595 [](
const boost::any& x,
const boost::any& y) {
1596 return boost::any_cast<boost::optional<bool>>(x) ==
1597 boost::any_cast<boost::optional<bool>>(y);
1599 [](
const boost::any& x,
1600 const boost::any& y) {
1601 return boost::any_cast<
1602 boost::optional<std::vector<boost::optional<bool>>>>(
1605 boost::optional<std::vector<boost::optional<bool>>>>(y);
1607 [](
const boost::any& x,
const boost::any& y) {
1608 return boost::any_cast<boost::optional<int8_t>>(x) ==
1609 boost::any_cast<boost::optional<int8_t>>(y);
1611 [](
const boost::any& x,
1612 const boost::any& y) {
1613 return boost::any_cast<
1614 boost::optional<std::vector<boost::optional<int8_t>>>>(
1617 boost::optional<std::vector<boost::optional<int8_t>>>>(
1620 [](
const boost::any& x,
const boost::any& y) {
1621 return boost::any_cast<boost::optional<int16_t>>(x) ==
1622 boost::any_cast<boost::optional<int16_t>>(y);
1624 [](
const boost::any& x,
1625 const boost::any& y) {
1626 return boost::any_cast<
1627 boost::optional<std::vector<boost::optional<int16_t>>>>(
1630 boost::optional<std::vector<boost::optional<int16_t>>>>(
1633 [](
const boost::any& x,
const boost::any& y) {
1634 return boost::any_cast<boost::optional<int32_t>>(x) ==
1635 boost::any_cast<boost::optional<int32_t>>(y);
1637 [](
const boost::any& x,
1638 const boost::any& y) {
1639 return boost::any_cast<
1640 boost::optional<std::vector<boost::optional<int32_t>>>>(
1643 boost::optional<std::vector<boost::optional<int32_t>>>>(
1646 [](
const boost::any& x,
const boost::any& y) {
1647 return boost::any_cast<boost::optional<int64_t>>(x) ==
1648 boost::any_cast<boost::optional<int64_t>>(y);
1650 [](
const boost::any& x,
1651 const boost::any& y) {
1652 return boost::any_cast<
1653 boost::optional<std::vector<boost::optional<int64_t>>>>(
1656 boost::optional<std::vector<boost::optional<int64_t>>>>(
1659 [](
const boost::any& x,
const boost::any& y) {
1660 return boost::any_cast<boost::optional<float>>(x) ==
1661 boost::any_cast<boost::optional<float>>(y);
1663 [](
const boost::any& x,
1664 const boost::any& y) {
1665 return boost::any_cast<
1666 boost::optional<std::vector<boost::optional<float>>>>(
1669 boost::optional<std::vector<boost::optional<float>>>>(y);
1671 [](
const boost::any& x,
const boost::any& y) {
1672 return boost::any_cast<boost::optional<double>>(x) ==
1673 boost::any_cast<boost::optional<double>>(y);
1675 [](
const boost::any& x,
1676 const boost::any& y) {
1677 return boost::any_cast<
1678 boost::optional<std::vector<boost::optional<double>>>>(
1681 boost::optional<std::vector<boost::optional<double>>>>(
1686 const pimpl::schema& xs = x.get_schema();
1687 const pimpl::schema& ys = y.get_schema();
1692 for (
const std::pair<const std::string, boost::any>& xp : x.objects_) {
1693 const std::string& field_name = xp.first;
1694 const boost::any& value_of_x = xp.second;
1695 const boost::any& value_of_y = y.objects_.at(field_name);
1697 boost::optional<pimpl::field_descriptor> kind_opt =
1698 xs.get_field(field_name);
1700 if (!COMPARATORS[std::size_t(kind_opt->kind)](value_of_x, value_of_y))
1715operator<<(std::ostream& os, field_kind kind)
1718 case field_kind::NOT_AVAILABLE:
1719 os <<
"NOT_AVAILABLE";
1721 case field_kind::BOOLEAN:
1724 case field_kind::ARRAY_OF_BOOLEAN:
1725 os <<
"ARRAY_OF_BOOLEAN";
1727 case field_kind::INT8:
1730 case field_kind::ARRAY_OF_INT8:
1731 os <<
"ARRAY_OF_INT8";
1733 case field_kind::INT16:
1736 case field_kind::ARRAY_OF_INT16:
1737 os <<
"ARRAY_OF_INT16";
1739 case field_kind::INT32:
1742 case field_kind::ARRAY_OF_INT32:
1743 os <<
"ARRAY_OF_INT32";
1745 case field_kind::INT64:
1748 case field_kind::ARRAY_OF_INT64:
1749 os <<
"ARRAY_OF_INT64";
1751 case field_kind::FLOAT32:
1754 case field_kind::ARRAY_OF_FLOAT32:
1755 os <<
"ARRAY_OF_FLOAT32";
1757 case field_kind::FLOAT64:
1760 case field_kind::ARRAY_OF_FLOAT64:
1761 os <<
"ARRAY_OF_FLOAT64";
1763 case field_kind::STRING:
1766 case field_kind::ARRAY_OF_STRING:
1767 os <<
"ARRAY_OF_STRING";
1769 case field_kind::DECIMAL:
1772 case field_kind::ARRAY_OF_DECIMAL:
1773 os <<
"ARRAY_OF_DECIMAL";
1775 case field_kind::TIME:
1778 case field_kind::ARRAY_OF_TIME:
1779 os <<
"ARRAY_OF_TIME";
1781 case field_kind::DATE:
1784 case field_kind::ARRAY_OF_DATE:
1785 os <<
"ARRAY_OF_DATE";
1787 case field_kind::TIMESTAMP:
1790 case field_kind::ARRAY_OF_TIMESTAMP:
1791 os <<
"ARRAY_OF_TIMESTAMP";
1793 case field_kind::TIMESTAMP_WITH_TIMEZONE:
1794 os <<
"TIMESTAMP_WITH_TIMEZONE";
1796 case field_kind::ARRAY_OF_TIMESTAMP_WITH_TIMEZONE:
1797 os <<
"ARRAY_OF_TIMESTAMP_WITH_TIMEZONE";
1799 case field_kind::COMPACT:
1802 case field_kind::ARRAY_OF_COMPACT:
1803 os <<
"ARRAY_OF_COMPACT";
1805 case field_kind::NULLABLE_BOOLEAN:
1806 os <<
"NULLABLE_BOOLEAN";
1808 case field_kind::ARRAY_OF_NULLABLE_BOOLEAN:
1809 os <<
"ARRAY_OF_NULLABLE_BOOLEAN";
1811 case field_kind::NULLABLE_INT8:
1812 os <<
"NULLABLE_INT8";
1814 case field_kind::ARRAY_OF_NULLABLE_INT8:
1815 os <<
"ARRAY_OF_NULLABLE_INT8";
1817 case field_kind::NULLABLE_INT16:
1818 os <<
"NULLABLE_INT16";
1820 case field_kind::ARRAY_OF_NULLABLE_INT16:
1821 os <<
"ARRAY_OF_NULLABLE_INT16";
1823 case field_kind::NULLABLE_INT32:
1824 os <<
"NULLABLE_INT32";
1826 case field_kind::ARRAY_OF_NULLABLE_INT32:
1827 os <<
"ARRAY_OF_NULLABLE_INT32";
1829 case field_kind::NULLABLE_INT64:
1830 os <<
"NULLABLE_INT64";
1832 case field_kind::ARRAY_OF_NULLABLE_INT64:
1833 os <<
"ARRAY_OF_NULLABLE_INT64";
1835 case field_kind::NULLABLE_FLOAT32:
1836 os <<
"NULLABLE_FLOAT32";
1838 case field_kind::ARRAY_OF_NULLABLE_FLOAT32:
1839 os <<
"ARRAY_OF_NULLABLE_FLOAT32";
1841 case field_kind::NULLABLE_FLOAT64:
1842 os <<
"NULLABLE_FLOAT64";
1844 case field_kind::ARRAY_OF_NULLABLE_FLOAT64:
1845 os <<
"ARRAY_OF_NULLABLE_FLOAT64";
1856namespace hazelcast {
1858namespace serialization {
1861compact_writer::compact_writer(
1862 pimpl::default_compact_writer* default_compact_writer)
1863 : default_compact_writer(default_compact_writer)
1864 , schema_writer(nullptr)
1867compact_writer::compact_writer(pimpl::schema_writer* schema_writer)
1868 : default_compact_writer(nullptr)
1869 , schema_writer(schema_writer)
1873compact_writer::write_boolean(
const std::string& field_name,
bool value)
1875 if (default_compact_writer) {
1876 default_compact_writer->write_boolean(field_name, value);
1878 schema_writer->add_field(field_name, field_kind::BOOLEAN);
1882compact_writer::write_int8(
const std::string& field_name, int8_t value)
1884 if (default_compact_writer) {
1885 default_compact_writer->write_int8(field_name, value);
1887 schema_writer->add_field(field_name, field_kind::INT8);
1892compact_writer::write_int16(
const std::string& field_name, int16_t value)
1894 if (default_compact_writer) {
1895 default_compact_writer->write_int16(field_name, value);
1897 schema_writer->add_field(field_name, field_kind::INT16);
1902compact_writer::write_int32(
const std::string& field_name, int32_t value)
1904 if (default_compact_writer !=
nullptr) {
1905 default_compact_writer->write_int32(field_name, value);
1907 schema_writer->add_field(field_name, field_kind::INT32);
1912compact_writer::write_int64(
const std::string& field_name, int64_t value)
1914 if (default_compact_writer !=
nullptr) {
1915 default_compact_writer->write_int64(field_name, value);
1917 schema_writer->add_field(field_name, field_kind::INT64);
1922compact_writer::write_float32(
const std::string& field_name,
float value)
1924 if (default_compact_writer !=
nullptr) {
1925 default_compact_writer->write_float32(field_name, value);
1927 schema_writer->add_field(field_name, field_kind::FLOAT32);
1932compact_writer::write_float64(
const std::string& field_name,
double value)
1934 if (default_compact_writer !=
nullptr) {
1935 default_compact_writer->write_float64(field_name, value);
1937 schema_writer->add_field(field_name, field_kind::FLOAT64);
1942compact_writer::write_string(
const std::string& field_name,
1943 const boost::optional<std::string>& value)
1945 if (default_compact_writer !=
nullptr) {
1946 default_compact_writer->write_string(field_name, value);
1948 schema_writer->add_field(field_name, field_kind::STRING);
1953compact_writer::write_decimal(
const std::string& field_name,
1954 const boost::optional<big_decimal>& value)
1956 if (default_compact_writer !=
nullptr) {
1957 default_compact_writer->write_decimal(field_name, value);
1959 schema_writer->add_field(field_name, field_kind::DECIMAL);
1964compact_writer::write_time(
1965 const std::string& field_name,
1966 const boost::optional<hazelcast::client::local_time>& value)
1968 if (default_compact_writer !=
nullptr) {
1969 default_compact_writer->write_time(field_name, value);
1971 schema_writer->add_field(field_name, field_kind::TIME);
1976compact_writer::write_date(
1977 const std::string& field_name,
1978 const boost::optional<hazelcast::client::local_date>& value)
1980 if (default_compact_writer !=
nullptr) {
1981 default_compact_writer->write_date(field_name, value);
1983 schema_writer->add_field(field_name, field_kind::DATE);
1988compact_writer::write_timestamp(
1989 const std::string& field_name,
1990 const boost::optional<hazelcast::client::local_date_time>& value)
1992 if (default_compact_writer !=
nullptr) {
1993 default_compact_writer->write_timestamp(field_name, value);
1995 schema_writer->add_field(field_name, field_kind::TIMESTAMP);
2000compact_writer::write_timestamp_with_timezone(
2001 const std::string& field_name,
2002 const boost::optional<hazelcast::client::offset_date_time>& value)
2004 if (default_compact_writer !=
nullptr) {
2005 default_compact_writer->write_timestamp_with_timezone(field_name,
2008 schema_writer->add_field(field_name,
2009 field_kind::TIMESTAMP_WITH_TIMEZONE);
2014compact_writer::write_array_of_boolean(
2015 const std::string& field_name,
2016 const boost::optional<std::vector<bool>>& value)
2018 if (default_compact_writer !=
nullptr) {
2019 default_compact_writer->write_array_of_boolean(field_name, value);
2021 schema_writer->add_field(field_name, field_kind::ARRAY_OF_BOOLEAN);
2026compact_writer::write_array_of_int8(
2027 const std::string& field_name,
2028 const boost::optional<std::vector<int8_t>>& value)
2030 if (default_compact_writer !=
nullptr) {
2031 default_compact_writer->write_array_of_int8(field_name, value);
2033 schema_writer->add_field(field_name, field_kind::ARRAY_OF_INT8);
2038compact_writer::write_array_of_int16(
2039 const std::string& field_name,
2040 const boost::optional<std::vector<int16_t>>& value)
2042 if (default_compact_writer !=
nullptr) {
2043 default_compact_writer->write_array_of_int16(field_name, value);
2045 schema_writer->add_field(field_name, field_kind::ARRAY_OF_INT16);
2050compact_writer::write_array_of_int32(
2051 const std::string& field_name,
2052 const boost::optional<std::vector<int32_t>>& value)
2054 if (default_compact_writer !=
nullptr) {
2055 default_compact_writer->write_array_of_int32(field_name, value);
2057 schema_writer->add_field(field_name, field_kind::ARRAY_OF_INT32);
2062compact_writer::write_array_of_int64(
2063 const std::string& field_name,
2064 const boost::optional<std::vector<int64_t>>& value)
2066 if (default_compact_writer !=
nullptr) {
2067 default_compact_writer->write_array_of_int64(field_name, value);
2069 schema_writer->add_field(field_name, field_kind::ARRAY_OF_INT64);
2074compact_writer::write_array_of_float32(
2075 const std::string& field_name,
2076 const boost::optional<std::vector<float>>& value)
2078 if (default_compact_writer !=
nullptr) {
2079 default_compact_writer->write_array_of_float32(field_name, value);
2081 schema_writer->add_field(field_name, field_kind::ARRAY_OF_FLOAT32);
2086compact_writer::write_array_of_float64(
2087 const std::string& field_name,
2088 const boost::optional<std::vector<double>>& value)
2090 if (default_compact_writer !=
nullptr) {
2091 default_compact_writer->write_array_of_float64(field_name, value);
2093 schema_writer->add_field(field_name, field_kind::ARRAY_OF_FLOAT64);
2098compact_writer::write_array_of_string(
2099 const std::string& field_name,
2100 const boost::optional<std::vector<boost::optional<std::string>>>& value)
2102 if (default_compact_writer !=
nullptr) {
2103 default_compact_writer->write_array_of_string(field_name, value);
2105 schema_writer->add_field(field_name, field_kind::ARRAY_OF_STRING);
2110compact_writer::write_array_of_decimal(
2111 const std::string& field_name,
2112 const boost::optional<std::vector<boost::optional<big_decimal>>>& value)
2114 if (default_compact_writer !=
nullptr) {
2115 default_compact_writer->write_array_of_decimal(field_name, value);
2117 schema_writer->add_field(field_name, field_kind::ARRAY_OF_DECIMAL);
2122compact_writer::write_array_of_time(
2123 const std::string& field_name,
2124 const boost::optional<std::vector<boost::optional<local_time>>>& value)
2126 if (default_compact_writer !=
nullptr) {
2127 default_compact_writer->write_array_of_time(field_name, value);
2129 schema_writer->add_field(field_name, field_kind::ARRAY_OF_TIME);
2134compact_writer::write_array_of_date(
2135 const std::string& field_name,
2136 const boost::optional<std::vector<boost::optional<local_date>>>& value)
2138 if (default_compact_writer !=
nullptr) {
2139 default_compact_writer->write_array_of_date(field_name, value);
2141 schema_writer->add_field(field_name, field_kind::ARRAY_OF_DATE);
2146compact_writer::write_array_of_timestamp(
2147 const std::string& field_name,
2148 const boost::optional<std::vector<boost::optional<local_date_time>>>& value)
2150 if (default_compact_writer !=
nullptr) {
2151 default_compact_writer->write_array_of_timestamp(field_name, value);
2153 schema_writer->add_field(field_name, field_kind::ARRAY_OF_TIMESTAMP);
2158compact_writer::write_array_of_timestamp_with_timezone(
2159 const std::string& field_name,
2160 const boost::optional<std::vector<boost::optional<offset_date_time>>>& value)
2162 if (default_compact_writer !=
nullptr) {
2163 default_compact_writer->write_array_of_timestamp_with_timezone(
2166 schema_writer->add_field(field_name,
2167 field_kind::ARRAY_OF_TIMESTAMP_WITH_TIMEZONE);
2172compact_writer::write_nullable_boolean(
const std::string& field_name,
2173 const boost::optional<bool>& value)
2175 if (default_compact_writer !=
nullptr) {
2176 default_compact_writer->write_nullable_boolean(field_name, value);
2178 schema_writer->add_field(field_name, field_kind::NULLABLE_BOOLEAN);
2183compact_writer::write_nullable_int8(
const std::string& field_name,
2184 const boost::optional<int8_t>& value)
2186 if (default_compact_writer !=
nullptr) {
2187 default_compact_writer->write_nullable_int8(field_name, value);
2189 schema_writer->add_field(field_name, field_kind::NULLABLE_INT8);
2194compact_writer::write_nullable_int16(
const std::string& field_name,
2195 const boost::optional<int16_t>& value)
2197 if (default_compact_writer !=
nullptr) {
2198 default_compact_writer->write_nullable_int16(field_name, value);
2200 schema_writer->add_field(field_name, field_kind::NULLABLE_INT16);
2205compact_writer::write_nullable_int32(
const std::string& field_name,
2206 const boost::optional<int32_t>& value)
2208 if (default_compact_writer !=
nullptr) {
2209 default_compact_writer->write_nullable_int32(field_name, value);
2211 schema_writer->add_field(field_name, field_kind::NULLABLE_INT32);
2216compact_writer::write_nullable_int64(
const std::string& field_name,
2217 const boost::optional<int64_t>& value)
2219 if (default_compact_writer !=
nullptr) {
2220 default_compact_writer->write_nullable_int64(field_name, value);
2222 schema_writer->add_field(field_name, field_kind::NULLABLE_INT64);
2227compact_writer::write_nullable_float32(
const std::string& field_name,
2228 const boost::optional<float>& value)
2230 if (default_compact_writer !=
nullptr) {
2231 default_compact_writer->write_nullable_float32(field_name, value);
2233 schema_writer->add_field(field_name, field_kind::NULLABLE_FLOAT32);
2238compact_writer::write_nullable_float64(
const std::string& field_name,
2239 const boost::optional<double>& value)
2241 if (default_compact_writer !=
nullptr) {
2242 default_compact_writer->write_nullable_float64(field_name, value);
2244 schema_writer->add_field(field_name, field_kind::NULLABLE_FLOAT64);
2249compact_writer::write_array_of_nullable_boolean(
2250 const std::string& field_name,
2251 const boost::optional<std::vector<boost::optional<bool>>>& value)
2253 if (default_compact_writer !=
nullptr) {
2254 default_compact_writer->write_array_of_nullable_boolean(field_name,
2257 schema_writer->add_field(field_name,
2258 field_kind::ARRAY_OF_NULLABLE_BOOLEAN);
2263compact_writer::write_array_of_nullable_int8(
2264 const std::string& field_name,
2265 const boost::optional<std::vector<boost::optional<int8_t>>>& value)
2267 if (default_compact_writer !=
nullptr) {
2268 default_compact_writer->write_array_of_nullable_int8(field_name, value);
2270 schema_writer->add_field(field_name,
2271 field_kind::ARRAY_OF_NULLABLE_INT8);
2276compact_writer::write_array_of_nullable_int16(
2277 const std::string& field_name,
2278 const boost::optional<std::vector<boost::optional<int16_t>>>& value)
2280 if (default_compact_writer !=
nullptr) {
2281 default_compact_writer->write_array_of_nullable_int16(field_name,
2284 schema_writer->add_field(field_name,
2285 field_kind::ARRAY_OF_NULLABLE_INT16);
2290compact_writer::write_array_of_nullable_int32(
2291 const std::string& field_name,
2292 const boost::optional<std::vector<boost::optional<int32_t>>>& value)
2294 if (default_compact_writer !=
nullptr) {
2295 default_compact_writer->write_array_of_nullable_int32(field_name,
2298 schema_writer->add_field(field_name,
2299 field_kind::ARRAY_OF_NULLABLE_INT32);
2304compact_writer::write_array_of_nullable_int64(
2305 const std::string& field_name,
2306 const boost::optional<std::vector<boost::optional<int64_t>>>& value)
2308 if (default_compact_writer !=
nullptr) {
2309 default_compact_writer->write_array_of_nullable_int64(field_name,
2312 schema_writer->add_field(field_name,
2313 field_kind::ARRAY_OF_NULLABLE_INT64);
2318compact_writer::write_array_of_nullable_float32(
2319 const std::string& field_name,
2320 const boost::optional<std::vector<boost::optional<float>>>& value)
2322 if (default_compact_writer !=
nullptr) {
2323 default_compact_writer->write_array_of_nullable_float32(field_name,
2326 schema_writer->add_field(field_name,
2327 field_kind::ARRAY_OF_NULLABLE_FLOAT32);
2332compact_writer::write_array_of_nullable_float64(
2333 const std::string& field_name,
2334 const boost::optional<std::vector<boost::optional<double>>>& value)
2336 if (default_compact_writer !=
nullptr) {
2337 default_compact_writer->write_array_of_nullable_float64(field_name,
2340 schema_writer->add_field(field_name,
2341 field_kind::ARRAY_OF_NULLABLE_FLOAT64);
2349compact::compact_reader
2350create_compact_reader(
2351 pimpl::compact_stream_serializer& compact_stream_serializer,
2352 object_data_input& object_data_input,
2353 const pimpl::schema& schema)
2355 return compact::compact_reader{ compact_stream_serializer,
2364const compact_reader::offset_func compact_reader::BYTE_OFFSET_READER =
2365 pimpl::offset_reader::get_offset<int8_t>;
2366const compact_reader::offset_func compact_reader::SHORT_OFFSET_READER =
2367 pimpl::offset_reader::get_offset<int16_t>;
2368const compact_reader::offset_func compact_reader::INT_OFFSET_READER =
2369 pimpl::offset_reader::get_offset<int32_t>;
2371compact_reader::compact_reader(
2372 pimpl::compact_stream_serializer& compact_stream_serializer,
2373 serialization::object_data_input& object_data_input,
2374 const pimpl::schema& schema)
2375 : compact_stream_serializer(compact_stream_serializer)
2376 , object_data_input(object_data_input)
2379 size_t final_position;
2380 size_t number_of_var_size_fields = schema.number_of_var_size_fields();
2381 if (number_of_var_size_fields != 0) {
2382 uint32_t data_length = object_data_input.read<int32_t>();
2383 data_start_position = object_data_input.position();
2384 variable_offsets_position = data_start_position + data_length;
2385 if (data_length < pimpl::offset_reader::BYTE_OFFSET_READER_RANGE) {
2386 get_offset = BYTE_OFFSET_READER;
2388 variable_offsets_position + number_of_var_size_fields;
2389 }
else if (data_length <
2390 pimpl::offset_reader::SHORT_OFFSET_READER_RANGE) {
2391 get_offset = SHORT_OFFSET_READER;
2393 variable_offsets_position +
2394 (number_of_var_size_fields * util::Bits::SHORT_SIZE_IN_BYTES);
2396 get_offset = INT_OFFSET_READER;
2398 variable_offsets_position +
2399 (number_of_var_size_fields * util::Bits::INT_SIZE_IN_BYTES);
2402 get_offset = INT_OFFSET_READER;
2403 variable_offsets_position = 0;
2404 data_start_position = object_data_input.position();
2406 data_start_position + schema.fixed_size_fields_length();
2410 object_data_input.position(
static_cast<int>(final_position));
2414compact_reader::is_field_exists(
const std::string& field_name,
2415 field_kind kind)
const
2417 const auto& fields = schema.fields();
2418 const auto& field_descriptor = fields.find(field_name);
2419 if (field_descriptor == fields.end()) {
2422 return field_descriptor->second.kind == kind;
2425const pimpl::field_descriptor&
2426compact_reader::get_field_descriptor(
const std::string& field_name)
const
2428 const auto& fields = schema.fields();
2429 const auto& field_descriptor = fields.find(field_name);
2430 if (field_descriptor == fields.end()) {
2431 BOOST_THROW_EXCEPTION(unknown_field(field_name));
2433 return field_descriptor->second;
2436const pimpl::field_descriptor&
2437compact_reader::get_field_descriptor(
const std::string& field_name,
2438 field_kind kind)
const
2440 const auto& field_descriptor = get_field_descriptor(field_name);
2441 if (field_descriptor.kind != kind) {
2442 BOOST_THROW_EXCEPTION(
2443 unexpected_field_kind(field_descriptor.kind, field_name));
2445 return field_descriptor;
2448std::function<int32_t(serialization::object_data_input&, uint32_t, uint32_t)>
2449compact_reader::get_offset_reader(int32_t data_length)
2451 if (data_length < pimpl::offset_reader::BYTE_OFFSET_READER_RANGE) {
2452 return BYTE_OFFSET_READER;
2453 }
else if (data_length < pimpl::offset_reader::SHORT_OFFSET_READER_RANGE) {
2454 return SHORT_OFFSET_READER;
2456 return INT_OFFSET_READER;
2460exception::hazelcast_serialization
2461compact_reader::unexpected_null_value_in_array(
const std::string& field_name,
2462 const std::string& method_suffix)
2467 "Error while reading %1%. Array with null items can not be read via "
2468 "read_array_of_%2% methods. Use read_array_of_nullable_%2% "
2470 field_name % method_suffix)
2474exception::hazelcast_serialization
2475compact_reader::unknown_field(
const std::string& field_name)
const
2477 return {
"compact_reader",
2478 (boost::format(
"Unknown field name %1% on %2% ") % field_name %
2483exception::hazelcast_serialization
2484compact_reader::unexpected_field_kind(field_kind kind,
2485 const std::string& field_name)
const
2487 return {
"compact_reader",
2488 (boost::format(
"Unexpected fieldKind %1% for %2% on %3%") % kind %
2489 field_name % schema)
2493exception::hazelcast_serialization
2494compact_reader::unexpected_null_value(
const std::string& field_name,
2495 const std::string& method_suffix)
2497 return {
"compact_reader",
2499 "Error while reading %1%. null value can not be read via "
2500 "read_%2% methods. Use read_nullable_%2% instead.") %
2501 field_name % method_suffix)
2506compact_reader::read_fixed_size_position(
2507 const pimpl::field_descriptor& field_descriptor)
const
2509 int32_t primitive_offset = field_descriptor.offset;
2510 return primitive_offset + data_start_position;
2514compact_reader::read_var_size_position(
2515 const pimpl::field_descriptor& field_descriptor)
const
2517 int32_t index = field_descriptor.index;
2519 get_offset(object_data_input, variable_offsets_position, index);
2520 return offset == pimpl::offset_reader::NULL_OFFSET
2521 ? pimpl::offset_reader::NULL_OFFSET
2522 : offset + data_start_position;
2526compact_reader::get_field_kind(
const std::string& field_name)
2528 auto descriptor = schema.get_field(field_name);
2531 return field_kind::NOT_AVAILABLE;
2534 return descriptor->kind;
2538compact_reader::read_boolean(
const std::string& fieldName)
2540 return read_primitive<bool>(
2541 fieldName, field_kind::BOOLEAN, field_kind::NULLABLE_BOOLEAN,
"boolean");
2545compact_reader::read_int8(
const std::string& fieldName)
2547 return read_primitive<int8_t>(
2548 fieldName, field_kind::INT8, field_kind::NULLABLE_INT8,
"int8");
2552compact_reader::read_int16(
const std::string& field_name)
2554 return read_primitive<int16_t>(
2555 field_name, field_kind::INT16, field_kind::NULLABLE_INT16,
"int16");
2559compact_reader::read_int32(
const std::string& field_name)
2561 return read_primitive<int32_t>(
2562 field_name, field_kind::INT32, field_kind::NULLABLE_INT32,
"int32");
2566compact_reader::read_int64(
const std::string& field_name)
2568 return read_primitive<int64_t>(
2569 field_name, field_kind::INT64, field_kind::NULLABLE_INT64,
"int64");
2573compact_reader::read_float32(
const std::string& field_name)
2575 return read_primitive<float>(
2576 field_name, field_kind::FLOAT32, field_kind::NULLABLE_FLOAT32,
"float32");
2580compact_reader::read_float64(
const std::string& field_name)
2582 return read_primitive<double>(
2583 field_name, field_kind::FLOAT64, field_kind::NULLABLE_FLOAT64,
"float64");
2586boost::optional<std::string>
2587compact_reader::read_string(
const std::string& field_name)
2589 return read_variable_size<std::string>(field_name, field_kind::STRING);
2592boost::optional<big_decimal>
2593compact_reader::read_decimal(
const std::string& field_name)
2595 return read_variable_size<big_decimal>(field_name, field_kind::DECIMAL);
2598boost::optional<hazelcast::client::local_time>
2599compact_reader::read_time(
const std::string& field_name)
2601 return read_variable_size<hazelcast::client::local_time>(field_name,
2605boost::optional<hazelcast::client::local_date>
2606compact_reader::read_date(
const std::string& field_name)
2608 return read_variable_size<hazelcast::client::local_date>(field_name,
2612boost::optional<hazelcast::client::local_date_time>
2613compact_reader::read_timestamp(
const std::string& field_name)
2615 return read_variable_size<hazelcast::client::local_date_time>(
2616 field_name, field_kind::TIMESTAMP);
2619boost::optional<hazelcast::client::offset_date_time>
2620compact_reader::read_timestamp_with_timezone(
const std::string& field_name)
2622 return read_variable_size<hazelcast::client::offset_date_time>(
2623 field_name, field_kind::TIMESTAMP_WITH_TIMEZONE);
2626boost::optional<std::vector<bool>>
2627compact_reader::read_array_of_boolean(
const std::string& field_name)
2629 return read_array_of_primitive<std::vector<bool>>(
2631 field_kind::ARRAY_OF_BOOLEAN,
2632 field_kind::ARRAY_OF_NULLABLE_BOOLEAN,
2636boost::optional<std::vector<int8_t>>
2637compact_reader::read_array_of_int8(
const std::string& field_name)
2639 return read_array_of_primitive<std::vector<int8_t>>(
2641 field_kind::ARRAY_OF_INT8,
2642 field_kind::ARRAY_OF_NULLABLE_INT8,
2646boost::optional<std::vector<int16_t>>
2647compact_reader::read_array_of_int16(
const std::string& field_name)
2649 return read_array_of_primitive<std::vector<int16_t>>(
2651 field_kind::ARRAY_OF_INT16,
2652 field_kind::ARRAY_OF_NULLABLE_INT16,
2656boost::optional<std::vector<int32_t>>
2657compact_reader::read_array_of_int32(
const std::string& field_name)
2659 return read_array_of_primitive<std::vector<int32_t>>(
2661 field_kind::ARRAY_OF_INT32,
2662 field_kind::ARRAY_OF_NULLABLE_INT32,
2665boost::optional<std::vector<int64_t>>
2666compact_reader::read_array_of_int64(
const std::string& field_name)
2668 return read_array_of_primitive<std::vector<int64_t>>(
2670 field_kind::ARRAY_OF_INT64,
2671 field_kind::ARRAY_OF_NULLABLE_INT64,
2675boost::optional<std::vector<float>>
2676compact_reader::read_array_of_float32(
const std::string& field_name)
2678 return read_array_of_primitive<std::vector<float>>(
2680 field_kind::ARRAY_OF_FLOAT32,
2681 field_kind::ARRAY_OF_NULLABLE_FLOAT32,
2685boost::optional<std::vector<double>>
2686compact_reader::read_array_of_float64(
const std::string& field_name)
2688 return read_array_of_primitive<std::vector<double>>(
2690 field_kind::ARRAY_OF_FLOAT64,
2691 field_kind::ARRAY_OF_NULLABLE_FLOAT64,
2695boost::optional<std::vector<boost::optional<std::string>>>
2696compact_reader::read_array_of_string(
const std::string& field_name)
2698 const auto& descriptor =
2699 get_field_descriptor(field_name, field_kind::ARRAY_OF_STRING);
2700 return read_array_of_variable_size<std::string>(descriptor);
2703boost::optional<std::vector<boost::optional<big_decimal>>>
2704compact_reader::read_array_of_decimal(
const std::string& field_name)
2706 const auto& descriptor =
2707 get_field_descriptor(field_name, field_kind::ARRAY_OF_DECIMAL);
2708 return read_array_of_variable_size<big_decimal>(descriptor);
2711boost::optional<std::vector<boost::optional<local_time>>>
2712compact_reader::read_array_of_time(
const std::string& field_name)
2714 const auto& descriptor =
2715 get_field_descriptor(field_name, field_kind::ARRAY_OF_TIME);
2716 return read_array_of_variable_size<local_time>(descriptor);
2719boost::optional<std::vector<boost::optional<local_date>>>
2720compact_reader::read_array_of_date(
const std::string& field_name)
2722 const auto& descriptor =
2723 get_field_descriptor(field_name, field_kind::ARRAY_OF_DATE);
2724 return read_array_of_variable_size<local_date>(descriptor);
2727boost::optional<std::vector<boost::optional<local_date_time>>>
2728compact_reader::read_array_of_timestamp(
const std::string& field_name)
2730 const auto& descriptor =
2731 get_field_descriptor(field_name, field_kind::ARRAY_OF_TIMESTAMP);
2732 return read_array_of_variable_size<local_date_time>(descriptor);
2735boost::optional<std::vector<boost::optional<offset_date_time>>>
2736compact_reader::read_array_of_timestamp_with_timezone(
2737 const std::string& field_name)
2739 const auto& descriptor = get_field_descriptor(
2740 field_name, field_kind::ARRAY_OF_TIMESTAMP_WITH_TIMEZONE);
2741 return read_array_of_variable_size<offset_date_time>(descriptor);
2744boost::optional<bool>
2745compact_reader::read_nullable_boolean(
const std::string& field_name)
2747 return read_nullable_primitive<bool>(
2748 field_name, field_kind::BOOLEAN, field_kind::NULLABLE_BOOLEAN);
2751boost::optional<int8_t>
2752compact_reader::read_nullable_int8(
const std::string& field_name)
2754 return read_nullable_primitive<int8_t>(
2755 field_name, field_kind::INT8, field_kind::NULLABLE_INT8);
2758boost::optional<int16_t>
2759compact_reader::read_nullable_int16(
const std::string& field_name)
2761 return read_nullable_primitive<int16_t>(
2762 field_name, field_kind::INT16, field_kind::NULLABLE_INT16);
2765boost::optional<int32_t>
2766compact_reader::read_nullable_int32(
const std::string& field_name)
2768 return read_nullable_primitive<int32_t>(
2769 field_name, field_kind::INT32, field_kind::NULLABLE_INT32);
2772boost::optional<int64_t>
2773compact_reader::read_nullable_int64(
const std::string& field_name)
2775 return read_nullable_primitive<int64_t>(
2776 field_name, field_kind::INT64, field_kind::NULLABLE_INT64);
2779boost::optional<float>
2780compact_reader::read_nullable_float32(
const std::string& field_name)
2782 return read_nullable_primitive<float>(
2783 field_name, field_kind::FLOAT32, field_kind::NULLABLE_FLOAT32);
2786boost::optional<double>
2787compact_reader::read_nullable_float64(
const std::string& field_name)
2789 return read_nullable_primitive<double>(
2790 field_name, field_kind::FLOAT64, field_kind::NULLABLE_FLOAT64);
2793boost::optional<std::vector<boost::optional<bool>>>
2794compact_reader::read_array_of_nullable_boolean(
const std::string& field_name)
2796 return read_array_of_nullable<bool>(field_name,
2797 field_kind::ARRAY_OF_BOOLEAN,
2798 field_kind::ARRAY_OF_NULLABLE_BOOLEAN);
2801boost::optional<std::vector<boost::optional<int8_t>>>
2802compact_reader::read_array_of_nullable_int8(
const std::string& field_name)
2804 return read_array_of_nullable<int8_t>(field_name,
2805 field_kind::ARRAY_OF_INT8,
2806 field_kind::ARRAY_OF_NULLABLE_INT8);
2809boost::optional<std::vector<boost::optional<int16_t>>>
2810compact_reader::read_array_of_nullable_int16(
const std::string& field_name)
2812 return read_array_of_nullable<int16_t>(field_name,
2813 field_kind::ARRAY_OF_INT16,
2814 field_kind::ARRAY_OF_NULLABLE_INT16);
2817boost::optional<std::vector<boost::optional<int32_t>>>
2818compact_reader::read_array_of_nullable_int32(
const std::string& field_name)
2820 return read_array_of_nullable<int32_t>(field_name,
2821 field_kind::ARRAY_OF_INT32,
2822 field_kind::ARRAY_OF_NULLABLE_INT32);
2825boost::optional<std::vector<boost::optional<int64_t>>>
2826compact_reader::read_array_of_nullable_int64(
const std::string& field_name)
2828 return read_array_of_nullable<int64_t>(field_name,
2829 field_kind::ARRAY_OF_INT64,
2830 field_kind::ARRAY_OF_NULLABLE_INT64);
2833boost::optional<std::vector<boost::optional<float>>>
2834compact_reader::read_array_of_nullable_float32(
const std::string& field_name)
2836 return read_array_of_nullable<float>(field_name,
2837 field_kind::ARRAY_OF_FLOAT32,
2838 field_kind::ARRAY_OF_NULLABLE_FLOAT32);
2841boost::optional<std::vector<boost::optional<double>>>
2842compact_reader::read_array_of_nullable_float64(
const std::string& field_name)
2844 return read_array_of_nullable<double>(
2846 field_kind::ARRAY_OF_FLOAT64,
2847 field_kind::ARRAY_OF_NULLABLE_FLOAT64);
2854compact::compact_writer
2855create_compact_writer(pimpl::default_compact_writer* default_compact_writer)
2857 return compact::compact_writer{ default_compact_writer };
2860compact::compact_writer
2861create_compact_writer(pimpl::schema_writer* schema_writer)
2863 return compact::compact_writer{ schema_writer };
2866default_compact_writer::default_compact_writer(
2867 compact_stream_serializer& compact_stream_serializer,
2868 object_data_output& object_data_output,
2869 const schema& schema)
2870 : compact_stream_serializer_(compact_stream_serializer)
2871 , object_data_output_(object_data_output)
2873 , field_offsets(schema.number_of_var_size_fields())
2875 if (schema.number_of_var_size_fields() != 0) {
2876 data_start_position =
2877 object_data_output_.position() + util::Bits::INT_SIZE_IN_BYTES;
2879 object_data_output_.write_zero_bytes(schema.fixed_size_fields_length() +
2880 util::Bits::INT_SIZE_IN_BYTES);
2882 data_start_position = object_data_output_.position();
2885 object_data_output_.write_zero_bytes(schema.fixed_size_fields_length());
2890default_compact_writer::write_boolean(
const std::string& field_name,
bool value)
2892 field_descriptor descriptor =
2893 check_field_definition(field_name, field_kind::BOOLEAN);
2894 int32_t offset_in_bytes = descriptor.offset;
2895 int8_t offset_in_bits = descriptor.bit_offset;
2896 size_t write_offset = offset_in_bytes + data_start_position;
2897 object_data_output_.write_boolean_bit_at(
2898 write_offset, offset_in_bits, value);
2902default_compact_writer::write_int8(
const std::string& field_name, int8_t value)
2905 get_fixed_size_field_position(field_name, field_kind::INT8);
2906 object_data_output_.write_at(position, value);
2910default_compact_writer::write_int16(
const std::string& field_name,
2914 get_fixed_size_field_position(field_name, field_kind::INT16);
2915 object_data_output_.write_at(position, value);
2919default_compact_writer::write_int32(
const std::string& field_name,
2923 get_fixed_size_field_position(field_name, field_kind::INT32);
2924 object_data_output_.write_at(position, value);
2928default_compact_writer::write_int64(
const std::string& field_name,
2932 get_fixed_size_field_position(field_name, field_kind::INT64);
2933 object_data_output_.write_at(position, value);
2937default_compact_writer::write_float32(
const std::string& field_name,
2941 get_fixed_size_field_position(field_name, field_kind::FLOAT32);
2942 object_data_output_.write_at(position, value);
2946default_compact_writer::write_float64(
const std::string& field_name,
2950 get_fixed_size_field_position(field_name, field_kind::FLOAT64);
2951 object_data_output_.write_at(position, value);
2955default_compact_writer::write_string(
const std::string& field_name,
2956 const boost::optional<std::string>& value)
2958 write_variable_size_field(field_name, field_kind::STRING, value);
2962default_compact_writer::write_decimal(
const std::string& field_name,
2963 const boost::optional<big_decimal>& value)
2965 write_variable_size_field(field_name, field_kind::DECIMAL, value);
2969default_compact_writer::write_time(
2970 const std::string& field_name,
2971 const boost::optional<hazelcast::client::local_time>& value)
2973 write_variable_size_field(field_name, field_kind::TIME, value);
2976default_compact_writer::write_date(
2977 const std::string& field_name,
2978 const boost::optional<hazelcast::client::local_date>& value)
2980 write_variable_size_field(field_name, field_kind::DATE, value);
2984default_compact_writer::write_timestamp(
2985 const std::string& field_name,
2986 const boost::optional<hazelcast::client::local_date_time>& value)
2988 write_variable_size_field(field_name, field_kind::TIMESTAMP, value);
2992default_compact_writer::write_timestamp_with_timezone(
2993 const std::string& field_name,
2994 const boost::optional<hazelcast::client::offset_date_time>& value)
2996 write_variable_size_field(
2997 field_name, field_kind::TIMESTAMP_WITH_TIMEZONE, value);
3001default_compact_writer::write_array_of_boolean(
3002 const std::string& field_name,
3003 const boost::optional<std::vector<bool>>& value)
3005 write_variable_size_field(field_name, field_kind::ARRAY_OF_BOOLEAN, value);
3009default_compact_writer::write_array_of_int8(
3010 const std::string& field_name,
3011 const boost::optional<std::vector<int8_t>>& value)
3013 write_variable_size_field(field_name, field_kind::ARRAY_OF_INT8, value);
3017default_compact_writer::write_array_of_int16(
3018 const std::string& field_name,
3019 const boost::optional<std::vector<int16_t>>& value)
3021 write_variable_size_field(field_name, field_kind::ARRAY_OF_INT16, value);
3025default_compact_writer::write_array_of_int32(
3026 const std::string& field_name,
3027 const boost::optional<std::vector<int32_t>>& value)
3029 write_variable_size_field(field_name, field_kind::ARRAY_OF_INT32, value);
3033default_compact_writer::write_array_of_int64(
3034 const std::string& field_name,
3035 const boost::optional<std::vector<int64_t>>& value)
3037 write_variable_size_field(field_name, field_kind::ARRAY_OF_INT64, value);
3041default_compact_writer::write_array_of_float32(
3042 const std::string& field_name,
3043 const boost::optional<std::vector<float>>& value)
3045 write_variable_size_field(field_name, field_kind::ARRAY_OF_FLOAT32, value);
3049default_compact_writer::write_array_of_float64(
3050 const std::string& field_name,
3051 const boost::optional<std::vector<double>>& value)
3053 write_variable_size_field(field_name, field_kind::ARRAY_OF_FLOAT64, value);
3057default_compact_writer::write_array_of_string(
3058 const std::string& field_name,
3059 const boost::optional<std::vector<boost::optional<std::string>>>& value)
3061 write_array_of_variable_size(
3062 field_name, field_kind::ARRAY_OF_STRING, value);
3066default_compact_writer::write_array_of_decimal(
3067 const std::string& field_name,
3068 const boost::optional<std::vector<boost::optional<big_decimal>>>& value)
3070 write_array_of_variable_size(
3071 field_name, field_kind::ARRAY_OF_DECIMAL, value);
3075default_compact_writer::write_array_of_time(
3076 const std::string& field_name,
3077 const boost::optional<std::vector<boost::optional<local_time>>>& value)
3079 write_array_of_variable_size(field_name, field_kind::ARRAY_OF_TIME, value);
3083default_compact_writer::write_array_of_date(
3084 const std::string& field_name,
3085 const boost::optional<std::vector<boost::optional<local_date>>>& value)
3087 write_array_of_variable_size(field_name, field_kind::ARRAY_OF_DATE, value);
3091default_compact_writer::write_array_of_timestamp(
3092 const std::string& field_name,
3093 const boost::optional<std::vector<boost::optional<local_date_time>>>& value)
3095 write_array_of_variable_size(
3096 field_name, field_kind::ARRAY_OF_TIMESTAMP, value);
3100default_compact_writer::write_array_of_timestamp_with_timezone(
3101 const std::string& field_name,
3102 const boost::optional<std::vector<boost::optional<offset_date_time>>>& value)
3104 write_array_of_variable_size(
3105 field_name, field_kind::ARRAY_OF_TIMESTAMP_WITH_TIMEZONE, value);
3109default_compact_writer::write_nullable_boolean(
3110 const std::string& field_name,
3111 const boost::optional<bool>& value)
3113 write_variable_size_field(field_name, field_kind::NULLABLE_BOOLEAN, value);
3116default_compact_writer::write_nullable_int8(
3117 const std::string& field_name,
3118 const boost::optional<int8_t>& value)
3120 write_variable_size_field(field_name, field_kind::NULLABLE_INT8, value);
3123default_compact_writer::write_nullable_int16(
3124 const std::string& field_name,
3125 const boost::optional<int16_t>& value)
3127 write_variable_size_field(field_name, field_kind::NULLABLE_INT16, value);
3130default_compact_writer::write_nullable_int32(
3131 const std::string& field_name,
3132 const boost::optional<int32_t>& value)
3134 write_variable_size_field(field_name, field_kind::NULLABLE_INT32, value);
3137default_compact_writer::write_nullable_int64(
3138 const std::string& field_name,
3139 const boost::optional<int64_t>& value)
3141 write_variable_size_field(field_name, field_kind::NULLABLE_INT64, value);
3144default_compact_writer::write_nullable_float32(
3145 const std::string& field_name,
3146 const boost::optional<float>& value)
3148 write_variable_size_field(field_name, field_kind::NULLABLE_FLOAT32, value);
3151default_compact_writer::write_nullable_float64(
3152 const std::string& field_name,
3153 const boost::optional<double>& value)
3155 write_variable_size_field(field_name, field_kind::NULLABLE_FLOAT64, value);
3159default_compact_writer::write_array_of_nullable_boolean(
3160 const std::string& field_name,
3161 const boost::optional<std::vector<boost::optional<bool>>>& value)
3163 write_array_of_variable_size(
3164 field_name, field_kind::ARRAY_OF_NULLABLE_BOOLEAN, value);
3168default_compact_writer::write_array_of_nullable_int8(
3169 const std::string& field_name,
3170 const boost::optional<std::vector<boost::optional<int8_t>>>& value)
3172 write_array_of_variable_size(
3173 field_name, field_kind::ARRAY_OF_NULLABLE_INT8, value);
3177default_compact_writer::write_array_of_nullable_int16(
3178 const std::string& field_name,
3179 const boost::optional<std::vector<boost::optional<int16_t>>>& value)
3181 write_array_of_variable_size(
3182 field_name, field_kind::ARRAY_OF_NULLABLE_INT16, value);
3186default_compact_writer::write_array_of_nullable_int32(
3187 const std::string& field_name,
3188 const boost::optional<std::vector<boost::optional<int32_t>>>& value)
3190 write_array_of_variable_size(
3191 field_name, field_kind::ARRAY_OF_NULLABLE_INT32, value);
3195default_compact_writer::write_array_of_nullable_int64(
3196 const std::string& field_name,
3197 const boost::optional<std::vector<boost::optional<int64_t>>>& value)
3199 write_array_of_variable_size(
3200 field_name, field_kind::ARRAY_OF_NULLABLE_INT64, value);
3204default_compact_writer::write_array_of_nullable_float32(
3205 const std::string& field_name,
3206 const boost::optional<std::vector<boost::optional<float>>>& value)
3208 write_array_of_variable_size(
3209 field_name, field_kind::ARRAY_OF_NULLABLE_FLOAT32, value);
3213default_compact_writer::write_array_of_nullable_float64(
3214 const std::string& field_name,
3215 const boost::optional<std::vector<boost::optional<double>>>& value)
3217 write_array_of_variable_size(
3218 field_name, field_kind::ARRAY_OF_NULLABLE_FLOAT64, value);
3222default_compact_writer::end()
3224 if (schema_.number_of_var_size_fields() == 0) {
3228 size_t position = object_data_output_.position();
3229 size_t data_length = position - data_start_position;
3230 write_offsets(data_length, field_offsets);
3232 object_data_output_.write_at(data_start_position -
3233 util::Bits::INT_SIZE_IN_BYTES,
3234 (int32_t)data_length);
3238default_compact_writer::get_fixed_size_field_position(
3239 const std::string& field_name,
3240 enum field_kind field_kind)
const
3242 const field_descriptor& field_descriptor =
3243 check_field_definition(field_name, field_kind);
3244 return field_descriptor.offset + data_start_position;
3247const field_descriptor&
3248default_compact_writer::check_field_definition(
const std::string& field_name,
3249 field_kind kind)
const
3251 auto iterator = schema_.fields().find(field_name);
3252 if (iterator == schema_.fields().end()) {
3253 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
3254 "default_compact_writer",
3255 (boost::format(
"Invalid field name %1% for %2%") % field_name %
3259 if (iterator->second.kind != kind) {
3260 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization(
3261 "default_compact_writer",
3262 (boost::format(
"Invalid field type %1% for %2%") % field_name %
3266 return iterator->second;
3270default_compact_writer::write_offsets(
size_t data_length,
3271 const std::vector<int32_t>& offsets)
3273 if (data_length < offset_reader::BYTE_OFFSET_READER_RANGE) {
3274 for (int32_t offset : offsets) {
3275 object_data_output_.write<int8_t>(
static_cast<int8_t
>(offset));
3277 }
else if (data_length < offset_reader::SHORT_OFFSET_READER_RANGE) {
3278 for (int32_t offset : offsets) {
3279 object_data_output_.write<int16_t>(
static_cast<int16_t
>(offset));
3282 for (int32_t offset : offsets) {
3283 object_data_output_.write<int32_t>(offset);
3289default_compact_writer::set_position(
const std::string& field_name,
3290 enum field_kind field_kind)
3292 const auto& field_descriptor =
3293 check_field_definition(field_name, field_kind);
3294 size_t pos = object_data_output_.position();
3295 size_t fieldPosition = pos - data_start_position;
3296 int index = field_descriptor.index;
3297 field_offsets[index] =
static_cast<int32_t
>(fieldPosition);
3301default_compact_writer::set_position_as_null(
const std::string& field_name,
3302 enum field_kind field_kind)
3304 const auto& field_descriptor =
3305 check_field_definition(field_name, field_kind);
3306 int index = field_descriptor.index;
3307 field_offsets[index] = -1;
3310std::array<uint64_t, 256>
3313 std::array<uint64_t, 256> FP_TABLE;
3314 for (
int i = 0; i < 256; ++i) {
3316 for (
int j = 0; j < 8; ++j) {
3317 fp = (fp >> 1) ^ (rabin_finger_print::INIT & -(fp & 1L));
3324constexpr uint64_t rabin_finger_print::INIT;
3327rabin_finger_print::fingerprint64(uint64_t fp,
byte b)
3329 static std::array<uint64_t, 256> FP_TABLE = init_fp_table();
3330 return (fp >> 8) ^ FP_TABLE[(int)(fp ^ b) & 0xff];
3334rabin_finger_print::fingerprint64(uint64_t fp, int32_t v)
3336 fp = fingerprint64(fp, (
byte)((v)&0xFF));
3337 fp = fingerprint64(fp, (
byte)((v >> 8) & 0xFF));
3338 fp = fingerprint64(fp, (
byte)((v >> 16) & 0xFF));
3339 fp = fingerprint64(fp, (
byte)((v >> 24) & 0xFF));
3344rabin_finger_print::fingerprint64(uint64_t fp,
const std::string& value)
3346 fp = fingerprint64(fp, (
int)value.size());
3347 for (
const auto& item : value) {
3348 fp = fingerprint64(fp, (
byte)item);
3357rabin_finger_print::fingerprint64(
3358 const std::string& type_name,
3359 std::map<std::string, field_descriptor>& fields)
3361 uint64_t fingerPrint = fingerprint64(INIT, type_name);
3362 fingerPrint = fingerprint64(fingerPrint, (
int)fields.size());
3363 for (
const auto& entry : fields) {
3364 const field_descriptor& descriptor = entry.second;
3365 fingerPrint = fingerprint64(fingerPrint, entry.first);
3366 fingerPrint = fingerprint64(fingerPrint, (
int)descriptor.kind);
3369 int64_t signed_fp{};
3371 std::memcpy(&signed_fp, &fingerPrint,
sizeof(uint64_t));
3376kind_size_comparator(
const field_descriptor* i,
const field_descriptor* j)
3378 auto i_kind_size = field_operations::get(i->kind).kind_size_in_byte_func();
3379 auto j_kind_size = field_operations::get(j->kind).kind_size_in_byte_func();
3380 return i_kind_size > j_kind_size;
3384 std::string type_name,
3385 std::unordered_map<std::string, field_descriptor>&& field_definition_map)
3386 : type_name_(std::move(type_name))
3387 , field_definition_map_(std::move(field_definition_map))
3389 std::vector<field_descriptor*> fixed_size_fields;
3390 std::vector<field_descriptor*> boolean_fields;
3391 std::vector<field_descriptor*> variable_size_fields;
3393 std::map<std::string, field_descriptor> sorted_fields(
3394 field_definition_map_.begin(), field_definition_map_.end());
3395 for (
auto& item : sorted_fields) {
3396 field_descriptor& descriptor = item.second;
3397 field_kind kind = descriptor.kind;
3398 if (field_operations::get(kind).kind_size_in_byte_func() ==
3399 field_kind_based_operations::VARIABLE_SIZE) {
3400 variable_size_fields.push_back(&descriptor);
3401 }
else if (kind == field_kind::BOOLEAN) {
3402 boolean_fields.push_back(&descriptor);
3404 fixed_size_fields.push_back(&descriptor);
3409 fixed_size_fields.begin(), fixed_size_fields.end(), kind_size_comparator);
3412 for (
auto descriptor : fixed_size_fields) {
3413 descriptor->offset = offset;
3415 field_operations::get(descriptor->kind).kind_size_in_byte_func();
3418 int8_t bit_offset = 0;
3419 for (
auto descriptor : boolean_fields) {
3420 descriptor->offset = offset;
3421 descriptor->bit_offset =
3422 static_cast<int8_t
>(bit_offset % util::Bits::BITS_IN_BYTE);
3424 if (bit_offset % util::Bits::BITS_IN_BYTE == 0) {
3428 if (bit_offset % util::Bits::BITS_IN_BYTE != 0) {
3432 fixed_size_fields_length_ = offset;
3435 for (
auto descriptor : variable_size_fields) {
3436 descriptor->index = index;
3440 for (
auto& item : sorted_fields) {
3441 auto field = field_definition_map_.find(item.first);
3443 assert(field != end(field_definition_map_));
3444 field->second = item.second;
3447 number_of_var_size_fields_ = index;
3448 schema_id_ = rabin_finger_print::fingerprint64(type_name_, sorted_fields);
3452schema::schema_id()
const
3458schema::number_of_var_size_fields()
const
3460 return number_of_var_size_fields_;
3464schema::fixed_size_fields_length()
const
3466 return fixed_size_fields_length_;
3470schema::type_name()
const
3475const std::unordered_map<std::string, field_descriptor>&
3476schema::fields()
const
3478 return field_definition_map_;
3481boost::optional<field_descriptor>
3482schema::get_field(
const std::string& field_name)
const
3484 auto descriptor_itr = field_definition_map_.find(field_name);
3486 if (descriptor_itr == end(field_definition_map_))
3489 return descriptor_itr->second;
3493operator==(
const schema& x,
const schema& y)
3495 return x.number_of_var_size_fields() == y.number_of_var_size_fields() &&
3496 x.fixed_size_fields_length() == y.fixed_size_fields_length() &&
3497 x.schema_id() == y.schema_id() && x.type_name() == y.type_name() &&
3498 x.fields() == y.fields();
3502operator!=(
const schema& x,
const schema& y)
3508operator<<(std::ostream& os,
const schema& schema)
3510 os <<
"Schema { className = " << schema.type_name()
3511 <<
", numberOfComplextFields = " << schema.number_of_var_size_fields()
3512 <<
",primitivesLength = " << schema.fixed_size_fields_length()
3514 for (
const auto& item : schema.fields()) {
3515 os << item.first <<
" " << item.second <<
",";
3525exception::hazelcast_serialization
3526compact_util::exception_for_unexpected_null_value(
3527 const std::string& field_name,
3528 const std::string& method_prefix,
3529 const std::string& method_suffix)
3531 return exception::hazelcast_serialization{ boost::str(
3532 boost::format(
"Error while reading %1%. null value can not be read via "
3533 "%2%%3% methods. Use %2%Nullable%3% instead.") %
3534 field_name % method_prefix % method_suffix) };
3537exception::hazelcast_serialization
3538compact_util::exception_for_unexpected_null_value_in_array(
3539 const std::string& field_name,
3540 const std::string& method_prefix,
3541 const std::string& method_suffix)
3543 return exception::hazelcast_serialization{ boost::str(
3545 "Error while reading %1%. null value can not be read via %2%ArrayOf%3% "
3546 "methods. Use %2%ArrayOfNullable%3% instead.") %
3547 field_name % method_prefix % method_suffix) };
3550schema_writer::schema_writer(std::string type_name)
3551 : type_name_(std::move(type_name))
3555schema_writer::add_field(std::string field_name,
enum field_kind kind)
3557 if (field_definition_map_.find(field_name) != end(field_definition_map_)) {
3558 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization{
3559 "Field with the name '" + field_name +
"' already exists." });
3562 field_definition_map_.emplace(std::move(field_name), field_descriptor{ kind });
3566schema_writer::build() &&
3568 return schema{ type_name_, std::move(field_definition_map_) };
3571default_schema_service::default_schema_service(spi::ClientContext& context)
3572 : retry_pause_millis_{ context.get_client_properties().get_integer(
3573 context.get_client_properties().get_invocation_retry_pause_millis()) }
3574 , max_put_retry_count_{ context.get_client_properties().get_integer(
3575 client_property{ MAX_PUT_RETRY_COUNT, MAX_PUT_RETRY_COUNT_DEFAULT }) }
3580std::shared_ptr<schema>
3581default_schema_service::get(int64_t schemaId)
3583 auto ptr = replicateds_.get(schemaId);
3589 auto logger = context_.get_logger();
3590 if (logger.enabled(logger::level::finest)) {
3592 logger::level::finest,
3593 boost::str(boost::format(
"Could not find schema id %1% locally, will "
3594 "search on the cluster %1%") %
3598 using namespace protocol::codec;
3600 auto request_message = client_fetchschema_encode(schemaId);
3602 auto invocation = spi::impl::ClientInvocation::create(
3603 context_, request_message, SERVICE_NAME);
3604 auto message = invocation->invoke().get();
3606 message.skip_frame();
3607 auto sch = message.get_nullable<schema>();
3609 std::shared_ptr<schema> schema_ptr;
3612 schema_ptr = std::make_shared<schema>(std::move(*sch));
3613 replicateds_.put_if_absent(schemaId, schema_ptr);
3620default_schema_service::replicate_schema_in_cluster(schema s)
3622 using hazelcast::client::protocol::ClientMessage;
3623 using namespace protocol::codec;
3625 for (
int i = 0; i < max_put_retry_count_; ++i) {
3626 auto message = client_sendschema_encode(s);
3629 spi::impl::ClientInvocation::create(context_, message, SERVICE_NAME);
3631 auto response = invocation->invoke().get();
3632 auto replicated_member_uuids = send_schema_response_decode(response);
3633 auto members = context_.get_cluster().get_members();
3636 for (
const member& member : members) {
3638 contains = replicated_member_uuids.find(member.get_uuid()) !=
3639 end(replicated_member_uuids);
3642 if (i == (max_put_retry_count_ - 1)) {
3643 throw exception::illegal_state{
3644 "default_schema_service::replicate_schema_attempt",
3645 (boost::format(
"The schema %1% cannot be "
3646 "replicated in the cluster, after "
3647 "%2% retries. It might be the case "
3648 "that the client is experiencing a "
3649 "split-brain, and continue putting "
3650 "the data associated with that "
3651 "schema might result in data loss. "
3652 "It might be possible to replicate "
3653 "the schema after some time, when "
3654 "the cluster is healed.") %
3655 s % max_put_retry_count_)
3659 std::this_thread::sleep_for(
3660 std::chrono::milliseconds{ retry_pause_millis_ });
3662 if (!context_.get_lifecycle_service().is_running()) {
3672 put_if_absent(std::move(s));
3680default_schema_service::is_schema_replicated(
const schema& s)
3682 return bool(replicateds_.get(s.schema_id()));
3686default_schema_service::put_if_absent(schema s)
3688 auto s_p = std::make_shared<schema>(std::move(s));
3689 auto existing = replicateds_.put_if_absent(s_p->schema_id(), s_p);
3695 if (*s_p != *existing) {
3696 throw exception::illegal_state{
3697 "default_schema_service::replicate_schema_attempt",
3698 (boost::format(
"Schema with schemaId %1% "
3699 "already exists. Existing "
3700 "schema %2%, new schema %3%") %
3701 s_p->schema_id() % *existing % *s_p)
3710std::unordered_set<boost::uuids::uuid, boost::hash<boost::uuids::uuid>>
3711default_schema_service::send_schema_response_decode(
3712 protocol::ClientMessage& message)
3714 message.skip_frame();
3715 return message.get<std::unordered_set<boost::uuids::uuid,
3716 boost::hash<boost::uuids::uuid>>>();
3720default_schema_service::has_any_schemas()
const
3722 return replicateds_.size();
3726operator<<(std::ostream& os,
const std::vector<schema>& schemas)
3730 for (
const auto& s : schemas)
3739default_schema_service::replicate_all_schemas()
3741 using level = hazelcast::logger::level;
3742 using namespace protocol::codec;
3744 auto logger = context_.get_logger();
3745 if (replicateds_.empty()) {
3746 if (logger.enabled(level::finest)) {
3747 logger.log(level::finest,
3748 "There is no schema to send to the cluster.");
3754 std::vector<std::shared_ptr<schema>> schemas_sptr = replicateds_.values();
3755 std::vector<schema> all_schemas;
3757 all_schemas.reserve(schemas_sptr.size());
3759 transform(begin(schemas_sptr),
3761 back_inserter(all_schemas),
3762 [](
const std::shared_ptr<schema>& s) {
return *s; });
3764 if (logger.enabled(level::finest)) {
3767 (boost::format(
"Sending schemas to the cluster %1%") % all_schemas)
3771 auto message = client_sendallschemas_encode(all_schemas);
3774 spi::impl::ClientInvocation::create(context_, message, SERVICE_NAME);
3776 invocation->invoke_urgent().get();
3779compact_stream_serializer::compact_stream_serializer(
3780 default_schema_service& service)
3781 : schema_service(service)
3785generic_record::generic_record
3786compact_stream_serializer::read_generic_record(object_data_input& in)
3788 int64_t schema_id = in.read<int64_t>();
3790 auto sch = schema_service.get(schema_id);
3793 throw exception::hazelcast_serialization{
3794 "compact_stream_serializer::read_generic_record",
3797 "The schema can not be found with id %1%") %
3802 compact::compact_reader reader = create_compact_reader(*
this, in, *sch);
3803 generic_record::generic_record_builder builder{ sch };
3805 for (
const std::pair<const std::string, field_descriptor>& p : sch->fields()) {
3806 const std::string& field_name = p.first;
3807 const field_descriptor& descriptor = p.second;
3808 field_operations::get(descriptor.kind)
3809 .read_generic_record_or_primitive(reader, builder, field_name);
3812 return builder.build();
3816compact_stream_serializer::write_generic_record(
3817 const generic_record::generic_record& record,
3818 object_data_output& out)
3820 const schema& s = record.get_schema();
3822 if (!schema_service.is_schema_replicated(s)) {
3823 out.schemas_will_be_replicated_.push_back(s);
3826 out.write<int64_t>(s.schema_id());
3827 default_compact_writer default_writer(*
this, out, s);
3829 const auto& fields = s.fields();
3830 for (std::pair<std::string, field_descriptor> pair : fields) {
3831 const std::string& field = pair.first;
3832 const field_descriptor& desc = pair.second;
3834 field_operations::get(desc.kind).write_field_from_record_to_writer(
3835 default_writer, record, field);
3838 default_writer.end();
3841field_kind_based_operations::field_kind_based_operations()
3842 : kind_size_in_byte_func(DEFAULT_KIND_SIZE_IN_BYTES)
3845field_kind_based_operations::field_kind_based_operations(
3846 kind_size_in_bytes_fn kind_size_fn,
3847 write_field_from_record_to_writer_fn write_fn,
3848 read_generic_record_or_primitive_fn read_fn,
3849 write_json_formatted_field_fn json_fn)
3850 : kind_size_in_byte_func(std::move(kind_size_fn))
3851 , write_field_from_record_to_writer(std::move(write_fn))
3852 , read_generic_record_or_primitive(std::move(read_fn))
3853 , write_json_formatted_field(std::move(json_fn))
3856const field_kind_based_operations&
3857field_operations::get(field_kind kind)
3860 using namespace boost::property_tree;
3862 static const std::string NULL_STRING =
"null";
3863 static const std::string BOOL_STRING[2] = {
"true",
"false" };
3865 static auto time_to_string = [](
const local_time& lt) {
3866 return boost::str(boost::format(
"%02d:%02d:%02d.%d") %
int(lt.hours) %
3867 int(lt.minutes) %
int(lt.seconds) % lt.nanos);
3870 static auto date_to_string = [](
const local_date& lt) {
3871 return boost::str(boost::format(
"%d-%02d-%02d") % lt.year %
3872 int(lt.month) %
int(lt.day_of_month));
3875 static auto timestamp_to_string = [](
const local_date_time& lt) {
3876 return boost::str(boost::format(
"%1%T%2%") % date_to_string(lt.date) %
3877 time_to_string(lt.time));
3880 static auto timestamp_with_timezone_to_string =
3881 [](
const offset_date_time& lt) {
3882 auto hours = lt.zone_offset_in_seconds / 60;
3883 auto seconds = lt.zone_offset_in_seconds % 60;
3884 return boost::str(boost::format(
"%1%%2%:%3%") %
3885 timestamp_to_string(lt.date_time) % hours %
3889 static const field_kind_based_operations ALL[] = {
3890 field_kind_based_operations{},
3891 field_kind_based_operations{
3894 [](default_compact_writer& writer,
3895 const generic_record::generic_record& record,
3896 const std::string& field) {
3897 writer.write_boolean(field, record.get_boolean(field));
3899 [](compact::compact_reader& reader,
3900 generic_record::generic_record_builder& builder,
3901 const std::string& field) {
3902 builder.set_boolean(field, reader.read_boolean(field));
3904 [](boost::property_tree::ptree& parent,
3905 const generic_record::generic_record& record,
3906 const std::string& field_name) {
3907 parent.put(field_name, record.get_boolean(field_name));
3909 field_kind_based_operations{
3911 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
3912 [](default_compact_writer& writer,
3913 const generic_record::generic_record& record,
3914 const std::string& field) {
3915 writer.write_array_of_boolean(field,
3916 record.get_array_of_boolean(field));
3918 [](compact::compact_reader& reader,
3919 generic_record::generic_record_builder& builder,
3920 const std::string& field) {
3921 builder.set_array_of_boolean(field,
3922 reader.read_array_of_boolean(field));
3925 const generic_record::generic_record& record,
3926 const std::string& field_name) {
3927 const auto& values = record.get_array_of_boolean(field_name);
3930 parent.put(field_name, NULL_STRING);
3934 for (
bool value : *values) {
3936 std::make_pair(
"", ptree(BOOL_STRING[value])));
3939 parent.put_child(field_name, array);
3942 field_kind_based_operations{
3945 [](default_compact_writer& writer,
3946 const generic_record::generic_record& record,
3947 const std::string& field) {
3948 writer.write_int8(field, record.get_int8(field));
3950 [](compact::compact_reader& reader,
3951 generic_record::generic_record_builder& builder,
3952 const std::string& field) {
3953 builder.set_int8(field, reader.read_int8(field));
3955 [](boost::property_tree::ptree& parent,
3956 const generic_record::generic_record& record,
3957 const std::string& field_name) {
3958 parent.put(field_name, record.get_int8(field_name));
3960 field_kind_based_operations{
3962 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
3963 [](default_compact_writer& writer,
3964 const generic_record::generic_record& record,
3965 const std::string& field) {
3966 writer.write_array_of_int8(field,
3967 record.get_array_of_int8(field));
3969 [](compact::compact_reader& reader,
3970 generic_record::generic_record_builder& builder,
3971 const std::string& field) {
3972 builder.set_array_of_int8(field,
3973 reader.read_array_of_int8(field));
3976 const generic_record::generic_record& record,
3977 const std::string& field_name) {
3978 const auto& values = record.get_array_of_int8(field_name);
3981 parent.put(field_name, NULL_STRING);
3985 for (
auto value : *values) {
3987 std::make_pair(
"", ptree(std::to_string(value))));
3990 parent.put_child(field_name, array);
3993 field_kind_based_operations{},
3994 field_kind_based_operations{},
3995 field_kind_based_operations{
3997 [] {
return Bits::SHORT_SIZE_IN_BYTES; },
3998 [](default_compact_writer& writer,
3999 const generic_record::generic_record& record,
4000 const std::string& field) {
4001 writer.write_int16(field, record.get_int16(field));
4003 [](compact::compact_reader& reader,
4004 generic_record::generic_record_builder& builder,
4005 const std::string& field) {
4006 builder.set_int16(field, reader.read_int16(field));
4008 [](boost::property_tree::ptree& pt,
4009 const generic_record::generic_record& record,
4010 const std::string& field_name) {
4011 pt.put(field_name, record.get_int16(field_name));
4013 field_kind_based_operations{
4015 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4016 [](default_compact_writer& writer,
4017 const generic_record::generic_record& record,
4018 const std::string& field) {
4019 writer.write_array_of_int16(field,
4020 record.get_array_of_int16(field));
4022 [](compact::compact_reader& reader,
4023 generic_record::generic_record_builder& builder,
4024 const std::string& field) {
4025 builder.set_array_of_int16(field,
4026 reader.read_array_of_int16(field));
4029 const generic_record::generic_record& record,
4030 const std::string& field_name) {
4031 const auto& values = record.get_array_of_int16(field_name);
4034 parent.put(field_name, NULL_STRING);
4038 for (
auto value : *values) {
4040 std::make_pair(
"", ptree(std::to_string(value))));
4043 parent.put_child(field_name, array);
4046 field_kind_based_operations{
4048 [] {
return Bits::INT_SIZE_IN_BYTES; },
4049 [](default_compact_writer& writer,
4050 const generic_record::generic_record& record,
4051 const std::string& field) {
4052 writer.write_int32(field, record.get_int32(field));
4054 [](compact::compact_reader& reader,
4055 generic_record::generic_record_builder& builder,
4056 const std::string& field) {
4057 builder.set_int32(field, reader.read_int32(field));
4059 [](boost::property_tree::ptree& parent,
4060 const generic_record::generic_record& record,
4061 const std::string& field_name) {
4062 parent.put(field_name, record.get_int32(field_name));
4064 field_kind_based_operations{
4066 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4067 [](default_compact_writer& writer,
4068 const generic_record::generic_record& record,
4069 const std::string& field) {
4070 writer.write_array_of_int32(field,
4071 record.get_array_of_int32(field));
4073 [](compact::compact_reader& reader,
4074 generic_record::generic_record_builder& builder,
4075 const std::string& field) {
4076 builder.set_array_of_int32(field,
4077 reader.read_array_of_int32(field));
4080 const generic_record::generic_record& record,
4081 const std::string& field_name) {
4082 const auto& values = record.get_array_of_int32(field_name);
4085 parent.put(field_name, NULL_STRING);
4089 for (
auto value : *values) {
4091 std::make_pair(
"", ptree(std::to_string(value))));
4094 parent.put_child(field_name, array);
4097 field_kind_based_operations{
4099 [] {
return Bits::LONG_SIZE_IN_BYTES; },
4100 [](default_compact_writer& writer,
4101 const generic_record::generic_record& record,
4102 const std::string& field) {
4103 writer.write_int64(field, record.get_int64(field));
4105 [](compact::compact_reader& reader,
4106 generic_record::generic_record_builder& builder,
4107 const std::string& field) {
4108 builder.set_int64(field, reader.read_int64(field));
4110 [](boost::property_tree::ptree& parent,
4111 const generic_record::generic_record& record,
4112 const std::string& field_name) {
4113 parent.put(field_name, record.get_int64(field_name));
4115 field_kind_based_operations{
4117 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4118 [](default_compact_writer& writer,
4119 const generic_record::generic_record& record,
4120 const std::string& field) {
4121 writer.write_array_of_int64(field,
4122 record.get_array_of_int64(field));
4124 [](compact::compact_reader& reader,
4125 generic_record::generic_record_builder& builder,
4126 const std::string& field) {
4127 builder.set_array_of_int64(field,
4128 reader.read_array_of_int64(field));
4131 const generic_record::generic_record& record,
4132 const std::string& field_name) {
4133 const auto& values = record.get_array_of_int64(field_name);
4136 parent.put(field_name, NULL_STRING);
4140 for (
auto value : *values) {
4142 std::make_pair(
"", ptree(std::to_string(value))));
4145 parent.put_child(field_name, array);
4148 field_kind_based_operations{
4150 [] {
return Bits::FLOAT_SIZE_IN_BYTES; },
4151 [](default_compact_writer& writer,
4152 const generic_record::generic_record& record,
4153 const std::string& field) {
4154 writer.write_float32(field, record.get_float32(field));
4156 [](compact::compact_reader& reader,
4157 generic_record::generic_record_builder& builder,
4158 const std::string& field) {
4159 builder.set_float32(field, reader.read_float32(field));
4161 [](boost::property_tree::ptree& parent,
4162 const generic_record::generic_record& record,
4163 const std::string& field_name) {
4164 parent.put(field_name, record.get_float32(field_name));
4166 field_kind_based_operations{
4168 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4169 [](default_compact_writer& writer,
4170 const generic_record::generic_record& record,
4171 const std::string& field) {
4172 writer.write_array_of_float32(field,
4173 record.get_array_of_float32(field));
4175 [](compact::compact_reader& reader,
4176 generic_record::generic_record_builder& builder,
4177 const std::string& field) {
4178 builder.set_array_of_float32(field,
4179 reader.read_array_of_float32(field));
4182 const generic_record::generic_record& record,
4183 const std::string& field_name) {
4184 const auto& values = record.get_array_of_float32(field_name);
4187 parent.put(field_name, NULL_STRING);
4191 for (
auto value : *values) {
4193 std::make_pair(
"", ptree(std::to_string(value))));
4196 parent.put_child(field_name, array);
4199 field_kind_based_operations{
4201 [] {
return Bits::DOUBLE_SIZE_IN_BYTES; },
4202 [](default_compact_writer& writer,
4203 const generic_record::generic_record& record,
4204 const std::string& field) {
4205 writer.write_float64(field, record.get_float64(field));
4207 [](compact::compact_reader& reader,
4208 generic_record::generic_record_builder& builder,
4209 const std::string& field) {
4210 builder.set_float64(field, reader.read_float64(field));
4212 [](boost::property_tree::ptree& parent,
4213 const generic_record::generic_record& record,
4214 const std::string& field_name) {
4215 parent.put(field_name, record.get_float64(field_name));
4217 field_kind_based_operations{
4219 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4220 [](default_compact_writer& writer,
4221 const generic_record::generic_record& record,
4222 const std::string& field) {
4223 writer.write_array_of_float64(field,
4224 record.get_array_of_float64(field));
4226 [](compact::compact_reader& reader,
4227 generic_record::generic_record_builder& builder,
4228 const std::string& field) {
4229 builder.set_array_of_float64(field,
4230 reader.read_array_of_float64(field));
4233 const generic_record::generic_record& record,
4234 const std::string& field_name) {
4235 const auto& values = record.get_array_of_float64(field_name);
4238 parent.put(field_name, NULL_STRING);
4242 for (
auto value : *values) {
4244 std::make_pair(
"", ptree(std::to_string(value))));
4247 parent.put_child(field_name, array);
4250 field_kind_based_operations{
4252 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4253 [](default_compact_writer& writer,
4254 const generic_record::generic_record& record,
4255 const std::string& field) {
4256 writer.write_string(field, record.get_string(field));
4258 [](compact::compact_reader& reader,
4259 generic_record::generic_record_builder& builder,
4260 const std::string& field) {
4261 builder.set_string(field, reader.read_string(field));
4263 [](boost::property_tree::ptree& parent,
4264 const generic_record::generic_record& record,
4265 const std::string& field_name) {
4266 const auto& value = record.get_string(field_name);
4269 parent.put(field_name, NULL_STRING);
4271 parent.put(field_name, *value);
4274 field_kind_based_operations{
4276 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4277 [](default_compact_writer& writer,
4278 const generic_record::generic_record& record,
4279 const std::string& field) {
4280 writer.write_array_of_string(field,
4281 record.get_array_of_string(field));
4283 [](compact::compact_reader& reader,
4284 generic_record::generic_record_builder& builder,
4285 const std::string& field) {
4286 builder.set_array_of_string(field,
4287 reader.read_array_of_string(field));
4290 const generic_record::generic_record& record,
4291 const std::string& field_name) {
4292 const auto& values = record.get_array_of_string(field_name);
4295 parent.put(field_name, NULL_STRING);
4299 for (
const auto& value : *values) {
4302 std::make_pair(
"", ptree(NULL_STRING)));
4304 array.push_back(std::make_pair(
"", ptree(*value)));
4308 parent.put_child(field_name, array);
4311 field_kind_based_operations{
4313 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4314 [](default_compact_writer& writer,
4315 const generic_record::generic_record& record,
4316 const std::string& field) {
4317 writer.write_decimal(field, record.get_decimal(field));
4319 [](compact::compact_reader& reader,
4320 generic_record::generic_record_builder& builder,
4321 const std::string& field) {
4322 builder.set_decimal(field, reader.read_decimal(field));
4324 [](boost::property_tree::ptree& parent,
4325 const generic_record::generic_record& record,
4326 const std::string& field_name) {
4327 const auto& value = record.get_decimal(field_name);
4330 parent.put(field_name, NULL_STRING);
4332 parent.put(field_name,
4333 value->unscaled.str() +
"E" +
4334 std::to_string(value->scale));
4337 field_kind_based_operations{
4339 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4340 [](default_compact_writer& writer,
4341 const generic_record::generic_record& record,
4342 const std::string& field) {
4343 writer.write_array_of_decimal(field,
4344 record.get_array_of_decimal(field));
4346 [](compact::compact_reader& reader,
4347 generic_record::generic_record_builder& builder,
4348 const std::string& field) {
4349 builder.set_array_of_decimal(field,
4350 reader.read_array_of_decimal(field));
4353 const generic_record::generic_record& record,
4354 const std::string& field_name) {
4355 const auto& values = record.get_array_of_decimal(field_name);
4358 parent.put(field_name, NULL_STRING);
4362 for (
const auto& value : *values) {
4365 std::make_pair(
"", ptree(NULL_STRING)));
4367 array.push_back(std::make_pair(
4369 ptree(value->unscaled.str() +
"E" +
4370 std::to_string(value->scale))));
4374 parent.put_child(field_name, array);
4377 field_kind_based_operations{
4379 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4380 [](default_compact_writer& writer,
4381 const generic_record::generic_record& record,
4382 const std::string& field) {
4383 writer.write_time(field, record.get_time(field));
4385 [](compact::compact_reader& reader,
4386 generic_record::generic_record_builder& builder,
4387 const std::string& field) {
4388 builder.set_time(field, reader.read_time(field));
4390 [](boost::property_tree::ptree& parent,
4391 const generic_record::generic_record& record,
4392 const std::string& field_name) {
4393 const auto& value = record.get_time(field_name);
4396 parent.put(field_name, NULL_STRING);
4398 parent.put(field_name, time_to_string(*value));
4401 field_kind_based_operations{
4403 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4404 [](default_compact_writer& writer,
4405 const generic_record::generic_record& record,
4406 const std::string& field) {
4407 writer.write_array_of_time(field,
4408 record.get_array_of_time(field));
4410 [](compact::compact_reader& reader,
4411 generic_record::generic_record_builder& builder,
4412 const std::string& field) {
4413 builder.set_array_of_time(field,
4414 reader.read_array_of_time(field));
4417 const generic_record::generic_record& record,
4418 const std::string& field_name) {
4419 const auto& values = record.get_array_of_time(field_name);
4422 parent.put(field_name, NULL_STRING);
4426 for (
const auto& value : *values) {
4429 std::make_pair(
"", ptree(NULL_STRING)));
4432 std::make_pair(
"", ptree(time_to_string(*value))));
4436 parent.put_child(field_name, array);
4439 field_kind_based_operations{
4441 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4442 [](default_compact_writer& writer,
4443 const generic_record::generic_record& record,
4444 const std::string& field) {
4445 writer.write_date(field, record.get_date(field));
4447 [](compact::compact_reader& reader,
4448 generic_record::generic_record_builder& builder,
4449 const std::string& field) {
4450 builder.set_date(field, reader.read_date(field));
4452 [](boost::property_tree::ptree& parent,
4453 const generic_record::generic_record& record,
4454 const std::string& field_name) {
4455 const auto& value = record.get_date(field_name);
4458 parent.put(field_name, NULL_STRING);
4460 parent.put(field_name, date_to_string(*value));
4463 field_kind_based_operations{
4465 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4466 [](default_compact_writer& writer,
4467 const generic_record::generic_record& record,
4468 const std::string& field) {
4469 writer.write_array_of_date(field,
4470 record.get_array_of_date(field));
4472 [](compact::compact_reader& reader,
4473 generic_record::generic_record_builder& builder,
4474 const std::string& field) {
4475 builder.set_array_of_date(field,
4476 reader.read_array_of_date(field));
4479 const generic_record::generic_record& record,
4480 const std::string& field_name) {
4481 const auto& values = record.get_array_of_date(field_name);
4484 parent.put(field_name, NULL_STRING);
4488 for (
const auto& value : *values) {
4491 std::make_pair(
"", ptree(NULL_STRING)));
4494 std::make_pair(
"", ptree(date_to_string(*value))));
4498 parent.put_child(field_name, array);
4501 field_kind_based_operations{
4503 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4504 [](default_compact_writer& writer,
4505 const generic_record::generic_record& record,
4506 const std::string& field) {
4507 writer.write_timestamp(field, record.get_timestamp(field));
4509 [](compact::compact_reader& reader,
4510 generic_record::generic_record_builder& builder,
4511 const std::string& field) {
4512 builder.set_timestamp(field, reader.read_timestamp(field));
4514 [](boost::property_tree::ptree& parent,
4515 const generic_record::generic_record& record,
4516 const std::string& field_name) {
4517 const auto& value = record.get_timestamp(field_name);
4520 parent.put(field_name, NULL_STRING);
4522 parent.put(field_name, timestamp_to_string(*value));
4525 field_kind_based_operations{
4527 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4528 [](default_compact_writer& writer,
4529 const generic_record::generic_record& record,
4530 const std::string& field) {
4531 writer.write_array_of_timestamp(
4532 field, record.get_array_of_timestamp(field));
4534 [](compact::compact_reader& reader,
4535 generic_record::generic_record_builder& builder,
4536 const std::string& field) {
4537 builder.set_array_of_timestamp(
4538 field, reader.read_array_of_timestamp(field));
4541 const generic_record::generic_record& record,
4542 const std::string& field_name) {
4543 const auto& values = record.get_array_of_timestamp(field_name);
4546 parent.put(field_name, NULL_STRING);
4550 for (
const auto& value : *values) {
4553 std::make_pair(
"", ptree(NULL_STRING)));
4555 array.push_back(std::make_pair(
4556 "", ptree(timestamp_to_string(*value))));
4560 parent.put_child(field_name, array);
4563 field_kind_based_operations{
4565 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4566 [](default_compact_writer& writer,
4567 const generic_record::generic_record& record,
4568 const std::string& field) {
4569 writer.write_timestamp_with_timezone(
4570 field, record.get_timestamp_with_timezone(field));
4572 [](compact::compact_reader& reader,
4573 generic_record::generic_record_builder& builder,
4574 const std::string& field) {
4575 builder.set_timestamp_with_timezone(
4576 field, reader.read_timestamp_with_timezone(field));
4578 [](boost::property_tree::ptree& parent,
4579 const generic_record::generic_record& record,
4580 const std::string& field_name) {
4582 record.get_timestamp_with_timezone(field_name);
4585 parent.put(field_name, NULL_STRING);
4587 parent.put(field_name,
4588 timestamp_with_timezone_to_string(*value));
4591 field_kind_based_operations{
4593 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4594 [](default_compact_writer& writer,
4595 const generic_record::generic_record& record,
4596 const std::string& field) {
4597 writer.write_array_of_timestamp_with_timezone(
4598 field, record.get_array_of_timestamp_with_timezone(field));
4600 [](compact::compact_reader& reader,
4601 generic_record::generic_record_builder& builder,
4602 const std::string& field) {
4603 builder.set_array_of_timestamp_with_timezone(
4604 field, reader.read_array_of_timestamp_with_timezone(field));
4607 const generic_record::generic_record& record,
4608 const std::string& field_name) {
4609 const auto& values =
4610 record.get_array_of_timestamp_with_timezone(field_name);
4613 parent.put(field_name, NULL_STRING);
4617 for (
const auto& value : *values) {
4620 std::make_pair(
"", ptree(NULL_STRING)));
4622 array.push_back(std::make_pair(
4624 ptree(timestamp_with_timezone_to_string(*value))));
4628 parent.put_child(field_name, array);
4631 field_kind_based_operations{
4633 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4634 [](default_compact_writer& writer,
4635 const generic_record::generic_record& record,
4636 const std::string& field) {
4637 writer.write_compact(field, record.get_generic_record(field));
4639 [](compact::compact_reader& reader,
4640 generic_record::generic_record_builder& builder,
4641 const std::string& field) {
4642 builder.set_generic_record(
4644 reader.read_compact<generic_record::generic_record>(field));
4646 [](boost::property_tree::ptree& parent,
4647 const generic_record::generic_record& record,
4648 const std::string& field_name) {
4649 const auto& value = record.get_generic_record(field_name);
4652 parent.put(field_name, NULL_STRING);
4654 parent.put_child(field_name, write_generic_record(*value));
4657 field_kind_based_operations{
4659 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4660 [](default_compact_writer& writer,
4661 const generic_record::generic_record& record,
4662 const std::string& field) {
4663 writer.write_array_of_compact(
4664 field, record.get_array_of_generic_record(field));
4666 [](compact::compact_reader& reader,
4667 generic_record::generic_record_builder& builder,
4668 const std::string& field) {
4669 builder.set_array_of_generic_record(
4671 reader.read_array_of_compact<generic_record::generic_record>(
4675 const generic_record::generic_record& record,
4676 const std::string& field_name) {
4677 const auto& values =
4678 record.get_array_of_generic_record(field_name);
4681 parent.put(field_name, NULL_STRING);
4685 for (
const auto& value : *values) {
4688 std::make_pair(
"", ptree(NULL_STRING)));
4691 std::make_pair(
"", write_generic_record(*value)));
4695 parent.put_child(field_name, array);
4698 field_kind_based_operations{},
4699 field_kind_based_operations{},
4700 field_kind_based_operations{
4702 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4703 [](default_compact_writer& writer,
4704 const generic_record::generic_record& record,
4705 const std::string& field) {
4706 writer.write_nullable_boolean(field,
4707 record.get_nullable_boolean(field));
4709 [](compact::compact_reader& reader,
4710 generic_record::generic_record_builder& builder,
4711 const std::string& field) {
4712 builder.set_nullable_boolean(field,
4713 reader.read_nullable_boolean(field));
4715 [](boost::property_tree::ptree& parent,
4716 const generic_record::generic_record& record,
4717 const std::string& field_name) {
4718 const auto& value = record.get_nullable_boolean(field_name);
4721 parent.put(field_name, NULL_STRING);
4723 parent.put(field_name, *value);
4726 field_kind_based_operations{
4728 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4729 [](default_compact_writer& writer,
4730 const generic_record::generic_record& record,
4731 const std::string& field) {
4732 writer.write_array_of_nullable_boolean(
4733 field, record.get_array_of_nullable_boolean(field));
4735 [](compact::compact_reader& reader,
4736 generic_record::generic_record_builder& builder,
4737 const std::string& field) {
4738 builder.set_array_of_nullable_boolean(
4739 field, reader.read_array_of_nullable_boolean(field));
4742 const generic_record::generic_record& record,
4743 const std::string& field_name) {
4744 const auto& values =
4745 record.get_array_of_nullable_boolean(field_name);
4748 parent.put(field_name, NULL_STRING);
4752 for (
const auto& value : *values) {
4755 std::make_pair(
"", ptree(NULL_STRING)));
4758 std::make_pair(
"", ptree(BOOL_STRING[*value])));
4762 parent.put_child(field_name, array);
4765 field_kind_based_operations{
4767 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4768 [](default_compact_writer& writer,
4769 const generic_record::generic_record& record,
4770 const std::string& field) {
4771 writer.write_nullable_int8(field,
4772 record.get_nullable_int8(field));
4774 [](compact::compact_reader& reader,
4775 generic_record::generic_record_builder& builder,
4776 const std::string& field) {
4777 builder.set_nullable_int8(field,
4778 reader.read_nullable_int8(field));
4780 [](boost::property_tree::ptree& parent,
4781 const generic_record::generic_record& record,
4782 const std::string& field_name) {
4783 const auto& value = record.get_nullable_int8(field_name);
4786 parent.put(field_name, NULL_STRING);
4788 parent.put(field_name, std::to_string(*value));
4791 field_kind_based_operations{
4793 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4794 [](default_compact_writer& writer,
4795 const generic_record::generic_record& record,
4796 const std::string& field) {
4797 writer.write_array_of_nullable_int8(
4798 field, record.get_array_of_nullable_int8(field));
4800 [](compact::compact_reader& reader,
4801 generic_record::generic_record_builder& builder,
4802 const std::string& field) {
4803 builder.set_array_of_nullable_int8(
4804 field, reader.read_array_of_nullable_int8(field));
4807 const generic_record::generic_record& record,
4808 const std::string& field_name) {
4809 const auto& values =
4810 record.get_array_of_nullable_int8(field_name);
4813 parent.put(field_name, NULL_STRING);
4817 for (
const auto& value : *values) {
4820 std::make_pair(
"", ptree(NULL_STRING)));
4823 std::make_pair(
"", ptree(std::to_string(*value))));
4827 parent.put_child(field_name, array);
4830 field_kind_based_operations{
4832 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4833 [](default_compact_writer& writer,
4834 const generic_record::generic_record& record,
4835 const std::string& field) {
4836 writer.write_nullable_int16(field,
4837 record.get_nullable_int16(field));
4839 [](compact::compact_reader& reader,
4840 generic_record::generic_record_builder& builder,
4841 const std::string& field) {
4842 builder.set_nullable_int16(field,
4843 reader.read_nullable_int16(field));
4845 [](boost::property_tree::ptree& parent,
4846 const generic_record::generic_record& record,
4847 const std::string& field_name) {
4848 const auto& value = record.get_nullable_int16(field_name);
4851 parent.put(field_name, NULL_STRING);
4853 parent.put(field_name, std::to_string(*value));
4856 field_kind_based_operations{
4858 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4859 [](default_compact_writer& writer,
4860 const generic_record::generic_record& record,
4861 const std::string& field) {
4862 writer.write_array_of_nullable_int16(
4863 field, record.get_array_of_nullable_int16(field));
4865 [](compact::compact_reader& reader,
4866 generic_record::generic_record_builder& builder,
4867 const std::string& field) {
4868 builder.set_array_of_nullable_int16(
4869 field, reader.read_array_of_nullable_int16(field));
4872 const generic_record::generic_record& record,
4873 const std::string& field_name) {
4874 const auto& values =
4875 record.get_array_of_nullable_int16(field_name);
4878 parent.put(field_name, NULL_STRING);
4882 for (
const auto& value : *values) {
4885 std::make_pair(
"", ptree(NULL_STRING)));
4888 std::make_pair(
"", ptree(std::to_string(*value))));
4892 parent.put_child(field_name, array);
4895 field_kind_based_operations{
4897 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4898 [](default_compact_writer& writer,
4899 const generic_record::generic_record& record,
4900 const std::string& field) {
4901 writer.write_nullable_int32(field,
4902 record.get_nullable_int32(field));
4904 [](compact::compact_reader& reader,
4905 generic_record::generic_record_builder& builder,
4906 const std::string& field) {
4907 builder.set_nullable_int32(field,
4908 reader.read_nullable_int32(field));
4910 [](boost::property_tree::ptree& parent,
4911 const generic_record::generic_record& record,
4912 const std::string& field_name) {
4913 const auto& value = record.get_nullable_int32(field_name);
4916 parent.put(field_name, NULL_STRING);
4918 parent.put(field_name, std::to_string(*value));
4921 field_kind_based_operations{
4923 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4924 [](default_compact_writer& writer,
4925 const generic_record::generic_record& record,
4926 const std::string& field) {
4927 writer.write_array_of_nullable_int32(
4928 field, record.get_array_of_nullable_int32(field));
4930 [](compact::compact_reader& reader,
4931 generic_record::generic_record_builder& builder,
4932 const std::string& field) {
4933 builder.set_array_of_nullable_int32(
4934 field, reader.read_array_of_nullable_int32(field));
4937 const generic_record::generic_record& record,
4938 const std::string& field_name) {
4939 const auto& values =
4940 record.get_array_of_nullable_int32(field_name);
4943 parent.put(field_name, NULL_STRING);
4947 for (
const auto& value : *values) {
4950 std::make_pair(
"", ptree(NULL_STRING)));
4953 std::make_pair(
"", ptree(std::to_string(*value))));
4957 parent.put_child(field_name, array);
4960 field_kind_based_operations{
4962 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4963 [](default_compact_writer& writer,
4964 const generic_record::generic_record& record,
4965 const std::string& field) {
4966 writer.write_nullable_int64(field,
4967 record.get_nullable_int64(field));
4969 [](compact::compact_reader& reader,
4970 generic_record::generic_record_builder& builder,
4971 const std::string& field) {
4972 builder.set_nullable_int64(field,
4973 reader.read_nullable_int64(field));
4975 [](boost::property_tree::ptree& parent,
4976 const generic_record::generic_record& record,
4977 const std::string& field_name) {
4978 const auto& value = record.get_nullable_int64(field_name);
4981 parent.put(field_name, NULL_STRING);
4983 parent.put(field_name, std::to_string(*value));
4986 field_kind_based_operations{
4988 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
4989 [](default_compact_writer& writer,
4990 const generic_record::generic_record& record,
4991 const std::string& field) {
4992 writer.write_array_of_nullable_int64(
4993 field, record.get_array_of_nullable_int64(field));
4995 [](compact::compact_reader& reader,
4996 generic_record::generic_record_builder& builder,
4997 const std::string& field) {
4998 builder.set_array_of_nullable_int64(
4999 field, reader.read_array_of_nullable_int64(field));
5002 const generic_record::generic_record& record,
5003 const std::string& field_name) {
5004 const auto& values =
5005 record.get_array_of_nullable_int64(field_name);
5008 parent.put(field_name, NULL_STRING);
5012 for (
const auto& value : *values) {
5015 std::make_pair(
"", ptree(NULL_STRING)));
5018 std::make_pair(
"", ptree(std::to_string(*value))));
5022 parent.put_child(field_name, array);
5025 field_kind_based_operations{
5027 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
5028 [](default_compact_writer& writer,
5029 const generic_record::generic_record& record,
5030 const std::string& field) {
5031 writer.write_nullable_float32(field,
5032 record.get_nullable_float32(field));
5034 [](compact::compact_reader& reader,
5035 generic_record::generic_record_builder& builder,
5036 const std::string& field) {
5037 builder.set_nullable_float32(field,
5038 reader.read_nullable_float32(field));
5040 [](boost::property_tree::ptree& parent,
5041 const generic_record::generic_record& record,
5042 const std::string& field_name) {
5043 const auto& value = record.get_nullable_float32(field_name);
5046 parent.put(field_name, NULL_STRING);
5048 parent.put(field_name, std::to_string(*value));
5051 field_kind_based_operations{
5053 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
5054 [](default_compact_writer& writer,
5055 const generic_record::generic_record& record,
5056 const std::string& field) {
5057 writer.write_array_of_nullable_float32(
5058 field, record.get_array_of_nullable_float32(field));
5060 [](compact::compact_reader& reader,
5061 generic_record::generic_record_builder& builder,
5062 const std::string& field) {
5063 builder.set_array_of_nullable_float32(
5064 field, reader.read_array_of_nullable_float32(field));
5067 const generic_record::generic_record& record,
5068 const std::string& field_name) {
5069 const auto& values =
5070 record.get_array_of_nullable_float32(field_name);
5073 parent.put(field_name, NULL_STRING);
5077 for (
const auto& value : *values) {
5080 std::make_pair(
"", ptree(NULL_STRING)));
5083 std::make_pair(
"", ptree(std::to_string(*value))));
5087 parent.put_child(field_name, array);
5090 field_kind_based_operations{
5092 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
5093 [](default_compact_writer& writer,
5094 const generic_record::generic_record& record,
5095 const std::string& field) {
5096 writer.write_nullable_float64(field,
5097 record.get_nullable_float64(field));
5099 [](compact::compact_reader& reader,
5100 generic_record::generic_record_builder& builder,
5101 const std::string& field) {
5102 builder.set_nullable_float64(field,
5103 reader.read_nullable_float64(field));
5105 [](boost::property_tree::ptree& parent,
5106 const generic_record::generic_record& record,
5107 const std::string& field_name) {
5108 const auto& value = record.get_nullable_float64(field_name);
5111 parent.put(field_name, NULL_STRING);
5113 parent.put(field_name, std::to_string(*value));
5116 field_kind_based_operations{
5118 [] {
return field_kind_based_operations::VARIABLE_SIZE; },
5119 [](default_compact_writer& writer,
5120 const generic_record::generic_record& record,
5121 const std::string& field) {
5122 writer.write_array_of_nullable_float64(
5123 field, record.get_array_of_nullable_float64(field));
5125 [](compact::compact_reader& reader,
5126 generic_record::generic_record_builder& builder,
5127 const std::string& field) {
5128 builder.set_array_of_nullable_float64(
5129 field, reader.read_array_of_nullable_float64(field));
5132 const generic_record::generic_record& record,
5133 const std::string& field_name) {
5134 const auto& values =
5135 record.get_array_of_nullable_float64(field_name);
5138 parent.put(field_name, NULL_STRING);
5142 for (
const auto& value : *values) {
5145 std::make_pair(
"", ptree(NULL_STRING)));
5148 std::make_pair(
"", ptree(std::to_string(*value))));
5152 parent.put_child(field_name, array);
5157 return ALL[std::size_t(kind)];
Concrete class for creating generic_record instances.
generic_record_builder & set_array_of_int8(std::string field_name, boost::optional< std::vector< int8_t > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_time(std::string field_name, boost::optional< local_time > value)
Sets a time field consisting of hour, minute, seconds, and nanos parts.
generic_record_builder & set_timestamp(std::string field_name, boost::optional< local_date_time > value)
Sets a timestamp field consisting of year, month of the year, and day of the month,...
generic_record_builder & set_generic_record(std::string field_name, boost::optional< generic_record > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_boolean(std::string field_name, boost::optional< std::vector< bool > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_string(std::string field_name, boost::optional< std::vector< boost::optional< std::string > > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_nullable_int64(std::string field_name, boost::optional< std::vector< boost::optional< int64_t > > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_nullable_float64(std::string field_name, boost::optional< std::vector< boost::optional< double > > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_nullable_boolean(std::string field_name, boost::optional< std::vector< boost::optional< bool > > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_int64(std::string field_name, int64_t value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_int8(std::string field_name, int8_t value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_decimal(std::string field_name, boost::optional< std::vector< boost::optional< big_decimal > > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_decimal(std::string field_name, boost::optional< big_decimal > value)
Sets a decimal which is arbitrary precision and scale floating-point number.
generic_record_builder & set_array_of_nullable_int8(std::string field_name, boost::optional< std::vector< boost::optional< int8_t > > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_nullable_int8(std::string field_name, boost::optional< int8_t > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_int16(std::string field_name, int16_t value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_nullable_int32(std::string field_name, boost::optional< std::vector< boost::optional< int32_t > > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_nullable_float32(std::string field_name, boost::optional< float > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_nullable_int16(std::string field_name, boost::optional< std::vector< boost::optional< int16_t > > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_nullable_float32(std::string field_name, boost::optional< std::vector< boost::optional< float > > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_float64(std::string field_name, boost::optional< std::vector< double > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_int64(std::string field_name, boost::optional< std::vector< int64_t > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_timestamp_with_timezone(std::string field_name, boost::optional< std::vector< boost::optional< offset_date_time > > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_nullable_int64(std::string field_name, boost::optional< int64_t > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_nullable_boolean(std::string field_name, boost::optional< bool > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_float32(std::string field_name, float value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_date(std::string field_name, boost::optional< std::vector< boost::optional< local_date > > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_timestamp_with_timezone(std::string field_name, boost::optional< offset_date_time > value)
Sets a timestamp with timezone field consisting of year, month of the year and day of the month,...
generic_record_builder & set_nullable_float64(std::string field_name, boost::optional< double > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_int16(std::string field_name, boost::optional< std::vector< int16_t > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_boolean(std::string field_name, bool value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_float32(std::string field_name, boost::optional< std::vector< float > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_date(std::string field_name, boost::optional< local_date > value)
Sets a date field consisting of year, month of the year, and day of the month.
generic_record_builder & set_array_of_int32(std::string field_name, boost::optional< std::vector< int32_t > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_time(std::string field_name, boost::optional< std::vector< boost::optional< local_time > > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_float64(std::string field_name, double value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_int32(std::string field_name, int32_t value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder(std::string type_name)
Creates a Builder that will build a generic_record in Compact format with the given type name and sch...
generic_record_builder & set_string(std::string field_name, boost::optional< std::string > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_nullable_int32(std::string field_name, boost::optional< int32_t > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_nullable_int16(std::string field_name, boost::optional< int16_t > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_timestamp(std::string field_name, boost::optional< std::vector< boost::optional< local_date_time > > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
generic_record_builder & set_array_of_generic_record(std::string field_name, boost::optional< std::vector< boost::optional< generic_record > > > value)
It is legal to set the field again only when Builder is created with generic_record::new_builder_with...
A generic object interface that is returned to the user when the domain class can not be created from...
int64_t get_int64(const std::string &field_name) const
boost::optional< int8_t > get_nullable_int8(const std::string &field_name) const
Supported only for Compact.
boost::optional< float > get_nullable_float32(const std::string &field_name) const
Supported only for Compact.
boost::optional< double > get_nullable_float64(const std::string &field_name) const
Supported only for Compact.
const boost::optional< std::vector< boost::optional< float > > > & get_array_of_nullable_float32(const std::string &field_name) const
Supported only for Compact.
const boost::optional< generic_record > & get_generic_record(const std::string &field_name) const
const boost::optional< std::vector< boost::optional< int64_t > > > & get_array_of_nullable_int64(const std::string &field_name) const
Supported only for Compact.
double get_float64(const std::string &field_name) const
int16_t get_int16(const std::string &field_name) const
const boost::optional< std::vector< int64_t > > & get_array_of_int64(const std::string &field_name) const
generic_record_builder new_builder() const
Creates a generic_record_builder allows to create a new object.
const boost::optional< std::vector< boost::optional< generic_record > > > & get_array_of_generic_record(const std::string &field_name) const
const boost::optional< std::vector< boost::optional< local_date > > > & get_array_of_date(const std::string &field_name) const
const boost::optional< offset_date_time > & get_timestamp_with_timezone(const std::string &field_name) const
bool get_boolean(const std::string &field_name) const
boost::optional< int64_t > get_nullable_int64(const std::string &field_name) const
Supported only for Compact.
const boost::optional< local_date_time > & get_timestamp(const std::string &field_name) const
bool has_field(std::string field_name) const
const boost::optional< std::vector< double > > & get_array_of_float64(const std::string &field_name) const
int8_t get_int8(const std::string &field_name) const
generic_record_builder new_builder_with_clone() const
Returned generic_record_builder can be used to have exact copy and also just to update a couple of fi...
const boost::optional< std::vector< boost::optional< local_date_time > > > & get_array_of_timestamp(const std::string &field_name) const
const boost::optional< std::string > & get_string(const std::string &field_name) const
const boost::optional< std::vector< boost::optional< int8_t > > > & get_array_of_nullable_int8(const std::string &field_name) const
Supported only for Compact.
const boost::optional< std::vector< bool > > & get_array_of_boolean(const std::string &field_name) const
const boost::optional< std::vector< int16_t > > & get_array_of_int16(const std::string &field_name) const
const boost::optional< std::vector< boost::optional< double > > > & get_array_of_nullable_float64(const std::string &field_name) const
Supported only for Compact.
int32_t get_int32(const std::string &field_name) const
float get_float32(const std::string &field_name) const
const boost::optional< local_date > & get_date(const std::string &field_name) const
std::unordered_set< std::string > get_field_names() const
const boost::optional< std::vector< boost::optional< int32_t > > > & get_array_of_nullable_int32(const std::string &field_name) const
Supported only for Compact.
boost::optional< int16_t > get_nullable_int16(const std::string &field_name) const
Supported only for Compact.
const boost::optional< big_decimal > & get_decimal(const std::string &field_name) const
boost::optional< bool > get_nullable_boolean(const std::string &field_name) const
Supported only for Compact.
field_kind get_field_kind(const std::string &field_name) const
Returns the kind of the field for the given field name.
const boost::optional< std::vector< boost::optional< std::string > > > & get_array_of_string(const std::string &field_name) const
const boost::optional< std::vector< boost::optional< big_decimal > > > & get_array_of_decimal(const std::string &field_name) const
const boost::optional< std::vector< boost::optional< int16_t > > > & get_array_of_nullable_int16(const std::string &field_name) const
Supported only for Compact.
const boost::optional< std::vector< boost::optional< offset_date_time > > > & get_array_of_timestamp_with_timezone(const std::string &field_name) const
const boost::optional< std::vector< float > > & get_array_of_float32(const std::string &field_name) const
const boost::optional< std::vector< int32_t > > & get_array_of_int32(const std::string &field_name) const
const boost::optional< std::vector< boost::optional< local_time > > > & get_array_of_time(const std::string &field_name) const
const boost::optional< local_time > & get_time(const std::string &field_name) const
const boost::optional< std::vector< boost::optional< bool > > > & get_array_of_nullable_boolean(const std::string &field_name) const
Supported only for Compact.
boost::optional< int32_t > get_nullable_int32(const std::string &field_name) const
Supported only for Compact.
const boost::optional< std::vector< int8_t > > & get_array_of_int8(const std::string &field_name) const