1515using Castle . MicroKernel . Registration ;
1616using Castle . Windsor ;
1717
18+ using CluedIn . Connector . AzureDataLake ;
1819using CluedIn . Connector . AzureDataLake . Connector ;
1920using CluedIn . Connector . DataLake . Common ;
2021using CluedIn . Core ;
3233using CsvHelper . Configuration ;
3334
3435using Microsoft . Data . SqlClient ;
36+ using Microsoft . Data . SqlClient . Server ;
3537using Microsoft . Extensions . Internal ;
3638using Microsoft . Extensions . Logging ;
3739
@@ -626,9 +628,22 @@ public async Task VerifyStoreData_Sync_WithStreamCacheAndCsvFormat()
626628 }
627629
628630 [ Fact ]
629- public async Task VerifyStoreData_Sync_WithStreamCacheAndParquetFormat ( )
631+ public async Task VerifyStoreData_Sync_WithStreamCacheAndParquetFormatUnescaped ( )
630632 {
631- await VerifyStoreData_Sync_WithStreamCache ( "pArQuet" , AssertParquetResult ) ;
633+ await VerifyStoreData_Sync_WithStreamCache ( "pArQuet" , AssertParquetResultUnescaped ) ;
634+ }
635+
636+ [ Fact ]
637+ public async Task VerifyStoreData_Sync_WithStreamCacheAndParquetFormatWithEscaped ( )
638+ {
639+ await VerifyStoreData_Sync_WithStreamCache (
640+ "pArQuet" ,
641+ AssertParquetResultEscaped ,
642+ configureAuthentication : ( values ) =>
643+ {
644+ values . Add ( nameof ( DataLakeConstants . ShouldEscapeVocabularyKeys ) , true ) ;
645+ values . Add ( nameof ( DataLakeConstants . ShouldWriteGuidAsString ) , true ) ;
646+ } ) ;
632647 }
633648
634649 [ Fact ]
@@ -806,7 +821,8 @@ private async Task VerifyStoreData_Sync_WithStreamCache(
806821 string format ,
807822 Func < DataLakeFileClient , Task > assertMethod ,
808823 Func < ExecuteExportArg , Task < PathItem > > executeExport = null ,
809- Action < Mock < IDateTimeOffsetProvider > > configureTimeProvider = null )
824+ Action < Mock < IDateTimeOffsetProvider > > configureTimeProvider = null ,
825+ Action < Dictionary < string , object > > configureAuthentication = null )
810826 {
811827 var organizationId = Guid . NewGuid ( ) ;
812828 var providerDefinitionId = Guid . Parse ( "c444cda8-d9b5-45cc-a82d-fef28e08d55c" ) ;
@@ -890,7 +906,7 @@ private async Task VerifyStoreData_Sync_WithStreamCache(
890906 var directoryName = $ "xunit-{ DateTime . Now . Ticks } ";
891907
892908 var connectorConnectionMock = new Mock < IConnectorConnectionV2 > ( ) ;
893- connectorConnectionMock . Setup ( x => x . Authentication ) . Returns ( new Dictionary < string , object > ( )
909+ var authenticationValues = new Dictionary < string , object > ( )
894910 {
895911 { nameof ( AzureDataLakeConstants . AccountName ) , accountName } ,
896912 { nameof ( AzureDataLakeConstants . AccountKey ) , accountKey } ,
@@ -900,7 +916,10 @@ private async Task VerifyStoreData_Sync_WithStreamCache(
900916 { nameof ( DataLakeConstants . StreamCacheConnectionString ) , streamCacheConnectionString } ,
901917 { nameof ( DataLakeConstants . OutputFormat ) , format } ,
902918 { nameof ( DataLakeConstants . UseCurrentTimeForExport ) , true } ,
903- } ) ;
919+ } ;
920+ configureAuthentication ? . Invoke ( authenticationValues ) ;
921+
922+ connectorConnectionMock . Setup ( x => x . Authentication ) . Returns ( authenticationValues ) ;
904923
905924 var azureDataLakeClient = new AzureDataLakeClient ( ) ;
906925 var jobDataFactory = new Mock < AzureDataLakeJobDataFactory > ( ) ;
@@ -1264,7 +1283,17 @@ private async Task AssertCsvResult(DataLakeFileClient fileClient)
12641283 Assert . Equal ( sb . ToString ( ) , content ) ;
12651284 }
12661285
1267- private async Task AssertParquetResult ( DataLakeFileClient fileClient )
1286+ private Task AssertParquetResultUnescaped ( DataLakeFileClient fileClient )
1287+ {
1288+ return AssertParquetResult ( fileClient , "." ) ;
1289+ }
1290+
1291+ private Task AssertParquetResultEscaped ( DataLakeFileClient fileClient )
1292+ {
1293+ return AssertParquetResult ( fileClient , "_" ) ;
1294+ }
1295+
1296+ private async Task AssertParquetResult ( DataLakeFileClient fileClient , string separator )
12681297 {
12691298 using var memoryStream = new MemoryStream ( ) ;
12701299 await fileClient . ReadToAsync ( memoryStream ) ;
@@ -1300,32 +1329,30 @@ Name Jean Luc Picard
13001329 PersistVersion 1
13011330 ProviderDefinitionId c444cda8-d9b5-45cc-a82d-fef28e08d55c
13021331 Timestamp 2024-08-21T03:16:00.0000000+05:00
1303- user_age 123
1304- user_dobInDateTime 2000-01-02T03:04:05
1305- user_dobInDateTimeOffset 2000-01-02T03:04:05+12:34
1306- user_lastName Picard
1332+ user {{{ separator }}} age 123
1333+ user {{{ separator }}} dobInDateTime 2000-01-02T03:04:05
1334+ user {{{ separator }}} dobInDateTimeOffset 2000-01-02T03:04:05+12:34
1335+ user {{{ separator }}} lastName Picard
13071336
13081337 """ , sb . ToString ( ) ) ;
13091338
13101339 object getValue ( Parquet . Data . DataColumn dataColumn )
13111340 {
1312- if ( dataColumn . Field . ClrType == typeof ( Guid ) )
1313- return ( ( Guid [ ] ) dataColumn . Data ) [ 0 ] ;
1314- else if ( dataColumn . Field . ClrType == typeof ( int ) )
1315- {
1316- if ( dataColumn . Field . IsNullable )
1317- return ( ( int ? [ ] ) dataColumn . Data ) [ 0 ] ;
1341+ var type = dataColumn . Field . ClrType ;
13181342
1319- return ( ( int [ ] ) dataColumn . Data ) [ 0 ] ;
1343+ if ( type == typeof ( Guid ) )
1344+ {
1345+ return getValueFromArray < Guid ? , Guid > ( dataColumn ) ;
13201346 }
1321- else if ( dataColumn . Field . ClrType == typeof ( long ) )
1347+ else if ( type == typeof ( int ) )
13221348 {
1323- if ( dataColumn . Field . IsNullable )
1324- return ( ( long ? [ ] ) dataColumn . Data ) [ 0 ] ;
1325-
1326- return ( ( long [ ] ) dataColumn . Data ) [ 0 ] ;
1349+ return getValueFromArray < int ? , int > ( dataColumn ) ;
13271350 }
1328- else if ( dataColumn . Field . ClrType == typeof ( string ) )
1351+ else if ( type == typeof ( long ) )
1352+ {
1353+ return getValueFromArray < long ? , long > ( dataColumn ) ;
1354+ }
1355+ else if ( type == typeof ( string ) )
13291356 {
13301357 var value = ( ( string [ ] ) dataColumn . Data ) ;
13311358
@@ -1337,9 +1364,15 @@ object getValue(Parquet.Data.DataColumn dataColumn)
13371364
13381365 throw new NotSupportedException ( $ "Type { dataColumn . Field . ClrType } not supported.") ;
13391366 }
1340- }
13411367
1368+ object getValueFromArray < TNullable , TNonNullable > ( Parquet . Data . DataColumn dataColumn )
1369+ {
1370+ if ( dataColumn . Field . IsNullable )
1371+ return ( ( TNullable [ ] ) dataColumn . Data ) [ 0 ] ;
13421372
1373+ return ( ( TNonNullable [ ] ) dataColumn . Data ) [ 0 ] ;
1374+ }
1375+ }
13431376
13441377 private static async Task WaitForFileToBeDeleted ( string fileSystemName , string directoryName , DataLakeServiceClient client , PathItem path )
13451378 {
0 commit comments