This is an automated email from the ASF dual-hosted git repository.
aokolnychyi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg.git
The following commit(s) were added to refs/heads/main by this push:
new 6f4e33ec22 Core: Use CharSequenceMap for writing unordered deletes (#9365)
6f4e33ec22 is described below
commit 6f4e33ec222299efc19f1bb75e782f058f5d1131
Author: Anton Okolnychyi <ao...@apple.com>
AuthorDate: Sun Dec 24 19:56:00 2023 +0100
Core: Use CharSequenceMap for writing unordered deletes (#9365)
---
.../deletes/SortingPositionOnlyDeleteWriter.java | 28 +++++++---------------
1 file changed, 9 insertions(+), 19 deletions(-)
diff --git a/core/src/main/java/org/apache/iceberg/deletes/SortingPositionOnlyDeleteWriter.java b/core/src/main/java/org/apache/iceberg/deletes/SortingPositionOnlyDeleteWriter.java
index 728eff097e..8819640e9f 100644
--- a/core/src/main/java/org/apache/iceberg/deletes/SortingPositionOnlyDeleteWriter.java
+++ b/core/src/main/java/org/apache/iceberg/deletes/SortingPositionOnlyDeleteWriter.java
@@ -20,13 +20,11 @@ package org.apache.iceberg.deletes;
import java.io.IOException;
import java.util.List;
-import java.util.Map;
import org.apache.iceberg.io.DeleteWriteResult;
import org.apache.iceberg.io.FileWriter;
import org.apache.iceberg.relocated.com.google.common.collect.Lists;
-import org.apache.iceberg.relocated.com.google.common.collect.Maps;
import org.apache.iceberg.types.Comparators;
-import org.apache.iceberg.util.CharSequenceWrapper;
+import org.apache.iceberg.util.CharSequenceMap;
import org.roaringbitmap.longlong.PeekableLongIterator;
import org.roaringbitmap.longlong.Roaring64Bitmap;
@@ -44,28 +42,20 @@ public class SortingPositionOnlyDeleteWriter<T>
implements FileWriter<PositionDelete<T>, DeleteWriteResult> {
private final FileWriter<PositionDelete<T>, DeleteWriteResult> writer;
- private final Map<CharSequenceWrapper, Roaring64Bitmap> positionsByPath;
- private final CharSequenceWrapper pathWrapper;
+ private final CharSequenceMap<Roaring64Bitmap> positionsByPath;
private DeleteWriteResult result = null;
public SortingPositionOnlyDeleteWriter(FileWriter<PositionDelete<T>, DeleteWriteResult> writer) {
this.writer = writer;
- this.positionsByPath = Maps.newHashMap();
- this.pathWrapper = CharSequenceWrapper.wrap(null);
+ this.positionsByPath = CharSequenceMap.create();
}
@Override
public void write(PositionDelete<T> positionDelete) {
CharSequence path = positionDelete.path();
long position = positionDelete.pos();
- Roaring64Bitmap positions = positionsByPath.get(pathWrapper.set(path));
- if (positions != null) {
- positions.add(position);
- } else {
- positions = new Roaring64Bitmap();
- positions.add(position);
- positionsByPath.put(CharSequenceWrapper.wrap(path), positions);
- }
+ Roaring64Bitmap positions = positionsByPath.computeIfAbsent(path, Roaring64Bitmap::new);
+ positions.add(position);
}
@Override
@@ -88,12 +78,12 @@ public class SortingPositionOnlyDeleteWriter<T>
private DeleteWriteResult writeDeletes() throws IOException {
try {
PositionDelete<T> positionDelete = PositionDelete.create();
- for (CharSequenceWrapper path : sortedPaths()) {
+ for (CharSequence path : sortedPaths()) {
// the iterator provides values in ascending sorted order
PeekableLongIterator positions = positionsByPath.get(path).getLongIterator();
while (positions.hasNext()) {
long position = positions.next();
- writer.write(positionDelete.set(path.get(), position, null /* no row */));
+ writer.write(positionDelete.set(path, position, null /* no row */));
}
}
} finally {
@@ -103,8 +93,8 @@ public class SortingPositionOnlyDeleteWriter<T>
return writer.result();
}
- private List<CharSequenceWrapper> sortedPaths() {
- List<CharSequenceWrapper> paths = Lists.newArrayList(positionsByPath.keySet());
+ private List<CharSequence> sortedPaths() {
+ List<CharSequence> paths = Lists.newArrayList(positionsByPath.keySet());
paths.sort(Comparators.charSequences());
return paths;
}