@@ -335,6 +335,67 @@ function transformRecord(targetFields: (Field | CustomField | ExpandDictField |
335335 return expandedRecords
336336}
337337
338+ function * transformRecordStream ( targetFields : ( Field | CustomField | ExpandDictField | ExpandListField ) [ ] , record : any ) : Generator < any > {
339+ let expandedRecords : any [ ] = [ { } ]
340+
341+ for ( let i = 0 ; i < targetFields . length ; i ++ ) {
342+ const field = targetFields [ i ]
343+
344+ if ( field instanceof Field ) {
345+ const value = record [ field . key ]
346+ const result = field . map ? field . map ( value , record ) : value
347+ for ( const expandedRecord of expandedRecords ) {
348+ expandedRecord [ field . outputKey ] = result
349+ }
350+ } else if ( field instanceof CustomField ) {
351+ const result = field . map ( record )
352+ for ( const expandedRecord of expandedRecords ) {
353+ expandedRecord [ field . outputKey ] = result
354+ }
355+ } else if ( field instanceof ExpandDictField ) {
356+ const nestedFieldValues = createNestedFieldValues ( record , field )
357+ for ( const expandedRecord of expandedRecords ) {
358+ Object . assign ( expandedRecord , nestedFieldValues )
359+ }
360+ } else if ( field instanceof ExpandListField ) {
361+ const nestedList = record [ field . key ] || [ ]
362+ const remainingFields = targetFields . slice ( i + 1 )
363+
364+ for ( const item of nestedList ) {
365+ for ( const baseExpandedRecord of expandedRecords ) {
366+ const newRecord = { ...baseExpandedRecord }
367+ for ( const nestedField of field . fields ) {
368+ if ( nestedField instanceof Field ) {
369+ const value = item [ nestedField . key ]
370+ newRecord [ nestedField . outputKey ] = nestedField . map ? nestedField . map ( value , item , record ) : value
371+ } else if ( nestedField instanceof CustomField ) {
372+ newRecord [ nestedField . outputKey ] = nestedField . map ( item , record )
373+ } else if ( nestedField instanceof ExpandDictField ) {
374+ Object . assign ( newRecord , createNestedFieldValuesListed ( item , nestedField , record ) )
375+ }
376+ }
377+ for ( const rf of remainingFields ) {
378+ if ( rf instanceof Field ) {
379+ const value = record [ rf . key ]
380+ newRecord [ rf . outputKey ] = rf . map ? rf . map ( value , record ) : value
381+ } else if ( rf instanceof CustomField ) {
382+ newRecord [ rf . outputKey ] = rf . map ( record )
383+ } else if ( rf instanceof ExpandDictField ) {
384+ Object . assign ( newRecord , createNestedFieldValues ( record , rf ) )
385+ }
386+ }
387+ yield newRecord
388+ }
389+ }
390+ return
391+ }
392+ }
393+
394+ for ( const r of expandedRecords ) {
395+ yield r
396+ }
397+ }
398+
338399function performApplyView ( results : any [ ] , viewObj : View , inputData ?: any ) : [ any [ ] , string [ ] ] {
339400 const hidden_fields : string [ ] = [ ] ;
340401 const targetFields : ( Field | CustomField | ExpandDictField | ExpandListField ) [ ] = isNotNullish ( inputData ) ?getFields ( viewObj . fields , inputData , hidden_fields ) :viewObj . fields
@@ -366,21 +427,16 @@ function _applyViewForUi(
366427 if ( pagination ) {
367428 const { start, end, containsListField } = pagination ;
368429 if ( containsListField ) {
369- // Need to count all expanded items, but only keep items in range
370430 const result : any [ ] = [ ] ;
371431 let items_count = 0 ;
372432 for ( let i = 0 ; i < results . length ; i ++ ) {
373433 const record = results [ i ] ;
374- const expandedRecords = transformRecord ( targetFields , record ) ;
375- const prevCount = items_count ;
376- items_count += expandedRecords . length ;
377434 results [ i ] = null ; // free memory
378-
379- // Add only the items that fall within [start, end)
380- if ( prevCount < end && items_count > start ) {
381- const sliceStart = Math . max ( 0 , start - prevCount ) ;
382- const sliceEnd = Math . min ( expandedRecords . length , end - prevCount ) ;
383- result . push ( ...expandedRecords . slice ( sliceStart , sliceEnd ) ) ;
435+ for ( const expandedRecord of transformRecordStream ( targetFields , record ) ) {
436+ if ( items_count >= start && items_count < end ) {
437+ result . push ( expandedRecord ) ;
438+ }
439+ items_count ++ ;
384440 }
385441 }
386442 return [ result , hidden_fields , items_count ] ;
@@ -432,15 +488,11 @@ async function _applyViewForUiLargeTask(taskId: number, view: string, views: Vie
432488 // @ts -ignore
433489 await TaskResults . streamTask ( taskId , ( record , _index ) => {
434490 if ( items_count >= end ) return false ;
435- const expandedRecords : any [ ] = transformRecord ( targetFields , record ) ;
436- const prevCount = items_count ;
437- items_count += expandedRecords . length ;
438-
439- // Add only the items that fall within [start, end)
440- if ( prevCount < end && items_count > start ) {
441- const sliceStart = Math . max ( 0 , start - prevCount ) ;
442- const sliceEnd = Math . min ( expandedRecords . length , end - prevCount ) ;
443- result . push ( ...expandedRecords . slice ( sliceStart , sliceEnd ) ) ;
491+ for ( const expandedRecord of transformRecordStream ( targetFields , record ) ) {
492+ if ( items_count >= start && items_count < end ) {
493+ result . push ( expandedRecord ) ;
494+ }
495+ items_count ++ ;
444496 }
445497 } ) ;
446498
@@ -490,5 +542,5 @@ export {
490542 findView ,
491543 _applyViewForUi ,
492544 applyView ,
493- transformRecord , getFields ,
545+ transformRecord , transformRecordStream , getFields ,
494546} ;
0 commit comments