@@ -21,11 +21,11 @@ void ParquetDictBasketOutputWriter::start()
2121 m_indexSchema = ::arrow::schema ( { ::arrow::field (
2222 m_cycleIndexOutputAdapter -> getColumnArrayBuilder ( 0 ) -> getColumnName (),
2323 m_cycleIndexOutputAdapter -> getColumnArrayBuilder ( 0 ) -> getDataType () ) }, getFileMetaData () );
24- if ( m_indexSink. onStart )
25- m_indexSink. onStart ( m_indexSchema );
24+ if ( m_indexSink )
25+ m_indexSink -> onStart ( m_indexSchema );
2626 auto & fileName = m_adapterMgr.getFileName ();
27- if ( !fileName.empty () && m_indexSink. onFileChange )
28- m_indexSink. onFileChange ( fileName );
27+ if ( !fileName.empty () && m_indexSink )
28+ m_indexSink -> onFileChange ( fileName );
2929}
3030
3131void ParquetDictBasketOutputWriter::stop ()
@@ -40,16 +40,9 @@ void ParquetDictBasketOutputWriter::stop()
4040 catch ( ... ) { if ( !firstError ) firstError = std::current_exception (); }
4141 };
4242
43- auto && indexBuilder = m_cycleIndexOutputAdapter -> getColumnArrayBuilder ( 0 );
44- if ( indexBuilder -> length () > 0 && m_indexSink.onBatch )
45- guard ( [&]
46- {
47- auto arr = indexBuilder -> buildArray ();
48- auto rb = ::arrow::RecordBatch::Make ( m_indexSchema, arr -> length (), { arr } );
49- m_indexSink.onBatch ( rb );
50- } );
51- if ( m_indexSink.onStop )
52- guard ( [&] { m_indexSink.onStop (); } );
43+ guard ( [&] { flushIndexBatch (); } );
44+ if ( m_indexSink )
45+ guard ( [&] { m_indexSink -> onStop (); } );
5346
5447 guard ( [&] { ParquetWriter::stop (); } );
5548
@@ -73,12 +66,8 @@ void ParquetDictBasketOutputWriter::onEndCycle()
7366 m_cycleIndexOutputAdapter -> writeValue<std::uint16_t >( m_nextCycleIndex );
7467 auto && indexBuilder = m_cycleIndexOutputAdapter -> getColumnArrayBuilder ( 0 );
7568 indexBuilder -> handleRowFinished ();
76- if ( indexBuilder -> length () >= getChunkSize () && m_indexSink.onBatch )
77- {
78- auto arr = indexBuilder -> buildArray ();
79- auto rb = ::arrow::RecordBatch::Make ( m_indexSchema, arr -> length (), { arr } );
80- m_indexSink.onBatch ( rb );
81- }
69+ if ( indexBuilder -> length () >= getChunkSize () )
70+ flushIndexBatch ();
8271 m_nextCycleIndex = 0 ;
8372 }
8473 else
@@ -101,22 +90,26 @@ void ParquetDictBasketOutputWriter::onFileNameChange( const std::string &fileNam
10190
10291 guard ( [&] { ParquetWriter::onFileNameChange ( fileName ); } );
10392
104- // Flush any pending index data
105- auto && indexBuilder = m_cycleIndexOutputAdapter -> getColumnArrayBuilder ( 0 );
106- if ( indexBuilder -> length () > 0 && m_indexSink.onBatch )
107- guard ( [&]
108- {
109- auto arr = indexBuilder -> buildArray ();
110- auto rb = ::arrow::RecordBatch::Make ( m_indexSchema, arr -> length (), { arr } );
111- m_indexSink.onBatch ( rb );
112- } );
113- if ( m_indexSink.onFileChange )
114- guard ( [&] { m_indexSink.onFileChange ( fileName ); } );
93+ // Flush any pending index data, then rotate the index file.
94+ guard ( [&] { flushIndexBatch (); } );
95+ if ( m_indexSink )
96+ guard ( [&] { m_indexSink -> onFileChange ( fileName ); } );
11597
11698 if ( firstError )
11799 std::rethrow_exception ( firstError );
118100}
119101
102+ void ParquetDictBasketOutputWriter::flushIndexBatch ()
103+ {
104+ auto && indexBuilder = m_cycleIndexOutputAdapter -> getColumnArrayBuilder ( 0 );
105+ if ( indexBuilder -> length () > 0 && m_indexSink )
106+ {
107+ auto arr = indexBuilder -> buildArray ();
108+ auto rb = ::arrow::RecordBatch::Make ( m_indexSchema, arr -> length (), { arr } );
109+ m_indexSink -> onBatch ( rb );
110+ }
111+ }
112+
120113SingleColumnParquetOutputHandler *ParquetDictBasketOutputWriter::createScalarOutputHandler ( CspTypePtr type, const std::string &name )
121114{
122115 m_allHandlers.push_back ( std::make_unique<SingleColumnParquetOutputHandler>( m_engine, *this , type, name ) );
0 commit comments