@@ -437,7 +437,7 @@ bool TYqlRowSpecInfo::ParseType(const NYT::TNode& rowSpecAttr, TExprContext& ctx
437
437
438
438
bool TYqlRowSpecInfo::ParseSort (const NYT::TNode& rowSpecAttr, TExprContext& ctx, const TPositionHandle& pos) {
439
439
if (rowSpecAttr.HasKey (RowSpecAttrSortMembers) || rowSpecAttr.HasKey (RowSpecAttrSortedBy) || rowSpecAttr.HasKey (RowSpecAttrSortDirections)) {
440
- ClearSortness ();
440
+ ClearSortness (ctx );
441
441
}
442
442
if (rowSpecAttr.HasKey (RowSpecAttrSortDirections)) {
443
443
for (auto & item: rowSpecAttr[RowSpecAttrSortDirections].AsList ()) {
@@ -559,7 +559,7 @@ void TYqlRowSpecInfo::ParseConstraints(const NYT::TNode& rowSpecAttr) {
559
559
560
560
bool TYqlRowSpecInfo::ValidateSort (const TYTSortInfo& sortInfo, TExprContext& ctx, const TPositionHandle& pos) {
561
561
if (sortInfo.Keys .empty () && IsSorted ()) {
562
- ClearSortness ();
562
+ ClearSortness (ctx );
563
563
if (!ctx.AddWarning (YqlIssue (ctx.GetPosition (pos), EYqlIssueCode::TIssuesIds_EIssueCode_YT_ROWSPEC_DIFF_SORT,
564
564
" Table attribute '_yql_row_spec' defines sorting, but the table is not really sorted. The sorting will be ignored." ))) {
565
565
return false ;
@@ -573,13 +573,13 @@ bool TYqlRowSpecInfo::ValidateSort(const TYTSortInfo& sortInfo, TExprContext& ct
573
573
} else if (IsSorted ()) {
574
574
bool diff = false ;
575
575
if (SortedBy.size () > sortInfo.Keys .size ()) {
576
- ClearSortness (sortInfo.Keys .size ());
576
+ ClearSortness (ctx, sortInfo.Keys .size ());
577
577
diff = true ;
578
578
}
579
579
auto backendSort = GetForeignSort ();
580
580
for (size_t i = 0 ; i < backendSort.size (); ++i) {
581
581
if (backendSort[i].first != sortInfo.Keys [i].first || backendSort[i].second != (bool )sortInfo.Keys [i].second ) {
582
- ClearSortness (i);
582
+ ClearSortness (ctx, i);
583
583
diff = true ;
584
584
break ;
585
585
}
@@ -1396,7 +1396,7 @@ const TStructExprType* TYqlRowSpecInfo::GetExtendedType(TExprContext& ctx) const
1396
1396
return extended ? ctx.MakeType <TStructExprType>(items) : Type;
1397
1397
}
1398
1398
1399
- bool TYqlRowSpecInfo::CopySortness (const TYqlRowSpecInfo& from, ECopySort mode) {
1399
+ bool TYqlRowSpecInfo::CopySortness (TExprContext& ctx, const TYqlRowSpecInfo& from, ECopySort mode) {
1400
1400
SortDirections = from.SortDirections ;
1401
1401
SortMembers = from.SortMembers ;
1402
1402
SortedBy = from.SortedBy ;
@@ -1408,16 +1408,16 @@ bool TYqlRowSpecInfo::CopySortness(const TYqlRowSpecInfo& from, ECopySort mode)
1408
1408
for (size_t i = 0 ; i < SortMembers.size (); ++i) {
1409
1409
const auto itemNdx = Type->FindItem (SortMembers[i]);
1410
1410
if (!itemNdx || (SortedBy[i] == SortMembers[i] && Type->GetItems ()[*itemNdx]->GetItemType () != SortedByTypes[i])) {
1411
- sortIsChanged = ClearSortness (i);
1411
+ sortIsChanged = ClearSortness (ctx, i);
1412
1412
break ;
1413
1413
} else if (ECopySort::Pure == mode && SortedBy[i] != SortMembers[i]) {
1414
- sortIsChanged = ClearSortness (i);
1414
+ sortIsChanged = ClearSortness (ctx, i);
1415
1415
break ;
1416
1416
}
1417
1417
}
1418
1418
if (ECopySort::WithCalc != mode) {
1419
1419
if (SortMembers.size () < SortedBy.size ()) {
1420
- sortIsChanged = ClearSortness (SortMembers.size ()) || sortIsChanged;
1420
+ sortIsChanged = ClearSortness (ctx, SortMembers.size ()) || sortIsChanged;
1421
1421
}
1422
1422
}
1423
1423
}
@@ -1431,42 +1431,42 @@ void TYqlRowSpecInfo::CopyConstraints(const TYqlRowSpecInfo& from) {
1431
1431
Distinct = from.Distinct ;
1432
1432
}
1433
1433
1434
- bool TYqlRowSpecInfo::KeepPureSortOnly () {
1434
+ bool TYqlRowSpecInfo::KeepPureSortOnly (TExprContext& ctx ) {
1435
1435
bool sortIsChanged = false ;
1436
1436
for (size_t i = 0 ; i < SortMembers.size (); ++i) {
1437
1437
if (!Type->FindItem (SortMembers[i])) {
1438
- sortIsChanged = ClearSortness (i);
1438
+ sortIsChanged = ClearSortness (ctx, i);
1439
1439
break ;
1440
1440
} else if (SortedBy[i] != SortMembers[i]) {
1441
- sortIsChanged = ClearSortness (i);
1441
+ sortIsChanged = ClearSortness (ctx, i);
1442
1442
break ;
1443
1443
}
1444
1444
}
1445
1445
if (SortMembers.size () < SortedBy.size ()) {
1446
- sortIsChanged = ClearSortness (SortMembers.size ()) || sortIsChanged;
1446
+ sortIsChanged = ClearSortness (ctx, SortMembers.size ()) || sortIsChanged;
1447
1447
}
1448
1448
return sortIsChanged;
1449
1449
}
1450
1450
1451
- bool TYqlRowSpecInfo::ClearNativeDescendingSort () {
1451
+ bool TYqlRowSpecInfo::ClearNativeDescendingSort (TExprContext& ctx ) {
1452
1452
for (size_t i = 0 ; i < SortDirections.size (); ++i) {
1453
1453
if (!SortDirections[i] && Type->FindItem (SortedBy[i])) {
1454
- return ClearSortness (i);
1454
+ return ClearSortness (ctx, i);
1455
1455
}
1456
1456
}
1457
1457
return false ;
1458
1458
}
1459
1459
1460
- bool TYqlRowSpecInfo::MakeCommonSortness (const TYqlRowSpecInfo& from) {
1460
+ bool TYqlRowSpecInfo::MakeCommonSortness (TExprContext& ctx, const TYqlRowSpecInfo& from) {
1461
1461
bool sortIsChanged = false ;
1462
1462
UniqueKeys = false ; // Merge of two and more tables cannot have unique keys
1463
1463
const size_t resultSize = Min<size_t >(SortMembers.size (), from.SortMembers .size ()); // Truncate all calculated columns
1464
1464
if (SortedBy.size () > resultSize) {
1465
- sortIsChanged = ClearSortness (resultSize);
1465
+ sortIsChanged = ClearSortness (ctx, resultSize);
1466
1466
}
1467
1467
for (size_t i = 0 ; i < resultSize; ++i) {
1468
1468
if (SortMembers[i] != from.SortMembers [i] || SortedBy[i] != from.SortedBy [i] || SortedByTypes[i] != from.SortedByTypes [i] || SortDirections[i] != from.SortDirections [i]) {
1469
- sortIsChanged = ClearSortness (i) || sortIsChanged;
1469
+ sortIsChanged = ClearSortness (ctx, i) || sortIsChanged;
1470
1470
break ;
1471
1471
}
1472
1472
}
@@ -1482,13 +1482,15 @@ bool TYqlRowSpecInfo::CompareSortness(const TYqlRowSpecInfo& with, bool checkUni
1482
1482
&& (!checkUniqueFlag || UniqueKeys == with.UniqueKeys );
1483
1483
}
1484
1484
1485
- bool TYqlRowSpecInfo::ClearSortness (size_t fromMember) {
1485
+ bool TYqlRowSpecInfo::ClearSortness (TExprContext& ctx, size_t fromMember) {
1486
1486
if (fromMember <= SortMembers.size ()) {
1487
1487
SortMembers.erase (SortMembers.begin () + fromMember, SortMembers.end ());
1488
1488
SortedBy.erase (SortedBy.begin () + fromMember, SortedBy.end ());
1489
1489
SortedByTypes.erase (SortedByTypes.begin () + fromMember, SortedByTypes.end ());
1490
1490
SortDirections.erase (SortDirections.begin () + fromMember, SortDirections.end ());
1491
1491
UniqueKeys = false ;
1492
+ ConstraintsNode.Clear ();
1493
+ Sorted = MakeSortConstraint (ctx);
1492
1494
return true ;
1493
1495
}
1494
1496
return false ;
0 commit comments