@@ -1423,8 +1423,7 @@ public unsafe object CreateInstanceFromSecondaryKey(RelationInfo.ItemLoaderInfo
1423
1423
uint remappedSecondaryKeyIndex ,
1424
1424
in ReadOnlySpan < byte > secondaryKey )
1425
1425
{
1426
- Span < byte > pkBuffer = stackalloc byte [ 512 ] ;
1427
- var pkWriter = MemWriter . CreateFromStackAllocatedSpan ( pkBuffer ) ;
1426
+ var pkWriter = MemWriter . CreateFromStackAllocatedSpan ( stackalloc byte [ 4096 ] ) ;
1428
1427
WriteRelationPKPrefix ( ref pkWriter ) ;
1429
1428
fixed ( void * _ = secondaryKey )
1430
1429
{
@@ -1504,53 +1503,117 @@ void AddIntoSecondaryIndexes(T obj, ref MemWriter writer)
1504
1503
}
1505
1504
}
1506
1505
1506
+ [ SkipLocalsInit ]
1507
1507
bool UpdateSecondaryIndexes ( in ReadOnlySpan < byte > oldKey , in ReadOnlySpan < byte > oldValue ,
1508
1508
in ReadOnlySpan < byte > newValue )
1509
1509
{
1510
1510
var changed = false ;
1511
- foreach ( var ( key , _ ) in _relationInfo . ClientRelationVersionInfo . SecondaryKeys )
1511
+ if ( _relationInfo . ClientRelationVersionInfo . HasComputedField )
1512
1512
{
1513
- var newKeyBytes = WriteSecondaryKeyKey ( key , oldKey , newValue ) ;
1514
- var oldKeyBytes = WriteSecondaryKeyKey ( key , oldKey , oldValue ) ;
1515
- if ( oldKeyBytes . SequenceEqual ( newKeyBytes ) )
1516
- continue ;
1517
- //remove old index
1518
- EraseOldSecondaryKey ( oldKey , oldKeyBytes , key ) ;
1519
- //insert new value
1520
- _kvtr . CreateOrUpdateKeyValue ( newKeyBytes , new ( ) ) ;
1521
- changed = true ;
1513
+ var writer = MemWriter . CreateFromStackAllocatedSpan ( stackalloc byte [ 4096 ] ) ;
1514
+ var writerOld = MemWriter . CreateFromStackAllocatedSpan ( stackalloc byte [ 4096 ] ) ;
1515
+ var objOld = _relationInfo . ItemLoaderInfos [ 0 ] . CreateInstance ( _transaction , oldKey , oldValue ) ;
1516
+ var objNew = _relationInfo . ItemLoaderInfos [ 0 ] . CreateInstance ( _transaction , oldKey , newValue ) ;
1517
+
1518
+ foreach ( var ( key , _) in _relationInfo . ClientRelationVersionInfo . SecondaryKeys )
1519
+ {
1520
+ writer . Reset ( ) ;
1521
+ writerOld . Reset ( ) ;
1522
+ var newKeyBytes = WriteSecondaryKeyKey ( key , Unsafe . As < T > ( objNew ) , ref writer ) ;
1523
+ var oldKeyBytes = WriteSecondaryKeyKey ( key , Unsafe . As < T > ( objOld ) , ref writerOld ) ;
1524
+ if ( oldKeyBytes . SequenceEqual ( newKeyBytes ) )
1525
+ continue ;
1526
+ //remove old index
1527
+ EraseOldSecondaryKey ( oldKey , oldKeyBytes , key ) ;
1528
+ //insert new value
1529
+ _kvtr . CreateOrUpdateKeyValue ( newKeyBytes , new ( ) ) ;
1530
+ changed = true ;
1531
+ }
1532
+ }
1533
+ else
1534
+ {
1535
+ foreach ( var ( key , _) in _relationInfo . ClientRelationVersionInfo . SecondaryKeys )
1536
+ {
1537
+ var newKeyBytes = WriteSecondaryKeyKey ( key , oldKey , newValue ) ;
1538
+ var oldKeyBytes = WriteSecondaryKeyKey ( key , oldKey , oldValue ) ;
1539
+ if ( oldKeyBytes . SequenceEqual ( newKeyBytes ) )
1540
+ continue ;
1541
+ //remove old index
1542
+ EraseOldSecondaryKey ( oldKey , oldKeyBytes , key ) ;
1543
+ //insert new value
1544
+ _kvtr . CreateOrUpdateKeyValue ( newKeyBytes , new ( ) ) ;
1545
+ changed = true ;
1546
+ }
1522
1547
}
1523
1548
1524
1549
return changed ;
1525
1550
}
1526
1551
1552
+ [ SkipLocalsInit ]
1527
1553
bool UpdateSecondaryIndexes ( T newValue , in ReadOnlySpan < byte > oldKey , in ReadOnlySpan < byte > oldValue ,
1528
1554
ref MemWriter writer )
1529
1555
{
1530
1556
var changed = false ;
1531
- foreach ( var ( key , _ ) in _relationInfo . ClientRelationVersionInfo . SecondaryKeys )
1557
+ if ( _relationInfo . ClientRelationVersionInfo . HasComputedField )
1532
1558
{
1533
- writer . Reset ( ) ;
1534
- var newKeyBytes = WriteSecondaryKeyKey ( key , newValue , ref writer ) ;
1535
- var oldKeyBytes = WriteSecondaryKeyKey ( key , oldKey , oldValue ) ;
1536
- if ( oldKeyBytes . SequenceEqual ( newKeyBytes ) )
1537
- continue ;
1538
- //remove old index
1539
- EraseOldSecondaryKey ( oldKey , oldKeyBytes , key ) ;
1540
- //insert new value
1541
- _kvtr . CreateOrUpdateKeyValue ( newKeyBytes , new ( ) ) ;
1542
- changed = true ;
1559
+ var writerOld = MemWriter . CreateFromStackAllocatedSpan ( stackalloc byte [ 4096 ] ) ;
1560
+ var obj = _relationInfo . ItemLoaderInfos [ 0 ] . CreateInstance ( _transaction , oldKey , oldValue ) ;
1561
+ foreach ( var ( key , _) in _relationInfo . ClientRelationVersionInfo . SecondaryKeys )
1562
+ {
1563
+ writer . Reset ( ) ;
1564
+ writerOld . Reset ( ) ;
1565
+ var newKeyBytes = WriteSecondaryKeyKey ( key , newValue , ref writer ) ;
1566
+ var oldKeyBytes = WriteSecondaryKeyKey ( key , Unsafe . As < T > ( obj ) , ref writerOld ) ;
1567
+ if ( oldKeyBytes . SequenceEqual ( newKeyBytes ) )
1568
+ continue ;
1569
+ //remove old index
1570
+ EraseOldSecondaryKey ( oldKey , oldKeyBytes , key ) ;
1571
+ //insert new value
1572
+ _kvtr . CreateOrUpdateKeyValue ( newKeyBytes , new ( ) ) ;
1573
+ changed = true ;
1574
+ }
1575
+ }
1576
+ else
1577
+ {
1578
+ foreach ( var ( key , _) in _relationInfo . ClientRelationVersionInfo . SecondaryKeys )
1579
+ {
1580
+ writer . Reset ( ) ;
1581
+ var newKeyBytes = WriteSecondaryKeyKey ( key , newValue , ref writer ) ;
1582
+ var oldKeyBytes = WriteSecondaryKeyKey ( key , oldKey , oldValue ) ;
1583
+ if ( oldKeyBytes . SequenceEqual ( newKeyBytes ) )
1584
+ continue ;
1585
+ //remove old index
1586
+ EraseOldSecondaryKey ( oldKey , oldKeyBytes , key ) ;
1587
+ //insert new value
1588
+ _kvtr . CreateOrUpdateKeyValue ( newKeyBytes , new ( ) ) ;
1589
+ changed = true ;
1590
+ }
1543
1591
}
1544
1592
1545
1593
return changed ;
1546
1594
}
1547
1595
1596
+ [ SkipLocalsInit ]
1548
1597
void RemoveSecondaryIndexes ( in ReadOnlySpan < byte > oldKey , in ReadOnlySpan < byte > oldValue )
1549
1598
{
1550
- foreach ( var ( key , _ ) in _relationInfo . ClientRelationVersionInfo . SecondaryKeys )
1599
+ if ( _relationInfo . ClientRelationVersionInfo . HasComputedField )
1551
1600
{
1552
- var keyBytes = WriteSecondaryKeyKey ( key , oldKey , oldValue ) ;
1553
- EraseOldSecondaryKey ( oldKey , keyBytes , key ) ;
1601
+ var writer = MemWriter . CreateFromStackAllocatedSpan ( stackalloc byte [ 4096 ] ) ;
1602
+ var obj = _relationInfo . ItemLoaderInfos [ 0 ] . CreateInstance ( _transaction , oldKey , oldValue ) ;
1603
+ foreach ( var ( key , _) in _relationInfo . ClientRelationVersionInfo . SecondaryKeys )
1604
+ {
1605
+ writer . Reset ( ) ;
1606
+ var keyBytes = WriteSecondaryKeyKey ( key , Unsafe . As < T > ( obj ) , ref writer ) ;
1607
+ EraseOldSecondaryKey ( oldKey , keyBytes , key ) ;
1608
+ }
1609
+ }
1610
+ else
1611
+ {
1612
+ foreach ( var ( key , _) in _relationInfo . ClientRelationVersionInfo . SecondaryKeys )
1613
+ {
1614
+ var keyBytes = WriteSecondaryKeyKey ( key , oldKey , oldValue ) ;
1615
+ EraseOldSecondaryKey ( oldKey , keyBytes , key ) ;
1616
+ }
1554
1617
}
1555
1618
}
1556
1619
0 commit comments