cryptoe commented on code in PR #16381: URL: https://github.com/apache/druid/pull/16381#discussion_r1589141817
########## extensions-core/multi-stage-query/src/main/java/org/apache/druid/msq/querykit/results/ExportResultsFrameProcessor.java: ########## @@ -136,64 +142,52 @@ public ReturnOrAwait<Object> runIncrementally(IntSet readableInputs) throws IOEx } } - private void exportFrame(final Frame frame) throws IOException + private void exportFrame(final Frame frame) { final Sequence<Cursor> cursorSequence = new FrameStorageAdapter(frame, frameReader, Intervals.ETERNITY) .makeCursors(null, Intervals.ETERNITY, VirtualColumns.EMPTY, Granularities.ALL, false, null); - // Add headers if we are writing to a new file. - final boolean writeHeader = !storageConnector.pathExists(exportFilePath); - - try (OutputStream stream = storageConnector.write(exportFilePath)) { - ResultFormat.Writer formatter = exportFormat.createFormatter(stream, jsonMapper); - formatter.writeResponseStart(); - - if (writeHeader) { - formatter.writeHeaderFromRowSignature(exportRowSignature, false); - } - - SequenceUtils.forEach( - cursorSequence, - cursor -> { - try { - final ColumnSelectorFactory columnSelectorFactory = cursor.getColumnSelectorFactory(); - - //noinspection rawtypes - @SuppressWarnings("rawtypes") - final List<BaseObjectColumnValueSelector> selectors = - frameReader.signature() - .getColumnNames() - .stream() - .map(columnSelectorFactory::makeColumnValueSelector) - .collect(Collectors.toList()); - - while (!cursor.isDone()) { - formatter.writeRowStart(); - for (int j = 0; j < exportRowSignature.size(); j++) { - String columnName = exportRowSignature.getColumnName(j); - BaseObjectColumnValueSelector<?> selector = selectors.get(outputColumnNameToFrameColumnNumberMap.getInt(columnName)); - formatter.writeRowField(columnName, selector.getObject()); - } - channelCounter.incrementRowCount(); - formatter.writeRowEnd(); - cursor.advance(); + SequenceUtils.forEach( Review Comment: So you basically have made the file creation in the constructor. The storage connector interface takes a file. This basically means you are passing the same file name to multiple processors hence getting the overwrite semantics. How does moving code to the constructor help in this case ? -- 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: commits-unsubscr...@druid.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@druid.apache.org For additional commands, e-mail: commits-h...@druid.apache.org