@@ -96,14 +96,14 @@ export class YamlCompiler {
9696
9797 for ( const key of Object . keys ( yamlObj ) ) {
9898 if ( key === 'cubes' ) {
99- this . checkDuplicateNames ( yamlObj . cubes || [ ] , 'cube' , errorsReport ) ;
99+ this . checkDuplicateNames ( yamlObj . cubes || [ ] , errorsReport , ( name ) => `Found duplicate cube name ' ${ name } '.` ) ;
100100
101101 ( yamlObj . cubes || [ ] ) . forEach ( ( { name, ...cube } ) => {
102102 const transpiledCube = this . transpileAndPrepareJsFile ( 'cube' , { name, ...cube } , errorsReport ) ;
103103 transpiledFilesContent . push ( transpiledCube ) ;
104104 } ) ;
105105 } else if ( key === 'views' ) {
106- this . checkDuplicateNames ( yamlObj . views || [ ] , 'view' , errorsReport ) ;
106+ this . checkDuplicateNames ( yamlObj . views || [ ] , errorsReport , ( name ) => `Found duplicate view name ' ${ name } '.` ) ;
107107
108108 ( yamlObj . views || [ ] ) . forEach ( ( { name, ...cube } ) => {
109109 const transpiledView = this . transpileAndPrepareJsFile ( 'view' , { name, ...cube } , errorsReport ) ;
@@ -140,6 +140,7 @@ export class YamlCompiler {
140140 cubeObj . hierarchies = this . yamlArrayToObj ( cubeObj . hierarchies || [ ] , 'hierarchies' , errorsReport , ctx ) ;
141141
142142 cubeObj . joins = cubeObj . joins || [ ] ; // For edge cases where joins are not defined/null
143+
143144 if ( ! Array . isArray ( cubeObj . joins ) ) {
144145 errorsReport . error ( 'joins must be defined as array' ) ;
145146 cubeObj . joins = [ ] ;
@@ -320,19 +321,17 @@ export class YamlCompiler {
320321 return body ?. expression ;
321322 }
322323
323- private checkDuplicateNames ( items : any [ ] , type : 'cube' | 'view' , errorsReport : ErrorReporter ) {
324- const seen = new Set < string > ( ) ;
324+ private checkDuplicateNames ( items : any [ ] , errorsReport : ErrorReporter , message : ( name : string ) => string ) {
325+ const names = items
326+ . map ( item => item ?. name )
327+ . filter ( ( name ) : name is string => name != null ) ;
325328
326- for ( const item of items ) {
327- if ( item ?. name ) {
328- if ( seen . has ( item . name ) ) {
329- errorsReport . error (
330- `Found duplicate ${ type } name '${ item . name } '.`
331- ) ;
332- } else {
333- seen . add ( item . name ) ;
334- }
329+ const seen = new Set < string > ( ) ;
330+ for ( const name of names ) {
331+ if ( seen . has ( name ) ) {
332+ errorsReport . error ( message ( name ) ) ;
335333 }
334+ seen . add ( name ) ;
336335 }
337336 }
338337
@@ -348,29 +347,15 @@ export class YamlCompiler {
348347 }
349348
350349 // Check for duplicate names
351- const names = yamlArray
352- . map ( item => item ?. name )
353- . filter ( name => name != null ) ;
354-
355- const seen = new Set < string > ( ) ;
356-
357- for ( const name of names ) {
358- if ( seen . has ( name ) ) {
359- if ( ctx . parent ) {
360- errorsReport . error (
361- `Found duplicate ${ memberType } '${ name } ' in ${ ctx . parent . type } '${ ctx . parent . name } ' in cube '${ ctx . cubeName } '.`
362- ) ;
363- } else {
364- errorsReport . error (
365- `Member names must be unique within a cube. Found duplicate ${ memberType } '${ name } ' in cube '${ ctx . cubeName } '.`
366- ) ;
367- }
350+ this . checkDuplicateNames ( yamlArray , errorsReport , ( name ) => {
351+ if ( ctx . parent ) {
352+ return `Found duplicate ${ memberType } '${ name } ' in ${ ctx . parent . type } '${ ctx . parent . name } ' in cube '${ ctx . cubeName } '.` ;
368353 }
369354
370- seen . add ( name ) ;
371- }
355+ return `Member names must be unique within a cube. Found duplicate ${ memberType } ' ${ name } ' in cube ' ${ ctx . cubeName } '.` ;
356+ } ) ;
372357
373- const remapped = yamlArray . map ( ( { name, indexes, granularities, ...rest } ) => {
358+ const remapped = yamlArray . map ( ( { name, indexes, granularities, timeShift , ...rest } ) => {
374359 if ( ! name ) {
375360 errorsReport . error ( `name isn't defined for ${ memberType } : ${ JSON . stringify ( rest ) } ` ) ;
376361 return { } ;
@@ -393,7 +378,18 @@ export class YamlCompiler {
393378 res [ name ] = { granularities, ...res [ name ] } ;
394379 }
395380
381+ if ( timeShift ) {
382+ this . checkDuplicateNames (
383+ timeShift ,
384+ errorsReport ,
385+ ( shiftName ) => `Time shift names must be unique within a ${ memberType } . Found duplicate time shift '${ shiftName } ' in ${ memberType } '${ name } ' in cube '${ ctx . cubeName } '.`
386+ ) ;
387+
388+ res [ name ] = { timeShift, ...res [ name ] } ;
389+ }
390+
396391 res [ name ] = { ...res [ name ] , ...rest } ;
392+
397393 return res ;
398394 } ) ;
399395
0 commit comments