59class HAZELCAST_API generic_record
134 bool has_field(std::string field_name)
const;
143 bool get_boolean(
const std::string& field_name)
const;
161 int8_t
get_int8(
const std::string& field_name)
const;
170 int8_t&
get_int8(
const std::string& field_name);
179 int16_t
get_int16(
const std::string& field_name)
const;
188 int16_t&
get_int16(
const std::string& field_name);
197 int32_t
get_int32(
const std::string& field_name)
const;
206 int32_t&
get_int32(
const std::string& field_name);
215 int64_t
get_int64(
const std::string& field_name)
const;
224 int64_t&
get_int64(
const std::string& field_name);
233 float get_float32(
const std::string& field_name)
const;
251 double get_float64(
const std::string& field_name)
const;
260 double&
get_float64(
const std::string& field_name);
269 const boost::optional<std::string>&
get_string(
270 const std::string& field_name)
const;
280 boost::optional<std::string>&
get_string(
const std::string& field_name);
291 const std::string& field_name)
const;
301 boost::optional<big_decimal>&
get_decimal(
const std::string& field_name);
311 const boost::optional<local_time>&
get_time(
312 const std::string& field_name)
const;
322 boost::optional<local_time>&
get_time(
const std::string& field_name);
332 const boost::optional<local_date>&
get_date(
333 const std::string& field_name)
const;
343 boost::optional<local_date>&
get_date(
const std::string& field_name);
354 const std::string& field_name)
const;
365 const std::string& field_name);
377 const std::string& field_name)
const;
389 const std::string& field_name);
399 const std::string& field_name)
const;
409 const std::string& field_name);
419 const std::string& field_name)
const;
429 const std::string& field_name);
439 const std::string& field_name)
const;
449 const std::string& field_name);
459 const std::string& field_name)
const;
469 const std::string& field_name);
479 const std::string& field_name)
const;
489 const std::string& field_name);
499 const std::string& field_name)
const;
509 const std::string& field_name);
519 const std::string& field_name)
const;
529 const std::string& field_name);
539 const std::string& field_name)
const;
549 const std::string& field_name);
558 const boost::optional<std::vector<boost::optional<std::string>>>&
568 boost::optional<std::vector<boost::optional<std::string>>>&
579 const boost::optional<std::vector<boost::optional<big_decimal>>>&
590 boost::optional<std::vector<boost::optional<big_decimal>>>&
601 const boost::optional<std::vector<boost::optional<local_time>>>&
612 boost::optional<std::vector<boost::optional<local_time>>>&
623 const boost::optional<std::vector<boost::optional<local_date>>>&
634 boost::optional<std::vector<boost::optional<local_date>>>&
645 const boost::optional<std::vector<boost::optional<local_date_time>>>&
656 boost::optional<std::vector<boost::optional<local_date_time>>>&
667 const boost::optional<std::vector<boost::optional<offset_date_time>>>&
678 boost::optional<std::vector<boost::optional<offset_date_time>>>&
688 const boost::optional<std::vector<boost::optional<generic_record>>>&
698 boost::optional<std::vector<boost::optional<generic_record>>>&
711 const std::string& field_name)
const;
734 const std::string& field_name)
const;
757 const std::string& field_name)
const;
780 const std::string& field_name)
const;
803 const std::string& field_name)
const;
826 const std::string& field_name)
const;
849 const std::string& field_name)
const;
861 const std::string& field_name);
872 const boost::optional<std::vector<boost::optional<bool>>>&
884 boost::optional<std::vector<boost::optional<bool>>>&
896 const boost::optional<std::vector<boost::optional<int8_t>>>&
908 boost::optional<std::vector<boost::optional<int8_t>>>&
920 const boost::optional<std::vector<boost::optional<int16_t>>>&
932 boost::optional<std::vector<boost::optional<int16_t>>>&
944 const boost::optional<std::vector<boost::optional<int32_t>>>&
956 boost::optional<std::vector<boost::optional<int32_t>>>&
968 const boost::optional<std::vector<boost::optional<int64_t>>>&
980 boost::optional<std::vector<boost::optional<int64_t>>>&
992 const boost::optional<std::vector<boost::optional<float>>>&
1004 boost::optional<std::vector<boost::optional<float>>>&
1016 const boost::optional<std::vector<boost::optional<double>>>&
1028 boost::optional<std::vector<boost::optional<double>>>&
1032 static constexpr const char* METHOD_PREFIX_FOR_ERROR_MESSAGES =
"get";
1034 friend class generic_record_builder;
1035 friend class pimpl::compact_stream_serializer;
1037 friend std::ostream HAZELCAST_API& operator<<(std::ostream& os,
1038 const generic_record&);
1039 friend bool HAZELCAST_API operator==(
const generic_record&,
1040 const generic_record&);
1041 friend bool HAZELCAST_API operator!=(
const generic_record&,
1042 const generic_record&);
1044 generic_record(std::shared_ptr<pimpl::schema>, std::unordered_map<std::string, boost::any>);
1046 const pimpl::schema& get_schema()
const;
1047 friend boost::property_tree::ptree write_generic_record(
1048 const generic_record&);
1050 template<
typename... Kinds>
1051 field_kind check(
const std::string& field_name, Kinds... kinds_ts)
const
1053 field_kind kinds[] = { kinds_ts... };
1054 boost::optional<pimpl::field_descriptor> desc =
1055 schema_->get_field(field_name);
1058 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization{
1059 boost::str(boost::format(
"Invalid field name : '%1%' for %2%") %
1060 field_name % schema_) });
1063 field_kind current_kind = desc->kind;
1065 for (field_kind kind : kinds) {
1066 valid |= current_kind == kind;
1070 std::vector<std::string> kinds_str;
1071 kinds_str.reserve(
sizeof...(Kinds));
1073 transform(std::begin(kinds),
1075 back_inserter(kinds_str),
1076 [](field_kind kind) {
1077 return boost::str(boost::format(
"%1%") % kind);
1080 BOOST_THROW_EXCEPTION(exception::hazelcast_serialization{
1081 boost::str(boost::format(
"Invalid field kind: '%1%' for %2%, "
1082 "valid field kinds : %3%, found : %4%") %
1083 field_name % schema_ %
1084 boost::algorithm::join(kinds_str,
",") %
1088 return current_kind;
1091 template<
typename T>
1092 const T& get(
const std::string& field_name, field_kind kind)
const
1094 check(field_name, kind);
1095 return boost::any_cast<const T&>(objects_.at(field_name));
1098 template<
typename T>
1099 T& get(
const std::string& field_name, field_kind kind)
1101 check(field_name, kind);
1102 return boost::any_cast<T&>(objects_.at(field_name));
1105 template<
typename T>
1106 const T& get_non_null(
const std::string& field_name,
1107 field_kind primitive_field_kind,
1108 field_kind nullable_field_kind,
1109 const std::string& method_suffix)
const
1112 check(field_name, primitive_field_kind, nullable_field_kind);
1114 if (kind == nullable_field_kind) {
1115 const auto& val_opt = boost::any_cast<const boost::optional<T>&>(
1116 objects_.at(field_name));
1119 BOOST_THROW_EXCEPTION(
1120 pimpl::compact_util::exception_for_unexpected_null_value(
1122 METHOD_PREFIX_FOR_ERROR_MESSAGES,
1129 return boost::any_cast<const T&>(objects_.at(field_name));
1132 template<
typename T>
1133 T& get_non_null(
const std::string& field_name,
1134 field_kind primitive_field_kind,
1135 field_kind nullable_field_kind,
1136 const std::string& method_suffix)
1138 return const_cast<T&
>(
1139 static_cast<const generic_record*
>(
this)->get_non_null<T>(
1141 primitive_field_kind,
1142 nullable_field_kind,
1146 template<
typename T>
1147 const boost::optional<std::vector<T>>& get_array_of_primitive(
1148 const std::string& field_name,
1149 field_kind primitive_field_kind,
1150 field_kind nullable_field_kind,
1151 const std::string& method_suffix)
const
1153 using optional_nullable_array_t =
1154 boost::optional<std::vector<boost::optional<T>>>;
1155 using optional_primitive_array_t = boost::optional<std::vector<T>>;
1156 using primitive_array_t = std::vector<T>;
1159 check(field_name, primitive_field_kind, nullable_field_kind);
1161 if (kind == nullable_field_kind) {
1162 auto primitive_array_itr = adopteds_.find(field_name);
1164 if (primitive_array_itr != end(adopteds_)) {
1165 return boost::any_cast<const optional_primitive_array_t&>(
1166 primitive_array_itr->second);
1169 const auto& optional_nullable_array =
1170 boost::any_cast<const optional_nullable_array_t&>(
1171 objects_.at(field_name));
1173 if (!optional_nullable_array) {
1174 (void)adopteds_.emplace(field_name,
1175 optional_primitive_array_t{});
1176 return boost::any_cast<const optional_primitive_array_t&>(
1177 adopteds_.at(field_name));
1180 const auto& array_of_nullable = optional_nullable_array.value();
1181 optional_primitive_array_t primitive_array{ primitive_array_t(
1182 array_of_nullable.size()) };
1184 for (std::size_t i = 0; i < array_of_nullable.size(); ++i) {
1185 if (!array_of_nullable[i]) {
1186 BOOST_THROW_EXCEPTION(
1187 pimpl::compact_util::
1188 exception_for_unexpected_null_value_in_array(
1190 METHOD_PREFIX_FOR_ERROR_MESSAGES,
1194 primitive_array.value()[i] = *array_of_nullable[i];
1197 (void)adopteds_.emplace(field_name, std::move(primitive_array));
1198 return boost::any_cast<const optional_primitive_array_t&>(
1199 adopteds_.at(field_name));
1202 return boost::any_cast<const optional_primitive_array_t&>(
1203 objects_.at(field_name));
1206 template<
typename T>
1207 boost::optional<std::vector<T>>& get_array_of_primitive(
1208 const std::string& field_name,
1209 field_kind primitive,
1210 field_kind nullable,
1211 const std::string& method_suffix)
1213 return const_cast<boost::optional<std::vector<T>
>&>(
1214 static_cast<const generic_record*
>(
this)->get_array_of_primitive<T>(
1215 field_name, primitive, nullable, method_suffix));
1218 template<
typename T>
1219 const boost::optional<std::vector<boost::optional<T>>>&
1220 get_array_of_nullable(
const std::string& field_name,
1221 field_kind primitive,
1222 field_kind nullable,
1223 const std::string& method_suffix)
const
1225 (void)method_suffix;
1226 using optional_nullable_array_t =
1227 boost::optional<std::vector<boost::optional<T>>>;
1228 using optional_primitive_array_t = boost::optional<std::vector<T>>;
1229 using optional_array_t = std::vector<boost::optional<T>>;
1231 auto kind = check(field_name, primitive, nullable);
1233 if (kind == primitive) {
1234 auto primitive_array_itr = adopteds_.find(field_name);
1236 if (primitive_array_itr != end(adopteds_)) {
1237 return boost::any_cast<const optional_nullable_array_t&>(
1238 primitive_array_itr->second);
1241 const auto& optional_primitive_array =
1242 boost::any_cast<const optional_primitive_array_t&>(
1243 objects_.at(field_name));
1245 if (!optional_primitive_array) {
1246 (void)adopteds_.emplace(field_name,
1247 optional_nullable_array_t{});
1248 return boost::any_cast<const optional_nullable_array_t&>(
1249 adopteds_.at(field_name));
1252 const auto& array_of_primitive = optional_primitive_array.value();
1253 optional_nullable_array_t array_of_nullable{ optional_array_t(
1254 array_of_primitive.size()) };
1256 for (std::size_t i = 0; i < array_of_primitive.size(); ++i) {
1257 array_of_nullable.value()[i] = array_of_primitive[i];
1260 (void)adopteds_.emplace(field_name, std::move(array_of_nullable));
1261 return boost::any_cast<const optional_nullable_array_t&>(
1262 adopteds_.at(field_name));
1265 return boost::any_cast<const optional_nullable_array_t&>(
1266 objects_.at(field_name));
1269 template<
typename T>
1270 boost::optional<std::vector<boost::optional<T>>>& get_array_of_nullable(
1271 const std::string& field_name,
1272 field_kind primitive,
1273 field_kind nullable,
1274 const std::string& method_suffix)
1276 return const_cast<boost::optional<std::vector<boost::optional<T>
>>&>(
1277 static_cast<const generic_record*
>(
this)->get_array_of_nullable<T>(
1278 field_name, primitive, nullable, method_suffix));
1281 std::shared_ptr<pimpl::schema> schema_;
1282 std::unordered_map<std::string, boost::any> objects_;
1292 mutable std::unordered_map<std::string, boost::any> adopteds_;