@@ -92,19 +92,29 @@ impl traits::Data for Data {
9292 }
9393}
9494
95+ /// A `DataRef` represents a row stored in a table.
96+ ///
97+ /// A table row always has a [`DataKey`] associated with it.
98+ /// This is in contrast to rows that are materialized during query execution
99+ /// which may or may not have an associated `DataKey`.
95100#[ derive( Clone ) ]
96101pub struct DataRef {
102+ id : DataKey ,
97103 data : ProductValue ,
98104}
99105
100106impl DataRef {
101- fn new ( data : ProductValue ) -> Self {
102- Self { data }
107+ fn new ( id : DataKey , data : ProductValue ) -> Self {
108+ Self { id , data }
103109 }
104110
105111 pub fn view ( & self ) -> & ProductValue {
106112 & self . data
107113 }
114+
115+ pub fn id ( & self ) -> & DataKey {
116+ & self . id
117+ }
108118}
109119
110120pub struct MutTxId {
@@ -1371,7 +1381,7 @@ impl Inner {
13711381 match self . tx_state . as_ref ( ) . unwrap ( ) . get_row_op ( table_id, row_id) {
13721382 RowState :: Committed ( _) => unreachable ! ( "a row cannot be committed in a tx state" ) ,
13731383 RowState :: Insert ( row) => {
1374- return Ok ( Some ( DataRef :: new ( row) ) ) ;
1384+ return Ok ( Some ( DataRef :: new ( row_id . 0 , row) ) ) ;
13751385 }
13761386 RowState :: Delete => {
13771387 return Ok ( None ) ;
@@ -1383,7 +1393,7 @@ impl Inner {
13831393 . tables
13841394 . get ( table_id)
13851395 . and_then ( |table| table. get_row ( row_id) )
1386- . map ( |row| DataRef :: new ( row. clone ( ) ) ) )
1396+ . map ( |row| DataRef :: new ( row_id . 0 , row. clone ( ) ) ) )
13871397 }
13881398
13891399 fn get_row_type ( & self , table_id : & TableId ) -> Option < & ProductType > {
@@ -1741,10 +1751,10 @@ impl Iterator for Iter<'_> {
17411751 Some ( RowState :: Insert ( _) ) => ( ) , // Do nothing, we'll get it in the next stage
17421752 Some ( RowState :: Delete ) => ( ) , // Skip it, it's been deleted
17431753 Some ( RowState :: Absent ) => {
1744- return Some ( DataRef :: new ( row. clone ( ) ) ) ;
1754+ return Some ( DataRef :: new ( row_id . 0 , row. clone ( ) ) ) ;
17451755 }
17461756 None => {
1747- return Some ( DataRef :: new ( row. clone ( ) ) ) ;
1757+ return Some ( DataRef :: new ( row_id . 0 , row. clone ( ) ) ) ;
17481758 }
17491759 }
17501760 }
@@ -1762,8 +1772,8 @@ impl Iterator for Iter<'_> {
17621772 }
17631773 }
17641774 ScanStage :: CurrentTx { iter } => {
1765- if let Some ( ( _ , row) ) = iter. next ( ) {
1766- return Some ( DataRef :: new ( row. clone ( ) ) ) ;
1775+ if let Some ( ( id , row) ) = iter. next ( ) {
1776+ return Some ( DataRef :: new ( id . 0 , row. clone ( ) ) ) ;
17671777 }
17681778 break ;
17691779 }
@@ -1854,6 +1864,7 @@ impl Iterator for IndexSeekIterInner<'_> {
18541864 fn next ( & mut self ) -> Option < Self :: Item > {
18551865 if let Some ( row_id) = self . inserted_rows . next ( ) {
18561866 return Some ( DataRef :: new (
1867+ row_id. 0 ,
18571868 self . tx_state . get_row ( & self . table_id , & row_id) . unwrap ( ) . clone ( ) ,
18581869 ) ) ;
18591870 }
@@ -1902,7 +1913,10 @@ impl Iterator for CommittedIndexIterByColEq<'_> {
19021913/// Retrieve a commited row. Panics if `table_id` and `row_id` do not identify an actually
19031914/// present row.
19041915fn get_committed_row ( state : & CommittedState , table_id : & TableId , row_id : & RowId ) -> DataRef {
1905- DataRef :: new ( state. tables . get ( table_id) . unwrap ( ) . get_row ( row_id) . unwrap ( ) . clone ( ) )
1916+ DataRef :: new (
1917+ row_id. 0 ,
1918+ state. tables . get ( table_id) . unwrap ( ) . get_row ( row_id) . unwrap ( ) . clone ( ) ,
1919+ )
19061920}
19071921
19081922pub enum IterByColRange < ' a , R : RangeBounds < AlgebraicValue > > {
0 commit comments