This is an automated email from the ASF dual-hosted git repository. lzljs3620320 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/paimon.git
commit a8c1c26c8887dd2a43241b5dbf2c3ce1134ece1a Author: JingsongLi <jingsongl...@gmail.com> AuthorDate: Wed Sep 10 15:45:39 2025 +0800 [python] Rename binary row to generic row --- .../pypaimon/manifest/manifest_file_manager.py | 40 +++++++++++----------- .../pypaimon/manifest/manifest_list_manager.py | 12 +++---- .../pypaimon/manifest/schema/data_file_meta.py | 8 ++--- .../pypaimon/manifest/schema/manifest_entry.py | 4 +-- .../pypaimon/manifest/schema/simple_stats.py | 6 ++-- paimon-python/pypaimon/read/interval_partition.py | 6 ++-- paimon-python/pypaimon/read/partition_info.py | 4 +-- paimon-python/pypaimon/read/split.py | 4 +-- .../table/row/{binary_row.py => generic_row.py} | 14 ++++---- .../pypaimon/tests/py36/ao_read_write_test.py | 8 ++--- paimon-python/pypaimon/tests/reader_basic_test.py | 8 ++--- .../pypaimon/tests/test_file_store_commit.py | 4 +-- paimon-python/pypaimon/write/file_store_commit.py | 10 +++--- paimon-python/pypaimon/write/writer/data_writer.py | 14 ++++---- 14 files changed, 71 insertions(+), 71 deletions(-) diff --git a/paimon-python/pypaimon/manifest/manifest_file_manager.py b/paimon-python/pypaimon/manifest/manifest_file_manager.py index 15d880356c..cedc27f284 100644 --- a/paimon-python/pypaimon/manifest/manifest_file_manager.py +++ b/paimon-python/pypaimon/manifest/manifest_file_manager.py @@ -24,8 +24,8 @@ from pypaimon.manifest.schema.data_file_meta import DataFileMeta from pypaimon.manifest.schema.manifest_entry import (MANIFEST_ENTRY_SCHEMA, ManifestEntry) from pypaimon.manifest.schema.simple_stats import SimpleStats -from pypaimon.table.row.binary_row import (BinaryRowDeserializer, - BinaryRowSerializer) +from pypaimon.table.row.generic_row import (GenericRowDeserializer, + GenericRowSerializer) class ManifestFileManager: @@ -54,26 +54,26 @@ class ManifestFileManager: file_dict = dict(record['_FILE']) key_dict = dict(file_dict['_KEY_STATS']) key_stats = SimpleStats( - min_values=BinaryRowDeserializer.from_bytes(key_dict['_MIN_VALUES'], - self.trimmed_primary_key_fields), - max_values=BinaryRowDeserializer.from_bytes(key_dict['_MAX_VALUES'], - self.trimmed_primary_key_fields), + min_values=GenericRowDeserializer.from_bytes(key_dict['_MIN_VALUES'], + self.trimmed_primary_key_fields), + max_values=GenericRowDeserializer.from_bytes(key_dict['_MAX_VALUES'], + self.trimmed_primary_key_fields), null_counts=key_dict['_NULL_COUNTS'], ) value_dict = dict(file_dict['_VALUE_STATS']) value_stats = SimpleStats( - min_values=BinaryRowDeserializer.from_bytes(value_dict['_MIN_VALUES'], - self.table.table_schema.fields), - max_values=BinaryRowDeserializer.from_bytes(value_dict['_MAX_VALUES'], - self.table.table_schema.fields), + min_values=GenericRowDeserializer.from_bytes(value_dict['_MIN_VALUES'], + self.table.table_schema.fields), + max_values=GenericRowDeserializer.from_bytes(value_dict['_MAX_VALUES'], + self.table.table_schema.fields), null_counts=value_dict['_NULL_COUNTS'], ) file_meta = DataFileMeta( file_name=file_dict['_FILE_NAME'], file_size=file_dict['_FILE_SIZE'], row_count=file_dict['_ROW_COUNT'], - min_key=BinaryRowDeserializer.from_bytes(file_dict['_MIN_KEY'], self.trimmed_primary_key_fields), - max_key=BinaryRowDeserializer.from_bytes(file_dict['_MAX_KEY'], self.trimmed_primary_key_fields), + min_key=GenericRowDeserializer.from_bytes(file_dict['_MIN_KEY'], self.trimmed_primary_key_fields), + max_key=GenericRowDeserializer.from_bytes(file_dict['_MAX_KEY'], self.trimmed_primary_key_fields), key_stats=key_stats, value_stats=value_stats, min_sequence_number=file_dict['_MIN_SEQUENCE_NUMBER'], @@ -88,7 +88,7 @@ class ManifestFileManager: ) entry = ManifestEntry( kind=record['_KIND'], - partition=BinaryRowDeserializer.from_bytes(record['_PARTITION'], self.partition_key_fields), + partition=GenericRowDeserializer.from_bytes(record['_PARTITION'], self.partition_key_fields), bucket=record['_BUCKET'], total_buckets=record['_TOTAL_BUCKETS'], file=file_meta @@ -104,23 +104,23 @@ class ManifestFileManager: avro_record = { "_VERSION": 2, "_KIND": entry.kind, - "_PARTITION": BinaryRowSerializer.to_bytes(entry.partition), + "_PARTITION": GenericRowSerializer.to_bytes(entry.partition), "_BUCKET": entry.bucket, "_TOTAL_BUCKETS": entry.total_buckets, "_FILE": { "_FILE_NAME": entry.file.file_name, "_FILE_SIZE": entry.file.file_size, "_ROW_COUNT": entry.file.row_count, - "_MIN_KEY": BinaryRowSerializer.to_bytes(entry.file.min_key), - "_MAX_KEY": BinaryRowSerializer.to_bytes(entry.file.max_key), + "_MIN_KEY": GenericRowSerializer.to_bytes(entry.file.min_key), + "_MAX_KEY": GenericRowSerializer.to_bytes(entry.file.max_key), "_KEY_STATS": { - "_MIN_VALUES": BinaryRowSerializer.to_bytes(entry.file.key_stats.min_values), - "_MAX_VALUES": BinaryRowSerializer.to_bytes(entry.file.key_stats.max_values), + "_MIN_VALUES": GenericRowSerializer.to_bytes(entry.file.key_stats.min_values), + "_MAX_VALUES": GenericRowSerializer.to_bytes(entry.file.key_stats.max_values), "_NULL_COUNTS": entry.file.key_stats.null_counts, }, "_VALUE_STATS": { - "_MIN_VALUES": BinaryRowSerializer.to_bytes(entry.file.value_stats.min_values), - "_MAX_VALUES": BinaryRowSerializer.to_bytes(entry.file.value_stats.max_values), + "_MIN_VALUES": GenericRowSerializer.to_bytes(entry.file.value_stats.min_values), + "_MAX_VALUES": GenericRowSerializer.to_bytes(entry.file.value_stats.max_values), "_NULL_COUNTS": entry.file.value_stats.null_counts, }, "_MIN_SEQUENCE_NUMBER": entry.file.min_sequence_number, diff --git a/paimon-python/pypaimon/manifest/manifest_list_manager.py b/paimon-python/pypaimon/manifest/manifest_list_manager.py index dc9d5db44d..2fc1eea011 100644 --- a/paimon-python/pypaimon/manifest/manifest_list_manager.py +++ b/paimon-python/pypaimon/manifest/manifest_list_manager.py @@ -25,8 +25,8 @@ from pypaimon.manifest.schema.manifest_file_meta import ( MANIFEST_FILE_META_SCHEMA, ManifestFileMeta) from pypaimon.manifest.schema.simple_stats import SimpleStats from pypaimon.snapshot.snapshot import Snapshot -from pypaimon.table.row.binary_row import (BinaryRowDeserializer, - BinaryRowSerializer) +from pypaimon.table.row.generic_row import (GenericRowDeserializer, + GenericRowSerializer) class ManifestListManager: @@ -58,11 +58,11 @@ class ManifestListManager: for record in reader: stats_dict = dict(record['_PARTITION_STATS']) partition_stats = SimpleStats( - min_values=BinaryRowDeserializer.from_bytes( + min_values=GenericRowDeserializer.from_bytes( stats_dict['_MIN_VALUES'], self.table.table_schema.get_partition_key_fields() ), - max_values=BinaryRowDeserializer.from_bytes( + max_values=GenericRowDeserializer.from_bytes( stats_dict['_MAX_VALUES'], self.table.table_schema.get_partition_key_fields() ), @@ -90,8 +90,8 @@ class ManifestListManager: "_NUM_ADDED_FILES": meta.num_added_files, "_NUM_DELETED_FILES": meta.num_deleted_files, "_PARTITION_STATS": { - "_MIN_VALUES": BinaryRowSerializer.to_bytes(meta.partition_stats.min_values), - "_MAX_VALUES": BinaryRowSerializer.to_bytes(meta.partition_stats.max_values), + "_MIN_VALUES": GenericRowSerializer.to_bytes(meta.partition_stats.min_values), + "_MAX_VALUES": GenericRowSerializer.to_bytes(meta.partition_stats.max_values), "_NULL_COUNTS": meta.partition_stats.null_counts, }, "_SCHEMA_ID": meta.schema_id, diff --git a/paimon-python/pypaimon/manifest/schema/data_file_meta.py b/paimon-python/pypaimon/manifest/schema/data_file_meta.py index cd1034ead9..a4eddabc55 100644 --- a/paimon-python/pypaimon/manifest/schema/data_file_meta.py +++ b/paimon-python/pypaimon/manifest/schema/data_file_meta.py @@ -23,7 +23,7 @@ from typing import List, Optional from pypaimon.manifest.schema.simple_stats import (SIMPLE_STATS_SCHEMA, SimpleStats) -from pypaimon.table.row.binary_row import BinaryRow +from pypaimon.table.row.generic_row import GenericRow @dataclass @@ -31,8 +31,8 @@ class DataFileMeta: file_name: str file_size: int row_count: int - min_key: BinaryRow - max_key: BinaryRow + min_key: GenericRow + max_key: GenericRow key_stats: SimpleStats value_stats: SimpleStats min_sequence_number: int @@ -51,7 +51,7 @@ class DataFileMeta: # not a schema field, just for internal usage file_path: str = None - def set_file_path(self, table_path: Path, partition: BinaryRow, bucket: int): + def set_file_path(self, table_path: Path, partition: GenericRow, bucket: int): path_builder = table_path partition_dict = partition.to_dict() for field_name, field_value in partition_dict.items(): diff --git a/paimon-python/pypaimon/manifest/schema/manifest_entry.py b/paimon-python/pypaimon/manifest/schema/manifest_entry.py index 75a51f30c5..9a02341175 100644 --- a/paimon-python/pypaimon/manifest/schema/manifest_entry.py +++ b/paimon-python/pypaimon/manifest/schema/manifest_entry.py @@ -20,13 +20,13 @@ from dataclasses import dataclass from pypaimon.manifest.schema.data_file_meta import (DATA_FILE_META_SCHEMA, DataFileMeta) -from pypaimon.table.row.binary_row import BinaryRow +from pypaimon.table.row.generic_row import GenericRow @dataclass class ManifestEntry: kind: int - partition: BinaryRow + partition: GenericRow bucket: int total_buckets: int file: DataFileMeta diff --git a/paimon-python/pypaimon/manifest/schema/simple_stats.py b/paimon-python/pypaimon/manifest/schema/simple_stats.py index 55b2163e76..45982491b9 100644 --- a/paimon-python/pypaimon/manifest/schema/simple_stats.py +++ b/paimon-python/pypaimon/manifest/schema/simple_stats.py @@ -19,13 +19,13 @@ from dataclasses import dataclass from typing import List, Optional -from pypaimon.table.row.binary_row import BinaryRow +from pypaimon.table.row.generic_row import GenericRow @dataclass class SimpleStats: - min_values: BinaryRow - max_values: BinaryRow + min_values: GenericRow + max_values: GenericRow null_counts: Optional[List[int]] diff --git a/paimon-python/pypaimon/read/interval_partition.py b/paimon-python/pypaimon/read/interval_partition.py index 3e0c637cd3..130e937f8b 100644 --- a/paimon-python/pypaimon/read/interval_partition.py +++ b/paimon-python/pypaimon/read/interval_partition.py @@ -22,7 +22,7 @@ from functools import cmp_to_key from typing import Callable, List from pypaimon.manifest.schema.data_file_meta import DataFileMeta -from pypaimon.table.row.binary_row import BinaryRow +from pypaimon.table.row.generic_row import GenericRow @dataclass @@ -91,7 +91,7 @@ class IntervalPartition: @dataclass class HeapRun: run: List[DataFileMeta] - comparator: Callable[[BinaryRow, BinaryRow], int] + comparator: Callable[[GenericRow, GenericRow], int] def __lt__(self, other) -> bool: my_last_max = self.run[-1].max_key @@ -99,7 +99,7 @@ class HeapRun: return self.comparator(my_last_max, other_last_max) < 0 -def default_key_comparator(key1: BinaryRow, key2: BinaryRow) -> int: +def default_key_comparator(key1: GenericRow, key2: GenericRow) -> int: if not key1 or not key1.values: if not key2 or not key2.values: return 0 diff --git a/paimon-python/pypaimon/read/partition_info.py b/paimon-python/pypaimon/read/partition_info.py index e07b37a619..08ba231c6c 100644 --- a/paimon-python/pypaimon/read/partition_info.py +++ b/paimon-python/pypaimon/read/partition_info.py @@ -19,7 +19,7 @@ from typing import Any, List from pypaimon.schema.data_types import DataField -from pypaimon.table.row.binary_row import BinaryRow +from pypaimon.table.row.generic_row import GenericRow class PartitionInfo: @@ -27,7 +27,7 @@ class PartitionInfo: Partition information about how the row mapping of outer row. """ - def __init__(self, mapping: List[int], partition: BinaryRow): + def __init__(self, mapping: List[int], partition: GenericRow): self.mapping = mapping self.partition_values = partition.values self.partition_fields = partition.fields diff --git a/paimon-python/pypaimon/read/split.py b/paimon-python/pypaimon/read/split.py index f3bfdbab6b..9b802d9880 100644 --- a/paimon-python/pypaimon/read/split.py +++ b/paimon-python/pypaimon/read/split.py @@ -20,14 +20,14 @@ from dataclasses import dataclass from typing import List from pypaimon.manifest.schema.data_file_meta import DataFileMeta -from pypaimon.table.row.binary_row import BinaryRow +from pypaimon.table.row.generic_row import GenericRow @dataclass class Split: """Implementation of Split for native Python reading.""" files: List[DataFileMeta] - partition: BinaryRow + partition: GenericRow bucket: int _file_paths: List[str] _row_count: int diff --git a/paimon-python/pypaimon/table/row/binary_row.py b/paimon-python/pypaimon/table/row/generic_row.py similarity index 98% rename from paimon-python/pypaimon/table/row/binary_row.py rename to paimon-python/pypaimon/table/row/generic_row.py index d52e38cf11..2f6d3d86ae 100644 --- a/paimon-python/pypaimon/table/row/binary_row.py +++ b/paimon-python/pypaimon/table/row/generic_row.py @@ -27,7 +27,7 @@ from pypaimon.table.row.row_kind import RowKind @dataclass -class BinaryRow: +class GenericRow: values: List[Any] fields: List[DataField] row_kind: RowKind = RowKind.INSERT @@ -36,7 +36,7 @@ class BinaryRow: return {self.fields[i].name: self.values[i] for i in range(len(self.fields))} -class BinaryRowDeserializer: +class GenericRowDeserializer: HEADER_SIZE_IN_BITS = 8 MAX_FIX_PART_DATA_SIZE = 7 HIGHEST_FIRST_BIT = 0x80 << 56 @@ -47,9 +47,9 @@ class BinaryRowDeserializer: cls, bytes_data: bytes, data_fields: List[DataField] - ) -> BinaryRow: + ) -> GenericRow: if not bytes_data: - return BinaryRow([], data_fields) + return GenericRow([], data_fields) arity = len(data_fields) actual_data = bytes_data @@ -66,7 +66,7 @@ class BinaryRowDeserializer: value = cls._parse_field_value(actual_data, 0, null_bits_size_in_bytes, i, data_field.type) fields.append(value) - return BinaryRow(fields, data_fields, RowKind(actual_data[0])) + return GenericRow(fields, data_fields, RowKind(actual_data[0])) @classmethod def _calculate_bit_set_width_in_bytes(cls, arity: int) -> int: @@ -235,12 +235,12 @@ class BinaryRowDeserializer: ) -class BinaryRowSerializer: +class GenericRowSerializer: HEADER_SIZE_IN_BITS = 8 MAX_FIX_PART_DATA_SIZE = 7 @classmethod - def to_bytes(cls, binary_row: BinaryRow) -> bytes: + def to_bytes(cls, binary_row: GenericRow) -> bytes: arity = len(binary_row.fields) null_bits_size_in_bytes = cls._calculate_bit_set_width_in_bytes(arity) fixed_part_size = null_bits_size_in_bytes + arity * 8 diff --git a/paimon-python/pypaimon/tests/py36/ao_read_write_test.py b/paimon-python/pypaimon/tests/py36/ao_read_write_test.py index de174e6413..01a635b548 100644 --- a/paimon-python/pypaimon/tests/py36/ao_read_write_test.py +++ b/paimon-python/pypaimon/tests/py36/ao_read_write_test.py @@ -23,7 +23,7 @@ from pypaimon.schema.data_types import DataField, AtomicType from pypaimon.table.row.row_kind import RowKind -from pypaimon.table.row.binary_row import BinaryRow, BinaryRowSerializer, BinaryRowDeserializer +from pypaimon.table.row.generic_row import GenericRow, GenericRowSerializer, GenericRowDeserializer from pypaimon.api.options import Options from pypaimon.catalog.catalog_context import CatalogContext @@ -381,8 +381,8 @@ class RESTTableReadWritePy36Test(RESTCatalogBaseTest): long_string = "This is a long string that exceeds 7 bytes" values = [long_string] - binary_row = BinaryRow(values, fields, RowKind.INSERT) - serialized_bytes = BinaryRowSerializer.to_bytes(binary_row) + binary_row = GenericRow(values, fields, RowKind.INSERT) + serialized_bytes = GenericRowSerializer.to_bytes(binary_row) # Verify the last 6 bytes are 0 # This is because the variable part data is rounded to the nearest word (8 bytes) @@ -390,7 +390,7 @@ class RESTTableReadWritePy36Test(RESTCatalogBaseTest): self.assertEqual(serialized_bytes[-6:], b'\x00\x00\x00\x00\x00\x00') self.assertEqual(serialized_bytes[20:62].decode('utf-8'), long_string) # Deserialize to verify - deserialized_row = BinaryRowDeserializer.from_bytes(serialized_bytes, fields) + deserialized_row = GenericRowDeserializer.from_bytes(serialized_bytes, fields) self.assertEqual(deserialized_row.values[0], long_string) self.assertEqual(deserialized_row.row_kind, RowKind.INSERT) diff --git a/paimon-python/pypaimon/tests/reader_basic_test.py b/paimon-python/pypaimon/tests/reader_basic_test.py index 9402ae93f7..8b4ed05dd6 100644 --- a/paimon-python/pypaimon/tests/reader_basic_test.py +++ b/paimon-python/pypaimon/tests/reader_basic_test.py @@ -25,7 +25,7 @@ import pandas as pd import pyarrow as pa from pypaimon.table.row.row_kind import RowKind -from pypaimon.table.row.binary_row import BinaryRow, BinaryRowSerializer, BinaryRowDeserializer +from pypaimon.table.row.generic_row import GenericRow, GenericRowSerializer, GenericRowDeserializer from pypaimon.schema.data_types import DataField, AtomicType @@ -209,8 +209,8 @@ class ReaderBasicTest(unittest.TestCase): long_string = "This is a long string that exceeds 7 bytes" values = [long_string] - binary_row = BinaryRow(values, fields, RowKind.INSERT) - serialized_bytes = BinaryRowSerializer.to_bytes(binary_row) + binary_row = GenericRow(values, fields, RowKind.INSERT) + serialized_bytes = GenericRowSerializer.to_bytes(binary_row) # Verify the last 6 bytes are 0 # This is because the variable part data is rounded to the nearest word (8 bytes) @@ -218,7 +218,7 @@ class ReaderBasicTest(unittest.TestCase): self.assertEqual(serialized_bytes[-6:], b'\x00\x00\x00\x00\x00\x00') self.assertEqual(serialized_bytes[20:62].decode('utf-8'), long_string) # Deserialize to verify - deserialized_row = BinaryRowDeserializer.from_bytes(serialized_bytes, fields) + deserialized_row = GenericRowDeserializer.from_bytes(serialized_bytes, fields) self.assertEqual(deserialized_row.values[0], long_string) self.assertEqual(deserialized_row.row_kind, RowKind.INSERT) diff --git a/paimon-python/pypaimon/tests/test_file_store_commit.py b/paimon-python/pypaimon/tests/test_file_store_commit.py index 5110bc0f80..ac7ce95094 100644 --- a/paimon-python/pypaimon/tests/test_file_store_commit.py +++ b/paimon-python/pypaimon/tests/test_file_store_commit.py @@ -24,7 +24,7 @@ from unittest.mock import Mock, patch from pypaimon.manifest.schema.data_file_meta import DataFileMeta from pypaimon.manifest.schema.manifest_entry import ManifestEntry from pypaimon.snapshot.snapshot_commit import PartitionStatistics -from pypaimon.table.row.binary_row import BinaryRow +from pypaimon.table.row.generic_row import GenericRow from pypaimon.write.commit_message import CommitMessage from pypaimon.write.file_store_commit import FileStoreCommit @@ -379,7 +379,7 @@ class TestFileStoreCommit(unittest.TestCase): def _to_entries(commit_messages): commit_entries = [] for msg in commit_messages: - partition = BinaryRow(list(msg.partition), None) + partition = GenericRow(list(msg.partition), None) for file in msg.new_files: commit_entries.append(ManifestEntry( kind=0, diff --git a/paimon-python/pypaimon/write/file_store_commit.py b/paimon-python/pypaimon/write/file_store_commit.py index ed9f5d16fc..8136117092 100644 --- a/paimon-python/pypaimon/write/file_store_commit.py +++ b/paimon-python/pypaimon/write/file_store_commit.py @@ -32,7 +32,7 @@ from pypaimon.snapshot.snapshot import Snapshot from pypaimon.snapshot.snapshot_commit import (PartitionStatistics, SnapshotCommit) from pypaimon.snapshot.snapshot_manager import SnapshotManager -from pypaimon.table.row.binary_row import BinaryRow +from pypaimon.table.row.generic_row import GenericRow from pypaimon.table.row.offset_row import OffsetRow from pypaimon.write.commit_message import CommitMessage @@ -66,7 +66,7 @@ class FileStoreCommit: commit_entries = [] for msg in commit_messages: - partition = BinaryRow(list(msg.partition), self.table.table_schema.get_partition_key_fields()) + partition = GenericRow(list(msg.partition), self.table.table_schema.get_partition_key_fields()) for file in msg.new_files: commit_entries.append(ManifestEntry( kind=0, @@ -106,7 +106,7 @@ class FileStoreCommit: entry.kind = 1 commit_entries.append(entry) for msg in commit_messages: - partition = BinaryRow(list(msg.partition), self.table.table_schema.get_partition_key_fields()) + partition = GenericRow(list(msg.partition), self.table.table_schema.get_partition_key_fields()) for file in msg.new_files: commit_entries.append(ManifestEntry( kind=0, @@ -153,11 +153,11 @@ class FileStoreCommit: num_added_files=added_file_count, num_deleted_files=deleted_file_count, partition_stats=SimpleStats( - min_values=BinaryRow( + min_values=GenericRow( values=partition_min_stats, fields=self.table.table_schema.get_partition_key_fields(), ), - max_values=BinaryRow( + max_values=GenericRow( values=partition_max_stats, fields=self.table.table_schema.get_partition_key_fields(), ), diff --git a/paimon-python/pypaimon/write/writer/data_writer.py b/paimon-python/pypaimon/write/writer/data_writer.py index 4a197c6919..a7eb9cb2b8 100644 --- a/paimon-python/pypaimon/write/writer/data_writer.py +++ b/paimon-python/pypaimon/write/writer/data_writer.py @@ -28,7 +28,7 @@ from pypaimon.common.core_options import CoreOptions from pypaimon.manifest.schema.data_file_meta import DataFileMeta from pypaimon.manifest.schema.simple_stats import SimpleStats from pypaimon.table.bucket_mode import BucketMode -from pypaimon.table.row.binary_row import BinaryRow +from pypaimon.table.row.generic_row import GenericRow class DataWriter(ABC): @@ -147,16 +147,16 @@ class DataWriter(ABC): file_name=file_name, file_size=self.file_io.get_file_size(file_path), row_count=data.num_rows, - min_key=BinaryRow(min_key, self.trimmed_primary_key_fields), - max_key=BinaryRow(max_key, self.trimmed_primary_key_fields), + min_key=GenericRow(min_key, self.trimmed_primary_key_fields), + max_key=GenericRow(max_key, self.trimmed_primary_key_fields), key_stats=SimpleStats( - BinaryRow(min_key_stats, self.trimmed_primary_key_fields), - BinaryRow(max_key_stats, self.trimmed_primary_key_fields), + GenericRow(min_key_stats, self.trimmed_primary_key_fields), + GenericRow(max_key_stats, self.trimmed_primary_key_fields), key_null_counts, ), value_stats=SimpleStats( - BinaryRow(min_value_stats, self.table.table_schema.fields), - BinaryRow(max_value_stats, self.table.table_schema.fields), + GenericRow(min_value_stats, self.table.table_schema.fields), + GenericRow(max_value_stats, self.table.table_schema.fields), value_null_counts, ), min_sequence_number=min_seq,