1
1
import type { Reducer , AnyAction , Action } from 'redux' ;
2
- import {
3
- analyzeDocuments ,
4
- type SchemaParseOptions ,
5
- type Schema ,
6
- } from 'mongodb-schema' ;
2
+ import { analyzeDocuments , type Schema } from 'mongodb-schema' ;
7
3
8
4
import type { CollectionMetadata } from 'mongodb-collection-model' ;
9
5
import type { ThunkAction } from 'redux-thunk' ;
@@ -37,7 +33,6 @@ type CollectionThunkAction<R, A extends AnyAction = AnyAction> = ThunkAction<
37
33
experimentationServices : ReturnType < typeof experimentationServiceLocator > ;
38
34
logger : Logger ;
39
35
preferences : PreferencesAccess ;
40
- analysisAbortControllerRef : { current ?: AbortController } ;
41
36
} ,
42
37
A
43
38
> ;
@@ -82,12 +77,16 @@ interface CollectionMetadataFetchedAction {
82
77
83
78
interface SchemaAnalysisStartedAction {
84
79
type : CollectionActions . SchemaAnalysisStarted ;
85
- analysisStartTime : number ;
86
80
}
87
81
88
82
interface SchemaAnalysisFinishedAction {
89
83
type : CollectionActions . SchemaAnalysisFinished ;
90
- schemaAnalysis : SchemaAnalysis ;
84
+ schema : Schema | null ;
85
+ sampleDocument : Document | null ;
86
+ schemaMetadata : {
87
+ maxNestingDepth : number ;
88
+ validationRules : Document ;
89
+ } | null ;
91
90
}
92
91
93
92
interface SchemaAnalysisFailedAction {
@@ -149,7 +148,13 @@ const reducer: Reducer<CollectionState, Action> = (
149
148
) {
150
149
return {
151
150
...state ,
152
- schemaAnalysis : action . schemaAnalysis ,
151
+ schemaAnalysis : {
152
+ status : SchemaAnalysisStatus . COMPLETED ,
153
+ schema : action . schema ,
154
+ sampleDocument : action . sampleDocument ,
155
+ schemaMetadata : action . schemaMetadata ,
156
+ error : null ,
157
+ } ,
153
158
} ;
154
159
}
155
160
@@ -162,7 +167,9 @@ const reducer: Reducer<CollectionState, Action> = (
162
167
return {
163
168
...state ,
164
169
schemaAnalysis : {
165
- ...state . schemaAnalysis ,
170
+ schema : null ,
171
+ sampleDocument : null ,
172
+ schemaMetadata : null ,
166
173
status : SchemaAnalysisStatus . ERROR ,
167
174
error : action . error . message ,
168
175
} ,
@@ -192,11 +199,7 @@ export const selectTab = (
192
199
export const analyzeCollectionSchema = ( ) : CollectionThunkAction <
193
200
Promise < void >
194
201
> => {
195
- return async (
196
- dispatch ,
197
- getState ,
198
- { analysisAbortControllerRef, dataService, preferences, logger }
199
- ) => {
202
+ return async ( dispatch , getState , { dataService, preferences, logger } ) => {
200
203
const { schemaAnalysis, namespace } = getState ( ) ;
201
204
const analysisStatus = schemaAnalysis . status ;
202
205
if ( analysisStatus === SchemaAnalysisStatus . ANALYZING ) {
@@ -206,24 +209,17 @@ export const analyzeCollectionSchema = (): CollectionThunkAction<
206
209
return ;
207
210
}
208
211
209
- analysisAbortControllerRef . current = new AbortController ( ) ;
210
- const abortSignal = analysisAbortControllerRef . current . signal ;
211
-
212
- const analysisStartTime = Date . now ( ) ;
213
-
214
212
try {
215
213
logger . debug ( 'Schema analysis started.' ) ;
216
214
217
215
dispatch ( {
218
216
type : CollectionActions . SchemaAnalysisStarted ,
219
- analysisStartTime,
220
217
} ) ;
221
218
222
219
// Sample documents
223
220
const samplingOptions = { size : DEFAULT_SAMPLE_SIZE } ;
224
221
const driverOptions = {
225
222
maxTimeMS : preferences . getPreferences ( ) . maxTimeMS ,
226
- signal : abortSignal ,
227
223
} ;
228
224
const sampleCursor = dataService . sampleCursor (
229
225
namespace ,
@@ -236,16 +232,7 @@ export const analyzeCollectionSchema = (): CollectionThunkAction<
236
232
const sampleDocuments = await sampleCursor . toArray ( ) ;
237
233
238
234
// Analyze sampled documents
239
- const schemaParseOptions : SchemaParseOptions = {
240
- signal : abortSignal ,
241
- } ;
242
- const schemaAccessor = await analyzeDocuments (
243
- sampleDocuments ,
244
- schemaParseOptions
245
- ) ;
246
- if ( abortSignal ?. aborted ) {
247
- throw new Error ( abortSignal ?. reason || new Error ( 'Operation aborted' ) ) ;
248
- }
235
+ const schemaAccessor = await analyzeDocuments ( sampleDocuments ) ;
249
236
250
237
let schema : Schema | null = null ;
251
238
if ( schemaAccessor ) {
@@ -264,17 +251,14 @@ export const analyzeCollectionSchema = (): CollectionThunkAction<
264
251
const collInfo = await dataService . collectionInfo ( database , collection ) ;
265
252
schemaMetadata = {
266
253
maxNestingDepth : schema_depth ,
267
- validationRules : collInfo ?. validation ?. validator || null ,
254
+ validationRules : collInfo ?. validation ?. validator ?? null ,
268
255
} ;
269
256
}
270
257
dispatch ( {
271
258
type : CollectionActions . SchemaAnalysisFinished ,
272
- schemaAnalysis : {
273
- status : SchemaAnalysisStatus . COMPLETED ,
274
- schema,
275
- sampleDocument : sampleDocuments [ 0 ] ?? null ,
276
- schemaMetadata,
277
- } ,
259
+ schema,
260
+ sampleDocument : sampleDocuments [ 0 ] ?? null ,
261
+ schemaMetadata,
278
262
} ) ;
279
263
} catch ( err : any ) {
280
264
logger . log . error (
@@ -284,18 +268,12 @@ export const analyzeCollectionSchema = (): CollectionThunkAction<
284
268
{
285
269
namespace,
286
270
error : err . message ,
287
- aborted : abortSignal . aborted ,
288
- ...( abortSignal . aborted
289
- ? { abortReason : abortSignal . reason ?. message ?? abortSignal . reason }
290
- : { } ) ,
291
271
}
292
272
) ;
293
273
dispatch ( {
294
274
type : CollectionActions . SchemaAnalysisFailed ,
295
275
error : err as Error ,
296
276
} ) ;
297
- } finally {
298
- analysisAbortControllerRef . current = undefined ;
299
277
}
300
278
} ;
301
279
} ;
0 commit comments