22
33#include < ydb/core/tablet_flat/flat_database.h>
44#include < ydb/core/util/tuples.h>
5- #include < ydb/core/util/templates.h>
65#include < ydb/core/base/blobstorage_common.h>
76
87#include < util/system/type_name.h>
98#include < util/system/unaligned_mem.h>
109#include < library/cpp/containers/stack_vector/stack_vec.h>
10+ #include < type_traits>
1111#include < utility>
1212
1313// https://wiki.yandex-team.ru/kikimr/techdoc/db/cxxapi/nicedb/
@@ -647,6 +647,18 @@ enum class EMaterializationMode {
647647 NonExisting,
648648};
649649
650+ namespace NDetail {
651+ template <typename T>
652+ class HasDefault
653+ {
654+ private:
655+ template <typename C> static std::true_type test (decltype (C::Default)) ;
656+ template <typename C> static std::false_type test (...);
657+ public:
658+ static constexpr bool value = decltype (test<T>(0 ))::value;
659+ };
660+ }
661+
650662struct Schema {
651663 template <typename T>
652664 struct Precharger {
@@ -1437,7 +1449,7 @@ struct Schema {
14371449 }
14381450
14391451 template <typename ColumnType>
1440- auto GetValueOrDefault (typename ColumnType::Type defaultValue = GetDefaultValue<ColumnType>(SFINAE::special() )) const {
1452+ auto GetValueOrDefault (typename ColumnType::Type defaultValue = GetDefaultValue<ColumnType>()) const {
14411453 Y_DEBUG_ABORT_UNLESS (IsReady (), " Rowset is not ready" );
14421454 Y_DEBUG_ABORT_UNLESS (IsValid (), " Rowset is not valid" );
14431455 typename ColumnType::Type value (HaveValue<ColumnType>() ? GetColumnValue<ColumnType>() : defaultValue);
@@ -1462,24 +1474,19 @@ struct Schema {
14621474 return DbgPrintTuple (Iterator.GetKey (), typeRegistry) + " -> " + DbgPrintTuple (Iterator.GetValues (), typeRegistry);
14631475 }
14641476
1465- template <typename ColumnType, typename SFINAE::type_check<decltype (ColumnType::Default)>::type = 0 >
1466- static decltype (ColumnType::Default) GetNullValue(SFINAE::special) {
1467- return ColumnType::Default;
1468- }
1469-
14701477 template <typename ColumnType>
1471- static typename ColumnType::Type GetNullValue (SFINAE::general) {
1472- return typename ColumnType::Type ();
1473- }
1474-
1475- template <typename ColumnType, typename SFINAE::type_check<decltype (ColumnType::Default)>::type = 0 >
1476- static decltype (ColumnType::Default) GetDefaultValue(SFINAE::special) {
1477- return ColumnType::Default;
1478+ static typename ColumnType::Type GetNullValue () {
1479+ return GetDefaultValue<ColumnType>();
14781480 }
14791481
14801482 template <typename ColumnType>
1481- static typename ColumnType::Type GetDefaultValue (SFINAE::general) {
1482- return typename ColumnType::Type ();
1483+ static typename ColumnType::Type GetDefaultValue () {
1484+ if constexpr (NDetail::HasDefault<ColumnType>::value) {
1485+ return ColumnType::Default;
1486+ }
1487+ else {
1488+ return typename ColumnType::Type ();
1489+ }
14831490 }
14841491
14851492 NTable::TIteratorStats* Stats () const {
@@ -1499,7 +1506,7 @@ struct Schema {
14991506 auto & cell = tuple.Columns [index];
15001507 auto type = tuple.Types [index];
15011508 if (cell.IsNull ())
1502- return GetNullValue<ColumnType>(SFINAE::special () );
1509+ return GetNullValue<ColumnType>();
15031510 return TConvert<ColumnType, typename ColumnType::Type>::Convert (TRawTypeValue (cell.Data (), cell.Size (), type));
15041511 }
15051512
0 commit comments