-
Notifications
You must be signed in to change notification settings - Fork 77
[BDP-102028] feat(optimizer): [1/N] Optimizer Database #530
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
77 commits
Select commit
Hold shift + click to select a range
2119555
feat(optimizer): add data model — schema, entities, DTOs, converters
mkuchenbecker 3c93d52
fix: address PR review feedback on optimizer data model
mkuchenbecker d419eb3
feat(optimizer): add repositories and repository tests
mkuchenbecker 7ff3b43
fix: consolidate repo methods — single find with optional filters
mkuchenbecker ac1da01
feat(optimizer): add apps/optimizer shared module with find-only repos
mkuchenbecker 02a5ab3
fix: remove orphan fields from CompleteOperationRequest
mkuchenbecker 5c78c8f
Merge mkuchenb/optimizer-0 into optimizer-1
mkuchenbecker 1cbe556
Merge branch 'main' into mkuchenb/optimizer-0
mkuchenbecker 231e1a1
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker f82d1b3
fix(optimizer): address PR #527 review feedback
mkuchenbecker e907a31
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker a109f02
fix(optimizer): propagate optimizer-0 renames into repos and tests
mkuchenbecker 027fccd
fix(optimizer): add databaseName + tableName to apps/optimizer histor…
mkuchenbecker 79753f1
fix(optimizer): index table_operations_history on (database_name, tab…
mkuchenbecker ae610ae
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker bf04488
fix(optimizer): align apps/optimizer entities with services schema
mkuchenbecker 62f426a
feat(optimizer): add findLatestPerTable to history repo
mkuchenbecker 3483b25
perf(optimizer): index table_operations_history for findLatestPerTable
mkuchenbecker 0293009
feat(optimizer): add findDistinctDatabaseNames to TableStatsRepository
mkuchenbecker eba1392
feat(optimizer): promote internal model types to shared apps/optimizer
mkuchenbecker e576593
refactor(optimizer): rename apps/optimizer entities + repos to plural…
mkuchenbecker d90c26f
refactor(optimizer): move apps/optimizer module into services/optimizer
mkuchenbecker 9a129a8
refactor(optimizer): align data model — rename HistoryStatus; String …
mkuchenbecker a8978a0
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker dfb9102
refactor(optimizer): realign entity shapes with optimizer-0
mkuchenbecker 681407e
feat(optimizer): add internal model layer
mkuchenbecker 2005bca
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker e3fb777
perf(optimizer): index table_operations_history for findLatestPerTable
mkuchenbecker f89889d
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker d3e1726
refactor(optimizer): enforce layer boundaries in api/ + model/
mkuchenbecker db9513a
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker 1d469a7
refactor(optimizer): remove db-layer types from optimizer-0
mkuchenbecker eee8eca
refactor(optimizer): remove DB schema + schema-init properties
mkuchenbecker 0567753
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker 328e5b9
refactor(optimizer): scrub MySQL / JPA / datasource references
mkuchenbecker f7a5d20
refactor(optimizer): drop UpsertTableOperationsRequest
mkuchenbecker 2a532b5
refactor(optimizer): drop JobResult from the wire and internal model
mkuchenbecker 2e3a231
feat(optimizer): add debug echo fields to CompleteOperationRequest
mkuchenbecker db5eb29
refactor(optimizer): move application.properties out of optimizer-0
mkuchenbecker bbcf84a
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker ac3abc0
feat(optimizer): introduce db/ layer with per-layer types
mkuchenbecker e79eec7
refactor(optimizer): split TableStats envelope into snapshot + delta …
mkuchenbecker f955ded
fix(optimizer): drop CommitDeltaMetrics from TableStatsRow
mkuchenbecker 861b584
feat(optimizer): extend model layer for service-only types
mkuchenbecker 41d4c6d
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker b60a3bf
feat(optimizer): extend ModelDbMapper for service-only types
mkuchenbecker 25d98aa
feat(optimizer): restore batch CAS methods on TableOperationsRepository
mkuchenbecker 188713d
docs(optimizer): comment every field on opt-0 api/ and model/ types
mkuchenbecker f060b5e
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker 8d64273
refactor(optimizer): remove clusterId from SnapshotMetrics
mkuchenbecker ee7bcab
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker c1ad246
refactor(optimizer): comment every db/ field; drop clusterId and version
mkuchenbecker c72aae8
refactor(optimizer): move api↔model conversion onto api types; delete…
mkuchenbecker 1fca287
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker 8ae8777
refactor(optimizer): move model↔db conversion onto model types; delet…
mkuchenbecker af23d5e
fix(optimizer): make TableStats self-describing; route DTO conversion…
mkuchenbecker 3864e42
chore(optimizer): cascade self-describing TableStats from opt-0 to opt-1
mkuchenbecker a6045b5
feat(optimizer): add TableStats↔TableStatsRow conversion on model
mkuchenbecker 3aebf64
chore(optimizer): enable toBuilder on model.Table and model.TableOper…
mkuchenbecker bf30f86
chore(optimizer): cascade toBuilder annotations from opt-0 to opt-1
mkuchenbecker b6c7f42
refactor(optimizer): drop fileCount enrichment from model.TableOperation
mkuchenbecker 177af95
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker 2b06c92
feat(repo): add findClaimedIds for transactional batch-claim verifica…
mkuchenbecker 437a0ed
refactor(optimizer): add Dto suffix to all api/model classes (PR #527…
mkuchenbecker aabb51c
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker 4f98c22
refactor(optimizer): rename api.model package to api.spec (PR #527 re…
mkuchenbecker 2c26872
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker b31decf
refactor(optimizer): move Dto suffix from api/spec to model
mkuchenbecker caf3294
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker 4e86569
feat(optimizer): propagate jobId through model + api conversions
mkuchenbecker cc8aa80
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker efcceea
feat(optimizer): propagate jobId through model ↔ db conversions
mkuchenbecker 1fe71f0
refactor(optimizer): rename CompleteOperationRequest → UpdateOperatio…
mkuchenbecker fb5e726
Merge branch 'mkuchenb/optimizer-0' into mkuchenb/optimizer-1
mkuchenbecker b96c388
Merge remote-tracking branch 'linkedin/main' into mkuchenb/optimizer-1
mkuchenbecker d65b511
refactor(optimizer-repo): unify find/updateBatch with Optional params
mkuchenbecker b69e09a
test(optimizer-repo): truncate Instant to micros for CI precision
mkuchenbecker File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
28 changes: 28 additions & 0 deletions
28
services/optimizer/src/main/java/com/linkedin/openhouse/optimizer/db/CommitDeltaMetrics.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,28 @@ | ||
| package com.linkedin.openhouse.optimizer.db; | ||
|
|
||
| import com.fasterxml.jackson.annotation.JsonIgnoreProperties; | ||
| import lombok.AllArgsConstructor; | ||
| import lombok.Builder; | ||
| import lombok.Data; | ||
| import lombok.NoArgsConstructor; | ||
|
|
||
| /** Per-commit incremental counters. Serialized as JSON into the {@code delta} column. */ | ||
| @Data | ||
| @Builder(toBuilder = true) | ||
| @NoArgsConstructor | ||
| @AllArgsConstructor | ||
| @JsonIgnoreProperties(ignoreUnknown = true) | ||
| public class CommitDeltaMetrics { | ||
|
|
||
| /** Number of data files this commit added to the table. */ | ||
| private Long numFilesAdded; | ||
|
|
||
| /** Number of data files this commit removed from the table. */ | ||
| private Long numFilesDeleted; | ||
|
|
||
| /** Total bytes added by this commit. */ | ||
| private Long addedSizeBytes; | ||
|
|
||
| /** Total bytes removed by this commit. */ | ||
| private Long deletedSizeBytes; | ||
| } |
15 changes: 15 additions & 0 deletions
15
services/optimizer/src/main/java/com/linkedin/openhouse/optimizer/db/HistoryStatus.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| package com.linkedin.openhouse.optimizer.db; | ||
|
|
||
| /** | ||
| * DB-layer enum for the {@code status} column of {@code table_operations_history}. | ||
| * | ||
| * <p>Self-contained: no references to api/ or model/ types. | ||
| */ | ||
| public enum HistoryStatus { | ||
|
|
||
| /** The Spark job for this operation completed successfully. */ | ||
| SUCCESS, | ||
|
|
||
| /** The Spark job for this operation failed. */ | ||
| FAILED | ||
| } |
21 changes: 21 additions & 0 deletions
21
services/optimizer/src/main/java/com/linkedin/openhouse/optimizer/db/OperationStatus.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| package com.linkedin.openhouse.optimizer.db; | ||
|
|
||
| /** | ||
| * DB-layer enum for the {@code status} column of {@code table_operations}. | ||
| * | ||
| * <p>Self-contained: no references to api/ or model/ types. | ||
| */ | ||
| public enum OperationStatus { | ||
|
|
||
| /** Analyzer has written the row; not yet claimed by the scheduler. */ | ||
| PENDING, | ||
|
|
||
| /** Scheduler has claimed the row and is launching a job; jobId not yet recorded. */ | ||
| SCHEDULING, | ||
|
|
||
| /** Job has been submitted to the Jobs Service; the row carries a {@code jobId}. */ | ||
| SCHEDULED, | ||
|
|
||
| /** Scheduler marked this row as a duplicate of another PENDING row; not claimable. */ | ||
| CANCELED | ||
| } |
14 changes: 14 additions & 0 deletions
14
services/optimizer/src/main/java/com/linkedin/openhouse/optimizer/db/OperationType.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,14 @@ | ||
| package com.linkedin.openhouse.optimizer.db; | ||
|
|
||
| /** | ||
| * DB-layer enum for the operation types persisted in {@code table_operations.operation_type} and | ||
| * {@code table_operations_history.operation_type}. | ||
| * | ||
| * <p>Self-contained: no references to api/ or model/ types. JPA binds this via | ||
| * {@code @Enumerated(EnumType.STRING)}. | ||
| */ | ||
| public enum OperationType { | ||
|
|
||
| /** Removes orphaned data files no longer referenced by table metadata. */ | ||
| ORPHAN_FILES_DELETION | ||
| } | ||
28 changes: 28 additions & 0 deletions
28
services/optimizer/src/main/java/com/linkedin/openhouse/optimizer/db/SnapshotMetrics.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,28 @@ | ||
| package com.linkedin.openhouse.optimizer.db; | ||
|
|
||
| import com.fasterxml.jackson.annotation.JsonIgnoreProperties; | ||
| import lombok.AllArgsConstructor; | ||
| import lombok.Builder; | ||
| import lombok.Data; | ||
| import lombok.NoArgsConstructor; | ||
|
|
||
| /** Point-in-time snapshot fields. Serialized as JSON into the {@code snapshot} column. */ | ||
| @Data | ||
| @Builder(toBuilder = true) | ||
| @NoArgsConstructor | ||
| @AllArgsConstructor | ||
| @JsonIgnoreProperties(ignoreUnknown = true) | ||
| public class SnapshotMetrics { | ||
|
|
||
| /** Iceberg metadata version pointer for this snapshot. */ | ||
| private String tableVersion; | ||
|
|
||
| /** Filesystem path (or URI) of the table's storage root. */ | ||
| private String tableLocation; | ||
|
|
||
| /** Total on-disk size of the table at this snapshot, in bytes. */ | ||
| private Long tableSizeBytes; | ||
|
|
||
| /** Total number of data files as of the latest snapshot — used for bin-packing. */ | ||
| private Long numCurrentFiles; | ||
| } |
75 changes: 75 additions & 0 deletions
75
...ptimizer/src/main/java/com/linkedin/openhouse/optimizer/db/TableOperationsHistoryRow.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,75 @@ | ||
| package com.linkedin.openhouse.optimizer.db; | ||
|
|
||
| import java.time.Instant; | ||
| import javax.persistence.Column; | ||
| import javax.persistence.Entity; | ||
| import javax.persistence.EnumType; | ||
| import javax.persistence.Enumerated; | ||
| import javax.persistence.Id; | ||
| import javax.persistence.Index; | ||
| import javax.persistence.Table; | ||
| import lombok.AccessLevel; | ||
| import lombok.AllArgsConstructor; | ||
| import lombok.Builder; | ||
| import lombok.EqualsAndHashCode; | ||
| import lombok.Getter; | ||
| import lombok.NoArgsConstructor; | ||
|
|
||
| /** | ||
| * Append-only record of a completed maintenance operation. | ||
| * | ||
| * <p>Written when the operation-complete endpoint is called. The {@code id} is the same UUID as the | ||
| * originating live-operations row, tying each history entry back to the operation cycle that | ||
| * produced it. Multiple runs of the same operation on the same table produce multiple rows. | ||
| * | ||
| * <p>Self-contained DB-layer type: enums are {@link OperationType} / {@link HistoryStatus} from the | ||
| * same package, JPA-bound as strings. | ||
| */ | ||
| @Entity | ||
| @Table( | ||
| name = "table_operations_history", | ||
| indexes = { | ||
| @Index(name = "idx_table_uuid_hist", columnList = "table_uuid"), | ||
| @Index(name = "idx_op_type_hist", columnList = "operation_type"), | ||
| @Index(name = "idx_completed_at", columnList = "completed_at"), | ||
| @Index(name = "idx_status_hist", columnList = "status"), | ||
| @Index(name = "idx_toph_db_table", columnList = "database_name, table_name") | ||
| }) | ||
| @Getter | ||
| @EqualsAndHashCode | ||
| @Builder(toBuilder = true) | ||
| @NoArgsConstructor(access = AccessLevel.PROTECTED) | ||
| @AllArgsConstructor(access = AccessLevel.PROTECTED) | ||
| public class TableOperationsHistoryRow { | ||
|
|
||
| /** Same UUID as the originating live-operations row. Set by the caller; not generated. */ | ||
| @Id | ||
| @Column(name = "id", nullable = false, length = 36) | ||
| private String id; | ||
|
|
||
| /** Stable table identity from the Tables Service. */ | ||
| @Column(name = "table_uuid", nullable = false, length = 36) | ||
| private String tableUuid; | ||
|
|
||
| /** Denormalized database name. */ | ||
| @Column(name = "database_name", nullable = false, length = 128) | ||
| private String databaseName; | ||
|
|
||
| /** Denormalized table name. */ | ||
| @Column(name = "table_name", nullable = false, length = 128) | ||
| private String tableName; | ||
|
|
||
| /** The type of maintenance operation this history row records. */ | ||
| @Enumerated(EnumType.STRING) | ||
| @Column(name = "operation_type", nullable = false, length = 50) | ||
| private OperationType operationType; | ||
|
|
||
| /** When the operation completed, as recorded by the complete endpoint. */ | ||
| @Column(name = "completed_at", nullable = false) | ||
| private Instant completedAt; | ||
|
|
||
| /** Terminal outcome: {@link HistoryStatus#SUCCESS} or {@link HistoryStatus#FAILED}. */ | ||
| @Enumerated(EnumType.STRING) | ||
| @Column(name = "status", nullable = false, length = 20) | ||
| private HistoryStatus status; | ||
| } |
85 changes: 85 additions & 0 deletions
85
services/optimizer/src/main/java/com/linkedin/openhouse/optimizer/db/TableOperationsRow.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,85 @@ | ||
| package com.linkedin.openhouse.optimizer.db; | ||
|
|
||
| import java.time.Instant; | ||
| import javax.persistence.Column; | ||
| import javax.persistence.Entity; | ||
| import javax.persistence.EnumType; | ||
| import javax.persistence.Enumerated; | ||
| import javax.persistence.Id; | ||
| import javax.persistence.Index; | ||
| import javax.persistence.Table; | ||
| import lombok.AccessLevel; | ||
| import lombok.AllArgsConstructor; | ||
| import lombok.Builder; | ||
| import lombok.EqualsAndHashCode; | ||
| import lombok.Getter; | ||
| import lombok.NoArgsConstructor; | ||
|
|
||
| /** | ||
| * JPA entity representing an Analyzer recommendation for a table maintenance operation. | ||
| * | ||
| * <p>Each row is identified by a client-generated UUID ({@code id}). The Analyzer creates a new row | ||
| * when it first recommends an operation for a table, or when re-recommending after a prior terminal | ||
| * state. {@code table_uuid} is the stable identity for the table (survives renames; rotates on | ||
| * drop+recreate). The application enforces one active (PENDING / SCHEDULING / SCHEDULED) row per | ||
| * {@code (table_uuid, operation_type)} at a time. | ||
| * | ||
| * <p>Self-contained DB-layer type: enums are {@link OperationType} / {@link OperationStatus} from | ||
| * the same package, JPA-bound as strings. | ||
| */ | ||
| @Entity | ||
| @Table( | ||
| name = "table_operations", | ||
| indexes = { | ||
| @Index(name = "idx_table_uuid", columnList = "table_uuid"), | ||
| @Index(name = "idx_op_type", columnList = "operation_type"), | ||
| @Index(name = "idx_status", columnList = "status"), | ||
| @Index(name = "idx_created_at", columnList = "created_at"), | ||
| @Index(name = "idx_scheduled_at", columnList = "scheduled_at") | ||
| }) | ||
| @Getter | ||
| @EqualsAndHashCode | ||
| @Builder(toBuilder = true) | ||
| @NoArgsConstructor(access = AccessLevel.PROTECTED) | ||
| @AllArgsConstructor(access = AccessLevel.PROTECTED) | ||
| public class TableOperationsRow { | ||
|
|
||
| /** Client-generated UUID identifying this specific operation recommendation. */ | ||
| @Id | ||
| @Column(name = "id", nullable = false, length = 36) | ||
| private String id; | ||
|
|
||
| /** Stable table identity from the Tables Service. Survives renames; rotates on drop+recreate. */ | ||
| @Column(name = "table_uuid", nullable = false, length = 36) | ||
| private String tableUuid; | ||
|
|
||
| /** Denormalized database name. */ | ||
| @Column(name = "database_name", nullable = false, length = 128) | ||
| private String databaseName; | ||
|
|
||
| /** Denormalized table name. */ | ||
| @Column(name = "table_name", nullable = false, length = 128) | ||
| private String tableName; | ||
|
|
||
| /** The type of maintenance operation this row recommends. */ | ||
| @Enumerated(EnumType.STRING) | ||
| @Column(name = "operation_type", nullable = false, length = 50) | ||
| private OperationType operationType; | ||
|
|
||
| /** Lifecycle state — drives the scheduler's CAS claim and the analyzer's eligibility check. */ | ||
| @Enumerated(EnumType.STRING) | ||
| @Column(name = "status", nullable = false, length = 20) | ||
| private OperationStatus status; | ||
|
|
||
| /** When the analyzer first created this row. Set on insert; never updated. */ | ||
| @Column(name = "created_at", nullable = false) | ||
| private Instant createdAt; | ||
|
|
||
| /** When the scheduler last submitted a job for this row. {@code null} while {@code PENDING}. */ | ||
| @Column(name = "scheduled_at") | ||
| private Instant scheduledAt; | ||
|
|
||
| /** Spark job ID written by the scheduler at claim time. Internal-only; never exposed on wire. */ | ||
| @Column(name = "job_id", length = 255) | ||
| private String jobId; | ||
| } |
74 changes: 74 additions & 0 deletions
74
...ces/optimizer/src/main/java/com/linkedin/openhouse/optimizer/db/TableStatsHistoryRow.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,74 @@ | ||
| package com.linkedin.openhouse.optimizer.db; | ||
|
|
||
| import com.vladmihalcea.hibernate.type.json.JsonStringType; | ||
| import java.time.Instant; | ||
| import javax.persistence.Column; | ||
| import javax.persistence.Entity; | ||
| import javax.persistence.Id; | ||
| import javax.persistence.Index; | ||
| import javax.persistence.Table; | ||
| import lombok.AccessLevel; | ||
| import lombok.AllArgsConstructor; | ||
| import lombok.Builder; | ||
| import lombok.EqualsAndHashCode; | ||
| import lombok.Getter; | ||
| import lombok.NoArgsConstructor; | ||
| import org.hibernate.annotations.Type; | ||
| import org.hibernate.annotations.TypeDef; | ||
|
|
||
| /** | ||
| * Append-only record of per-commit stats reported by the Tables Service. | ||
| * | ||
| * <p>Each Iceberg commit produces one row. Consumers can query this table to reconstruct change | ||
| * rates over arbitrary time windows. | ||
| * | ||
| * <p>Self-contained DB-layer type. The stats payload is split across two JSON columns — {@link | ||
| * SnapshotMetrics} (point-in-time fields at commit time) and {@link CommitDeltaMetrics} (per-commit | ||
| * counters). | ||
| */ | ||
| @TypeDef(name = "json", typeClass = JsonStringType.class) | ||
| @Entity | ||
| @Table( | ||
| name = "table_stats_history", | ||
| indexes = { | ||
| @Index(name = "idx_tsh_table_uuid", columnList = "table_uuid"), | ||
| @Index(name = "idx_tsh_recorded_at", columnList = "recorded_at") | ||
| }) | ||
| @Getter | ||
| @EqualsAndHashCode | ||
| @Builder(toBuilder = true) | ||
| @NoArgsConstructor(access = AccessLevel.PROTECTED) | ||
| @AllArgsConstructor(access = AccessLevel.PROTECTED) | ||
| public class TableStatsHistoryRow { | ||
|
|
||
| /** UUID primary key — set by the caller, not generated server-side. */ | ||
| @Id | ||
| @Column(name = "id", nullable = false, length = 36) | ||
| private String id; | ||
|
|
||
| /** Stable Iceberg table UUID. */ | ||
| @Column(name = "table_uuid", nullable = false, length = 36) | ||
| private String tableUuid; | ||
|
|
||
| /** Denormalized database name. */ | ||
| @Column(name = "database_name", nullable = false, length = 128) | ||
| private String databaseName; | ||
|
|
||
| /** Denormalized table name. */ | ||
| @Column(name = "table_name", nullable = false, length = 128) | ||
| private String tableName; | ||
|
|
||
| /** Snapshot fields at commit time. Stored as a JSON blob in the {@code snapshot} column. */ | ||
| @Type(type = "json") | ||
| @Column(name = "snapshot", columnDefinition = "TEXT") | ||
| private SnapshotMetrics snapshot; | ||
|
|
||
| /** Per-commit delta counters. Stored as a JSON blob in the {@code delta} column. */ | ||
| @Type(type = "json") | ||
| @Column(name = "delta", columnDefinition = "TEXT") | ||
| private CommitDeltaMetrics delta; | ||
|
|
||
| /** When this history row was recorded (commit time). */ | ||
| @Column(name = "recorded_at", nullable = false) | ||
| private Instant recordedAt; | ||
| } |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.