JingsongLi commented on code in PR #1072:
URL: https://github.com/apache/incubator-paimon/pull/1072#discussion_r1185683577


##########
paimon-core/src/main/java/org/apache/paimon/operation/AbstractFileStoreScan.java:
##########
@@ -195,6 +196,70 @@ public FileStoreScan 
withManifestCacheFilter(ManifestCacheFilter manifestFilter)
 
     @Override
     public Plan plan() {
+        Pair<Long, List<ManifestEntry>> planResult =
+                doPlan(
+                        // how to process entry files
+                        entries ->
+                                entries.parallelStream()
+                                        .filter(this::filterManifestFileMeta)
+                                        .flatMap(m -> 
readManifestFileMeta(m).stream())
+                                        .filter(this::filterByStats)
+                                        .collect(Collectors.toList()),
+                        // post process filter files
+                        file -> {
+                            if (checkNumOfBuckets && file.totalBuckets() != 
numOfBuckets) {
+                                String partInfo =
+                                        partitionConverter.getArity() > 0
+                                                ? "partition "
+                                                        + 
FileStorePathFactory.getPartitionComputer(
+                                                                        
partitionConverter
+                                                                               
 .rowType(),
+                                                                        
FileStorePathFactory
+                                                                               
 .PARTITION_DEFAULT_NAME
+                                                                               
 .defaultValue())
+                                                                
.generatePartValues(
+                                                                        
file.partition())
+                                                : "table";
+                                throw new RuntimeException(
+                                        String.format(
+                                                "Try to write %s with a new 
bucket num %d, but the previous bucket num is %d. "
+                                                        + "Please switch to 
batch mode, and perform INSERT OVERWRITE to rescale current data layout first.",
+                                                partInfo, numOfBuckets, 
file.totalBuckets()));
+                            }
+
+                            // bucket filter should not be applied along with 
partition filter
+                            // because the specifiedBucket is computed against 
the current
+                            // numOfBuckets
+                            // however entry.bucket() was computed against the 
old numOfBuckets
+                            // and thus the filtered manifest entries might be 
empty
+                            // which renders the bucket check invalid
+                            if (filterByBucket(file)

Review Comment:
   'if' statement can be simplified 



##########
paimon-core/src/main/java/org/apache/paimon/operation/AbstractFileStoreScan.java:
##########
@@ -195,6 +196,70 @@ public FileStoreScan 
withManifestCacheFilter(ManifestCacheFilter manifestFilter)
 
     @Override
     public Plan plan() {
+        Pair<Long, List<ManifestEntry>> planResult =
+                doPlan(
+                        // how to process entry files
+                        entries ->
+                                entries.parallelStream()
+                                        .filter(this::filterManifestFileMeta)
+                                        .flatMap(m -> 
readManifestFileMeta(m).stream())
+                                        .filter(this::filterByStats)
+                                        .collect(Collectors.toList()),
+                        // post process filter files
+                        file -> {
+                            if (checkNumOfBuckets && file.totalBuckets() != 
numOfBuckets) {
+                                String partInfo =
+                                        partitionConverter.getArity() > 0
+                                                ? "partition "
+                                                        + 
FileStorePathFactory.getPartitionComputer(
+                                                                        
partitionConverter
+                                                                               
 .rowType(),
+                                                                        
FileStorePathFactory
+                                                                               
 .PARTITION_DEFAULT_NAME
+                                                                               
 .defaultValue())
+                                                                
.generatePartValues(
+                                                                        
file.partition())
+                                                : "table";
+                                throw new RuntimeException(
+                                        String.format(
+                                                "Try to write %s with a new 
bucket num %d, but the previous bucket num is %d. "
+                                                        + "Please switch to 
batch mode, and perform INSERT OVERWRITE to rescale current data layout first.",
+                                                partInfo, numOfBuckets, 
file.totalBuckets()));
+                            }
+
+                            // bucket filter should not be applied along with 
partition filter
+                            // because the specifiedBucket is computed against 
the current
+                            // numOfBuckets
+                            // however entry.bucket() was computed against the 
old numOfBuckets
+                            // and thus the filtered manifest entries might be 
empty
+                            // which renders the bucket check invalid
+                            if (filterByBucket(file)
+                                    && filterByBucketSelector(file)
+                                    && filterByLevel(file)) {
+                                return true;
+                            }
+                            return false;
+                        });
+        final Long readSnapshotId = planResult.getLeft();
+        final List<ManifestEntry> files = planResult.getRight();
+
+        return new Plan() {
+            @Nullable
+            @Override
+            public Long snapshotId() {
+                return readSnapshotId;
+            }
+
+            @Override
+            public List<ManifestEntry> files() {
+                return files;
+            }
+        };
+    }
+
+    private <T extends AbstractManifestEntry> Pair<Long, List<T>> doPlan(
+            Function<List<ManifestFileMeta>, List<T>> processor,

Review Comment:
   `readManifestFile`?



##########
paimon-core/src/main/java/org/apache/paimon/operation/AbstractFileStoreScan.java:
##########
@@ -195,6 +196,70 @@ public FileStoreScan 
withManifestCacheFilter(ManifestCacheFilter manifestFilter)
 
     @Override
     public Plan plan() {
+        Pair<Long, List<ManifestEntry>> planResult =
+                doPlan(
+                        // how to process entry files
+                        entries ->
+                                entries.parallelStream()
+                                        .filter(this::filterManifestFileMeta)
+                                        .flatMap(m -> 
readManifestFileMeta(m).stream())
+                                        .filter(this::filterByStats)
+                                        .collect(Collectors.toList()),
+                        // post process filter files
+                        file -> {
+                            if (checkNumOfBuckets && file.totalBuckets() != 
numOfBuckets) {
+                                String partInfo =
+                                        partitionConverter.getArity() > 0
+                                                ? "partition "
+                                                        + 
FileStorePathFactory.getPartitionComputer(
+                                                                        
partitionConverter
+                                                                               
 .rowType(),
+                                                                        
FileStorePathFactory
+                                                                               
 .PARTITION_DEFAULT_NAME
+                                                                               
 .defaultValue())
+                                                                
.generatePartValues(
+                                                                        
file.partition())
+                                                : "table";
+                                throw new RuntimeException(
+                                        String.format(
+                                                "Try to write %s with a new 
bucket num %d, but the previous bucket num is %d. "
+                                                        + "Please switch to 
batch mode, and perform INSERT OVERWRITE to rescale current data layout first.",
+                                                partInfo, numOfBuckets, 
file.totalBuckets()));
+                            }
+
+                            // bucket filter should not be applied along with 
partition filter
+                            // because the specifiedBucket is computed against 
the current
+                            // numOfBuckets
+                            // however entry.bucket() was computed against the 
old numOfBuckets
+                            // and thus the filtered manifest entries might be 
empty
+                            // which renders the bucket check invalid
+                            if (filterByBucket(file)
+                                    && filterByBucketSelector(file)
+                                    && filterByLevel(file)) {
+                                return true;
+                            }
+                            return false;
+                        });
+        final Long readSnapshotId = planResult.getLeft();
+        final List<ManifestEntry> files = planResult.getRight();
+
+        return new Plan() {
+            @Nullable
+            @Override
+            public Long snapshotId() {
+                return readSnapshotId;
+            }
+
+            @Override
+            public List<ManifestEntry> files() {
+                return files;
+            }
+        };
+    }
+
+    private <T extends AbstractManifestEntry> Pair<Long, List<T>> doPlan(
+            Function<List<ManifestFileMeta>, List<T>> processor,
+            Function<T, Boolean> postFilterProcessor) {

Review Comment:
   Maybe we don't need this one, postFilter can be applied to 
`SimpleManifestEntry` too.
   If there is level filter, throw exception.



##########
paimon-core/src/main/java/org/apache/paimon/operation/AbstractFileStoreScan.java:
##########
@@ -195,6 +196,70 @@ public FileStoreScan 
withManifestCacheFilter(ManifestCacheFilter manifestFilter)
 
     @Override
     public Plan plan() {
+        Pair<Long, List<ManifestEntry>> planResult =
+                doPlan(
+                        // how to process entry files
+                        entries ->
+                                entries.parallelStream()

Review Comment:
   Can we also put these logical into `doPlan`?
   Only `filterByStats` is special, we can just `instanceof ManifestEntry` in 
`filterByStats`? 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to