Overwrite partitions with new data. When `static_partitions` is `None`, extracts the set of partitions touched by `commit_messages` and overwrites only those (dynamic partition overwrite). When `static_partitions` is `Some`, uses the caller-provided partition spec to determine which partitions to replace (static partition overwrite). A partial spec (not all partition keys specified) uses predicat
(
&self,
commit_messages: Vec<CommitMessage>,
static_partitions: Option<HashMap<String, Option<Datum>>>,
)
| 119 | /// When `static_partitions` is `Some` but `commit_messages` is empty, |
| 120 | /// the specified partitions are truncated (all existing data removed, nothing written). |
| 121 | pub async fn overwrite( |
| 122 | &self, |
| 123 | commit_messages: Vec<CommitMessage>, |
| 124 | static_partitions: Option<HashMap<String, Option<Datum>>>, |
| 125 | ) -> Result<()> { |
| 126 | if commit_messages.is_empty() && static_partitions.is_none() { |
| 127 | return Ok(()); |
| 128 | } |
| 129 | |
| 130 | let new_entries = self.messages_to_entries(&commit_messages); |
| 131 | let new_index_entries = self.messages_to_index_entries(&commit_messages); |
| 132 | |
| 133 | let partition_filter = if let Some(sp) = static_partitions { |
| 134 | let partition_keys = self.table.schema().partition_keys(); |
| 135 | let partition_fields = self.table.schema().partition_fields(); |
| 136 | let is_full_spec = partition_keys.iter().all(|k| sp.contains_key(k)); |
| 137 | |
| 138 | if is_full_spec { |
| 139 | let bytes = self.partitions_to_bytes(&[sp]); |
| 140 | Some(PartitionFilter::from_partition_set( |
| 141 | bytes, |
| 142 | &partition_fields, |
| 143 | )?) |
| 144 | } else { |
| 145 | Some(self.build_static_partition_predicate(&sp, &partition_fields)?) |
| 146 | } |
| 147 | } else { |
| 148 | self.build_dynamic_partition_filter(&commit_messages)? |
| 149 | }; |
| 150 | |
| 151 | self.try_commit(CommitEntriesPlan::Overwrite { |
| 152 | partition_filter, |
| 153 | new_entries, |
| 154 | new_index_entries, |
| 155 | }) |
| 156 | .await |
| 157 | } |
| 158 | |
| 159 | /// Build a predicate-based partition filter from a partial static partition spec. |
| 160 | fn build_static_partition_predicate( |