1919import org .opensearch .core .rest .RestStatus ;
2020import org .opensearch .index .IndexSettings ;
2121import org .opensearch .index .engine .CommitStats ;
22- import org .opensearch .index .engine .dataformat .DataFormat ;
2322import org .opensearch .index .engine .dataformat .DataFormatDescriptor ;
24- import org .opensearch .index .engine .dataformat .DataFormatPlugin ;
2523import org .opensearch .index .engine .dataformat .DataFormatRegistry ;
26- import org .opensearch .index .engine .dataformat .DocumentInput ;
27- import org .opensearch .index .engine .dataformat .FieldTypeCapabilities ;
28- import org .opensearch .index .engine .dataformat .FileInfos ;
29- import org .opensearch .index .engine .dataformat .IndexingEngineConfig ;
30- import org .opensearch .index .engine .dataformat .IndexingExecutionEngine ;
31- import org .opensearch .index .engine .dataformat .MergeResult ;
32- import org .opensearch .index .engine .dataformat .Merger ;
33- import org .opensearch .index .engine .dataformat .RefreshInput ;
34- import org .opensearch .index .engine .dataformat .RefreshResult ;
35- import org .opensearch .index .engine .dataformat .WriteResult ;
36- import org .opensearch .index .engine .dataformat .Writer ;
37- import org .opensearch .index .engine .exec .Segment ;
38- import org .opensearch .index .engine .exec .WriterFileSet ;
39- import org .opensearch .index .engine .exec .commit .IndexStoreProvider ;
24+ import org .opensearch .index .engine .dataformat .stub .MockDataFormat ;
25+ import org .opensearch .index .engine .dataformat .stub .MockDataFormatPlugin ;
4026import org .opensearch .index .engine .exec .coord .DataformatAwareCatalogSnapshot ;
41- import org .opensearch .index .mapper .MappedFieldType ;
4227import org .opensearch .index .merge .MergeStats ;
43- import org .opensearch .index .store .FormatChecksumStrategy ;
4428import org .opensearch .index .store .PrecomputedChecksumStrategy ;
4529import org .opensearch .plugins .Plugin ;
4630import org .opensearch .test .OpenSearchIntegTestCase ;
4731
4832import java .io .IOException ;
49- import java .util .ArrayList ;
5033import java .util .Arrays ;
5134import java .util .Collection ;
52- import java .util .List ;
5335import java .util .Map ;
5436import java .util .Set ;
5537import java .util .function .Function ;
@@ -67,163 +49,13 @@ public class CompositeMergeIT extends OpenSearchIntegTestCase {
6749
6850 private static final String INDEX_NAME = "test-composite-merge" ;
6951
70- // ── Stub DataFormat for "parquet" ──
52+ // ── Mock DataFormatPlugin using test framework stubs ──
7153
72- private static final DataFormat STUB_PARQUET_FORMAT = new DataFormat () {
73- @ Override
74- public String name () {
75- return "parquet" ;
76- }
77-
78- @ Override
79- public long priority () {
80- return 0 ;
81- }
82-
83- @ Override
84- public Set <FieldTypeCapabilities > supportedFields () {
85- return Set .of ();
86- }
87- };
88-
89- // ── Stub DocumentInput ──
90-
91- private static class StubDocumentInput implements DocumentInput <Object > {
92- @ Override
93- public void addField (MappedFieldType fieldType , Object value ) {}
94-
95- @ Override
96- public void setRowId (String rowIdFieldName , long rowId ) {}
97-
98- @ Override
99- public Object getFinalInput () {
100- return null ;
101- }
102-
103- @ Override
104- public void close () {}
105- }
106-
107- // ── Stub Writer ──
108-
109- private static class StubWriter implements Writer <StubDocumentInput > {
110- private final long generation ;
111- private int docCount = 0 ;
112-
113- StubWriter (long generation ) {
114- this .generation = generation ;
115- }
116-
117- @ Override
118- public WriteResult addDoc (StubDocumentInput documentInput ) {
119- docCount ++;
120- return new WriteResult .Success (1L , 1L , docCount );
121- }
122-
123- @ Override
124- public FileInfos flush () {
125- if (docCount == 0 ) {
126- return FileInfos .empty ();
127- }
128- WriterFileSet wfs = new WriterFileSet ("/tmp/stub" , generation , Set .of ("stub_" + generation + ".parquet" ), docCount );
129- return new FileInfos (Map .of (STUB_PARQUET_FORMAT , wfs ));
130- }
131-
132- @ Override
133- public void sync () {}
134-
135- @ Override
136- public long generation () {
137- return generation ;
138- }
139-
140- @ Override
141- public void lock () {}
142-
143- @ Override
144- public boolean tryLock () {
145- return true ;
146- }
147-
148- @ Override
149- public void unlock () {}
150-
151- @ Override
152- public void close () throws IOException {}
153- }
154-
155- // ── Stub IndexingExecutionEngine ──
156-
157- @ SuppressWarnings ({ "unchecked" , "rawtypes" })
158- private static class StubParquetEngine implements IndexingExecutionEngine <DataFormat , StubDocumentInput > {
54+ public static class MockParquetDataFormatPlugin extends MockDataFormatPlugin {
55+ private static final MockDataFormat PARQUET_FORMAT = new MockDataFormat ("parquet" , 0L , Set .of ());
15956
160- @ Override
161- public Writer <StubDocumentInput > createWriter (long writerGeneration ) {
162- return new StubWriter (writerGeneration );
163- }
164-
165- @ Override
166- public Merger getMerger () {
167- return mergeInput -> {
168- long totalRows = mergeInput .writerFiles ().stream ().mapToLong (WriterFileSet ::numRows ).sum ();
169- WriterFileSet merged = new WriterFileSet ("/tmp/stub" , mergeInput .newWriterGeneration (),
170- Set .of ("merged_" + mergeInput .newWriterGeneration () + ".parquet" ), totalRows );
171- return new MergeResult (Map .of (STUB_PARQUET_FORMAT , merged ));
172- };
173- }
174-
175- @ Override
176- public RefreshResult refresh (RefreshInput refreshInput ) {
177- if (refreshInput == null ) return new RefreshResult (List .of ());
178- List <Segment > segments = new ArrayList <>();
179- segments .addAll (refreshInput .existingSegments ());
180- segments .addAll (refreshInput .writerFiles ());
181- return new RefreshResult (List .copyOf (segments ));
182- }
183-
184- @ Override
185- public long getNextWriterGeneration () {
186- return 0 ;
187- }
188-
189- @ Override
190- public DataFormat getDataFormat () {
191- return STUB_PARQUET_FORMAT ;
192- }
193-
194- @ Override
195- public long getNativeBytesUsed () {
196- return 0 ;
197- }
198-
199- @ Override
200- public void deleteFiles (Map <String , Collection <String >> filesToDelete ) {}
201-
202- @ Override
203- public StubDocumentInput newDocumentInput () {
204- return new StubDocumentInput ();
205- }
206-
207- @ Override
208- public IndexStoreProvider getProvider () {
209- return null ;
210- }
211-
212- @ Override
213- public void close () {}
214- }
215-
216- // ── Stub DataFormatPlugin ──
217-
218- public static class MockParquetDataFormatPlugin extends Plugin implements DataFormatPlugin {
219- @ Override
220- public DataFormat getDataFormat () {
221- return STUB_PARQUET_FORMAT ;
222- }
223-
224- @ Override
225- public IndexingExecutionEngine <?, ?> indexingEngine (IndexingEngineConfig settings , FormatChecksumStrategy checksumStrategy ) {
226- return new StubParquetEngine ();
57+ public MockParquetDataFormatPlugin () {
58+ super (PARQUET_FORMAT );
22759 }
22860
22961 @ Override
@@ -279,8 +111,7 @@ public void testBackgroundMergeSingleEngine() throws Exception {
279111 flush (INDEX_NAME );
280112 DataformatAwareCatalogSnapshot snapshot = getCatalogSnapshot ();
281113 assertTrue (
282- "Expected merges to reduce segment count below " + totalSegmentsCreated
283- + ", but got: " + snapshot .getSegments ().size (),
114+ "Expected merges to reduce segment count below " + totalSegmentsCreated + ", but got: " + snapshot .getSegments ().size (),
284115 snapshot .getSegments ().size () < totalSegmentsCreated
285116 );
286117 });
@@ -305,7 +136,6 @@ private Settings singleEngineSettings() {
305136 .build ();
306137 }
307138
308-
309139 private int indexDocsAcrossMultipleRefreshes (int refreshCycles , int docsPerCycle ) {
310140 int totalDocs = 0 ;
311141 for (int cycle = 0 ; cycle < refreshCycles ; cycle ++) {
0 commit comments