JingsongLi commented on code in PR #138: URL: https://github.com/apache/flink-table-store/pull/138#discussion_r884388037
########## flink-table-store-connector/src/main/java/org/apache/flink/table/store/connector/TableStoreManagedFactory.java: ########## @@ -183,6 +204,84 @@ public void onDropTable(Context context, boolean ignoreIfNotExists) { @Override public Map<String, String> onCompactTable( Context context, CatalogPartitionSpec catalogPartitionSpec) { - throw new UnsupportedOperationException("Not implement yet"); + Map<String, String> newOptions = new HashMap<>(context.getCatalogTable().getOptions()); + FileStore fileStore = buildTableStore(context).buildFileStore(); + FileStoreScan.Plan plan = + fileStore + .newScan() + .withPartitionFilter( + PredicateConverter.CONVERTER.fromMap( + catalogPartitionSpec.getPartitionSpec(), + fileStore.partitionType())) + .plan(); + + Preconditions.checkState( + plan.snapshotId() != null && !plan.files().isEmpty(), + "The specified %s to compact does not exist any snapshot", + catalogPartitionSpec.getPartitionSpec().isEmpty() + ? "table" + : String.format("partition %s", catalogPartitionSpec.getPartitionSpec())); + Map<BinaryRowData, Map<Integer, List<DataFileMeta>>> groupBy = plan.groupByPartFiles(); + if (!Boolean.parseBoolean(newOptions.get(COMPACTION_RESCALE_BUCKET.key()))) { + groupBy = + pickManifest( + groupBy, + new FileStoreOptions(Configuration.fromMap(newOptions)) + .mergeTreeOptions(), + new KeyComparatorSupplier(fileStore.partitionType()).get()); + } + try { + newOptions.put( + COMPACTION_SCANNED_MANIFEST.key(), + Base64.getEncoder() + .encodeToString( + InstantiationUtil.serializeObject( + new PartitionedManifestMeta( + plan.snapshotId(), groupBy)))); + } catch (IOException e) { + throw new RuntimeException(e); + } + return newOptions; + } + + @VisibleForTesting + Map<BinaryRowData, Map<Integer, List<DataFileMeta>>> pickManifest( + Map<BinaryRowData, Map<Integer, List<DataFileMeta>>> groupBy, + MergeTreeOptions options, + Comparator<RowData> keyComparator) { + Map<BinaryRowData, Map<Integer, List<DataFileMeta>>> filtered = new HashMap<>(); + + for (Map.Entry<BinaryRowData, Map<Integer, List<DataFileMeta>>> partEntry : + groupBy.entrySet()) { + Map<Integer, List<DataFileMeta>> manifests = new HashMap<>(); + for (Map.Entry<Integer, List<DataFileMeta>> bucketEntry : + partEntry.getValue().entrySet()) { + List<DataFileMeta> smallFiles = Review Comment: Here we cannot pick small files at random, which would cause the merged files min and max to skip the middle data. For example: inputs: File1(0-10) File2(10-90) File3(90-100) merged: File4(0-100) File2(10-90) This can lead to results with overlapping. -- 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: issues-unsubscr...@flink.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org