@@ -320,11 +320,18 @@ TDecimalLogicalType::TDecimalLogicalType(int precision, int scale)
320
320
, Scale_(scale)
321
321
{ }
322
322
323
- size_t TDecimalLogicalType::GetMemoryUsage () const
323
+ i64 TDecimalLogicalType::GetMemoryUsage () const
324
324
{
325
325
return sizeof (*this );
326
326
}
327
327
328
+ i64 TDecimalLogicalType::GetMemoryUsage (i64 limit) const
329
+ {
330
+ YT_ASSERT (limit > 0 );
331
+
332
+ return sizeof (*this );
333
+ }
334
+
328
335
int TDecimalLogicalType::GetTypeComplexity () const
329
336
{
330
337
return 1 ;
@@ -372,7 +379,7 @@ std::optional<ESimpleLogicalValueType> TOptionalLogicalType::Simplify() const
372
379
}
373
380
}
374
381
375
- size_t TOptionalLogicalType::GetMemoryUsage () const
382
+ i64 TOptionalLogicalType::GetMemoryUsage () const
376
383
{
377
384
if (Element_->GetMetatype () == ELogicalMetatype::Simple) {
378
385
// All optionals of simple logical types are singletons and therefore we assume they use no space.
@@ -382,6 +389,20 @@ size_t TOptionalLogicalType::GetMemoryUsage() const
382
389
}
383
390
}
384
391
392
+ i64 TOptionalLogicalType::GetMemoryUsage (i64 limit) const
393
+ {
394
+ YT_ASSERT (limit > 0 );
395
+
396
+ if (Element_->GetMetatype () == ELogicalMetatype::Simple) {
397
+ // NB: see TOptionalLogicalType::GetMemoryUsage().
398
+ return 0 ;
399
+ } else if (auto sizeOfThis = static_cast <i64 >(sizeof (*this )); sizeOfThis >= limit) {
400
+ return sizeof (*this );
401
+ } else {
402
+ return sizeOfThis + Element_->GetMemoryUsage (limit - sizeOfThis);
403
+ }
404
+ }
405
+
385
406
int TOptionalLogicalType::GetTypeComplexity () const
386
407
{
387
408
if (Element_->GetMetatype () == ELogicalMetatype::Simple) {
@@ -406,12 +427,19 @@ TSimpleLogicalType::TSimpleLogicalType(ESimpleLogicalValueType element)
406
427
, Element_(element)
407
428
{ }
408
429
409
- size_t TSimpleLogicalType::GetMemoryUsage () const
430
+ i64 TSimpleLogicalType::GetMemoryUsage () const
410
431
{
411
432
// All simple logical types are singletons and therefore we assume they use no space.
412
433
return 0 ;
413
434
}
414
435
436
+ i64 TSimpleLogicalType::GetMemoryUsage (i64 limit) const
437
+ {
438
+ YT_ASSERT (limit > 0 );
439
+
440
+ return 0 ;
441
+ }
442
+
415
443
int TSimpleLogicalType::GetTypeComplexity () const
416
444
{
417
445
return 1 ;
@@ -439,11 +467,22 @@ TListLogicalType::TListLogicalType(TLogicalTypePtr element)
439
467
, Element_(std::move(element))
440
468
{ }
441
469
442
- size_t TListLogicalType::GetMemoryUsage () const
470
+ i64 TListLogicalType::GetMemoryUsage () const
443
471
{
444
472
return sizeof (*this ) + Element_->GetMemoryUsage ();
445
473
}
446
474
475
+ i64 TListLogicalType::GetMemoryUsage (i64 limit) const
476
+ {
477
+ YT_ASSERT (limit > 0 );
478
+
479
+ if (auto sizeOfThis = static_cast <i64 >(sizeof (*this )); sizeOfThis >= limit) {
480
+ return sizeOfThis;
481
+ } else {
482
+ return sizeOfThis + Element_->GetMemoryUsage (limit - sizeOfThis);
483
+ }
484
+ }
485
+
447
486
int TListLogicalType::GetTypeComplexity () const
448
487
{
449
488
return 1 + Element_->GetTypeComplexity ();
@@ -678,14 +717,28 @@ TStructLogicalTypeBase::TStructLogicalTypeBase(ELogicalMetatype metatype, std::v
678
717
, Fields_(std::move(fields))
679
718
{ }
680
719
681
- size_t TStructLogicalTypeBase::GetMemoryUsage () const
720
+ i64 TStructLogicalTypeBase::GetMemoryUsage () const
682
721
{
683
- size_t result = sizeof (*this );
684
- result += sizeof (TStructField) * Fields_.size ();
722
+ auto usage = static_cast < i64 >( sizeof (*this ) );
723
+ usage += sizeof (TStructField) * Fields_.size ();
685
724
for (const auto & field : Fields_) {
686
- result += field.Type ->GetMemoryUsage ();
725
+ usage += field.Type ->GetMemoryUsage ();
687
726
}
688
- return result;
727
+ return usage;
728
+ }
729
+
730
+ i64 TStructLogicalTypeBase::GetMemoryUsage (i64 limit) const
731
+ {
732
+ YT_ASSERT (limit > 0 );
733
+
734
+ auto usage = static_cast <i64 >(sizeof (*this ) + sizeof (TStructField) * Fields_.size ());
735
+ for (const auto & field : Fields_) {
736
+ if (usage >= limit) {
737
+ return usage;
738
+ }
739
+ usage += field.Type ->GetMemoryUsage (limit - usage);
740
+ }
741
+ return usage;
689
742
}
690
743
691
744
int TStructLogicalTypeBase::GetTypeComplexity () const
@@ -736,14 +789,28 @@ TTupleLogicalTypeBase::TTupleLogicalTypeBase(ELogicalMetatype metatype, std::vec
736
789
, Elements_(std::move(elements))
737
790
{ }
738
791
739
- size_t TTupleLogicalTypeBase::GetMemoryUsage () const
792
+ i64 TTupleLogicalTypeBase::GetMemoryUsage () const
740
793
{
741
- size_t result = sizeof (*this );
742
- result += sizeof (TLogicalTypePtr) * Elements_.size ();
794
+ auto usage = static_cast < i64 >( sizeof (*this ) );
795
+ usage += sizeof (TLogicalTypePtr) * Elements_.size ();
743
796
for (const auto & element : Elements_) {
744
- result += element->GetMemoryUsage ();
797
+ usage += element->GetMemoryUsage ();
745
798
}
746
- return result;
799
+ return usage;
800
+ }
801
+
802
+ i64 TTupleLogicalTypeBase::GetMemoryUsage (i64 limit) const
803
+ {
804
+ YT_ASSERT (limit > 0 );
805
+
806
+ auto usage = static_cast <i64 >(sizeof (*this ) + sizeof (TLogicalTypePtr) * Elements_.size ());
807
+ for (const auto & element : Elements_) {
808
+ if (usage >= limit) {
809
+ return usage;
810
+ }
811
+ usage += element->GetMemoryUsage (limit - usage);
812
+ }
813
+ return usage;
747
814
}
748
815
749
816
int TTupleLogicalTypeBase::GetTypeComplexity () const
@@ -795,11 +862,27 @@ TDictLogicalType::TDictLogicalType(TLogicalTypePtr key, TLogicalTypePtr value)
795
862
, Value_(std::move(value))
796
863
{ }
797
864
798
- size_t TDictLogicalType::GetMemoryUsage () const
865
+ i64 TDictLogicalType::GetMemoryUsage () const
799
866
{
800
867
return sizeof (*this ) + Key_->GetMemoryUsage () + Value_->GetMemoryUsage ();
801
868
}
802
869
870
+ i64 TDictLogicalType::GetMemoryUsage (i64 limit) const
871
+ {
872
+ YT_ASSERT (limit > 0 );
873
+
874
+ auto usage = static_cast <i64 >(sizeof (*this ));
875
+ if (usage >= limit) {
876
+ return usage;
877
+ }
878
+ usage += Key_->GetMemoryUsage (limit - usage);
879
+ if (usage >= limit) {
880
+ return usage;
881
+ }
882
+ usage += Value_->GetMemoryUsage (limit - usage);
883
+ return usage;
884
+ }
885
+
803
886
int TDictLogicalType::GetTypeComplexity () const
804
887
{
805
888
return 1 + Key_->GetTypeComplexity () + Value_->GetTypeComplexity ();
@@ -877,11 +960,23 @@ TTaggedLogicalType::TTaggedLogicalType(TString tag, NYT::NTableClient::TLogicalT
877
960
, Element_(std::move(element))
878
961
{ }
879
962
880
- size_t TTaggedLogicalType::GetMemoryUsage () const
963
+ i64 TTaggedLogicalType::GetMemoryUsage () const
881
964
{
882
965
return sizeof (*this ) + GetElement ()->GetMemoryUsage ();
883
966
}
884
967
968
+ i64 TTaggedLogicalType::GetMemoryUsage (i64 limit) const
969
+ {
970
+ YT_ASSERT (limit > 0 );
971
+
972
+ auto usage = static_cast <i64 >(sizeof (*this ));
973
+ if (usage >= limit) {
974
+ return usage;
975
+ }
976
+ usage += GetElement ()->GetMemoryUsage (limit - usage);
977
+ return usage;
978
+ }
979
+
885
980
int TTaggedLogicalType::GetTypeComplexity () const
886
981
{
887
982
return 1 + GetElement ()->GetTypeComplexity ();
0 commit comments