@@ -448,15 +448,31 @@ export class CubeSymbols {
448
448
const includeMembers = this . generateIncludeMembers ( cubeIncludes , cube . name , type ) ;
449
449
this . applyIncludeMembers ( includeMembers , cube , type , errorReporter ) ;
450
450
451
- cube . includedMembers = R . uniqWith ( R . equals , [ ...( cube . includedMembers || [ ] ) , ...Array . from ( new Set ( cubeIncludes . map ( ( it : any ) => {
452
- const split = it . member . split ( '.' ) ;
453
- const memberPath = this . pathFromArray ( [ split [ split . length - 2 ] , split [ split . length - 1 ] ] ) ;
454
- return {
455
- type,
456
- memberPath,
457
- name : it . name
458
- } ;
459
- } ) ) ) ] ) ;
451
+ const existing = cube . includedMembers ?? [ ] ;
452
+ const seen = new Set (
453
+ existing . map ( ( { type : t , memberPath, name } ) => `${ t } |${ memberPath } |${ name } ` )
454
+ ) ;
455
+
456
+ const additions : {
457
+ type : string ;
458
+ memberPath : string ;
459
+ name : string ;
460
+ } [ ] = [ ] ;
461
+
462
+ for ( const { member, name } of cubeIncludes ) {
463
+ const parts = member . split ( '.' ) ;
464
+ const memberPath = this . pathFromArray ( parts . slice ( - 2 ) ) ;
465
+ const key = `${ type } |${ memberPath } |${ name } ` ;
466
+
467
+ if ( ! seen . has ( key ) ) {
468
+ seen . add ( key ) ;
469
+ additions . push ( { type, memberPath, name } ) ;
470
+ }
471
+ }
472
+
473
+ if ( additions . length ) {
474
+ cube . includedMembers = [ ...existing , ...additions ] ;
475
+ }
460
476
}
461
477
462
478
[ ...memberSets . allMembers ] . filter ( it => ! memberSets . resolvedMembers . has ( it ) ) . forEach ( it => {
@@ -474,66 +490,98 @@ export class CubeSymbols {
474
490
}
475
491
}
476
492
477
- protected membersFromCubes ( parentCube : CubeDefinition , cubes : any [ ] , type : string , errorReporter : ErrorReporter , splitViews : SplitViews , memberSets : any ) {
478
- return R . uniqWith ( R . equals , R . unnest ( cubes . map ( cubeInclude => {
479
- // TODO recheck `cubeInclude.joinPath` typing
480
- const fullPath = this . evaluateReferences ( null , cubeInclude . joinPath as ( ) => ToString , { collectJoinHints : true } ) ;
493
+ protected membersFromCubes (
494
+ parentCube : CubeDefinition ,
495
+ cubes : any [ ] ,
496
+ type : string ,
497
+ errorReporter : ErrorReporter ,
498
+ splitViews : SplitViews ,
499
+ memberSets : any
500
+ ) {
501
+ const result : any [ ] = [ ] ;
502
+ const seen = new Set < string > ( ) ;
503
+
504
+ for ( const cubeInclude of cubes ) {
505
+ const fullPath = this . evaluateReferences (
506
+ null ,
507
+ // TODO recheck `cubeInclude.joinPath` typing
508
+ cubeInclude . joinPath as ( ) => ToString ,
509
+ { collectJoinHints : true }
510
+ ) ;
511
+
481
512
const split = fullPath . split ( '.' ) ;
482
513
const cubeReference = split [ split . length - 1 ] ;
483
514
const cubeName = cubeInclude . alias || cubeReference ;
484
515
485
- let includes : any [ ] ;
486
516
const fullMemberName = ( memberName : string ) => ( cubeInclude . prefix ? `${ cubeName } _${ memberName } ` : memberName ) ;
487
517
518
+ let includes : any [ ] ;
519
+
488
520
if ( cubeInclude . includes === '*' ) {
489
521
const membersObj = this . symbols [ cubeReference ] ?. cubeObj ( ) ?. [ type ] || { } ;
490
- includes = Object . keys ( membersObj ) . map ( memberName => ( { member : `${ fullPath } .${ memberName } ` , name : fullMemberName ( memberName ) } ) ) ;
522
+ includes = Object . keys ( membersObj ) . map ( ( memberName ) => ( {
523
+ member : `${ fullPath } .${ memberName } ` ,
524
+ name : fullMemberName ( memberName ) ,
525
+ } ) ) ;
491
526
} else {
492
527
includes = cubeInclude . includes . map ( ( include : any ) => {
493
528
const member = include . alias || include . name || include ;
494
529
495
530
if ( member . includes ( '.' ) ) {
496
- errorReporter . error ( `Paths aren't allowed in cube includes but '${ member } ' provided as include member` ) ;
531
+ errorReporter . error (
532
+ `Paths aren't allowed in cube includes but '${ member } ' provided as include member`
533
+ ) ;
497
534
}
498
535
499
536
const name = fullMemberName ( member ) ;
500
537
memberSets . allMembers . add ( name ) ;
501
538
502
539
const includedMemberName = include . name || include ;
503
540
504
- const resolvedMember = this . getResolvedMember ( type , cubeReference , includedMemberName ) ? {
505
- member : `${ fullPath } .${ includedMemberName } ` ,
506
- name,
507
- ...( include . title || include . description || include . format || include . meta ) ? {
508
- override : {
509
- title : include . title ,
510
- description : include . description ,
511
- format : include . format ,
512
- meta : include . meta ,
513
- }
514
- } : { }
515
- } : undefined ;
541
+ const resolved = this . getResolvedMember (
542
+ type ,
543
+ cubeReference ,
544
+ includedMemberName
545
+ ) ;
516
546
517
- if ( resolvedMember ) {
518
- memberSets . resolvedMembers . add ( name ) ;
519
- }
547
+ if ( ! resolved ) return undefined ;
548
+
549
+ memberSets . resolvedMembers . add ( name ) ;
520
550
521
- return resolvedMember ;
551
+ const override = ( include . title || include . description || include . format || include . meta )
552
+ ? {
553
+ title : include . title ,
554
+ description : include . description ,
555
+ format : include . format ,
556
+ meta : include . meta ,
557
+ }
558
+ : undefined ;
559
+
560
+ return {
561
+ member : `${ fullPath } .${ includedMemberName } ` ,
562
+ name,
563
+ ...( override ? { override } : { } ) ,
564
+ } ;
522
565
} ) ;
523
566
}
524
567
525
- const excludes = ( cubeInclude . excludes || [ ] ) . map ( ( exclude : any ) => {
526
- if ( exclude . includes ( '.' ) ) {
527
- errorReporter . error ( `Paths aren't allowed in cube excludes but '${ exclude } ' provided as exclude member` ) ;
528
- }
568
+ const excludes = ( cubeInclude . excludes || [ ] )
569
+ . map ( ( exclude : any ) => {
570
+ if ( exclude . includes ( '.' ) ) {
571
+ errorReporter . error (
572
+ `Paths aren't allowed in cube excludes but '${ exclude } ' provided as exclude member`
573
+ ) ;
574
+ }
529
575
530
- const resolvedMember = this . getResolvedMember ( type , cubeReference , exclude ) ;
531
- return resolvedMember ? {
532
- member : `${ fullPath } .${ exclude } `
533
- } : undefined ;
534
- } ) ;
576
+ const resolved = this . getResolvedMember ( type , cubeReference , exclude ) ;
577
+ return resolved ? { member : `${ fullPath } .${ exclude } ` } : undefined ;
578
+ } )
579
+ . filter ( Boolean ) ;
535
580
536
- const finalIncludes = this . diffByMember ( includes . filter ( Boolean ) , excludes . filter ( Boolean ) ) ;
581
+ const finalIncludes = this . diffByMember (
582
+ includes . filter ( Boolean ) ,
583
+ excludes
584
+ ) ;
537
585
538
586
if ( cubeInclude . split ) {
539
587
const viewName = `${ parentCube . name } _${ cubeName } ` ;
@@ -548,14 +596,24 @@ export class CubeSymbols {
548
596
splitViewDef = splitViews [ viewName ] ;
549
597
}
550
598
551
- const includeMembers = this . generateIncludeMembers ( finalIncludes , parentCube . name , type ) ;
599
+ const includeMembers = this . generateIncludeMembers (
600
+ finalIncludes ,
601
+ parentCube . name ,
602
+ type
603
+ ) ;
552
604
this . applyIncludeMembers ( includeMembers , splitViewDef , type , errorReporter ) ;
553
-
554
- return [ ] ;
555
605
} else {
556
- return finalIncludes ;
606
+ for ( const member of finalIncludes ) {
607
+ const key = `${ member . member } |${ member . name } ` ;
608
+ if ( ! seen . has ( key ) ) {
609
+ seen . add ( key ) ;
610
+ result . push ( member ) ;
611
+ }
612
+ }
557
613
}
558
- } ) ) ) ;
614
+ }
615
+
616
+ return result ;
559
617
}
560
618
561
619
protected diffByMember ( includes : any [ ] , excludes : any [ ] ) {
0 commit comments