2121import io .delta .kernel .data .ColumnVector ;
2222import io .delta .kernel .data .ColumnarBatch ;
2323import io .delta .kernel .data .Row ;
24+ import io .delta .kernel .internal .actions .DomainMetadata ;
2425import io .delta .kernel .internal .actions .Metadata ;
2526import io .delta .kernel .internal .actions .Protocol ;
2627import io .delta .kernel .internal .data .GenericRow ;
28+ import io .delta .kernel .internal .data .StructRow ;
2729import io .delta .kernel .internal .stats .FileSizeHistogram ;
2830import io .delta .kernel .internal .util .InternalUtils ;
31+ import io .delta .kernel .internal .util .VectorUtils ;
32+ import io .delta .kernel .types .ArrayType ;
2933import io .delta .kernel .types .LongType ;
3034import io .delta .kernel .types .StringType ;
3135import io .delta .kernel .types .StructType ;
32- import java .util .HashMap ;
33- import java .util .Map ;
34- import java .util .Objects ;
35- import java .util .Optional ;
36+ import java .util .*;
37+ import java .util .stream .Collectors ;
3638import org .slf4j .Logger ;
3739import org .slf4j .LoggerFactory ;
3840
@@ -47,6 +49,7 @@ public class CRCInfo {
4749 private static final String METADATA = "metadata" ;
4850 private static final String PROTOCOL = "protocol" ;
4951 private static final String TXN_ID = "txnId" ;
52+ private static final String DOMAIN_METADATA = "domainMetadata" ;
5053 private static final String FILE_SIZE_HISTOGRAM = "fileSizeHistogram" ;
5154
5255 public static final StructType CRC_FILE_SCHEMA =
@@ -58,6 +61,7 @@ public class CRCInfo {
5861 .add (METADATA , Metadata .FULL_SCHEMA )
5962 .add (PROTOCOL , Protocol .FULL_SCHEMA )
6063 .add (TXN_ID , StringType .STRING , /*nullable*/ true )
64+ .add (DOMAIN_METADATA , new ArrayType (DomainMetadata .FULL_SCHEMA , false ), /*nullable*/ true )
6165 .add (FILE_SIZE_HISTOGRAM , FileSizeHistogram .FULL_SCHEMA , /*nullable*/ true );
6266
6367 public static Optional <CRCInfo > fromColumnarBatch (
@@ -82,6 +86,14 @@ public static Optional<CRCInfo> fromColumnarBatch(
8286 txnIdColumnVector .isNullAt (rowId )
8387 ? Optional .empty ()
8488 : Optional .of (txnIdColumnVector .getString (rowId ));
89+ ColumnVector domainMetadataVector = batch .getColumnVector (getSchemaIndex (DOMAIN_METADATA ));
90+ Optional <List <DomainMetadata >> domainMetadata =
91+ domainMetadataVector .isNullAt (rowId )
92+ ? Optional .empty ()
93+ : Optional .of (
94+ VectorUtils .toJavaList (domainMetadataVector .getArray (rowId )).stream ()
95+ .map (row -> DomainMetadata .fromRow ((StructRow ) row ))
96+ .collect (Collectors .toList ()));
8597 Optional <FileSizeHistogram > fileSizeHistogram =
8698 FileSizeHistogram .fromColumnVector (
8799 batch .getColumnVector (getSchemaIndex (FILE_SIZE_HISTOGRAM )), rowId );
@@ -93,7 +105,14 @@ public static Optional<CRCInfo> fromColumnarBatch(
93105 }
94106 return Optional .of (
95107 new CRCInfo (
96- version , metadata , protocol , tableSizeBytes , numFiles , txnId , fileSizeHistogram ));
108+ version ,
109+ metadata ,
110+ protocol ,
111+ tableSizeBytes ,
112+ numFiles ,
113+ txnId ,
114+ domainMetadata ,
115+ fileSizeHistogram ));
97116 }
98117
99118 private final long version ;
@@ -102,6 +121,7 @@ public static Optional<CRCInfo> fromColumnarBatch(
102121 private final long tableSizeBytes ;
103122 private final long numFiles ;
104123 private final Optional <String > txnId ;
124+ private final Optional <List <DomainMetadata >> domainMetadata ;
105125 private final Optional <FileSizeHistogram > fileSizeHistogram ;
106126
107127 public CRCInfo (
@@ -111,15 +131,19 @@ public CRCInfo(
111131 long tableSizeBytes ,
112132 long numFiles ,
113133 Optional <String > txnId ,
134+ Optional <List <DomainMetadata >> domainMetadata ,
114135 Optional <FileSizeHistogram > fileSizeHistogram ) {
115136 checkArgument (tableSizeBytes >= 0 );
116137 checkArgument (numFiles >= 0 );
138+ // Live Domain Metadata actions at this version, excluding tombstones.
139+ domainMetadata .ifPresent (dms -> dms .forEach (dm -> checkArgument (!dm .isRemoved ())));
117140 this .version = version ;
118141 this .metadata = requireNonNull (metadata );
119142 this .protocol = requireNonNull (protocol );
120143 this .tableSizeBytes = tableSizeBytes ;
121144 this .numFiles = numFiles ;
122145 this .txnId = requireNonNull (txnId );
146+ this .domainMetadata = requireNonNull (domainMetadata );
123147 this .fileSizeHistogram = requireNonNull (fileSizeHistogram );
124148 }
125149
@@ -150,6 +174,10 @@ public Optional<String> getTxnId() {
150174 return txnId ;
151175 }
152176
177+ public Optional <List <DomainMetadata >> getDomainMetadata () {
178+ return domainMetadata ;
179+ }
180+
153181 /** The {@link FileSizeHistogram} stored in this CRCInfo. */
154182 public Optional <FileSizeHistogram > getFileSizeHistogram () {
155183 return fileSizeHistogram ;
@@ -172,6 +200,15 @@ public Row toRow() {
172200
173201 // Add optional fields
174202 txnId .ifPresent (txn -> values .put (getSchemaIndex (TXN_ID ), txn ));
203+ domainMetadata .ifPresent (
204+ domainMetadataList ->
205+ values .put (
206+ getSchemaIndex (DOMAIN_METADATA ),
207+ VectorUtils .buildArrayValue (
208+ domainMetadataList .stream ()
209+ .map (DomainMetadata ::toRow )
210+ .collect (Collectors .toList ()),
211+ DomainMetadata .FULL_SCHEMA )));
175212 fileSizeHistogram .ifPresent (
176213 fileSizeHistogram ->
177214 values .put (getSchemaIndex (FILE_SIZE_HISTOGRAM ), fileSizeHistogram .toRow ()));
@@ -196,6 +233,7 @@ public boolean equals(Object o) {
196233 && metadata .equals (other .metadata )
197234 && protocol .equals (other .protocol )
198235 && txnId .equals (other .txnId )
236+ && domainMetadata .equals (other .domainMetadata )
199237 && fileSizeHistogram .equals (other .fileSizeHistogram );
200238 }
201239
0 commit comments