Merge pull request 'chore: deploy initial linqpad queries' (#1) from feature/linqpad-queries into main

Reviewed-on: bermudalamb/linqpad#1
This commit was merged in pull request #1.
This commit is contained in:
2026-05-12 11:34:32 -05:00
120 changed files with 22939 additions and 0 deletions
+566
View File
@@ -0,0 +1,566 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
var data = @"CaseTypeFamily Name SkipICD ICD10Code MSDRGCode
M-420 1 Cervical Level Anterior Approach FALSE 0RG0070 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG00A0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG00J0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG00K0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG0370 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG03A0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG03J0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG03K0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG0470 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG04A0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG04J0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG04K0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG1070 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG10A0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG10J0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG10K0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG1370 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG13A0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG13J0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG13K0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG1470 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG14A0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG14J0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG14K0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG4070 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG40A0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG40J0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG40K0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG4370 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG43A0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG43J0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG43K0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG4470 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG44A0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG44J0 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG44K0 471
M-421 1 Cervical Level Open Approach FALSE XRG0092 471
M-421 1 Cervical Level Open Approach FALSE XRG00F3 471
M-421 1 Cervical Level Open Approach FALSE XRG1092 471
M-421 1 Cervical Level Open Approach FALSE XRG10F3 471
M-421 1 Cervical Level Open Approach FALSE XRG4092 471
M-421 1 Cervical Level Open Approach FALSE XRG40F3 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG0071 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG007J 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG00AJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG00J1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG00JJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG00K1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG00KJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG0371 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG037J 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG03AJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG03J1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG03JJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG03K1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG03KJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG0471 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG047J 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG04AJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG04J1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG04JJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG04K1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG04KJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG1071 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG107J 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG10AJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG10J1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG10JJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG10K1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG10KJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG1371 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG137J 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG13AJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG13J1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG13JJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG13K1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG13KJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG1471 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG147J 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG14AJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG14J1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG14JJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG14K1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG14KJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG4071 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG407J 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG40AJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG40J1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG40JJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG40K1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG40KJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG4371 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG437J 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG43AJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG43J1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG43JJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG43K1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG43KJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG4471 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG447J 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG44AJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG44J1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG44JJ 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG44K1 471
M-422 1 Cervical Level Posterior Approach FALSE 0RG44KJ 471
M-423 2+ Cervical Level Anterior Approach FALSE 0RG2070 471
M-423 2+ Cervical Level Anterior Approach FALSE 0RG20A0 471
M-423 2+ Cervical Level Anterior Approach FALSE 0RG20J0 471
M-423 2+ Cervical Level Anterior Approach FALSE 0RG20K0 471
M-423 2+ Cervical Level Anterior Approach FALSE 0RG2370 471
M-423 2+ Cervical Level Anterior Approach FALSE 0RG23A0 471
M-423 2+ Cervical Level Anterior Approach FALSE 0RG23J0 471
M-423 2+ Cervical Level Anterior Approach FALSE 0RG23K0 471
M-423 2+ Cervical Level Anterior Approach FALSE 0RG2470 471
M-423 2+ Cervical Level Anterior Approach FALSE 0RG24A0 471
M-423 2+ Cervical Level Anterior Approach FALSE 0RG24J0 471
M-423 2+ Cervical Level Anterior Approach FALSE 0RG24K0 471
M-424 2+ Cervical Level Open Approach FALSE XRG2092 471
M-424 2+ Cervical Level Open Approach FALSE XRG20F3 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG2071 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG207J 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG20AJ 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG20J1 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG20JJ 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG20K1 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG20KJ 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG2371 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG237J 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG23AJ 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG23J1 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG23JJ 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG23K1 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG23KJ 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG2471 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG247J 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG24AJ 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG24J1 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG24JJ 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG24K1 471
M-425 2+ Cervical Level Posterior Approach FALSE 0RG24KJ 471
M-420 1 Cervical Level Anterior Approach FALSE 0RG0070 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG00A0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG00J0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG00K0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG0370 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG03A0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG03J0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG03K0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG0470 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG04A0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG04J0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG04K0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG1070 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG10A0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG10J0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG10K0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG1370 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG13A0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG13J0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG13K0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG1470 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG14A0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG14J0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG14K0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG4070 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG40A0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG40J0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG40K0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG4370 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG43A0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG43J0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG43K0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG4470 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG44A0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG44J0 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG44K0 472
M-421 1 Cervical Level Open Approach FALSE XRG0092 472
M-421 1 Cervical Level Open Approach FALSE XRG00F3 472
M-421 1 Cervical Level Open Approach FALSE XRG1092 472
M-421 1 Cervical Level Open Approach FALSE XRG10F3 472
M-421 1 Cervical Level Open Approach FALSE XRG4092 472
M-421 1 Cervical Level Open Approach FALSE XRG40F3 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG0071 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG007J 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG00AJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG00J1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG00JJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG00K1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG00KJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG0371 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG037J 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG03AJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG03J1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG03JJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG03K1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG03KJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG0471 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG047J 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG04AJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG04J1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG04JJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG04K1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG04KJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG1071 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG107J 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG10AJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG10J1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG10JJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG10K1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG10KJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG1371 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG137J 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG13AJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG13J1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG13JJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG13K1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG13KJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG1471 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG147J 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG14AJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG14J1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG14JJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG14K1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG14KJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG4071 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG407J 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG40AJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG40J1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG40JJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG40K1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG40KJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG4371 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG437J 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG43AJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG43J1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG43JJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG43K1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG43KJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG4471 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG447J 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG44AJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG44J1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG44JJ 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG44K1 472
M-422 1 Cervical Level Posterior Approach FALSE 0RG44KJ 472
M-423 2+ Cervical Level Anterior Approach FALSE 0RG2070 472
M-423 2+ Cervical Level Anterior Approach FALSE 0RG20A0 472
M-423 2+ Cervical Level Anterior Approach FALSE 0RG20J0 472
M-423 2+ Cervical Level Anterior Approach FALSE 0RG20K0 472
M-423 2+ Cervical Level Anterior Approach FALSE 0RG2370 472
M-423 2+ Cervical Level Anterior Approach FALSE 0RG23A0 472
M-423 2+ Cervical Level Anterior Approach FALSE 0RG23J0 472
M-423 2+ Cervical Level Anterior Approach FALSE 0RG23K0 472
M-423 2+ Cervical Level Anterior Approach FALSE 0RG2470 472
M-423 2+ Cervical Level Anterior Approach FALSE 0RG24A0 472
M-423 2+ Cervical Level Anterior Approach FALSE 0RG24J0 472
M-423 2+ Cervical Level Anterior Approach FALSE 0RG24K0 472
M-424 2+ Cervical Level Open Approach FALSE XRG2092 472
M-424 2+ Cervical Level Open Approach FALSE XRG20F3 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG2071 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG207J 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG20AJ 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG20J1 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG20JJ 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG20K1 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG20KJ 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG2371 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG237J 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG23AJ 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG23J1 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG23JJ 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG23K1 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG23KJ 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG2471 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG247J 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG24AJ 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG24J1 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG24JJ 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG24K1 472
M-425 2+ Cervical Level Posterior Approach FALSE 0RG24KJ 472
M-420 1 Cervical Level Anterior Approach FALSE 0RG0070 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG00A0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG00J0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG00K0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG0370 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG03A0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG03J0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG03K0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG0470 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG04A0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG04J0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG04K0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG1070 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG10A0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG10J0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG10K0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG1370 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG13A0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG13J0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG13K0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG1470 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG14A0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG14J0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG14K0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG4070 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG40A0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG40J0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG40K0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG4370 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG43A0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG43J0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG43K0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG4470 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG44A0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG44J0 473
M-420 1 Cervical Level Anterior Approach FALSE 0RG44K0 473
M-421 1 Cervical Level Open Approach FALSE XRG0092 473
M-421 1 Cervical Level Open Approach FALSE XRG00F3 473
M-421 1 Cervical Level Open Approach FALSE XRG1092 473
M-421 1 Cervical Level Open Approach FALSE XRG10F3 473
M-421 1 Cervical Level Open Approach FALSE XRG4092 473
M-421 1 Cervical Level Open Approach FALSE XRG40F3 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG0071 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG007J 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG00AJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG00J1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG00JJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG00K1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG00KJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG0371 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG037J 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG03AJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG03J1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG03JJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG03K1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG03KJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG0471 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG047J 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG04AJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG04J1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG04JJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG04K1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG04KJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG1071 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG107J 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG10AJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG10J1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG10JJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG10K1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG10KJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG1371 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG137J 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG13AJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG13J1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG13JJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG13K1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG13KJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG1471 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG147J 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG14AJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG14J1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG14JJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG14K1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG14KJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG4071 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG407J 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG40AJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG40J1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG40JJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG40K1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG40KJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG4371 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG437J 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG43AJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG43J1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG43JJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG43K1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG43KJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG4471 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG447J 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG44AJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG44J1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG44JJ 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG44K1 473
M-422 1 Cervical Level Posterior Approach FALSE 0RG44KJ 473
M-423 2+ Cervical Level Anterior Approach FALSE 0RG2070 473
M-423 2+ Cervical Level Anterior Approach FALSE 0RG20A0 473
M-423 2+ Cervical Level Anterior Approach FALSE 0RG20J0 473
M-423 2+ Cervical Level Anterior Approach FALSE 0RG20K0 473
M-423 2+ Cervical Level Anterior Approach FALSE 0RG2370 473
M-423 2+ Cervical Level Anterior Approach FALSE 0RG23A0 473
M-423 2+ Cervical Level Anterior Approach FALSE 0RG23J0 473
M-423 2+ Cervical Level Anterior Approach FALSE 0RG23K0 473
M-423 2+ Cervical Level Anterior Approach FALSE 0RG2470 473
M-423 2+ Cervical Level Anterior Approach FALSE 0RG24A0 473
M-423 2+ Cervical Level Anterior Approach FALSE 0RG24J0 473
M-423 2+ Cervical Level Anterior Approach FALSE 0RG24K0 473
M-424 2+ Cervical Level Open Approach FALSE XRG2092 473
M-424 2+ Cervical Level Open Approach FALSE XRG20F3 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG2071 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG207J 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG20AJ 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG20J1 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG20JJ 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG20K1 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG20KJ 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG2371 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG237J 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG23AJ 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG23J1 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG23JJ 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG23K1 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG23KJ 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG2471 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG247J 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG24AJ 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG24J1 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG24JJ 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG24K1 473
M-425 2+ Cervical Level Posterior Approach FALSE 0RG24KJ 473";
var rows = data.Split("\n".ToCharArray())
.Skip(1)
.ToList()
.ConvertAll(d => new NewCaseTypeFamilyMapping(d.Trim("\r".ToCharArray()).Split('\t')))
.GroupBy(d => d.CaseTypeFamily, (key, info) => new
{
CaseTypeFamily = key,
data = info.ToList(),
sql = info.Aggregate(new StringBuilder($@"
SELECT @CaseTypeFamilyID = ctf.CaseTypeFamilyID
FROM dss.CaseTypeFamily AS ctf
WHERE ctf.CaseTypeFamilyGlobalID = '{key}'
INSERT INTO dss.CaseTypeFamilyMappingICD10 ( CaseTypeFamilyID, SkipICD, ICD10Code, MSDRGCode, CaseTypeFamilyVersionID )
VALUES
"),
(x, y) => x.AppendLine(y.ToString())).ToString().TrimEnd(new[] { '\r', '\n', ',' }),
rollback = $@"DELETE FROM dss.CaseTypeFamilyMappingICD10
WHERE EXISTS(SELECT 1 FROM dss.CaseTypeFamily AS ctf
WHERE ctf.CaseTypeFamilyGlobalID = '{key}' and CaseTypeFamilyMappingICD10.CaseTypeFamilyID = ctf.CaseTypeFamilyID AND CaseTypeFamilyVersionID = 1)
DELETE FROM dss.CaseTypeFamily WHERE CaseTypeFamilyGlobalID = '{key}'
"
});
var sqlScript = $@"--Author: tlamb
--Version: 2019.42
--Forward
DELETE
FROM dss.CaseTypeFamilyMappingICD10
WHERE EXISTS(SELECT 1
FROM dss.CaseTypeFamily AS ctf
WHERE ctf.CaseTypeFamilyID = CaseTypeFamilyMappingICD10.CaseTypeFamilyID AND ctf.CaseTypeFamilyGlobalID = 'M-61')
AND CaseTypeFamilyMappingICD10.MSDRGCode IN('471','472','473')
AND CaseTypeFamilyMappingICD10.SkipICD = 1
AND CaseTypeFamilyMappingICD10.CaseTypeFamilyVersionID = 1
INSERT INTO dss.CaseTypeFamily(CaseTypeFamilyGUID, Name, CaseTypeFamilyGlobalID)
VALUES(NEWID(), '1 Cervical Level Anterior Approach', 'M-420'),
(NEWID(), '1 Cervical Level Open Approach', 'M-421'),
(NEWID(), '1 Cervical Level Posterior Approach', 'M-422'),
(NEWID(), '2+ Cervical Level Anterior Approach', 'M-423'),
(NEWID(), '2+ Cervical Level Open Approach', 'M-424'),
(NEWID(), '2+ Cervical Level Posterior Approach', 'M-425')
DECLARE @CaseTypeFamilyID INT
{string.Join("\r\n", rows.Select(r => r.sql))}
--Rollback
{string.Join("\r\n", rows.Select(r => r.rollback))}";
sqlScript.Dump("script");
File.WriteAllText(@"D:\git\2019-10-01-11-14 B-24302 UV Case Type Family Updates.sql", sqlScript);
rows.Dump();
// var sql = rows.Aggregate(new StringBuilder("DECLARE @CaseTypeFamilyID INT"),
// (x, y) => x.AppendLine(
// data.Aggregate(new StringBuilder($"SELECT @CaseTypeFamilyID = ctf.CaseTypeFamilyID FROM dss.CaseTypeFamily AS ctf WHERE ctf.CaseTypeFamilyGlobalID = '{y.CaseTypeFamily}'"),
// (a, b) => a.AppendLine(b.ToString())).ToString())).ToString();
// sql.Dump();
}
// Define other methods and classes here
public class NewCaseTypeFamilyMapping
{
public string CaseTypeFamily { get; set; }
public string Name { get; set; }
internal bool bSkipICD { get; set; }
public int SkipICD => bSkipICD ? 1 : 0;
public string ICD10Code { get; set; }
public string MSDRGCode { get; set; }
public NewCaseTypeFamilyMapping(string[] data)
{
if (data.Length != 5)
throw new ArgumentException(nameof(data));
CaseTypeFamily = data[0];
Name = data[1];
bSkipICD = bool.Parse(data[2]);
ICD10Code = data[3];
MSDRGCode = data[4];
}
public override string ToString()
{
//return $"\t(@CaseTypeFamilyID, '{Name}', {SkipICD}, '{ICD10Code}', '{MSDRGCode}', 1),";
return $"\t(@CaseTypeFamilyID, {SkipICD}, '{ICD10Code}', '{MSDRGCode}', 1),";
}
}
+220
View File
@@ -0,0 +1,220 @@
<Query Kind="Program">
<Connection>
<ID>4f885e7e-d8bb-427c-a54e-8e3e1c3137a7</ID>
<Persist>true</Persist>
<Server>IOAK-SQL-LOG-01.sdt.local</Server>
<Database>jazz log prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
public static string PrimaryUrl => "Opportunities.aspx";
public static string UrlGroup => "/CCI";
public static DateTime cutoff { get; set; } = DateTime.Now.AddDays((((int)DateTime.Now.DayOfWeek) * -1) + 1).Date;
void Main()
{
RunTimings();
}
public void RunTimings()
{
cutoff = DateTime.Now.AddDays(-30);
var timings = GetTimings(cutoff)
.Where(t => t.Key.Group == 0 && t.Data.Any());
var outliers = timings.SelectMany(t => t.Data.Where(d => d.ClientTimeData / 1000.0d > 4.0d));
outliers.Dump(nameof(outliers));
timings
.OrderByDescending(t => t.Key.ClientTimeMax > 4 ? t.Key.ClientTimeMax : 0)
.ThenBy(t => t.Key.Group)
.ThenBy(t => t.Key.Url.Contains(PrimaryUrl) ? "!" : t.Key.Url)
.ThenBy(t => t.Key.Application)
.ThenByDescending(t => t.Key.Date)
.ThenBy(t => t.Key.Browser.StartsWith("IE") ? 0 : 1)
.Dump();
}
public IEnumerable<MetricData> GetTimings(DateTime cutoff)
{
return from log in Archive_PageLogs
where (log.Url.StartsWith(UrlGroup))
&& log.DateTimeStamp > cutoff
group log by new { Group = (log.UserName.StartsWith("sdt\\") ? 1 : 0), log.Url, log.Browser, Date = log.DateTimeStamp.Value.Date, log.Application } into grp
//join dbs in ViewActiveDatabases on grp.FirstOrDefault().DatabaseGuid equals dbs.DatabaseGUID
orderby grp.Key.Group, (grp.FirstOrDefault().ClientTime / 1000) descending, grp.Key.Date descending
select new MetricData
{
Key = new MetricKey
{
Application = grp.Key.Application,
Group = grp.Key.Group,
Url = grp.Key.Url,
Browser = grp.Key.Browser,
Date = grp.Key.Date,
ClientTimeAvg = grp.ToList().Average(g => (g.ClientTime / 1000.0d)) ?? 0.0d,
ClientTimeMin = grp.ToList().Min(g1 => (g1.ClientTime / 1000.0d)) ?? 0.0d,
ClientTimeMax = grp.ToList().Max(g1 => (g1.ClientTime / 1000.0d)) ?? 0.0d,
Count = grp.ToList().Count
},
Data = grp
.Select(g => new Metric(g.DatabaseGuid.Value, ViewActiveDatabases)
{
UrlParams = g.UrlParams,
UserName = g.UserName,
WebServer = g.WebServer,
ServerTimeData = g.ServerTime ?? 0,
ClientTimeData = g.ClientTime ?? 0,
DatabaseName = g.DatabaseName,
ClientTime = g.ClientTime ?? 0 / 1000.0d,
ClientTimeAvg = grp.ToList().Average(g1 => g1.ClientTime ?? 0.0d / 1000.0d),
ClientTimeMin = grp.ToList().Min(g1 => g1.ClientTime ?? 0.0d / 1000.0d),
ClientTimeMax = grp.ToList().Max(g1 => g1.ClientTime ?? 0.0d / 1000.0d)
}).Where(x => (x.ClientTimeData / 1000.0d) > x.ClientTimeAvg || ((x.ClientTimeData / 1000.0d) > 4.0d))
};
}
// Define other methods and classes here
public class Metric
{
public double ClientTime { get; set; }
public double ClientTimeData { get; set; }
public double ClientTimeAvg { get; set; }
public double ClientTimeMin { get; set; }
public double ClientTimeMax { get; set; }
public string WebServer { get; set; }
public string PhysicalName { get; set; }
public Guid DatabaseGuid { get; set; }
public string DatabaseName { get; set; }
public string UserName { get; set; }
public string UrlParams { get; set; }
public int ServerTimeData { get; set; }
public string OrgPin { get; set; }
public Metric()
{
}
public Metric(Guid databaseGuid, Table<ViewActiveDatabases> activeDatabases)
{
DatabaseGuid = databaseGuid;
var activeDatabase = activeDatabases.SingleOrDefault(vad => vad.DatabaseGUID == databaseGuid);
PhysicalName = activeDatabase?.PhysicalName ?? string.Empty;
OrgPin = activeDatabase?.OrgPin ?? string.Empty;
}
object ToDump() => new
{
ClientTimeMax = new XElement("LINQPad.HTML",
new XElement("div",
new XAttribute("align", "right"),
new XAttribute("style", $"background-color:{(ClientTimeMax > 4.0d ? "red" : (ClientTimeAvg < (ClientTimeData / 1000.0d)) ? "violet" : "white")};"),
$"{ClientTimeMax:n}".PadLeft(10))),
ClientTimeAvg,
ClientTimeMin,
WebServer,
OrgPin,
DatabaseName,
PhysicalName,
UserName,
UrlParams,
ServerTime = $"{ServerTimeData:n0}".PadLeft(10)
};
}
public class MetricKey
{
public string Application { get; set; }
public int Group { get; set; }
public string Browser { get; set; }
public string Url { get; set; }
//public int UrlLength { get; set; }
public DateTime Date { get; set; }
public double ClientTimeAvg { get; set; }
public double ClientTimeMin { get; set; }
public double ClientTimeMax { get; set; }
public int Count { get; set; }
object ToDump() => new
{
Application,
GroupName = Group == 0 ? "Clients" : "Strata",
Browser,
URL = Url, //.PadRight(UrlLength),
OnDate = Date.ToShortDateString(),
Avg_ClientTime = $"{ClientTimeAvg:N2}",
Min_ClientTime = $"{ClientTimeMin:N2}",
Max_ClientTime = $"{ClientTimeMax:N2}",
Count
};
}
public class MetricData
{
public MetricKey Key { get; set; }
public IEnumerable<Metric> Data { get; set; }
object ToDump() => new
{
Group = Key,
Statistics = Data
.OrderBy(d => d.WebServer)
.ThenBy(d => d.DatabaseName)
.ThenBy(d => d.UserName)
.ThenBy(d => d.ClientTimeData)
};
}
@@ -0,0 +1,79 @@
<Query Kind="Program" />
void Main()
{
var pom = new PayrollOpportunityMetric
{
BaselineMonth01Dollars = 1.0m,
ActualMonth03Dollars = 1.0m,
CommittedMonth06Dollars = 1.0m
};
pom.BaselineDollars().Dump();
pom.ActualDollars().Dump();
pom.CommittedDollars().Dump();
}
// Define other methods and classes here
public class PayrollOpportunityMetric
{
public decimal BaselineMonth01Dollars { get; set; } = 0.0m;
public decimal BaselineMonth02Dollars { get; set; } = 0.0m;
public decimal BaselineMonth03Dollars { get; set; } = 0.0m;
public decimal BaselineMonth04Dollars { get; set; } = 0.0m;
public decimal BaselineMonth05Dollars { get; set; } = 0.0m;
public decimal BaselineMonth06Dollars { get; set; } = 0.0m;
public decimal BaselineMonth07Dollars { get; set; } = 0.0m;
public decimal BaselineMonth08Dollars { get; set; } = 0.0m;
public decimal BaselineMonth09Dollars { get; set; } = 0.0m;
public decimal BaselineMonth10Dollars { get; set; } = 0.0m;
public decimal BaselineMonth11Dollars { get; set; } = 0.0m;
public decimal BaselineMonth12Dollars { get; set; } = 0.0m;
public decimal ActualMonth01Dollars { get; set; } = 0.0m;
public decimal ActualMonth02Dollars { get; set; } = 0.0m;
public decimal ActualMonth03Dollars { get; set; } = 0.0m;
public decimal ActualMonth04Dollars { get; set; } = 0.0m;
public decimal ActualMonth05Dollars { get; set; } = 0.0m;
public decimal ActualMonth06Dollars { get; set; } = 0.0m;
public decimal ActualMonth07Dollars { get; set; } = 0.0m;
public decimal ActualMonth08Dollars { get; set; } = 0.0m;
public decimal ActualMonth09Dollars { get; set; } = 0.0m;
public decimal ActualMonth10Dollars { get; set; } = 0.0m;
public decimal ActualMonth11Dollars { get; set; } = 0.0m;
public decimal ActualMonth12Dollars { get; set; } = 0.0m;
public decimal CommittedMonth01Dollars { get; set; } = 0.0m;
public decimal CommittedMonth02Dollars { get; set; } = 0.0m;
public decimal CommittedMonth03Dollars { get; set; } = 0.0m;
public decimal CommittedMonth04Dollars { get; set; } = 0.0m;
public decimal CommittedMonth05Dollars { get; set; } = 0.0m;
public decimal CommittedMonth06Dollars { get; set; } = 0.0m;
public decimal CommittedMonth07Dollars { get; set; } = 0.0m;
public decimal CommittedMonth08Dollars { get; set; } = 0.0m;
public decimal CommittedMonth09Dollars { get; set; } = 0.0m;
public decimal CommittedMonth10Dollars { get; set; } = 0.0m;
public decimal CommittedMonth11Dollars { get; set; } = 0.0m;
public decimal CommittedMonth12Dollars { get; set; } = 0.0m;
}
public static class PayrollOpportunityMetricExtensions
{
public static IEnumerable<decimal> BaselineDollars(this PayrollOpportunityMetric pom) =>
typeof(PayrollOpportunityMetric)
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(p => p.Name.StartsWith("BaselineMonth") && p.Name.EndsWith("Dollars"))
.Select(dp => (decimal) dp.GetValue(pom, null));
public static IEnumerable<decimal> ActualDollars(this PayrollOpportunityMetric pom) =>
typeof(PayrollOpportunityMetric)
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(p => p.Name.StartsWith("ActualMonth") && p.Name.EndsWith("Dollars"))
.Select(dp => (decimal)dp.GetValue(pom, null));
public static IEnumerable<decimal> CommittedDollars(this PayrollOpportunityMetric pom) =>
typeof(PayrollOpportunityMetric)
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(p => p.Name.StartsWith("CommittedMonth") && p.Name.EndsWith("Dollars"))
.Select(dp => (decimal)dp.GetValue(pom, null));
}
@@ -0,0 +1,96 @@
<Query Kind="Program">
<Connection>
<ID>77b65bea-e766-4e3c-a1ed-c4c2534b6019</ID>
<Persist>true</Persist>
<Server>D0001-SQL-11.sdt.local</Server>
<Database>jazz dev master Prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
DimTimeClasses.Dump();
var factList = from fact in FactOpportunityMetrics.ToList()
join fm in DimFiscalMonths.ToList() on fact.FiscalMonthID equals fm.FiscalMonthID
join dtc in DimTimeClasses.ToList() on fact.TimeClassID equals dtc.TimeClassID
select new { fact, fm.SortOrder };
var updates =
(from f in factList //.Where(l => l.fact.TimeClassID != 5)
select new
{
f.fact,
AmountYTD = factList
.Where(l => l.fact.OpportunityGUID == f.fact.OpportunityGUID && l.fact.TimeClassID == f.fact.TimeClassID && l.fact.FiscalYearID == f.fact.FiscalYearID && l.SortOrder <= f.SortOrder)
.GroupBy(l => new { l.fact.OpportunityGUID, l.fact.TimeClassID, l.fact.FiscalYearID })
.Select(l => l.Sum(x => x.fact.Amount)).Single()
}).Where(r => r.AmountYTD != 0).OrderBy(r => r.fact.RowID).ToList();
foreach (var update in updates)
{
FactOpportunityMetrics.Where(fom => update.RowID == fom.RowID).ToList()
.ForEach(fact => fact.AmountYTD = update.AmountYTD);
FactOpportunityMetrics.Where(fom => update.RowID == fom.RowID).Dump();
}
SubmitChanges();
FactOpportunityMetrics.Where(fom => fom.AmountYTD != 0)
.Join(ViewOpportunity, f => f.OpportunityGUID, o => o.OpportunityGUID,
(f, o) => new { f.MetricName, f.TimeClassID, f.FiscalYearID, f.FiscalMonthID, f.Amount, f.AmountYTD, o.Name, o.OpportunityType }).Dump();
}
// Define other methods and classes here
+193
View File
@@ -0,0 +1,193 @@
<Query Kind="Program">
<Connection>
<ID>77b65bea-e766-4e3c-a1ed-c4c2534b6019</ID>
<Persist>true</Persist>
<Server>D0001-SQL-11.sdt.local</Server>
<Database>jazz dev master Prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>System.ComponentModel</Namespace>
</Query>
void Main()
{
var caseTypes = (from fpes in FactPatientEncounterSummaries
join ves in VariationEncounterSavings on fpes.EncounterID equals ves.EncounterID
join vo in VariationOpportunities on ves.OpportunityGUID equals vo.OpportunityGUID
join config in Configurations on vo.ConfigurationGUID equals config.ConfigurationGUID
join cte in CaseTypeEntities on vo.CaseTypeEntityID equals cte.CaseTypeEntityID
join dct in DimCaseTypes on cte.CaseTypeGUID equals dct.MemberGUID
join d in DimMSDRGs on fpes.ReportingDRGID equals d.MSDRGID into da
from e in da.DefaultIfEmpty()
join f in DimAPRDRGs on fpes.APDRGID equals f.APRDRGID into fa
from g in fa.DefaultIfEmpty()
join cpt in DimCPTs on fpes.PrimaryCPTID equals cpt.CPTID into cpta
from ca in cpta.DefaultIfEmpty()
where config.FiscalYearID == 2020
select new
{
vo.ConfigurationGUID,
config.FiscalYearID,
dct.CaseTypeId,
dct.Name,
CCMCCCategory = e.CCMCCCategory ?? "",
SOI = g.APRSOI ?? "",
ROM = g.APRROM ?? "",
CPTCode = ca.CPTCode ?? "",
CaseTypeConfig = JsonConvert.DeserializeObject<CaseTypeDRGConfiguration>(dct.CaseTypeConfigJSON)
})
.Distinct()
.Select(t => new
{
t.ConfigurationGUID,
t.FiscalYearID,
t.CaseTypeId,
t.Name,
t.CCMCCCategory,
t.SOI,
t.ROM,
t.CPTCode,
t.CaseTypeConfig.AgeCohortIDInclusions,
t.CaseTypeConfig.PhysicianIDExclusions,
t.CaseTypeConfig.StandardDeviationExcludedTypeEnum,
t.CaseTypeConfig.LengthOfStayThreshold,
t.CaseTypeConfig.SOIROMInclusions,
t.CaseTypeConfig.CCMCCCategories,
t.CaseTypeConfig.CPTCodes,
t.CaseTypeConfig.PatientTypeRollupIDInclusions,
t.CaseTypeConfig.PhysicianMinVolume
})
.OrderBy(t => t.Name);
caseTypes.Dump();
}
// Define other methods and classes here
public const string CCMCCCATEGORY_CC = "CC";
public const string CCMCCCATEGORY_MCC = "MCC";
public const string CCMCCCATEGORY_WO = "W/O";
public const string CCMCCCATEGORY_NA = "N/A";
public const string CCMCCCATEGORY_CCMCC = "CC/MCC";
public enum CCMCCCategoryTypes
{
/// <summary>
/// No Category
/// </summary>
[Description("")]
None,
/// <summary>
/// Complication or Comorbidity
/// </summary>
[Description(CCMCCCATEGORY_CC)]
CC,
/// <summary>
/// Major Complication or Comorbidity
/// </summary>
[Description(CCMCCCATEGORY_MCC)]
MCC,
/// <summary>
/// Without Complication or Comorbidity OR Major Complication or Comorbidity
/// </summary>
[Description(CCMCCCATEGORY_WO)]
WO,
/// <summary>
/// Not Available
/// </summary>
[Description(CCMCCCATEGORY_NA)]
NA,
/// <summary>
/// Both Complication or Comorbidity AND Major Complication or Comorbidity
/// </summary>
[Description(CCMCCCATEGORY_CCMCC)]
CCMCC
}
public class SOIROMInclusion
{
public string SOI { get; }
public string ROM { get; }
public SOIROMInclusion(string soi, string rom)
{
SOI = soi;
ROM = rom;
}
}
public class CaseTypeDRGConfiguration
{
public int PhysicianMinVolume { get; set; }
public List<int> AgeCohortIDInclusions { get; set; }
public List<int> PhysicianIDExclusions { get; set; }
public int StandardDeviationExcludedTypeEnum { get; set; }
public int LengthOfStayThreshold { get; set; }
public List<int> PatientTypeRollupIDInclusions { get; set; }
public List<SOIROMInclusion> SOIROMInclusions { get; set; }
public HashSet<CCMCCCategoryTypes> CCMCCCategories { get; set; }
public HashSet<string> CPTCodes { get; set; }
public CaseTypeDRGConfiguration()
{
PhysicianMinVolume = 0;
AgeCohortIDInclusions = new List<int>();
PhysicianIDExclusions = new List<int>();
PatientTypeRollupIDInclusions = new List<int>();
StandardDeviationExcludedTypeEnum = 0;
LengthOfStayThreshold = 0;
CCMCCCategories = new HashSet<CCMCCCategoryTypes>();
CPTCodes = new HashSet<string>();
}
}
+139
View File
@@ -0,0 +1,139 @@
<Query Kind="Program">
<Connection>
<ID>870a756b-af44-4db4-b004-58ff41318b3a</ID>
<Persist>true</Persist>
<Server>P9900-SQL-11.sdt.local</Server>
<Database>jazz tst GM DSS Share Training Master</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
private IEnumerable<VersionInfo> existing_versions;
private IEnumerable<string> existing_migrations;
private IEnumerable<FamilyInfo> existing_families;
private IEnumerable<MappingInfo> existing_mappings;
void Main()
{
Step1();
existing_migrations.Dump();
existing_versions.Dump();
existing_families.Count().Dump();
existing_mappings.Count().Dump();
var documentFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
File.WriteAllText(Path.Combine(documentFolder, $"{nameof(existing_migrations)}.json"), JsonConvert.SerializeObject(existing_migrations, Newtonsoft.Json.Formatting.Indented));
File.WriteAllText(Path.Combine(documentFolder, $"{nameof(existing_versions)}.json"), JsonConvert.SerializeObject(existing_versions, Newtonsoft.Json.Formatting.Indented));
File.WriteAllText(Path.Combine(documentFolder, $"{nameof(existing_families)}.json"), JsonConvert.SerializeObject(existing_families, Newtonsoft.Json.Formatting.Indented));
File.WriteAllText(Path.Combine(documentFolder, $"{nameof(existing_mappings)}.json"), JsonConvert.SerializeObject(existing_mappings, Newtonsoft.Json.Formatting.Indented));
}
// Define other methods and classes here
private void Step1()
{
existing_migrations = from ml in MigrationLogs where ml.DateTimeStamp > new DateTime(2018, 11, 16) && ml.Name.Replace(" ", "").Contains("CaseType") orderby ml.DateTimeStamp descending select ml.Name;
existing_versions = from ctfv in CaseTypeFamilyVersions select new VersionInfo(ctfv.CaseTypeFamilyVersionID, ctfv.Name, ctfv.StartDate, ctfv.EndDate);
existing_families = from ctf in CaseTypeFamilies select new FamilyInfo(ctf.CaseTypeFamilyGlobalID, ctf.Name, ctf.CaseTypeFamilyID);
existing_mappings = (from ctfm in CaseTypeFamilyMappingICD10s
join family in CaseTypeFamilies on ctfm.CaseTypeFamilyID equals family.CaseTypeFamilyID
where ctfm.CaseTypeFamilyVersionID == 1
select new MappingInfo(family.CaseTypeFamilyGlobalID, ctfm.SkipICD, ctfm.ICD10Code, ctfm.MSDRGCode)).Distinct();
}
public class VersionInfo
{
public int CaseTypeFamilyVersionId { get; set; }
public string Name { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public VersionInfo(int id, string name, DateTime start, DateTime end)
{
CaseTypeFamilyVersionId = id;
Name = name;
StartDate = start;
EndDate = end;
}
}
public class FamilyInfo
{
public int CaseTypeFamilyID { get; set; }
public string CaseTypeFamilyGlobalID { get; set; }
public string Name { get; set; }
public FamilyInfo(string caseTypeFamilyGlobalID, string name, int caseTypeFamilyID)
{
CaseTypeFamilyID = caseTypeFamilyID;
CaseTypeFamilyGlobalID = caseTypeFamilyGlobalID;
Name = name;
}
}
public class MappingInfo
{
public string CaseTypeFamilyGlobalID { get; set; }
public bool SkipICD { get; set; }
public string ICD10Code { get; set; }
public string MSDRGCode { get; set; }
public MappingInfo(string caseTypeFamilyGlobalID, bool skipICD, string icd10Code, string msdrgCode)
{
CaseTypeFamilyGlobalID = caseTypeFamilyGlobalID;
SkipICD = skipICD;
ICD10Code = icd10Code;
MSDRGCode = msdrgCode;
}
}
@@ -0,0 +1,286 @@
<Query Kind="Program">
<Connection>
<ID>870a756b-af44-4db4-b004-58ff41318b3a</ID>
<Persist>true</Persist>
<Server>P9900-SQL-11.sdt.local</Server>
<Database>jazz tst GM non DSS Share Training Master</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
private IEnumerable<VersionInfo> correct_versions;
private IEnumerable<string> correct_migrations;
private IEnumerable<FamilyInfo> correct_families;
private IEnumerable<MappingInfo> correct_mappings;
private IEnumerable<VersionInfo> existing_versions;
private IEnumerable<string> existing_migrations;
private IEnumerable<FamilyInfo> existing_families;
private IEnumerable<MappingInfo> existing_mappings;
void Main()
{
//var cts = Util.GetMyQueries().FirstOrDefault(u => u.FilePath.EndsWith("CaseTypeSource.linq"));
//var connStr = cts.GetConnectionInfo().DatabaseInfo.GetCxString();
Step1();
Step2();
var versions = (from cf in correct_versions
join ef in existing_versions on cf.CaseTypeFamilyVersionId equals ef.CaseTypeFamilyVersionId into cef
from ef in cef.DefaultIfEmpty()
select new { cf, ef }).ToList();
versions.Dump(nameof(versions));
var migrations = (from cf in correct_migrations
join ef in existing_migrations on cf equals ef into cef
from ef in cef.DefaultIfEmpty()
select new { cf, ef }).ToList();
var migrationDeletes = (from cf in existing_migrations
join ef in correct_migrations on cf equals ef into cef
from ef in cef.DefaultIfEmpty()
select new { cf, ef }).ToList();
var families = (from cf in correct_families
join ef in existing_families on cf.CaseTypeFamilyGlobalID equals ef.CaseTypeFamilyGlobalID into cef
from ef in cef.DefaultIfEmpty()
select new { cf, ef }).ToList();
var familyDeletes = (from cf in existing_families
join ef in correct_families on cf.CaseTypeFamilyGlobalID equals ef.CaseTypeFamilyGlobalID into cef
from ef in cef.DefaultIfEmpty()
select new { cf, ef }).ToList();
var mappings = (from cm in correct_mappings
join em in existing_mappings on new { cm.CaseTypeFamilyGlobalID, cm.SkipICD, cm.ICD10Code, cm.MSDRGCode }
equals new { em.CaseTypeFamilyGlobalID, em.SkipICD, em.ICD10Code, em.MSDRGCode } into cem
from em in cem.DefaultIfEmpty()
select new { cm, em }).ToList();
var mappingDeletes = (from cm in existing_mappings
join em in correct_mappings on new { cm.CaseTypeFamilyGlobalID, cm.SkipICD, cm.ICD10Code, cm.MSDRGCode }
equals new { em.CaseTypeFamilyGlobalID, em.SkipICD, em.ICD10Code, em.MSDRGCode } into cem
from em in cem.DefaultIfEmpty()
select new { cm, em }).ToList();
var documentFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var sql = versions.Where(f => f.ef == null)
.Aggregate(@"", (x, y) => $@"{x}
INSERT INTO [dss].[CaseTypeFamilyVersion] (CaseTypeFamilyVersionId, Name, StartDate, EndDate)
SELECT '{y.cf.CaseTypeFamilyVersionId}', '{y.cf.Name}', '{y.cf.StartDate:G}', '{y.cf.EndDate:G}'
WHERE NOT EXISTS (SELECT 1 FROM [dss].[CaseTypeFamilyVersion] WHERE CaseTypeFamilyVersionId = '{y.cf.CaseTypeFamilyVersionId}');
");
if (File.Exists(Path.Combine(documentFolder, $"Case Type Family Corrections 1 ({this.Connection.Database}).sql")))
File.Delete(Path.Combine(documentFolder, $"Case Type Family Corrections 1 ({this.Connection.Database}).sql"));
if (!string.IsNullOrEmpty(sql.Trim()))
File.WriteAllText(Path.Combine(documentFolder, $"Case Type Family Corrections 1 ({this.Connection.Database}).sql"), sql);
sql = versions.Where(f => f.ef != null
&& ((f.cf.Name != f.ef.Name
&& f.cf.Name.Replace("And", "&") != f.ef.Name
&& f.cf.Name.Replace(" And ", "&") != f.ef.Name)
|| (f.cf.StartDate != f.ef.StartDate)
|| (f.cf.EndDate != f.ef.EndDate)))
.Aggregate(@"", (x, y) => $@"{x}
UPDATE [dss].[CaseTypeFamilyVersion]
SET Name = '{y.cf.Name}', StartDate = '{y.cf.StartDate:G}', EndDate = '{y.cf.EndDate:G}'
WHERE CaseTypeFamilyVersionId = '{y.cf.CaseTypeFamilyVersionId}'; -- current name = {y.ef.Name}
");
if (File.Exists(Path.Combine(documentFolder, $"Case Type Family Corrections 2 ({this.Connection.Database}).sql")))
File.Delete(Path.Combine(documentFolder, $"Case Type Family Corrections 2 ({this.Connection.Database}).sql"));
if (!string.IsNullOrEmpty(sql.Trim()))
File.WriteAllText(Path.Combine(documentFolder, $"Case Type Family Corrections 2 ({this.Connection.Database}).sql"), sql);
sql = families.Where(f => f.ef == null)
.Aggregate(@"", (x, y) => $@"{x}
INSERT INTO [dss].[CaseTypeFamily] (CaseTypeFamilyGlobalID, Name)
SELECT '{y.cf.CaseTypeFamilyGlobalID}', '{y.cf.Name}'
WHERE NOT EXISTS (SELECT 1 FROM [dss].[CaseTypeFamily] WHERE CaseTypeFamilyGlobalID = '{y.cf.CaseTypeFamilyGlobalID}');
");
if (File.Exists(Path.Combine(documentFolder, $"Case Type Family Corrections 3 ({this.Connection.Database}).sql")))
File.Delete(Path.Combine(documentFolder, $"Case Type Family Corrections 3 ({this.Connection.Database}).sql"));
if (!string.IsNullOrEmpty(sql.Trim()))
File.WriteAllText(Path.Combine(documentFolder, $"Case Type Family Corrections 3 ({this.Connection.Database}).sql"), sql);
sql = families.Where(f => f.ef != null
&& (f.cf.Name != f.ef.Name
&& f.cf.Name.Replace("And", "&") != f.ef.Name
&& f.cf.Name.Replace(" And ", "&") != f.ef.Name))
.Aggregate(@"", (x, y) => $@"{x}
UPDATE [dss].[CaseTypeFamily]
SET Name = '{y.cf.Name}'
WHERE CaseTypeFamilyGlobalID = '{y.cf.CaseTypeFamilyGlobalID}'; -- current name = {y.ef.Name}
");
if (File.Exists(Path.Combine(documentFolder, $"Case Type Family Corrections 4 ({this.Connection.Database}).sql")))
File.Delete(Path.Combine(documentFolder, $"Case Type Family Corrections 4 ({this.Connection.Database}).sql"));
if (!string.IsNullOrEmpty(sql.Trim()))
File.WriteAllText(Path.Combine(documentFolder, $"Case Type Family Corrections 4 ({this.Connection.Database}).sql"), sql);
var insert = sql = mappings.Where(f => f.em == null).Any()
? @"INSERT INTO [dss].[CaseTypeFamilyMappingICD10] ([CaseTypeFamilyID], [SkipICD], [ICD10Code], [MSDRGCode], [CaseTypeFamilyVersionID])
" : "";
var selects = mappings.Where(f => f.em == null)
.Select((y, idx) => new { query = $@"SELECT [CaseTypeFamilyID], {(y.cm.SkipICD ? 1 : 0)}, '{y.cm.ICD10Code}', '{y.cm.MSDRGCode}', 1 FROM [dss].[CaseTypeFamily] WHERE [CaseTypeFamilyGlobalID] = '{y.cm.CaseTypeFamilyGlobalID}'", idx })
.GroupBy(g => g.idx / 1000, (g, d) => d)
.Select(z => insert + string.Join("\r\nUNION ALL\r\n", z.Select(y => y.query)));
Enumerable.Range(0, 999).ToList()
.ForEach(y =>
{
if (File.Exists(Path.Combine(documentFolder, $"Case Type Family Corrections 3{y:000} ({this.Connection.Database}).sql")))
File.Delete(Path.Combine(documentFolder, $"Case Type Family Corrections 3{y:000} ({this.Connection.Database}).sql"));
});
selects.ForEach((x, y) => File.WriteAllText(Path.Combine(documentFolder, $"Case Type Family Corrections 3{y:000} ({this.Connection.Database}).sql"), x));
versions.Where(f => f.ef == null).Dump("missing versions");
migrations.Where(f => f.ef == null).Dump("missing migrations");
migrationDeletes.Where(f => f.ef == null).Dump("migrations to delete");
families.Where(f => f.ef == null).Dump("missing families");
families.Where(f => f.ef != null
&& (f.cf.Name != f.ef.Name
&& f.cf.Name.Replace("And", "&") != f.ef.Name
&& f.cf.Name.Replace(" And ", "&") != f.ef.Name)).Dump("families to update");
familyDeletes.Where(f => f.ef == null).Dump("families to detele");
mappings.Where(f => f.em == null).Dump("missing mappings");
mappings.Where(f => f.em != null && (f.cm.SkipICD != f.em.SkipICD || f.cm.ICD10Code != f.em.ICD10Code || f.cm.MSDRGCode != f.em.MSDRGCode)).Dump("mappings to update");
mappingDeletes.Where(f => f.em == null).Dump("mappings to delete");
}
// Define other methods and classes here
///
/// Connect to P2680-SQL-03 - jazz prd Mercy Health 20160308.1
///
private void Step1(string connectionString)
{
var currentConnection = this.Connection.ConnectionString;
this.Connection.ConnectionString = connectionString;
this.Connection.Dump();
correct_migrations = from ml in MigrationLogs
where ml.Name.Replace(" ", "").Contains("CaseType") //&& ml.DateTimeStamp > new DateTime(2018, 11, 16)
orderby ml.DateTimeStamp descending
select ml.Name;
correct_versions = from ctfv in CaseTypeFamilyVersions select new VersionInfo(ctfv.CaseTypeFamilyVersionID, ctfv.Name, ctfv.StartDate, ctfv.EndDate);
correct_families = from ctf in CaseTypeFamilies select new FamilyInfo(ctf.CaseTypeFamilyGlobalID, ctf.Name, ctf.CaseTypeFamilyID);
correct_mappings = (from ctfm in CaseTypeFamilyMappingICD10s
join family in CaseTypeFamilies on ctfm.CaseTypeFamilyID equals family.CaseTypeFamilyID
where ctfm.CaseTypeFamilyVersionID == 1
select new MappingInfo(family.CaseTypeFamilyGlobalID, ctfm.SkipICD, ctfm.ICD10Code, ctfm.MSDRGCode)).Distinct();
this.Connection.ConnectionString = currentConnection;
}
private void Step1()
{
var documentFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
correct_migrations = JsonConvert.DeserializeObject<IEnumerable<string>>(File.ReadAllText(Path.Combine(documentFolder, $"{nameof(correct_migrations)}.json")));
correct_versions = JsonConvert.DeserializeObject<IEnumerable<VersionInfo>>(File.ReadAllText(Path.Combine(documentFolder, $"{nameof(correct_versions)}.json")));
correct_families = JsonConvert.DeserializeObject<IEnumerable<FamilyInfo>>(File.ReadAllText(Path.Combine(documentFolder, $"{nameof(correct_families)}.json")));
correct_mappings = JsonConvert.DeserializeObject<IEnumerable<MappingInfo>>(File.ReadAllText(Path.Combine(documentFolder, $"{nameof(correct_mappings)}.json")));
}
private void Step2()
{
existing_migrations = from ml in MigrationLogs
where ml.Name.Replace(" ", "").Contains("CaseType") //&& ml.DateTimeStamp > new DateTime(2018, 11, 16)
orderby ml.DateTimeStamp
select ml.Name;
existing_versions = from ctfv in CaseTypeFamilyVersions select new VersionInfo(ctfv.CaseTypeFamilyVersionID, ctfv.Name, ctfv.StartDate, ctfv.EndDate);
existing_families = from ctf in CaseTypeFamilies select new FamilyInfo(ctf.CaseTypeFamilyGlobalID, ctf.Name, ctf.CaseTypeFamilyID);
existing_mappings = (from ctfm in CaseTypeFamilyMappingICD10s
join family in CaseTypeFamilies on ctfm.CaseTypeFamilyID equals family.CaseTypeFamilyID
where ctfm.CaseTypeFamilyVersionID == 1
select new MappingInfo(family.CaseTypeFamilyGlobalID, ctfm.SkipICD, ctfm.ICD10Code, ctfm.MSDRGCode)).Distinct();
}
public class VersionInfo
{
public int CaseTypeFamilyVersionId { get; set; }
public string Name { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public VersionInfo(int id, string name, DateTime start, DateTime end)
{
CaseTypeFamilyVersionId = id;
Name = name;
StartDate = start;
EndDate = end;
}
}
public class FamilyInfo
{
public int CaseTypeFamilyID { get; set; }
public string CaseTypeFamilyGlobalID { get; set; }
public string Name { get; set; }
public FamilyInfo(string caseTypeFamilyGlobalID, string name, int caseTypeFamilyID)
{
CaseTypeFamilyID = caseTypeFamilyID;
CaseTypeFamilyGlobalID = caseTypeFamilyGlobalID;
Name = name;
}
}
public class MappingInfo
{
public string CaseTypeFamilyGlobalID { get; set; }
public bool SkipICD { get; set; }
public string ICD10Code { get; set; }
public string MSDRGCode { get; set; }
public MappingInfo(string caseTypeFamilyGlobalID, bool skipICD, string icd10Code, string msdrgCode)
{
CaseTypeFamilyGlobalID = caseTypeFamilyGlobalID;
SkipICD = skipICD;
ICD10Code = icd10Code;
MSDRGCode = msdrgCode;
}
}
@@ -0,0 +1,79 @@
<Query Kind="Program">
<Connection>
<ID>870a756b-af44-4db4-b004-58ff41318b3a</ID>
<Persist>true</Persist>
<Server>P9900-SQL-11.sdt.local</Server>
<Database>jazz tst GM non DSS Share Training Master</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
var documentFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var files = Directory.GetFiles(documentFolder, "Case Type Family Corrections*.sql")
.Select(d => Path.GetFileName(d))
.OrderBy(d => d)
.ToList();
files.ForEach(f =>
{
"".Dump(f);
var query = File.ReadAllText(Path.Combine(documentFolder, f));
this.ExecuteCommand(query);
});
}
// Define other methods and classes here
+142
View File
@@ -0,0 +1,142 @@
<Query Kind="Program">
<Connection>
<ID>94a82e0d-b8c1-4789-96cc-f34a75ba3c45</ID>
<Persist>true</Persist>
<Server>P2980-SQL-03.sdt.local</Server>
<Database>jazz prd Mercy Health 20160308.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
private IEnumerable<VersionInfo> correct_versions;
private IEnumerable<string> correct_migrations;
private IEnumerable<FamilyInfo> correct_families;
private IEnumerable<MappingInfo> correct_mappings;
void Main()
{
Step1();
correct_migrations.Dump();
correct_versions.Dump();
correct_families.Count().Dump();
correct_mappings.Count().Dump();
var documentFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
File.WriteAllText(Path.Combine(documentFolder, $"{nameof(correct_migrations)}.json"), JsonConvert.SerializeObject(correct_migrations, Newtonsoft.Json.Formatting.Indented));
File.WriteAllText(Path.Combine(documentFolder, $"{nameof(correct_versions)}.json"), JsonConvert.SerializeObject(correct_versions, Newtonsoft.Json.Formatting.Indented));
File.WriteAllText(Path.Combine(documentFolder, $"{nameof(correct_families)}.json"), JsonConvert.SerializeObject(correct_families, Newtonsoft.Json.Formatting.Indented));
File.WriteAllText(Path.Combine(documentFolder, $"{nameof(correct_mappings)}.json"), JsonConvert.SerializeObject(correct_mappings, Newtonsoft.Json.Formatting.Indented));
}
// Define other methods and classes here
private void Step1()
{
correct_migrations = from ml in MigrationLogs
where ml.Name.Replace(" ", "").Contains("CaseType") //&& ml.DateTimeStamp > new DateTime(2018, 11, 16)
orderby ml.DateTimeStamp descending
select ml.Name;
correct_versions = from ctfv in CaseTypeFamilyVersions select new VersionInfo(ctfv.CaseTypeFamilyVersionID, ctfv.Name, ctfv.StartDate, ctfv.EndDate);
correct_families = from ctf in CaseTypeFamilies select new FamilyInfo(ctf.CaseTypeFamilyGlobalID, ctf.Name, ctf.CaseTypeFamilyID);
correct_mappings = (from ctfm in CaseTypeFamilyMappingICD10s
join family in CaseTypeFamilies on ctfm.CaseTypeFamilyID equals family.CaseTypeFamilyID
where ctfm.CaseTypeFamilyVersionID == 1
select new MappingInfo(family.CaseTypeFamilyGlobalID, ctfm.SkipICD, ctfm.ICD10Code, ctfm.MSDRGCode)).Distinct();
}
public class VersionInfo
{
public int CaseTypeFamilyVersionId { get; set; }
public string Name { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public VersionInfo(int id, string name, DateTime start, DateTime end)
{
CaseTypeFamilyVersionId = id;
Name = name;
StartDate = start;
EndDate = end;
}
}
public class FamilyInfo
{
public int CaseTypeFamilyID { get; set; }
public string CaseTypeFamilyGlobalID { get; set; }
public string Name { get; set; }
public FamilyInfo(string caseTypeFamilyGlobalID, string name, int caseTypeFamilyID)
{
CaseTypeFamilyID = caseTypeFamilyID;
CaseTypeFamilyGlobalID = caseTypeFamilyGlobalID;
Name = name;
}
}
public class MappingInfo
{
public string CaseTypeFamilyGlobalID { get; set; }
public bool SkipICD { get; set; }
public string ICD10Code { get; set; }
public string MSDRGCode { get; set; }
public MappingInfo(string caseTypeFamilyGlobalID, bool skipICD, string icd10Code, string msdrgCode)
{
CaseTypeFamilyGlobalID = caseTypeFamilyGlobalID;
SkipICD = skipICD;
ICD10Code = icd10Code;
MSDRGCode = msdrgCode;
}
}
@@ -0,0 +1,788 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel.Composition</Namespace>
<Namespace>System.ComponentModel.Composition.Hosting</Namespace>
<Namespace>System.ComponentModel.Composition.Primitives</Namespace>
<Namespace>System.ComponentModel.Composition.ReflectionModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Net.Http</Namespace>
<Namespace>System.Net.Http.Headers</Namespace>
<Namespace>System.Numerics</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
private string text = @"1 558 M-296
1 987 M-345
1 895 M-16
1 670 M-304
1 445 M-98
1 599 A-19
1 505 M-125
1 033 M-322
1 247 M-229
1 881 M-90
1 294 M-100
1 605 M-305
1 208 M-367
1 163 M-177
1 248 M-230
1 182 M-262
1 637 A-6
1 287 M-337
1 815 M-264
1 344 M-194
1 387 A-13
1 281 M-5
1 985 M-249
1 923 M-354
1 896 M-17
1 920 M-338
1 230 A-21
1 975 M-142
1 504 M-125
1 754 M-187
1 950 M-13
1 263 M-321
1 579 M-362
1 034 M-231
1 595 A-18
1 574 M-277
1 472 M-61
1 258 M-56
1 776 M-245
1 200 M-241
1 336 A-24
1 603 M-58
1 334 M-253
1 729 M-217
1 816 M-264
1 158 M-89
1 485 M-163
1 310 M-328
1 555 M-274
1 600 M-204
1 661 M-162
1 849 A-26
1 939 M-346
1 389 M-131
1 187 M-239
1 410 M-283
1 712 M-297
1 333 M-253
1 186 M-239
1 510 M-222
1 343 M-29
1 865 A-32
1 790 M-116
1 183 M-178
1 501 M-280
1 578 M-276
1 809 M-182
1 781 M-25
1 750 M-214
1 150 M-108
1 350 M-152
1 770 M-281
1 335 A-24
1 453 M-27
1 053 M-288
1 474 M-21
1 424 M-353
1 709 M-228
1 178 M-261
1 561 M-72
1 100 M-270
1 710 M-228
1 556 M-274
1 416 M-65
1 123 M-201
1 935 M-203
1 516 M-357
1 355 M-140
1 215 M-137
1 189 M-251
1 094 M-34
1 064 M-59
1 685 M-8
1 617 M-22
1 759 A-9
1 464 M-323
1 725 M-36
1 664 M-193
1 789 M-344
1 167 M-361
1 292 A-12
1 800 A-29
1 509 M-30
1 668 M-304
1 069 A-31
1 594 A-27
1 882 M-202
1 663 M-193
1 314 A-22
1 767 M-318
1 489 M-164
1 871 M-273
1 688 M-161
1 959 M-359
1 667 M-248
1 455 M-27
1 675 M-355
1 006 M-169
1 155 M-213
1 228 A-21
1 059 M-88
1 760 M-118
1 843 M-220
1 903 M-111
1 070 M-60
1 031 M-322
1 495 M-109
1 779 M-1
1 928 M-129
1 179 M-261
1 222 M-55
1 371 M-180
1 381 M-70
1 949 M-13
1 298 M-52
1 792 M-247
1 285 M-6
1 308 M-328
1 221 M-285
1 657 M-159
1 264 M-349
1 028 A-28
1 639 A-6
1 511 M-222
1 500 M-280
1 695 M-158
1 180 M-262
1 176 A-25
1 674 M-355
1 037 M-115
1 945 M-105
1 597 A-19
1 478 M-41
1 841 M-172
1 869 M-150
1 306 M-75
1 948 M-368
1 570 M-329
1 654 A-15
1 138 M-196
1 908 M-358
1 434 M-66
1 538 M-291
1 559 M-72
1 965 M-356
1 202 M-48
1 557 M-296
1 689 M-160
1 244 M-234
1 446 M-98
1 101 M-270
1 723 M-189
1 225 M-54
1 835 M-4
1 549 M-272
1 262 M-57
1 964 M-356
1 956 M-167
1 376 A-7
1 437 M-188
1 135 M-275
1 352 M-152
1 984 M-249
1 226 M-53
1 283 M-6
1 218 M-284
1 370 A-16
1 540 M-209
1 191 M-77
1 534 M-120
1 602 M-58
1 982 M-114
1 148 M-102
1 838 M-62
1 007 M-171
1 293 A-12
1 097 M-287
1 280 M-5
1 498 M-110
1 746 M-317
1 830 M-199
1 272 M-334
1 067 M-205
1 458 M-290
1 078 M-146
1 147 M-102
1 345 M-194
1 071 M-60
1 295 M-100
1 096 M-34
1 235 M-49
1 385 A-13
1 624 M-279
1 499 M-110
1 922 M-354
1 234 M-50
1 423 M-353
1 989 M-345
1 715 M-186
1 765 M-84
1 934 M-128
1 550 M-272
1 137 M-196
1 918 M-242
1 056 M-86
1 958 M-359
1 868 M-150
1 207 M-366
1 250 M-232
1 442 M-99
1 826 M-342
1 671 M-311
1 062 M-293
1 201 M-241
1 165 M-177
1 257 M-371
1 441 M-99
1 565 M-198
1 421 M-139
1 886 M-35
1 625 M-298
1 085 M-306
1 354 M-140
1 074 M-80
1 038 M-115
1 113 A-20
1 791 M-246
1 393 M-210
1 660 M-162
1 857 M-244
1 904 M-278
1 630 M-351
1 940 M-346
1 197 M-153
1 241 M-282
1 273 M-333
1 330 M-175
1 390 M-131
1 195 M-240
1 456 M-290
1 814 M-264
1 713 M-308
1 866 A-32
1 553 M-43
1 010 A-23
1 747 M-317
1 804 M-360
1 125 M-211
1 473 M-61
1 700 M-216
1 755 M-187
1 341 M-29
1 933 M-113
1 340 M-28
1 496 M-109
1 023 M-339
1 289 M-7
1 239 M-282
1 963 M-356
1 149 M-101
1 159 M-89
1 618 M-22
1 515 M-357
1 309 M-328
1 193 M-240
1 444 M-98
1 242 M-234
1 076 A-33
1 577 M-276
1 432 M-66
1 029 A-28
1 032 M-322
1 691 M-313
1 300 M-233
1 016 M-32
1 408 M-283
1 435 M-188
1 622 M-279
1 870 M-271
1 249 M-230
1 502 M-280
1 388 M-131
1 662 M-193
1 757 A-9
1 828 M-342
1 282 M-5
1 604 M-305
1 854 M-341
1 573 M-277
1 793 M-127
1 554 M-43
1 699 M-216
1 058 M-88
1 008 M-225
1 339 M-28
1 902 M-111
1 223 M-55
1 542 M-227
1 115 M-286
1 592 A-27
1 269 M-332
1 316 A-22
1 846 M-63
1 231 M-51
1 768 M-319
1 707 A-17
1 665 M-248
1 268 M-332
1 883 M-235
1 483 M-183
1 856 M-244
1 497 M-109
1 134 M-350
1 955 A-5
1 642 M-76
1 332 M-253
1 181 M-262
1 129 M-181
1 976 M-142
1 947 M-368
1 139 M-269
1 151 M-108
1 718 M-218
1 842 M-172
1 440 M-97
1 052 M-288
1 040 M-363
1 156 M-213
1 229 A-21
1 544 M-227
1 847 M-63
1 844 M-220
1 382 M-70
1 862 M-243
1 077 M-146
1 641 M-207
1 572 M-329
1 780 A-8
1 744 M-85
1 658 M-159
1 927 M-112
1 820 M-173
1 216 M-284
1 643 M-106
1 166 M-361
1 290 M-7
1 233 M-50
1 855 M-341
1 083 M-307
1 824 M-174
1 411 M-64
1 696 M-158
1 304 A-128
1 409 M-283
1 055 M-200
1 102 M-136
1 655 A-15
1 378 M-130
1 520 M-335
1 666 M-248
1 687 M-161
1 693 M-312
1 079 M-146
1 099 M-287
1 307 M-75
1 914 M-370
1 327 M-369
1 539 M-209
1 722 M-189
1 546 A-4
1 133 M-350
1 834 M-4
1 969 M-340
1 368 A-16
1 375 A-7
1 894 M-18
1 297 M-52
1 457 M-290
1 717 M-218
1 004 M-301
1 383 M-309
1 303 M-31
1 065 M-59
1 724 M-189
1 728 M-151
1 801 A-29
1 255 M-371
1 014 M-19
1 672 M-311
1 880 M-2
1 291 A-12
1 863 M-243
1 232 M-51
1 017 M-32
1 256 M-371
1 130 M-181
1 063 M-293
1 417 M-166
1 296 M-52
1 748 M-119
1 475 M-21
1 438 M-97
1 734 M-252
1 745 M-85
1 970 M-340
1 545 A-4
1 593 A-27
1 566 M-198
1 425 M-353
1 897 M-17
1 487 M-163
1 974 M-142
1 627 M-298
1 560 M-72
1 562 M-197
1 575 M-277
1 177 M-261
1 068 M-205
1 271 M-334
1 337 A-24
1 782 M-26
1 198 M-153
1 203 M-48
1 629 M-351
1 199 M-241
1 486 M-163
1 714 M-308
1 095 M-34
1 623 M-279
1 087 M-306
1 917 M-242
1 876 M-347
1 716 M-186
1 227 M-53
1 380 M-70
1 988 M-345
1 517 M-357
1 188 M-239
1 152 M-223
1 374 A-7
1 284 M-6
1 506 M-185
1 711 M-297
1 082 M-307
1 802 M-360
1 116 M-157
1 795 M-206
1 184 M-178
1 395 M-210
1 420 M-139
1 073 M-80
1 628 M-351
1 921 M-338
1 794 M-343
1 114 A-20
1 606 M-195
1 286 M-337
1 596 A-18
1 035 M-231
1 260 M-57
1 415 M-65
1 887 M-219
1 471 M-61
1 829 M-199
1 645 M-106
1 217 M-284
1 146 M-102
1 346 M-194
1 758 A-9
1 708 A-17
1 827 M-342
1 192 M-77
1 351 M-152
1 329 M-175
1 205 M-221
1 338 M-28
1 541 M-209
1 245 M-14
1 749 M-214
1 463 M-323
1 086 M-306
1 164 M-177
1 769 M-364
1 342 M-29
1 601 M-204
1 808 M-182
1 386 A-13
1 204 M-263
1 810 M-182
1 243 M-234
1 454 M-27
1 259 M-56
1 837 M-62
1 117 M-157
1 433 M-66
1 288 M-7
1 813 M-68
1 075 A-33
1 576 M-276
1 885 M-250
1 692 M-313
1 981 M-114
1 224 M-54
1 652 A-14
1 261 M-57
1 512 M-222
1 372 M-180
1 799 A-29
1 686 M-161
1 190 M-77
1 638 A-6
1 042 M-363
1 465 M-323
1 313 A-3
1 414 M-65
1 024 M-339
1 598 A-19
1 246 M-229
1 519 M-335
1 236 M-49
1 547 A-4
1 543 M-227
1 946 M-105
1 777 M-104
1 419 M-166
1 477 M-41
1 840 M-172
1 533 M-120
1 659 M-162
1 270 M-334
1 872 M-273
1 864 A-10
1 154 M-213
1 479 M-41
1 909 M-358
1 823 M-174
1 503 M-125
1 194 M-240
1 735 M-252
1 951 M-352
1 030 A-28
1 583 M-190
1 656 M-159
1 418 M-166
1 690 M-160
1 379 M-130
1 326 M-369
1 929 M-129
1 518 M-335
1 311 M-24
1 157 M-89
1 436 M-188
1 041 M-363
1 673 M-355
1 582 M-190
1 413 M-64
1 853 M-341
1 756 M-187
1 124 M-211
1 168 M-361
1 901 M-111
1 089 M-74
1 581 M-362
1 036 M-231
1 775 M-327
1 373 M-180
1 913 M-370
1 669 M-304
1 301 M-233
1 122 A-1
1 312 M-294
1 653 A-15
1 315 A-22
1 571 M-329
1 039 M-115
1 697 M-310
1 369 A-16
1 858 M-244
1 551 M-192
1 412 M-64
1 265 M-15
1 061 M-293
1 084 M-307
1 825 M-174
1 088 M-74
1 727 M-151
1 240 M-282
1 443 M-99
1 054 M-200
1 778 A-30
1 730 M-217
1 836 M-4
1 185 M-178
1 072 M-60
1 220 M-285
1 377 M-130
1 175 A-25
1 121 A-1
1 353 M-140
1 057 M-86
1 867 M-150
1 919 M-338
1 274 M-333
1 726 M-36
1 644 M-106
1 537 M-291
1 552 M-192
1 983 M-114
1 328 M-369
1 821 M-173
1 564 M-198
1 626 M-298
1 098 M-287
1 219 M-285
1 060 M-88
1 394 M-210
1 384 M-309
1 822 M-173
1 136 M-275
1 607 M-195
1 153 M-223
1 905 M-278
1 616 M-22
1 331 M-175
1 066 M-59
1 580 M-362
1 907 M-358
1 196 M-153
1 476 M-21
1 941 M-346
1 548 M-272
1 698 M-216
1 439 M-97
1 206 M-221
1 916 A-2
1 305 A-128
1 803 M-360
1 103 M-136
1 251 M-232
1 766 M-84
1 915 A-2
1 299 M-233
1 563 M-197
1 848 M-63
1 986 M-249
1 694 M-312
1 957 M-359
1 977 M-143
1 845 M-220
1 090 M-74
1 488 M-164
1 302 M-31
1 839 M-62
1 422 M-139
1 761 M-118
1 640 M-207
1 774 M-330
1 0 783 M-412
1 0 784 M-412
1 0 785 M-412
1 0 786 M-413
1 0 787 M-413
1 0 788 M-413
1 0 805 M-414
1 0 806 M-414
1 0 807 M-414
1 0 817 M-415
1 0 818 M-415
1 0 819 M-415
1 0 831 M-416
1 0 832 M-416
1 0 833 M-416
1 0 796 M-318
1 0 797 M-318
1 0 798 M-318";
void Main()
{
var mappings = text.Replace("\r\n", "\r").Split('\r')
.Where(r => !string.IsNullOrEmpty(r) && r.Split('\t').Length == 4) // There must be exactly 4 columns in each row of data
.Select(x =>
{
var column = x.Split('\t');
return new CaseTypeFamilyMapping(column[0], column[1], column[2], column[3], 0);
});
mappings.Where(m => m != null).OrderBy(m => m.SkipICD).ThenBy(m => m.ICD10Code).ThenBy(m => m.MSDRGCode).ThenBy(m => m.GlobalID).Dump();
}
public class CaseTypeFamilyMapping
{
public bool SkipICD { get; set; }
public string ICD10Code { get; set; }
public string MSDRGCode { get; set; }
public string GlobalID { get; set; }
public int CaseTypeFamilyId { get; set; }
public CaseTypeFamilyMapping(string skipICD, string icd10Code, string msdrgCode, string globalID, int caseTypeFamilyId)
{
if (!bool.TryParse(skipICD, out bool skipped)) skipped = false;
SkipICD = (skipICD == "1");
ICD10Code = icd10Code;
MSDRGCode = msdrgCode;
GlobalID = globalID;
//CaseTypeFamilyId = caseTypeFamilyId;
}
}
@@ -0,0 +1,134 @@
<Query Kind="Statements">
<Connection>
<ID>77b65bea-e766-4e3c-a1ed-c4c2534b6019</ID>
<Persist>true</Persist>
<Server>D0001-SQL-01.sdt.local</Server>
<Database>jazz dev master</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel.Composition</Namespace>
<Namespace>System.ComponentModel.Composition.Hosting</Namespace>
<Namespace>System.ComponentModel.Composition.Primitives</Namespace>
<Namespace>System.ComponentModel.Composition.ReflectionModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Net.Http</Namespace>
<Namespace>System.Net.Http.Headers</Namespace>
<Namespace>System.Numerics</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
var grps = CaseTypeFamilyMappingICD10s
.Where(ctf => ctf.CaseTypeFamilyVersionID == 2)
.GroupBy(ctf => new { ctf.CaseTypeFamilyID, ctf.ICD10Code })
.OrderBy(grp => grp.Key.CaseTypeFamilyID)
.ThenBy(grp => grp.Key.ICD10Code)
.Select(grp => new { grp.Key.CaseTypeFamilyID, grp.Key.ICD10Code, count = grp.Count() });
var grpBreak = 100000;
var pageSize = 10000;
foreach (var grp in grps)
{
grp.Dump();
if (grp.count > grpBreak)
{
var subgrps = CaseTypeFamilyMappingICD10s
.Where(ctf => ctf.CaseTypeFamilyVersionID == 2)
.GroupBy(ctf => new { ctf.CaseTypeFamilyID, ctf.ICD10Code, ctf.MSDRGCode })
.OrderBy(subgrp => subgrp.Key.CaseTypeFamilyID)
.ThenBy(subgrp => subgrp.Key.ICD10Code)
.ThenBy(subgrp => subgrp.Key.MSDRGCode)
.Select(subgrp => new { subgrp.Key.CaseTypeFamilyID, subgrp.Key.ICD10Code, subgrp.Key.MSDRGCode, count = subgrp.Count() });
foreach (var subgrp in subgrps)
{
subgrp.Dump();
var subgrpremove = from mapping in CaseTypeFamilyMappingICD10s
where mapping.CaseTypeFamilyID == subgrp.CaseTypeFamilyID
&& mapping.ICD10Code == subgrp.ICD10Code
&& mapping.MSDRGCode == subgrp.MSDRGCode
&& mapping.CaseTypeFamilyVersionID == 2
select mapping;
if (subgrpremove.Any())
{
var pages = ((subgrp.count + (pageSize - 1)) / pageSize);
Enumerable.Range(0, pages).ToList()
.ForEach(page =>
{
$"{(page + 1)} of {pages}".Dump();
var workSet = subgrpremove.Skip(page * pageSize).Take(pageSize).ToList();
CaseTypeFamilyMappingICD10s.DeleteAllOnSubmit(workSet);
SubmitChanges();
});
}
}
continue;
}
var remove = from mapping in CaseTypeFamilyMappingICD10s
where mapping.CaseTypeFamilyID == grp.CaseTypeFamilyID
&& mapping.ICD10Code == grp.ICD10Code
&& mapping.CaseTypeFamilyVersionID == 2
select mapping;
if (remove.Any())
{
var pages = ((grp.count + (pageSize - 1)) / pageSize);
Enumerable.Range(0, pages).ToList()
.ForEach(page =>
{
$"{(page + 1)} of {pages}".Dump();
var workSet = remove.Skip(page * pageSize).Take(pageSize).ToList();
CaseTypeFamilyMappingICD10s.DeleteAllOnSubmit(workSet);
SubmitChanges();
});
}
}
+107
View File
@@ -0,0 +1,107 @@
<Query Kind="Statements">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
var routines = @"procCleanupOpportunities
procDeleteAllData
procDeleteDimensionData
procEpicADTInitializeDepartmentPatientCensus
procInsertDimensionDefaults
procOptimizationRebuildIndexesDimensions
procPatientCensusDiscardIncorrectEntries
procPatientEncounterSummaryUpdateCaseTypeId
procPopulateCustomOpportunitySavings
procPopulateDepartmentPatientCensus
procPopulateDepartmentPatientCensusFromCerner
procPopulateDepartmentPatientCensusFromMeditech
procPopulateDepartmentPatientCensusFromStarADT
procPopulateDepartmentPatientDailyCensus
procPopulatePhysicianQualityMetrics
procSampleCaseTypeFamilyMetricsAll
procSampleChargeCodeConfigs
procSampleMSDRGCaseTypeFamilyMetrics
procSampleNursingDepartments
procSampleNursingMonthlyVolume
procSampleUNSPSCRollup
procUpdateDimInitiative
procUpdateDimOpportunity
procUpdateFactOpportunityMetric
procUpdateFactOpportunitySavings".Replace("\r\n", "\r").Split('\r');
var bools = new[] { true }; //, false };
var groups = new[] { 2, 3 };
var variations = (from b in bools
from g in groups
from r in routines
select new { b = b && g != 1, g, r, q = g == 1 ? "NoQuery" : g == 2 ? "DataSet" : g == 3 ? "Datatable" : "Scalar" })
.Distinct()
.Where(v => v.r != "procPopulateCustomOpportunitySavings")
.OrderBy(o => o.q)
.ThenBy(o => o.r)
.ThenByDescending(o => o.b).ToList();
//variations.Dump();
variations.ForEach(v => $@" [Test]
public void TestxCci{v.r}{v.g}_{v.q}()
{{
var contextMock = new Mock<SqlContextStub>().As<ISqlContext>();
using (contextMock.InScope())
{{
{(v.b ? "var ts = (int)TimeSpan.FromMinutes(5).TotalSeconds;\r\n " : "")}Action act = () => {v.r}.Execute{v.q}({(v.b ? "Guid.NewGuid()" : "")});
act.Should().NotThrow<Exception>();
}}
contextMock.VerifyStoredProc<{v.r}>({(v.b ? "TimeSpan.FromMinutes(5), " : "")}Times.Never());
}}
".Dump());
+171
View File
@@ -0,0 +1,171 @@
<Query Kind="Statements">
<Connection>
<ID>77b65bea-e766-4e3c-a1ed-c4c2534b6019</ID>
<Persist>true</Persist>
<Server>D0001-SQL-11.sdt.local</Server>
<Database>jazz dev master Prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
var opcptcodefile = @"D:\Users\tlamb\Downloads\OP CTF_03232020.txt";
var opcptcodelist = File.ReadAllLines(opcptcodefile);
var opcptcodes = opcptcodelist.Skip(1).Select(o => new { CaseTypeFamily = o.Split('\t')[0], CPTCode = o.Split('\t')[1].Trim() });
var newCaseTypeFamily = from op in opcptcodes
join ctf in CaseTypeFamilies on op.CaseTypeFamily equals ctf.Name into joined
from j in joined.DefaultIfEmpty()
where j == null
select op.CaseTypeFamily;
var newCaseTypeFamilies =
@"--Author: tlamb
--Version: 2020.21
--Forward
update pes set pes.MSDRGCaseTypeFamilyID = 0, pes.APRDRGCaseTypeFamilyID = 0
from [clientdss].[FactPatientEncounterSummary] pes
INNER JOIN fw.DimPatientType pt on pt.PatientTypeID = pes.PatientTypeID
INNER JOIN fw.DimPatientTypeRollup ptr on pt.PatientTypeRollupID = ptr.PatientTypeRollupID
where ptr.Type <> 'Inpatient';
GO
DELETE FROM dss.CaseTypeFamily WHERE CaseTypeFamilyGlobalID LIKE 'O-%';
GO
DELETE FROM dss.CaseTypeFamilyMappingCPT;
GO
" +
string.Join("\r\n", opcptcodes
.Select(o => o.CaseTypeFamily)
.Distinct().OrderBy(ctf => ctf)
.Select((ctf, i) => new {i, value = $"\t( NEWID(), N'{ctf}', N'O-{(i + 1):0000}' )"})
.GroupBy(ctf => (int)ctf.i / 100, (g, d) => string.Join(",\r\n", d.Select(v => v.value)))
.Select(ctf => $"INSERT INTO dss.CaseTypeFamily ( CaseTypeFamilyGUID, Name, CaseTypeFamilyGlobalID )\r\nVALUES\r\n{ctf};\r\nGO")) +
@"
DECLARE @CaseTypeFamilyVersionID INT;
SELECT @CaseTypeFamilyVersionID = CaseTypeFamilyVersionID FROM dss.CaseTypeFamilyVersion AS ctfv WHERE GETDATE() BETWEEN ctfv.StartDate AND ctfv.EndDate;
" +
string.Join("\r\n", opcptcodes
.Select(o => $@"INSERT INTO dss.CaseTypeFamilyMappingCPT ( CaseTypeFamilyID, CPTCode, CaseTypeFamilyVersionID )
SELECT CaseTypeFamilyID, '{o.CPTCode}', @CaseTypeFamilyVersionID
FROM dss.CaseTypeFamily AS ctf WHERE ctf.Name = '{o.CaseTypeFamily}'")) + @"
GO
--Rollback
update pes set pes.MSDRGCaseTypeFamilyID = 0, pes.APRDRGCaseTypeFamilyID = 0
from [clientdss].[FactPatientEncounterSummary] pes
INNER JOIN fw.DimPatientType pt on pt.PatientTypeID = pes.PatientTypeID
INNER JOIN fw.DimPatientTypeRollup ptr on pt.PatientTypeRollupID = ptr.PatientTypeRollupID
where ptr.Type <> 'Inpatient';
GO
DELETE FROM dss.CaseTypeFamily WHERE CaseTypeFamilyGlobalID LIKE 'O-%';
GO
DELETE FROM dss.CaseTypeFamilyMappingCPT;
GO
";
File.WriteAllText(@"D:\Git\jazz\Migrations\CCI\2020-03-25-15-34 D-09502 OP CaseTypeFamily Definitions 2.sql", newCaseTypeFamilies);
newCaseTypeFamilies.Dump(nameof(newCaseTypeFamilies));
/*
var dbResults = from ctfmc in CaseTypeFamilyMappingCPTs
join ctf in CaseTypeFamilies on ctfmc.CaseTypeFamilyID equals ctf.CaseTypeFamilyID
join ctfv in CaseTypeFamilyVersions on ctfmc.CaseTypeFamilyVersionID equals ctfv.CaseTypeFamilyVersionID
select new { ctfmc.CPTCode, ctf.CaseTypeFamilyID, ctf.Name };
var missing = from op in opcptcodes
join db in dbResults on op.CPTCode equals db.CPTCode into joined
from j in joined.DefaultIfEmpty()
where j == null ||
(j != null && op.CaseTypeFamily != j.Name)
select new
{
op.CPTCode,
NewName = op.CaseTypeFamily,
OldCaseTypeFamilyID = j?.CaseTypeFamilyID ?? -1,
OldName = j?.Name ?? ""
};
var updates = from m in missing
join ctf in CaseTypeFamilies on m.NewName equals ctf.Name into joined
from j in joined.DefaultIfEmpty()
select new
{
m.CPTCode,
m.NewName,
NewCaseTypeFamilyID = j?.CaseTypeFamilyID ?? -1,
m.OldCaseTypeFamilyID,
m.OldName
};
updates
.Where(u => u.NewCaseTypeFamilyID != -1)
.OrderBy(u => u.NewCaseTypeFamilyID)
.Dump(nameof(updates));
updates
.Where(u => u.NewCaseTypeFamilyID == -1)
.Count().Dump("Count");
updates
.Where(u => u.NewCaseTypeFamilyID == -1)
.OrderBy(u => u.NewCaseTypeFamilyID)
.Dump("New Case Type Family");
var oldCaseTypeFamilies = updates
.Where(u => u.NewCaseTypeFamilyID != -1)
.Select(u => u.NewName).Distinct().OrderBy(u => u);
oldCaseTypeFamilies.Dump(nameof(oldCaseTypeFamilies));
var newCaseTypeFamilies = updates
.Where(u => u.NewCaseTypeFamilyID == -1)
.Select(u => u.NewName).Distinct().OrderBy(u => u);
newCaseTypeFamilies.Dump(nameof(newCaseTypeFamilies));
*/
+527
View File
@@ -0,0 +1,527 @@
<Query Kind="Program">
<Connection>
<ID>db640701-a1c5-4177-9f03-5152d093ffa7</ID>
<Persist>true</Persist>
<Server>D0011-sql-01.sdt.local</Server>
<Database>jazz tst StrataSphere 20191104.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<NuGetReference>RestSharp</NuGetReference>
<Namespace>RestSharp</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>System.Data.Common</Namespace>
</Query>
private string BaseUrl = "https://localhost:44325/api/v1/"; //"https://api-dev.sdt.local/starterset-api/api/v1/"; //"https://starterset-api.dev.k8s.sdt.local/api/v1/";
private List<DefinitionTranslationDto> TheGrade = new List<UserQuery.DefinitionTranslationDto>();
#region *** Enumerations ***
public enum QueryRegions
{
Production,
Training,
Oak,
Dev
}
#endregion
#region *** Options ***
public static QueryRegions queryRegion = QueryRegions.Dev;
public static string crossDBQueryPath = @"D:\CrossDBQueries"; // This is the path to find the queries
public static bool dumpOptions = false; // This flag will dumpt this set of options
public static bool dumpSmcSql = false; // This flag will dump the smc sql to the result
public static bool dumpDBList = false; // This flag will dump the databases to the result
public static bool dumpQueries = false; // This flag will dump the queries to the result
public static bool dumpDBExclusions = false; // This flag will dump the db and server exclusions
public static bool dumpDBTargets = false; // This flag will dump the db and server targets
public static bool dumpAppVersions = false; // This flag will dump the app versions used in the queryRegion
public static bool dumpAppVersionTargets = false; // This flag will dump the app versions targets
public static bool excludeExceptions = true;
public static bool queryCompress = false;
public static bool flatten = true; // This will flatten all of the results into a single list
public static bool showStopWatch = false;
public static bool noQueries = false; // This will stop the CrossDBQuery without running the queries
#endregion
public static Parms parms = new Parms
{
name = "FY2020"
};
#region *** Database Selection ***
public static string[] appVersions = { // This is a list of appVersions to filter for in the database list
//"2019.42"
};
public static string[] serverExclusions = { // This is a list of servers to exclude from the database list
@"paonsql19.sdt.local\instance1",
@"paonsql17.sdt.local\instance1",
@"p0555-sql-01.sdt.local\instance1",
"P0000-sql-01.sdt.local",
"P9900-SQL-03.sdt.local",
"P9900-sql-05.sdt.local"
};
public static string[] dbExclusions = { // This is a list of database physical names to exclude from the database list
};
public static string[] targetOrgPins = { // This is a list of org pins to target in the database list
};
public static string[] targetServers = { // This is a list of servers to target in the database list
};
public static string[] targetDBs = { // This is a list of database physicial names to target in the database list
//"jazz tst Aultman 20200417.1"
};
#endregion *** Options ***
#region *** SMC Settings and queries ***
public static string smcSql => @"SELECT di.ServerName, di.DatabaseGUID, di.DatabaseName, di.PhysicalName, di.OrgPin, di.AppVersion, di.Description
FROM [dbo].[viewDatabaseInfo] di
WHERE 1=1"
+ (queryRegion == QueryRegions.Dev
? @"
AND di.PhysicalName like 'jazz%'"
: $@"
AND di.PhysicalName like 'jazz {(queryRegion != QueryRegions.Production ? "tst" : "prd")}%'
AND di.ServerName like 'p%'");
public static string smcServer { get; set; }
public static string smcDB { get; set; }
#endregion
#region *** Program variables and settings ***
public static IOrderedEnumerable<Database> databases => GetDatabases();
#endregion
public void OptionsDump()
{
var options = new
{
queryRegion,
crossDBQueryPath,
dumpOptions,
dumpSmcSql,
dumpDBList,
dumpQueries,
dumpDBExclusions,
dumpDBTargets,
dumpAppVersions,
dumpAppVersionTargets,
excludeExceptions,
queryCompress,
flatten,
showStopWatch,
noQueries
};
options.Dump(nameof(options));
}
public class Parms
{
public string name { get; set; }
}
void Main()
{
RestClient client = new RestClient();
var definitions = GetList<DefinitionDto>(client, "Definitions");
var definitionTranslations = GetList<DefinitionTranslationDto>(client, "DefinitionTranslations");
var work = definitions
.GroupBy(d => new
{
d.HierarchyGuid,
d.DimensionGuid,
d.AttributeGuid,
d.HierarchyId,
d.DimensionId,
d.AttributeId
}, (g, d) => new WorkDto
{
DefinitionGuids = d.Select(x => x.Id).ToList(),
HierarchyGuid = g.HierarchyGuid,
DimensionGuid = g.DimensionGuid,
AttributeGuid = g.AttributeGuid,
HierarchyId = g.HierarchyId,
DimensionId = g.DimensionId,
AttributeId = g.AttributeId,
Name = g.AttributeId == "a177cc88-e329-44e0-9063-2d9b59af51b2"
? "Department"
: g.AttributeId == "f23654b3-149f-490a-a366-fca35f57d66a"
? "EntityID"
: g.AttributeId == "MRDEPTENTITY"
? "Entity"
: string.Empty
})
.Distinct()
.OrderBy(d => d.DimensionId)
.ThenBy(d => d.AttributeId)
.ToList();
DoTheDumping();
databases
//.Where(d => d.DatabaseName == "Aultman")
.OrderBy(d => d.DatabaseName)
.ThenBy(d => d.OrgPin)
.ThenBy(d => d.PhysicalName)
.ToList()
.ForEach(db =>
{
FindMissing(work, db);
});
var theWork = TheGrade
.Distinct().ToList();
//theWork.Dump(nameof(theWork));
theWork.RemoveAll(tg => tg.AttributeGUID == Guid.Empty || tg.AttributeId == tg.AttributeGUID.ToString());
JsonConvert.SerializeObject(theWork, Newtonsoft.Json.Formatting.Indented).Dump("json");
}
public void FindMissing(List<WorkDto> work, Database database)
{
var db = new TypedDataContext(database.ConnectionString);
try
{
var dimensions = work.Select(w => w.DimensionGuid).Distinct();
var Score =
(from d in db.ScoreDimensions
join dg in db.ScoreDimensionGroups on d.DimensionGUID equals dg.DimensionGUID
join a in db.ScoreAttributes on dg.DimensionGroupGUID equals a.DimensionGroupGUID
where dimensions.Contains(d.DimensionGUID)
select new ScoreInfo(database.DatabaseName, database.DatabaseGuid, d.FriendlyName, d.DefaultHierarchyGUID, d.DimensionGUID, a.FriendlyName, a.AttributeGUID))
.ToList();
work.ToList()
.ForEach(w =>
{
var scores = Score.Where(sw => sw.DimensionGUID == w.DimensionGuid).ToList();
if (!scores.Any())
return;
var s = scores.FirstOrDefault(sw => sw.AttributeGUID == w.AttributeGuid);
if (s != null)
{
w.score = s;
return;
}
s = scores.FirstOrDefault(sw => sw.AttributeName == w.Name);
if (s == null)
{
w.score = scores.FirstOrDefault();
}
w.ByName = true;
w.score = s;
});
var missing = work.Where(w => w.score == null || w.ByName).ToList();
missing.ForEach(m =>
{
if (m.score == null)
m.score = new ScoreInfo(database.DatabaseName, database.DatabaseGuid, "", Guid.Empty, Guid.Empty, "", Guid.Empty);
m.score.DefinitionGuids = new List<System.Guid>();
m.score.DefinitionGuids.AddRange(m.DefinitionGuids ?? new List<System.Guid>());
});
var grades = missing.SelectMany(m => m.score.DefinitionGuids
.Select(dg => new DefinitionTranslationDto(dg, m.score.DatabaseName, m.score.DatabaseGuid, m.AttributeId, m.score.AttributeName, m.score.AttributeGUID)));
TheGrade.AddRange(grades);
//missing.Dump(database.DatabaseName);
}
catch (Exception e)
{
}
}
[JsonObject(MemberSerialization.OptIn)]
public class DefinitionTranslationDto
{
[JsonProperty]
public Guid DefinitionId { get; set; }
public string DatabaseName { get; set; }
[JsonProperty]
public Guid DatabaseGuid { get; set; }
public string AttributeId { get; set; }
public string AttributeName {get;set;}
[JsonProperty]
public Guid AttributeGUID { get; set; }
public DefinitionTranslationDto(Guid definitionId, string databaseName, Guid databaseGuid, string attributeId, string attributeName, Guid attributeGuid)
{
DefinitionId = definitionId;
DatabaseName = databaseName;
DatabaseGuid = databaseGuid;
AttributeId = attributeId;
AttributeName = attributeName;
AttributeGUID = attributeGuid;
}
}
public class ScoreInfo
{
public string DatabaseName { get; set; }
public Guid DatabaseGuid { get; set; }
public string DimensionName { get; set; }
public Guid HierarchyGUID { get; set; }
public Guid DimensionGUID { get; set; }
public string AttributeName { get; set; }
public Guid AttributeGUID { get; set; }
public List<Guid> DefinitionGuids { get; set; } = new List<Guid>();
public ScoreInfo(string databaseName, Guid databaseGuid, string dimensionName, Guid hierarchyGUID, Guid dimensionGUID, string attributeName, Guid attributeGUID)
{
DatabaseName = databaseName;
DatabaseGuid = databaseGuid;
DimensionName = dimensionName;
HierarchyGUID = hierarchyGUID;
DimensionGUID = dimensionGUID;
AttributeName = attributeName;
AttributeGUID = attributeGUID;
}
}
public class WorkDto
{
public Guid HierarchyGuid { get; set; }
public Guid DimensionGuid { get; set; }
public Guid AttributeGuid { get; set; }
public string HierarchyId { get; set; }
public string DimensionId { get; set; }
public string AttributeId { get; set; }
public string Name { get; set; }
public List<Guid> DefinitionGuids { get; set; }
public bool ByName { get; set; } = false;
public ScoreInfo score { get; set; }
}
public void DumpScore()
{
var Score =
(from d in ScoreDimensions
join dg in ScoreDimensionGroups on d.DimensionGUID equals dg.DimensionGUID
join a in ScoreAttributes on dg.DimensionGroupGUID equals a.DimensionGroupGUID
select new { DimensionName = d.FriendlyName, d.DefaultHierarchyGUID, d.DimensionGUID, AttributeName = a.FriendlyName, a.AttributeGUID });
Score
.GroupBy(sdm => new { sdm.DimensionName, sdm.DefaultHierarchyGUID, sdm.DimensionGUID }, (g, d) => new
{
Dimension = new
{
g.DimensionName,
g.DimensionGUID,
g.DefaultHierarchyGUID,
Attributes = d.Count()
},
Attributes = d.Select(sdm => new
{
sdm.AttributeName,
sdm.AttributeGUID
})
.OrderBy(sdm => sdm.AttributeName)
.ToList()
})
.OrderBy(ss => ss.Dimension.DimensionName)
.Dump();
}
// Define other methods and classes here
#region *** Other classes ***
IEnumerable<T> GetList<T>(RestClient client, string something)
{
return Get<List<T>>(client, something);
}
T Get<T>(RestClient client, string something)
{
client.BaseUrl = new Uri(BaseUrl + something);
RestRequest request = new RestRequest();
request.Method = Method.GET;
return JsonConvert.DeserializeObject<T>(client.Execute(request).Content,
new JsonSerializerSettings
{
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
args.ErrorContext.Error.Message.Dump();
args.ErrorContext.Handled = true;
}
});
}
public class DefinitionDto
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Guid HierarchyGuid { get; set; }
public Guid DimensionGuid { get; set; }
public Guid AttributeGuid { get; set; }
public string HierarchyId { get; set; }
public string DimensionId { get; set; }
public string AttributeId { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateLastModified { get; set; }
public DefinitionDto()
{
}
}
public class Database
{
public string Server { get; set; }
public Guid DatabaseGuid { get; set; }
public string DatabaseName { get; set; }
public string PhysicalName { get; set; }
public string OrgPin { get; set; }
public string AppVersion { get; set; }
public string Description { get; set; }
public Dictionary<string, string> Fields { get; set; }
public string ConnectionString { get; set; }
public Database()
{
}
public Database(DataRow dr)
{
Server = dr.Field<string>("ServerName");
DatabaseGuid = dr.Field<Guid>("DatabaseGuid");
DatabaseName = dr.Field<string>("DatabaseName");
PhysicalName = dr.Field<string>("PhysicalName");
OrgPin = dr.Field<string>("OrgPin");
AppVersion = dr.Field<string>("AppVersion");
Description = dr.Field<string>("Description");
Fields = new Dictionary<string, string>();
foreach (DataColumn column in dr.Table.Columns)
{
var index = dr.Table.Columns.IndexOf(column);
Fields.Add(column.ColumnName, dr[index].ToString());
}
ConnectionString = BuildConnectionString(Server, PhysicalName);
}
object ToDump() => (object)new
{
//Server,
//DatabaseGuid,
DatabaseName,
//PhysicalName,
//OrgPin,
//AppVersion,
//Description,
ConnectionString
};
}
#endregion
#region *** Other methods here ***
public void DoTheDumping()
{
if (dumpOptions)
{
OptionsDump();
}
if (dumpDBExclusions)
{
dbExclusions.Dump(nameof(dbExclusions));
serverExclusions.Dump(nameof(serverExclusions));
}
if (dumpDBTargets)
{
targetOrgPins.Dump(nameof(targetOrgPins));
targetDBs.Dump(nameof(targetDBs));
targetServers.Dump(nameof(targetServers));
}
if (dumpAppVersionTargets)
{
appVersions.Dump(nameof(appVersions));
}
if (dumpDBList)
{
databases.OrderBy(d => d.Server).ThenBy(d => d.PhysicalName).Dump($"{queryRegion} {nameof(databases)}");
}
if (dumpAppVersions)
{
databases
.GroupBy(db => db.AppVersion, (grp, data) => data.Select(x => x.AppVersion).First())
.OrderByDescending(db => db)
.Dump($"{queryRegion} {nameof(appVersions)}");
}
}
public static IOrderedEnumerable<Database> GetDatabases()
{
switch (queryRegion)
{
case QueryRegions.Production:
smcServer = "ioak-sql-smc-01";
smcDB = "smc prod";
break;
case QueryRegions.Training:
smcServer = "ioak-sql-smc-01";
smcDB = "smc training";
break;
case QueryRegions.Oak:
smcServer = "ioak-sql-smc-01.sdt.local";
smcDB = "smc qa";
break;
default:
smcServer = "DDEN-SQL-SMC-01.sdt.local";
smcDB = "smc dev";
break;
}
if (dumpSmcSql) smcSql.Dump(nameof(smcSql));
List<Database> databases = new List<UserQuery.Database>();
var connStr = BuildConnectionString(smcServer, smcDB);
using (var conn = new SqlConnection(connStr))
{
var command = new SqlCommand(smcSql, conn);
command.CommandType = CommandType.Text;
var database = new DataSet();
conn.Open();
using (DbDataReader reader = command.ExecuteReader())
{
while (true)
{
var table = new DataTable();
database.Tables.Add(table);
table.Load(reader);
if (reader.IsClosed || !reader.NextResult()) break;
}
}
conn.Close();
databases = database.Tables[0].AsEnumerable().Select(dr => new Database(dr)).ToList();
databases = databases.Where(dr => !dbExclusions.Contains(dr.PhysicalName) && !serverExclusions.Contains(dr.Server)).ToList();
if (targetOrgPins.Any())
databases = databases.Where(dr => targetOrgPins.Contains(dr.OrgPin)).ToList();
if (targetServers.Any())
databases = databases.Where(dr => targetServers.Contains(dr.Server)).ToList();
if (targetDBs.Any())
databases = databases.Where(dr => targetDBs.Contains(dr.PhysicalName)).ToList();
if (appVersions.Any())
databases = databases.Where(dr => appVersions.Contains(dr.AppVersion)).ToList();
}
return databases
.OrderBy(d => d.Server).ThenBy(d => d.PhysicalName);
}
public static string BuildConnectionString(string server, string database, string username = null, string password = null)
{
return username == null
? $"data source={server};initial catalog='{database}';persist security info=True;Integrated Security=SSPI;"
: $"data source={server};initial catalog='{database}';User ID={username};pwd={password}";
}
#endregion
+382
View File
@@ -0,0 +1,382 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.Dynamic</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Threading.Tasks</Namespace>
</Query>
#region *** Enumerations ***
public enum QueryRegions
{
Production,
Training,
Oak,
Dev
}
#endregion
#region *** Options ***
public static string crossDBQueryPath = @"D:\CrossDBQueries";
public static QueryRegions queryRegion = QueryRegions.Production;
public static bool dumpSmcSql = false;
public static bool dumpDBList = true;
public static bool dumpQueries = false;
public static string[] appVersions = {
};
public static string[] serverExclusions = {
@"paonsql19.sdt.local\instance1",
@"paonsql17.sdt.local\instance1",
@"p0555-sql-01.sdt.local\instance1",
"P0000-sql-01.sdt.local",
"P9900-SQL-03.sdt.local",
"P9900-sql-05.sdt.local"
};
public static string[] targetServers = {
};
public static string[] targetDBs = {
//"jazz prd Gillette Childrens 20150417.1"
//"jazz prd Southern Illinois 20140408.1"
//"jazz tst Southern Illinois 20190918.1"
//"jazz dev master Prod"
};
#endregion *** Options ***
#region *** SMC Settings and queries ***
public static string smcSql => @"SELECT di.ServerName, di.DatabaseGUID, di.DatabaseName, di.PhysicalName, di.OrgPin, di.AppVersion, di.Description
FROM [dbo].[viewDatabaseInfo] di
WHERE 1=1"
+ (queryRegion == QueryRegions.Dev
? @"
AND di.PhysicalName like 'jazz%'"
: $@"
AND di.PhysicalName like 'jazz {(queryRegion != QueryRegions.Production ? "tst" : "prd")}%'
AND di.ServerName like 'p%'")
+ (serverExclusions.Any()
? $@"
AND di.ServerName not in ('{string.Join("', '", serverExclusions)}')"
: "")
+ (targetServers.Any()
? $@"
AND di.ServerName in ('{string.Join("', '", targetServers)}')"
: "")
+ (targetDBs.Any()
? $@"
AND di.PhysicalName IN ('{string.Join(", '", targetDBs)}')
"
: "")
+ (appVersions.Any()
? $@"
AND di.AppVersion in ('{string.Join("', '", appVersions)}')"
: "");
public static string smcServer { get; set; }
public static string smcDB { get; set; }
#endregion
#region *** Program variables and settings ***
public static int maxThreads = 8;
public static int timeoutInMinutes = 2;
public static IList<CrossDBQueryResult> crossDBQueryResults = new List<CrossDBQueryResult>();
public static IOrderedEnumerable<Database> databases => GetDatabases();
#endregion
void Main()
{
databases
.GroupBy(db => db.AppVersion, (grp, data) => data.Select(x => x.AppVersion).First())
.OrderByDescending(db => db)
.Dump("AppVersions");
/*
databases
.Select(db => new
{
db.AppVersion,
db.PhysicalName,
OrgPin = $"'{db.OrgPin}'" })
.Where(db => db.AppVersion != "2019.43")
.OrderByDescending(db => db.AppVersion)
.ThenBy(db => db.OrgPin)
.Dump("AppVersions");
*/
// ExecuteCrossDBQueries()
// //.Where(r => !r.Exceptions.Any() && (r.Results.First().Results.First().Count() != 2).Any())
// .OrderBy(dbqr => dbqr.Results.Any() ? 0 : 1)
// .ThenBy(dbqr => dbqr.Database.DatabaseName).Dump(nameof(crossDBQueryResults));
}
#region *** Other classes ***
public class CrossDBQueryResult
{
public Database Database { get; set; }
public List<SqlResults> Results { get; set; }
public List<string> Exceptions { get; set; }
public CrossDBQueryResult()
{
Results = new List<SqlResults>();
Exceptions = new List<string>();
}
public CrossDBQueryResult(Database database, string name, IEnumerable<dynamic> enumerable)
: this()
{
Database = database;
Results.Add(new SqlResults(name, enumerable));
}
public CrossDBQueryResult(Database database, Exception exception)
: this()
{
Database = database;
Exceptions.Add(exception.ExceptionMessage());
}
object ToDump() => Exceptions.Any() ? (object)new
{
Database,
Results,
Exceptions
} : new
{
Database,
Results
};
}
public class SqlResults
{
public string Name { get; set; }
public IEnumerable<dynamic> Results { get; set; }
public SqlResults(string name, IEnumerable<dynamic> results)
{
Name = name;
Results = results;
}
}
public static class ExceptionExtension
{
public static string ExceptionMessage(this Exception exception)
{
return $@"{exception.Message}{(exception.InnerException != null
? $@"
{"".PadLeft(40, '-')}
{exception.InnerException.ExceptionMessage()}"
: "")}";
}
}
public class Database
{
public string Server { get; set; }
public Guid DatabaseGuid { get; set; }
public string DatabaseName { get; set; }
public string PhysicalName { get; set; }
public string OrgPin { get; set; }
public string AppVersion { get; set; }
public string Description { get; set; }
public Database()
{
}
public Database(DataRow dr)
{
Server = dr.Field<string>("ServerName");
DatabaseGuid = dr.Field<Guid>("DatabaseGuid");
DatabaseName = dr.Field<string>("DatabaseName");
PhysicalName = dr.Field<string>("PhysicalName");
OrgPin = dr.Field<string>("OrgPin");
AppVersion = dr.Field<string>("AppVersion");
Description = dr.Field<string>("Description");
}
}
public class ThreadWithState
{
private string connectionString => BuildConnectionString(_server, _databaseName);
private Database _database;
private string _server => _database?.Server ?? string.Empty;
private string _databaseName => _database?.PhysicalName ?? string.Empty;
private string sqlName;
private IEnumerable<string> _sqlQueries;
public ThreadWithState(Database database, KeyValuePair<string, IEnumerable<string>> sqlqueries)
{
_database = database;
sqlName = sqlqueries.Key;
_sqlQueries = sqlqueries.Value;
}
public void ThreadProc()
{
var crossDB = crossDBQueryResults.FirstOrDefault(x => x.Database == _database);
IEnumerable<dynamic> ThreadResults;
foreach (var sqlQuery in _sqlQueries)
{
try
{
ThreadResults = SelectDynamic(connectionString, sqlQuery);
var result = ThreadResults.First();
if (crossDB != null)
{
crossDB.Results.Add(new SqlResults(sqlName, ThreadResults));
}
else
{
crossDB = new CrossDBQueryResult(_database, sqlName, ThreadResults);
crossDBQueryResults.Add(crossDB);
}
}
catch (Exception ex)
{
if (crossDB != null)
{
crossDB.Exceptions.Add(new Exception(sqlQuery, ex).ExceptionMessage());
}
else
{
crossDBQueryResults.Add(new CrossDBQueryResult(_database, new Exception(sqlQuery, ex)));
}
}
}
}
}
#endregion
#region *** Other methods here ***
public static IOrderedEnumerable<Database> GetDatabases()
{
switch (queryRegion)
{
case QueryRegions.Production:
smcServer = "ioak-sql-smc-01";
smcDB = "smc prod";
break;
case QueryRegions.Training:
smcServer = "ioak-sql-smc-01";
smcDB = "smc training";
break;
case QueryRegions.Oak:
smcServer = "ioak-sql-smc-01.sdt.local";
smcDB = "smc qa";
break;
default:
smcServer = "DDEN-SQL-SMC-01.sdt.local";
smcDB = "smc dev";
break;
}
if (dumpSmcSql) smcSql.Dump(nameof(smcSql));
IEnumerable<Database> dbInfos = new List<UserQuery.Database>();
var connStr = BuildConnectionString(smcServer, smcDB);
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var command = new SqlCommand(smcSql, conn);
command.CommandType = CommandType.Text;
var table = new DataTable();
using (SqlDataReader reader = command.ExecuteReader())
{
table.BeginLoadData();
table.Load(reader);
table.EndLoadData();
conn.Close();
}
dbInfos = table.AsEnumerable().Select(dr => new Database(dr));
}
return dbInfos
.OrderBy(d => d.Server).ThenBy(d => d.PhysicalName);
}
public Dictionary<string, IEnumerable<string>> GetUserQueries(string path = null)
{
var grp = 0;
return Directory.GetFiles(path ?? Directory.GetCurrentDirectory(), "*.sql", SearchOption.TopDirectoryOnly)
.ToDictionary(d => Path.GetFileNameWithoutExtension(d), f => File.ReadAllLines(f)
.Select(r =>
{
if (r.Equals("go", StringComparison.CurrentCultureIgnoreCase))
{
r = "";
return new { grp = grp++, r };
}
else
{
return new { grp, r };
}
}).GroupBy(r => r.grp, (x, lines) => string.Join(" ", lines.Select(l => l.r).Where(l => !string.IsNullOrEmpty(l)))));
}
public static IEnumerable<dynamic> SelectDynamic(string connStr, string sql)
{
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var command = new SqlCommand(sql, conn);
command.CommandType = CommandType.Text;
command.CommandTimeout = (int)TimeSpan.FromMinutes(timeoutInMinutes).TotalSeconds;
using (var reader = command.ExecuteReader())
{
var names = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList();
foreach (IDataRecord record in reader as IEnumerable)
{
var expando = new ExpandoObject() as IDictionary<string, object>;
foreach (var name in names)
expando[name] = record[name];
yield return expando;
}
}
conn.Close();
}
}
public IList<CrossDBQueryResult> ExecuteCrossDBQueries()
{
if (dumpDBList) databases.Dump(nameof(databases));
var queries = GetUserQueries(crossDBQueryPath);
if (dumpQueries) queries.Dump(nameof(queries));
RunCrossDBQuery(databases, queries);
return crossDBQueryResults;
}
public void RunCrossDBQuery(IEnumerable<Database> databases, Dictionary<string, IEnumerable<string>> sqlList)
{
var stopWatch = DateTime.Now;
var query = databases.AsParallel()
.SelectMany(database => sqlList.Where(sql => sql.Value.Any()).AsParallel()
.Select(sql => new ThreadWithState(database, sql)));
foreach (var q in query)
{
q.ThreadProc();
}
DateTime.Now.Subtract(stopWatch).TotalSeconds.Dump(nameof(stopWatch));
}
public static string BuildConnectionString(string server, string database, string username = null, string password = null)
{
return username == null
? $"data source={server};initial catalog='{database}';persist security info=True;Integrated Security=SSPI;"
: $"data source={server};initial catalog='{database}';User ID={username};pwd={password}";
}
#endregion
+484
View File
@@ -0,0 +1,484 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.Dynamic</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Threading.Tasks</Namespace>
<Namespace>System.Data.Common</Namespace>
</Query>
#region *** Enumerations ***
public enum QueryRegions
{
Production,
Training,
Oak,
Dev
}
#endregion
#region *** Options ***
public static QueryRegions queryRegion = QueryRegions.Production;
public static string crossDBQueryPath = @"D:\CrossDBQueries"; // This is the path to find the queries
public static bool dumpSmcSql = false; // This flag will dump the smc sql to the result
public static bool dumpDBList = false; // This flag will dump the databases to the result
public static bool dumpQueries = true; // This flag will dump the queries to the result
public static bool dumpDBExclusions = false; // This flag will dump the db and server exclusions
public static bool dumpDBTargets = false; // This flag will dump the db and server targets
public static bool dumpAppVersions = false; // This flag will dump the app versions used in the queryRegion
public static bool dumpAppVersionTargets = false; // This flag will dump the app versions targets
public static bool excludeExceptions = true;
public static bool queryCompress = false;
public static bool flatten = true; // This will flatten all of the results into a single list
public static bool showStopWatch = false;
public static bool noQueries = false; // This will stop the CrossDBQuery without running the queries
public static bool useParms = true;
#endregion
public static Parms parms = new Parms
{
name = "FY2020"
};
#region *** Database Selection ***
public static string[] appVersions = { // This is a list of appVersions to filter for in the database list
//"2019.42"
};
public static string[] serverExclusions = { // This is a list of servers to exclude from the database list
@"paonsql19.sdt.local\instance1",
@"paonsql17.sdt.local\instance1",
@"p0555-sql-01.sdt.local\instance1",
"P0000-sql-01.sdt.local",
"P9900-SQL-03.sdt.local",
"P9900-sql-05.sdt.local"
};
public static string[] dbExclusions = { // This is a list of database physical names to exclude from the database list
// "jazz tst Team AP Training 01",
// "jazz tst Team AP Training 02",
// "jazz tst Team AP Training 11",
// "jazz tst Team AP Training 12",
// "jazz tst Team AP Training 13",
// "jazz tst Team AP Training 14"
};
public static string[] targetOrgPins = { // This is a list of org pins to target in the database list
};
public static string[] targetServers = { // This is a list of servers to target in the database list
// "P9900-SQL-11.sdt.local"
};
public static string[] targetDBs = { // This is a list of database physicial names to target in the database list
// "jazz prd Gillette Childrens 20150417.1"
// "jazz prd Southern Illinois 20140408.1"
// "jazz tst Southern Illinois 20190918.1"
// "jazz dev master Prod"
};
#endregion *** Options ***
#region *** SMC Settings and queries ***
public static string smcSql => @"SELECT di.ServerName, di.DatabaseGUID, di.DatabaseName, di.PhysicalName, di.OrgPin, di.AppVersion, di.Description
FROM [dbo].[viewDatabaseInfo] di
WHERE 1=1"
+ (queryRegion == QueryRegions.Dev
? @"
AND di.PhysicalName like 'jazz%'"
: $@"
AND di.PhysicalName like 'jazz {(queryRegion != QueryRegions.Production ? "tst" : "prd")}%'
AND di.ServerName like 'p%'");
public static string smcServer { get; set; }
public static string smcDB { get; set; }
#endregion
#region *** Program variables and settings ***
public static int maxThreads = 8;
public static int timeoutInMinutes = 2;
public static IList<CrossDBQueryResult> crossDBQueryResults = new List<CrossDBQueryResult>();
public static IOrderedEnumerable<Database> databases => GetDatabases();
public static Dictionary<string, IEnumerable<string>> queries = System.IO.Directory.Exists(crossDBQueryPath)
? GetUserQueries(crossDBQueryPath)
: new Dictionary<string, IEnumerable<string>>();
#endregion
void Main()
{
if (dumpDBExclusions)
{
dbExclusions.Dump(nameof(dbExclusions));
serverExclusions.Dump(nameof(serverExclusions));
}
if (dumpDBTargets)
{
targetOrgPins.Dump(nameof(targetOrgPins));
targetDBs.Dump(nameof(targetDBs));
targetServers.Dump(nameof(targetServers));
}
if (dumpAppVersionTargets)
{
appVersions.Dump(nameof(appVersions));
}
if (dumpDBList)
{
databases.OrderBy(d => d.Server).ThenBy(d => d.PhysicalName).Dump($"{queryRegion} {nameof(databases)}");
}
if (dumpAppVersions)
{
databases
.GroupBy(db => db.AppVersion, (grp, data) => data.Select(x => x.AppVersion).First())
.OrderByDescending(db => db)
.Dump($"{queryRegion} {nameof(appVersions)}");
}
if (noQueries) return;
var results = ExecuteCrossDBQueries()
//.Where(r => !r.Exceptions.Any() && (r.Results.First().Results.First().Count() != 2).Any())
//.Where(r => !r.Exceptions.Any() && r.Results.First().Name.Contains("Variation"))
.OrderBy(dbqr => dbqr.Results.Any() ? 0 : 1)
.ThenBy(dbqr => dbqr.Database.DatabaseName);
if (flatten)
{
results
.SelectMany(dbqr => dbqr.Results.SelectMany(r => r.Results).ToList())
.Dump(nameof(crossDBQueryResults));
}
else
{
results.Dump(nameof(crossDBQueryResults));
}
}
public class Parms
{
public string name { get; set; }
}
#region *** Other classes ***
public class CrossDBQueryResultLite
{
public Database Database { get; set; }
public List<SqlResults> Results { get; set; }
}
public class CrossDBQueryResult : CrossDBQueryResultLite
{
public List<string> Exceptions { get; set; }
public CrossDBQueryResult()
{
Results = new List<SqlResults>();
Exceptions = new List<string>();
}
public CrossDBQueryResult(Database database, string name, IEnumerable<dynamic> enumerable)
: this()
{
Database = database;
Results.Add(new SqlResults(name, enumerable));
}
public CrossDBQueryResult(Database database, Exception exception)
: this()
{
Database = database;
Exceptions.Add(exception.ExceptionMessage());
}
object ToDump() => excludeExceptions
? (object)new
{
Database,
Results
}
: new
{
Database,
Results,
Exceptions
};
}
public class SqlResults
{
public string Name { get; set; }
public IEnumerable<dynamic> Results { get; set; }
public SqlResults(string name, IEnumerable<dynamic> results)
{
Name = name;
Results = results;
}
}
public static class ExceptionExtension
{
public static string ExceptionMessage(this Exception exception)
{
return $@"{exception.Message}{(exception.InnerException != null
? $@"
{"".PadLeft(40, '-')}
{exception.InnerException.ExceptionMessage()}"
: "")}";
}
}
public class Database
{
public string Server { get; set; }
public Guid DatabaseGuid { get; set; }
public string DatabaseName { get; set; }
public string PhysicalName { get; set; }
public string OrgPin { get; set; }
public string AppVersion { get; set; }
public string Description { get; set; }
public Dictionary<string, string> Fields { get; set; }
public Database()
{
}
public Database(DataRow dr)
{
Server = dr.Field<string>("ServerName");
DatabaseGuid = dr.Field<Guid>("DatabaseGuid");
DatabaseName = dr.Field<string>("DatabaseName");
PhysicalName = dr.Field<string>("PhysicalName");
OrgPin = dr.Field<string>("OrgPin");
AppVersion = dr.Field<string>("AppVersion");
Description = dr.Field<string>("Description");
Fields = new Dictionary<string, string>();
foreach (DataColumn column in dr.Table.Columns)
{
var index = dr.Table.Columns.IndexOf(column);
Fields.Add(column.ColumnName, dr[index].ToString());
}
}
object ToDump() => (object)new
{
Server,
DatabaseGuid,
DatabaseName,
PhysicalName,
OrgPin,
AppVersion,
Description
};
}
public class ThreadWithState
{
private string connectionString => BuildConnectionString(_server, _databaseName);
private Database _database;
private string _server => _database?.Server ?? string.Empty;
private string _databaseName => _database?.PhysicalName ?? string.Empty;
private string sqlName;
private IEnumerable<string> _sqlQueries;
public ThreadWithState(Database database, KeyValuePair<string, IEnumerable<string>> sqlqueries)
{
_database = database;
sqlName = sqlqueries.Key;
_sqlQueries = sqlqueries.Value;
}
public void ThreadProc()
{
var crossDB = crossDBQueryResults.FirstOrDefault(x => x.Database == _database);
IEnumerable<dynamic> ThreadResults;
foreach (var sqlQuery in _sqlQueries)
{
try
{
ThreadResults = SelectDynamic(_database, connectionString, sqlQuery);
var result = ThreadResults.First();
if (crossDB != null)
{
crossDB.Results.Add(new SqlResults(sqlName, ThreadResults));
}
else
{
crossDB = new CrossDBQueryResult(_database, sqlName, ThreadResults);
crossDBQueryResults.Add(crossDB);
}
}
catch (Exception ex)
{
if (crossDB != null)
{
crossDB.Exceptions.Add(new Exception(sqlQuery, ex).ExceptionMessage());
}
else
{
crossDBQueryResults.Add(new CrossDBQueryResult(_database, new Exception(sqlQuery, ex)));
}
}
}
}
}
#endregion
#region *** Other methods here ***
public static IOrderedEnumerable<Database> GetDatabases()
{
switch (queryRegion)
{
case QueryRegions.Production:
smcServer = "ioak-sql-smc-01";
smcDB = "smc prod";
break;
case QueryRegions.Training:
smcServer = "ioak-sql-smc-01";
smcDB = "smc training";
break;
case QueryRegions.Oak:
smcServer = "ioak-sql-smc-01.sdt.local";
smcDB = "smc qa";
break;
default:
smcServer = "DDEN-SQL-SMC-01.sdt.local";
smcDB = "smc dev";
break;
}
if (dumpSmcSql) smcSql.Dump(nameof(smcSql));
List<Database> databases = new List<UserQuery.Database>();
var connStr = BuildConnectionString(smcServer, smcDB);
using (var conn = new SqlConnection(connStr))
{
var command = new SqlCommand(smcSql, conn);
command.CommandType = CommandType.Text;
var database = new DataSet();
conn.Open();
using (DbDataReader reader = command.ExecuteReader())
{
while (true)
{
var table = new DataTable();
database.Tables.Add(table);
table.Load(reader);
if (reader.IsClosed || !reader.NextResult()) break;
}
}
conn.Close();
databases = database.Tables[0].AsEnumerable().Select(dr => new Database(dr)).ToList();
databases = databases.Where(dr => !dbExclusions.Contains(dr.PhysicalName) && !serverExclusions.Contains(dr.Server)).ToList();
if (targetOrgPins.Any())
databases = databases.Where(dr => targetOrgPins.Contains(dr.OrgPin)).ToList();
if (targetServers.Any())
databases = databases.Where(dr => targetServers.Contains(dr.Server)).ToList();
if (targetDBs.Any())
databases = databases.Where(dr => targetDBs.Contains(dr.PhysicalName)).ToList();
if (appVersions.Any())
databases = databases.Where(dr => appVersions.Contains(dr.AppVersion)).ToList();
}
return databases
.OrderBy(d => d.Server).ThenBy(d => d.PhysicalName);
}
public static Dictionary<string, IEnumerable<string>> GetUserQueries(string path = null)
{
var grp = 0;
var queries = Directory.GetFiles(path ?? Directory.GetCurrentDirectory(), "*.sql", SearchOption.TopDirectoryOnly)
.ToDictionary(d => Path.GetFileNameWithoutExtension(d), f => File.ReadAllLines(f)
.Select(r =>
{
if (r.Equals("go", StringComparison.CurrentCultureIgnoreCase))
{
r = "";
return new { grp = grp++, r };
}
else
{
return new { grp, r };
}
}).GroupBy(r => r.grp, (x, lines) => string.Join(queryCompress ? " " : "\r\n", lines.Select(l => l.r).Where(l => !string.IsNullOrEmpty(l)))));
// foreach (var key in queries.Keys)
// {
// foreach (var query in queries[key])
// {
// if (useParms)
// {
// FormattableString formatter = $"";
// string.Format(formatter, parms).Dump();
// }
// }
// }
if (dumpQueries)
queries.Dump(nameof(queries));
return queries;
}
public static IEnumerable<dynamic> SelectDynamic(Database db, string connStr, string sql)
{
using (var conn = new SqlConnection(connStr))
{
var command = new SqlCommand(sql, conn);
command.CommandType = CommandType.Text;
command.CommandTimeout = (int)TimeSpan.FromMinutes(timeoutInMinutes).TotalSeconds;
var database = new DataSet();
conn.Open();
using (DbDataReader reader = command.ExecuteReader())
{
while (true)
{
var names = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList();
foreach (IDataRecord record in reader as IEnumerable)
{
var expando = new ExpandoObject() as IDictionary<string, object>;
if (flatten)
db.Fields.ForEach((x, y) => expando[x.Key] = x.Value);
foreach (var name in names)
expando[name] = record[name];
yield return expando;
}
if (reader.IsClosed || !reader.NextResult()) break;
}
}
conn.Close();
}
}
public IList<CrossDBQueryResult> ExecuteCrossDBQueries()
{
RunCrossDBQuery(databases, queries);
return crossDBQueryResults;
}
public void RunCrossDBQuery(IEnumerable<Database> databases, Dictionary<string, IEnumerable<string>> sqlList)
{
var stopWatch = DateTime.Now;
var query = databases.AsParallel()
.SelectMany(database => sqlList.Where(sql => sql.Value.Any()).AsParallel()
.Select(sql => new ThreadWithState(database, sql)));
foreach (var q in query)
{
q.ThreadProc();
}
var timer = DateTime.Now.Subtract(stopWatch).TotalSeconds;
if (showStopWatch) timer.Dump(nameof(stopWatch));
}
public static string BuildConnectionString(string server, string database, string username = null, string password = null)
{
return username == null
? $"data source={server};initial catalog='{database}';persist security info=True;Integrated Security=SSPI;"
: $"data source={server};initial catalog='{database}';User ID={username};pwd={password}";
}
#endregion
+503
View File
@@ -0,0 +1,503 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.Dynamic</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Threading.Tasks</Namespace>
<Namespace>System.Data.Common</Namespace>
</Query>
#region *** Enumerations ***
public enum QueryRegions
{
Production,
Training,
Oak,
Dev
}
#endregion
#region *** Options ***
public static QueryRegions queryRegion = QueryRegions.Dev;
public static string crossDBQueryPath = @"C:\Users\tlamb\Documents\CrossDBQueries"; // This is the path to find the queries
public static bool checkForCILicensing = true; // This flag will add a column if the client db is licensed for CI
public static bool dumpOptions = false; // This flag will dumpt this set of options
public static bool dumpSmcSql = false; // This flag will dump the smc sql to the result
public static bool dumpDBList = false; // This flag will dump the databases to the result
public static bool dumpQueries = false; // This flag will dump the queries to the result
public static bool dumpDBExclusions = false; // This flag will dump the db and server exclusions
public static bool dumpDBTargets = false; // This flag will dump the db and server targets
public static bool dumpAppVersions = false; // This flag will dump the app versions used in the queryRegion
public static bool dumpAppVersionTargets = false; // This flag will dump the app versions targets
public static bool excludeExceptions = true;
public static bool queryCompress = false;
public static bool flatten = true; // This will flatten all of the results into a single list
public static bool showStopWatch = false;
public static bool noQueries = false; // This will stop the CrossDBQuery without running the queries
#endregion
public static Parms parms = new Parms
{
name = "FY2020"
};
#region *** Database Selection ***
public static string[] appVersions = { // This is a list of appVersions to filter for in the database list
//"2020.31"
};
public static string[] serverExclusions = { // This is a list of servers to exclude from the database list
@"paonsql19.sdt.local\instance1",
@"paonsql17.sdt.local\instance1",
@"p0555-sql-01.sdt.local\instance1",
"P0000-sql-01.sdt.local",
"P9900-SQL-03.sdt.local",
"P9900-sql-05.sdt.local"
};
public static string[] dbExclusions = { // This is a list of database physical names to exclude from the database list
};
public static string[] targetOrgPins = { // This is a list of org pins to target in the database list
// "0430", "0434", "0555", "0777"
};
public static string[] targetServers = { // This is a list of servers to target in the database list
// "P9900-SQL-11.sdt.local"
// "D0018-SQL-01.sdt.local"
};
public static string[] targetDBs = { // This is a list of database physicial names to target in the database list
// "jazz prd Gillette Childrens 20150417.1"
// "jazz prd Southern Illinois 20140408.1"
// "jazz tst Southern Illinois 20190918.1"
// "jazz dev master Prod"
};
#endregion *** Options ***
#region *** SMC Settings and queries ***
public static string smcSql => $@"SELECT di.ServerName, di.DatabaseGUID, di.DatabaseName, di.PhysicalName, di.OrgPin, di.AppVersion, di.Description
{(checkForCILicensing ? " ,(select COUNT(*) from [dbo].[viewLicenseLink] l where l.NAME = 'ContinuousImprovement' and l.DatabaseGUID = di.DatabaseGUID and l.IsLicensed = 1) CI_LICENSED" : "")}
FROM [dbo].[viewDatabaseInfo] di
WHERE 1=1"
+ (queryRegion == QueryRegions.Dev
? @"
AND di.PhysicalName like 'jazz%'"
: $@"
AND di.PhysicalName like 'jazz {(queryRegion != QueryRegions.Production ? "tst" : "prd")}%'
AND di.ServerName like 'p%'");
public static string smcServer { get; set; }
public static string smcDB { get; set; }
#endregion
#region *** Program variables and settings ***
public static int maxThreads = 8;
public static int timeoutInMinutes = 2;
public static IList<CrossDBQueryResult> crossDBQueryResults = new List<CrossDBQueryResult>();
public static IOrderedEnumerable<Database> databases => GetDatabases();
public static Dictionary<string, IEnumerable<string>> queries = System.IO.Directory.Exists(crossDBQueryPath)
? GetUserQueries(crossDBQueryPath)
: new Dictionary<string, IEnumerable<string>>();
#endregion
void Main()
{
if (dumpOptions)
{
OptionsDump();
}
if (dumpDBExclusions)
{
dbExclusions.Dump(nameof(dbExclusions));
serverExclusions.Dump(nameof(serverExclusions));
}
if (dumpDBTargets)
{
targetOrgPins.Dump(nameof(targetOrgPins));
targetDBs.Dump(nameof(targetDBs));
targetServers.Dump(nameof(targetServers));
}
if (dumpAppVersionTargets)
{
appVersions.Dump(nameof(appVersions));
}
if (dumpDBList)
{
databases.OrderBy(d => d.Server).ThenBy(d => d.PhysicalName).Dump($"{queryRegion} {nameof(databases)}");
}
if (dumpAppVersions)
{
databases
.GroupBy(db => db.AppVersion, (grp, data) => data.Select(x => x.AppVersion).First())
.OrderByDescending(db => db)
.Dump($"{queryRegion} {nameof(appVersions)}");
}
if (noQueries) return;
var results = ExecuteCrossDBQueries()
.OrderBy(dbqr => dbqr.Results.Any() ? 0 : 1)
.ThenBy(dbqr => dbqr.Database.DatabaseName);
if (flatten)
{
results
.SelectMany(dbqr => dbqr.Results.SelectMany(r => r.Results).ToList())
.Where(dbqr => dbqr.CI_LICENSED == "1")
.GroupBy(dbqr => dbqr.DatabaseGUID, (g,d) => d.First())
.Distinct()
.Dump(nameof(crossDBQueryResults));
}
else
{
results.Dump(nameof(crossDBQueryResults));
}
}
public void OptionsDump()
{
var options = new
{
queryRegion,
crossDBQueryPath,
dumpOptions,
dumpSmcSql,
dumpDBList,
dumpQueries,
dumpDBExclusions,
dumpDBTargets,
dumpAppVersions,
dumpAppVersionTargets,
excludeExceptions,
queryCompress,
flatten,
showStopWatch,
noQueries
};
options.Dump(nameof(options));
}
public class Parms
{
public string name { get; set; }
}
#region *** Other classes ***
public class CrossDBQueryResultLite
{
public Database Database { get; set; }
public List<SqlResults> Results { get; set; }
}
public class CrossDBQueryResult : CrossDBQueryResultLite
{
public List<string> Exceptions { get; set; }
public CrossDBQueryResult()
{
Results = new List<SqlResults>();
Exceptions = new List<string>();
}
public CrossDBQueryResult(Database database, string name, IEnumerable<dynamic> enumerable)
: this()
{
Database = database;
Results.Add(new SqlResults(name, enumerable));
}
public CrossDBQueryResult(Database database, Exception exception)
: this()
{
Database = database;
Exceptions.Add(exception.ExceptionMessage());
}
object ToDump() => excludeExceptions
? (object)new
{
Database,
Results
}
: new
{
Database,
Results,
Exceptions
};
}
public class SqlResults
{
public string Name { get; set; }
public IEnumerable<dynamic> Results { get; set; }
public SqlResults(string name, IEnumerable<dynamic> results)
{
Name = name;
Results = results;
}
}
public static class ExceptionExtension
{
public static string ExceptionMessage(this Exception exception)
{
return $@"{exception.Message}{(exception.InnerException != null
? $@"
{"".PadLeft(40, '-')}
{exception.InnerException.ExceptionMessage()}"
: "")}";
}
}
public class Database
{
public string Server { get; set; }
public Guid DatabaseGuid { get; set; }
public string DatabaseName { get; set; }
public string PhysicalName { get; set; }
public string OrgPin { get; set; }
public string AppVersion { get; set; }
public string Description { get; set; }
public Dictionary<string, string> Fields { get; set; }
public Database()
{
}
public Database(DataRow dr)
{
Server = dr.Field<string>("ServerName");
DatabaseGuid = dr.Field<Guid>("DatabaseGuid");
DatabaseName = dr.Field<string>("DatabaseName");
PhysicalName = dr.Field<string>("PhysicalName");
OrgPin = dr.Field<string>("OrgPin");
AppVersion = dr.Field<string>("AppVersion");
Description = dr.Field<string>("Description");
Fields = new Dictionary<string, string>();
foreach (DataColumn column in dr.Table.Columns)
{
var index = dr.Table.Columns.IndexOf(column);
Fields.Add(column.ColumnName, dr[index].ToString());
}
}
object ToDump() => (object)new
{
Server,
DatabaseGuid,
DatabaseName,
PhysicalName,
OrgPin,
AppVersion,
Description
};
}
public class ThreadWithState
{
private string connectionString => BuildConnectionString(_server, _databaseName);
private Database _database;
private string _server => _database?.Server ?? string.Empty;
private string _databaseName => _database?.PhysicalName ?? string.Empty;
private string sqlName;
private IEnumerable<string> _sqlQueries;
public ThreadWithState(Database database, KeyValuePair<string, IEnumerable<string>> sqlqueries)
{
_database = database;
sqlName = sqlqueries.Key;
_sqlQueries = sqlqueries.Value;
}
public void ThreadProc()
{
var crossDB = crossDBQueryResults.FirstOrDefault(x => x.Database == _database);
IEnumerable<dynamic> ThreadResults;
foreach (var sqlQuery in _sqlQueries)
{
try
{
ThreadResults = SelectDynamic(_database, connectionString, sqlQuery);
var result = ThreadResults.First();
if (crossDB != null)
{
crossDB.Results.Add(new SqlResults(sqlName, ThreadResults));
}
else
{
crossDB = new CrossDBQueryResult(_database, sqlName, ThreadResults);
crossDBQueryResults.Add(crossDB);
}
}
catch (Exception ex)
{
if (crossDB != null)
{
crossDB.Exceptions.Add(new Exception(sqlQuery, ex).ExceptionMessage());
}
else
{
crossDBQueryResults.Add(new CrossDBQueryResult(_database, new Exception(sqlQuery, ex)));
}
}
}
}
}
#endregion
#region *** Other methods here ***
public static IOrderedEnumerable<Database> GetDatabases()
{
switch (queryRegion)
{
case QueryRegions.Production:
smcServer = "ioak-sql-smc-01";
smcDB = "smc prod";
break;
case QueryRegions.Training:
smcServer = "ioak-sql-smc-01";
smcDB = "smc training";
break;
case QueryRegions.Oak:
smcServer = "ioak-sql-smc-01.sdt.local";
smcDB = "smc qa";
break;
default:
smcServer = "DDEN-SQL-SMC-01.sdt.local";
smcDB = "smc dev";
break;
}
if (dumpSmcSql) smcSql.Dump(nameof(smcSql));
List<Database> databases = new List<UserQuery.Database>();
var connStr = BuildConnectionString(smcServer, smcDB);
using (var conn = new SqlConnection(connStr))
{
var command = new SqlCommand(smcSql, conn);
command.CommandType = CommandType.Text;
var database = new DataSet();
conn.Open();
using (DbDataReader reader = command.ExecuteReader())
{
while (true)
{
var table = new DataTable();
database.Tables.Add(table);
table.Load(reader);
if (reader.IsClosed || !reader.NextResult()) break;
}
}
conn.Close();
databases = database.Tables[0].AsEnumerable().Select(dr => new Database(dr)).ToList();
databases = databases.Where(dr => !dbExclusions.Contains(dr.PhysicalName) && !serverExclusions.Contains(dr.Server)).ToList();
if (targetOrgPins.Any())
databases = databases.Where(dr => targetOrgPins.Contains(dr.OrgPin)).ToList();
if (targetServers.Any())
databases = databases.Where(dr => targetServers.Contains(dr.Server)).ToList();
if (targetDBs.Any())
databases = databases.Where(dr => targetDBs.Contains(dr.PhysicalName)).ToList();
if (appVersions.Any())
databases = databases.Where(dr => appVersions.Contains(dr.AppVersion)).ToList();
}
return databases
.OrderBy(d => d.Server).ThenBy(d => d.PhysicalName);
}
public static Dictionary<string, IEnumerable<string>> GetUserQueries(string path = null)
{
var grp = 0;
var queries = Directory.GetFiles(path ?? Directory.GetCurrentDirectory(), "*.sql", SearchOption.TopDirectoryOnly)
.ToDictionary(d => Path.GetFileNameWithoutExtension(d), f => File.ReadAllLines(f)
.Select(r =>
{
if (r.Equals("go", StringComparison.CurrentCultureIgnoreCase))
{
r = "";
return new { grp = grp++, r };
}
else
{
return new { grp, r };
}
}).GroupBy(r => r.grp, (x, lines) => string.Join(queryCompress ? " " : "\r\n", lines.Select(l => l.r).Where(l => !string.IsNullOrEmpty(l)))));
if (dumpQueries)
queries.Dump(nameof(queries));
return queries;
}
public static IEnumerable<dynamic> SelectDynamic(Database db, string connStr, string sql)
{
using (var conn = new SqlConnection(connStr))
{
var command = new SqlCommand(sql, conn);
command.CommandType = CommandType.Text;
command.CommandTimeout = (int)TimeSpan.FromMinutes(timeoutInMinutes).TotalSeconds;
var database = new DataSet();
conn.Open();
using (DbDataReader reader = command.ExecuteReader())
{
while (true)
{
var names = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList();
foreach (IDataRecord record in reader as IEnumerable)
{
var expando = new ExpandoObject() as IDictionary<string, object>;
if (flatten)
{
foreach (var field in db.Fields)
{
expando[field.Key] = field.Value;
}
}
foreach (var name in names)
expando[name] = record[name];
yield return expando;
}
if (reader.IsClosed || !reader.NextResult()) break;
}
}
conn.Close();
}
}
public IList<CrossDBQueryResult> ExecuteCrossDBQueries()
{
RunCrossDBQuery(databases, queries);
return crossDBQueryResults;
}
public void RunCrossDBQuery(IEnumerable<Database> databases, Dictionary<string, IEnumerable<string>> sqlList)
{
var stopWatch = DateTime.Now;
var query = databases.AsParallel()
.SelectMany(database => sqlList.Where(sql => sql.Value.Any()).AsParallel()
.Select(sql => new ThreadWithState(database, sql)));
foreach (var q in query)
{
q.ThreadProc();
}
var timer = DateTime.Now.Subtract(stopWatch).TotalSeconds;
if (showStopWatch) timer.Dump(nameof(stopWatch));
}
public static string BuildConnectionString(string server, string database, string username = null, string password = null)
{
return username == null
? $"data source={server};initial catalog='{database}';persist security info=True;Integrated Security=SSPI;"
: $"data source={server};initial catalog='{database}';User ID={username};pwd={password}";
}
#endregion
+205
View File
@@ -0,0 +1,205 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.ComponentModel.Composition.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.ComponentModel.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.Net.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.Net.Http.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>TimeZoneNames</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel.Composition</Namespace>
<Namespace>System.ComponentModel.Composition.Hosting</Namespace>
<Namespace>System.ComponentModel.Composition.Primitives</Namespace>
<Namespace>System.ComponentModel.Composition.ReflectionModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.Globalization</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Net.Http</Namespace>
<Namespace>System.Net.Http.Headers</Namespace>
<Namespace>System.Numerics</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>TimeZoneNames</Namespace>
</Query>
void Main()
{
var currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
// Get server DateTime.
DateTime date = DateTime.Now;
var amount = 12345.67M;
// Get a list of all Cultures
List<CultureInfo> cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
//.Where(ci => ci.Name == "en-MW")
.ToList();
// Add the Cultures to an ArrayList so we can sort them Alphabetically by name.
List<CultureData> cultureList = new List<CultureData>();
foreach (CultureInfo culture in cultures)
{
System.Threading.Thread.CurrentThread.CurrentCulture = culture;
RegionInfo regionInfo = default(RegionInfo);
if (culture.LCID != 4096 && !culture.Equals(CultureInfo.InvariantCulture))
{
regionInfo = new RegionInfo(culture.LCID);
}
string pattern = null;
switch (culture.NumberFormat.CurrencyPositivePattern)
{
case 0:
pattern = "{0}{1:N" + culture.NumberFormat.CurrencyDecimalDigits + "}";
break;
case 1:
pattern = "{1:N" + culture.NumberFormat.CurrencyDecimalDigits + "}{0}";
break;
case 2:
pattern = "{0} {1:N" + culture.NumberFormat.CurrencyDecimalDigits + "}";
break;
case 3:
pattern = "{1:N" + culture.NumberFormat.CurrencyDecimalDigits + "} {0}";
break;
}
cultureList.Add(new CultureData
{
EnglishName = culture.EnglishName,
Name = culture.Name,
Details = new CultureDetails
{
ShortDate_Format = culture.DateTimeFormat.ShortDatePattern,
ShortDate_Example = date.ToShortDateString(),
LongDate_Format = culture.DateTimeFormat.LongDatePattern,
LongDate_Example = date.ToLongDateString(),
ShortTime_Format = culture.DateTimeFormat.ShortTimePattern,
ShortTime_Example = date.ToShortTimeString(),
LongTime_Format = culture.DateTimeFormat.LongTimePattern,
LongTime_Example = date.ToLongTimeString(),
Currency_EnglishName = regionInfo?.CurrencyEnglishName ?? string.Empty,
Currency_NativeName = regionInfo?.CurrencyNativeName ?? string.Empty,
Currency_Format = pattern,
Currency_Example = string.Format(culture, "{0:C}", amount),
Currency_ExampleNeg = string.Format(culture, "{0:C}", (amount * -1)),
Currency_ExampleAlt = string.Format(culture, "{0:c}", amount),
Currency_ExampleAltNeg = string.Format(culture, "{0:C}", (amount * -1)),
Percentage_Format = $"{{{culture.NumberFormat.PercentPositivePattern}{culture.NumberFormat.PercentDecimalSeparator}{culture.NumberFormat.PercentDecimalDigits}:P}}",
Percentage_Symbol = culture.NumberFormat.PercentSymbol,
Percentage_Example = string.Format(culture, "{0:P}", .333)
},
MonthNames = MonthNames(culture),
// TimeZones = TimeZones(currentCulture)
});
}
// Sort Cultures
//cultureList.Sort(new StringComparer());
cultureList
//.Where(l => l.Details.Percentage_Symbol != "%")
.OrderBy(c => c.EnglishName)
//.Where(c => c.EnglishName.Contains("Bermuda"))
.Dump(nameof(cultureList));
currentCulture = CultureInfo.GetCultures(CultureTypes.SpecificCultures).FirstOrDefault(c => c.EnglishName == "English (United States)");
System.Threading.Thread.CurrentThread.CurrentCulture = currentCulture;
}
class CultureDetails
{
public string ShortDate_Format { get; set; }
public string ShortDate_Example { get; set; }
public string LongDate_Format { get; set; }
public string LongDate_Example { get; set; }
public string ShortTime_Format { get; set; }
public string ShortTime_Example { get; set; }
public string LongTime_Format { get; set; }
public string LongTime_Example { get; set; }
public string Currency_EnglishName { get; set; }
public string Currency_NativeName { get; set; }
public string Currency_Format { get; set; }
public string Currency_Example { get; set; }
public string Currency_ExampleNeg { get; set; }
public string Currency_ExampleAlt { get; set; }
public string Currency_ExampleAltNeg { get; set; }
public string Percentage_Format { get; set; }
public string Percentage_Symbol { get; set; }
public string Percentage_Example { get; set; }
}
class CultureData
{
public string EnglishName { get; set; }
public string Name { get; set; }
public IDictionary<int, string> MonthNames { get; set; }
public CultureDetails Details { get; set; }
public IEnumerable<TimeZoneInfo> TimeZones { get; set; }
}
public IDictionary<int, string> MonthNames(CultureInfo culture)
{
return Enumerable.Range(1, 12).ToList()
.Select(mm => new { Key = mm, Value = culture.DateTimeFormat.GetMonthName(mm) })
.ToDictionary(item => item.Key, item => item.Value);
}
public IEnumerable<TimeZoneInfo> TimeZones(CultureInfo culture)
{
return TimeZoneInfo.GetSystemTimeZones();
}
public void TimeZoneList(CultureInfo culture)
{
TimeZoneInfo.GetSystemTimeZones()
.SelectMany(tzi => new[] {
TZNames.GetAbbreviationsForTimeZone(tzi.Id, culture.Name).Daylight != TZNames.GetAbbreviationsForTimeZone(tzi.Id, culture.Name).Standard
? new { Key = tzi.Id.Replace("Standard", "Daylight"), Value = TZNames.GetAbbreviationsForTimeZone(tzi.Id, culture.Name).Daylight }
: new { Key = tzi.Id, Value = TZNames.GetAbbreviationsForTimeZone(tzi.Id, culture.Name).Daylight },
new { Key = tzi.Id, Value = TZNames.GetAbbreviationsForTimeZone(tzi.Id, culture.Name).Standard }})
.GroupBy(x => x.Key)
.Select(g => g.First())
.ToDictionary(item => item.Key, item => item.Value)
.OrderBy(item => item.Key)
.Dump();
}
+605
View File
@@ -0,0 +1,605 @@
<Query Kind="Program">
<Connection>
<ID>580b3b8d-cc02-4a68-8fbd-d1ec374a25f2</ID>
<Persist>true</Persist>
<Server>D0001-sql-11.sdt.local</Server>
<Database>jazz dev master Prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Linq.Dynamic</Namespace>
</Query>
// This link provides a good explanation of the Dynamic Query used in the DataTableJoins
// https://ecs.syr.edu/faculty/fawcett/handouts/CoreTechnologies/CSharp/samples/CSharpSamples/LinqSamples/DynamicQuery/Dynamic%20Expressions.html
//
#region Options
public static int TopRows = 1000; //int.MaxValue;
public static int TableDumpDepth = int.MaxValue; //2;
public static bool ShowTableQuery = false;
public static bool ShowTablesToRemove = false;
public static bool ShowTableNames = false;
public static bool ShowTableList = false;
public static bool ShowMissingUpdate = true;
public static bool ShowMissingLegacy = false;
#endregion
private Connections connections = new Connections
{
//Legacy = new ServerInstance("E0001-SQL-11.sdt.local", "StrataSphere"),
//Update = new ServerInstance("D0011-SQL-01.sdt.local", "StrataSphere")
Legacy = new ServerInstance("D0011-SQL-01.sdt.local", "jazz tst Southern Illinois 20190918.1"),
Update = new ServerInstance("D0011-SQL-01.sdt.local", "jazz tst Southern Illinois 20200331.1")
//Legacy = new ServerInstance("D0001-SQL-11.sdt.local", "jazz tst master prod 20190708.1"),
//Update = new ServerInstance("D0001-SQL-11.sdt.local", "jazz tst master prod")
};
// Hints:
// 1) if you pass a null for the table list it will include all tables in the schema
// 2) if you pass a table name like "C%"' it will only include all tables that start with C
private List<TablesAndColumns> SchemasAndTablesToReview = new List<TablesAndColumns> {
new TablesAndColumns("cci", new[] {"%QVILineItemOpportunity%"}),
//new TablesAndColumns("clientdss", new [] { "FactPatientEncounterSummary" }),
//new TablesAndColumns("dss", new [] {"%CaseType%"}, new[] {"CaseTypeDRGMapping","CaseTypeFamilyMapping","FactCaseTypeMapping"}),
//new TablesAndColumns("fw", new []{ "DimAgeCohort"})
};
void Main()
{
var tables = GetTables().ToList();
// Using 'D|' at the beginning of a column name implies that the sort order is descending for that column
tables.ForEach(table =>
{
switch (table.SchemaName)
{
case "cci":
switch (table.TableName)
{
case "ChargeCodeConfig":
table.Init(
new[] { "ChargeCodeID", "CostDriver" },
keyColumns: new[] { "ChargeCodeID", "CostDriver" }
);
break;
case "ChargeCodeCostDetail":
table.Init(
new[] { "EntityID", "ChargeCodeID" },
keyColumns: new[] { "EntityID", "ChargeCodeID" }
);
break;
case "Configuration":
table.Init(new[] { "D|FiscalYearID" }, new[] { "InitiativeIsSimplifiedWorkflow" }, new[] { "FiscalYearId" });
break;
case "InitiativeWorkflowHistory":
table.Init(new[] { "FromStep", "ToStep" });
break;
case "VariationEncounterSavingInfo":
table.Init(new[] { "EncounterRecordNumber" });
break;
case "FactOpportunityMetric":
table.Init(new[] { "FiscalYearID", "FiscalMonthID" });
break;
case "FactOpportunitySavings":
table.Init(new[] { "FiscalyYearID", "FiscalMonthID" });
break;
case "Initiative":
table.Init(new[] { "Name" });
break;
case "SystemSetting":
table.Excludes(new[] { "IsEncrypted" });
break;
case "QVILineItemOpportunity":
table.KeyColumns(new[] {"BreakdownID", "QVILineItemID", "QualityVariationEventID"});
break;
case "VariationOpportunity":
table.Init(
new[] { "CaseTypeEntityId", "CostDriver" },
keyColumns: new[] { "CostDriver", "CastTypeEntityId" }
);
break;
};
break;
case "clientdss":
switch (table.TableName)
{
case "FactPatientEncounterSummary":
table.Init(
new[] { "EncounterRecordNumber" },
new[] { "MikeQAtest1ID", "CustomJesseValidatingAllOthers", "CustomNewCalculatedSystemFieldasdf" },
where: "OBJ.MSDRGCaseTypeFamilyID <> 0 OR OBJ.APRDRGCaseTypeFamilyID <> 0");
break;
};
break;
case "dss":
switch (table.TableName)
{
case "CaseTypeDRGMapping":
table.Init(new[] { "DRGID" }, keyColumns: new[] { "DRGID" });
break;
case "CaseTypeEntity":
table.Init(new[] { "EntityID", "CaseTypeEntityID" },
keyColumns: new[] { "EntityID", "CaseTypeEntityID" });
break;
case "CaseTypeFamily":
table.Init(new[] { "Name", "CaseTypeFamilyGlobalID", "CaseTypeFamilyID" },
keyColumns: new[] { "Name", "CaseTypeFamilyGlobalID" });
break;
case "CaseTypeFamilyMappingAPRDRG":
table.Init(new[] { "APRDRGCode", "CaseTypeFamilyVersionID", "CaseTypeFamilyID" },
keyColumns: new[] { "APRDRGCode", "CaseTypeFamilyVersionID", "CaseTypeFamilyID" });
break;
case "CaseTypeFamilyMappingCPT":
table.Init(new[] { "CPTCode", "CaseTypeFamilyVersionID", "CaseTypeFamilyID" },
keyColumns: new[] { "CPTCode", "CaseTypeFamilyVersionID", "CaseTypeFamilyID" });
break;
case "CaseTypeFamilyMappingICD10":
table.Init(new[] { "ICD10Code", "MSDRGCode", "CaseTypeFamilyVersionID", "CaseTypeFamilyID" },
keyColumns: new[] { "ICD10Code", "MSDRGCode", "CaseTypeFamilyVersionID", "CaseTypeFamilyID" });
break;
case "CaseTypeFamilyVersion":
table.Init(new[] { "CaseTypeFamilyVersionID" },
keyColumns: new[] { "CaseTypeFamilyVersionID" });
break;
case "DimCaseType":
table.Init(new[] { "CaseTypeFamilyID", "CaseTypeId", "Name" }, jsonColumns: new[] { "CaseTypeConfigJSON" });
break;
};
break;
};
});
if (ShowTableNames) tables.Select(t => t.SchemaTable).Dump(nameof(ShowTableNames));
if (ShowTableList) tables.Dump(nameof(ShowTableList));
DoTheComparisons(connections, tables);
}
// Define other methods and classes here
#region Gather Table Information
public string GetTableQuery()
{
var tableSchemas = string.Join(", ", SchemasAndTablesToReview.Select(sattr => $"'{sattr.SchemaName}'"));
var tableList = string.Join("\r\n", SchemasAndTablesToReview.ConvertAll(sattr =>
{
if (sattr.TableNames?.Any(cn => cn == "*") ?? true)
{
return $"\r\nWHEN c.TABLE_SCHEMA = '{sattr.SchemaName}' THEN 1";
}
else
{
var result = "";
if (sattr.TableNames.Any(tn => tn.Contains("%")))
{
result += sattr.TableNames.Where(tn => tn.Contains("%"))
.Aggregate("", (x, y) => $"{x}\r\nWHEN c.TABLE_SCHEMA = '{sattr.SchemaName}' AND c.TABLE_NAME LIKE '{y}' THEN 1");
}
if (sattr.TableNames.Any(tn => !tn.Contains("%")))
{
result += $"\r\nWHEN c.TABLE_SCHEMA = '{sattr.SchemaName}' AND c.TABLE_NAME IN ({string.Join(", ", sattr.TableNames.Where(tn => !tn.Contains("%")).Select(tn => $"'{tn}'"))}) THEN 1";
}
return result;
}
}));
return $@"SELECT c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE
, CAST(CASE WHEN ccu.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END AS BIT) IsPrimaryKey
FROM INFORMATION_SCHEMA.COLUMNS AS c
LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc ON tc.TABLE_SCHEMA = c.TABLE_SCHEMA AND tc.TABLE_NAME = c.TABLE_NAME
LEFT OUTER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu ON ccu.TABLE_SCHEMA = tc.TABLE_SCHEMA AND ccu.TABLE_NAME = tc.TABLE_NAME AND ccu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME AND ccu.COLUMN_NAME = c.COLUMN_NAME
WHERE c.TABLE_SCHEMA in ({tableSchemas})
AND (CASE {tableList}
ELSE 0
END = 1)
AND c.DATA_TYPE NOT IN ('datetime','uniqueidentifier', 'timestamp')
AND NOT (c.COLUMN_NAME = 'RowID' and CAST(CASE WHEN ccu.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END AS BIT) = 1)
AND tc.CONSTRAINT_TYPE = 'Primary Key'
ORDER BY c.TABLE_NAME, c.ORDINAL_POSITION";
}
public IList<Table> GetTables()
{
var tableQuery = GetTableQuery();
if (ShowTableQuery) tableQuery.Dump(nameof(ShowTableQuery));
var tablesToRemove = SchemasAndTablesToReview.Where(sattr => sattr.ExcludeTables.Any()).SelectMany(sattr => sattr.ExcludeTables.Select(et => new { sattr.SchemaName, ExcludeTable = et }));
var tables = ExecuteQueryDynamic(tableQuery).ToList();
if (tablesToRemove.Any())
{
if (ShowTablesToRemove)
tablesToRemove.Dump(nameof(ShowTablesToRemove));
tables.RemoveAll(x => tablesToRemove.Any(sattr => sattr.SchemaName == x.TABLE_SCHEMA && sattr.ExcludeTable == x.TABLE_NAME));
}
return tables
.GroupBy(x => new { x.TABLE_SCHEMA, x.TABLE_NAME },
(g, d) => new Table(g.TABLE_SCHEMA, g.TABLE_NAME,
d.Select(y => new Column(y.COLUMN_NAME, y.DATA_TYPE, y.IsPrimaryKey)).ToList()))
.ToList();
}
public class Table
{
public string SchemaName { get; set; }
public string TableName { get; set; }
public IList<Column> Columns { get; set; } = new List<Column>();
public IList<OrderBy> OrderBy { get; set; } = new List<OrderBy>();
public IList<string> Exclude { get; set; } = new List<string>();
public IList<string> KeyColumn { get; set; } = new List<string>();
public IList<string> Json { get; set; } = new List<string>();
public string Where { get; set; } = "";
internal string SchemaTable => $"{SchemaName}.{TableName}";
public string SqlSelect => $"select TOP({TopRows}) \r\n\t{SelectColumns}\r\nfrom {SchemaTable} OBJ{Where}{OrderByStatement}";
internal string SelectColumns => !Columns?.Any() ?? true ? "*" : string.Join(",\r\n\t", Columns.Where(c => !Exclude.ToList().Contains(c.ColumnName)).Select(c => c.ColumnName));
internal string OrderByStatement => !OrderBy?.Any() ?? true ? "" : "\r\nOrder By " + string.Join(", ", OrderBy.Select(ob => $"{ob.ColumnName}{(ob.IsDescending ? " DESC" : "")}"));
public Table(string schemaName, string tableName)
{
SchemaName = schemaName;
TableName = tableName;
Columns = new List<Column>();
OrderBy = new List<OrderBy>();
}
public Table(string schemaName, string tableName, IEnumerable<Column> columns)
: this(schemaName, tableName)
{
Columns = columns.ToList();
}
public Table(string schemaName, string tableName, IEnumerable<Column> columns, IEnumerable<OrderBy> orderBy)
: this(schemaName, tableName, columns)
{
OrderBy = orderBy.ToList();
}
/// <sumarry>
///
/// </summary>
/// <param name="oderBys">
/// Using 'D|' at the beginning of a column name implies that the sort order is descending for that column
/// <param>
public void Init(IEnumerable<string> orderBys = null, IEnumerable<string> excludes = null, IEnumerable<string> keyColumns = null, IEnumerable<string> jsonColumns = null, string where = "")
{
Init(orderBys?.Distinct().Select(o => new OrderBy(o.Split('|').Last(), o.StartsWith("D|", StringComparison.CurrentCultureIgnoreCase))) ?? null,
excludes?.Distinct(), keyColumns?.Distinct(), jsonColumns?.Distinct(), where);
}
/// <sumarry>
///
/// </summary>
/// <param name="oderBys">
/// Using 'D|' at the beginning of a column name implies that the sort order is descending for that column
/// <param>
public void Init(IEnumerable<OrderBy> orderBys = null, IEnumerable<string> excludes = null, IEnumerable<string> keyColumns = null, IEnumerable<string> jsonColumns = null, string where = "")
{
if (orderBys != null)
OrderBys(orderBys.Where(x => Columns.Select(c => c.ColumnName).Contains(x.ColumnName)));
if (excludes != null)
Excludes(excludes.Where(x => Columns.Select(c => c.ColumnName).Contains(x)));
if (keyColumns != null)
KeyColumns(keyColumns.Where(x => Columns.Select(c => c.ColumnName).Contains(x)));
if (jsonColumns != null)
JsonColumns(jsonColumns.Where(x => Columns.Select(c => c.ColumnName).Contains(x)));
if (!string.IsNullOrEmpty(where))
where = $"\r\nwhere {where}";
}
/// <sumarry>
/// Using 'D|' at the beginning of a column name implies that the sort order is descending for that column
/// </summary>
public void OrderBys(IEnumerable<OrderBy> orderBys)
{
OrderBy.Clear();
((List<OrderBy>)OrderBy).AddRange(orderBys.Where(o => Columns.Select(c => c.ColumnName).Contains(o.ColumnName, StringComparer.CurrentCultureIgnoreCase)));
}
public void Excludes(IEnumerable<string> excludes)
{
Exclude.Clear();
((List<string>)Exclude).AddRange(excludes.Where(e => Columns.Select(c => c.ColumnName).Contains(e, StringComparer.CurrentCultureIgnoreCase)));
}
public void KeyColumns(IEnumerable<string> keyColumns)
{
KeyColumn.Clear();
((List<string>)KeyColumn).AddRange(keyColumns.Where(kc => Columns.Select(c => c.ColumnName).Contains(kc, StringComparer.CurrentCultureIgnoreCase)));
KeyColumn.Reverse().ToList().ForEach(kc => {
var col = Columns.Single(c => c.ColumnName == kc);
Columns.Remove(col);
Columns.Insert(0, col);
});
}
public void JsonColumns(IEnumerable<string> jsonColumns)
{
Json.Clear();
((List<string>)Json).AddRange(jsonColumns.Where(jc => Columns.Select(c => c.ColumnName).Contains(jc, StringComparer.CurrentCultureIgnoreCase)));
}
}
public class Column
{
public string ColumnName { get; set; }
public string DataType { get; set; }
public bool IsPrimaryKey { get; set; }
public Column(string columnName, string dataType = "", bool isPrimaryKey = false)
{
ColumnName = columnName;
DataType = dataType;
IsPrimaryKey = isPrimaryKey;
}
}
public class OrderBy
{
public string ColumnName { get; set; }
public bool IsDescending { get; set; } = false;
public OrderBy(string columnName, bool isDescending = false)
{
ColumnName = columnName;
IsDescending = isDescending;
}
}
public class TablesAndColumns
{
public string SchemaName { get; set; }
public IEnumerable<string> TableNames { get; set; }
public IEnumerable<string> ExcludeTables { get; set; }
public TablesAndColumns(string schemaName, IEnumerable<string> tables = null, IEnumerable<string> excludeTables = null)
{
SchemaName = schemaName;
TableNames = tables ?? new string[] { "*" };
ExcludeTables = excludeTables ?? new string[] { };
}
}
public class OrderByInformation
{
public string TableName { get; set; }
public IEnumerable<OrderBy> OrderBy { get; set; }
public OrderByInformation(string tableName, IEnumerable<string> columns)
{
TableName = tableName;
OrderBy = columns
.Select(c =>
new OrderBy(c.StartsWith("D|") ? c.Substring(2) : c,
c.StartsWith("D|")));
}
}
public class ColumnsToExclude
{
public string TableName { get; set; }
public IEnumerable<string> ColumnNames { get; set; }
public ColumnsToExclude(string tableName, IEnumerable<string> columns)
{
TableName = tableName;
ColumnNames = columns;
}
}
public class JsonColumns
{
public string TableName { get; set; }
public IEnumerable<string> ColumnNames { get; set; }
public JsonColumns(string tableName, IEnumerable<string> columns)
{
TableName = tableName;
ColumnNames = columns;
}
}
#endregion
#region Do the comparisons
public void DoTheComparisons(Connections connections, IEnumerable<Table> tables)
{
foreach (var table in tables)
{
var sql = table.SqlSelect;
var dataLegacy = GetData(connections.Legacy, sql, table.TableName).AsEnumerable().ToList();
var dataUpdate = GetData(connections.Update, sql, table.TableName).AsEnumerable().ToList();
var compare = new List<CompareSet>();
var jsonColumns = table.Json.ToList() ?? null;
var keyColumns = table.KeyColumn.ToList() ?? null;
var idx = 0;
dataLegacy
.ForEach(legacyRow =>
{
DataRow updateRow = default(DataRow);
if (table.KeyColumn.Any())
{
var keys = string.Join("|", table.KeyColumn.Select(kc => $"{legacyRow.Field<object>(kc)}"));
updateRow = dataUpdate
.FirstOrDefault(y => keys == string.Join("|", table.KeyColumn.Select(kc => $"{y.Field<object>(kc)}")));
}
else
{
if (dataUpdate.Count() > idx)
updateRow = dataUpdate[idx++];
}
if ((ShowMissingUpdate && updateRow == null) ||
(updateRow != null && JsonConvert.SerializeObject(legacyRow.ItemArray) != JsonConvert.SerializeObject(updateRow.ItemArray)))
compare.Add(new CompareSet(compare.Count, legacyRow, updateRow, jsonColumns, keyColumns));
});
if (ShowMissingLegacy && table.KeyColumn.Any())
{
dataUpdate
.ForEach(updateRow =>
{
DataRow legacyRow = default(DataRow);
if (table.KeyColumn.Any())
{
var keys = string.Join("|", table.KeyColumn.Select(kc => $"{updateRow.Field<object>(kc)}"));
legacyRow = dataLegacy
.FirstOrDefault(y => keys == string.Join("|", table.KeyColumn.Select(kc => $"{y.Field<object>(kc)}")));
}
if (legacyRow == null)
compare.Add(new CompareSet(compare.Count, legacyRow, updateRow, jsonColumns, keyColumns));
});
}
if (compare.Any())
{
compare.OrderBy(c => c.OrderBy)
.Dump($"{table.SchemaTable} ( {compare.Count()} / {dataLegacy.Count} / {dataUpdate.Count} rows )", TableDumpDepth);
}
else
{
"No differences found in data".Dump($"{table.SchemaTable} ( 0 / {dataLegacy.Count} / {dataUpdate.Count} rows )");
}
}
}
public class Connections
{
public ServerInstance Legacy { get; set; }
public ServerInstance Update { get; set; }
}
public class ServerInstance
{
public string Server { get; set; }
public string Database { get; set; }
public ServerInstance(string server, string database)
{
Server = server;
Database = database;
}
}
public DataTable GetData(ServerInstance serverInstance, string sql, string tableName)
{
var server = serverInstance.Server;
var database = serverInstance.Database;
var connStr = $"data source={server};initial catalog='{database}';persist security info=True;Integrated Security=SSPI;";
using (var conn = new SqlConnection(connStr))
{
var datatable = new DataTable();
var adapter = new SqlDataAdapter(sql, conn);
try
{
adapter.Fill(datatable);
}
catch (Exception)
{
sql.Dump(nameof(sql));
throw;
}
datatable.TableName = tableName;
return datatable;
}
}
public class CompareSet
{
internal int Row { get; set; }
internal IList<string> ColumnNames { get; set; }
internal IList<object> Legacy { get; set; }
internal IList<object> Update { get; set; }
internal int OrderBy { get; set; } = 0;
public IList<Row> Rows { get; set; }
internal IList<string> JsonColumns { get; set; }
internal IList<string> KeyColumns { get; set; }
public CompareSet(int row, DataRow right, DataRow left, IList<string> jsonColumns, IList<string> keyColumns)
{
Row = ++row;
if (right == null)
{
ColumnNames = left.Table.Columns.Cast<DataColumn>().Select(dc => dc.ColumnName).ToList();
}
else
{
ColumnNames = right.Table.Columns.Cast<DataColumn>().Select(dc => dc.ColumnName).ToList();
}
Legacy = right?.ItemArray.ToList();
Update = left?.ItemArray.ToList();
OrderBy = (right != null ? 0 : 2) + (left != null ? 0 : 1);
JsonColumns = jsonColumns ?? new List<string>();
KeyColumns = keyColumns ?? new List<string>();
Rows = ColumnNames.Select((c, i) => new Row(row, c, Legacy?[i], Update?[i], JsonColumns?.Contains(c, StringComparer.CurrentCultureIgnoreCase) ?? false)).ToList();
}
public CompareSet(int row, DataRow right, DataRow left)
: this(row, right, left, null, null)
{
}
object ToDump() => new
{
Row = $"{Row}",
Rows = Rows.Select(x => new
{
Column = (x.Left ?? "").Equals(x.Right ?? "")
? KeyColumns.Contains((string)x.Column)
? new XElement("LINQPad.HTML", new XElement("div", new XAttribute("style", "background-color:cyan;color:black"), x.Column))
: (object)x.Column
: new XElement("LINQPad.HTML", new XElement("div", new XAttribute("style", "background-color:lightyellow;color:black"), x.Column)),
Legacy = x.Left,
Update = x.Right
})
};
}
public class Row
{
public int RowId { get; set; }
public string Column;
public bool IsJson;
public object Left;
public object Right;
public Row(int row, string column, object left, object right)
{
RowId = row;
Column = column;
Left = left;
Right = right;
}
public Row(int row, string column, object left, object right, bool isJson)
: this(row, column, left, right)
{
IsJson = isJson;
if (!isJson) return;
if (left != null)
{
Left = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(left.ToString(),
new JsonSerializerSettings
{
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
args.ErrorContext.Handled = true;
}
}), Newtonsoft.Json.Formatting.Indented);
}
if (right != null)
{
Right = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(right.ToString(),
new JsonSerializerSettings
{
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
args.ErrorContext.Handled = true;
}
}), Newtonsoft.Json.Formatting.Indented);
}
}
}
#endregion
+460
View File
@@ -0,0 +1,460 @@
<Query Kind="Program">
<Connection>
<ID>77b65bea-e766-4e3c-a1ed-c4c2534b6019</ID>
<Persist>true</Persist>
<Server>D0001-SQL-11.sdt.local</Server>
<Database>jazz dev master Prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.Linq.Expressions.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.Linq.Queryable.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Linq.Dynamic</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
private List<TablesAndColumns> SchemasAndTablesToReview = new List<TablesAndColumns>();
private List<OrderByInformation> OrderByStatements = new List<OrderByInformation>();
private List<ColumnsToExclude> ColumnsToBeExcluded = new List<ColumnsToExclude>();
private List<JsonColumns> JsonColumnsToBeParsed = new List<JsonColumns>();
private Dictionary<string, string> JoinClauses = new Dictionary<string, string>();
private static Dictionary<string, string> WhereClauses = new Dictionary<string, string>();
public static int TopRows = 1000;//int.MaxValue;
void Main()
{
SchemasAndTablesToReview.Clear();
SchemasAndTablesToReview.Add(new TablesAndColumns("cci", new[] {"VariationOpportunity"}));
WhereClauses.Clear();
WhereClauses.Add("clientdss.FactPatientEncounterSummary", "OBJ.MSDRGCaseTypeFamilyID <> 0 OR OBJ.APRDRGCaseTypeFamilyID <> 0");
OrderByStatements.AddRange(new[]
{
new OrderByInformation("cci.InitiativeWorkflowHistory", new [] {"FromStep","ToStep"}),
new OrderByInformation("cci.VariationEncounterSavingInfo", new []{"EncounterRecordNumber","PhysicianID"}),
new OrderByInformation("cci.FactOpportunityMetric", new []{"FiscalYearID","FiscalMonthID"}),
new OrderByInformation("cci.FactOpportunitySavings", new []{"FiscalyYearID","FiscalMonthID"}),
new OrderByInformation("cci.Initiative", new []{"Name"}),
new OrderByInformation("cci.VariationOpportunity", new []{"CaseTypeEntityId", "CostDriver"}),
new OrderByInformation("clientdss.FactPatientEncounterSummary", new []{"EncounterRecordNumber"}),
new OrderByInformation("dss.CaseTypeFamily", new []{"Name", "CaseTypeFamilyGlobalID", "CaseTypeFamilyID"}),
new OrderByInformation("dss.CaseTypeFamilyMappingCPT", new []{"CPTCode", "CaseTypeFamilyVersionID", "CaseTypeFamilyID"}),
new OrderByInformation("dss.DimCaseType", new []{"CaseTypeFamilyID", "CaseTypeId", "Name"})
});
JoinClauses.Clear();
JoinClauses.Add("cci.VariationOpportunity", "new(CaseTypeEntityId as firstKey, CostDriver as secondKey)");
ColumnsToBeExcluded.AddRange(new[]
{
new ColumnsToExclude("cci.SystemSetting", new [] {"IsEncrypted"}),
new ColumnsToExclude("cci.Configuration", new [] {"InitiativeIsSimplifiedWorkflow"}),
new ColumnsToExclude("clientdss.FactPatientEncounterSummary", new [] {"MikeQAtest1ID", "CustomJesseValidatingAllOthers", "CustomNewCalculatedSystemFieldasdf"})
});
JsonColumnsToBeParsed.AddRange(new[]
{
new JsonColumns("dss.DimCaseType", new [] {"CaseTypeConfigJSON"})
});
var tables = GetTables();
var connections = new Connections {
Legacy = new ServerInstance("D0001-SQL-11.sdt.local", "jazz tst master prod 20190708.1"),
Update = new ServerInstance("D0001-SQL-11.sdt.local","jazz tst master prod")
};
DoTheComparisons(connections, tables);
}
// Define other methods and classes here
#region Gather Table Information
public string GetTableQuery()
{
var tableSchemas = string.Join(", ", SchemasAndTablesToReview.Select(sattr => $"'{sattr.SchemaName}'"));
var tableList = string.Join("\r\n", SchemasAndTablesToReview.ConvertAll(sattr =>
{
if (sattr.TableNames?.Any(cn => cn == "*") ?? true)
{
return $"WHEN c.TABLE_SCHEMA = '{sattr.SchemaName}' THEN 1";
}
else
{
return $"WHEN c.TABLE_SCHEMA = '{sattr.SchemaName}' AND c.TABLE_NAME IN ({string.Join(", ", sattr.TableNames.Select(cn => $"'{cn}'"))}) THEN 1";
}
}));
return $@"SELECT c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE
, CAST(CASE WHEN ccu.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END AS BIT) IsPrimaryKey
FROM INFORMATION_SCHEMA.COLUMNS AS c
LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc ON tc.TABLE_SCHEMA = c.TABLE_SCHEMA AND tc.TABLE_NAME = c.TABLE_NAME
LEFT OUTER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu ON ccu.TABLE_SCHEMA = tc.TABLE_SCHEMA AND ccu.TABLE_NAME = tc.TABLE_NAME AND ccu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME AND ccu.COLUMN_NAME = c.COLUMN_NAME
WHERE c.TABLE_SCHEMA in ({tableSchemas})
AND (CASE
{tableList}
ELSE 0
END = 1)
AND c.DATA_TYPE NOT IN ('datetime','uniqueidentifier', 'timestamp')
AND NOT (c.COLUMN_NAME = 'RowID' and CAST(CASE WHEN ccu.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END AS BIT) = 1)
AND tc.CONSTRAINT_TYPE = 'Primary Key'
ORDER BY c.TABLE_NAME, c.ORDINAL_POSITION";
}
public IList<Table> GetTables()
{
var tableQuery = GetTableQuery();
return ExecuteQueryDynamic(tableQuery)
.GroupBy(x => new { x.TABLE_SCHEMA, x.TABLE_NAME }, (g, d) => new Table
{
SchemaName = g.TABLE_SCHEMA,
TableName = g.TABLE_NAME,
Columns = d
.Select(y => new Column
{
ColumnName = y.COLUMN_NAME,
DataType = y.DATA_TYPE,
IsPrimaryKey = y.IsPrimaryKey
}),
OrderBy = OrderByStatements?.SingleOrDefault(obs => obs.TableName == $"{g.TABLE_SCHEMA}.{g.TABLE_NAME}")?.OrderBy,
Exclude = ColumnsToBeExcluded?.SingleOrDefault(ctbe => ctbe.TableName == $"{g.TABLE_SCHEMA}.{g.TABLE_NAME}")?.ColumnNames ?? new List<string>(),
Json = JsonColumnsToBeParsed?.SingleOrDefault(ctbe => ctbe.TableName == $"{g.TABLE_SCHEMA}.{g.TABLE_NAME}")?.ColumnNames ?? new List<string>(),
Where = WhereClauses.ContainsKey($"{g.TABLE_SCHEMA}.{g.TABLE_NAME}") ? $"\r\nwhere {WhereClauses[$"{g.TABLE_SCHEMA}.{g.TABLE_NAME}"]}" : ""
}).ToList();
}
public class Table
{
public string SchemaName { get; set; }
public string TableName { get; set; }
public IEnumerable<Column> Columns { get; set; }
public IEnumerable<OrderBy> OrderBy { get; set; }
public IEnumerable<string> Exclude { get; set; }
public IEnumerable<string> Json { get; set; }
public string Where { get; set; } = "";
internal string SchemaTable => $"{SchemaName}.{TableName}";
public string SqlSelect => $"select TOP({TopRows}) \r\n\t{SelectColumns}\r\nfrom {SchemaTable} OBJ{Where}{OrderByStatement}";
internal string SelectColumns => !Columns?.Any() ?? true ? "*" : string.Join(",\r\n\t", Columns.Where(c => !Exclude.ToList().Contains(c.ColumnName)).Select(c => c.ColumnName));
internal string OrderByStatement => !OrderBy?.Any() ?? true ? "" : "\r\nOrder By " + string.Join(", ", OrderBy.Select(ob => $"{ob.ColumnName}{(ob.IsDescending ? " DESC" : "")}"));
}
public class Column
{
public string ColumnName { get; set; }
public string DataType { get; set; }
public bool IsPrimaryKey { get; set; }
}
public class OrderBy
{
public string ColumnName { get; set; }
public bool IsDescending { get; set; } = false;
}
public class TablesAndColumns
{
public string SchemaName { get; set; }
public IEnumerable<string> TableNames { get; set; }
public TablesAndColumns(string schemaName, IEnumerable<string> tables)
{
SchemaName = schemaName;
TableNames = tables;
}
}
public class OrderByInformation
{
public string TableName { get; set; }
public IEnumerable<OrderBy> OrderBy { get; set; }
public OrderByInformation(string tableName, IEnumerable<string> columns)
{
TableName = tableName;
OrderBy = columns.Select(c => new OrderBy
{
ColumnName = c.StartsWith("D|") ? c.Substring(2) : c,
IsDescending = c.StartsWith("D|")
});
}
}
public class ColumnsToExclude
{
public string TableName { get; set; }
public IEnumerable<string> ColumnNames { get; set; }
public ColumnsToExclude(string tableName, IEnumerable<string> columns)
{
TableName = tableName;
ColumnNames = columns;
}
}
public class JsonColumns
{
public string TableName { get; set; }
public IEnumerable<string> ColumnNames { get; set; }
public JsonColumns(string tableName, IEnumerable<string> columns)
{
TableName = tableName;
ColumnNames = columns;
}
}
#endregion
#region Do the comparisons
public void DoTheComparisons(Connections connections, IEnumerable<Table> tables)
{
foreach (var table in tables)
{
var sql = table.SqlSelect;
var dataLegacy = GetData(connections.Legacy, sql, table.TableName);
var dataUpdate = GetData(connections.Update, sql, table.TableName);
var legacy = dataLegacy.Rows;
var update = dataUpdate.Rows;
ParameterExpression pe1 = Expression.Parameter(dataLegacy.Columns["CaseTypeEntityId"].DataType, "CaseTypeEntityId");
ParameterExpression pe2 = Expression.Parameter(dataLegacy.Columns["CostDriver"].DataType, "CostDriver");
IQueryable legacyTable = dataLegacy.AsEnumerable().AsQueryable();
IEnumerable updateTable = dataUpdate.AsEnumerable();
var query = legacyTable.Join(
updateTable,
"new(get_Item(4) as CostDriver, get_Item(34) as CaseTypeEntityId)",
"new(get_Item(4) as CostDriver, get_Item(34) as CaseTypeEntityId)",
"new(outer as legacy, inner as update)"
);
LambdaExpression le = System.Linq.Dynamic.DynamicExpression.ParseLambda(dataLegacy.AsEnumerable().AsQueryable().ElementType,
null, "new(CaseTypeEntityId as FirstKey, CostDriver as SecondKey)", "new(
// var test = update.AsQueryable().MyJoin(legacy.AsQueryable(), "new(CaseTypeEntityId as firstKey, CostDriver as secondKey)",
// "new(CaseTypeEntityId as firstKey, CostDriver as secondKey)",
// "new inner as legacy, outer as update)");
var idxCount = legacy.Count;
var compare = new List<CompareSet>();
var jsonColumns = tables.SingleOrDefault(t => t.SchemaTable == table.TableName)?.Json.ToList();
foreach (var row in Enumerable.Range(0, idxCount))
{
var r = legacy[row];
if (row < update.Count)
{
var u = update[row];
var rJson = JsonConvert.SerializeObject(r.ItemArray);
var uJson = JsonConvert.SerializeObject(u.ItemArray);
if (rJson != uJson)
{
if (jsonColumns == null)
{
compare.Add(new CompareSet(r, u));
}
else
{
compare.Add(new CompareSet(r, u, jsonColumns));
}
}
}
else
{
if (jsonColumns == null)
{
compare.Add(new CompareSet(r, null));
}
else
{
compare.Add(new CompareSet(r, null, jsonColumns));
}
}
}
if (compare.Any())
{
compare.Dump($"{table.TableName} ({compare.Count()}/{dataLegacy.Rows.Count} rows)", 2);
}
else
{
"No differences found in data".Dump($"{table.TableName} (0/{dataLegacy.Rows.Count} rows)");
}
}
}
/*
public static IQueryable MyJoin(this IQueryable outer, IEnumerable inner, string outerSelector, string innerSelector, string resultsSelector, params object[] values)
{
if (inner == null) throw new ArgumentNullException("inner");
if (outerSelector == null) throw new ArgumentNullException("outerSelector");
if (innerSelector == null) throw new ArgumentNullException("innerSelector");
if (resultsSelector == null) throw new ArgumentNullException("resultsSelctor");
LambdaExpression outerSelectorLambda = DynamicExpression.ParseLambda(outer.ElementType, null, outerSelector, values);
LambdaExpression innerSelectorLambda = DynamicExpression.ParseLambda(inner.AsQueryable().ElementType, null, innerSelector, values);
ParameterExpression[] parameters = new ParameterExpression[] {
Expression.Parameter(outer.ElementType, "outer"), Expression.Parameter(inner.AsQueryable().ElementType, "inner") };
LambdaExpression resultsSelectorLambda = DynamicExpression.ParseLambda(parameters, null, resultsSelector, values);
return outer.Provider.CreateQuery(
Expression.Call(
typeof(Queryable), "Join",
new Type[] { outer.ElementType, inner.AsQueryable().ElementType, outerSelectorLambda.Body.Type, resultsSelectorLambda.Body.Type },
outer.Expression, inner.AsQueryable().Expression, Expression.Quote(outerSelectorLambda), Expression.Quote(innerSelectorLambda), Expression.Quote(resultsSelectorLambda)));
}
public static IQueryable<T> Join<T>(this IQueryable<T> outer, IEnumerable<T> inner, string outerSelector, string innerSelector, string resultsSelector, params object[] values)
{
return (IQueryable<T>)Join((IQueryable)outer, (IEnumerable)inner, outerSelector, innerSelector, resultsSelector, values);
}
*/
public class Connections
{
public ServerInstance Legacy { get; set; }
public ServerInstance Update { get; set; }
}
public class ServerInstance
{
public string Server { get; set; }
public string Database { get; set; }
public ServerInstance(string server, string database)
{
Server = server;
Database = database;
}
}
public DataTable GetData(ServerInstance serverInstance, string sql, string tableName)
{
var server = serverInstance.Server;
var database = serverInstance.Database;
var connStr = $"data source={server};initial catalog='{database}';persist security info=True;Integrated Security=SSPI;";
using (var conn = new SqlConnection(connStr))
{
var datatable = new DataTable();
var adapter = new SqlDataAdapter(sql, conn);
try
{
adapter.Fill(datatable);
}
catch (Exception ex)
{
sql.Dump(nameof(sql));
throw;
}
datatable.TableName = tableName;
return datatable;
}
}
public class CompareSet
{
internal IList<string> ColumnNames { get; set; }
internal IList<object> Legacy { get; set; }
internal IList<object> Update { get; set; }
public IList<Row> Rows { get; set; }
internal IList<string> JsonColumns { get; set; }
public CompareSet(DataRow right, DataRow left)
{
ColumnNames = right.Table.Columns.Cast<DataColumn>().Select(dc => dc.ColumnName).ToList();
Legacy = right.ItemArray.ToList();
Update = left?.ItemArray.ToList();
Rows = ColumnNames.Select((c, i) => new Row(c, Legacy[i], Update?[i])).ToList();
}
public CompareSet(DataRow right, DataRow left, IList<string> jsonColumns)
{
ColumnNames = right.Table.Columns.Cast<DataColumn>().Select(dc => dc.ColumnName).ToList();
Legacy = right.ItemArray.ToList();
Update = left?.ItemArray.ToList();
JsonColumns = jsonColumns;
Rows = ColumnNames.Select((c, i) => new Row(c, Legacy[i], Update?[i], JsonColumns.Contains(c, StringComparer.CurrentCultureIgnoreCase))).ToList();
}
}
public class Row
{
public string Column;
public bool IsJson;
public object Left;
public object Right;
public Row(string column, object left, object right)
{
Column = column;
Left = left;
Right = right;
}
public Row(string column, object left, object right, bool isJson)
: this(column, left, right)
{
IsJson = isJson;
if (!isJson) return;
Left = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(left.ToString(),
new JsonSerializerSettings
{
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
args.ErrorContext.Handled = true;
}
}), Newtonsoft.Json.Formatting.Indented);
if (right == null) return;
Right = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(right.ToString(),
new JsonSerializerSettings
{
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
args.ErrorContext.Handled = true;
}
}), Newtonsoft.Json.Formatting.Indented);
}
object ToDump() => new
{
Column = Left.Equals(Right ?? "") ? (object)Column : new XElement("LINQPad.HTML", new XElement("div", new XAttribute("style", "background-color:lightyellow;color:black"), Column)),
Legacy = Left,
Update = Right
};
}
#endregion
+66
View File
@@ -0,0 +1,66 @@
<Query Kind="Statements">
<Connection>
<ID>877f607f-de79-449a-a047-e6d0c5b9e5d2</ID>
<Persist>true</Persist>
<Server>DDEN-SQL-SMC-01.sdt.local</Server>
<Database>smc dev</Database>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
var dbInformation = (from dbInfo in ViewDatabaseInfo
where dbInfo.IsProduction.HasValue && dbInfo.IsProduction.Value
orderby dbInfo.Description, dbInfo.DatabaseName
select dbInfo);
dbInformation
.Dump();
+148
View File
@@ -0,0 +1,148 @@
<Query Kind="Statements">
<Connection>
<ID>77b65bea-e766-4e3c-a1ed-c4c2534b6019</ID>
<Persist>true</Persist>
<Server>D0001-SQL-11.sdt.local</Server>
<Database>jazz dev master</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel.Composition</Namespace>
<Namespace>System.ComponentModel.Composition.Hosting</Namespace>
<Namespace>System.ComponentModel.Composition.Primitives</Namespace>
<Namespace>System.ComponentModel.Composition.ReflectionModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Net.Http</Namespace>
<Namespace>System.Net.Http.Headers</Namespace>
<Namespace>System.Numerics</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>System.Dynamic</Namespace>
</Query>
var emptyGuid = Guid.Empty.ToString();
var dashboards = (from dashboard in DesktopTemplates
join module in SystemCenterModules on dashboard.ModuleGUID equals module.ModuleGUID
join solution in SystemCenterSolutions on module.SolutionGUID equals solution.SolutionGUID
where dashboard.IsLegacy == false && solution.IsStatusDisabled == false
select new
{
solution = solution.Name,
primarySort = solution.SortOrder,
module = module.Name,
categories = module.SystemCenterCategories
.Where(c => c.IsMaintenanceMode == true).OrderBy(c => c.SortOrder)
.Select(c => new { c.Name, SortOrder = c.SortOrder.ToString() }).ToList(),
secondarySort = module.SortOrder,
dashboard.DesktopTemplateGUID,
dashboard.Name,
dashboard.Description,
parameters = dashboard.DesktopParameters.Any()
? dashboard.DesktopParameters.Select(p => new
{
p.Name,
p.ColumnName,
p.DimensionName,
p.AttributeName,
p.DataSourceGUID,
ExcludedWidgetGuids = string.IsNullOrEmpty(p.ExcludedWidgetGuidsCSV) ? null : p.ExcludedWidgetGuidsCSV.Split(',')
}).Distinct().ToList()
: null,
// columns = dashboard.DesktopColumns.Any() ? dashboard.DesktopColumns.ToList() : null,
widgets = dashboard.DashboardWidgets.Any()
? dashboard.DashboardWidgets.Select(w => new
{
w.Name,
w.Row,
w.Col,
w.Height,
w.Width,
w.WidgetClassName,
DataSourceGUID = w.DataSourceGUID.ToString() == "00000000-0000-0000-0000-000000000000" ? "" : w.DataSourceGUID.ToString(),
WidgetJSON = (JsonConvert.DeserializeObject<ExpandoObject>(w.WidgetJSON) as IDictionary<string, object>)
})
.Select(w => new
{
w.Name,
w.Row,
w.Col,
w.Height,
w.Width,
w.WidgetClassName,
w.DataSourceGUID,
w.WidgetJSON,
ReportGuid = w.WidgetClassName == "Grid" || w.WidgetClassName == "Chart" ||
(w.WidgetClassName == "Metric" && w.WidgetJSON["ReportGuid"] != emptyGuid)
? w.WidgetJSON["ReportGuid"]
: null
})
.OrderBy(w => w.Row).ThenBy(w => w.Col).ToList()
: null,
desktop = dashboard.DesktopWidgets.Any()
? dashboard.DesktopWidgets.Select(w => new
{
w.Name,
w.Height,
w.DesktopTemplateGUID,
w.WidgetFullName,
w.WidgetXML
}).ToList()
: null
})
.OrderBy(x => x.primarySort).ThenBy(x => x.secondarySort).ThenBy(x => x.Name).ToList();
dashboards.Dump();
dashboards.Where(d => d.parameters != null).SelectMany(d => d.parameters)
.OrderBy(d => d.DimensionName).ThenBy(d => d.AttributeName).Dump();
dashboards.SelectMany(d => d.widgets.Where(w => w.WidgetClassName == "Report" || w.WidgetClassName == "Chart")
.Select(w => new {Dashboard = d.Name, Report = w.Name, w.Row, w.Col, w.Height, w.Width, w.WidgetClassName, w.DataSourceGUID, w.ReportGuid}))
.OrderBy(d => d.Dashboard).ThenBy(d => d.Report).Dump();
dashboards.SelectMany(d => d.widgets.Where(w => w.WidgetClassName == "Metric")
.Select(w => new { Dashboard = d.Name, Report = w.Name, w.Row, w.Col, w.Height, w.Width, w.WidgetClassName, w.DataSourceGUID, w.WidgetJSON }))
.OrderBy(d => d.Dashboard).ThenBy(d => d.Report).Dump();
+84
View File
@@ -0,0 +1,84 @@
<Query Kind="Statements">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>TimePeriodLibrary.NET</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel.Composition</Namespace>
<Namespace>System.ComponentModel.Composition.Hosting</Namespace>
<Namespace>System.ComponentModel.Composition.Primitives</Namespace>
<Namespace>System.ComponentModel.Composition.ReflectionModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Net.Http</Namespace>
<Namespace>System.Net.Http.Headers</Namespace>
<Namespace>System.Numerics</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>Itenso.TimePeriod</Namespace>
</Query>
var date1 = DateTime.Now.AddMonths(-6);
date1.Dump();
var date2 = DateTime.Now.AddMonths(-19).AddDays(-14).AddHours(-25);
date2.Dump();
"".PadLeft(40, '=').Dump();
var tock = date1.Subtract(date2).Ticks;
TimeSpan ts = date1 - date2;
$"{ts.TotalDays} Days".Dump();
"".PadLeft(40, '-').Dump();
var dateDiff = new DateDiff(date2, date1);
$"{dateDiff.ElapsedYears} Years {dateDiff.ElapsedMonths} Months {dateDiff.ElapsedDays} Days".Dump();
"".PadLeft(40, '-').Dump();
var xx = new DateTime(Math.Abs(tock));
xx.Dump();
xx.Year.Dump();
xx.Month.Dump();
xx.Day.Dump();
+99
View File
@@ -0,0 +1,99 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>AWSSDK.Glue</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>FluentAssertions</NuGetReference>
<NuGetReference>Newtonsoft.Json</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>FluentAssertions</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
for (var x = 0; x > -5; x--)
{
try
{
var testDate = DateTime.Now.AddYears(x);
testDate.Dump($"{x}");
RunValidation(testDate);
}
catch (Exception ex)
{
$"{x} - {ex.Message}".Dump();
}
}
}
public void RunValidation(DateTime testDate)
{
testDate.AddMilliseconds(-1).GetPrettyDate().Should().Be("just now");
testDate.AddSeconds(-1).GetPrettyDate().Should().Be("just now");
testDate.AddMinutes(-1).GetPrettyDate().Should().Be("1 minute ago");
for (var x = -2; x >= -59; x--)
{
testDate.AddMinutes(-x).GetPrettyDate().Should().Be($"{x} minutes ago");
}
testDate.AddHours(-1).GetPrettyDate().Should().Be("1 hour ago");
for (var x = -2; x >= -23; x--)
{
testDate.AddHours(-x).GetPrettyDate().Should().Be($"{x} hours ago");
}
testDate.AddDays(-1).GetPrettyDate().Should().Be("yesterday");
for (var x = -2; x >= -364; x--)
{
testDate.AddDays(-x).GetPrettyDate().Should().Be($"{x} days ago");
}
testDate.AddMonths(-1).GetPrettyDate().Should().Be("5 weeks ago");
for (var x = -2; x >= -364; x--)
{
testDate.AddMonths(-x).GetPrettyDate().Should().Be($"{x} months ago");
}
}
// Define other methods and classes here
+95
View File
@@ -0,0 +1,95 @@
<Query Kind="Program">
<Connection>
<ID>463c2997-8a6a-4688-9575-6549e5215f7b</ID>
<Persist>true</Persist>
<Server>D0011-SQL-01.sdt.local</Server>
<Database>jazz tst CNE 20191210.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
var configurationGuid = Guid.Parse("880C4912-5A58-40B7-ADB1-1F9BD365E6AF");
var configuration = (from c in Configurations where c.ConfigurationGUID == configurationGuid select c).Single();
//configuration.Dump(nameof(configuration));
var baselineEndDate = configuration.WasteEndDate;
var baselineStartDate = baselineEndDate.AddYears(-1).AddDays(1);
(from dpc in DepartmentPatientCensus
where dpc.EnterTime < baselineEndDate && dpc.ExitTime > baselineStartDate
select new { dpc.RowID, dpc.DepartmentID, dpc.EncounterRecordNumber, dpc.EnterTime, dpc.ExitTime, dpc.IsNewborn, baselineStartDate, baselineEndDate })
.ToList()
.GroupBy(ed => new { ed.DepartmentID, ed.EnterTime.Year, ed.EnterTime.Month, ed.EnterTime.Day, ed.EnterTime.Hour }, (g, d) => d.Select(x => new
{
g.DepartmentID,
g.Year,
g.Month,
g.Day,
g.Hour,
newbornEncounters = d.Where(y => y.IsNewborn).Count(),
encounters = d.Where(y => !y.IsNewborn).Count()
}).First())
.Where(ed => new[] { 21398, 21915 }.Contains(ed.DepartmentID))
.GroupBy(ed => ed.DepartmentID, (g, d) => new
{
DepartmentId = g,
Data = d.OrderBy(ed => ed.Year)
.ThenBy(ed => ed.Month)
.ThenBy(ed => ed.Day)
.ThenBy(ed => ed.Hour)
})
.Dump();
}
// Define other methods and classes here
+71
View File
@@ -0,0 +1,71 @@
<Query Kind="Statements">
<Connection>
<ID>a0281727-8f99-469c-a1e8-bda14dcbf030</ID>
<Persist>true</Persist>
<Server>DDEN-SQL-LOG-01.sdt.local</Server>
<Database>jazz log dev</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
PageLogs.OrderByDescending(p => p.RowId)
.Where(p => p.UserName.Contains("tlamb"))
//.Between(p => p.RowId, 4826093, 4826100)
.Take(100).Dump();
//Mapping.GetTables().Where(t => t.TableName == "[PageLog]")
//.First().RowType.DataMembers
//.Where(dm => dm.DbType != null)
//.Select( dm => new {dm.Name, dm.DbType, dm.Type, dm.MappedName, dm.IsPrimaryKey})
//.Dump();
//
+92
View File
@@ -0,0 +1,92 @@
<Query Kind="Program">
<NuGetReference>LinqToCsv</NuGetReference>
<Namespace>LINQtoCSV</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
</Query>
void Main()
{
var thefile = @"D:\Users\tlamb\Downloads\DimCaseType QA Master.csv";
var csvdata = File.ReadAllLines(thefile);
//csvdata.Dump();
var inputFileDescription = new CsvFileDescription
{
SeparatorChar = ',',
FirstLineHasColumnNames = false,
EnforceCsvColumnAttribute = true,
IgnoreUnknownColumns = true,
UseFieldIndexForReadingData = true
};
var cc = new CsvContext();
var data = cc.Read<DimCaseType>(thefile, inputFileDescription).ToList();
//data.Dump();
string.Join("\r\n",
data.ConvertAll(d => $"UPDATE dss.DimCaseType SET CaseTypeConfigJSON = '{d.CaseTypeConfigJSON}' WHERE Name = '{d.Name}' and CaseTypeID = {d.CaseTypeID};")).Dump();
}
// Define other methods and classes here
public class DimCaseType
{
[CsvColumn(FieldIndex = 1)]
public int CaseTypeID { get; set; }
[CsvColumn(FieldIndex = 2)]
public string Name { get; set; }
[CsvColumn(FieldIndex = 3)]
public string CaseTypeConfigJSON { get; set; }
//public MSDRGCaseTypeConfiguration CaseTypeConfig => JsonConvert.DeserializeObject<MSDRGCaseTypeConfiguration>(CaseTypeConfigJSON);
}
public class CaseTypeConfiguration
{
public int PhysicianMinVolume { get; set; } = 0;
}
public class DRGCaseTypeConfiguration : CaseTypeConfiguration
{
public List<int> AgeCohortIDInclusions { get; set; } = new List<int>();
public List<int> PhysicianIDExclusions { get; set; } = new List<int>();
public StandardDeviationExclusions StandardDeviationExcludedTypeEnum { get; set; } = StandardDeviationExclusions.None;
public int LengthOfStayThreshold { get; set; } = 0;
public HashSet<string> CPTCodes { get; set; } = new HashSet<string>();
public List<int> PatientTypeRollupIDInclusions { get; set; } = new List<int>();
}
public class MSDRGCaseTypeConfiguration : DRGCaseTypeConfiguration
#pragma warning restore S101 // Types should be named in PascalCase
{
public HashSet<CCMCCCategoryTypes> CCMCCCategories { get; set; } = new HashSet<CCMCCCategoryTypes>();
}
public enum CCMCCCategoryTypes
#pragma warning restore S2342 // Enumeration types should comply with a naming convention
{
None,
CC,
MCC,
WO,
NA,
CCMCC
}
public enum StandardDeviationExclusions
{
None = 0,
TwoStdDev = 1,
ThreeStdDev = 2,
CustomLOSOutlier = 3
}
public enum PhysicianGroupingTypes
{
Physician = 0,
Specialty = 1,
GroupAffiliation = 2
}
public enum CaseTypeCategories
{
MSDRG = 0,
APRDRG = 1,
PatientPopulation = 2
}
+9
View File
@@ -0,0 +1,9 @@
<Query Kind="Statements">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<Namespace>Newtonsoft.Json</Namespace>
</Query>
var jsonStr = "[{\"HierarchyPath\":\"DEPT|DEPT|1|1|27|2|162\",\"Name\":\"10 - 2530 - NSMC IU NICU\"},{\"HierarchyPath\":\"DEPT|DEPT|1|1|27|2|266\",\"Name\":\"10 - 4000 - SL OPERATING ROOM\"}]";
dynamic obj = JsonConvert.DeserializeObject(jsonStr);
string test = obj[0].HierarchyPath;
test.Dump();
+155
View File
@@ -0,0 +1,155 @@
<Query Kind="Program">
<Connection>
<ID>580b3b8d-cc02-4a68-8fbd-d1ec374a25f2</ID>
<Persist>true</Persist>
<Server>D0001-sql-11.sdt.local</Server>
<Database>jazz dev master Prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
</Query>
void Main()
{
var oppGuid = Guid.Parse("ebe53c65-af17-4372-b7c1-18a6011f7d23");
var opp = from eo in EncounterOpportunities
where eo.OpportunityGUID == oppGuid
select eo;
var pti = from eopti in EncounterOpportunityPerformanceTrackingItems
where eopti.OpportunityGUID == oppGuid
orderby eopti.LevelID, eopti.Type
select new { performanceTrackingItem = JsonConvert.DeserializeObject<PerformanceTrackingItem>(eopti.PerformanceTrackingItem) };
var metrics = from eopemd in EncounterOpportunityPerformanceEngineMetricData
where eopemd.OpportunityGUID == oppGuid
orderby eopemd.LevelID, eopemd.IsBaseline, eopemd.Type
select new
{
eopemd.LevelID,
eopemd.Type,
eopemd.IsBaseline,
months = new[] {
new {Name = "Month01", Value = eopemd.Month01},
new {Name = "Month02", Value = eopemd.Month02},
new {Name = "Month03", Value = eopemd.Month03},
new {Name = "Month04", Value = eopemd.Month04},
new {Name = "Month05", Value = eopemd.Month05},
new {Name = "Month06", Value = eopemd.Month06},
new {Name = "Month07", Value = eopemd.Month07},
new {Name = "Month09", Value = eopemd.Month08},
new {Name = "Month09", Value = eopemd.Month09},
new {Name = "Month10", Value = eopemd.Month10},
new {Name = "Month11", Value = eopemd.Month11},
new {Name = "Month12", Value = eopemd.Month12}
}
};
//var jsonPti = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(pti[1]), Newtonsoft.Json.Formatting.Indented);
//jsonPti.Dump();
opp.Dump(nameof(EncounterOpportunities));
metrics.Dump(nameof(EncounterOpportunityPerformanceEngineMetricData));
pti.FirstOrDefault().Dump(nameof(EncounterOpportunityPerformanceTrackingItems));
}
// Define other methods and classes here
public class PerformanceMonthlyUnitData
{
public int MonthID { get; set; }
public double RampUp { get; set; }
public double Units { get; set; }
public double UnitsYTD { get; set; }
public double Stats { get; set; }
public double StatsYTD { get; set; }
/// <summary>
/// Units DivideBy Stats
/// </summary>
public double UnitsPerStat { get; set; }
public double UnitsPerStatYTD { get; set; }
}
public class PerformanceMonthlySavingsData : PerformanceMonthlyUnitData
{
public double Savings { get; set; }
public double SavingsYTD { get; set; }
}
public class YearMonth
{
public int FiscalYear { get; set; }
public int CalendarYear { get; set; }
public DateTime FiscalYearMonth { get; set; }
public DateTime CalendarYearMonth { get; set; }
public int FiscalYearID;
public int FiscalMonthID;
}
public class TrackingYearMonth : YearMonth
{
public bool IsAfterEffectiveDate { get; set; }
public bool IsBeforeTrackingDate { get; set; }
public bool IsCurrentMonth { get; set; }
public bool IsTrackedMonth { get; set; }
}
public interface IPerformanceTrackingMonth
{
TrackingYearMonth Month { get; set; }
double RampUp { get; set; }
double GoalUnits { get; set; }
double GoalUnitsYTD { get; set; }
double CommittedUnits { get; }
double CommittedUnitsYTD { get; set; }
double GoalUnitsOverall { get; set; }
double BaselineUnitsOverall { get; set; }
double BaselineStatsOverall { get; set; }
double TrackingUnitsOverall { get; set; }
double TrackingStatsOverall { get; set; }
PerformanceMonthlyUnitData BaselineMonthlyUnitData { get; set; }
PerformanceMonthlyUnitData TrackingMonthlyUnitData { get; set; }
PerformanceMonthlySavingsData GoalSavings { get; set; }
PerformanceMonthlySavingsData CommittedSavings { get; set; }
PerformanceMonthlySavingsData ActualSavings { get; set; }
double GoalUnitVariance { get; }
double ActualUnitVariance { get; }
double CommittedUnitVariance { get; }
double CommittedRate { get; }
}
public class PerformanceTrackingMonth : IPerformanceTrackingMonth
{
public TrackingYearMonth Month { get; set; }
public PerformanceMonthlyUnitData BaselineMonthlyUnitData { get; set; }
public PerformanceMonthlyUnitData TrackingMonthlyUnitData { get; set; }
public PerformanceMonthlySavingsData GoalSavings { get; set; }
public PerformanceMonthlySavingsData CommittedSavings { get; set; }
public PerformanceMonthlySavingsData ActualSavings { get; set; }
public double RampUp { get; set; }
public double BaselineUnitsOverall { get; set; }
public double BaselineStatsOverall { get; set; }
public double TrackingUnitsOverall { get; set; }
public double TrackingStatsOverall { get; set; }
public double GoalUnits { get; set; }
public double GoalUnitsYTD { get; set; }
public double GoalUnitsOverall { get; set; }
public double GoalUnitVariance { get; set; }
public double ActualUnitVariance { get; set; }
public double CommittedStats { get; set; }
public double CommittedUnits { get; set; }
public double CommittedUnitsYTD { get; set; }
public double CommittedUnitVariance { get; set; }
public double CommittedRate { get; set; }
}
public class PerformanceTrackingItem
{
public int GroupID { get; set; }
public string GroupName { get; set; }
public IEnumerable<PerformanceTrackingMonth> MonthlyTrackingData { get; set; }
}
+55
View File
@@ -0,0 +1,55 @@
<Query Kind="Statements">
<Connection>
<ID>bd4e97c5-84e7-4c61-80ca-8d53d7876af2</ID>
<Persist>true</Persist>
<Server>D0001-SQL-11.sdt.local</Server>
<Database>jazz dev master Prod</Database>
<ShowServer>true</ShowServer>
</Connection>
</Query>
var config = (from c in Configurations where c.FiscalYearID == 2020 select c).First();
var opps = (from OBJ in QVILineItemOpportunities
join qve in QualityVariationEvents on OBJ.QualityVariationEventID equals qve.QualityVariationEventID
where OBJ.ConfigurationGUID == config.ConfigurationGUID
&& !OBJ.IsHidden
select new
{
OBJ.OpportunityGUID,
OBJ.InitiativeGUID,
OBJ.Savings,
// OBJ.DateModified,
// OBJ.DateCreated,
// OBJ.ConfigurationGUID,
// OBJ.IsHidden,
OBJ.TotalCasesWithQVI,
OBJ.TotalPatientDaysWithQVI,
OBJ.TotalCostWithQVI,
OBJ.NetRevenueWithQVI,
OBJ.BreakdownName,
OBJ.BreakdownID,
OBJ.CommittedSavingsLevel,
OBJ.TotalCases,
OBJ.Note,
OBJ.QualityVariationEventID,
QualityVariationEventName = qve.Name,
QualityVariationEventCategory = qve.Category,
qve.QVILineItemID,
QVILineItemName = qve.Name,
QVIName = qve.Category,
qve.SortOrder,
qve.ClinicalIndicatorID
}).ToList();
opps
.GroupBy(p => p.QualityVariationEventCategory,
(category, qvi) => new
{
Name = category,
Savings = qvi.Sum(x => x.Savings),
Cases = qvi.Sum(x => x.TotalCasesWithQVI),
SavingsMaxPotential = qvi.WeightedAverage(x => x.Savings.DivideBy(x.TotalCasesWithQVI), w => w.TotalCasesWithQVI),
QVISubItems = qvi.ToList()
})
.OrderByDescending(p => p.Cases)
.ThenByDescending(p => p.Savings)
.Dump();
+34
View File
@@ -0,0 +1,34 @@
<Query Kind="Statements">
<Connection>
<ID>bd4e97c5-84e7-4c61-80ca-8d53d7876af2</ID>
<Persist>true</Persist>
<Server>D0001-SQL-11.sdt.local</Server>
<Database>jazz dev master Prod</Database>
<ShowServer>true</ShowServer>
</Connection>
</Query>
var startDate = new DateTime(2019, 1, 1);
var endDate = new DateTime(2020, 1, 1);
var months = Enumerable.Range(1, 12).Select(i => new { month = i }).ToList();
var data = (from fpes in FactPatientEncounterSummaries
join ctf in CaseTypeFamilies on fpes.MSDRGCaseTypeFamilyID equals ctf.CaseTypeFamilyID
where fpes.DischargeDateTime >= startDate && fpes.DischargeDateTime < endDate
&& fpes.MSDRGCaseTypeFamilyID != 0
group fpes by new { DischargeMonth = fpes.DischargeDateTime.Month, ctf.CaseTypeFamilyID, ctf.Name } into gpes
orderby gpes.Key.CaseTypeFamilyID, gpes.Key.DischargeMonth
select new
{
LevelID = 0,
Month = gpes.Key.DischargeMonth,
gpes.Key.CaseTypeFamilyID,
gpes.Key.Name,
Volume = gpes.Select(g => g.EncounterID).Distinct().Count(),
Revenue = gpes.Sum(g => g.NetRevenue),
TotalCost = gpes.Sum(g => g.TotalCosts)
}).ToList();
var pes = months.GroupJoin(data, m => m.month, d => d.Month, (m, d) => d.DefaultIfEmpty()).SelectMany(m => m)
.OrderBy(m => m.CaseTypeFamilyID)
.ThenBy(m => m.Month);
pes.Dump();
@@ -0,0 +1,411 @@
<Query Kind="Program">
<Connection>
<ID>77b65bea-e766-4e3c-a1ed-c4c2534b6019</ID>
<Persist>true</Persist>
<Server>D0001-SQL-11.sdt.local</Server>
<Database>jazz dev master Prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>System.ComponentModel</Namespace>
</Query>
private List<TablesAndColumns> SchemasAndTablesToReview = new List<TablesAndColumns>();
private List<OrderByInformation> OrderByStatements = new List<OrderByInformation>();
private List<ColumnsToExclude> ColumnsToBeExcluded = new List<ColumnsToExclude>();
private List<JsonColumns> JsonColumnsToBeParsed = new List<JsonColumns>();
private static Dictionary<string, string> WhereClauses = new Dictionary<string, string>();
public static int TopRows = int.MaxValue;
void Main()
{
SchemasAndTablesToReview.AddRange(new[]
{
new TablesAndColumns("clientdss", new [] { "FactPatientEncounterSummary" })
});
WhereClauses.Add("clientdss.FactPatientEncounterSummary", "OBJ.MSDRGCaseTypeFamilyID <> 0 OR OBJ.APRDRGCaseTypeFamilyID <> 0");
OrderByStatements.AddRange(new[]
{
new OrderByInformation("cci.InitiativeWorkflowHistory", new [] {"FromStep","ToStep"}),
new OrderByInformation("cci.VariationEncounterSavingInfo", new []{"EncounterRecordNumber","PhysicianID"}),
new OrderByInformation("cci.FactOpportunityMetric", new []{"FiscalYearID","FiscalMonthID"}),
new OrderByInformation("cci.FactOpportunitySavings", new []{"FiscalyYearID","FiscalMonthID"}),
new OrderByInformation("clientdss.FactPatientEncounterSummary", new []{"EncounterRecordNumber"}),
new OrderByInformation("dss.DimCaseType", new []{"CaseTypeFamilyID", "CaseTypeId", "Name"})
});
ColumnsToBeExcluded.AddRange(new[]
{
new ColumnsToExclude("cci.SystemSetting", new [] {"IsEncrypted"}),
new ColumnsToExclude("cci.Configuration", new [] {"InitiativeIsSimplifiedWorkflow"}),
new ColumnsToExclude("clientdss.FactPatientEncounterSummary", new [] {"MikeQAtest1ID", "CustomJesseValidatingAllOthers", "CustomNewCalculatedSystemFieldasdf"})
});
JsonColumnsToBeParsed.AddRange(new[]
{
new JsonColumns("dss.DimCaseType", new [] {"CaseTypeConfigJSON"})
});
var tables = GetTables();
var tableList = tables.Select(r => r.SchemaTable);
var connections = new ServerInstance[] {
new ServerInstance("D0011-SQL-01.sdt.local","jazz tst Southern Illinois 20190918.1", tableList),
new ServerInstance("D0011-SQL-01.sdt.local", "jazz tst Southern Illinois 20200331.1", tableList)
}.ToList();
DoTheComparisons(connections, tables);
}
// Define other methods and classes here
#region Gather Table Information
public string GetTableQuery()
{
var tableSchemas = string.Join(", ", SchemasAndTablesToReview.Select(sattr => $"'{sattr.SchemaName}'"));
var tableList = string.Join("\r\n", SchemasAndTablesToReview.ConvertAll(sattr =>
{
if (sattr.TableNames?.Any(cn => cn == "*") ?? true)
{
return $"WHEN c.TABLE_SCHEMA = '{sattr.SchemaName}' THEN 1";
}
else
{
return $"WHEN c.TABLE_SCHEMA = '{sattr.SchemaName}' AND c.TABLE_NAME IN ({string.Join(", ", sattr.TableNames.Select(cn => $"'{cn}'"))}) THEN 1";
}
}));
return $@"SELECT c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE
, CAST(CASE WHEN ccu.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END AS BIT) IsPrimaryKey
FROM INFORMATION_SCHEMA.COLUMNS AS c
LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc ON tc.TABLE_SCHEMA = c.TABLE_SCHEMA AND tc.TABLE_NAME = c.TABLE_NAME
LEFT OUTER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu ON ccu.TABLE_SCHEMA = tc.TABLE_SCHEMA AND ccu.TABLE_NAME = tc.TABLE_NAME AND ccu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME AND ccu.COLUMN_NAME = c.COLUMN_NAME
WHERE c.TABLE_SCHEMA in ({tableSchemas})
AND (CASE
{tableList}
ELSE 0
END = 1)
AND c.DATA_TYPE NOT IN ('datetime','uniqueidentifier', 'timestamp')
AND NOT (c.COLUMN_NAME = 'RowID' and CAST(CASE WHEN ccu.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END AS BIT) = 1)
AND tc.CONSTRAINT_TYPE = 'Primary Key'
ORDER BY c.TABLE_NAME, c.ORDINAL_POSITION";
}
public IList<Table> GetTables()
{
var tableQuery = GetTableQuery();
return ExecuteQueryDynamic(tableQuery)
.GroupBy(x => new { x.TABLE_SCHEMA, x.TABLE_NAME }, (g, d) => new Table
{
SchemaName = g.TABLE_SCHEMA,
TableName = g.TABLE_NAME,
Columns = d
.Select(y => new Column
{
ColumnName = y.COLUMN_NAME,
DataType = y.DATA_TYPE,
IsPrimaryKey = y.IsPrimaryKey
}),
OrderBy = OrderByStatements?.SingleOrDefault(obs => obs.TableName == $"{g.TABLE_SCHEMA}.{g.TABLE_NAME}")?.OrderBy,
Exclude = ColumnsToBeExcluded?.SingleOrDefault(ctbe => ctbe.TableName == $"{g.TABLE_SCHEMA}.{g.TABLE_NAME}")?.ColumnNames ?? new List<string>(),
Json = JsonColumnsToBeParsed?.SingleOrDefault(ctbe => ctbe.TableName == $"{g.TABLE_SCHEMA}.{g.TABLE_NAME}")?.ColumnNames ?? new List<string>(),
Where = WhereClauses.ContainsKey($"{g.TABLE_SCHEMA}.{g.TABLE_NAME}") ? $"\r\nwhere {WhereClauses[$"{g.TABLE_SCHEMA}.{g.TABLE_NAME}"]}" : ""
}).ToList();
}
public class Table
{
public string SchemaName { get; set; }
public string TableName { get; set; }
public IEnumerable<Column> Columns { get; set; }
public IEnumerable<OrderBy> OrderBy { get; set; }
public IEnumerable<string> Exclude { get; set; }
public IEnumerable<string> Json { get; set; }
public string Where { get; set; } = "";
internal string SchemaTable => $"{SchemaName}.{TableName}";
public string SqlSelect => $"select TOP({TopRows}) \r\n\t{SelectColumns}\r\nfrom {SchemaTable} OBJ{Where}{OrderByStatement}";
internal string SelectColumns => !Columns?.Any() ?? true ? "*" : string.Join(",\r\n\t", Columns.Where(c => !Exclude.ToList().Contains(c.ColumnName)).Select(c => c.ColumnName));
internal string OrderByStatement => !OrderBy?.Any() ?? true ? "" : "\r\nOrder By " + string.Join(", ", OrderBy.Select(ob => $"{ob.ColumnName}{(ob.IsDescending ? " DESC" : "")}"));
}
public class Column
{
public string ColumnName { get; set; }
public string DataType { get; set; }
public bool IsPrimaryKey { get; set; }
}
public class OrderBy
{
public string ColumnName { get; set; }
public bool IsDescending { get; set; } = false;
}
public class TablesAndColumns
{
public string SchemaName { get; set; }
public IEnumerable<string> TableNames { get; set; }
public TablesAndColumns(string schemaName, IEnumerable<string> tables)
{
SchemaName = schemaName;
TableNames = tables;
}
}
public class OrderByInformation
{
public string TableName { get; set; }
public IEnumerable<OrderBy> OrderBy { get; set; }
public OrderByInformation(string tableName, IEnumerable<string> columns)
{
TableName = tableName;
OrderBy = columns.Select(c => new OrderBy
{
ColumnName = c.StartsWith("D|") ? c.Substring(2) : c,
IsDescending = c.StartsWith("D|")
});
}
}
public class ColumnsToExclude
{
public string TableName { get; set; }
public IEnumerable<string> ColumnNames { get; set; }
public ColumnsToExclude(string tableName, IEnumerable<string> columns)
{
TableName = tableName;
ColumnNames = columns;
}
}
public class JsonColumns
{
public string TableName { get; set; }
public IEnumerable<string> ColumnNames { get; set; }
public JsonColumns(string tableName, IEnumerable<string> columns)
{
TableName = tableName;
ColumnNames = columns;
}
}
#endregion
#region Do the comparisons
public void DoTheComparisons(IEnumerable<ServerInstance> connections, IEnumerable<Table> tables)
{
foreach (var table in tables)
{
var sql = table.SqlSelect;
var dataLegacy = GetData(connections.First(), sql);
var dataUpdate = GetData(connections.Last(), sql);
var legacy = dataLegacy.Rows;
var update = dataUpdate.Rows;
var idxCount = legacy.Count;
var compare = new List<CompareSet>();
var jsonColumns = tables.SingleOrDefault(t => t.SchemaTable == table.TableName)?.Json.ToList();
foreach (var row in Enumerable.Range(0, idxCount))
{
var r = legacy[row];
if (row < update.Count)
{
var u = update[row];
var rJson = JsonConvert.SerializeObject(r.ItemArray);
var uJson = JsonConvert.SerializeObject(u.ItemArray);
if (rJson != uJson)
{
if (jsonColumns == null)
{
compare.Add(new CompareSet(r, u));
}
else
{
compare.Add(new CompareSet(r, u, jsonColumns));
}
}
}
else
{
if (jsonColumns == null)
{
compare.Add(new CompareSet(r, null));
}
else
{
compare.Add(new CompareSet(r, null, jsonColumns));
}
}
}
if (compare.Any())
{
compare.Dump(table.TableName, 3);
}
else
{
"No differences found in data".Dump($"{table.TableName} ({dataLegacy.Rows.Count} rows)");
}
}
}
public class ServerInstance
{
public string Server { get; set; }
public string Database { get; set; }
public IEnumerable<string> TableNames { get; set; }
public ServerInstance(string server, string database, IEnumerable<string> tableNames)
{
Server = server;
Database = database;
TableNames = tableNames;
}
}
public DataTable GetData(ServerInstance serverInstance, string sql)
{
var server = serverInstance.Server;
var database = serverInstance.Database;
var connStr = $"data source={server};initial catalog='{database}';persist security info=True;Integrated Security=SSPI;";
using (var conn = new SqlConnection(connStr))
{
var datatable = new DataTable();
var adapter = new SqlDataAdapter(sql, conn);
try
{
adapter.Fill(datatable);
}
catch (Exception ex)
{
sql.Dump(nameof(sql));
throw;
}
var tableNames = serverInstance.TableNames;
var idx = 0;
foreach (var tableName in tableNames)
{
datatable.TableName = tableName;
idx += 1;
}
return datatable;
}
}
public class CompareSet
{
internal IList<string> ColumnNames { get; set; }
internal IList<object> Legacy { get; set; }
internal IList<object> Update { get; set; }
public IList<Row> Rows { get; set; }
internal IList<string> JsonColumns { get; set; }
public CompareSet(DataRow right, DataRow left)
{
ColumnNames = right.Table.Columns.Cast<DataColumn>().Select(dc => dc.ColumnName).ToList();
Legacy = right.ItemArray.ToList();
Update = left?.ItemArray.ToList();
Rows = ColumnNames.Select((c, i) => new Row(c, Legacy[i], Update?[i])).ToList();
}
public CompareSet(DataRow right, DataRow left, IList<string> jsonColumns)
{
ColumnNames = right.Table.Columns.Cast<DataColumn>().Select(dc => dc.ColumnName).ToList();
Legacy = right.ItemArray.ToList();
Update = left?.ItemArray.ToList();
JsonColumns = jsonColumns;
Rows = ColumnNames.Select((c, i) => new Row(c, Legacy[i], Update?[i], JsonColumns.Contains(c, StringComparer.CurrentCultureIgnoreCase))).ToList();
}
}
public class Row
{
public string Column;
public bool IsJson;
public object Left;
public object Right;
public Row(string column, object left, object right)
{
Column = column;
Left = left;
Right = right;
}
public Row(string column, object left, object right, bool isJson)
: this(column, left, right)
{
IsJson = isJson;
if (!isJson) return;
Left = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(left.ToString(),
new JsonSerializerSettings
{
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
args.ErrorContext.Handled = true;
}
}), Newtonsoft.Json.Formatting.Indented);
if (right == null) return;
Right = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(right.ToString(),
new JsonSerializerSettings
{
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
args.ErrorContext.Handled = true;
}
}), Newtonsoft.Json.Formatting.Indented);
}
object ToDump() => new
{
Column = Left.Equals(Right ?? "") ? (object)Column : new XElement("LINQPad.HTML", new XElement("div", new XAttribute("style", "background-color:lightyellow;color:black"), Column)),
Left,
Right
};
}
#endregion
+98
View File
@@ -0,0 +1,98 @@
<Query Kind="Program">
<Connection>
<ID>77b65bea-e766-4e3c-a1ed-c4c2534b6019</ID>
<Persist>true</Persist>
<Server>D0001-SQL-11.sdt.local</Server>
<Database>jazz dev master Prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
var searchFor = "Vice President";
var sql = new List<string>();
foreach (var table in Mapping.GetTables())
{
var columns = from dm in table.RowType.DataMembers
where dm.DbType != null && dm.DbType.Contains("Varchar")
select new { dm.Name, dm.DbType, dm.Type, dm.MappedName, dm.IsPrimaryKey };
if (!columns.Any()) continue;
//columns.Dump(table.TableName);
sql.AddRange(columns.Select(x => $@"SELECT '{table.TableName}.{x.Name}' what, LEFT({table.TableName}.[{x.Name}], 3630) has
FROM {table.TableName} (NOLOCK)
WHERE {table.TableName}.[{x.Name}] LIKE '%{searchFor}%'"));
}
sql.ForEach(query =>
{
try
{
var result = this.ExecuteQuery<Answer>(query).ToList();
if (result.Any())
{
result.Select(r => r.has).Dump(result.First().what);
}
}
catch (Exception ex)
{
query.Dump(ex.Message);
}
});
}
public class Answer
{
public string what { get; set; }
public string has { get; set; }
}
@@ -0,0 +1,184 @@
<Query Kind="Program">
<Connection>
<ID>eae63890-d1e5-4142-8086-9d954a38c63c</ID>
<Persist>true</Persist>
<Server>D0011-SQL-01.sdt.local</Server>
<Database>jazz tst Edward Elmhurst 20210127.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Namespace>System.Collections.ObjectModel</Namespace>
</Query>
void Main()
{
var fmr = new FiscalMonthResolver(from fm in DimFiscalMonths
select new FiscalMonth
{
MemberGUID = fm.MemberGUID,
FiscalMonthID = fm.FiscalMonthID,
SortOrder = fm.SortOrder,
FiscalMonthCode = int.Parse(fm.FiscalMonthCode),
Name = fm.Name,
Abbreviation = fm.Abbreviation,
DaysInMonth = fm.DaysInMonth,
YTDDaysInMonth = fm.YTDDaysInMonth,
QuarterID = fm.QuarterID,
MonthColumnName = fm.MonthColumnName,
TransactionID = fm.TransactionID,
DaysInLeapYearMonth = fm.DaysInLeapYearMonth,
YTDDaysInLeapYearMonth = fm.YTDDaysInLeapYearMonth,
IsReal = fm.IsReal
});
var config = new Configuration(fmr);
var fiscalMonths = fmr.AllFiscalMonths;
var startDate = new DateTime(2020, 1, 1);
var endDate = startDate.AddYears(1).AddDays(-1);
config.GetYearMonths(startDate, endDate).Dump();
startDate = config.GetFiscalYearStartDate();
endDate = config.GetFiscalYearEndDate();
config.GetYearMonths(startDate, endDate).Dump();
fiscalMonths.Where(fm => fm.IsReal).Dump();
}
// Define other methods and classes here
public class Configuration
{
public int FiscalYearID = 2020;
public FiscalMonthResolver FiscalMonthResolver;
public Configuration(FiscalMonthResolver fmr)
{
FiscalMonthResolver = fmr;
}
public DateTime GetFiscalYearStartDate()
{
return GetFiscalYearEndDate().AddYears(-1).AddDays(1);
}
public DateTime GetFiscalYearEndDate()
{
var lastFiscalMonth = FiscalMonthResolver.LastFiscalMonth.FiscalMonthID;
return new DateTime(FiscalYearID, lastFiscalMonth, DateTime.DaysInMonth(FiscalYearID, lastFiscalMonth));
}
public IList<YearMonth> GetYearMonths(DateTime startDate, DateTime endDate)
{
var ym = new List<YearMonth>();
var currentMonth = startDate;
$"\r\nCurrent: {currentMonth:d} - End: {endDate:d}".Dump();
while (currentMonth <= endDate)
{
var fiscalMonth = FiscalMonthResolver.ConvertToFiscalYearMonth(currentMonth);
fiscalMonth.Dump();
ym.Add(new YearMonth(fiscalMonth.Year, currentMonth.Year,
FiscalMonthResolver.GetByFiscalMonthId(currentMonth.Month)));
currentMonth = currentMonth.AddMonths(1);
}
return ym;
}
}
public interface IFiscalMonthResolver
{
FiscalMonth FirstFiscalMonth { get; }
FiscalMonth LastFiscalMonth { get; }
FiscalMonth GetByFiscalMonthId(int fiscalMonthId);
FiscalMonth GetByFiscalMonthSortOrder(int sortOrder);
List<FiscalMonth> AllFiscalMonths { get; }
}
public class FiscalMonthResolver : IFiscalMonthResolver
{
public FiscalMonthResolver(IEnumerable<FiscalMonth> fiscalMonths)
{
AllFiscalMonths = fiscalMonths.ToList();
}
public FiscalMonth FirstFiscalMonth => GetByFiscalMonthSortOrder(1);
public FiscalMonth LastFiscalMonth => GetByFiscalMonthSortOrder(12);
public List<FiscalMonth> AllFiscalMonths { get; set; }
public FiscalMonth GetByFiscalMonthId(int fiscalMonthId)
{
return AllFiscalMonths.FirstOrDefault(afm => afm.FiscalMonthID == fiscalMonthId);
}
public FiscalMonth GetByFiscalMonthSortOrder(int sortOrder)
{
return AllFiscalMonths.FirstOrDefault(afm => afm.SortOrder == sortOrder);
}
public DateTime ConvertToFiscalYearMonth(DateTime calendarYearMonth)
{
var fiscalYearID = calendarYearMonth.Month <= LastFiscalMonth.FiscalMonthID
? calendarYearMonth.Year
: calendarYearMonth.Year + 1;
return new DateTime(fiscalYearID, calendarYearMonth.Month, 1);
}
}
public class FiscalMonth
{
internal Guid MemberGUID { get; set; }
public byte FiscalMonthID { get; set; }
public byte SortOrder { get; set; }
public int FiscalMonthCode { get; set; }
public String Name { get; set; }
public String Abbreviation { get; set; }
public Int32 DaysInMonth { get; set; }
public Int32 YTDDaysInMonth { get; set; }
public byte QuarterID { get; set; }
public String MonthColumnName { get; set; }
internal String Version { get; set; }
internal Guid HistoryItemGUID { get; set; }
internal Int32 TransactionID { get; set; }
public Int32 DaysInLeapYearMonth { get; set; }
public Int32 YTDDaysInLeapYearMonth { get; set; }
public Boolean IsReal { get; set; }
}
public class YearMonth
{
public readonly int FiscalYear;
public readonly int CalendarYear;
internal readonly FiscalMonth FiscalMonth;
public readonly DateTime FiscalYearMonth;
public readonly DateTime CalendarYearMonth;
#region Helper Properties to corelate to database column names
public int FiscalYearID => FiscalYear;
/// <summary>
/// This is calendar month and FiscalMonth.SortOrder is the real FiscalMonth
/// we put it here so that we don't frikin confuse ourself between fiscalmonth and calendarmonth :x
/// </summary>
public int FiscalMonthID => FiscalMonth.FiscalMonthID;
#endregion
internal YearMonth(int fiscalYear, int calendarYear, FiscalMonth fiscalMonth)
{
FiscalYear = fiscalYear;
CalendarYear = calendarYear;
FiscalMonth = fiscalMonth;
FiscalYearMonth = new DateTime(fiscalYear, fiscalMonth.SortOrder, 1);
CalendarYearMonth = new DateTime(calendarYear, fiscalMonth.FiscalMonthID, 1);
}
}
+114
View File
@@ -0,0 +1,114 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>FluentAssertions</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>FluentAssertions.Equivalency</Namespace>
<Namespace>FluentAssertions.Execution</Namespace>
<Namespace>FluentAssertions</Namespace>
</Query>
void Main()
{
var lt = LoginType.Something;
Action act1 = () =>
{
var ltDto = LoginTypeDto.Something;
ltDto.Should().BeEquivalentTo(lt, options => options.Using(new LoginTypeRule()));
};
Action act2 = () =>
{
var ltDto = LoginTypeDto.SomethingElse;
ltDto.Should().BeEquivalentTo(lt, options => options.Using(new LoginTypeRule()));
};
act1.Should().NotThrow<AssertionFailedException>();
act2.Should().Throw<AssertionFailedException>();
}
// Define other methods and classes here
public class LoginTypeRule : IAssertionRule
{
public bool AssertEquality(IEquivalencyValidationContext context)
{
var subjectValue = GetValueForEnum(context.Subject);
var expectationValue = GetValueForEnum(context.Expectation);
if (subjectValue == null || expectationValue == null)
{
// rule not applicable
return false;
}
Execute.Assertion
.BecauseOf(context.Because, context.BecauseArgs)
.ForCondition(subjectValue == expectationValue)
.FailWith("Expected {context:string} to be {0}{reason}, but found {1}",
context.Subject, context.Expectation);
// equality assertion handled
return true;
}
private int? GetValueForEnum(object enumValue)
{
if (enumValue is LoginType || enumValue is LoginTypeDto)
{
return (int)enumValue;
}
return null;
}
}
enum LoginType { Something, SomethingElse, Other };
enum LoginTypeDto { Something, SomethingElse, Other }
+70
View File
@@ -0,0 +1,70 @@
<Query Kind="Statements">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel.Composition</Namespace>
<Namespace>System.ComponentModel.Composition.Hosting</Namespace>
<Namespace>System.ComponentModel.Composition.Primitives</Namespace>
<Namespace>System.ComponentModel.Composition.ReflectionModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Net.Http</Namespace>
<Namespace>System.Net.Http.Headers</Namespace>
<Namespace>System.Numerics</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
//Func<int, int> f = (x => x + x);
var bb = new bool[] { false, true, true, false };
var xx = new decimal[] { 1.0m, 0.0m, 3.0m, 4.0m };
Func<int, decimal, double> f = ((x,month) => bb[x]
? xx[x] == 0.0m
? 1.0 : (double)month
: (double)month);
f(0,xx[3]).Dump();
f(1,xx[2]).Dump();
+83
View File
@@ -0,0 +1,83 @@
<Query Kind="Program">
<Connection>
<ID>463c2997-8a6a-4688-9575-6549e5215f7b</ID>
<Persist>true</Persist>
<Server>D0011-SQL-01.sdt.local</Server>
<Database>jazz tst StrataSphere 20191104.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
var doc = new XmlDocument();
var info =
from r in REReports
join p in REDSCubeReportParameters on r.ReportGUID equals p.ReportGUID into rdscrp
from p in rdscrp.DefaultIfEmpty()
join rp in REClientReportParameters on r.ReportGUID equals rp.ReportGUID into rcrp
from rp in rcrp.DefaultIfEmpty()
where r.Name.Contains("B-25227")
//where new[] { "B-25227" }.Contains(r.Name)
select new { Parameters = p == null ? rp.ParameterXML : p.ParameterXML, r };
var test = info.ToList()
.ConvertAll(i =>
{
doc.LoadXml(i.Parameters);
return new { i.r.Name, parameter = JsonConvert.SerializeXmlNode(doc, Newtonsoft.Json.Formatting.Indented) };
});
test.Dump();
}
// Define other methods and classes here
+200
View File
@@ -0,0 +1,200 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.Glue</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>Amazon.Glue</Namespace>
<Namespace>Amazon.Glue.Model</Namespace>
<Namespace>System.Threading.Tasks</Namespace>
</Query>
void Main()
{
var accessKeyID = Util.GetPassword("aws.sdt-tlamb.accessid");
var secretKey = Util.GetPassword("aws.sdt-tlamb.secretid");
var bucketName = "sdt-glue-hackweek";
var crawlerName = "client1_input_icd10dx";
var client = new AmazonS3Client(accessKeyID, secretKey, RegionEndpoint.USEast1);
var glueclient = new AmazonGlueClient(accessKeyID, secretKey, RegionEndpoint.USEast1);
//UploadICDFiles(client, bucketName);
//ListBucket(client, bucketName).Dump("S3 Buckets");
ListCrawlers(glueclient).Crawlers.Select(c => new
{
c.Name,
c.DatabaseName,
c.LastCrawl.Status,
c.LastCrawl.ErrorMessage,
c.Description,
c.Targets.S3Targets
}).Dump("Crawlers");
/*
//RunCrawler(glueclient, crawlerName).Dump();
glueclient.GetDatabases(new GetDatabasesRequest{}).DatabaseList.Dump("Database");
glueclient.GetCrawler(new GetCrawlerRequest { Name = crawlerName}).Crawler.Dump("Crawler");
glueclient.GetTables(new GetTablesRequest{DatabaseName = "glue-hackweek-icd"}).TableList.Dump("glue hackweek icd tables");
*/
}
// Define other methods and classes here
void UploadICDFiles(AmazonS3Client client, string bucketName)
{
var regex = new Regex("wfu_icd(10|9)_(dx|px)_(\\d*)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
var sourcePath = @"S:\Development\Cube Killers\Deidentified DI Import Files\Wake - Deidentified";
var sourceFiles = "wfu_icd*.psv";
var files = System.IO.Directory.GetFiles(sourcePath, sourceFiles).OrderBy(f => f);
files
//.Where(f => f.Contains("10_dx"))
//.Take(1)
.ToList().ForEach(f =>
{
var fileName = Path.GetFileNameWithoutExtension(f);
var subdir = regex.Replace(fileName, "icd/icd$1/$2");
var key = regex.Replace(fileName, "icd$1$2");
TransferToBucketAsync(client, bucketName, subdir, key, f).Wait();//.Dump();
});
}
ListObjectsResponse ListBucket(AmazonS3Client client, string bucketName)
{
var request = new Amazon.S3.Model.ListObjectsRequest();
return client.ListObjects(bucketName);
}
ListObjectsResponse ListBucket(string accessKeyID, string secretKey, string bucketName)
{
using (var client = new AmazonS3Client(accessKeyID, secretKey, RegionEndpoint.USEast1))
{
return ListBucket(client, bucketName);
}
}
static async Task TransferToBucketAsync(AmazonS3Client client, string bucketName, string subdirName, string keyName, string fileName)
{
new { keyName, fileName }.Dump();
var utility = new TransferUtility(client);
var request = new TransferUtilityUploadRequest
{
BucketName = $"{bucketName}{(!string.IsNullOrEmpty(subdirName) ? @"/" + subdirName : "")}",
Key = keyName,
ContentType = "text/plain"
};
request.FilePath = fileName;
await utility.UploadAsync(request);
}
static async Task<PutObjectResponse> UploadToBucketAsync(AmazonS3Client client, string bucketName, string keyName, string fileName)
{
new { keyName, fileName }.Dump();
var request = new Amazon.S3.Model.PutObjectRequest
{
BucketName = bucketName,
Key = keyName,
ContentBody = File.ReadAllText(fileName),
ContentType = "text/plain"
};
request.FilePath = fileName;
return await client.PutObjectAsync(request);
}
PutObjectResponse UploadToBucket(AmazonS3Client client, string bucketName, string keyName, string fileName)
{
new { keyName, fileName }.Dump();
var result = UploadToBucketAsync(client, bucketName, keyName, fileName);
result.Wait();
return result.Result;
}
PutObjectResponse UploadToBucket(string accessKeyID, string secretKey, string bucketName, string keyName, string fileName)
{
using (var client = new AmazonS3Client(accessKeyID, secretKey, RegionEndpoint.USEast1))
{
return UploadToBucket(client, bucketName, keyName, fileName);
}
}
GetCrawlersResponse ListCrawlers(AmazonGlueClient client)
{
return client.GetCrawlers(new GetCrawlersRequest());
}
GetCrawlersResponse ListCrawlers(string accessKeyID, string secretKey)
{
using (var client = new AmazonGlueClient(accessKeyID, secretKey, RegionEndpoint.USEast1))
{
var crawlerRequest = new GetCrawlersRequest();
return client.GetCrawlers(crawlerRequest);
}
}
StartCrawlerResponse RunCrawler(AmazonGlueClient client, string crawlerName)
{
var crawler = new StartCrawlerRequest
{
Name = crawlerName
};
return client.StartCrawler(crawler);
}
StartCrawlerResponse RunCrawler(string accessKeyID, string secretKey, string crawlerName)
{
using (var client = new AmazonGlueClient(accessKeyID, secretKey, RegionEndpoint.USEast1))
{
var crawler = new StartCrawlerRequest
{
Name = crawlerName
};
return client.StartCrawler(crawler);
}
}
@@ -0,0 +1,142 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.Glue</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>Amazon.Glue</Namespace>
<Namespace>Amazon.Glue.Model</Namespace>
<Namespace>System.Threading.Tasks</Namespace>
</Query>
//#define TRACE
void Main()
{
var accessKeyID = Util.GetPassword("aws.sdt-tlamb.accessid");
var secretKey = Util.GetPassword("aws.sdt-tlamb.secretid");
var bucketName = "sdt-glue-hackweek";
var s3 = new AmazonS3Client(accessKeyID, secretKey, RegionEndpoint.USEast1);
var s3Objects = bucketName.AWSListBucket(s3).S3Objects
.Where(so => so.Key.StartsWith("wfu/"));
s3Objects.Dump("S3 Objects");
//var crawlerName = "client1_input_icd10dx";
var glue = new AmazonGlueClient(accessKeyID, secretKey, RegionEndpoint.USEast1);
var dbs = glue.GetDatabases(new GetDatabasesRequest()).DatabaseList.Select(dl => dl.Name);
var myDBName = "glue-hackweek-thom";
if (dbs.Contains(myDBName))
{
glue.DeleteDatabase(new DeleteDatabaseRequest { Name = myDBName });
}
glue.CreateDatabase(new CreateDatabaseRequest { DatabaseInput = new DatabaseInput { Name = myDBName, Description = "Thom's Glue Hackweek DB" } });
var crawlers = glue.ListCrawlers(new ListCrawlersRequest()).CrawlerNames;
var tasks = new List<Task<CreateCrawlerResponse>>();
crawlers.Where(c => c.StartsWith("wfu_")).ToList()
.ForEach(c =>
{
try
{
glue.DeleteCrawler(new DeleteCrawlerRequest { Name = c });
}
catch (EntityNotFoundException ex)
{
ex.Message.Dump();
}
});
crawlers = glue.ListCrawlers(new ListCrawlersRequest()).CrawlerNames;
var tags = new[] { new { key = "environment", value = "hackweek" } }.ToDictionary(dl => dl.key, dl => dl.value);
var newCrawlers = s3Objects.ToList()
.ConvertAll(o => new CreateCrawlerRequest
{
Classifiers = new[] { "client1-input-psv" }.ToList(),
Configuration = @"{""Version"":1.0,""CrawlerOutput"":{""Partitions"":{""AddOrUpdateBehavior"":""InheritFromTable""}}}",
DatabaseName = myDBName,
Name = string.Join("_", o.Key.Split('/').TakeAllButLast()),
Role = "hackday-glue-role-team2",
SchemaChangePolicy = new SchemaChangePolicy
{
DeleteBehavior = new DeleteBehavior("LOG"),
UpdateBehavior = new UpdateBehavior("UPDATE_IN_DATABASE")
},
TablePrefix = string.Join("_", o.Key.Split('/').TakeAllButLast().TakeAllButLast()) + "_",
Tags = tags,
Targets = new CrawlerTargets
{
S3Targets = new List<S3Target> {
new S3Target { Path = $"s3://{o.BucketName}/{string.Join("/", o.Key.Split('/').TakeAllButLast())}" }
}
}
}).OrderBy(o => o.Name).ToList();
newCrawlers.Dump("New Crawlers");
newCrawlers.ForEach(c =>
{
try
{
tasks.Add(glue.CreateCrawlerAsync(c, new CancellationToken()));
}
catch (AmazonGlueException ex)
{
ex.Dump($"Glue Exception {c.Name}");
}
});
while (tasks.Any(t => !t.IsCompleted))
{
}
var runtasks = new List<Task<StartCrawlerResponse>>();
newCrawlers.ForEach(c => runtasks.Add(glue.StartCrawlerAsync(new StartCrawlerRequest { Name = c.Name })));
runtasks.Dump("Run Tasks");
}
// Define other methods and classes here
@@ -0,0 +1,77 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.Glue</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>Amazon.Glue</Namespace>
<Namespace>Amazon.Glue.Model</Namespace>
<Namespace>System.Threading.Tasks</Namespace>
</Query>
void Main()
{
var accessKeyID = Util.GetPassword("aws.sdt-tlamb.accessid");
var secretKey = Util.GetPassword("aws.sdt-tlamb.secretid");
var crawlerName = "client1_input_icd10dx";
var client = new AmazonGlueClient(accessKeyID, secretKey, RegionEndpoint.USEast1);
var regex = new Regex("(icd_?)(10)");
var crawler = client.GetCrawler(new GetCrawlerRequest { Name = crawlerName }).Crawler;
var newCrawler = JsonConvert.DeserializeObject<CreateCrawlerRequest>(regex.Replace(JsonConvert.SerializeObject(crawler), "${1}9"));
//newCrawler.LastCrawl = null;
crawler.Dump("Crawler");
newCrawler.Dump("New Crawler");
var result = client.CreateCrawler(newCrawler);
result.Dump();
}
// Define other methods and classes here
@@ -0,0 +1,70 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.Glue</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>Amazon.Glue</Namespace>
<Namespace>Amazon.Glue.Model</Namespace>
<Namespace>System.Threading.Tasks</Namespace>
</Query>
void Main()
{
var accessKeyID = Util.GetPassword("aws.sdt-tlamb.accessid");
var secretKey = Util.GetPassword("aws.sdt-tlamb.secretid");
var bucketName = "sdt-glue-hackweek";
var client = new AmazonS3Client(accessKeyID, secretKey, RegionEndpoint.USEast1);
bucketName.AWSListBucket(client).S3Objects.Dump("S3 Objects");
}
// Define other methods and classes here
@@ -0,0 +1,201 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.Glue</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>Amazon.Glue</Namespace>
<Namespace>Amazon.Glue.Model</Namespace>
<Namespace>System.Threading.Tasks</Namespace>
</Query>
void Main()
{
var accessKeyID = Util.GetPassword("aws.sdt-tlamb.accessid");
var secretKey = Util.GetPassword("aws.sdt-tlamb.secretid");
var bucketName = "sdt-glue-hackweek";
var crawlerName = "client1_input_icd10dx";
var client = new AmazonS3Client(accessKeyID, secretKey, RegionEndpoint.USEast1);
var glueclient = new AmazonGlueClient(accessKeyID, secretKey, RegionEndpoint.USEast1);
//UploadICDFiles(client, bucketName);
//ListBucket(client, bucketName).Dump("S3 Buckets");
ListCrawlers(glueclient).Crawlers.Select(c => new
{
c.Name,
c.DatabaseName,
c.LastCrawl.Status,
c.LastCrawl.ErrorMessage,
c.Description,
c.Targets.S3Targets
}).Dump("Crawlers");
/*
//RunCrawler(glueclient, crawlerName).Dump();
glueclient.GetDatabases(new GetDatabasesRequest{}).DatabaseList.Dump("Database");
glueclient.GetCrawler(new GetCrawlerRequest { Name = crawlerName}).Crawler.Dump("Crawler");
glueclient.GetTables(new GetTablesRequest{DatabaseName = "glue-hackweek-icd"}).TableList.Dump("glue hackweek icd tables");
*/
}
// Define other methods and classes here
void UploadICDFiles(AmazonS3Client client, string bucketName)
{
var regex = new Regex("wfu_icd(10|9)_(dx|px)_(\\d*)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
var sourcePath = @"S:\Development\Cube Killers\Deidentified DI Import Files\Wake - Deidentified";
var sourceFiles = "wfu_icd*.psv";
var files = System.IO.Directory.GetFiles(sourcePath, sourceFiles).OrderBy(f => f);
files
//.Where(f => f.Contains("10_dx"))
//.Take(1)
.ToList().ForEach(f =>
{
var fileName = Path.GetFileNameWithoutExtension(f);
var subdir = regex.Replace(fileName, "icd/icd$1/$2");
var key = regex.Replace(fileName, "icd$1$2");
TransferToBucketAsync(client, bucketName, subdir, key, f).Wait();//.Dump();
});
}
ListObjectsResponse ListBucket(AmazonS3Client client, string bucketName)
{
var request = new Amazon.S3.Model.ListObjectsRequest();
return client.ListObjects(bucketName);
}
ListObjectsResponse ListBucket(string accessKeyID, string secretKey, string bucketName)
{
using (var client = new AmazonS3Client(accessKeyID, secretKey, RegionEndpoint.USEast1))
{
return ListBucket(client, bucketName);
}
}
static async Task TransferToBucketAsync(AmazonS3Client client, string bucketName, string subdirName, string keyName, string fileName)
{
new { keyName, fileName }.Dump();
var utility = new TransferUtility(client);
var request = new TransferUtilityUploadRequest
{
BucketName = $"{bucketName}{(!string.IsNullOrEmpty(subdirName) ? @"/" + subdirName : "")}",
Key = keyName,
ContentType = "text/plain"
};
request.FilePath = fileName;
await utility.UploadAsync(request);
}
static async Task<PutObjectResponse> UploadToBucketAsync(AmazonS3Client client, string bucketName, string keyName, string fileName)
{
new { keyName, fileName }.Dump();
var request = new Amazon.S3.Model.PutObjectRequest
{
BucketName = bucketName,
Key = keyName,
ContentBody = File.ReadAllText(fileName),
ContentType = "text/plain"
};
request.FilePath = fileName;
return await client.PutObjectAsync(request);
}
PutObjectResponse UploadToBucket(AmazonS3Client client, string bucketName, string keyName, string fileName)
{
new { keyName, fileName }.Dump();
var result = UploadToBucketAsync(client, bucketName, keyName, fileName);
result.Wait();
return result.Result;
}
PutObjectResponse UploadToBucket(string accessKeyID, string secretKey, string bucketName, string keyName, string fileName)
{
using (var client = new AmazonS3Client(accessKeyID, secretKey, RegionEndpoint.USEast1))
{
return UploadToBucket(client, bucketName, keyName, fileName);
}
}
GetCrawlersResponse ListCrawlers(AmazonGlueClient client)
{
return client.GetCrawlers(new GetCrawlersRequest());
}
GetCrawlersResponse ListCrawlers(string accessKeyID, string secretKey)
{
using (var client = new AmazonGlueClient(accessKeyID, secretKey, RegionEndpoint.USEast1))
{
var crawlerRequest = new GetCrawlersRequest();
return client.GetCrawlers(crawlerRequest);
}
}
StartCrawlerResponse RunCrawler(AmazonGlueClient client, string crawlerName)
{
var crawler = new StartCrawlerRequest
{
Name = crawlerName
};
return client.StartCrawler(crawler);
}
StartCrawlerResponse RunCrawler(string accessKeyID, string secretKey, string crawlerName)
{
using (var client = new AmazonGlueClient(accessKeyID, secretKey, RegionEndpoint.USEast1))
{
var crawler = new StartCrawlerRequest
{
Name = crawlerName
};
return client.StartCrawler(crawler);
}
}
@@ -0,0 +1,70 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.Glue</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>Amazon.Glue</Namespace>
<Namespace>Amazon.Glue.Model</Namespace>
<Namespace>System.Threading.Tasks</Namespace>
</Query>
void Main()
{
var accessKeyID = Util.GetPassword("aws.sdt-tlamb.accessid");
var secretKey = Util.GetPassword("aws.sdt-tlamb.secretid");
var crawlerNames = new[] { "client1_input_icd10dx", "client1_input_icd10px"};
var client = new AmazonGlueClient(accessKeyID, secretKey, RegionEndpoint.USEast1);
crawlerNames.ToList().ForEach(crawlerName => crawlerName.RunCrawler(client).Dump($"{crawlerName}"));
}
// Define other methods and classes here
@@ -0,0 +1,87 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
var sourcePath = @"S:\Development\Cube Killers\Deidentified DI Import Files\Wake - Deidentified";
var files = Directory.GetFiles(sourcePath, "wfu*.*");
var uploads = files.Select(f =>
{
var s3Name = Regex.Replace(Path.GetFileNameWithoutExtension(f).Replace("_", "/"), @"^(.*)/[\d]{8}$", "${1}");
var subdir = string.Join("/", s3Name.Split('/').TakeAllButLast());
var keyName = s3Name.Split('/').Last();
return new
{
fullName = f,
fileName = Path.GetFileNameWithoutExtension(f),
s3Name,
subdir,
keyName
};
});
uploads.Dump("Uploads");
var accessKeyID = Util.GetPassword("aws.sdt-tlamb.accessid");
var secretKey = Util.GetPassword("aws.sdt-tlamb.secretid");
var bucketName = "sdt-glue-hackweek";
var client = new AmazonS3Client(accessKeyID, secretKey, RegionEndpoint.USEast1);
var oldFiles = bucketName.AWSListBucket(client).S3Objects.Where(f => f.Key.StartsWith("wfu/")).ToList();
oldFiles.ForEach(f => client.DeleteObject(bucketName, f.Key));
bucketName.AWSListBucket(client).S3Objects.Dump("Before");
uploads.ToList().ForEach(u => u.fullName.AWSUploadAsync(client, bucketName, u.keyName, u.s3Name));
bucketName.AWSListBucket(client).S3Objects.Dump("After");
}
// Define other methods and classes here
+58
View File
@@ -0,0 +1,58 @@
<Query Kind="Statements">
<Connection>
<ID>ce6f5caf-a955-42be-a634-5eb79966aca4</ID>
<Persist>true</Persist>
<Server>D0017-SQL-01.sdt.local</Server>
<Database>jazz tst Aurora 20160126.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
</Query>
var dataRun = from i in ((from fpes in FactPatientEncounterSummaries
where fpes.DischargeDateTime > fpes.AdmitDateTime
&& fpes.DateofDeath >= fpes.AdmitDateTime
&& fpes.DateofDeath >= fpes.DischargeDateTime.AddDays(-30) && fpes.DateofDeath <= fpes.DischargeDateTime.AddDays(30)
&& fpes.AdmitDateTime >= new DateTime(2015,1,1)
select new { fpes.FiscalYearID, fpes.EntityID, fpes.FacilityID, fpes.AttendPhysicianID, fpes.PrimaryPhysicianID, fpes.MSDRGCaseTypeFamilyID
, fpes.AdmitDateTime, fpes.DischargeDateTime, fpes.DateofDeath, fpes.PatientID, fpes.LengthOfStay })
.Take(10000))
group i by new { i.FiscalYearID, i.EntityID, i.FacilityID
, i.AttendPhysicianID
, i.PrimaryPhysicianID
, AdmitDateTimeYr = i.AdmitDateTime.Year
, AdmitDateTimeMo = i.AdmitDateTime.Month
, CaseTypeFamilyID= i.MSDRGCaseTypeFamilyID
, DischargeDateTimeYr = i.DischargeDateTime.Year
, DischargeDateTimeMo = i.DischargeDateTime.Month
, DateofDeathYr = i.DateofDeath.Year
, DateofDeathMo = i.DateofDeath.Month
} into g
select new { g.Key.FiscalYearID, g.Key.EntityID, g.Key.FacilityID
, g.Key.AttendPhysicianID
, g.Key.PrimaryPhysicianID
, g.Key.AdmitDateTimeYr
, g.Key.AdmitDateTimeMo
, g.Key.CaseTypeFamilyID
, g.Key.DischargeDateTimeYr
, g.Key.DischargeDateTimeMo
, g.Key.DateofDeathYr
, g.Key.DateofDeathMo
, MinDeath = (int)g.Min(rl => Math.Abs((rl.DateofDeath - rl.DischargeDateTime).TotalDays))
, MaxDeath = (int)g.Max(rl => Math.Abs((rl.DateofDeath - rl.DischargeDateTime).TotalDays))
, AvgDeath = (int)g.Average(rl => Math.Abs((rl.DateofDeath - rl.DischargeDateTime).TotalDays))
, DeceasedPatients = g.Count()
, AvgLOS = (int)g.Average(rl => rl.LengthOfStay) }
;
(from data in dataRun
join de in Clientdss_DimEntities on data.EntityID equals de.EntityID
group data by new { data.EntityID, de.Name } into g
orderby g.Key.EntityID
select new { g.Key.EntityID, g.Key.Name, DeceasedPatients = g.Sum(rl => rl.DeceasedPatients) }).Dump();
+111
View File
@@ -0,0 +1,111 @@
<Query Kind="Statements">
<Connection>
<ID>ce6f5caf-a955-42be-a634-5eb79966aca4</ID>
<Persist>true</Persist>
<Server>D0017-SQL-01.sdt.local</Server>
<Database>jazz tst Aurora 20160126.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
</Query>
var dataRun = from i in (
(from fpes in FactPatientEncounterSummaries
where fpes.DischargeDateTime > fpes.AdmitDateTime
&& fpes.DateofDeath >= fpes.AdmitDateTime
&& fpes.DateofDeath >= fpes.DischargeDateTime.AddDays(-30) && fpes.DateofDeath <= fpes.DischargeDateTime.AddDays(30)
&& fpes.AdmitDateTime >= new DateTime(2015,1,1)
select new { fpes.FiscalYearID, fpes.EntityID, fpes.FacilityID, fpes.AttendPhysicianID, fpes.PrimaryPhysicianID, fpes.MSDRGCaseTypeFamilyID
, fpes.AdmitDateTime, fpes.DischargeDateTime, fpes.DateofDeath, fpes.PatientID, fpes.LengthOfStay })
.Take(10000)
)
group i by new { i.FiscalYearID, i.EntityID, i.FacilityID
, i.AttendPhysicianID
, i.PrimaryPhysicianID
, AdmitDateTimeYr = i.AdmitDateTime.Year
, AdmitDateTimeMo = i.AdmitDateTime.Month
, CaseTypeFamilyID= i.MSDRGCaseTypeFamilyID
, DischargeDateTimeYr = i.DischargeDateTime.Year
, DischargeDateTimeMo = i.DischargeDateTime.Month
, DateofDeathYr = i.DateofDeath.Year
, DateofDeathMo = i.DateofDeath.Month
} into g
join de in Clientdss_DimEntities on g.Key.EntityID equals de.EntityID
join df in DimFacilities on g.Key.FacilityID equals df.FacilityID
join dpAttend in DimPhysicians on g.Key.AttendPhysicianID equals dpAttend.PhysicianID
join dpPrimary in DimPhysicians on g.Key.PrimaryPhysicianID equals dpPrimary.PhysicianID
join ctf in CaseTypeFamilies on g.Key.CaseTypeFamilyID equals ctf.CaseTypeFamilyID
orderby g.Key.FiscalYearID, g.Key.EntityID, g.Key.FacilityID
select new { g.Key.FiscalYearID
//, g.Key.EntityID
, Entity = de.Name
//, g.Key.FacilityID
, Facility = df.Name
//, g.Key.AttendPhysicianID
, Attenring = dpAttend.Physician
//, g.Key.PrimaryPhysicianID
, Primary = dpPrimary.Physician
, CaseTypeFamily = ctf.Name
, g.Key.AdmitDateTimeYr
, g.Key.AdmitDateTimeMo
, g.Key.CaseTypeFamilyID
, g.Key.DischargeDateTimeYr
, g.Key.DischargeDateTimeMo
, g.Key.DateofDeathYr
, g.Key.DateofDeathMo
, MinDeath = (int)g.Min(rl => Math.Abs((rl.DateofDeath - rl.DischargeDateTime).TotalDays))
, MaxDeath = (int)g.Max(rl => Math.Abs((rl.DateofDeath - rl.DischargeDateTime).TotalDays))
, AvgDeath = (int)g.Average(rl => Math.Abs((rl.DateofDeath - rl.DischargeDateTime).TotalDays))
, DeceasedPatients = g.Count()
, AvgLOS = (int)g.Average(rl => rl.LengthOfStay) }
;
dataRun.Dump();
/*
(from i in (from data in dataRun group data by new { data.AttendPhysicianID } into g select g.First())
join dp in DimPhysicians on i.AttendPhysicianID equals dp.PhysicianID
orderby i.AttendPhysicianID
select new { i.AttendPhysicianID, Attending = dp.Physician }).Dump();
(from i in (from data in dataRun group data by new { data.PrimaryPhysicianID } into g select g.First())
join dp in DimPhysicians on i.PrimaryPhysicianID equals dp.PhysicianID
orderby i.PrimaryPhysicianID
select new { i.PrimaryPhysicianID, Primary = dp.Physician }).Dump();
(from i in (from data in dataRun group data by new { data.CaseTypeFamilyID } into g select g.First())
join ctf in CaseTypeFamilies on i.CaseTypeFamilyID equals ctf.CaseTypeFamilyID
orderby i.CaseTypeFamilyID
select new { i.CaseTypeFamilyID, CaseTypeFamily = ctf.Name }).Dump();
var result =
from data in dataRun
join de in Clientdss_DimEntities on data.EntityID equals de.EntityID
join df in DimFacilities on data.FacilityID equals df.FacilityID
join dpAttend in DimPhysicians on data.AttendPhysicianID equals dpAttend.PhysicianID
join dpPrimary in DimPhysicians on data.PrimaryPhysicianID equals dpPrimary.PhysicianID
join ctf in CaseTypeFamilies on data.CaseTypeFamilyID equals ctf.CaseTypeFamilyID
orderby data.FiscalYearID, data.EntityID, data.FacilityID, data.AdmitDateTimeYr, data.AdmitDateTimeMo, data.CaseTypeFamilyID
select new { data.FiscalYearID, data.EntityID
, Entity = de.Name
, data.FacilityID
, Facility = df.Name
, data.AttendPhysicianID
, Attending = dpAttend.Physician
, data.PrimaryPhysicianID
, Primary = dpPrimary.Physician
, AdmitDate = $"{data.AdmitDateTimeYr:0000}/{data.AdmitDateTimeMo:00}"
, data.CaseTypeFamilyID
, CaseTypeFamily = ctf.Name
, DischargeDate = $"{data.DischargeDateTimeYr:0000}/{data.DischargeDateTimeMo:00}"
, DateOfDeath = $"{data.DateofDeathYr:0000}/{data.DateofDeathMo:00}"
, data.MinDeath
, data.MaxDeath
, data.AvgDeath
, data.DeceasedPatients
, data.AvgLOS};
*/
+105
View File
@@ -0,0 +1,105 @@
<Query Kind="Statements">
<Connection>
<ID>ce6f5caf-a955-42be-a634-5eb79966aca4</ID>
<Persist>true</Persist>
<Server>D0017-SQL-01.sdt.local</Server>
<Database>jazz tst Aurora 20160126.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
</Query>
var dataRun = from i in ((from fpes in FactPatientEncounterSummaries
where fpes.DischargeDateTime > fpes.AdmitDateTime
&& fpes.DateofDeath >= fpes.AdmitDateTime
&& fpes.DateofDeath >= fpes.DischargeDateTime.AddDays(-30) && fpes.DateofDeath <= fpes.DischargeDateTime.AddDays(30)
&& fpes.AdmitDateTime >= new DateTime(2015,1,1)
select new { fpes.FiscalYearID, fpes.EntityID, fpes.FacilityID, fpes.AttendPhysicianID, fpes.PrimaryPhysicianID, fpes.MSDRGCaseTypeFamilyID
, fpes.AdmitDateTime, fpes.DischargeDateTime, fpes.DateofDeath, fpes.PatientID, fpes.LengthOfStay })
.Take(10000))
group i by new { i.FiscalYearID, i.EntityID, i.FacilityID
, i.AttendPhysicianID
, i.PrimaryPhysicianID
, AdmitDateTimeYr = i.AdmitDateTime.Year
, AdmitDateTimeMo = i.AdmitDateTime.Month
, CaseTypeFamilyID= i.MSDRGCaseTypeFamilyID
, DischargeDateTimeYr = i.DischargeDateTime.Year
, DischargeDateTimeMo = i.DischargeDateTime.Month
, DateofDeathYr = i.DateofDeath.Year
, DateofDeathMo = i.DateofDeath.Month
} into g
select new { g.Key.FiscalYearID, g.Key.EntityID, g.Key.FacilityID
, g.Key.AttendPhysicianID
, g.Key.PrimaryPhysicianID
, g.Key.AdmitDateTimeYr
, g.Key.AdmitDateTimeMo
, g.Key.CaseTypeFamilyID
, g.Key.DischargeDateTimeYr
, g.Key.DischargeDateTimeMo
, g.Key.DateofDeathYr
, g.Key.DateofDeathMo
, MinDeath = (int)g.Min(rl => Math.Abs((rl.DateofDeath - rl.DischargeDateTime).TotalDays))
, MaxDeath = (int)g.Max(rl => Math.Abs((rl.DateofDeath - rl.DischargeDateTime).TotalDays))
, AvgDeath = (int)g.Average(rl => Math.Abs((rl.DateofDeath - rl.DischargeDateTime).TotalDays))
, DeceasedPatients = g.Count()
, AvgLOS = (int)g.Average(rl => rl.LengthOfStay) }
;
(from i in (from data in dataRun group data by new { data.EntityID } into g select g.First())
join de in Clientdss_DimEntities on i.EntityID equals de.EntityID
orderby i.EntityID
select new { i.EntityID, Entity = de.Name }).Dump();
(from i in (from data in dataRun group data by new { data.FacilityID } into g select g.First())
join df in DimFacilities on i.FacilityID equals df.FacilityID
orderby i.FacilityID
select new { i.FacilityID, Facility = df.Name }).Dump();
(from i in (from data in dataRun group data by new { data.AttendPhysicianID } into g select g.First())
join dp in DimPhysicians on i.AttendPhysicianID equals dp.PhysicianID
orderby i.AttendPhysicianID
select new { i.AttendPhysicianID, Attending = dp.Physician }).Dump();
(from i in (from data in dataRun group data by new { data.PrimaryPhysicianID } into g select g.First())
join dp in DimPhysicians on i.PrimaryPhysicianID equals dp.PhysicianID
orderby i.PrimaryPhysicianID
select new { i.PrimaryPhysicianID, Primary = dp.Physician }).Dump();
(from i in (from data in dataRun group data by new { data.CaseTypeFamilyID } into g select g.First())
join ctf in CaseTypeFamilies on i.CaseTypeFamilyID equals ctf.CaseTypeFamilyID
orderby i.CaseTypeFamilyID
select new { i.CaseTypeFamilyID, CaseTypeFamily = ctf.Name }).Dump();
var result =
from data in dataRun
join de in Clientdss_DimEntities on data.EntityID equals de.EntityID
join df in DimFacilities on data.FacilityID equals df.FacilityID
join dpAttend in DimPhysicians on data.AttendPhysicianID equals dpAttend.PhysicianID
join dpPrimary in DimPhysicians on data.PrimaryPhysicianID equals dpPrimary.PhysicianID
join ctf in CaseTypeFamilies on data.CaseTypeFamilyID equals ctf.CaseTypeFamilyID
orderby data.FiscalYearID, data.EntityID, data.FacilityID, data.AdmitDateTimeYr, data.AdmitDateTimeMo, data.CaseTypeFamilyID
select new { data.FiscalYearID, data.EntityID
, Entity = de.Name
, data.FacilityID
, Facility = df.Name
, data.AttendPhysicianID
, Attending = dpAttend.Physician
, data.PrimaryPhysicianID
, Primary = dpPrimary.Physician
, AdmitDate = $"{data.AdmitDateTimeYr:0000}/{data.AdmitDateTimeMo:00}"
, data.CaseTypeFamilyID
, CaseTypeFamily = ctf.Name
, DischargeDate = $"{data.DischargeDateTimeYr:0000}/{data.DischargeDateTimeMo:00}"
, DateOfDeath = $"{data.DateofDeathYr:0000}/{data.DateofDeathMo:00}"
, data.MinDeath
, data.MaxDeath
, data.AvgDeath
, data.DeceasedPatients
, data.AvgLOS};
result.Dump();
+140
View File
@@ -0,0 +1,140 @@
<Query Kind="Program">
<Connection>
<ID>77b65bea-e766-4e3c-a1ed-c4c2534b6019</ID>
<Persist>true</Persist>
<Server>D0001-SQL-11.sdt.local</Server>
<Database>jazz dev master Prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>System.Runtime.Remoting.Contexts</Namespace>
</Query>
void Main()
{
GetColumns();
}
public void GetSchema()
{
var schemata = ExecuteQuery<Schemata>("select * from Information_Schema.SCHEMATA")
.GroupBy(g => g.CATALOG_NAME, (Key, Data) => new { Key, Data = Data.OrderBy(d => d.SCHEMA_OWNER).ThenBy(d => d.SCHEMA_NAME).ToList() })
.OrderBy(grp => grp.Key)
.ToList();
schemata.Dump();
}
public void GetTables(string schema = null)
{
var tables = ExecuteQuery<Table>($"select * from Information_Schema.TABLES AS t WHERE t.TABLE_SCHEMA = '{schema}'")
.GroupBy(x => new { x.TABLE_SCHEMA, x.TABLE_TYPE },
(Key, Tables) => new { Schema = Key.TABLE_SCHEMA, Type = Key.TABLE_TYPE, Tables = Tables.Select(ta => ta.TABLE_NAME).OrderBy(ta => ta).ToList() });
tables.Dump();
}
public void GetColumns(string schema = null)
{
// var tableDefs = tables.Where(t => t.Schema == schema).SelectMany(t => t.Tables.Select(ta =>
// ExecuteQuery<Column>($"select * from Information_Schema.COLUMNS AS c WHERE c.TABLE_SCHEMA = '{t.Schema}' AND c.TABLE_NAME = '{ta}'")));
var tableDefs = ExecuteQuery<TableColumn>($"select * from Information_Schema.COLUMNS AS c")
.GroupBy(c => new Table {TABLE_CATALOG= c.TABLE_CATALOG, TABLE_SCHEMA = c.TABLE_SCHEMA, TABLE_TYPE = c.TABLE_NAME },
(Key, Columns) => new { Key, Columns = Columns.OrderBy(c => c.ORDINAL_POSITION).ToList() })
.OrderBy(c => c.Key.TABLE_CATALOG)
.ThenBy(c => c.Key.TABLE_SCHEMA)
.ThenBy(c => c.Key.TABLE_NAME);
tableDefs.Dump();
}
// Define other methods and classes here
public class Schemata
{
public string CATALOG_NAME { get; set; }
public string SCHEMA_NAME { get; set; }
public string SCHEMA_OWNER { get; set; }
}
public class Table
{
public string TABLE_CATALOG { get; set; }
public string TABLE_SCHEMA { get; set; }
public string TABLE_NAME { get; set; }
public string TABLE_TYPE { get; set; }
}
public class TableColumn
{
public string TABLE_CATALOG { get; set; }
public string TABLE_SCHEMA { get; set; }
public string TABLE_NAME { get; set; }
public string COLUMN_NAME { get; set; }
public int? ORDINAL_POSITION { get; set; }
public string COLUMN_DEFAULT { get; set; }
public string IS_NULLABLE { get; set; }
public string DATA_TYPE { get; set; }
public int? CHARACTER_MAXIMUM_LENGTH { get; set; }
public int? CHARACTER_OCTET_LENGTH { get; set; }
public byte? NUMERIC_PRECISION { get; set; }
public short? NUMERIC_PRECISION_RADIX { get; set; }
public int? NUMERIC_SCALE { get; set; }
public short? DATETIME_PRECISION { get; set; }
public string CHARACTER_SET_CATALOG { get; set; }
public string CHARACTER_SET_SCHEMA { get; set; }
public string CHARACTER_SET_NAME { get; set; }
public string COLLATION_CATALOG { get; set; }
public string COLLATION_SCHEMA { get; set; }
public string COLLATION_NAME { get; set; }
public string DOMAIN_CATALOG { get; set; }
public string DOMAIN_SCHEMA { get; set; }
public string DOMAIN_NAME { get; set; }
}
@@ -0,0 +1,111 @@
<Query Kind="Program">
<Connection>
<ID>580b3b8d-cc02-4a68-8fbd-d1ec374a25f2</ID>
<Persist>true</Persist>
<Server>D0001-sql-11.sdt.local</Server>
<Database>jazz dev master Prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<NuGetReference>LinqToCsv</NuGetReference>
<Namespace>LINQtoCSV</Namespace>
</Query>
void Main()
{
var path = @"D:\Users\tlamb\Downloads";
var fileName = @"FY2020 New Codes_04242020_Final.csv";
var filePath = Path.Combine(path, fileName);
if (!File.Exists(filePath)) return;
//var data = File.ReadAllLines(filePath);
//data.Dump();
var inputFileDescription = new CsvFileDescription
{
SeparatorChar = ',',
FirstLineHasColumnNames = true
};
var ctfVersion = CaseTypeFamilyVersions.Any(x => x.Name.Equals("2019 Standard Mapping"))
? (from x in CaseTypeFamilyVersions
where x.Name.Equals("2019 Standard Mappings")
select x.CaseTypeFamilyVersionID).FirstOrDefault()
: 2;
//ctfVersion.Dump();
var cc = new CsvContext();
var dat = from x in cc.Read<CTFDefinitions>(filePath, inputFileDescription)
select new
{
ctfVersion,
x.Column1,
x.MS_DRG_Code,
x.MDC,
x.ICD10Code,
x.ICD10_Code_Description,
x.Code_Type_1DX_3PX,
Exclusion_Type = (x.Exclusion_Type == "N"),
x.DRGs_to_CTFs,
ICD_Needs_Review = (x.ICD_Needs_Review != "#N/A"),
x.CTF_Type,
Same_Type = (x.Same_Type == "Yes"),
CTF_To_Assign_Existing = (x.CTF_To_Assign_Existing ?? "").Replace("&", "And"),
New_CTF = ((x.New_CTF ?? "No") == "Yes")
};
//dat.Dump();
var xCTF_To_Assign = dat.Select(d => d.CTF_To_Assign_Existing).Distinct();
var ctf = CaseTypeFamilies
.Where(c => xCTF_To_Assign.Contains(c.Name))
.GroupBy(c => c.Name, (g, d) => new { name = g, ids = d.Select(x => x.CaseTypeFamilyID).ToList() })
.ToDictionary(c => c.name, c => c.ids);
//ctf.Aggregate("", (x, y) => $"{x}\r\nUNION\r\nSelect Name, Case Name when '{y.Key}' THEN 1 ELSE 0 END isMatch from dss.CaseTypeFamily where CaseTypeFamilyID = {y.Value.First()}").Substring(9) .Dump();
var msDrg = dat
.Where(d => !string.IsNullOrEmpty(d.ICD10Code))
.ToList()
.ConvertAll(d =>
{
var caseTypeFamilyID = ctf.TryGetValue(d.CTF_To_Assign_Existing, out var value)
? value.FirstOrDefault()
: 0;
return new
{
CaseTypeFamilyID = caseTypeFamilyID,
CTFExisting = d.CTF_To_Assign_Existing,
SkipICD = false,
ICD10Code = d.ICD10Code.Replace(".",""),
MSDRGCode = d.MS_DRG_Code,
CaseTypeFamilyVersionID = d.ctfVersion
};
})
//.Where(d => d.ICD10Code.Contains("."))
.Aggregate("", (x, y) => $@"{x}
INSERT INTO dss.CaseTypeFamilyMappingICD10
( CaseTypeFamilyID, SkipICD, ICD10Code, MSDRGCode, CaseTypeFamilyVersionID )
SELECT ctf.CaseTypeFamilyID,{(y.SkipICD ? 1 : 0)},'{y.ICD10Code}','{y.MSDRGCode}',{y.CaseTypeFamilyVersionID}
FROM dss.CaseTypeFamily ctf
WHERE ctf.Name = '{y.CTFExisting}'")
.Substring(4);
msDrg.Dump();
}
// Define other methods and classes here
public class CTFDefinitions
{
public string Column1 { get; set; }
public string MS_DRG_Code { get; set; }
public string MDC { get; set; }
public string ICD10Code { get; set; }
public string ICD10_Code_Description { get; set; }
public string Code_Type_1DX_3PX { get; set; }
public string Exclusion_Type { get; set; }
public string DRGs_to_CTFs { get; set; }
public string ICD_Needs_Review { get; set; }
public string CTF_Type { get; set; }
public string Same_Type { get; set; }
public string CTF_To_Assign_Existing { get; set; }
public string New_CTF { get; set; }
}
+79
View File
@@ -0,0 +1,79 @@
<Query Kind="Program">
<Connection>
<ID>bd4e97c5-84e7-4c61-80ca-8d53d7876af2</ID>
<Persist>true</Persist>
<Server>D0001-SQL-11.sdt.local</Server>
<Database>jazz dev master Prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Namespace>System.Globalization</Namespace>
</Query>
void Main()
{
var ti = CultureInfo.CurrentCulture.TextInfo;
var _2020MSDRGs = (from x in DimMSDRGs where x.DRGSchema == "2020MSDRG" select x.MSDRGCode).Distinct();
var _caseTypeFamilyMappingICD10 = (from x in CaseTypeFamilyMappingICD10s select x.MSDRGCode).Distinct();
var _ctfGlobalID = (from x in CaseTypeFamilies where x.CaseTypeFamilyGlobalID.StartsWith("M-") select x.CaseTypeFamilyGlobalID)
.ToList()
.Where(x => Regex.IsMatch(x, @"M-\d+"))
.Select(x => int.Parse(Regex.Replace(x, @"M-(\d+)", "$1")))
.OrderByDescending(x => x)
//.Select(x => $"M-{x}")
.First();
//_ctfGlobalID.Dump();
var part1 = (from msdrg in DimMSDRGs
where msdrg.DRGSchema == "2021MSDRG"
&& !_2020MSDRGs.Contains(msdrg.MSDRGCode)
select new
{
msdrg.MSDRGCode,
CaseTypeFamilyName = ti.ToTitleCase(msdrg.Description.ToLower())
})
.ToList();
var part2 = (from msdrg in DimMSDRGs
where msdrg.DRGSchema == "2021MSDRG"
&& !_caseTypeFamilyMappingICD10.Contains(msdrg.MSDRGCode)
select new
{
msdrg.MSDRGCode,
CaseTypeFamilyName = ti.ToTitleCase(msdrg.Description.ToLower())
})
.ToList();
var results = part1.Union(part2).ToList()
.ConvertAll(x =>
{
_ctfGlobalID++;
return new
{
CaseTypeFamilyGlobalID = $"M-{_ctfGlobalID}",
x.MSDRGCode,
x.CaseTypeFamilyName
};
});
//results.Dump("results");
var deleteCaseTypeFamily = results
.Aggregate("", (x, y) => $"{x}\r\nDELETE FROM dss.CaseTypeFamily WHERE Name = '{y.CaseTypeFamilyName}' AND CaseTypeFamilyGlobalID = '{y.CaseTypeFamilyGlobalID}'");
var insertCaseTypeFamily = results
.Aggregate($"INSERT INTO dss.CaseTypeFamily ( CaseTypeFamilyGUID, Name, CaseTypeFamilyGlobalID )\r\nVALUES",
(x, y) => $"{x}\r\n('{Guid.NewGuid()}', '{y.CaseTypeFamilyName}', '{y.CaseTypeFamilyGlobalID}'),").TrimEnd(",".ToCharArray());
var deleteICD10 = results
.Aggregate("", (x, y) => $@"{x}
DELETE FROM dss.CaseTypeFamilyMappingICD10
WHERE EXISTS(SELECT 1 FROM dss.CaseTypeFamily ctf
WHERE ctf.CaseTypeFamilyGlobalID = '{y.CaseTypeFamilyGlobalID}' AND SkipICD = 1 AND ctf.CaseTypeFamilyID = CaseTypeFamilyMappingICD10.CaseTypeFamilyID)
AND CaseTypeFamilyMappingICD10.MSDRGCode = '{y.MSDRGCode}' AND CaseTypeFamilyVersionID = 2");
var insertICD10 = results
.Aggregate($"INSERT INTO dss.CaseTypeFamilyMappingICD10 ( CaseTypeFamilyID, SkipICD, ICD10Code, MSDRGCode, CaseTypeFamilyVersionID )\r\nVALUES",
(x, y) => $"{x}\r\n((SELECT ctf.CaseTypeFamilyID from dss.CaseTypeFamily ctf where ctf.CaseTypeFamilyGlobalID = '{y.CaseTypeFamilyGlobalID}'), 1, '0', '{y.MSDRGCode}', 2),").TrimEnd(new[] { ',' });
var migration =
deleteCaseTypeFamily + "\r\nGO\r\n" +
insertCaseTypeFamily + "\r\nGO\r\n" +
deleteICD10 + "\r\nGO\r\n" +
insertICD10 + "\r\nGO\r\n";
migration.Dump();
}
// Define other methods and classes here
+84
View File
@@ -0,0 +1,84 @@
<Query Kind="Statements">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
var filePath = @"D:\Git\2020-01-15-13-20 B-24820 UV Case Type Setup CPT Codes.sql";
var regex = new Regex(@"[\r\n\s]+");
var regex2 = new Regex(@"^[^']+'(C?[\d]+).+O-([\d]{4}).+$");
var info = File.ReadAllText(filePath)
.Split(';')
.Select(x => x.TrimStart(new[] { '\r', '\n' }))
.Where(x => x.StartsWith("INSERT INTO [dss].[CaseTypeFamilyMappingCPT]")).ToList()
.ConvertAll(x =>
{
x = regex.Replace(x, " ");
var CPTCode = regex2.Replace(x, "$1");
var GlobalId = regex2.Replace(x, "O-$2");
return new { GlobalId, CPTCode };
})
.GroupBy(x => x.GlobalId, (g, d) => new
{
GlobalId = g,
CPTCodes = d.Select(c => c.CPTCode)
})
.OrderBy(x => x.GlobalId);
//info.Dump();
info
.Aggregate(@"DECLARE @CaseTypeFamilyID INT
", (a, b) => $@"{a}SELECT @CaseTypeFamilyID = [CaseTypeFamilyID] FROM [dss].[CaseTypeFamily] WHERE [CaseTypeFamilyGlobalID] = '{b.GlobalId}';
INSERT INTO [dss].[CaseTypeFamilyMappingCPT] ([CaseTypeFamilyID], [CPTCode], [CaseTypeFamilyVersionID])
VALUES{b.CPTCodes.Aggregate("", (c, d) => $@"{c}
(@CaseTypeFamilyID, '{d}', 1),").TrimEnd(',')};
")
.Dump();
@@ -0,0 +1,105 @@
<Query Kind="Statements">
<Connection>
<ID>40766b24-ff74-431b-b387-6c221ede77cf</ID>
<Persist>true</Persist>
<Server>p3121-sql-02.sdt.local</Server>
<Database>jazz prd UNC 20180206.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
var timeClasses = new[] { 1, 4 };
var departments = new[] { 115355, 115372, 115373, 45950, 45953, 45955, 45959, 45960, 45967, 45968, 45973, 45974, 45975, 45976, 45977, 45979, 45980, 45982, 45985, 45998, 46030, 59278, 74820 };
var payperiods = new[] { 3136, 3135, 3134, 3133, 3132, 3131 };
var hours = from fact in FactPayrollSampledPayPeriods
join payperiod in DimPayPeriods on fact.PayPeriodID equals payperiod.PayPeriodID
join paycode in DimPayCodeGroups on fact.PayCodeGroupID equals paycode.PayCodeGroupID
join prodclass in DimProductiveClasses on paycode.ProductiveClassID equals prodclass.ProductiveClassID
join department in DimDepartments on fact.DepartmentID equals department.DepartmentID
where prodclass.Name == "Productive"
&& timeClasses.Contains(fact.TimeClassID)
&& departments.Contains(fact.DepartmentID)
&& payperiods.Contains(fact.PayPeriodID)
group new { fact, department, payperiod } by new { department.DepartmentID, payperiod.PayPeriodID, fact.TimeClassID } into g
select new { g.Key.DepartmentID, g.Key.PayPeriodID, g.Key.TimeClassID, Units = g.Sum(f => f.fact.Hours), UnitType = "hours" };
var dollars = from fact in FactPayrollSampledPayPeriods
join payperiod in DimPayPeriods on fact.PayPeriodID equals payperiod.PayPeriodID
join paycode in DimPayCodeGroups on fact.PayCodeGroupID equals paycode.PayCodeGroupID
join department in DimDepartments on fact.DepartmentID equals department.DepartmentID
where timeClasses.Contains(fact.TimeClassID)
&& departments.Contains(fact.DepartmentID)
&& payperiods.Contains(fact.PayPeriodID)
group new { fact, department, payperiod } by new { department.DepartmentID, payperiod.PayPeriodID, fact.TimeClassID } into g
select new { g.Key.DepartmentID, g.Key.PayPeriodID, g.Key.TimeClassID, Units = g.Sum(f => f.fact.Dollars), UnitType = "dollars" };
var uos = from fact in ViewPrimaryStatisticsStaffingByPayPeriod
join payperiod in DimPayPeriods on fact.PayPeriodID equals payperiod.PayPeriodID
join department in DimDepartments on fact.DepartmentID equals department.DepartmentID
where timeClasses.Contains(fact.TimeClassID)
&& departments.Contains(fact.DepartmentID)
&& payperiods.Contains(fact.PayPeriodID)
group new { fact, department, payperiod } by new { department.DepartmentID, payperiod.PayPeriodID, fact.TimeClassID } into g
select new { g.Key.DepartmentID, g.Key.PayPeriodID, g.Key.TimeClassID, Units = g.Sum(f => f.fact.Units) ?? 0.0m, UnitType = "uos" };
hours.Concat(dollars).Concat(uos)
//.Where(x => departments.Contains(x.DepartmentID) && payperiods.Contains(x.PayPeriodID))
.Join(DimDepartments, m => m.DepartmentID, d => d.DepartmentID, (m, d) => new { m.DepartmentID, m.PayPeriodID, m.TimeClassID, m.Units, m.UnitType, Department = d.Name })
.Join(DimPayPeriods, m => m.PayPeriodID, p => p.PayPeriodID, (m, p) => new { m.DepartmentID, m.PayPeriodID, m.TimeClassID, m.Units, m.UnitType, m.Department, p.PeriodStartCalendarDate, p.PeriodEndCalendarDate })
.Join(DimTimeClasses, m => m.TimeClassID, t => t.TimeClassID, (m, t) => new { m.DepartmentID, m.PayPeriodID, m.TimeClassID, m.Units, m.UnitType, m.Department, m.PeriodStartCalendarDate, m.PeriodEndCalendarDate, t.TimeClassCode, TimeClass = t.Name, t.SortOrder })
.OrderBy(x => x.DepartmentID)
.ThenBy(x => x.PayPeriodID)
.ThenBy(x => x.UnitType)
.ThenBy(x => x.SortOrder)
.Dump();
+76
View File
@@ -0,0 +1,76 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>System.Globalization</Namespace>
</Query>
void Main()
{
var culture = new CultureInfo("en-US");
var databaseTime = new DateTime(1900,9,9,13,9,09, DateTimeKind.Utc);
GetUTCLocalDateTime(databaseTime).ToString(culture.DateTimeFormat.ShortDatePattern).Dump();
}
// Define other methods and classes here
/// <summary>
/// convert UTC time from the database to the machine's time
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
internal DateTime GetUTCLocalDateTime(DateTime dateTime)
{
var localTime = dateTime.ToLocalTime();
// convert local time to UTC for database save
var utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(localTime);
return localTime.ToUniversalTime().Subtract(utcOffset);
}
+175
View File
@@ -0,0 +1,175 @@
<Query Kind="Program">
<Connection>
<ID>40766b24-ff74-431b-b387-6c221ede77cf</ID>
<Persist>true</Persist>
<Server>p3121-sql-02.sdt.local</Server>
<Database>jazz prd UNC 20180206.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>RestSharp</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>RestSharp</Namespace>
<Namespace>RestSharp.Authenticators</Namespace>
</Query>
private static string baseurl = "https://dev.sdt.local/StrataJazz201931";
private static Random _rnd;
void Main()
{
var now = DateTime.Today.AddDays(-1 * (7 + ((DateTime.Today.DayOfWeek - DayOfWeek.Monday)) % 7));
var staffing = new Staffing
{
pr = new PayPeriod
{
StartDate = now.AddDays(-14),
EndDate = now.AddDays(-7)
},
Departments = Enumerable.Range(0, 26).ToList()
.ConvertAll(e => //new Department { department =
new DeptInfo($"dept_{e}", Random.Next() * 10m, Random.Next() * 10m, Random.Next() * 10m * Random.Next(-1, 1))
//}
)
};
var data = JsonConvert.SerializeObject(staffing);
data.Dump();
SendMessageByTemplateId(data).Content.Dump();
}
internal static Random Random
{
get => _rnd ?? (_rnd = new Random());
set => _rnd = value;
}
// Define other methods and classes here
public class Staffing
{
public PayPeriod pr { get; set; }
public List<DeptInfo> overall => new List<DeptInfo> { Departments.FirstOrDefault() };
public List<DeptInfo> departments => new List<DeptInfo>
{
new DeptInfo(
$"Current Pay Period ({pr.endDate:M/dd})",
Departments.Sum(d => d.latest_total_variance),
Departments.Sum(d => d.latest_pay_variance),
Departments.Sum(d => d.latest_flex_variance)
)
};
internal List<DeptInfo> Departments { get; set; }
}
public class PayPeriod
{
internal DateTime StartDate { get; set; }
internal DateTime EndDate { get; set; }
public string startDate => StartDate.ToString("MM/dd");
public string endDate => EndDate.ToString("MM/dd");
}
public class Department
{
public DeptInfo department { get; set; }
}
public class DeptInfo
{
public string hyperlink => baseurl;
public string name { get; set; }
internal decimal latest_total_variance { get; set; }
internal decimal latest_pay_variance { get; set; }
internal decimal latest_flex_variance { get; set; }
public string total_variance => $"{latest_total_variance:C}";
public string pay_variance => $"{latest_pay_variance:C}";
public string flex_variance => $"{latest_flex_variance:C}";
public string six_month_total_chart => "graph_sparkline_6_pay_period_-1281183930.png";
public string six_month_pay_chart => "graph_sparkline_6_pay_period_1140344931.png";
public string six_month_flex_chart => "graph_sparkline_6_pay_period_489356044.png";
public string total_color => latest_total_variance >= 0 ? "positive" : "negative";
public string pay_color => latest_pay_variance >= 0 ? "positive" : "negative";
public string flex_color => latest_flex_variance >= 0 ? "positive" : "negative";
public DeptInfo(string deptName, decimal total, decimal pay, decimal flex)
{
name = deptName;
latest_total_variance = total;
latest_pay_variance = pay;
latest_flex_variance = flex;
}
}
public static IRestResponse SendMessageByTemplateId(string jsonStr)
{
RestClient client = new RestClient();
client.BaseUrl = new Uri("https://api.mailgun.net/v3/notifications-dev.stratanetwork.com");
client.Authenticator =
new HttpBasicAuthenticator("api",
"key-12ea6389d906cef290ad8a0557a3a8c4");
RestRequest request = new RestRequest();
//request.AddParameter("domain", "notifications.stratanetwork.com", ParameterType.UrlSegment);
//request.Resource = "{domain}/messages";
request.Resource = "/messages";
request.AddParameter("from", "Mailgun Sandbox <postmaster@notifications.stratanetwork.com>");
//request.AddParameter("to", "Dhara <dpatel@stratadecision.com>");
//request.AddParameter("to", "Nicole <nmcguire@stratadecision.com>");
request.AddParameter("to", "Thom Lamb <tlamb@stratadecision.com>");
//request.AddParameter("to", "Kevin Lamb <klamb@stratadecision.com>");
//request.AddParameter("to", "Shruthi Agni <sagni@stratadecision.com>");
//request.AddParameter("to", "Tucker Debolt <tdebolt@stratadecision.com>");
request.AddParameter("subject", "Hello Thom Lamb");
//request.AddParameter("template", "daily_pr_snapshot");
request.AddParameter("template", "overall_pr_notification");
request.AddParameter("h:X-Mailgun-Variables", jsonStr);
request.Method = Method.POST;
return client.Execute(request);
}
+68
View File
@@ -0,0 +1,68 @@
<Query Kind="Statements">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>TimeZoneNames</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel.Composition</Namespace>
<Namespace>System.ComponentModel.Composition.Hosting</Namespace>
<Namespace>System.ComponentModel.Composition.Primitives</Namespace>
<Namespace>System.ComponentModel.Composition.ReflectionModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.Globalization</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Net.Http</Namespace>
<Namespace>System.Net.Http.Headers</Namespace>
<Namespace>System.Numerics</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>TimeZoneNames</Namespace>
</Query>
Enumerable.Range(1, 12).ToList()
.Select(mm => new { Key = mm, Value = CultureInfo.GetCultureInfo("hi-IN").DateTimeFormat.GetMonthName(mm) })
.ToDictionary(item => item.Key, item => item.Value)
.Dump();
+95
View File
@@ -0,0 +1,95 @@
<Query Kind="Statements">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
var dir = @"D:\Git\stratasphere.web.api.service";
var files = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
.Select(d => new
{
file = d,
dir = Path.GetDirectoryName(d),
oldFile = Path.GetFileName(d),
ext = Path.GetExtension(d)
})
//.Where(d => !d.dir.Contains(".git"))
.Select(d => new
{
d.file,
d.dir,
d.oldFile,
d.ext,
newFile = d.oldFile.Contains("StrataSphere") ? d.oldFile.Replace("StrataSphere", "StarterSet") : ""
})
.Where(d => !d.dir.Contains(".git") && !string.IsNullOrEmpty(d.newFile))
.Select(d => new
{
d.file,
d.dir,
d.oldFile,
d.ext,
d.newFile,
moveTo = string.IsNullOrEmpty(d.newFile) ? "" : Path.Combine(d.dir, d.newFile)
});
files.Dump();
files.ToList()
.ForEach(f =>
{
var moveTo = Path.Combine(f.dir, f.newFile);
try
{
$"Directory.Move({f.file}, {moveTo});".Dump();
Directory.Move(f.file, moveTo);
}
catch (Exception ex)
{ }
});
+79
View File
@@ -0,0 +1,79 @@
<Query Kind="Statements">
<Connection>
<ID>463c2997-8a6a-4688-9575-6549e5215f7b</ID>
<Persist>true</Persist>
<Server>D0011-SQL-01.sdt.local</Server>
<Database>jazz tst StrataSphere 20191104.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
var insert = (from rcrp in REDSCubeReportParameters
join sd in ScoreDimensions on rcrp.Name equals sd.FriendlyName
join sh in ScoreHierarchies on sd.DefaultHierarchyGUID equals sh.HierarchyGUID
select new {rcrp.Name, rcrp.DimensionID, rcrp.AttributeID, sd.DimensionGUID, HierarchyGUID = sd.DefaultHierarchyGUID, AttributeGUID = sd.DefaultLookupKeyGUID, sh.HierarchyID})
.Distinct()
.ToList()
.Aggregate(@"INSERT INTO stratasphere.Definition
( Id, Name, Description, DateCreated, DateLastModified, AttributeGuid, DimensionGuid, AttributeId, DimensionId, HierarchyGuid, HierarchyId )
SELECT Id, Name, Description, DateCreated, DateLastModified, AttributeGUID, DimensionGuid, AttributeID, DimensionId, HierarchyGuid, HierarchyId
FROM (
VALUES
", (x, y) => $@"{x}(NEWID(),'{y.Name}','{y.Name}',SYSDATETIME(),SYSDATETIME(),'{y.AttributeGUID}','{y.DimensionGUID}','{y.AttributeID}','{y.DimensionID}','{y.HierarchyGUID}','{y.HierarchyID}'),
");
insert += @") AS x (Id, Name, Description, DateCreated, DateLastModified, AttributeGUID, DimensionGuid, AttributeID, DimensionId, HierarchyGuid, HierarchyId)
WHERE NOT EXISTS (SELECT 1 FROM stratasphere.Definition d WHERE d.Name = x.Name
OR (d.DimensionId = x.DimensionId AND d.AttributeId = x.AttributeID)
OR (d.DimensionGUID = x.DimensionGUID AND d.AttributeGUID = x.AttributeGUID))";
insert.Dump();
+161
View File
@@ -0,0 +1,161 @@
<Query Kind="Program">
<Connection>
<ID>463c2997-8a6a-4688-9575-6549e5215f7b</ID>
<Persist>true</Persist>
<Server>D0011-SQL-01.sdt.local</Server>
<Database>jazz tst CNE 20191210.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
var configurationGuid = Guid.Parse("880C4912-5A58-40B7-ADB1-1F9BD365E6AF");
(from sd in StaffingToDemandPatientVolumes
where new[] {21398, 21915}.Contains(sd.DepartmentID)
select sd).ToList()
.OrderBy(g => g.DepartmentID)
.ThenBy(g => g.IsBaseline)
.ThenBy(g => g.DayOfWeek)
.ThenBy(g => g.Seasonality)
.ThenBy(g => g.Hour)
.Dump(nameof(StaffingToDemandPatientVolumes));
var CensusData =
from obj in Nursings
join f in DimFunctionalAreas on obj.DimDepartment.FunctionalAreaID equals f.FunctionalAreaID
join fj in NursingFlexJobCodeGroups on obj.NursingGUID equals fj.NursingGUID
join j in DimFlexJobCodeGroups on fj.FlexJobCodeGroupID equals j.FlexJobCodeGroupID
where obj.ConfigurationGUID == configurationGuid
select new
{
obj.DepartmentID,
obj.NumOfBeds,
obj.IsComplete,
obj.IsNewborn,
InPatientDays = new FlattenDays("InPatientDays", obj).Values,
ObservationDays = new FlattenDays("ObservationDays", obj).Values,
NewbornInPatientDays = new FlattenDays("NewbornInPatientDays", obj).Values,
NewbornObservationDays = new FlattenDays("NewbornObservationDays", obj).Values,
Seasonality = new FlattenSeasonality("Seasonality", obj).Values,
obj.DimDepartment.Name,
FunctionalAreaName = f.Name,
fj.WHPPDBaseline,
fj.MedianAnnualWageBaseline,
fj.DirectCarePercentageBaseline,
fj.UnproductivePercentBaseline,
fj.WHPPD,
fj.MedianAnnualWage,
fj.DirectCarePercentage,
fj.UnproductivePercent,
fj.PatientCare,
fj.AcutyAdjustment,
fj.RoundingRule,
fj.FlexJobCodeGroupID,
fj.StaffingModelType,
StaffingModelConfig = Newtonsoft.Json.JsonConvert.DeserializeObject<ModelValue>(fj.StaffingModelConfig),//.PatientRatios,
JobName = j.Name,
j.Code,
j.SortOrder
};
CensusData.Where(cd => new [] {"2310 - 11150 - DELIVERY","2110 - 11071 - RIVERVIEW 3"}.Contains(cd.Name) && cd.JobName == "RN").Dump();
}
// Define other methods and classes here
public class ModelValue
{
public IList<StaffingModel> ModelValues { get; set; }
internal Dictionary<int, Dictionary<int, double>> PatientRatios => ModelValues
.GroupBy(mv => mv.DayOfWeek, (dayOfWeek, d) => new
{
dayOfWeek,
HourlyRatios = d.Select(x => new { x.HourOfDay, x.PatientRatio })
.ToDictionary(key => key.HourOfDay, value => value.PatientRatio)
}).ToDictionary(key => key.dayOfWeek, value => value.HourlyRatios);
}
public class StaffingModel
{
public int DayOfWeek { get; set; }
public int HourOfDay { get; set; }
public double PatientRatio { get; set; }
}
public class FlattenDays
{
public IEnumerable<double> Values { get; set; }
public FlattenDays(string name, Nursing obj)
{
var regex = new Regex($"Month[\\d]{{2}}{name}", RegexOptions.IgnoreCase);
Type t = typeof(Nursing);
var fields = t.GetFields(BindingFlags.Public | BindingFlags.Instance)
.Where(f => regex.IsMatch(f.Name))
.OrderBy(f => f.Name);
Values = fields.Select(field => (double)field.GetValue(obj));
}
}
public class FlattenSeasonality
{
public IEnumerable<byte> Values { get; set; }
public FlattenSeasonality(string name, Nursing obj)
{
var regex = new Regex($"Month[\\d]{{2}}{name}", RegexOptions.IgnoreCase);
Type t = typeof(Nursing);
var fields = t.GetFields(BindingFlags.Public | BindingFlags.Instance)
.Where(f => regex.IsMatch(f.Name))
.OrderBy(f => f.Name);
Values = fields.Select(field => (byte)field.GetValue(obj));
}
}
+81
View File
@@ -0,0 +1,81 @@
<Query Kind="Expression">
<Connection>
<ID>40766b24-ff74-431b-b387-6c221ede77cf</ID>
<Persist>true</Persist>
<Server>p3121-sql-02.sdt.local</Server>
<Database>jazz prd UNC 20180206.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
(from fact in FactPayrollSampledPayPeriods
join payperiod in DimPayPeriods on fact.PayPeriodID equals payperiod.PayPeriodID
join paycode in DimPayCodeGroups on fact.PayCodeGroupID equals paycode.PayCodeGroupID
join prodclass in DimProductiveClasses on paycode.ProductiveClassID equals prodclass.ProductiveClassID
join department in DimDepartments on fact.DepartmentID equals department.DepartmentID
where prodclass.Name == "Productive"
&& payperiod.PeriodEndCalendarDate < DateTime.Now
select new { fact.DepartmentID, fact.PayPeriodID, payperiod.PeriodEndCalendarDate, payperiod.PeriodStartCalendarDate })
.GroupBy(r => r.DepartmentID, (key, grp) =>
new
{
DepartmentID = key,
data = grp.Select(g =>
new
{
g.PayPeriodID,
g.PeriodEndCalendarDate,
g.PeriodStartCalendarDate
}).Distinct().OrderByDescending(g => g.PeriodEndCalendarDate).Take(6)
})
+65
View File
@@ -0,0 +1,65 @@
<Query Kind="Statements">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>RestSharp</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>RestSharp</Namespace>
<Namespace>System.Dynamic</Namespace>
</Query>
var client = new RestClient();
client.BaseUrl = new Uri(@"http://pokeapi.co/api/v2/pokemon?limit=999");
RestRequest request = new RestRequest();
request.Method = Method.GET;
dynamic content = JsonConvert.DeserializeObject<ExpandoObject>(client.Execute(request).Content);
((object)content).Dump();
object name = MyExtensions.IsPropertyExist(content, "forms") ? content.forms[0].name : null;
if (name != null) name.Dump();
+57
View File
@@ -0,0 +1,57 @@
<Query Kind="Statements">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
var rand = new Random();
var color = $"#{(0x1000000 + (rand.Next()) * 0xffffff):X4}".Substring(0, 7);
color.Dump();
+143
View File
@@ -0,0 +1,143 @@
<Query Kind="Program">
<Connection>
<ID>463c2997-8a6a-4688-9575-6549e5215f7b</ID>
<Persist>true</Persist>
<Server>D0011-SQL-01.sdt.local</Server>
<Database>jazz tst Grady 20191107.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
var test = (from sd in ScoreDimensions
select new StarterSetAdHocScoreDimensionInfo
{
DimensionGUID = sd.DimensionGUID,
FriendlyName = sd.FriendlyName,
GlobalID = sd.GlobalID
}).ToList();
test.OrderByDescending(t => t.MDXMemberName).Dump();
}
// Define other methods and classes here
public class StarterSetAdHocScoreDimensionInfo
{
public Guid DimensionGUID { get; set; }
public string FriendlyName { get; set; }
public string GlobalID { get; set; }
public string AttributeId { get; set; }
public string MDXMemberID { get; set; }
public bool IsRollup { get; set; }
internal Regex ServiceLineRegex = new Regex(@"^Service Line (\d)$", RegexOptions.IgnoreCase);
public bool ServiceLineRegexIsMatch => ServiceLineRegex.IsMatch(FriendlyName);
public string MDXMemberName
{
get
{
try
{
return AnalysisServicesUtils.GetHierarchyMDXName("Patient Encounter",
ServiceLineRegex.IsMatch(FriendlyName) && IsRollup
? $"{ServiceLineRegex.Replace(FriendlyName, "Service Line Rollup ${1}")}"
: $"{FriendlyName}{(IsRollup ? " Rollup" : "")}");
}
catch (Exception)
{
return string.Empty;
}
}
}
internal string Name => $"Patient Encounter - {FriendlyName}{(IsRollup ? " Rollup" : "")}";
internal StarterSetAdHocScoreDimensionInfo()
{
MDXMemberID = string.Empty;
IsRollup = false;
}
}
public class AnalysisServicesUtils
{
public static string GetHierarchyMDXName(string aDimensionName, string aHierarchyName)
{
var s = "[{0}].[{1}]";
return String.Format(s, GetASFriendlyName(aDimensionName), GetASFriendlyName(aHierarchyName));
}
public static string GetASFriendlyName(string aStr, bool aTrim = true)
{
//Invalid characters --> . , ; ' ` : / \ * | ? " & % $ ! + = ( ) [ ] { }
//Take out white space
var returnStr = System.Text.RegularExpressions.Regex.Replace(aStr, @"[\.,;'`:/\\\*\|\?""&%\$!\+=\(\)\[\]{}]", "");
if (aTrim) returnStr = returnStr.Trim();
//Replace reserved name
if (returnStr.Equals("Name", StringComparison.OrdinalIgnoreCase)) returnStr = "Name_";
if (returnStr.Equals("Measures", StringComparison.OrdinalIgnoreCase)) returnStr = "Measures_";
if (returnStr.Equals("ID", StringComparison.OrdinalIgnoreCase)) returnStr = "ID_";
if (returnStr.Equals("Key", StringComparison.OrdinalIgnoreCase)) returnStr = "Key_";
return returnStr;
}
}
+194
View File
@@ -0,0 +1,194 @@
<Query Kind="Program">
<Connection>
<ID>6a7da5d6-5345-4fd8-9ca6-ab567ac5f639</ID>
<Persist>true</Persist>
<Server>D0014-SQL-01.sdt.local</Server>
<Database>jazz tst UNC 20190716.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
var Departments = (from dept in DeptPayPeriodSummaries
select new DeptPayPeriodSummary(dept))
.ToList()
.GroupBy(d => d.DepartmentID, (key, dx) => new { key, data = dx.OrderBy(d => d.PeriodEndDate).ToList() })
.Where(d => d.data.Sum(x => x.TotalVariance) != 0.0d)
.Select(grp => new DeptInfo(grp.data));
Departments.Dump("Raw List");
var top5 = Departments
.OrderBy(d => d.latest_total_variance)
.ThenBy(d => d.latest_pay_variance)
.ThenBy(d => d.latest_flex_variance)
.Take(5).ToList();
var bottom5 = Departments
.OrderByDescending(d => d.latest_total_variance)
.ThenByDescending(d => d.latest_pay_variance)
.ThenByDescending(d => d.latest_flex_variance)
.Take(5).ToList();
bottom5.Dump("Bottom5");
top5.Dump("top5");
var departments = (top5.Union(bottom5).Distinct())
.OrderBy(d => d.latest_total_variance).ToList();
departments.Dump("departments");
}
// Define other methods and classes here
public partial class DeptPayPeriodSummary
{
public int DepartmentID { get; set; }
public int PayPeriodID { get; set; }
public string Department { get; set; }
public DateTime PeriodStartDate { get; set; }
public DateTime PeriodEndDate { get; set; }
public double ActualHours { get; set; }
public double ActualDollars { get; set; }
public double ActualUOS { get; set; }
public double TargetHours { get; set; }
public double TargetDollars { get; set; }
public double TargetUOS { get; set; }
public double VarianceHours { get; set; }
public double VarianceDollars { get; set; }
public double VarianceUOS { get; set; }
public double ActualPayRate => MathExtensions.DivideBy((double)ActualDollars, ActualHours);
public double TargetPayRate => MathExtensions.DivideBy((double)TargetDollars, TargetHours);
public double VariancePayRate => TargetPayRate - ActualPayRate;
public double PayRateVariance => VariancePayRate * ActualHours;
public double FlexVariance => VarianceHours * TargetPayRate;
public double TotalVariance => PayRateVariance + FlexVariance;
public double VariancePayDollars => (ActualPayRate - TargetPayRate) * ActualHours;
public double VarianceFlexDollars => TargetPayRate * VarianceHours;
public DeptPayPeriodSummary(LINQPad.User.DeptPayPeriodSummary dept)
{
DepartmentID = dept.DepartmentID;
PayPeriodID = dept.PayPeriodID;
Department = dept.Department;
PeriodStartDate = dept.PeriodStartDate;
PeriodEndDate = dept.PeriodEndDate;
ActualHours = dept.ActualHours;
ActualDollars = dept.ActualDollars;
ActualUOS = dept.ActualUOS;
TargetHours = dept.TargetHours;
TargetDollars = dept.TargetDollars;
TargetUOS = dept.TargetUOS;
VarianceHours = dept.VarianceHours;
VarianceDollars = dept.VarianceDollars;
VarianceUOS = dept.VarianceUOS;
}
}
public class DeptInfo
{
public string hyperlink => "";
internal int deptid { get; set; }
public string name { get; set; }
internal double latest_total_variance { get; set; }
internal double latest_pay_variance { get; set; }
internal double latest_flex_variance { get; set; }
public string total_variance => $"{latest_total_variance:C}";
public string pay_variance => $"{latest_pay_variance:C}";
public string flex_variance => $"{latest_flex_variance:C}";
public string six_period_total_chart { get; set; }
public string six_period_pay_chart { get; set; }
public string six_period_flex_chart { get; set; }
public IEnumerable<int> totalGraph { get; set; }
public IEnumerable<int> payGraph { get; set; }
public IEnumerable<int> flexGraph { get; set; }
public int graphMin { get; set; }
public int graphMax { get; set; }
public string total_color => latest_total_variance >= 0 ? "positive" : "negative";
public string pay_color => latest_pay_variance >= 0 ? "positive" : "negative";
public string flex_color => latest_flex_variance >= 0 ? "positive" : "negative";
public DeptInfo(List<DeptPayPeriodSummary> department)
{
deptid = department.First().DepartmentID;
name = department.First().Department;
latest_total_variance = department.Sum(d => d.TotalVariance);
latest_pay_variance = department.Sum(d => d.PayRateVariance);
latest_flex_variance = department.Sum(d => d.FlexVariance);
totalGraph = department.Select(d => Convert.ToInt32(d.TotalVariance));
payGraph = department.Select(d => Convert.ToInt32(d.PayRateVariance));
flexGraph = department.Select(d => Convert.ToInt32(d.FlexVariance));
graphMin = Math.Min(Math.Min(totalGraph.Min(), payGraph.Min()), flexGraph.Min());
graphMax = Math.Max(Math.Max(totalGraph.Max(), payGraph.Max()), flexGraph.Max());
}
public DeptInfo(int departmentId, string deptName, double total, double pay, double flex)
{
deptid = departmentId;
name = deptName;
latest_total_variance = total;
latest_pay_variance = pay;
latest_flex_variance = flex;
}
internal string GetLinkUrlPath() => $"/PR/DepartmentProductivity.aspx?deptid={deptid}&mode=payperiod";
public bool Equals(DeptInfo x, DeptInfo y)
{
if (object.ReferenceEquals(x, y)) return true;
if (object.ReferenceEquals(x, null) || object.ReferenceEquals(y, null)) return false;
return (x.deptid == y.deptid);
}
public int GetHashCode(DeptInfo obj)
{
return obj.GetHashCode();
}
}
+305
View File
@@ -0,0 +1,305 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.Data.Entity.Design.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.Data.Entity.dll</Reference>
<NuGetReference>LINQtoCSV</NuGetReference>
<Namespace>LINQtoCSV</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.Dynamic</Namespace>
<Namespace>System.Globalization</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Data.Entity.Design.PluralizationServices</Namespace>
</Query>
private PluralizationService ps => PluralizationService.CreateService(new CultureInfo("en-US"));
void Main()
{
var testExpando = new List<object>();
var meds = new List<Inventory>();
var inputFileDescription = new CsvFileDescription
{
SeparatorChar = '\t', // tab delimited
FirstLineHasColumnNames = false, // no column names in first record
FileCultureName = "en-US" // use formats used in The Netherlands
};
var cc = new CsvContext();
var path = @"C:\Users\tlamb\Downloads\";
var files = new[] {
@"Outreach - Monthly Inventory Records - Inventory - March.tsv",
@"Outreach - Monthly Inventory Records - Inventory - April.tsv",
@"Outreach - Monthly Inventory Records - Inventory - May.tsv",
@"Outreach - Monthly Inventory Records - Inventory - June.tsv"
}.ToList();
var nextmonth = new DateTime(2019, 2, 1);
files.ForEach(inventory =>
{
nextmonth = nextmonth.AddMonths(1);
var monthData = cc.Read<MyDataRow>(Path.Combine(path, inventory), inputFileDescription);
var data = ConvertToDataRow(ConvertMyDataRow(monthData, nextmonth).ToList()).ToList();
meds.AddRange(data);
});
var medBrands = meds
.Select(m => new PropDef(m))
.Distinct(new NameBrandComparer())
.OrderBy(m => m.name).ThenBy(m => m.type)
.Select((m, i) => new
{
Id = i + 1,
Medication = m.name,
Brand = m.type,
Minimum = Math.Max(m.inventory.StartQty, 10),
m.inventory.Dosage,
Unit = m.inventory.container, //ps.Singularize(m.inventory.container.Trim("() ".ToCharArray())),
Package = Regex.Replace(m.inventory.PerBox, @"[^\d]*", ""),
Per = m.inventory.Per, //ps.Singularize(m.inventory.Unit.Trim("() ".ToCharArray())),
Purchased = m.inventory.Purchased
})
.ToList();
medBrands.Dump();
foreach (var m in meds)
{
var mbx = medBrands.FirstOrDefault(mb => m.Medicine.Trim() == mb.Medication && m.MedicineBrand.Trim() == mb.Brand);
if (mbx != null)
{
m.MedicineID = mbx.Id;
}
else
{
m.Dump();
}
};
meds.GroupBy(m => m.MedicineID)
.Select(grp => grp.Last())
.OrderBy(m => m.MedicineID)
.ThenBy(m => m.Expiry)
.ThenBy(m => m.InvDate)
.Dump();
}
// Define other methods and classes here
internal IEnumerable<object> ConvertMyDataRow(IEnumerable<MyDataRow> data, DateTime month)
{
var groupData = data.SelectMany(dr => dr.ToList())
.GroupBy(t => t.LineNbr)
.Select(t => new { Key = t.Key - 2, Values = t.ToList().Select(v => v.Value).ToArray() });
//groupData.Dump("groupData");
var properties = groupData.Where(d => d.Key < 0)
.SelectMany(d => d.Values.Select(v => Regex.Replace(v, @"[\s()]", "")
//.Replace("LastMonthsFinalQuantity", "Start_Quantity")
.Replace("StartingQuantityBeginningofMonth", "StartQuantity")
.Replace("StartingQuantityBeginningofCurrentMonth", "StartQuantity")
.Replace("FinalQuantityEndofMonth", "FinalQuantity")
.Replace("FinalQuantityEndofCurrentMonth", "FinalQuantity")
.Replace("MedicationTotalStartQuantity", "MedicationTotal")).ToList()).ToArray();
//properties.Dump("properties");
var medication = string.Empty;
var expandoData = groupData.Where(d => d.Key >= 0)
.Select((t, j) =>
{
dynamic expando = new ExpandoObject();
AddProperty(expando, "MedicineID", j);
AddProperty(expando, "InvDate", month);
int i = 0;
t.Values.ToList().ForEach(d =>
{
var property = properties[i]
.Replace("Medication", "Medicine");
if (property == "Medicine")
{
if (string.IsNullOrEmpty(d))
{
d = medication;
}
medication = d;
}
AddProperty(expando, property, d ?? string.Empty);
i++;
});
return expando;
});
return expandoData;
}
internal IEnumerable<Inventory> ConvertToDataRow(List<object> data)
{
var newData =
data.Select(d => (d as IDictionary<string, object>))
.Select(d =>
{
var dr = new Inventory();
d.Keys.ToList().ForEach(k =>
{
var value = d[k];
var name = Regex.Replace(k, "[^A-Za-z]", "");
PropertyInfo prop = dr.GetType().GetProperty(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (null != prop && prop.CanWrite)
{
prop.SetValue(dr, value, null);
}
});
return dr;
});
return newData;
}
// Define other methods and classes here
internal class MyDataRow : List<DataRowItem>, IDataRow
{
}
public static void AddProperty(ExpandoObject expando, string propertyName, object propertyValue)
{
// ExpandoObject supports IDictionary so we can extend it like this
var expandoDict = expando as IDictionary<string, object>;
if (expandoDict.ContainsKey(propertyName))
expandoDict[propertyName] = propertyValue;
else
expandoDict.Add(propertyName, propertyValue);
}
public class Inventory
{
internal Regex regex = new Regex(@"\(?(Tube|Bottle|Tablet|Capsule|Lancet|Vial|Kit)[ s]?\)?", RegexOptions.IgnoreCase);
internal string PerBox { get; set; }
internal string container => ps.Singularize(regex.Match(PerBox).Value.Trim("() ".ToCharArray()));
internal string StartQuantity { get; set; }
internal string Received { get; set; }
internal string Output { get; set; }
internal string FinalQuantity { get; set; }
internal string Notes { get; set; }
internal string ExpirationDate { get; set; }
internal string LastMonthsFinalQuantity { get; set; }
internal PluralizationService ps => PluralizationService.CreateService(new CultureInfo("en-US"));
public int MedicineID { get; set; }
public DateTime InvDate { get; set; }
public string Medicine { get; set; }
public string MedicineBrand { get; set; }
public string Dosage { get; set; }
public string Unit { get; set; }
public string Pkg => container != string.Empty ? PerBox.Replace(container, "").TrimEnd() : PerBox;
public string Per => ps.Singularize((string.IsNullOrEmpty(container) ? regex.Match(Unit).Value : container).Trim());
public int StartQty => ParseStartQuantity(StartQuantity, LastMonthsFinalQuantity);
public int FinalQty => ParseFinalQuantity(FinalQuantity);
public DateTime Purchased => !Notes.StartsWith("Purchased") ? new DateTime(2018,1,1).Date
: DateTime.Parse(Regex.Replace(Notes, @"[^\d/]*", ""));
public DateTime Expiry => ParseExpiry();
public string Note => !Notes.StartsWith("Purchased") ? Notes : string.Empty;
// public string Medication { get; set; }
internal string BrandTotal { get; set; }
internal string MedicationTotal { get; set; }
public Inventory()
{
Medicine = string.Empty;
Dosage = string.Empty;
PerBox = string.Empty;
StartQuantity = string.Empty;
Received = string.Empty;
Output = string.Empty;
FinalQuantity = string.Empty;
ExpirationDate = string.Empty;
Notes = string.Empty;
//Medication = string.Empty;
MedicineBrand = string.Empty;
BrandTotal = string.Empty;
MedicationTotal = string.Empty;
Unit = string.Empty;
LastMonthsFinalQuantity = string.Empty;
}
internal DateTime ParseExpiry()
{
if (string.IsNullOrEmpty(ExpirationDate)) return DateTime.MaxValue.Date;
DateTime dt;
if (!DateTime.TryParseExact(ExpirationDate, @"M/yy", null, DateTimeStyles.None, out dt)) return DateTime.MaxValue.Date;
return dt;
}
internal Int32 ParseFinalQuantity(string FinalQuantity)
{
var result = 0;
var regex = new Regex(@"[^\d]+", RegexOptions.IgnoreCase);
try
{
result = Convert.ToInt32("0" + (string.IsNullOrEmpty(FinalQuantity) || string.IsNullOrEmpty(regex.Replace(FinalQuantity, ""))
? "" : regex.Replace(FinalQuantity, "")));
}
catch (Exception ex)
{
ex.Message.Dump();
}
return result;
}
internal Int32 ParseStartQuantity(string StartQuantity, string LastMonthsFinalQuantity)
{
var result = 0;
var regex = new Regex(@"[^\d]+", RegexOptions.IgnoreCase);
try
{
result = Convert.ToInt32("0" + (!string.IsNullOrEmpty(regex.Replace(StartQuantity, ""))
? regex.Replace(StartQuantity, "")
: !string.IsNullOrEmpty(regex.Replace(LastMonthsFinalQuantity, ""))
? regex.Replace(LastMonthsFinalQuantity, "") : ""));
}
catch (Exception ex)
{
ex.Message.Dump();
}
return result;
}
}
public class PropDef
{
public string name { get; set; }
public string type { get; set; }
public Inventory inventory { get; set; }
public PropDef(string a, System.Type b)
{
name = a;
type = b.Name;
}
public PropDef(Inventory inv)
{
name = inv.Medicine == string.Empty ? inv.MedicineBrand.Trim() : inv.Medicine.Trim();
type = inv.Medicine == string.Empty ? string.Empty : inv.MedicineBrand.Trim();
inventory = inv;
}
}
public class NameBrandComparer : IEqualityComparer<PropDef>
{
public bool Equals(PropDef med1, PropDef med2)
{
if (med1 == null && med2 == null) return true;
else if (med1 == null || med2 == null) return false;
else if (med1.inventory != null && med2.inventory != null)
{
if (med1.name == med2.name && med1.type == med2.type && med1.inventory.Purchased == med2.inventory.Purchased) return true;
else return false;
}
else if (med1.name == med2.name && med1.type == med2.type) return true;
else
return false;
}
public int GetHashCode(PropDef med)
{
return $"{med.name}{med.type}".GetHashCode();
}
}
@@ -0,0 +1,237 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>AutoMapper</NuGetReference>
<Namespace>AutoMapper</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>AutoMapper.Configuration.Annotations</Namespace>
<Namespace>static UserQuery</Namespace>
</Query>
private IDResolver idResolver = new IDResolver();
protected MapperConfiguration config { get; } = new MapperConfiguration(cfg =>
{
cfg.AddMaps(Assembly.GetExecutingAssembly());
cfg.Advanced.AllowAdditiveTypeMapCreation = true;
cfg.ValidateInlineMaps = false;
});
void Main()
{
NameBrandExpiryComparer nameBrandExpiryEqC = new NameBrandExpiryComparer();
NameBrandComparer nameBrandEqC = new NameBrandComparer();
Mapper.Reset();
IMapper mapper = new Mapper(config);
mapper.ConfigurationProvider.CompileMappings();
mapper.ConfigurationProvider.AssertConfigurationIsValid();
var path = @"C:\Users\Tlamb\Downloads";
var json = "medications.json";
var data = LoadFile(Path.Combine(path, json));
var meds = mapper.Map<List<Medication>>(data.records);
var medBrandList = meds.Distinct(nameBrandEqC)
.OrderBy(m => m.Name).ThenBy(m => m.Brand)
.Select((m, i) => mapper.Map<MedBrand>(m, opt => opt.Items["id"] = i))
.ToList();
medBrandList.Dump("MedBrands");
var withLabels = medBrandList.Select(m => mapper.Map<MedBrandLabel>(m, opt => opt.Items["id"] = m.MedicineID)); //new MedBrandLabel(m));
withLabels.Dump("MedBrands with Labels");
var medList = meds.Distinct(nameBrandExpiryEqC)
.Join(medBrandList
, exp => new { exp.Name, exp.Brand }
, key => new { key.Name, key.Brand },
(exp, key) => new MedInventory
{
MedicineID = key.MedicineID,
Start = exp.Start,
Expiry = exp.Expiry,
})
.OrderBy(m => m.MedicineID).ThenBy(m => m.Expiry)
.ToList();
medList.Dump("Med List");
var medInv = medList.Select(ml => mapper.Map<MedInvLabel>(ml, opt => opt.Items["medBrands"] = withLabels.ToDictionary(key => key.MedicineID, label => label.Label)));
medInv.Dump("Med Inventory");
meds.OrderBy(m => m.Name).ThenBy(m => m.Brand).ThenBy(m => m.Expiry).Dump();
}
public RootObject LoadFile(string fileName)
{
var jsonFile = File.ReadAllText(fileName);
return JsonConvert.DeserializeObject<RootObject>(jsonFile);
}
// Define other methods and classes here
public class NameBrandExpiryComparer : IEqualityComparer<Medication>
{
public bool Equals(Medication med1, Medication med2)
{
if (med1 == null && med2 == null) return true;
else if (med1 == null || med2 == null) return false;
else if (med1.Name == med2.Name && med1.Brand == med2.Brand && med1.Expiry == med2.Expiry) return true;
else
return false;
}
public int GetHashCode(Medication med)
{
return $"{med.Name}{med.Brand}{med.Expiry:MMddyyyy}".GetHashCode();
}
}
public class NameBrandComparer : IEqualityComparer<Medication>
{
public bool Equals(Medication med1, Medication med2)
{
if (med1 == null && med2 == null) return true;
else if (med1 == null || med2 == null) return false;
else if (med1.Name == med2.Name && med1.Brand == med2.Brand) return true;
else
return false;
}
public int GetHashCode(Medication med)
{
return $"{med.Name}{med.Brand}".GetHashCode();
}
}
[AutoMap(typeof(Record))]
public class Medication
{
[SourceMember(nameof(Record.field_48_raw))]
public int MedicineID { get; set; }
[SourceMember(nameof(Record.field_49_raw))]
public string Name { get; set; }
[SourceMember(nameof(Record.field_50_raw))]
public string Brand { get; set; }
[SourceMember(nameof(Record.field_51_raw))]
public int Start { get; set; }
[SourceMember(nameof(Record.field_55_raw))]
public int Minimum { get; set; }
[SourceMember(nameof(Record.field_57_raw))]
public Field57Raw field57 { get; set; }
public DateTime Expiry => field57?.iso_timestamp ?? DateTime.MaxValue;
[Ignore]
public bool NeedsReorder => (Start < Minimum) || (Expiry <= DateTime.Now);
}
[AutoMap(typeof(Medication))]
public class MedBrand
{
[ValueResolver(typeof(IDResolver))]
public int MedicineID { get; set; }
public string Name { get; set; }
public string Brand { get; set; }
public int Minimum { get; set; }
[Ignore]
public string Dosage { get; set; }
[Ignore]
public int Package { get; set; }
[Ignore]
public string Per { get; set; }
[Ignore]
public string Unit { get; set; }
public MedBrand()
{
Minimum = 10;
Dosage = "50mg";
Unit = "Tablet";
Package = 250;
Per = "Bottle";
}
}
[AutoMap(typeof(MedBrand))]
public class MedBrandLabel : MedBrand
{
[Ignore]
public string Label => $"{Name} {Brand} {Dosage} {Package} {Per} / {Unit}";
}
public class MedInventory
{
public int MedicineID { get; set; }
public int Start { get; set; }
public DateTime Expiry { get; set; }
public bool NeedsReorder => Expiry <= DateTime.Now;
}
[AutoMap(typeof(MedInventory))]
public class MedInvLabel : MedInventory
{
[ValueResolver(typeof(BrandResolver))]
public string MedicationBrand { get; set; }
[Ignore]
public string Label => $"{MedicationBrand} {Expiry:MM/dd/yyyy}";
}
public class Field57Raw
{
public string date { get; set; }
public string date_formatted { get; set; }
public string hours { get; set; }
public string minutes { get; set; }
public string am_pm { get; set; }
public object unix_timestamp { get; set; }
public DateTime iso_timestamp { get; set; }
public string timestamp { get; set; }
public int time { get; set; }
}
public class Record
{
public string id { get; set; }
public int field_48_raw { get; set; }
public string field_49_raw { get; set; }
public string field_50_raw { get; set; }
public int field_51_raw { get; set; }
public int field_52_raw { get; set; }
public int field_53_raw { get; set; }
public int field_54_raw { get; set; }
public int field_55_raw { get; set; }
public bool field_56_raw { get; set; }
public Field57Raw field_57_raw { get; set; }
public string field_58_raw { get; set; }
public string field_63_raw { get; set; }
}
public class RootObject
{
public List<Record> records { get; set; }
}
public class IDResolver : IValueResolver<object, object, int>
{
public int Resolve(object source, object destination, int id, ResolutionContext context)
{
id = (int)context.Items["id"];
return id;
}
}
public class BrandResolver : IValueResolver<MedInventory, object, string>
{
public string Resolve(MedInventory source, object destination, string label, ResolutionContext context)
{
label = ((Dictionary<int, string>)context.Items["medBrands"])[source.MedicineID];
return label;
}
}
@@ -0,0 +1,275 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.Data.Entity.Design.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>LINQtoCSV</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>LINQPad.Extensibility.DataContext.DbSchema</Namespace>
<Namespace>LINQtoCSV</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.Globalization</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>System.Data.Entity.Design.PluralizationServices</Namespace>
</Query>
private static PluralizationService ps => PluralizationService.CreateService(new CultureInfo("en-US"));
void Main()
{
var path = @"C:\Users\tlamb\downloads";
var newPath = @"C:\Users\tlamb\downloads\Solehope 190705";
var file = "medical inventory July 5 2019.2.csv";
var filepath = Path.Combine(path, file);
CsvFileDescription inputFileDescription = new CsvFileDescription
{
SeparatorChar = ',',
FirstLineHasColumnNames = true,
IgnoreUnknownColumns = true
};
CsvFileDescription outputFileDescription = new CsvFileDescription
{
SeparatorChar = ',',
FirstLineHasColumnNames = true
};
CsvContext cc = new CsvContext();
IEnumerable<MedicationOut> medications;
IEnumerable<Inventory> inventory;
IEnumerable<Intake> intake;
var meds = cc.Read<Med>(filepath, inputFileDescription).ToList();
meds.Dump(file);
medications = meds.ConvertAll(med => (MedicationOut)med);
inventory = meds.ConvertAll(med => (Inventory)med);
inventory = inventory.OrderBy(i => i.Medication)
.Select((i, idx) => { i.InventoryId = idx.ToString(); return i; });
intake = meds.ConvertAll(med => (Intake)med);
intake = intake
.Join(inventory, x => x.MedicationId, inv => inv.MedicationId, (x, inv) => new { intake = x, inv }).ToList()
.ConvertAll(u => { u.intake.InventoryId = u.inv.InventoryId; return u.intake; });
var updates = cc.Read<Intake>(Path.Combine(@"C:\Users\tlamb\downloads\Solehope 190819", "intake2.csv"), inputFileDescription).ToList()
.Join(inventory, x => x.InventoryId, inv => inv.InventoryId, (x, inv) => new { intake = x, inv }).ToList()
.ConvertAll(u => { u.intake.MedicationId = u.inv.MedicationId; return u.intake; });
newPath.Dump("New Path");
medications.Dump("Medications");
inventory.Dump("Inventory");
intake.Dump("Intake - from Medications");
updates.Dump("Updates");
file = "medication.csv";
filepath = Path.Combine(newPath, file);
cc.Write(medications, filepath, outputFileDescription);
file = "inventory.csv";
filepath = Path.Combine(newPath, file);
cc.Write(inventory, filepath, outputFileDescription);
file = "intake.csv";
filepath = Path.Combine(newPath, file);
cc.Write(intake, filepath, outputFileDescription);
file = "updates.csv";
filepath = Path.Combine(newPath, file);
cc.Write(updates, filepath, outputFileDescription);
}
// Define other methods and classes here
public class Med
{
public string Id { get; set; }
public string Type { get; set; }
[CsvColumn(Name = "Medication")]
public string MedicationStr { get; set; }
internal string Medications => box.Match(MedicationStr.Trim()).Success ? box.Replace(MedicationStr.Trim(), "$1").Trim() : MedicationStr.Trim();
public string Strength { get; set; }
[CsvColumn(Name = "Quantity")]
public string Start { get; set; }
internal int StartCnt => Convert.ToInt32(regex.Replace(string.IsNullOrEmpty(Start) ? "0" : Start, ""));
[CsvColumn(Name = "Minimum")]
public string MinimumStr { get; set; }
internal int MinimumCnt => Convert.ToInt32(regex.Replace(string.IsNullOrEmpty(MinimumStr) ? "0" : MinimumStr, ""));
public string Unit { get; set; }
public string Package { get; set; }
[CsvColumn(Name = "Number")]
public string NumberStr { get; set; }
internal int NumberCnt => box.Match(MedicationStr.Trim()).Success ? Convert.ToInt32(box.Replace(MedicationStr.Trim(), "$2"))
: Convert.ToInt32(regex.Replace(string.IsNullOrEmpty(NumberStr) ? "0" : NumberStr, ""));
[CsvColumn(Name = "Expiration Date")]
public string Expiry { get; set; }
internal DateTime ExpiryDate => GetDateFromString(Expiry);
internal string Form => string.IsNullOrEmpty(Package) ? ""
: Package.Trim() == "Tube/Cream" ? "Cream" : ps.Singularize(Package.Trim());
internal string UnitOut => !string.IsNullOrEmpty(UnitNoBox)
? ps.Singularize(UnitNoBox)
: string.IsNullOrEmpty(Package)
? string.Empty
: Package.Trim() == "Tube/Cream"
? "Tube"
: string.Empty;
public string Label => $"{Medications} {Strength} {Form} {NumberCnt} / {UnitOut}";
internal string UnitNoBox => box.Match(MedicationStr.Trim()).Success ? "Box" : Unit?.Trim() ?? "";
internal Regex regex = new Regex(@"[^\d]");
internal Regex date = new Regex(@"([\d]{1,2})/([\d]{1,2})/([\d]{1,4})");
internal Regex shortDate = new Regex(@"([\d]{1,2})/([\d]{1,2})");
internal Regex box = new Regex(@"^(\D*)([\d]*)/Box$");
internal DateTime GetDateFromString(string theDate)
{
DateTime result = DateTime.MaxValue;
DateTime work;
if (string.IsNullOrEmpty(theDate) || theDate == "0/0")
work = result;
else if (date.IsMatch(theDate))
work = Convert.ToDateTime(theDate);
else if (shortDate.IsMatch(theDate))
work = Convert.ToDateTime(shortDate.Replace(theDate, "$1/5/$2"));
else
work = result;
work = new DateTime(work.Year, work.Month, DateTime.DaysInMonth(work.Year, work.Month));
return work;
}
}
public class MedicationOut
{
public string Id { get; set; }
public string Type { get; set; }
public string Medication { get; set; }
public int Minimum { get; set; }
public string Strength { get; set; }
public string Form { get; set; }
public int Number { get; set; }
public string Unit { get; set; }
public string Label { get; internal set; }
public static explicit operator MedicationOut(Med med)
{
return new MedicationOut
{
Id = med.Id,
Type = med.Type,
Medication = med.Medications,
Minimum = med.MinimumCnt,
Strength = med.Strength ?? "",
Form = med.Form,
Number = med.NumberCnt,
Unit = !string.IsNullOrEmpty(med.UnitNoBox)
? ps.Singularize(med.UnitNoBox)
: string.IsNullOrEmpty(med.Package)
? string.Empty
: med.Package.Trim() == "Tube/Cream"
? "Tube"
: string.Empty,
Label = med.Label
};
}
}
public class Inventory
{
public string MedicationId { get; set; }
public string InventoryId { get; set; }
public string Medication { get; set; }
public int Start => 0;
public string Label { get; internal set; }
public string Note { get; set; }
public static explicit operator Inventory(Med med)
{
return new Inventory
{
MedicationId = med.Id,
Medication = med.Medications,
Label = med.Label,
Note = string.Empty
};
}
}
public class Intake
{
public string MedicationId { get; set; }
public string InventoryId { get; set; }
public string Medication { get; set; }
public int Received { get; set; }
public DateTime Date { get; set; }
public DateTime Expiry { get; set; }
internal string MedLabel { get; set; }
public string Label => $"({Received}) {MedLabel}";
public static explicit operator Intake(Med med)
{
return new Intake
{
MedicationId = med.Id,
Medication = med.Medications,
Received = med.StartCnt,
Date = new DateTime(2019, 7, 5),
Expiry = med.ExpiryDate,
MedLabel = med.Label
};
}
}
+536
View File
@@ -0,0 +1,536 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<Reference>&lt;RuntimeDirectory&gt;\System.Data.Entity.Design.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>LINQtoCSV</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>LINQtoCSV</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel.Composition</Namespace>
<Namespace>System.ComponentModel.Composition.Hosting</Namespace>
<Namespace>System.ComponentModel.Composition.Primitives</Namespace>
<Namespace>System.ComponentModel.Composition.ReflectionModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.Dynamic</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Net.Http</Namespace>
<Namespace>System.Net.Http.Headers</Namespace>
<Namespace>System.Numerics</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>System.Data.Entity.Design.PluralizationServices</Namespace>
<Namespace>System.Globalization</Namespace>
</Query>
void Main()
{
IEnumerable<object> testExpando;
var inputFileDescription = new CsvFileDescription
{
SeparatorChar = '\t', // tab delimited
FirstLineHasColumnNames = false, // no column names in first record
FileCultureName = "en-US" // use formats used in The Netherlands
};
var outputFileDescription = new CsvFileDescription
{
SeparatorChar = ',', // tab delimited
FirstLineHasColumnNames = true, // no column names in first record
EnforceCsvColumnAttribute = true,
FileCultureName = "en-US" // use formats used in The Netherlands
};
var cc = new CsvContext();
var path = @"C:\Users\tlamb\Downloads\";
var files = new[] {
@"Outreach - Monthly Inventory Records - Inventory March.tsv",
@"Outreach - Monthly Inventory Records - Inventory - April.tsv",
@"Outreach - Monthly Inventory Records - Inventory - May.tsv",
@"Outreach - Monthly Inventory Records - Inventory - June.tsv"
}.ToList();
var nextmonth = new DateTime(2019, 2, 1);
var productList = new List<Product>();
var purchaseSummary = new List<Purchase>();
var orderSummary = new List<Order>();
files.ForEach(inventory =>
{
nextmonth = nextmonth.AddMonths(1);
var monthData = cc.Read<MyDataRow>(Path.Combine(path, inventory), inputFileDescription);
testExpando = ConvertMyDataRow(monthData);
var products = testExpando.Select(o => new Product(o as ExpandoObject, nextmonth)).ToList();
var purchases = testExpando.Select(o => new Purchase(o as ExpandoObject, nextmonth)).Where(p => p.Rcvd != 0).ToList();
var orders = testExpando.Select(o => new Order(o as ExpandoObject, nextmonth)).Where(o => o.Out != 0).ToList();
productList.AddRange(products);
purchaseSummary.AddRange(purchases);
orderSummary.AddRange(orders);
});
var medicationBrandList = productList.GroupBy(l => new { l.Medicine, l.Brand }).Select(grp => grp.First()).ToList()
.Select(mb => new MedicationBrand { Medicine = mb.Medicine, Brand = mb.Brand, Reorder = mb.MinimumRequired });
productList.GroupBy(p => p.Medicine).OrderBy(p => p.Key).Dump("Products");
purchaseSummary.Dump("Purchases");
orderSummary.Dump("Orders");
medicationBrandList.Dump("Medications");
var docsFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "SoleHope");
if (!Directory.Exists(docsFolder))
Directory.CreateDirectory(docsFolder);
cc.Write(medicationBrandList, Path.Combine(docsFolder, "MedicationBrand.csv"), outputFileDescription);
cc.Write(productList, Path.Combine(docsFolder, "Medications.csv"), outputFileDescription);
cc.Write(purchaseSummary, Path.Combine(docsFolder, "Intake.csv"), outputFileDescription);
cc.Write(orderSummary, Path.Combine(docsFolder, "Outtake.csv"), outputFileDescription);
}
internal IEnumerable<object> ConvertMyDataRow(IEnumerable<MyDataRow> data)
{
var groupData = data.SelectMany(dr => dr.ToList())
.GroupBy(t => t.LineNbr)
.Select(t => new { Key = t.Key - 2, Values = t.ToList().Select(v => v.Value).ToArray() });
var properties = groupData.Where(d => d.Key < 0)
.SelectMany(d => d.Values.Select(v => Regex.Replace(v, @"[\s()]", "")
.Replace("StartingQuantityBeginningofCurrentMonth", "StartQuantity")
.Replace("FinalQuantityEndofCurrentMonth", "FinalQuantity")
.Replace("MedicationTotalStartQuantity", "StartQuantity")).ToList()).ToArray();
var medication = string.Empty;
var expandoData = groupData.Where(d => d.Key >= 0)
.Select((t, j) =>
{
dynamic expando = new ExpandoObject();
AddProperty(expando, "MedicineID", j);
int i = 0;
t.Values.ToList().ForEach(d =>
{
if (properties[i] == "Medication")
{
if (string.IsNullOrEmpty(d))
{
d = medication;
}
medication = d;
}
AddProperty(expando, properties[i], d ?? string.Empty);
i++;
});
return expando;
});
return expandoData;
}
// Define other methods and classes here
internal class MyDataRow : List<DataRowItem>, IDataRow
{
}
public class MedicationBrand
{
[CsvColumn(Name = "Medication", FieldIndex = 1)]
public string Medicine { get; set; }
[CsvColumn(Name = "Brand", FieldIndex = 2)]
public string Brand { get; set; }
[CsvColumn(FieldIndex = 3)]
public int Reorder {get;set;}
}
public class Product
{
internal string[] Row { get; set; }
[CsvColumn(Name = "MedicineID", FieldIndex = 1)]
public int index { get; set; }
internal string InvDateStr { get; set; }
public DateTime InvDate => !string.IsNullOrEmpty(InvDateStr)
? DateTime.ParseExact(InvDateStr, "M/yy", System.Globalization.CultureInfo.InvariantCulture)
: new DateTime(2999, 12, 31);
[CsvColumn(Name = "Medication", FieldIndex = 2)]
public string Medicine { get; set; }
[CsvColumn(Name = "Brand", FieldIndex = 3)]
public string Brand { get; set; }
[CsvColumn(FieldIndex = 4)]
public string Label => string.IsNullOrEmpty(Brand) ? $"{Medicine} ({index})" : $"{Medicine} {Brand} ({index})";
public string Dosage { get; set; }
public string Per { get; set; }
public string Unit { get; set; }
internal string StartStr { get; set; }
internal string RcvdStr { get; set; }
internal string OutStr { get; set; }
internal string FinalStr { get; set; }
[CsvColumn(Name = "StartingInventory", FieldIndex = 5)]
public int Start => Convert.ToInt32(regex.Replace(string.IsNullOrEmpty(StartStr) ? "0" : StartStr, ""));
public int Rcvd => Convert.ToInt32(regex.Replace(string.IsNullOrEmpty(RcvdStr) ? "0" : RcvdStr, ""));
public int Out => Convert.ToInt32(regex.Replace(string.IsNullOrEmpty(OutStr) ? "0" : OutStr, ""));
public int Final => Convert.ToInt32(regex.Replace(string.IsNullOrEmpty(FinalStr) ? "0" : FinalStr, ""));
[CsvColumn(FieldIndex = 6)]
public int InventoryReceived => Rcvd;
[CsvColumn(FieldIndex = 7)]
public int InventoryShipped => Out;
[CsvColumn(FieldIndex = 8)]
public int InventoryOnHand => Final;
[CsvColumn(FieldIndex = 9)]
public int MinimumRequired => Start;
[CsvColumn(FieldIndex = 10)]
public string NeedsReorder => Start == 0 ? "Yes" : "No";
internal string ExpiryStr { get; set; }
[CsvColumn(FieldIndex = 11)]
public DateTime Expiry { get; set; }
public DateTime Purchased { get; set; }
public DateTime OrderDate => InvDate.AddMonths(1).AddDays(-1);
public string Notes { get; set; }
internal PluralizationService ps => PluralizationService.CreateService(new CultureInfo("en-US"));
internal Regex regex = new Regex(@"[^\d]");
internal Product()
{
index = 0;
InvDateStr = DateTime.Today.ToString("M/yy");
Medicine = string.Empty;
Brand = string.Empty;
Dosage = string.Empty;
Per = string.Empty;
Unit = string.Empty;
StartStr = "0";
RcvdStr = "0";
OutStr = "0";
FinalStr = "0";
Expiry = new DateTime(2018, 1, 1);
ExpiryStr = Expiry.ToString("M/yy");
Purchased = new DateTime(2999, 12, 31);
Notes = string.Empty;
}
public Product(int i, string[] row)
: this()
{
Row = row;
index = i + 1;
InvDateStr = row[0];
Medicine = row[1];
Dosage = row[2] ?? string.Empty;
Per = row[3] ?? string.Empty;
Unit = row[3] ?? string.Empty;
Unit = Unit.ToUpper().Contains("TUBE") ? "Tube"
: Unit.ToUpper().Contains("BOTTLE") ? "Bottle"
: Unit.ToUpper().Contains("VIAL") ? "Vial"
: Unit.ToUpper().Contains("TABLET") ? "Tablet"
: Unit.ToUpper().Contains("CAPSULE") ? "Capsule"
: Unit.ToUpper().Contains("LANCET") ? "Lancet" : Unit;
Per = !string.IsNullOrEmpty(Per) ? Per.Replace(Unit, "").TrimEnd("(s) ".ToCharArray()) : string.Empty;
StartStr = string.IsNullOrEmpty(row[4]) ? "0" : row[4];
RcvdStr = string.IsNullOrEmpty(row[5]) ? "0" : row[5];
OutStr = string.IsNullOrEmpty(row[6]) ? "0" : row[6];
FinalStr = string.IsNullOrEmpty(row[7]) ? "0" : row[7];
ExpiryStr = row[8];
Notes = string.IsNullOrEmpty(row[9]) ? string.Empty : row[9];
Expiry = !string.IsNullOrEmpty(ExpiryStr)
? DateTime.ParseExact(ExpiryStr, "M/yy", System.Globalization.CultureInfo.InvariantCulture)
: new DateTime(2999, 12, 31);
Purchased = !string.IsNullOrEmpty(Notes) && Notes.StartsWith("Purchased")
? DateTime.ParseExact(Notes.Substring(10), "M/d/yy", System.Globalization.CultureInfo.InvariantCulture)
: DateTime.Compare(Expiry, new DateTime(2018, 1, 1)) < 0
? Expiry.AddMonths(-6) : new DateTime(2018, 1, 1);
Notes = Notes.Replace($"Purchased {Purchased:M/d/yy}", "");
}
public Product(ExpandoObject expando, DateTime invDate)
: this()
{
InvDateStr = invDate.ToString("M/yy");
var dictionary = expando as IDictionary<string, object>;
dictionary.Keys.ToList()
.ForEach(k =>
{
var value = Convert.ToString(dictionary[k]);
switch (k)
{
case "MedicineID":
index = Convert.ToInt32(value);
break;
case "Medicine":
case "Medication":
Medicine = value;
break;
case "MedicineBrand":
Brand = value;
break;
case "Dosage":
Dosage = value;
break;
case "PerBox":
Per = value;
break;
case "Unit":
Unit = ps.IsPlural(value) ? ps.Singularize(value) : value;
break;
case "Start":
case "StartQuantity":
StartStr = value;
break;
case "Received":
RcvdStr = value;
break;
case "Output":
OutStr = value;
break;
case "Final":
FinalStr = value;
break;
case "ExpirationDate":
ExpiryStr = Regex.Replace(value, @"[^\d/]", "");
Expiry = !string.IsNullOrEmpty(ExpiryStr)
? DateTime.ParseExact(ExpiryStr, "M/yy", System.Globalization.CultureInfo.InvariantCulture)
: new DateTime(2999, 12, 31);
break;
}
});
if (string.IsNullOrEmpty(Unit))
{
Unit = FindUnits(Per);
if (string.IsNullOrEmpty(Unit))
Unit = FindUnits(Dosage);
}
}
public string FindUnits(string unit)
{
return unit.ToUpper().Contains("TUBE") ? "Tube"
: unit.ToUpper().Contains("BOTTLE") ? "Bottle"
: unit.ToUpper().Contains("VIAL") ? "Vial"
: unit.ToUpper().Contains("TABLET") ? "Tablet"
: unit.ToUpper().Contains("CAPSULE") ? "Capsule"
: unit.ToUpper().Contains("LANCET") ? "Lancet"
: string.Empty;
}
object ToDump() => new
{
MedicineID = index,
Medication = Medicine,
Brand,
Label,
Unit,
StartingInventory = Start,
InventoryReceived,
InventoryShipped,
InventoryOnHand,
MinimumRequired,
NeedsReorder,
Expiry = $"{Expiry.AddMonths(1).AddDays(-1):MM/dd/yy}"
};
}
public class Order
{
internal string[] Row { get; set; }
[CsvColumn(Name = "MedicineID", FieldIndex = 1)]
public int index { get; set; }
internal string InvDateStr { get; set; }
public DateTime InvDate => !string.IsNullOrEmpty(InvDateStr)
? DateTime.ParseExact(InvDateStr, "M/yy", System.Globalization.CultureInfo.InvariantCulture)
: new DateTime(2999, 12, 31);
[CsvColumn(Name = "Medication", FieldIndex = 2)]
public string Medicine { get; set; }
internal string Brand { get; set; }
[CsvColumn(FieldIndex = 3)]
public string Label => $"{Medicine} {Brand}";
[CsvColumn(FieldIndex = 4)]
public string Customer => string.Empty;
internal string OutStr { get; set; }
[CsvColumn(Name = "Shipped", FieldIndex = 5)]
public int Out => Convert.ToInt32(regex.Replace(string.IsNullOrEmpty(OutStr) ? "0" : OutStr, ""));
[CsvColumn(Name = "Date", FieldIndex = 6)]
public DateTime OrderDate => InvDate.AddMonths(1).AddDays(-1);
internal PluralizationService ps => PluralizationService.CreateService(new CultureInfo("en-US"));
internal Regex regex = new Regex(@"[^\d]");
internal Order()
{
index = 0;
InvDateStr = DateTime.Today.ToString("M/yy");
Medicine = string.Empty;
Brand = string.Empty;
OutStr = "0";
}
public Order(ExpandoObject expando, DateTime invDate)
: this()
{
InvDateStr = invDate.ToString("M/yy");
var dictionary = expando as IDictionary<string, object>;
dictionary.Keys.ToList()
.ForEach(k =>
{
var value = Convert.ToString(dictionary[k]);
switch (k)
{
case "MedicineID":
index = Convert.ToInt32(value);
break;
case "Medicine":
case "Medication":
Medicine = value;
break;
case "MedicineBrand":
Brand = value;
break;
case "Output":
OutStr = value;
break;
}
});
}
object ToDump() => new
{
MedicineID = index,
Medication = Medicine,
Brand,
Label,
Customer = "",
Shipped = Out,
Date = InvDate.AddMonths(1).AddDays(-1)
};
}
public class Purchase
{
internal string[] Row { get; set; }
[CsvColumn(Name = "MedicineID", FieldIndex = 1)]
public int index { get; set; }
internal string InvDateStr { get; set; }
public DateTime InvDate => !string.IsNullOrEmpty(InvDateStr)
? DateTime.ParseExact(InvDateStr, "M/yy", System.Globalization.CultureInfo.InvariantCulture)
: new DateTime(2999, 12, 31);
[CsvColumn(Name = "Medication", FieldIndex = 2)]
public string Medicine { get; set; }
internal string Brand { get; set; }
[CsvColumn(FieldIndex = 3)]
public string Label => $"{Medicine} {Brand}";
[CsvColumn(FieldIndex = 4)]
public string Supplier => string.Empty;
internal string RcvdStr { get; set; }
[CsvColumn(Name = "Received", FieldIndex = 5)]
public int Rcvd => Convert.ToInt32(regex.Replace(string.IsNullOrEmpty(RcvdStr) ? "0" : RcvdStr, ""));
internal string Notes { get; set; }
internal string ExpiryStr = "";
internal DateTime Expiry => !string.IsNullOrEmpty(ExpiryStr)
? DateTime.ParseExact(ExpiryStr, "M/yy", System.Globalization.CultureInfo.InvariantCulture)
: new DateTime(2999, 12, 31);
[CsvColumn(Name = "Date", FieldIndex = 6)]
public DateTime Purchased { get; set; }
internal PluralizationService ps => PluralizationService.CreateService(new CultureInfo("en-US"));
internal Regex regex = new Regex(@"[^\d]");
internal Purchase()
{
index = 0;
InvDateStr = DateTime.Today.ToString("M/yy");
Medicine = string.Empty;
Brand = string.Empty;
RcvdStr = "0";
Purchased = new DateTime(2999, 12, 31);
}
public Purchase(ExpandoObject expando, DateTime invDate)
: this()
{
InvDateStr = invDate.ToString("M/yy");
Purchased = InvDate;
var dictionary = expando as IDictionary<string, object>;
dictionary.Keys.ToList()
.ForEach(k =>
{
var value = Convert.ToString(dictionary[k]);
switch (k)
{
case "MedicineID":
index = Convert.ToInt32(value);
break;
case "Medicine":
case "Medication":
Medicine = value;
break;
case "MedicineBrand":
Brand = value;
break;
case "Received":
RcvdStr = value;
break;
case "ExpirationDate":
ExpiryStr = Regex.Replace(value, @"[^\d/]", "");
break;
case "Notes:":
var purchaseStr = !string.IsNullOrEmpty(value) && value.StartsWith("Purchased")
? Regex.Replace(value, @"[^\d/]", "")
: string.Empty;
Purchased = !string.IsNullOrEmpty(purchaseStr)
? DateTime.ParseExact(purchaseStr, "M/d/yy", System.Globalization.CultureInfo.InvariantCulture)
: DateTime.Compare(Expiry, new DateTime(2018, 1, 1)) < 0
? Expiry.AddMonths(-6) : new DateTime(2018, 1, 1); ;
break;
}
});
}
object ToDump() => new
{
MedicineID = index,
Medication = Medicine,
Brand,
Label,
Supplier = "",
Received = Rcvd,
Date = Purchased
};
}
public static void AddProperty(ExpandoObject expando, string propertyName, object propertyValue)
{
// ExpandoObject supports IDictionary so we can extend it like this
var expandoDict = expando as IDictionary<string, object>;
if (expandoDict.ContainsKey(propertyName))
expandoDict[propertyName] = propertyValue;
else
expandoDict.Add(propertyName, propertyValue);
}
+74
View File
@@ -0,0 +1,74 @@
<Query Kind="Program">
<NuGetReference>RestSharp</NuGetReference>
<Namespace>RestSharp</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
</Query>
void Main()
{
Score(Severity.Critical, 5, 18).Dump();
ScoreAlt(Severity.Critical, 5, 18).Dump();
awardPoints("jchau", Severity.Critical, 5, 18);
Score(Severity.Major, 15, 5).Dump();
ScoreAlt(Severity.Major, 15, 5).Dump();
awardPoints("jchau", Severity.Major, 15, 5);
Score(Severity.Major, 15, 4).Dump();
awardPoints("jpollard", Severity.Major, 15, 4);
Score(Severity.Major, 10, 2).Dump();
awardPoints("aschey", Severity.Major, 10, 2);
Score(Severity.Major, 10).Dump();
awardPoints("tscanlan", Severity.Major, 10);
}
// Define other methods and classes here
public enum Severity
{
Info = 1,
Minor = 2,
Major = 5,
Critical = 7,
Blocker = 10
}
public int Score(Severity severity, int debt, int items = 1)
{
$"Math.Max(1, {debt} / 10 * {(int)severity}) * {items} items".Dump();
return Math.Max(1, debt / 10 * (int)severity) * items;
}
public int ScoreAlt(Severity severity, int debt, int items = 1)
{
$"Math.Max(1, {debt} * {(int)severity} / 10) * {items} items".Dump();
return Math.Max(1, debt * (int)severity / 10) * items;
}
public void awardPoints(string playerLogin, Severity severity, int debt, int items = 1)
{
string BaseUrl = @"https://api.quboo.io/score/generic";
RestClient client = new RestClient();
client.BaseUrl = new Uri(BaseUrl);
RestRequest request = new RestRequest();
request.Method = Method.PUT;
request.AddHeader("x-quboo-access-key", "FgtzhUSwAdsf4sGpM0kzXePP");
request.AddHeader("x-quboo-secret-key", "AwzF8dreEwkGemRS");
request.AddHeader("Content-Type", " application/json");
var qubooBody = new
{
playerLogin = playerLogin,
uniqueId = Guid.NewGuid(),
description = $"Resolving {items} {debt}min {severity} items",
score = Score(severity, debt, items)
};
request.AddJsonBody(qubooBody);
var result = client.Execute(request);
if (!result.IsSuccessful && result.ErrorMessage != null)
{
result.ErrorMessage.Dump();
}
else
{
JsonConvert.SerializeObject(JsonConvert.DeserializeObject(result.Content), Newtonsoft.Json.Formatting.Indented).Dump();
}
}
@@ -0,0 +1,99 @@
<Query Kind="Statements" />
var newIssueList = Regex.Replace(@"Cube Engine/Strata.CubeEngine.UserDefinedFunctions
0
Jazz AP Service/Jazz AP Service
30
ModelCacheWebService/ModelCacheWebService
0
OData
0
Optimization/Strata.Optimization
0
Strata Administrator
4
Strata Cube Reporter/Strata.CubeReporter
0
Strata Spoon/Strata.Spoon
0
Strata Template Architect
0
Strata.Base
1
Strata.Base.Internal
0
Strata.CS.Base
2
Strata.CS.Jazz.ABB
252
Strata.CS.Jazz.Biz
331
Strata.CS.Jazz.Biz.CCI
49
Strata.CS.Jazz.Biz.DSS.APReimbursementEngine
0
Strata.CS.Jazz.Biz.DSS.Episodes
2
Strata.CS.Jazz.Biz.DSS.Episodes.EpisodeDefinition
1
Strata.CS.Jazz.Biz.DSS.Episodes.EpisodeVisualizer
3
Strata.CS.Jazz.Biz.DSS.HPAdmin
9
Strata.CS.Jazz.Biz.Notifications
0
Strata.CS.Jazz.Biz.Snapshot/Properties
0
Strata.CS.Jazz.Biz.StarterSet
43
Strata.CS.Jazz.Dimensionality
0
Strata.CS.Jazz.FP
0
Strata.CS.Jazz.Ideas
0
Strata.CS.Jazz.UI
3
Strata.DataStudio20/Strata.DataStudio20
0
Strata.Entity.Base
0
Strata.Hangfire.Service
0
Strata.Jazz.Biz
1
Strata.Jazz.FoolsGold.Biz
0
Strata.Jazz.Hangfire
1
Strata.Jazz.Hangfire.WebServices
0
Strata.Jazz.Midas.Biz
19
Strata.Jazz.Midas.Web
13
Strata.Jazz.MVC
0
Strata.Jazz.UI
0
Strata.Jazz.Web
207
Strata.Reporting.ExcelReporter40
0
Strata.Reporting.Opus
0
Strata.Score
2
Strata.Score.ConfigTool/Strata.Score.ConfigTool.Biz
0
Strata.Score.DimensionEditor
0
Strata.Score.DimensionEditor20
0
Strata.Score.DimensionEditor20.Biz
0
", @"\r\n([\d]*\r\n)", "\t$1").Replace("\r\n", "\r").Split('\r')
.Where(x => !string.IsNullOrEmpty(x))
.Select(x => new { project = x.Split('\t')[0], issues = x.Split('\t')[1] })
.Where(x => x.issues != "0");
newIssueList.Dump();
File diff suppressed because it is too large Load Diff
+30
View File
@@ -0,0 +1,30 @@
<Query Kind="Program" />
public enum Severity
{
Info = 1,
Minor = 2,
Major = 5,
Critical = 7,
Blocker = 10
}
void Main()
{
Score(Severity.Critical, 5, 18).Dump();
ScoreAlt(Severity.Critical, 5, 18).Dump();
}
// Define other methods and classes here
public int Score(Severity severity, int debt, int items = 1)
{
$"Math.Max(1, {debt} / 10 * {(int)severity}) * {items} items".Dump();
return Math.Max(1, debt / 10 * (int)severity) * items;
}
public int ScoreAlt(Severity severity, int debt, int items = 1)
{
$"Math.Max(1, {debt} * {(int)severity} / 10) * {items} items".Dump();
return Math.Max(1, debt * (int)severity / 10) * items;
}
+77
View File
@@ -0,0 +1,77 @@
<Query Kind="Statements">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
var text = @"SELECT *
FROM cci.RunSavingHistory AS rsh
ORDER BY rsh.DateCreated DESC
GO
DELETE FROM cci.RunSavingHistory
";
var temp = System.IO.Path.GetTempFileName();
File.WriteAllText(temp, text);
var input = File.ReadAllLines(temp);
var grp = 0;
input.Select(r =>
{
if (r.Equals("go", StringComparison.CurrentCultureIgnoreCase))
{
r = "";
return new {grp = grp++, r};
}
else
{
return new {grp, r};
}
}).GroupBy(r => r.grp, (x, lines) => string.Join(" ", lines.Select(l => l.r).Where(l => !string.IsNullOrEmpty(l)))).Dump();
@@ -0,0 +1,23 @@
<Query Kind="Statements">
<Connection>
<ID>db640701-a1c5-4177-9f03-5152d093ffa7</ID>
<Persist>true</Persist>
<Server>D0011-sql-01.sdt.local</Server>
<Database>jazz tst StrataSphere 20200612.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
</Query>
var definitions = (from sdm in StandardDefinitionMappings select sdm).ToList();
//definitions
//.OrderBy(d => d.StandardDefinitionType)
//.ThenBy(d => $"{JObject.Parse(d.MappingMemberValue)["mappings"][0]["text"]}")
//.Select(x => new { x.StandardDefinitionGUID, x.StandardDefinitionType, x.MappingMemberValue }).Dump(nameof(definitions));
var inserts = definitions
.OrderBy(d => d.StandardDefinitionType)
.ThenBy(d => $"{JObject.Parse(d.MappingMemberValue)["mappings"][0]["text"]}")
.Aggregate("INSERT INTO dbo.StandardDefinitionMapping ( StandardDefinitionGUID, StandardDefinitionType, MappingMemberValue )\r\nVALUES",
(x, y) => $"{x}\r\n\t('{y.StandardDefinitionGUID}', N'{y.StandardDefinitionType}', N'{y.MappingMemberValue}'),");
inserts.TrimEnd(',').Dump(nameof(inserts));
@@ -0,0 +1,318 @@
<Query Kind="Program">
<Connection>
<ID>463c2997-8a6a-4688-9575-6549e5215f7b</ID>
<Persist>true</Persist>
<Server>D0011-SQL-01.sdt.local</Server>
<Database>jazz tst Riverside Health System 20190930.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>RestSharp</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>RestSharp</Namespace>
</Query>
private string BaseUrl = "https://api-dev.sdt.local/StrataSphere.Web.API.Service/api/v1/";
private IList<StrataSphereMappedDefinition> _mappedDefinitions;
void Main()
{
RestClient client = new RestClient();
var definitions = GetList<DefinitionDto>(client, "Definitions");
var standardDefinitionMappings = from def in StandardDefinitionMappings
select new
{
def.MappingId,
def.StandardDefinitionGUID,
def.StandardDefinitionType,
MappingMemberValue = JsonConvert.DeserializeObject(def.MappingMemberValue)
};
var guidDefinitionDictionary = standardDefinitionMappings.ToDictionary(u => u.StandardDefinitionGUID);
var foundDefinitions = definitions.Where(p => guidDefinitionDictionary.ContainsKey(p.Id));
_mappedDefinitions = (from d in foundDefinitions
join m in StandardDefinitionMappings on d.Id equals m.StandardDefinitionGUID
select new StrataSphereMappedDefinition(d, m.MappingMemberValue)).ToList();
var pathAlias = "HIERALIAS";
var sqlTableAlias = "viewDimMetri";
var attributeID = new[] { "Cardiomyopathy" }.ToList();
StrataSphereMappedValue find;
attributeID.ForEach(id =>
{
find = MapToStrataSphere("[Case Type Family MSDRG]", "[Case Type Family MSDRG].[Case Type Family]",
new List<string> { $"{id}" });
find.Dump($"StrataSphereMappedValue: {id}");
});
}
// Define other methods and classes here
public StrataSphereMappedValue MapToStrataSphere(string dimensionId, string attributeId, IList<string> valuesToMap)
{
var mdx = new Regex(@"^(\[.+\]\.)+\[.+\]$");
var clientValues = valuesToMap.Select(valueToMap => mdx.IsMatch(valueToMap)
? AnalysisServicesUtils.GetMeasureIDFromMDXName(valueToMap)
: valueToMap).ToList();
return FindMappedValue(dimensionId, attributeId, clientValues);
}
public static class AnalysisServicesUtils
{
public static string GetMeasureIDFromMDXName(string aMemberMDXName)
{
return aMemberMDXName;
}
}
protected StrataSphereMappedValue FindMappedValue(string dimensionId, string attributeId, List<string> valuesToMap)
{
var definitions = _mappedDefinitions
.Where(d => d.DimensionId.Equals(dimensionId, StringComparison.CurrentCultureIgnoreCase)
&& d.AttributeId.Equals(attributeId, StringComparison.CurrentCultureIgnoreCase)).ToList();
var mappings = definitions.Where(p => p.MappedValues != null && p.MappedValues.mappings.Any()).SelectMany(p => p.MappedValues.mappings);
mappings.Dump();
var mappedDefinition = definitions
.SingleOrDefault(p => p.MappedValues != null
&& (!p.MappedValues.mappings.Any() ||
p.MappedValues.mappings.SelectMany(m => m.attributeValues
.Select(a => a.ToString()))
.OrderBy(v => v).SequenceEqual(valuesToMap.OrderBy(v => v), StringComparer.CurrentCultureIgnoreCase))) ??
definitions
.SingleOrDefault(p => p.MappedValues != null
&& (!p.MappedValues.mappings.Any() ||
p.MappedValues.mappings
.Select(m => m.name)
.OrderBy(v => v).SequenceEqual(valuesToMap.OrderBy(v => v), StringComparer.CurrentCultureIgnoreCase))) ??
definitions
.SingleOrDefault(p => p.MappedValues != null
&& (!p.MappedValues.mappings.Any() ||
p.MappedValues.mappings
.Select(m => m.text)
.OrderBy(v => v).SequenceEqual(valuesToMap.OrderBy(v => v), StringComparer.CurrentCultureIgnoreCase))) ??
definitions
.SingleOrDefault(p => p.MappedValues != null
&& (!p.MappedValues.mappings.Any() ||
p.MappedValues.mappings
.Select(m => m.id)
.OrderBy(v => v).SequenceEqual(valuesToMap.OrderBy(v => v), StringComparer.CurrentCultureIgnoreCase))) ??
definitions
.SingleOrDefault(p => p.MappedValues != null
&& (!p.MappedValues.mappings.Any() ||
p.MappedValues.mappings
.SelectMany(m => m.hierarchyPaths)
.OrderBy(v => v).SequenceEqual(valuesToMap.OrderBy(v => v), StringComparer.CurrentCultureIgnoreCase))) ??
definitions.FirstOrDefault();
return mappedDefinition != null
? new StrataSphereMappedValue(valuesToMap, mappedDefinition.StrataSphereDefinitionGuid)
: new StrataSphereMappedValue(valuesToMap);
}
public struct StrataSphereMappedValue
{
public IList<string> ClientValues { get; set; }
public Guid? StrataSphereDefinitionGuid { get; set; }
public StrataSphereMappedValue(IList<string> clientValues)
{
ClientValues = clientValues;
StrataSphereDefinitionGuid = null;
}
public StrataSphereMappedValue(IList<string> clientValues, Guid definitionGuid)
{
ClientValues = clientValues;
StrataSphereDefinitionGuid = definitionGuid;
}
public bool IsMapped => StrataSphereDefinitionGuid.HasValue;
}
public class StrataSphereMappedDefinition
{
public StrataSphereMappedDefinition(DefinitionDto definitionDto, string mappedValues)
{
StrataSphereDefinitionGuid = definitionDto.Id;
HierarchyGuid = definitionDto.HierarchyGuid;
DimensionGuid = definitionDto.DimensionGuid;
AttributeGuid = definitionDto.AttributeGuid;
HierarchyId = definitionDto.HierarchyId;
DimensionId = definitionDto.DimensionId;
AttributeId = definitionDto.AttributeId;
MappedValues = JsonConvert.DeserializeObject<StrataSphereMappingValues>(mappedValues);
}
public Guid StrataSphereDefinitionGuid { get; }
public Guid HierarchyGuid { get; }
public Guid DimensionGuid { get; }
public Guid AttributeGuid { get; }
public string HierarchyId { get; }
public string DimensionId { get; }
public string AttributeId { get; }
public StrataSphereMappingValues MappedValues { get; }
}
public class StrataSphereMappingValues
{
public string HierarchyGUID { get; set; }
public string DimensionGUID { get; set; }
public List<string> values { get; set; }
public List<MappingValue> mappings { get; set; }
public List<string> hierarchyPaths { get; set; }
public StrataSphereMappingValues()
{
mappings = new List<MappingValue>();
}
}
public class MappingValue
{
public string id { get; set; }
public string displayHierarchyName { get; set; }
public string text { get; set; }
public string name { get; set; }
public List<object> attributeValues { get; set; }
public List<string> hierarchyPaths { get; set; }
public MappingValue()
{
attributeValues = new List<object>();
hierarchyPaths = new List<string>();
}
}
public class ApiBaseDto
{
/// <summary>
/// API Item Id Guid in StrataSphere
/// </summary>
/// <example>00000000-0000-0000-0000-000000000000</example>
public Guid Id { get; set; }
/// <summary>
/// When the API item was uploaded to StrataSphere
/// </summary>
public DateTime DateCreated { get; set; }
/// <summary>
/// When the API item was last updated in StrataSphere
/// </summary>
public DateTime DateLastModified { get; set; }
}
public class DefinitionDto : ApiBaseDto
{
/// <summary>
/// The name of the definition
/// </summary>
/// <example>TOP 10 DRGs BY SERVICE LINE</example>
public string Name { get; set; }
/// <summary>
/// A short description of the definition's content
/// </summary>
/// <example>Top 10 DRGs by Service Line filtered per service line rollup</example>
public string Description { get; set; } = "";
/// <summary>
/// The Guid of the Definition's hierarchy in a GM database
/// </summary>
/// <example>00000000-0000-0000-0000-000000000000</example>
public Guid HierarchyGuid { get; set; }
/// <summary>
/// The Guid of the Definition's dimension in a GM database
/// </summary>
/// <example>00000000-0000-0000-0000-000000000000</example>
public Guid DimensionGuid { get; set; }
/// <summary>
/// The Guid of the Definition's attribute in a GM database
/// </summary>
/// <example>00000000-0000-0000-0000-000000000000</example>
public Guid AttributeGuid { get; set; }
/// <summary>
/// The string of the Definition's hierarchy friendly name
/// </summary>
/// <example>PatientTypeRollupID</example>
public string HierarchyId { get; set; }
/// <summary>
/// The string of the Definition's dimension Id
/// </summary>
/// <example>[Patient Encounter]</example>
public string DimensionId { get; set; }
/// <summary>
/// The string of the Definition's attribute Id
/// </summary>
/// <example>[Patient Encounter].[Service Line Strata Decision]</example>
public string AttributeId { get; set; }
}
IEnumerable<T> GetList<T>(RestClient client, string something)
{
return Get<List<T>>(client, something);
}
T Get<T>(RestClient client, string something)
{
client.BaseUrl = new Uri(BaseUrl + something);
RestRequest request = new RestRequest();
request.Method = Method.GET;
return JsonConvert.DeserializeObject<T>(client.Execute(request).Content);
}
@@ -0,0 +1,134 @@
<Query Kind="Program">
<Connection>
<ID>463c2997-8a6a-4688-9575-6549e5215f7b</ID>
<Persist>true</Persist>
<Server>D0011-SQL-01.sdt.local</Server>
<Database>StrataSphere</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>RestSharp</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>RestSharp</Namespace>
<Namespace>System.Dynamic</Namespace>
</Query>
private string BaseUrl = "https://api-prod.sdt.local/starterset-api/api/v1/"; //"https://starterset-api.dev.k8s.sdt.local/api/v1/";
void Main()
{
RestClient client = new RestClient();
client.BaseUrl = new Uri(BaseUrl.Replace("/api/v1/", "/health"));
RestRequest request = new RestRequest();
request.Method = Method.GET;
client.Execute(request).Content.Dump("health");
var definitions = GetList<DefinitionDto>(client, "Definitions");
definitions?
.OrderBy(d => d.Name).ThenBy(d => d.AttributeId)
.Dump(nameof(definitions));
var mdx = GetList<MDXScoreToCube>(client, "MdxScoreToCube");
mdx?
.OrderBy(d => d.ScoreDimensionName).ThenBy(d => d.CubeDimensionName)
.Dump(nameof(mdx));
}
// Define other methods and classes here
dynamic GetList(RestClient client, string something)
{
client.BaseUrl = new Uri(BaseUrl + something);
RestRequest request = new RestRequest();
request.Method = Method.GET;
var converter = new ExpandoObjectConverter();
return JsonConvert.DeserializeObject<ExpandoObject>(client.Execute(request).Content, converter);
}
IEnumerable<T> GetList<T>(RestClient client, string something)
{
return Get<List<T>>(client, something);
}
T Get<T>(RestClient client, string something)
{
client.BaseUrl = new Uri(BaseUrl + something);
RestRequest request = new RestRequest();
request.Method = Method.GET;
return JsonConvert.DeserializeObject<T>(client.Execute(request).Content,
new JsonSerializerSettings
{
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
args.ErrorContext.Error.Message.Dump();
args.ErrorContext.Handled = true;
}
});
}
public class DefinitionDto
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Guid HierarchyGuid { get; set; }
public Guid DimensionGuid { get; set; }
public Guid AttributeGuid { get; set; }
public string HierarchyId { get; set; }
public string DimensionId { get; set; }
public string AttributeId { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateLastModified { get; set; }
public DefinitionDto()
{
}
}
@@ -0,0 +1,138 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>RestSharp</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>RestSharp</Namespace>
<Namespace>System.Dynamic</Namespace>
</Query>
private string BaseUrl = "https://starterset-api.dev.k8s.sdt.local/api/v1/";
void Main()
{
RestClient client = new RestClient();
var mdxScoreToCubes = GetList<MdxScoreToCubeDto>(client, "MdxScoreToCube");
mdxScoreToCubes
.Where(stc => stc.ScoreDimensionName == "MR Metrics")
//.Where(d => d.DimensionGuid.ToString().Equals("A1823417-0B73-9950-D44C-2F3A9B9DDB92", StringComparison.CurrentCultureIgnoreCase))
//.OrderBy(d => d.DimensionId)
.Dump(nameof(mdxScoreToCubes));
}
// Define other methods and classes here
dynamic GetList(RestClient client, string something)
{
client.BaseUrl = new Uri(BaseUrl + something);
RestRequest request = new RestRequest();
request.Method = Method.GET;
var converter = new ExpandoObjectConverter();
return JsonConvert.DeserializeObject<ExpandoObject>(client.Execute(request).Content, converter);
}
IEnumerable<T> GetList<T>(RestClient client, string something)
{
return Get<List<T>>(client, something);
}
T Get<T>(RestClient client, string something)
{
client.BaseUrl = new Uri(BaseUrl + something);
RestRequest request = new RestRequest();
request.Method = Method.GET;
return JsonConvert.DeserializeObject<T>(client.Execute(request).Content,
new JsonSerializerSettings
{
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
args.ErrorContext.Error.Message.Dump();
args.ErrorContext.Handled = true;
}
});
}
public class MdxScoreToCubeDto
{
public Guid Id { get; set; }
public string OrgPin { get; set; }
public Guid DatabaseGuid { get; set; }
public string ScoreDimensionName { get; set; }
public string ScoreHierarchyName { get; set; }
public string CubeDimensionName { get; set; }
public string CubeHierarchyName { get; set; }
public MdxMemberIdTypes MdxMemberIdType {get;set;}
public MdxForamtTypes MdxFormatType {get;set;}
public DateTime DateCreated { get; set; }
public DateTime DateLastModified { get; set; }
public MdxScoreToCubeDto()
{
}
}
public enum MdxMemberIdTypes
{
Attribute,
Name,
Text,
Id,
HierarchyPath
}
public enum MdxForamtTypes
{
None,
MDX,
Hierarchy,
MDXMemberId,
Raw
}
+872
View File
@@ -0,0 +1,872 @@
<Query Kind="Program">
<Connection>
<ID>db640701-a1c5-4177-9f03-5152d093ffa7</ID>
<Persist>true</Persist>
<Server>D0011-sql-01.sdt.local</Server>
<Database>jazz tst StrataSphere 20191104.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<NuGetReference>Newtonsoft.Json</NuGetReference>
<NuGetReference>RestSharp</NuGetReference>
<Namespace>RestSharp</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>System.Dynamic</Namespace>
</Query>
private string BaseUrl = @"https://localhost:44325/api/v1/";
void Main()
{
RestClient client = new RestClient();
var reports = GetList<ReportDto>(client, "Reports");
reports.Dump();
}
dynamic GetList(RestClient client, string something)
{
client.BaseUrl = new Uri(BaseUrl + something);
RestRequest request = new RestRequest();
request.Method = Method.GET;
var converter = new ExpandoObjectConverter();
return JsonConvert.DeserializeObject<ExpandoObject>(client.Execute(request).Content, converter);
}
void other()
{
StandardDefinitionMappings.Select(sdm => new
{
sdm.MappingId,
sdm.StandardDefinitionGUID,
sdm.StandardDefinitionType,
MappingMemberValue = JsonConvert.DeserializeObject<StrataSphereMappingValues>(sdm.MappingMemberValue)
}).Dump("StandardDefinitionMappings");
REReports.Join(REDSCubeReportParameters,
r => r.ReportGUID,
p => p.ReportGUID,
(r, p) => new ReportInfo(p.ParameterXML)
{
Report = r.Name,
DimensionID = p.DimensionID,
AttributeID = p.AttributeID
}).Dump("Cube Reports");
REReports.Join(REClientReportParameters,
r => r.ReportGUID,
p => p.ReportGUID,
(r, p) => new ReportInfo(p.ParameterXML)
{
Report = r.Name,
DimensionID = p.DimensionID,
AttributeID = p.AttributeID
}).Dump("Client Reports");
}
IEnumerable<T> GetList<T>(RestClient client, string something)
{
return Get<List<T>>(client, something);
}
T Get<T>(RestClient client, string something)
{
client.BaseUrl = new Uri(BaseUrl + something);
RestRequest request = new RestRequest();
request.Method = Method.GET;
return JsonConvert.DeserializeObject<T>(client.Execute(request).Content,
new JsonSerializerSettings
{
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
args.ErrorContext.Error.Message.Dump();
args.ErrorContext.Handled = true;
}
});
}
void stuff(RestClient client)
{
client.BaseUrl = new Uri(BaseUrl + "Definitions");
RestRequest request = new RestRequest();
request.Method = Method.GET;
var definitions = JsonConvert.DeserializeObject<List<DefinitionDto>>(client.Execute(request).Content);
definitions.Where(d => d.DimensionGuid == new Guid("6EF6B1F7-A50C-4198-8866-140BB82E2DDA")).Dump("Definitions");
client.BaseUrl = new Uri(BaseUrl + "MDXScoreToCube");
var mdx = JsonConvert.DeserializeObject<List<MDXScoreToCubeDto>>(client.Execute(request).Content);
mdx.Dump("MDX");
client.BaseUrl = new Uri(BaseUrl + "Reports");
var reports = JsonConvert.DeserializeObject<List<ReportDto>>(client.Execute(request).Content);
reports.Dump("Reports");
var reportSetupUrl = new Uri(BaseUrl + "Reports/{0}/Setup");
reports.Where(r => r.Id == new Guid("a4a12e21-954b-4889-d5c8-08d71f2ff590")).ToList().ForEach(r =>
{
client.BaseUrl = new Uri(BaseUrl + $"Reports/{r.Id}");
var rpt = JsonConvert.DeserializeObject<ReportDto>(client.Execute(request).Content);
rpt.DefinitionIds.ForEach(d =>
{
client.BaseUrl = new Uri(BaseUrl + $"Defintions/{d}");
var definition = JsonConvert.DeserializeObject<List<DefinitionDto>>(client.Execute(request).Content);
definition.Dump($"Report {r.Name} Definition {d}");
});
});
}
// Define other methods and classes here
public class ReportInfo
{
public string Report { get; set; }
public string DimensionID { get; set; }
public string AttributeID { get; set; }
public string ParameterXML { get; set; }
internal XmlDocument doc;
public string Parameter { get; set; }
public ReportInfo(string parameterXML)
{
ParameterXML = parameterXML;
var parameterXml = ParameterXML = $"<root>{ParameterXML}</root>"
.RemoveAllNamespacesAsString()
.Replace("string>", "valueId>")
.Replace("<Value2 i:nil=\"true\" />", "<Value2 />")
.Replace("<_", "<").Replace("</_", "</")
.Replace("p5:nil=\"true\" xmlns:p5=\"http://www.w3.org/2001/XMLSchema-instance\"", "");
XmlDocument doc = new XmlDocument();
doc.LoadXml(parameterXml);
Parameter = JsonConvert.SerializeObject(
JsonConvert.DeserializeObject<dynamic>(
JsonConvert.SerializeXmlNode(doc.SelectSingleNode("root")
)
)
,
Newtonsoft.Json.Formatting.Indented);
}
}
public class StrataSphereMappingValues
{
public string HierarchyGUID { get; set; }
public string DimensionGUID { get; set; }
public List<string> values { get; set; }
public List<MappingValue> mappings { get; set; }
public List<string> hierarchyPaths { get; set; }
public StrataSphereMappingValues()
{
mappings = new List<MappingValue>();
}
}
public class MappingValue
{
public string id { get; set; }
public string displayHierarchyName { get; set; }
public string text { get; set; }
public string name { get; set; }
public List<object> attributeValues { get; set; }
public List<string> hierarchyPaths { get; set; }
public MappingValue()
{
attributeValues = new List<object>();
hierarchyPaths = new List<string>();
}
}
public enum eStrataSphereItemCategory
{
Report,
Dashboard
}
public enum StrataSphereReportEnum
{
Report,
DSCubeReport,
SQLReport,
ClientReport
}
public class ReportDto
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Author { get; set; }
public eStrataSphereItemCategory Category => eStrataSphereItemCategory.Report;
public string Tagline =>
$"Report | {Module} | {DateCreated.ToString("MMM-dd-YYYY")} | {DownloadCount} downloads";
public StrataSphereReportEnum ReportType { get; set; }
public string Module { get; set; }
public string MinJazzVersion { get; set; }
public string MaxJazzVersion { get; set; }
public string ReportSetupJson { get; set; }
public List<Guid> DefinitionIds { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateLastModified { get; set; }
public int DownloadCount { get; set; }
public ReportDto()
{
ReportSetupJson = "{}";
DefinitionIds = new List<Guid>();
}
}
public class DefinitionDto
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Guid HierarchyGuid { get; set; }
public Guid DimensionGuid { get; set; }
public Guid AttributeGuid { get; set; }
public string HierarchyId { get; set; }
public string DimensionId { get; set; }
public string AttributeId { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateLastModified { get; set; }
}
public enum MDXMemberIDTypeEnum
{
Attribute,
Name,
Text,
Id,
HierarchyPath
}
public enum MDXFormatTypeEnum
{
None,
MDX,
Hierarchy,
MDXMemberId
}
public class MDXScoreToCubeDto
{
public string OrgPin { get; set; }
public Guid DatabaseGuid { get; set; }
public string ScoreDimensionName { get; set; }
public string ScoreHierarchyName { get; set; }
public string CubeDimensionName { get; set; }
public string CubeHierarchyName { get; set; }
public MDXMemberIDTypeEnum MDXMemberIDType { get; set; }
public MDXFormatTypeEnum MDXFormatType { get; set; }
}
public class ValueIDArray
{
public List<string> valueId { get; set; }
}
public class DSCubeSearchCondition
{
public string FilterOp { get; set; }
public string SearchType { get; set; }
public string Value2 { get; set; }
public string Value { get; set; }
public ValueIDArray ValueIDArray { get; set; }
}
public class SearchConditions
{
public DSCubeSearchCondition DSCubeSearchCondition { get; set; }
}
public class DSCubeSearchParameterValue
{
public string ParameterGUID { get; set; }
public string ParameterValueGUID { get; set; }
public SearchConditions SearchConditions { get; set; }
}
public class Root
{
public DSCubeSearchParameterValue DSCubeSearchParameterValue { get; set; }
}
public class RootObject
{
public Root root { get; set; }
}
#region StrataSphereAdHocReportSetup
public interface IStrataSphereAdHocReportSectionItem
{
string Name { get; set; }
bool IsOnChartXAxis { get; set; }
bool IsOnChartYAxis { get; set; }
}
internal class StrataSphereAdHocReportAttribute : IStrataSphereAdHocReportSectionItem
{
public StrataSphereAdHocReportAttribute()
{
}
public string AttributeId { get; set; }
public string DimensionId { get; set; }
public int Index { get; set; }
public string Name { get; set; }
public IList<string> FilterMembers { get; set; }
public int VisibilityStatusValue { get; set; }
public bool ShowSubtotal { get; set; }
public bool IsOnChartXAxis { get; set; }
public bool IsOnChartYAxis { get; set; }
// section level filters
public List<object> Parameters { get; set; } = new List<object>();
//public List<StrataSphereAdHocReportParameter> Parameters { get; set; } = new List<StrataSphereAdHocReportParameter>();
}
internal class StrataSphereAdHocReportCalculation : IStrataSphereAdHocReportSectionItem
{
public StrataSphereAdHocReportCalculation()
{
}
public string Name { get; set; }
public string CalcType { get; set; }
public int DisplayOrder { get; set; }
public string DisplayFormat { get; set; }
public int ColumnWidth { get; set; }
public string CalculationJson { get; set; }
public string CssClass { get; set; }
public bool IsAttributeMember { get; set; }
public bool IsOnChartXAxis { get; set; }
public bool IsOnChartYAxis { get; set; }
public List<StrataSphereAdHocReportConditionalFormat> ConditionalFormats { get; set; } = new List<StrataSphereAdHocReportConditionalFormat>();
}
internal class StrataSphereAdHocReportConditionalFormat
{
public StrataSphereAdHocReportConditionalFormat()
{
}
public string Comment { get; set; }
public int DisplayOrder { get; set; }
public ReportTupleInfo ColumnTupleInfo { get; set; }
public string CssClass { get; set; }
public string ValueToCompareAsString { get; set; }
public int OperatorValue { get; set; }
}
internal class StrataSphereAdHocReportConfig
{
public string Title { get; set; }
public string Description { get; set; }
public string[] Colors { get; set; }
public AxisSetting AxisSettings { get; set; }
public string XType { get; set; }
public bool YAxisMultiSelect { get; set; }
public Guid XAxisSectionItemGuid { get; set; }
public List<Guid> YAxisSectionItemGuids { get; set; } = new List<Guid>();
public StrataSphereAdHocReportConfig(BaseConfig source)
{
if (source == null) return;
Title = source.Title;
Description = source.Description;
Colors = source.Colors;
AxisSettings = source.AxisSettings;
XType = source.XType;
YAxisMultiSelect = source.YAxisMultiSelect;
}
public BaseConfig GetChartConfig()
{
var chartConfig = default(BaseConfig);
/*
// Try decoding the xType by the name first
var asm = typeof(AreaConfig).Assembly;
var type = asm.GetType($"{asm.GetName().Name}.Reporting.ChartConfigs.{XType}");
if (type != null)
{
chartConfig = (BaseConfig)Activator.CreateInstance(type);
}
else // if that failed then use the hard coded selector, this is an issue if new types are supported
{
switch (XType)
{
case "AreaConfig":
chartConfig = new AreaConfig();
break;
case "BarConfig":
chartConfig = new BarConfig();
break;
case "BubbleConfig":
chartConfig = new BubbleConfig();
break;
case "ColumnConfig":
chartConfig = new ColumnConfig();
break;
case "ComboColumnAndLineConfig":
chartConfig = new ComboColumnAndLineConfig();
break;
case "ComboColumnAndLineWithSecondaryAxisConfig":
chartConfig = new ComboColumnAndLineWithSecondaryAxisConfig();
break;
case "DonutConfig":
chartConfig = new DonutConfig();
break;
case "LineConfig":
chartConfig = new LineConfig();
break;
case "PieConfig":
chartConfig = new PieConfig();
break;
case "ScatterConfig":
chartConfig = new ScatterConfig();
break;
case "SplineConfig":
chartConfig = new SplineConfig();
break;
case "StackedBarConfig":
chartConfig = new StackedBarConfig();
break;
case "StackedBarPercentConfig":
chartConfig = new StackedBarPercentConfig();
break;
case "StackedColumnConfig":
chartConfig = new StackedColumnConfig();
break;
case "StackedColumnPercentConfig":
chartConfig = new StackedColumnPercentConfig();
break;
}
}
*/
if (chartConfig == null) return chartConfig;
chartConfig.Title = Title;
chartConfig.Description = Description;
chartConfig.Colors = Colors;
chartConfig.AxisSettings = AxisSettings;
// if (chartConfig is XYConfig xyConfig)
// {
// xyConfig.XAxisSectionItemGuid = XAxisSectionItemGuid;
// xyConfig.YAxisSectionItemGuids.AddRange(YAxisSectionItemGuids);
// }
return chartConfig;
}
}
internal class StrataSphereAdHocReportDataSource
{
public StrataSphereAdHocReportDataSource()
{
}
public Guid DataSourceGuid { get; set; }
public string Name { get; set; }
public int DataSourceType { get; set; }
}
internal class StrataSphereAdHocReportMeasure : IStrataSphereAdHocReportSectionItem
{
public StrataSphereAdHocReportMeasure()
{
}
public string MeasureId { get; set; }
public string Name { get; set; }
public int Index { get; set; }
public string DisplayFormat { get; set; }
public int ColumnWidth { get; set; }
public bool IsOnChartXAxis { get; set; }
public bool IsOnChartYAxis { get; set; }
// section level filters
public List<StrataSphereAdHocReportParameter> Parameters { get; set; } = new List<StrataSphereAdHocReportParameter>();
public List<StrataSphereAdHocReportConditionalFormat> ConditionalFormats { get; set; } = new List<StrataSphereAdHocReportConditionalFormat>();
}
internal class StrataSphereAdHocReportSection
{
public StrataSphereAdHocReportSection()
{
}
public string Name { get; set; }
public bool IsOnColumn { get; set; }
public int DisplayOrder { get; set; }
public bool IsTimeRelative { get; set; }
public bool IsFinancialReportSectionHidable { get; set; }
public bool IsMergingRepeatHeader { get; set; }
public bool IsSpaceAbove { get; set; }
public bool IsHidden { get; set; }
public string DisplayLabel { get; set; }
public bool ShowSectionLabel { get; set; }
public bool ShowGrandTotal { get; set; }
public bool IsAutoNameFilter { get; set; }
public bool ShowMargin { get; set; }
public List<object> Attributes { get; set; } = new List<object>();
public List<object> Measures { get; set; } = new List<object>();
public List<object> Calculations { get; set; } = new List<object>();
}
internal class StrataSphereAdHocReportSetup
{
public string Style { get; set; }
public StrataSphereAdHocReportSortArgs SortArgs { get; set; }
public List<StrataSphereAdHocReportDataSource> DataSources { get; set; } = new List<StrataSphereAdHocReportDataSource>();
public StrataSphereAdHocReportConfig ChartConfig { get; set; } = null;
public List<StrataSphereAdHocReportSection> Sections { get; set; } = new List<StrataSphereAdHocReportSection>();
public List<StrataSphereAdHocReportParameter> Parameters { get; set; } = new List<StrataSphereAdHocReportParameter>();
public List<StrataSphereAdHocScoreDimensionInfo> ServiceLines { get; set; } =
new List<StrataSphereAdHocScoreDimensionInfo>();
}
public class StrataSphereAdHocReportSortArgs
{
public StrataSphereAdHocReportTupleInfo TupleInfo { get; set; }
public bool IsAscending { get; set; }
public int SortCount { get; set; }
public int Top { get; set; }
public bool IsTopPercent { get; set; }
public bool IsIncludeAllOthers { get; set; }
public StrataSphereAdHocReportSortArgs()
{
TupleInfo = new StrataSphereAdHocReportTupleInfo();
}
}
public class StrataSphereAdHocReportTupleInfo
{
public Dictionary<string, string> PartialRowTuple { get; set; }
public Dictionary<string, string> PartialColTuple { get; set; }
public string MainMeasureName { get; private set; }
public string RowMeasureName { get; set; }
public string ColMeasureName { get; set; }
public Guid ColMeasureGUID { get; set; }
public string FormatString { get; set; }
public int rowIndex { get; set; }
public int colIndex { get; set; }
public Guid ColumnSectionGUID { get; set; }
public IAdHocReportSectionMeasure MainMeasure { get; set; }
public StrataSphereAdHocReportTupleInfo()
{
PartialRowTuple = new Dictionary<string, string>();
PartialColTuple = new Dictionary<string, string>();
ColumnSectionGUID = Guid.Empty;
ColMeasureGUID = Guid.Empty;
}
public StrataSphereAdHocReportTupleInfo(ReportTupleInfo tupleInfo)
: this()
{
if (tupleInfo == null) return;
tupleInfo.PartialRowTuple.Keys.ToList()
.ForEach(key => PartialRowTuple.Add(key, tupleInfo.PartialRowTuple[key]));
tupleInfo.PartialColTuple.Keys.ToList()
.ForEach(key => PartialColTuple.Add(key, tupleInfo.PartialColTuple[key]));
//MainMeasure = tupleInfo.MainMeasure;
MainMeasureName = tupleInfo.MainMeasureName;
RowMeasureName = tupleInfo.RowMeasureName;
ColMeasureName = tupleInfo.ColMeasureName;
ColMeasureGUID = tupleInfo.ColMeasureGUID;
FormatString = tupleInfo.FormatString;
rowIndex = tupleInfo.rowIndex;
colIndex = tupleInfo.colIndex;
ColumnSectionGUID = tupleInfo.ColumnSectionGUID;
}
public static implicit operator ReportTupleInfo(StrataSphereAdHocReportTupleInfo tupleInfo)
{
if (tupleInfo == null) return null;
var result = new ReportTupleInfo
{
PartialRowTuple = new Dictionary<string, string>(),
PartialColTuple = new Dictionary<string, string>(),
MainMeasure = tupleInfo.MainMeasure?.CopyMeasure(),
RowMeasureName = tupleInfo.RowMeasureName,
ColMeasureName = tupleInfo.ColMeasureName,
ColMeasureGUID = tupleInfo.ColMeasureGUID,
FormatString = tupleInfo.FormatString,
rowIndex = tupleInfo.rowIndex,
colIndex = tupleInfo.colIndex,
ColumnSectionGUID = tupleInfo.ColumnSectionGUID
};
tupleInfo.PartialRowTuple.Keys.ToList()
.ForEach(key => result.PartialRowTuple.Add(key, tupleInfo.PartialRowTuple[key]));
tupleInfo.PartialColTuple.Keys.ToList()
.ForEach(key => result.PartialColTuple.Add(key, tupleInfo.PartialColTuple[key]));
return result;
}
}
internal interface IStrataReportParameter
{
string DimensionId { get; set; }
string AttributeId { get; set; }
}
internal abstract class StrataSphereAdHocReportParameter : IStrataReportParameter
{
protected StrataSphereAdHocReportParameter()
{
}
public string Name { get; set; }
public string DimensionId { get; set; }
public string AttributeId { get; set; }
public string MeasureId { get; set; }
public int DisplayOrder { get; set; }
public bool IsUserEditable { get; set; }
public bool IsAttributeParameter => string.IsNullOrWhiteSpace(MeasureId);
}
public class StrataSphereAdHocScoreDimensionInfo
{
public Guid DimensionGUID { get; set; }
public string FriendlyName { get; set; }
public string GlobalID { get; set; }
public string AttributeId { get; set; }
public string MDXMemberID { get; set; }
public bool IsRollup { get; set; }
internal Regex ServiceLineRegex = new Regex(@"^Service Line (\d)$", RegexOptions.IgnoreCase);
// internal string MDXMemberName => AnalysisServicesUtils.GetHierarchyMDXName("Patient Encounter",
// ServiceLineRegex.IsMatch(FriendlyName) && IsRollup
// ? $"{ServiceLineRegex.Replace(FriendlyName, "Service Line Rollup ${1}")}"
// : $"{FriendlyName}{(IsRollup ? " Rollup" : "")}");
internal string Name => $"Patient Encounter - {FriendlyName}{(IsRollup ? " Rollup" : "")}";
internal StrataSphereAdHocScoreDimensionInfo()
{
MDXMemberID = string.Empty;
IsRollup = false;
}
}
#endregion
#region Other Stuff
public interface IAdHocReportSectionMeasure //: IAdHocReportSectionItem
{
string ColumnName { get; set; }
string DisplayFormat { get; }
string CSSClass { get; }
List<Guid> LinkedSectionGUIDs { get; }
void Hide();
string MeasureID { get; }
bool IsPartial { get; }
bool IsAttributeMember { get; }
eAggregateFunction AggregationTypeEnum { get; }
IAdHocReportSectionMeasure CopyMeasure();
}
public interface ITGuid<T>
{
Guid Value { get; set; }
bool IsEmpty { get; set; }
}
public enum eClientReportSectionItemType
{
Attribute = 0,
Hierarchy = 1,
Measure = 2,
Calculation = 3
}
public enum eReportDrilldownStatus
{
None = 0,
Drilldown = 1,
Drillup = 2
}
public enum eClientReportVisibilityStatus
{
Hidden = 0,
CompletelyVisible = 1,
PartiallyVisible = 2
}
public enum eAggregateFunction
{
Sum = 0,
Count = 1,
Avg = 2,
Min = 3,
Max = 4,
None = 5
}
public interface IAdHocReportSectionAttribute //: IAdHocReportSectionItem
{
ITGuid<IAdHocReportSectionAttribute> AttributeGUIDTyped { get; }
string DimensionID { get; }
string AttributeID { get; }
bool ShowSubtotal { get; set; }
SortOrder SortOrder { get; }
eClientReportVisibilityStatus VisibilityStatus { get; set; }
eReportDrilldownStatus DrilldownStatus { get; set; }
string FilterMemberCSV { get; set; }
List<string> FilterMembers { get; set; }
List<string> FilterMembersVisible { get; }
}
public class ReportTupleInfo
{
public ReportTupleInfo()
{
this.PartialRowTuple = new Dictionary<string, string>();
this.PartialColTuple = new Dictionary<string, string>();
}
private Dictionary<string, string> _Tuple;
public Dictionary<string, string> Tuple
{
get
{
return _Tuple;
}
set { _Tuple = value; }
}
public Dictionary<string, string> PartialRowTuple { get; set; }
public Dictionary<string, string> PartialColTuple { get; set; }
public string MainMeasureName { get; private set; }
private IAdHocReportSectionMeasure _MainMeasure;
public IAdHocReportSectionMeasure MainMeasure
{
get { return _MainMeasure; }
set
{
_MainMeasure = value;
MainMeasureName = (value == null) ? string.Empty : value.ColumnName;
}
}
public string RowMeasureName { get; set; }
public string ColMeasureName { get; set; }
public Guid ColMeasureGUID { get; set; }
public string FormatString { get; set; }
public int rowIndex { get; set; }
public int colIndex { get; set; }
public Guid ColumnSectionGUID { get; set; }
}
public class AxisSetting
{
public string XAxisLabel { get; set; }
public string YAxisLabel { get; set; }
public double? YAxisLowerBound { get; set; }
public double? YAxisUpperBound { get; set; }
public double? YAxisTickInterval { get; set; }
public double? YAxisPlotLineValue { get; set; }
public bool ShowDataLabel { get; set; }
public override bool Equals(object obj)
{
var config = (AxisSetting)obj;
if (config == null) return false;
if (config.XAxisLabel != this.XAxisLabel) return false;
if (config.YAxisLabel != this.YAxisLabel) return false;
if (config.YAxisLowerBound != this.YAxisLowerBound) return false;
if (config.YAxisUpperBound != this.YAxisUpperBound) return false;
if (config.YAxisTickInterval != this.YAxisTickInterval) return false;
if (config.YAxisPlotLineValue != this.YAxisPlotLineValue) return false;
if (config.ShowDataLabel != this.ShowDataLabel) return false;
return true;
}
}
public abstract class BaseConfig
{
public abstract DataTable GetData(object report);
public abstract string Name { get; }
public string Title { get; set; }
public string Description { get; set; }
public string[] Colors { get; set; }
public AxisSetting AxisSettings { get; set; }
public virtual string IconName { get { return ""; } }
public virtual string XType { get { return ""; } }
public virtual string SectionName { get { return ""; } }
public virtual int ColumnNumber { get { return -1; } }
public virtual int RowNumber { get { return -1; } }
public virtual bool YAxisMultiSelect { get { return true; } }
protected BaseConfig()
{
this.Colors = new string[] { };
this.AxisSettings = new AxisSetting();
}
public override bool Equals(object obj)
{
var config = (BaseConfig)obj;
if (config == null) return false;
if (config.Title != Title || config.Description != Description) return false;
if (config.Colors.Length != Colors.Length) return false;
if (config.Colors.Any(p => !Colors.Contains(p))) return false;
if (!config.AxisSettings.Equals(this.AxisSettings)) return false;
if (config.GetType().Name != this.GetType().Name) return false;
return true;
}
}
#endregion
@@ -0,0 +1,96 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>RestSharp</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>RestSharp</Namespace>
</Query>
private string BaseUrl = @"https://api-prod.sdt.local/starterset-api";
private string Resource = @"Reports/Populate";
void Main()
{
var client = new RestClient();
BaseUrl += "/api/v1";
client.BaseUrl = new Uri(BaseUrl);
DumpEndpoint(client, "prod");
Resource = @"Reports/Test";
DumpEndpoint(client, "Test");
Resource = @"Reports/a281733b-30d8-4d51-2148-08d799ffe4e4/Setup";
DumpEndpoint(client, Resource);
Resource = @"Reports/Populate";
var environments = new[] { "dev", "qa", "training" }.ToList();
environments.ForEach(env =>
{
DumpEnv(client, env);
});
}
void DumpEnv(RestClient client, string env)
{
BaseUrl = $@"https://starterset-api.{env}.k8s.sdt.local";
BaseUrl += "/api/v1";
client.BaseUrl = new Uri(BaseUrl);
DumpEndpoint(client, env);
}
void DumpEndpoint(RestClient client, string env)
{
var request = new RestRequest();
request.Method = Method.GET;
request.Resource = Resource;
var response = client.Execute(request);
response.Content.Dump(env);
}
// Define other methods and classes here
@@ -0,0 +1,908 @@
<Query Kind="Program">
<Output>DataGrids</Output>
<NuGetReference>Newtonsoft.Json</NuGetReference>
<NuGetReference>RestSharp</NuGetReference>
<Namespace>RestSharp</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>System.Dynamic</Namespace>
</Query>
private string BaseUrl =
//"https://starterset-api.dev.k8s.sdt.local/api/v1/";
"https://localhost:44325/api/v1/";
void Main()
{
RestClient client = new RestClient();
var reports = GetList<ReportDto>(client, "Reports");
var rpts = reports
.Where(r => r.Name.StartsWith("TL Fiscal Month Test"))
.OrderBy(r => r.Name)
.ToList()
.Select(rpt => new { rpt.Id, rpt.Name, setup = GetList(client, $"Reports\\{rpt.Id}\\Setup") })
//.Where(x => ((IDictionary<String, object>)x.setup).ContainsKey("ServiceLines"))
;
rpts.Dump(nameof(rpts),6);
var definitions = GetList<DefinitionDto>(client, "Definitions")
.Where(dd => dd.DimensionId == "e18e27ea-52ec-4793-9209-c6259c78474a"
|| dd.DimensionId == "Fiscan Month");
definitions.Dump();
/*
var setups = rpts.Select(r => r.setup);
setups.Dump(nameof(setups));
var serviceLines = setups.Where(x => ((IDictionary<String, object>)x).ContainsKey("ServiceLines"))
.SelectMany(s => ((List<Object>)s.ServiceLines)
.Select(x => x));
serviceLines.Dump(nameof(serviceLines));
var dataSources = setups.SelectMany(s => ((List<Object>)s.DataSources)
.Select(x => JsonConvert.DeserializeObject<StrataSphereAdHocReportDataSource>(JsonConvert.SerializeObject(x))))
.GroupBy(ds => ds.DataSourceGuid, (g, d) => d.First());
dataSources.Dump(nameof(dataSources));
// var globalParameters = setups.SelectMany(s => ((List<Object>)s.Parameters)
// .Select(x => JsonConvert.DeserializeObject<StrataSphereAdHocReportParameter>(JsonConvert.SerializeObject(x))));
// globalParameters.Dump(nameof(globalParameters));
var sections = setups.SelectMany(s => ((List<Object>)s.Sections)
.Select(x => JsonConvert.DeserializeObject<StrataSphereAdHocReportSection>(JsonConvert.SerializeObject(x))));
var attributes = sections.SelectMany(s => s.Attributes)
.Select(x => JsonConvert.DeserializeObject<StrataSphereAdHocReportAttribute>(JsonConvert.SerializeObject(x)));
attributes.Dump(nameof(attributes));
var attrParms = attributes.SelectMany(a => a.Parameters);
attrParms.Dump(nameof(attrParms));
var calculations = sections.SelectMany(s => s.Calculations)
.Select(x => JsonConvert.DeserializeObject<StrataSphereAdHocReportCalculation>(JsonConvert.SerializeObject(x)));
calculations.Dump(nameof(calculations));
*/
}
dynamic GetList(RestClient client, string something)
{
client.BaseUrl = new Uri(BaseUrl + something);
RestRequest request = new RestRequest();
request.Method = Method.GET;
var converter = new ExpandoObjectConverter();
return JsonConvert.DeserializeObject<ExpandoObject>(client.Execute(request).Content, converter);
}
//void other()
//{
// StandardDefinitionMappings.Select(sdm => new
// {
// sdm.MappingId,
// sdm.StandardDefinitionGUID,
// sdm.StandardDefinitionType,
// MappingMemberValue = JsonConvert.DeserializeObject<StrataSphereMappingValues>(sdm.MappingMemberValue)
// }).Dump("StandardDefinitionMappings");
//
// REReports.Join(REDSCubeReportParameters,
// r => r.ReportGUID,
// p => p.ReportGUID,
// (r, p) => new ReportInfo(p.ParameterXML)
// {
// Report = r.Name,
// DimensionID = p.DimensionID,
// AttributeID = p.AttributeID
// }).Dump("Cube Reports");
//
// REReports.Join(REClientReportParameters,
// r => r.ReportGUID,
// p => p.ReportGUID,
// (r, p) => new ReportInfo(p.ParameterXML)
// {
// Report = r.Name,
// DimensionID = p.DimensionID,
// AttributeID = p.AttributeID
// }).Dump("Client Reports");
//}
IEnumerable<T> GetList<T>(RestClient client, string something)
{
return Get<List<T>>(client, something);
}
T Get<T>(RestClient client, string something)
{
client.BaseUrl = new Uri(BaseUrl + something);
RestRequest request = new RestRequest();
request.Method = Method.GET;
return JsonConvert.DeserializeObject<T>(client.Execute(request).Content,
new JsonSerializerSettings
{
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
args.ErrorContext.Error.Message.Dump();
args.ErrorContext.Handled = true;
}
});
}
void stuff(RestClient client)
{
client.BaseUrl = new Uri(BaseUrl + "Definitions");
RestRequest request = new RestRequest();
request.Method = Method.GET;
var definitions = JsonConvert.DeserializeObject<List<DefinitionDto>>(client.Execute(request).Content);
definitions.Where(d => d.DimensionGuid == new Guid("6EF6B1F7-A50C-4198-8866-140BB82E2DDA")).Dump("Definitions");
client.BaseUrl = new Uri(BaseUrl + "MDXScoreToCube");
var mdx = JsonConvert.DeserializeObject<List<MDXScoreToCubeDto>>(client.Execute(request).Content);
mdx.Dump("MDX");
client.BaseUrl = new Uri(BaseUrl + "Reports");
var reports = JsonConvert.DeserializeObject<List<ReportDto>>(client.Execute(request).Content);
reports.Dump("Reports");
var reportSetupUrl = new Uri(BaseUrl + "Reports/{0}/Setup");
reports.Where(r => r.Id == new Guid("a4a12e21-954b-4889-d5c8-08d71f2ff590")).ToList().ForEach(r =>
{
client.BaseUrl = new Uri(BaseUrl + $"Reports/{r.Id}");
var rpt = JsonConvert.DeserializeObject<ReportDto>(client.Execute(request).Content);
rpt.DefinitionIds.ForEach(d =>
{
client.BaseUrl = new Uri(BaseUrl + $"Defintions/{d}");
var definition = JsonConvert.DeserializeObject<List<DefinitionDto>>(client.Execute(request).Content);
definition.Dump($"Report {r.Name} Definition {d}");
});
});
}
// Define other methods and classes here
public class ReportInfo
{
public string Report { get; set; }
public string DimensionID { get; set; }
public string AttributeID { get; set; }
public string ParameterXML { get; set; }
internal XmlDocument doc;
public string Parameter { get; set; }
public ReportInfo(string parameterXML)
{
ParameterXML = parameterXML;
var parameterXml = ParameterXML = $"<root>{ParameterXML}</root>"
.RemoveAllNamespacesAsString()
.Replace("string>", "valueId>")
.Replace("<Value2 i:nil=\"true\" />", "<Value2 />")
.Replace("<_", "<").Replace("</_", "</")
.Replace("p5:nil=\"true\" xmlns:p5=\"http://www.w3.org/2001/XMLSchema-instance\"", "");
XmlDocument doc = new XmlDocument();
doc.LoadXml(parameterXml);
Parameter = JsonConvert.SerializeObject(
JsonConvert.DeserializeObject<dynamic>(
JsonConvert.SerializeXmlNode(doc.SelectSingleNode("root")
)
)
,
Newtonsoft.Json.Formatting.Indented);
}
}
public class StrataSphereMappingValues
{
public string HierarchyGUID { get; set; }
public string DimensionGUID { get; set; }
public List<string> values { get; set; }
public List<MappingValue> mappings { get; set; }
public List<string> hierarchyPaths { get; set; }
public StrataSphereMappingValues()
{
mappings = new List<MappingValue>();
}
}
public class MappingValue
{
public string id { get; set; }
public string displayHierarchyName { get; set; }
public string text { get; set; }
public string name { get; set; }
public List<object> attributeValues { get; set; }
public List<string> hierarchyPaths { get; set; }
public MappingValue()
{
attributeValues = new List<object>();
hierarchyPaths = new List<string>();
}
}
public enum eStrataSphereItemCategory
{
Report,
Dashboard
}
public enum StrataSphereReportEnum
{
Report,
DSCubeReport,
SQLReport,
ClientReport
}
public class ReportDto
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Author { get; set; }
public eStrataSphereItemCategory Category => eStrataSphereItemCategory.Report;
public string Tagline =>
$"Report | {Module} | {DateCreated.ToString("MMM-dd-YYYY")} | {DownloadCount} downloads";
public StrataSphereReportEnum ReportType { get; set; }
public string Module { get; set; }
public string MinJazzVersion { get; set; }
public string MaxJazzVersion { get; set; }
public string ReportSetupJson { get; set; }
public List<Guid> DefinitionIds { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateLastModified { get; set; }
public int DownloadCount { get; set; }
public ReportDto()
{
ReportSetupJson = "{}";
DefinitionIds = new List<Guid>();
}
}
public class DefinitionDto
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Guid HierarchyGuid { get; set; }
public Guid DimensionGuid { get; set; }
public Guid AttributeGuid { get; set; }
public string HierarchyId { get; set; }
public string DimensionId { get; set; }
public string AttributeId { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateLastModified { get; set; }
}
public enum MDXMemberIDTypeEnum
{
Attribute,
Name,
Text,
Id,
HierarchyPath
}
public enum MDXFormatTypeEnum
{
None,
MDX,
Hierarchy,
MDXMemberId
}
public class MDXScoreToCubeDto
{
public string OrgPin { get; set; }
public Guid DatabaseGuid { get; set; }
public string ScoreDimensionName { get; set; }
public string ScoreHierarchyName { get; set; }
public string CubeDimensionName { get; set; }
public string CubeHierarchyName { get; set; }
public MDXMemberIDTypeEnum MDXMemberIDType { get; set; }
public MDXFormatTypeEnum MDXFormatType { get; set; }
}
public class ValueIDArray
{
public List<string> valueId { get; set; }
}
public class DSCubeSearchCondition
{
public string FilterOp { get; set; }
public string SearchType { get; set; }
public string Value2 { get; set; }
public string Value { get; set; }
public ValueIDArray ValueIDArray { get; set; }
}
public class SearchConditions
{
public DSCubeSearchCondition DSCubeSearchCondition { get; set; }
}
public class DSCubeSearchParameterValue
{
public string ParameterGUID { get; set; }
public string ParameterValueGUID { get; set; }
public SearchConditions SearchConditions { get; set; }
}
public class Root
{
public DSCubeSearchParameterValue DSCubeSearchParameterValue { get; set; }
}
public class RootObject
{
public Root root { get; set; }
}
#region StrataSphereAdHocReportSetup
public interface IStrataSphereAdHocReportSectionItem
{
string Name { get; set; }
bool IsOnChartXAxis { get; set; }
bool IsOnChartYAxis { get; set; }
}
internal class StrataSphereAdHocReportAttribute : IStrataSphereAdHocReportSectionItem
{
public StrataSphereAdHocReportAttribute()
{
}
public string AttributeId { get; set; }
public string DimensionId { get; set; }
public int Index { get; set; }
public string Name { get; set; }
public IList<string> FilterMembers { get; set; }
public int VisibilityStatusValue { get; set; }
public bool ShowSubtotal { get; set; }
public bool IsOnChartXAxis { get; set; }
public bool IsOnChartYAxis { get; set; }
// section level filters
public List<object> Parameters { get; set; } = new List<object>();
//public List<StrataSphereAdHocReportParameter> Parameters { get; set; } = new List<StrataSphereAdHocReportParameter>();
}
internal class StrataSphereAdHocReportCalculation : IStrataSphereAdHocReportSectionItem
{
public StrataSphereAdHocReportCalculation()
{
}
public string Name { get; set; }
public string CalcType { get; set; }
public int DisplayOrder { get; set; }
public string DisplayFormat { get; set; }
public int ColumnWidth { get; set; }
public string CalculationJson { get; set; }
public string CssClass { get; set; }
public bool IsAttributeMember { get; set; }
public bool IsOnChartXAxis { get; set; }
public bool IsOnChartYAxis { get; set; }
public List<StrataSphereAdHocReportConditionalFormat> ConditionalFormats { get; set; } = new List<StrataSphereAdHocReportConditionalFormat>();
}
internal class StrataSphereAdHocReportConditionalFormat
{
public StrataSphereAdHocReportConditionalFormat()
{
}
public string Comment { get; set; }
public int DisplayOrder { get; set; }
public ReportTupleInfo ColumnTupleInfo { get; set; }
public string CssClass { get; set; }
public string ValueToCompareAsString { get; set; }
public int OperatorValue { get; set; }
}
internal class StrataSphereAdHocReportConfig
{
public string Title { get; set; }
public string Description { get; set; }
public string[] Colors { get; set; }
public AxisSetting AxisSettings { get; set; }
public string XType { get; set; }
public bool YAxisMultiSelect { get; set; }
public Guid XAxisSectionItemGuid { get; set; }
public List<Guid> YAxisSectionItemGuids { get; set; } = new List<Guid>();
public StrataSphereAdHocReportConfig(BaseConfig source)
{
if (source == null) return;
Title = source.Title;
Description = source.Description;
Colors = source.Colors;
AxisSettings = source.AxisSettings;
XType = source.XType;
YAxisMultiSelect = source.YAxisMultiSelect;
}
public BaseConfig GetChartConfig()
{
var chartConfig = default(BaseConfig);
/*
// Try decoding the xType by the name first
var asm = typeof(AreaConfig).Assembly;
var type = asm.GetType($"{asm.GetName().Name}.Reporting.ChartConfigs.{XType}");
if (type != null)
{
chartConfig = (BaseConfig)Activator.CreateInstance(type);
}
else // if that failed then use the hard coded selector, this is an issue if new types are supported
{
switch (XType)
{
case "AreaConfig":
chartConfig = new AreaConfig();
break;
case "BarConfig":
chartConfig = new BarConfig();
break;
case "BubbleConfig":
chartConfig = new BubbleConfig();
break;
case "ColumnConfig":
chartConfig = new ColumnConfig();
break;
case "ComboColumnAndLineConfig":
chartConfig = new ComboColumnAndLineConfig();
break;
case "ComboColumnAndLineWithSecondaryAxisConfig":
chartConfig = new ComboColumnAndLineWithSecondaryAxisConfig();
break;
case "DonutConfig":
chartConfig = new DonutConfig();
break;
case "LineConfig":
chartConfig = new LineConfig();
break;
case "PieConfig":
chartConfig = new PieConfig();
break;
case "ScatterConfig":
chartConfig = new ScatterConfig();
break;
case "SplineConfig":
chartConfig = new SplineConfig();
break;
case "StackedBarConfig":
chartConfig = new StackedBarConfig();
break;
case "StackedBarPercentConfig":
chartConfig = new StackedBarPercentConfig();
break;
case "StackedColumnConfig":
chartConfig = new StackedColumnConfig();
break;
case "StackedColumnPercentConfig":
chartConfig = new StackedColumnPercentConfig();
break;
}
}
*/
if (chartConfig == null) return chartConfig;
chartConfig.Title = Title;
chartConfig.Description = Description;
chartConfig.Colors = Colors;
chartConfig.AxisSettings = AxisSettings;
// if (chartConfig is XYConfig xyConfig)
// {
// xyConfig.XAxisSectionItemGuid = XAxisSectionItemGuid;
// xyConfig.YAxisSectionItemGuids.AddRange(YAxisSectionItemGuids);
// }
return chartConfig;
}
}
internal class StrataSphereAdHocReportDataSource
{
public StrataSphereAdHocReportDataSource()
{
}
public Guid DataSourceGuid { get; set; }
public string Name { get; set; }
public int DataSourceType { get; set; }
}
internal class StrataSphereAdHocReportMeasure : IStrataSphereAdHocReportSectionItem
{
public StrataSphereAdHocReportMeasure()
{
}
public string MeasureId { get; set; }
public string Name { get; set; }
public int Index { get; set; }
public string DisplayFormat { get; set; }
public int ColumnWidth { get; set; }
public bool IsOnChartXAxis { get; set; }
public bool IsOnChartYAxis { get; set; }
// section level filters
public List<StrataSphereAdHocReportParameter> Parameters { get; set; } = new List<StrataSphereAdHocReportParameter>();
public List<StrataSphereAdHocReportConditionalFormat> ConditionalFormats { get; set; } = new List<StrataSphereAdHocReportConditionalFormat>();
}
internal class StrataSphereAdHocReportSection
{
public StrataSphereAdHocReportSection()
{
}
public string Name { get; set; }
public bool IsOnColumn { get; set; }
public int DisplayOrder { get; set; }
public bool IsTimeRelative { get; set; }
public bool IsFinancialReportSectionHidable { get; set; }
public bool IsMergingRepeatHeader { get; set; }
public bool IsSpaceAbove { get; set; }
public bool IsHidden { get; set; }
public string DisplayLabel { get; set; }
public bool ShowSectionLabel { get; set; }
public bool ShowGrandTotal { get; set; }
public bool IsAutoNameFilter { get; set; }
public bool ShowMargin { get; set; }
public List<object> Attributes { get; set; } = new List<object>();
public List<object> Measures { get; set; } = new List<object>();
public List<object> Calculations { get; set; } = new List<object>();
}
internal class StrataSphereAdHocReportSetup
{
public string Style { get; set; }
public StrataSphereAdHocReportSortArgs SortArgs { get; set; }
public List<StrataSphereAdHocReportDataSource> DataSources { get; set; } = new List<StrataSphereAdHocReportDataSource>();
public StrataSphereAdHocReportConfig ChartConfig { get; set; } = null;
public List<StrataSphereAdHocReportSection> Sections { get; set; } = new List<StrataSphereAdHocReportSection>();
public List<StrataSphereAdHocReportParameter> Parameters { get; set; } = new List<StrataSphereAdHocReportParameter>();
public List<StrataSphereAdHocScoreDimensionInfo> ServiceLines { get; set; } =
new List<StrataSphereAdHocScoreDimensionInfo>();
}
public class StrataSphereAdHocReportSortArgs
{
public StrataSphereAdHocReportTupleInfo TupleInfo { get; set; }
public bool IsAscending { get; set; }
public int SortCount { get; set; }
public int Top { get; set; }
public bool IsTopPercent { get; set; }
public bool IsIncludeAllOthers { get; set; }
public StrataSphereAdHocReportSortArgs()
{
TupleInfo = new StrataSphereAdHocReportTupleInfo();
}
}
public class StrataSphereAdHocReportTupleInfo
{
public Dictionary<string, string> PartialRowTuple { get; set; }
public Dictionary<string, string> PartialColTuple { get; set; }
public string MainMeasureName { get; private set; }
public string RowMeasureName { get; set; }
public string ColMeasureName { get; set; }
public Guid ColMeasureGUID { get; set; }
public string FormatString { get; set; }
public int rowIndex { get; set; }
public int colIndex { get; set; }
public Guid ColumnSectionGUID { get; set; }
public IAdHocReportSectionMeasure MainMeasure { get; set; }
public StrataSphereAdHocReportTupleInfo()
{
PartialRowTuple = new Dictionary<string, string>();
PartialColTuple = new Dictionary<string, string>();
ColumnSectionGUID = Guid.Empty;
ColMeasureGUID = Guid.Empty;
}
public StrataSphereAdHocReportTupleInfo(ReportTupleInfo tupleInfo)
: this()
{
if (tupleInfo == null) return;
tupleInfo.PartialRowTuple.Keys.ToList()
.ForEach(key => PartialRowTuple.Add(key, tupleInfo.PartialRowTuple[key]));
tupleInfo.PartialColTuple.Keys.ToList()
.ForEach(key => PartialColTuple.Add(key, tupleInfo.PartialColTuple[key]));
//MainMeasure = tupleInfo.MainMeasure;
MainMeasureName = tupleInfo.MainMeasureName;
RowMeasureName = tupleInfo.RowMeasureName;
ColMeasureName = tupleInfo.ColMeasureName;
ColMeasureGUID = tupleInfo.ColMeasureGUID;
FormatString = tupleInfo.FormatString;
rowIndex = tupleInfo.rowIndex;
colIndex = tupleInfo.colIndex;
ColumnSectionGUID = tupleInfo.ColumnSectionGUID;
}
public static implicit operator ReportTupleInfo(StrataSphereAdHocReportTupleInfo tupleInfo)
{
if (tupleInfo == null) return null;
var result = new ReportTupleInfo
{
PartialRowTuple = new Dictionary<string, string>(),
PartialColTuple = new Dictionary<string, string>(),
MainMeasure = tupleInfo.MainMeasure?.CopyMeasure(),
RowMeasureName = tupleInfo.RowMeasureName,
ColMeasureName = tupleInfo.ColMeasureName,
ColMeasureGUID = tupleInfo.ColMeasureGUID,
FormatString = tupleInfo.FormatString,
rowIndex = tupleInfo.rowIndex,
colIndex = tupleInfo.colIndex,
ColumnSectionGUID = tupleInfo.ColumnSectionGUID
};
tupleInfo.PartialRowTuple.Keys.ToList()
.ForEach(key => result.PartialRowTuple.Add(key, tupleInfo.PartialRowTuple[key]));
tupleInfo.PartialColTuple.Keys.ToList()
.ForEach(key => result.PartialColTuple.Add(key, tupleInfo.PartialColTuple[key]));
return result;
}
}
internal interface IStrataReportParameter
{
string DimensionId { get; set; }
string AttributeId { get; set; }
}
internal abstract class StrataSphereAdHocReportParameter : IStrataReportParameter
{
protected StrataSphereAdHocReportParameter()
{
}
public string Name { get; set; }
public string DimensionId { get; set; }
public string AttributeId { get; set; }
public string MeasureId { get; set; }
public int DisplayOrder { get; set; }
public bool IsUserEditable { get; set; }
public bool IsAttributeParameter => string.IsNullOrWhiteSpace(MeasureId);
}
public class StrataSphereAdHocScoreDimensionInfo
{
public Guid DimensionGUID { get; set; }
public string FriendlyName { get; set; }
public string GlobalID { get; set; }
public string AttributeId { get; set; }
public string MDXMemberID { get; set; }
public bool IsRollup { get; set; }
internal Regex ServiceLineRegex = new Regex(@"^Service Line (\d)$", RegexOptions.IgnoreCase);
// internal string MDXMemberName => AnalysisServicesUtils.GetHierarchyMDXName("Patient Encounter",
// ServiceLineRegex.IsMatch(FriendlyName) && IsRollup
// ? $"{ServiceLineRegex.Replace(FriendlyName, "Service Line Rollup ${1}")}"
// : $"{FriendlyName}{(IsRollup ? " Rollup" : "")}");
internal string Name => $"Patient Encounter - {FriendlyName}{(IsRollup ? " Rollup" : "")}";
internal StrataSphereAdHocScoreDimensionInfo()
{
MDXMemberID = string.Empty;
IsRollup = false;
}
}
#endregion
#region Other Stuff
public interface IAdHocReportSectionMeasure //: IAdHocReportSectionItem
{
string ColumnName { get; set; }
string DisplayFormat { get; }
string CSSClass { get; }
List<Guid> LinkedSectionGUIDs { get; }
void Hide();
string MeasureID { get; }
bool IsPartial { get; }
bool IsAttributeMember { get; }
eAggregateFunction AggregationTypeEnum { get; }
IAdHocReportSectionMeasure CopyMeasure();
}
public interface ITGuid<T>
{
Guid Value { get; set; }
bool IsEmpty { get; set; }
}
public enum eClientReportSectionItemType
{
Attribute = 0,
Hierarchy = 1,
Measure = 2,
Calculation = 3
}
public enum eReportDrilldownStatus
{
None = 0,
Drilldown = 1,
Drillup = 2
}
public enum eClientReportVisibilityStatus
{
Hidden = 0,
CompletelyVisible = 1,
PartiallyVisible = 2
}
public enum eAggregateFunction
{
Sum = 0,
Count = 1,
Avg = 2,
Min = 3,
Max = 4,
None = 5
}
public interface IAdHocReportSectionAttribute //: IAdHocReportSectionItem
{
ITGuid<IAdHocReportSectionAttribute> AttributeGUIDTyped { get; }
string DimensionID { get; }
string AttributeID { get; }
bool ShowSubtotal { get; set; }
SortOrder SortOrder { get; }
eClientReportVisibilityStatus VisibilityStatus { get; set; }
eReportDrilldownStatus DrilldownStatus { get; set; }
string FilterMemberCSV { get; set; }
List<string> FilterMembers { get; set; }
List<string> FilterMembersVisible { get; }
}
public class ReportTupleInfo
{
public ReportTupleInfo()
{
this.PartialRowTuple = new Dictionary<string, string>();
this.PartialColTuple = new Dictionary<string, string>();
}
private Dictionary<string, string> _Tuple;
public Dictionary<string, string> Tuple
{
get
{
return _Tuple;
}
set { _Tuple = value; }
}
public Dictionary<string, string> PartialRowTuple { get; set; }
public Dictionary<string, string> PartialColTuple { get; set; }
public string MainMeasureName { get; private set; }
private IAdHocReportSectionMeasure _MainMeasure;
public IAdHocReportSectionMeasure MainMeasure
{
get { return _MainMeasure; }
set
{
_MainMeasure = value;
MainMeasureName = (value == null) ? string.Empty : value.ColumnName;
}
}
public string RowMeasureName { get; set; }
public string ColMeasureName { get; set; }
public Guid ColMeasureGUID { get; set; }
public string FormatString { get; set; }
public int rowIndex { get; set; }
public int colIndex { get; set; }
public Guid ColumnSectionGUID { get; set; }
}
public class AxisSetting
{
public string XAxisLabel { get; set; }
public string YAxisLabel { get; set; }
public double? YAxisLowerBound { get; set; }
public double? YAxisUpperBound { get; set; }
public double? YAxisTickInterval { get; set; }
public double? YAxisPlotLineValue { get; set; }
public bool ShowDataLabel { get; set; }
public override bool Equals(object obj)
{
var config = (AxisSetting)obj;
if (config == null) return false;
if (config.XAxisLabel != this.XAxisLabel) return false;
if (config.YAxisLabel != this.YAxisLabel) return false;
if (config.YAxisLowerBound != this.YAxisLowerBound) return false;
if (config.YAxisUpperBound != this.YAxisUpperBound) return false;
if (config.YAxisTickInterval != this.YAxisTickInterval) return false;
if (config.YAxisPlotLineValue != this.YAxisPlotLineValue) return false;
if (config.ShowDataLabel != this.ShowDataLabel) return false;
return true;
}
}
public abstract class BaseConfig
{
public abstract DataTable GetData(object report);
public abstract string Name { get; }
public string Title { get; set; }
public string Description { get; set; }
public string[] Colors { get; set; }
public AxisSetting AxisSettings { get; set; }
public virtual string IconName { get { return ""; } }
public virtual string XType { get { return ""; } }
public virtual string SectionName { get { return ""; } }
public virtual int ColumnNumber { get { return -1; } }
public virtual int RowNumber { get { return -1; } }
public virtual bool YAxisMultiSelect { get { return true; } }
protected BaseConfig()
{
this.Colors = new string[] { };
this.AxisSettings = new AxisSetting();
}
public override bool Equals(object obj)
{
var config = (BaseConfig)obj;
if (config == null) return false;
if (config.Title != Title || config.Description != Description) return false;
if (config.Colors.Length != Colors.Length) return false;
if (config.Colors.Any(p => !Colors.Contains(p))) return false;
if (!config.AxisSettings.Equals(this.AxisSettings)) return false;
if (config.GetType().Name != this.GetType().Name) return false;
return true;
}
}
#endregion
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,107 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>Flurl</NuGetReference>
<NuGetReference>Flurl.Http</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Flurl</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Threading.Tasks</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>Flurl.Http</Namespace>
</Query>
private string baseUrl;
void Main()
{
baseUrl = "https://api-dev.sdt.local/StrataSphere.Web.API.Service//api/v1/";
GetDefinitions().Dump();
GetDefinitionsAsync().Dump();
}
// Define other methods and classes here
public async Task<IEnumerable<DefinitionDto>> GetDefinitionsAsync()
{
return await GetTAsync<DefinitionDto>("Definitions");
}
public async Task<IEnumerable<T>> GetTAsync<T>(string pathSegment)
{
var flurlRequest = baseUrl.AppendPathSegment(pathSegment).GetJsonAsync<IEnumerable<T>>();
//flurlRequest.Wait();
await flurlRequest;
while (!flurlRequest.IsCompleted)
{
if (flurlRequest.Exception != null) return new List<T>();
}
var result = flurlRequest.Result;
return result;
}
public IEnumerable<DefinitionDto> GetDefinitions()
{
return Task.Run(async () => GetDefinitionsAsync().Result).Result;
}
public class DefinitionDto
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Guid DimensionGuid { get; set; }
public Guid AttributeGuid { get; set; }
public string DimensionId { get; set; }
public string AttributeId { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateLastModified { get; set; }
}
@@ -0,0 +1,72 @@
<Query Kind="Statements">
<Connection>
<ID>77b65bea-e766-4e3c-a1ed-c4c2534b6019</ID>
<Persist>true</Persist>
<Server>D0001-SQL-01.sdt.local</Server>
<Database>jazz dev master</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel.Composition</Namespace>
<Namespace>System.ComponentModel.Composition.Hosting</Namespace>
<Namespace>System.ComponentModel.Composition.Primitives</Namespace>
<Namespace>System.ComponentModel.Composition.ReflectionModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Net.Http</Namespace>
<Namespace>System.Net.Http.Headers</Namespace>
<Namespace>System.Numerics</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
Definitions
.OrderBy(d => d.ObjectType)
.ThenBy(d => d.Name)
.Dump();
@@ -0,0 +1,66 @@
<Query Kind="Expression">
<Connection>
<ID>463c2997-8a6a-4688-9575-6549e5215f7b</ID>
<Persist>true</Persist>
<Server>D0011-SQL-01.sdt.local</Server>
<Database>StrataSphere</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
from ri in ReportItems
join rci in ReportCardItems on ri.ReportCardItemId equals rci.Id
orderby ri.ReportId, rci.ReportCardItemType, rci.Name
where (!(from rcm in ReportCardMatches where rcm.ReportCardItemId == ri.ReportCardItemId && rcm.DatabaseGuid == Guid.Parse("9BC301F9-66C3-48AA-81E7-114F88A449EA") select rcm).Any())
select new { ri.ReportId, rci.Id, rci.Name, rci.ReportCardItemType, rci.ReportType, rci.ReportCardItemDataJson }
+176
View File
@@ -0,0 +1,176 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>RestSharp</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>RestSharp</Namespace>
<Namespace>System.Dynamic</Namespace>
</Query>
private string BaseUrl = "https://api-prod.sdt.local/StrataSphere.Web.API.Service/api/v1/";
void Main()
{
RestClient client = new RestClient();
var reports = GetList<ReportDto>(client, "Reports");
var setups = reports.ToList()
.Select(rpt => GetList(client, $"Reports\\{rpt.Id}\\Setup"));
var attributes = setups.SelectMany(s => (s.Sections as List<dynamic>).Select(x => (x.Attributes as List<dynamic>)));
//attributes.Dump();
var results = attributes
.SelectMany(a => a.Select(x => new AttributeInfo
{
DimensionId = x.DimensionId,
AttributeId = x.AttributeId,
Name = x.Name,
Parameters = (x.Parameters as List<dynamic>)
.ConvertAll(p => new AttributeInfo
{
DimensionId = p.DimensionId,
AttributeId = p.AttributeId,
MeasureId = p.MeasureId,
DisplayOrder = p.DisplayOrder,
Name = p.Name
}).OrderBy(p => p.DisplayOrder)
})).GroupBy(x => x.ToString(), (grp, data) => data.First())
.OrderBy(a => a.Name);
results.Dump();
}
public class AttributeInfo
{
public string DimensionId { get; set; }
public string AttributeId { get; set; }
public string MeasureId { get; set; }
public long DisplayOrder { get; set; } = 0;
public string Name { get; set; }
public IEnumerable<AttributeInfo> Parameters { get; set; }
public override bool Equals(object obj)
{
var test = obj as AttributeInfo;
if (test == null) return false;
return test.Name == Name && test.DimensionId == DimensionId && test.AttributeId == AttributeId;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public override string ToString()
{
return $"{Name} {DimensionId} {AttributeId} {DisplayOrder} {(Parameters?.Aggregate("", (x, y) => $"{x} {y.ToString()}") ?? "")}";
}
}
dynamic GetList(RestClient client, string something)
{
client.BaseUrl = new Uri(BaseUrl + something);
RestRequest request = new RestRequest();
request.Method = Method.GET;
var converter = new ExpandoObjectConverter();
return JsonConvert.DeserializeObject<ExpandoObject>(client.Execute(request).Content, converter);
}
IEnumerable<T> GetList<T>(RestClient client, string something)
{
return Get<List<T>>(client, something);
}
T Get<T>(RestClient client, string something)
{
client.BaseUrl = new Uri(BaseUrl + something);
RestRequest request = new RestRequest();
request.Method = Method.GET;
return JsonConvert.DeserializeObject<T>(client.Execute(request).Content);
}
public enum eStrataSphereItemCategory
{
Report,
Dashboard
}
public enum StrataSphereReportEnum
{
Report,
DSCubeReport,
SQLReport,
ClientReport
}
public class ReportDto
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Author { get; set; }
public eStrataSphereItemCategory Category => eStrataSphereItemCategory.Report;
public string Tagline =>
$"Report | {Module} | {DateCreated.ToString("MMM-dd-YYYY")} | {DownloadCount} downloads";
public StrataSphereReportEnum ReportType { get; set; }
public string Module { get; set; }
public string MinJazzVersion { get; set; }
public string MaxJazzVersion { get; set; }
public string ReportSetupJson { get; set; }
public List<Guid> DefinitionIds { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateLastModified { get; set; }
public int DownloadCount { get; set; }
public ReportDto()
{
ReportSetupJson = "{}";
DefinitionIds = new List<Guid>();
}
}
+239
View File
@@ -0,0 +1,239 @@
<Query Kind="Program">
<Connection>
<ID>77b65bea-e766-4e3c-a1ed-c4c2534b6019</ID>
<Persist>true</Persist>
<Server>D0001-SQL-11.sdt.local</Server>
<Database>jazz dev master Prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
private string tableQuery = @"SELECT c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE
, CAST(CASE WHEN ccu.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END AS BIT) IsPrimaryKey
FROM INFORMATION_SCHEMA.COLUMNS AS c
LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc ON tc.TABLE_SCHEMA = c.TABLE_SCHEMA AND tc.TABLE_NAME = c.TABLE_NAME
LEFT OUTER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu ON ccu.TABLE_SCHEMA = tc.TABLE_SCHEMA AND ccu.TABLE_NAME = tc.TABLE_NAME AND ccu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME AND ccu.COLUMN_NAME = c.COLUMN_NAME
WHERE c.TABLE_SCHEMA in ('stratasphere')
AND (CASE c.TABLE_SCHEMA
WHEN 'stratasphere' THEN 1
ELSE
CASE WHEN c.TABLE_NAME IN ('DimCaseType', 'CaseTypeFamily', 'CaseTypeFamilyMapping', 'CaseTypeFamilyMappingAPRDRG', 'CaseTypeFamilyMappingICD10', 'CaseTypeFamilyMappingCPT', 'CaseTypeFamilyVersion')
THEN 1 ELSE 0 END END = 1)
AND c.DATA_TYPE NOT IN ('datetime','uniqueidentifier', 'timestamp')
AND NOT (c.COLUMN_NAME = 'RowID' and CAST(CASE WHEN ccu.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END AS BIT) = 1)
AND tc.CONSTRAINT_TYPE = 'Primary Key'
ORDER BY c.TABLE_NAME, c.ORDINAL_POSITION";
private List<OrderByInformation> OrderByStatements;
private List<ColumnsToExclude> ColumnsToBeExcluded;
void Main()
{
OrderByStatements = new List<OrderByInformation>
{
new OrderByInformation{
TableName = "cci.InitiativeWorkflowHistory",
OrderBy = "\r\nOrder By OBJ.FromStep, OBJ.ToStep"
},
new OrderByInformation{
TableName = "cci.VariationEncounterSavingInfo",
OrderBy = "\r\nOrder By OBJ.EncounterRecordNumber, OBJ.PhysicianID"
},
new OrderByInformation{
TableName = "stratasphere.MDXScoreToCube",
OrderBy = "\r\nOrder By OBJ.OrgPin, OBJ.ScoreDimensionName, ScoreHierarchyName"
}
};
ColumnsToBeExcluded = new List<ColumnsToExclude> {
new ColumnsToExclude{
TableName = "stratasphere.MDXScoreToCube",
ColumnNames = new [] {"DateCreated", "DateLastModified"}
}
};
var conn = new Tuple<string, string>("D0011-SQL-01.sdt.local", "stratasphere");
var q = GetQueries(conn);
var connections = new ServerInstance[] {
new ServerInstance("D0011-SQL-01.sdt.local","stratasphere", q.Select(r => r.TableName).ToArray()),
new ServerInstance("E0001-SQL-11.sdt.local", "stratasphere", q.Select(r => r.TableName).ToArray() )
}.ToList();
var sql = string.Join("\r\n", q.Select(r => r.SqlSelect));
var dataLegacy = GetData(connections[0], sql);
var dataUpdate = GetData(connections[1], sql);
foreach (var dt in Enumerable.Range(0, dataLegacy.Tables.Count))
{
var legacy = dataLegacy.Tables[dt].Rows;
var update = dataUpdate.Tables[dt].Rows;
var idxCount = legacy.Count;
var compare = new List<Tuple<DataRow, DataRow>>();
foreach (var row in Enumerable.Range(0, idxCount))
{
var r = legacy[row];
if (row < update.Count)
{
var u = update[row];
var rJson = JsonConvert.SerializeObject(r.ItemArray);
var uJson = JsonConvert.SerializeObject(u.ItemArray);
if (rJson != uJson)
{
compare.Add(new Tuple<DataRow, DataRow>(r, u));
}
}
else
{
compare.Add(new Tuple<DataRow, DataRow>(r, null));
}
}
if (compare.Any())
{
compare.Dump(dataLegacy.Tables[dt].TableName, 2);
}
else
{
"No differences found in data".Dump(dataLegacy.Tables[dt].TableName);
}
}
}
// Define other methods and classes here
public class ServerInstance
{
public string Server { get; set; }
public string Database { get; set; }
public IEnumerable<string> TableNames { get; set; }
public ServerInstance(string server, string database, string[] tableNames)
{
Server = server;
Database = database;
TableNames = tableNames;
}
}
public class OrderByInformation
{
public string TableName { get; set; }
public string OrderBy { get; set; }
}
public class ColumnsToExclude
{
public string TableName { get; set; }
public IEnumerable<string> ColumnNames { get; set; }
}
public List<SqlInformation> GetQueries(Tuple<string, string> connection)
{
var server = connection.Item1;
var database = connection.Item2;
var sql = tableQuery;
var connStr = $"data source={server};initial catalog='{database}';persist security info=True;Integrated Security=SSPI;";
using (var conn = new SqlConnection(connStr))
{
var dataset = new DataTable();
var adapter = new SqlDataAdapter(sql, conn);
adapter.Fill(dataset);
var items = dataset.AsEnumerable().Select(r => r).ToList().ConvertAll(r => r.ItemArray)
.Select(r => new InformationSchema { schema = (string)r[0], table = (string)r[1], column = (string)r[2], datatype = (string)r[3], isPrimaryKey = (bool)r[4] })
.Where(r => !ColumnsToBeExcluded.SingleOrDefault(ctbe => ctbe.TableName == r.schemaTable)?.ColumnNames.Contains(r.column) ?? true)
.GroupBy(r => new { r.schema, r.table }, (t, c) =>
new SqlInformation
{
TableName = $"{t.schema}.{t.table}",
SqlSelect = "Select\r\n" + c.Aggregate("", (x, y) => $"{x}, obj.{y.column}\r\n").Substring(1) + $" FROM {t.schema}.{t.table} OBJ"
+ OrderByStatements.SingleOrDefault(obs => obs.TableName.Equals($"{t.schema}.{t.table}", StringComparison.CurrentCultureIgnoreCase))?.OrderBy ?? ""
+ ";"
})
.ToList();
return items;
}
}
public class SqlInformation
{
public string TableName { get; set; }
public string SqlSelect { get; set; }
}
public class InformationSchema
{
public string schema { get; set; }
public string table { get; set; }
public string column { get; set; }
public string datatype { get; set; }
public bool isPrimaryKey { get; set; }
public string schemaTable => $"{schema}.{table}";
}
public DataSet GetData(ServerInstance serverInstance, string sql)
{
var server = serverInstance.Server;
var database = serverInstance.Database;
var connStr = $"data source={server};initial catalog='{database}';persist security info=True;Integrated Security=SSPI;";
using (var conn = new SqlConnection(connStr))
{
var dataset = new DataSet();
var adapter = new SqlDataAdapter(sql, conn);
adapter.Fill(dataset);
var tableNames = serverInstance.TableNames;
var idx = 0;
foreach (var tableName in tableNames)
{
dataset.Tables[idx].TableName = tableName;
idx += 1;
}
return dataset;
}
}
+505
View File
@@ -0,0 +1,505 @@
<Query Kind="Program">
<Connection>
<ID>690bdbda-0918-4699-b08c-addb41e49702</ID>
<Persist>true</Persist>
<Server>E0001-sql-11.sdt.local</Server>
<Database>StrataSphere</Database>
<ShowServer>true</ShowServer>
</Connection>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Linq.Dynamic</Namespace>
</Query>
// This link provides a good explanation of the Dynamic Query used in the DataTableJoins
// https://ecs.syr.edu/faculty/fawcett/handouts/CoreTechnologies/CSharp/samples/CSharpSamples/LinqSamples/DynamicQuery/Dynamic%20Expressions.html
//
private List<TablesAndColumns> SchemasAndTablesToReview = new List<TablesAndColumns>();
#region Options
public static int TopRows = 2000; //int.MaxValue;
public static bool ShowTableQuery = false;
public static bool ShowTableList = false;
public static int TableDumpDepth = int.MaxValue; //2;
#endregion
void Main()
{
SchemasAndTablesToReview.AddRange(new[]
{
new TablesAndColumns("stratasphere", null),
});
var tables = GetTables().ToList();
// Using 'D|' at the beginning of a column name implies that the sort order is descending for that column
tables.ForEach(table =>
{
switch (table.TableName)
{
case "Dashboard":
table.Init(
new[] { new OrderBy("Name"), new OrderBy("Module"), new OrderBy("MinJazzVersion") },
new[] { "Id", "DateCreated", "DateLastModified" },
new[] { "Name", "Module", "MinJazzVersion" }
);
break;
case "DashboardCardItem":
table.Init(
new[] { new OrderBy("Name") },
new[] { "ItemId", "DateCreated", "DateLastModified" },
new[] { "Name", "DashboardCardItemType" }
);
break;
case "Definition":
table.Init(
new[] { new OrderBy("Name"), new OrderBy("DimensionId"), new OrderBy("AttributeId") },
new[] { "Id", "DateCreated", "DateLastModified" },
new[] { "Name", "DimensionId", "AttributeId" }
);
break;
case "Download":
table.Init(
new[] { new OrderBy("UserName"), new OrderBy("DownloadType") },
new[] { "DownloadDateTime" },
new[] { "UserName", "DownloadType" },
null,
"OBJ.UserName <> 'System'"
);
break;
case "MDXScoreToCube":
table.Init(
new[] { new OrderBy("OrgPin"), new OrderBy("ScoreDimensionName"), new OrderBy("ScoreHierarchyName") },
new[] { "DateCreated", "DateLastModified" },
new[] { "OrgPin", "ScoreDimensionName", "ScoreHierarchyName" }
);
break;
case "Parameter":
table.Init(
new[] { new OrderBy("Name"), new OrderBy("ParameterType"), new OrderBy("DisplayOrder"), new OrderBy("DimensionName"), new OrderBy("AttributeName") },
new[] { "DateCreated", "DateLastModified" },
new[] { "Name", "ParameterType", "DimensionName", "AttributeName" },
new[] { "ParameterJson" }
);
break;
case "Report":
table.Init(
new[] { new OrderBy("Name"), new OrderBy("Module"), new OrderBy("MinJazzVersion") },
new[] { "ItemId", "DownloadCount", "DateCreated", "DateLastModified" },
new[] { "Name", "Module", "MinJazzVersion", "ReportType" },
new[] { "ReportSetupJson" }
);
break;
};
});
if (ShowTableList) tables.Dump(nameof(tables));
var connections = new Connections
{
Legacy = new ServerInstance("E0001-SQL-11.sdt.local", "StrataSphere"),
Update = new ServerInstance("D0011-SQL-01.sdt.local", "StrataSphere")
// Legacy = new ServerInstance("D0011-SQL-01.sdt.local", "jazz tst Southern Illinois 20190918.1"),
// Update = new ServerInstance("D0011-SQL-01.sdt.local", "jazz tst Southern Illinois 20200331.1")
// Legacy = new ServerInstance("D0001-SQL-11.sdt.local", "jazz tst master prod 20190708.1"),
// Update = new ServerInstance("D0001-SQL-11.sdt.local", "jazz tst master prod")
};
DoTheComparisons(connections, tables);
}
// Define other methods and classes here
#region Gather Table Information
public string GetTableQuery()
{
var tableSchemas = string.Join(", ", SchemasAndTablesToReview.Select(sattr => $"'{sattr.SchemaName}'"));
var tableList = string.Join("\r\n", SchemasAndTablesToReview.ConvertAll(sattr =>
{
if (sattr.TableNames?.Any(cn => cn == "*") ?? true)
{
return $"WHEN c.TABLE_SCHEMA = '{sattr.SchemaName}' THEN 1";
}
else
{
return $"WHEN c.TABLE_SCHEMA = '{sattr.SchemaName}' AND c.TABLE_NAME IN ({string.Join(", ", sattr.TableNames.Select(cn => $"'{cn}'"))}) THEN 1";
}
}));
return $@"SELECT c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE
, CAST(CASE WHEN ccu.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END AS BIT) IsPrimaryKey
FROM INFORMATION_SCHEMA.COLUMNS AS c
LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc ON tc.TABLE_SCHEMA = c.TABLE_SCHEMA AND tc.TABLE_NAME = c.TABLE_NAME
LEFT OUTER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu ON ccu.TABLE_SCHEMA = tc.TABLE_SCHEMA AND ccu.TABLE_NAME = tc.TABLE_NAME AND ccu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME AND ccu.COLUMN_NAME = c.COLUMN_NAME
WHERE c.TABLE_SCHEMA in ({tableSchemas})
AND (CASE
{tableList}
ELSE 0
END = 1)
AND c.DATA_TYPE NOT IN ('datetime','uniqueidentifier', 'timestamp')
AND NOT (c.COLUMN_NAME = 'RowID' and CAST(CASE WHEN ccu.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END AS BIT) = 1)
AND tc.CONSTRAINT_TYPE = 'Primary Key'
ORDER BY c.TABLE_NAME, c.ORDINAL_POSITION";
}
public IList<Table> GetTables()
{
var tableQuery = GetTableQuery();
if (ShowTableQuery) tableQuery.Dump(nameof(tableQuery));
return ExecuteQueryDynamic(tableQuery)
.GroupBy(x => new { x.TABLE_SCHEMA, x.TABLE_NAME },
(g, d) => new Table(g.TABLE_SCHEMA, g.TABLE_NAME,
d.Select(y => new Column(y.COLUMN_NAME, y.DATA_TYPE, y.IsPrimaryKey)).ToList()))
.ToList();
}
public class Table
{
public string SchemaName { get; set; }
public string TableName { get; set; }
public IList<Column> Columns { get; set; } = new List<Column>();
public IList<OrderBy> OrderBy { get; set; } = new List<OrderBy>();
public IList<string> Exclude { get; set; } = new List<string>();
public IList<string> KeyColumn { get; set; } = new List<string>();
public IList<string> Json { get; set; } = new List<string>();
public string Where { get; set; } = "";
internal string SchemaTable => $"{SchemaName}.{TableName}";
public string SqlSelect => $"select TOP({TopRows}) \r\n\t{SelectColumns}\r\nfrom {SchemaTable} OBJ{Where}{OrderByStatement}";
internal string SelectColumns => !Columns?.Any() ?? true ? "*" : string.Join(",\r\n\t", Columns.Where(c => !Exclude.ToList().Contains(c.ColumnName)).Select(c => c.ColumnName));
internal string OrderByStatement => !OrderBy?.Any() ?? true ? "" : "\r\nOrder By " + string.Join(", ", OrderBy.Select(ob => $"{ob.ColumnName}{(ob.IsDescending ? " DESC" : "")}"));
public Table(string schemaName, string tableName)
{
SchemaName = schemaName;
TableName = tableName;
Columns = new List<Column>();
OrderBy = new List<OrderBy>();
}
public Table(string schemaName, string tableName, IEnumerable<Column> columns)
: this(schemaName, tableName)
{
Columns = columns.ToList();
}
public Table(string schemaName, string tableName, IEnumerable<Column> columns, IEnumerable<OrderBy> orderBy)
: this(schemaName, tableName, columns)
{
OrderBy = orderBy.ToList();
}
/// <sumarry>
///
/// </summary>
/// <param name="oderBys">
/// Using 'D|' at the beginning of a column name implies that the sort order is descending for that column
/// <param>
public void Init(IEnumerable<OrderBy> orderBys, IEnumerable<string> excludes = null, IEnumerable<string> keyColumns = null, IEnumerable<string> jsonColumns = null, string where = "")
{
if (orderBys != null)
OrderBys(orderBys);
if (excludes != null)
Excludes(excludes);
if (keyColumns != null)
KeyColumns(keyColumns);
if (jsonColumns != null)
JsonColumns(jsonColumns);
if (!string.IsNullOrEmpty(where))
where = $"\r\nwhere {where}";
}
/// <sumarry>
/// Using 'D|' at the beginning of a column name implies that the sort order is descending for that column
/// </summary>
public void OrderBys(IEnumerable<OrderBy> orderBys)
{
OrderBy.Clear();
((List<OrderBy>)OrderBy).AddRange(orderBys.Where(o => Columns.Select(c => c.ColumnName).Contains(o.ColumnName, StringComparer.CurrentCultureIgnoreCase)));
}
public void Excludes(IEnumerable<string> excludes)
{
Exclude.Clear();
((List<string>)Exclude).AddRange(excludes.Where(e => Columns.Select(c => c.ColumnName).Contains(e, StringComparer.CurrentCultureIgnoreCase)));
}
public void KeyColumns(IEnumerable<string> keyColumns)
{
KeyColumn.Clear();
((List<string>)KeyColumn).AddRange(keyColumns.Where(kc => Columns.Select(c => c.ColumnName).Contains(kc, StringComparer.CurrentCultureIgnoreCase)));
}
public void JsonColumns(IEnumerable<string> jsonColumns)
{
Json.Clear();
((List<string>)Json).AddRange(jsonColumns.Where(jc => Columns.Select(c => c.ColumnName).Contains(jc, StringComparer.CurrentCultureIgnoreCase)));
}
}
public class Column
{
public string ColumnName { get; set; }
public string DataType { get; set; }
public bool IsPrimaryKey { get; set; }
public Column(string columnName, string dataType = "", bool isPrimaryKey = false)
{
ColumnName = columnName;
DataType = dataType;
IsPrimaryKey = isPrimaryKey;
}
}
public class OrderBy
{
public string ColumnName { get; set; }
public bool IsDescending { get; set; } = false;
public OrderBy(string columnName, bool isDescending = false)
{
ColumnName = columnName;
IsDescending = isDescending;
}
}
public class TablesAndColumns
{
public string SchemaName { get; set; }
public IEnumerable<string> TableNames { get; set; }
public TablesAndColumns(string schemaName, IEnumerable<string> tables)
{
SchemaName = schemaName;
TableNames = tables;
}
}
public class OrderByInformation
{
public string TableName { get; set; }
public IEnumerable<OrderBy> OrderBy { get; set; }
public OrderByInformation(string tableName, IEnumerable<string> columns)
{
TableName = tableName;
OrderBy = columns
.Select(c =>
new OrderBy(c.StartsWith("D|") ? c.Substring(2) : c,
c.StartsWith("D|")));
}
}
public class ColumnsToExclude
{
public string TableName { get; set; }
public IEnumerable<string> ColumnNames { get; set; }
public ColumnsToExclude(string tableName, IEnumerable<string> columns)
{
TableName = tableName;
ColumnNames = columns;
}
}
public class JsonColumns
{
public string TableName { get; set; }
public IEnumerable<string> ColumnNames { get; set; }
public JsonColumns(string tableName, IEnumerable<string> columns)
{
TableName = tableName;
ColumnNames = columns;
}
}
#endregion
#region Do the comparisons
public void DoTheComparisons(Connections connections, IEnumerable<Table> tables)
{
foreach (var table in tables)
{
var sql = table.SqlSelect;
var dataLegacy = GetData(connections.Legacy, sql, table.TableName);
var dataUpdate = GetData(connections.Update, sql, table.TableName);
var compare = new List<CompareSet>();
var jsonColumns = table.Json.ToList() ?? null;
dataLegacy.AsEnumerable().ToList()
.ForEach(legacyRow =>
{
DataRow updateRow = default(DataRow);
if (table.KeyColumn.Any())
{
var keys = string.Join("|", table.KeyColumn.Select(kc => $"{legacyRow.Field<object>(kc)}"));
updateRow = dataUpdate.AsEnumerable()
.FirstOrDefault(y => keys == string.Join("|", table.KeyColumn.Select(kc => $"{y.Field<object>(kc)}")));
}
if (updateRow == null || JsonConvert.SerializeObject(legacyRow.ItemArray) != JsonConvert.SerializeObject(updateRow.ItemArray))
compare.Add(new CompareSet(compare.Count, legacyRow, updateRow, jsonColumns));
});
dataUpdate.AsEnumerable().ToList()
.ForEach(updateRow =>
{
DataRow legacyRow = default(DataRow);
if (table.KeyColumn.Any())
{
var keys = string.Join("|", table.KeyColumn.Select(kc => $"{updateRow.Field<object>(kc)}"));
legacyRow = dataLegacy.AsEnumerable()
.FirstOrDefault(y => keys == string.Join("|", table.KeyColumn.Select(kc => $"{y.Field<object>(kc)}")));
}
if (legacyRow == null)
compare.Add(new CompareSet(compare.Count, legacyRow, updateRow, jsonColumns));
});
if (compare.Any())
{
compare.OrderBy(c => c.OrderBy)
.Dump($"{table.SchemaTable} ( {compare.Count()} / {dataLegacy.Rows.Count} / {dataUpdate.Rows.Count} rows )", TableDumpDepth);
}
else
{
"No differences found in data".Dump($"{table.SchemaTable} ( 0 / {dataLegacy.Rows.Count} / {dataUpdate.Rows.Count} rows )");
}
}
}
public class Connections
{
public ServerInstance Legacy { get; set; }
public ServerInstance Update { get; set; }
}
public class ServerInstance
{
public string Server { get; set; }
public string Database { get; set; }
public ServerInstance(string server, string database)
{
Server = server;
Database = database;
}
}
public DataTable GetData(ServerInstance serverInstance, string sql, string tableName)
{
var server = serverInstance.Server;
var database = serverInstance.Database;
var connStr = $"data source={server};initial catalog='{database}';persist security info=True;Integrated Security=SSPI;";
using (var conn = new SqlConnection(connStr))
{
var datatable = new DataTable();
var adapter = new SqlDataAdapter(sql, conn);
try
{
adapter.Fill(datatable);
}
catch (Exception)
{
sql.Dump(nameof(sql));
throw;
}
datatable.TableName = tableName;
return datatable;
}
}
public class CompareSet
{
internal int Row { get; set; }
internal IList<string> ColumnNames { get; set; }
internal IList<object> Legacy { get; set; }
internal IList<object> Update { get; set; }
internal int OrderBy { get; set; } = 0;
public IList<Row> Rows { get; set; }
internal IList<string> JsonColumns { get; set; }
public CompareSet(int row, DataRow right, DataRow left, IList<string> jsonColumns)
{
Row = ++row;
if (right == null)
{
ColumnNames = left.Table.Columns.Cast<DataColumn>().Select(dc => dc.ColumnName).ToList();
}
else
{
ColumnNames = right.Table.Columns.Cast<DataColumn>().Select(dc => dc.ColumnName).ToList();
}
Legacy = right?.ItemArray.ToList();
Update = left?.ItemArray.ToList();
OrderBy = (right != null ? 0 : 2) + (left != null ? 0 : 1);
JsonColumns = jsonColumns;
Rows = ColumnNames.Select((c, i) => new Row(row, c, Legacy?[i], Update?[i], JsonColumns?.Contains(c, StringComparer.CurrentCultureIgnoreCase) ?? false)).ToList();
}
public CompareSet(int row, DataRow right, DataRow left)
: this(row, right, left, null)
{
}
object ToDump() => new
{
Row = $"{Row}",
Rows = Rows.Select(x => new
{
Column = (x.Left ?? "").Equals(x.Right ?? "") ? (object)x.Column : new XElement("LINQPad.HTML", new XElement("div", new XAttribute("style", "background-color:lightyellow;color:black"), x.Column)),
Legacy = x.Left,
Update = x.Right
})
};
}
public class Row
{
public int RowId { get; set; }
public string Column;
public bool IsJson;
public object Left;
public object Right;
public Row(int row, string column, object left, object right)
{
RowId = row;
Column = column;
Left = left;
Right = right;
}
public Row(int row, string column, object left, object right, bool isJson)
: this(row, column, left, right)
{
IsJson = isJson;
if (!isJson) return;
if (left != null)
{
Left = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(left.ToString(),
new JsonSerializerSettings
{
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
args.ErrorContext.Handled = true;
}
}), Newtonsoft.Json.Formatting.Indented);
}
if (right != null)
{
Right = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(right.ToString(),
new JsonSerializerSettings
{
Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
{
args.ErrorContext.Handled = true;
}
}), Newtonsoft.Json.Formatting.Indented);
}
}
}
#endregion
@@ -0,0 +1,65 @@
<Query Kind="Statements">
<Connection>
<ID>4f885e7e-d8bb-427c-a54e-8e3e1c3137a7</ID>
<Persist>true</Persist>
<Server>IOAK-SQL-LOG-01.sdt.local</Server>
<Database>elog10 prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
(from log in ViewTaskEngineLogDetailed
where log.TaskName == "StarterSet Validator Task"
orderby log.TimeStamp descending
select new { log.TaskName, log.TaskEngineVersion, log.ServerName, log.DatabaseName, log.OrgPin, log.PhysicalName, log.Description}).Dump();
+128
View File
@@ -0,0 +1,128 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
var baseDir = @"D:\Git\Jazz";
var solution = Path.Combine(baseDir, "veracode.sln");
var regex = new Regex(@"[^=]*=\s+""([^""]*)"",\s""([^""]*)"".*");
var veracodeProjectFolders = File.ReadAllLines(solution)
.Where(l => l.StartsWith("Project("))
.Where(l => regex.Match(l).Success)
.ToList();
var fileTypes = new Regex(@"^\.vb$|^\.css?$|^\.jsx?$|^\.html$|^\.as[achmp]{1}x$|^\.xs[xd]{1}$");
//veracodeProjectFolders.Dump();
var vpnames = veracodeProjectFolders
.Where(l => !string.IsNullOrEmpty(regex.Replace(l, "$1")))
.ToDictionary(l => regex.Replace(l, "$1"), l => Path.GetDirectoryName(Path.Combine(baseDir, regex.Replace(l, "$2"))));
var vpf = vpnames.Values.ToList();
//vpnames.Dump();
//vpf.ConvertAll(v => Path.GetDirectoryName(Path.Combine(baseDir, v))).Dump();
baseDir = Path.Combine(baseDir, @"Code\");
var dirs = Directory.EnumerateDirectories(baseDir)
.Where(d => vpf.Contains(d))
.ToList()
.ConvertAll(d => d.Replace(baseDir, ""));
var fileSizes = new Dictionary<string, Dictionary<string, long>>();
var fileExtensions = new List<string>();
foreach (var dir in dirs)
{
var path = Path.Combine(baseDir, dir);
//$"{baseDir} + {dir} = {path}".Dump();
foreach (var file in Directory.GetFiles(path, "*.*", SearchOption.AllDirectories))
{
if (file.Contains(@"\obj\") || file.Contains(@"\bin\")) continue;
var fi = new FileInfo(file);
fileExtensions.Add(fi.Extension);
if (!fileTypes.IsMatch(fi.Extension)) continue;
var fDir = fi.DirectoryName.Replace(baseDir, "").Split(Path.DirectorySeparatorChar)[0];
var fSize = fi.Length;
if (!fileSizes.ContainsKey(dir))
fileSizes.Add(dir, new Dictionary<string, long>());
if (!fileSizes[dir].ContainsKey(fi.Extension))
fileSizes[dir].Add(fi.Extension, 0);
fileSizes[dir][fi.Extension] += fSize;
}
}
var report = fileSizes.Keys.ToList()
.ConvertAll(key => fileSizes[key].Keys.ToList()
.ConvertAll(ext => new DirectorySize { Directory = key, FileExtension = ext, fileSize = fileSizes[key][ext] }))
.SelectMany(x => x.Select(y => y));
report.Sum(x => x.fileSize).BytesToString().Dump("Total Source");
report.OrderBy(r => r.Directory).ThenBy(r => r.FileExtension).Dump();
fileExtensions.Distinct().OrderBy(e => e).Dump();
}
// Define other methods and classes here
public class DirectorySize
{
public string Directory { get; set; }
public string FileExtension { get; set; }
public long fileSize { get; set; }
object ToDump() => new
{
Directory,
FileExtension,
FileSize = new XElement("LINQPad.HTML",
new XElement("div",
new XAttribute("align", "right"),
new XAttribute("style", $"background-color:{((fileSize > Math.Pow(1024, 3)) ? "red" : (fileSize > Math.Pow(1024, 2)) ? "violet" : "white")};"),
$"{fileSize.BytesToString()}".PadLeft(10))),
};
}
@@ -0,0 +1,87 @@
<Query Kind="VBProgram">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
Sub Main
Dim aListOfDirectories = New List(Of String)
aListOfDirectories.Add("d:\Git")
'This file does not exist
IsFileInDirectory("D:\Git\thom.txt", aListOfDirectories).Dump("D:\Git\thom.txt")
MyIsFileInDirectory("D:\Git\thom.txt", aListOfDirectories).Dump("D:\Git\thom.txt")
'This file does exist
IsFileInDirectory("D:\Git\new migration.txt", aListOfDirectories).Dump("D:\Git\new migration.txt")
MyIsFileInDirectory("D:\Git\new migration.txt", aListOfDirectories).Dump("D:\Git\new migration.txt")
MyIsFileInDirectory("D:\Git\new migration.txt", aListOfDirectories).Equals(IsFileInDirectory("D:\Git\new migration.txt", aListOfDirectories)).Dump("My Equals not My")
End Sub
' Define other methods and classes here
Public Shared Function MyIsFileInDirectory(ByVal aFilePath As String, ByVal aListOfDirectories As List(Of String)) As Boolean
Dim fileObject = New System.IO.FileInfo(aFilePath)
If Not fileObject.Exists
Return False
End If
Return aListOfDirectories _
.Select(Function(allowedDir) New System.IO.DirectoryInfo(allowedDir)) _
.Any(Function(testDirectory) fileObject.Directory.FullName.Equals(testDirectory.FullName.TrimEnd("\"), StringComparison.OrdinalIgnoreCase))
End Function
Public Shared Function IsFileInDirectory(ByVal aFilePath As String, ByVal aListOfDirectories As List(Of String)) As Boolean
Dim fileObject = New System.IO.FileInfo(aFilePath)
For Each allowedDir In aListOfDirectories
Dim testDirectory = New System.IO.DirectoryInfo(allowedDir)
If fileObject.Directory.FullName.Equals(testDirectory.FullName, StringComparison.OrdinalIgnoreCase) Then
Return True
End If
Next
Return False
End Function
+76
View File
@@ -0,0 +1,76 @@
<Query Kind="Statements">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<NuGetReference>TimeZoneNames</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel.Composition</Namespace>
<Namespace>System.ComponentModel.Composition.Hosting</Namespace>
<Namespace>System.ComponentModel.Composition.Primitives</Namespace>
<Namespace>System.ComponentModel.Composition.ReflectionModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.Globalization</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Net.Http</Namespace>
<Namespace>System.Net.Http.Headers</Namespace>
<Namespace>System.Numerics</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
<Namespace>TimeZoneNames</Namespace>
</Query>
TimeZoneInfo.GetSystemTimeZones().Dump();
TimeZoneInfo.GetSystemTimeZones()
.SelectMany(tzi => new [] {
TZNames.GetAbbreviationsForTimeZone(tzi.Id, "en-US").Daylight != TZNames.GetAbbreviationsForTimeZone(tzi.Id, "en-US").Standard
? new { Key = tzi.Id.Replace("Standard", "Daylight"), Value = TZNames.GetAbbreviationsForTimeZone(tzi.Id, "en-US").Daylight }
: new { Key = tzi.Id, Value = TZNames.GetAbbreviationsForTimeZone(tzi.Id, "en-US").Daylight },
new { Key = tzi.Id, Value = TZNames.GetAbbreviationsForTimeZone(tzi.Id, "en-US").Standard }})
.GroupBy(x => x.Key)
.Select(g => g.First())
.ToDictionary(item => item.Key, item => item.Value)
.OrderBy(item => item.Key)
.Dump();
+95
View File
@@ -0,0 +1,95 @@
<Query Kind="Program">
<Namespace>Newtonsoft.Json</Namespace>
</Query>
void Main()
{
var CaseTypConfigJSON = @"{""SOIROMInclusions"":[{""SOI"":""1"",""ROM"":""1""},{""SOI"":""1"",""ROM"":""2""},{""SOI"":""1"",""ROM"":""3""},{""SOI"":""1"",""ROM"":""4""},{""SOI"":""2"",""ROM"":""1""},{""SOI"":""2"",""ROM"":""2""},{""SOI"":""2"",""ROM"":""3""},{""SOI"":""2"",""ROM"":""4""},{""SOI"":""3"",""ROM"":""1""},{""SOI"":""3"",""ROM"":""2""},{""SOI"":""3"",""ROM"":""3""},{""SOI"":""3"",""ROM"":""4""},{""SOI"":""4"",""ROM"":""1""},{""SOI"":""4"",""ROM"":""2""},{""SOI"":""4"",""ROM"":""3""},{""SOI"":""4"",""ROM"":""4""}],""AgeCohortIDInclusions"":[5,6,7,8,9,10,3,4],""PhysicianIDExclusions"":[],""StandardDeviationExcludedTypeEnum"":0,""LengthOfStayThreshold"":0,""CPTCodes"":[],""PatientTypeRollupIDInclusions"":[3,2,1],""PhysicianMinVolume"":0}";
JsonConvert.DeserializeObject<APRDRGCaseTypeConfiguration>(CaseTypConfigJSON).Dump();
}
// Define other methods and classes here
public enum StandardDeviationExclusions
{
None = 0,
TwoStdDev = 1,
ThreeStdDev = 2,
CustomLOSOutlier = 3
}
[Serializable]
public class CaseTypeConfiguration //: ICaseTypeConfiguration
{
public int PhysicianMinVolume { get; set; } = 0;
}
public class DRGCaseTypeConfiguration : CaseTypeConfiguration//, IDRGCaseTypeConfiguration
{
// ReSharper disable once InconsistentNaming
public List<int> AgeCohortIDInclusions { get; set; } = new List<int>();
public List<int> PhysicianIDExclusions { get; set; } = new List<int>();
public StandardDeviationExclusions StandardDeviationExcludedTypeEnum { get; set; } = StandardDeviationExclusions.None;
public int LengthOfStayThreshold { get; set; } = 0;
public HashSet<string> CPTCodes { get; set; } = new HashSet<string>();
public List<int> PatientTypeRollupIDInclusions { get; set; } = new List<int>();
}
[Serializable]
public class SOIROMInclusion : IEquatable<SOIROMInclusion>
{
public string SOI { get; set; }
public string ROM { get; set; }
public SOIROMInclusion()
{
}
public SOIROMInclusion(string soi, string rom)
{
SOI = soi;
ROM = rom;
}
public SOIROMInclusion(int soi, int rom)
{
SOI = soi.ToString();
ROM = rom.ToString();
}
public bool Equals(SOIROMInclusion other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return string.Equals(ROM, other.ROM, StringComparison.OrdinalIgnoreCase) &&
string.Equals(SOI, other.SOI, StringComparison.OrdinalIgnoreCase);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((SOIROMInclusion)obj);
}
public override int GetHashCode()
{
unchecked
{
return ((ROM != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(ROM) : 0) * 397) ^
(SOI != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(SOI) : 0);
}
}
}
public class APRDRGCaseTypeConfiguration : DRGCaseTypeConfiguration
{
// ReSharper disable once InconsistentNaming
public List<SOIROMInclusion> SOIROMInclusions { get; set; } = new List<SOIROMInclusion>();
}
+122
View File
@@ -0,0 +1,122 @@
<Query Kind="Program">
<NuGetReference>LinqToCsv</NuGetReference>
<Namespace>LINQtoCSV</Namespace>
</Query>
void Main()
{
var path = @"D:\Users\tlamb\Downloads";
var utilizationFile = @"CI_Sepsis LOS - Pharmacy_All Physicians_Utilization_01-15-2021.csv";
//@"CI_Sepsis LOS - Pharmacy_All Physicians_Utilization_01-14-2021.csv";
var trackingDetailsFile = @"CI_Sepsis LOS - Pharmacy_01-14-2021 Tracking Details.csv";
var inputFileDescription = new CsvFileDescription
{
SeparatorChar = ',',
FirstLineHasColumnNames = true
};
var cc = new CsvContext();
var trackingDetails = cc.Read<TrackingDetails>(Path.Combine(path, trackingDetailsFile), inputFileDescription)
.GroupBy(td => td.Charge_Description, (g, d) => new Consolidated
{
Charge_Code = g,
TotalDirectVariableCost = d.Sum(u => u.TotalDirectVariableCost)
})
.OrderBy(td => td.Charge_Code);
var utilization = cc.Read<Utilization>(Path.Combine(path, utilizationFile), inputFileDescription)
.GroupBy(u => u.Charge_Code, (g, d) => d.Select(u => new Consolidated
{
Charge_Code = u.Charge_Code,
Baseline_TotalDirectVariableCost = u.Baseline_TotalDirectVariableCost,
Tracking_TotalDirectVariableCost = u.Tracking_TotalDirectVariableCost
}))
.SelectMany(u => u)
.OrderBy(u => u.Charge_Code);
var consolidated = from td in utilization
join u in trackingDetails on td.Charge_Code equals u.Charge_Code into g
from x in g.DefaultIfEmpty()
select new Consolidated
{
Charge_Code = x?.Charge_Code ?? td.Charge_Code,
TotalDirectVariableCost = x?.TotalDirectVariableCost ?? 0.0d,
Baseline_TotalDirectVariableCost = td?.Baseline_TotalDirectVariableCost ?? 0.0d,
Tracking_TotalDirectVariableCost = td?.Tracking_TotalDirectVariableCost ?? 0.0d
};
cc.Write(consolidated, Path.Combine(path, "consolidated.csv"), inputFileDescription);
}
// Define other methods and classes here
public class TrackingDetails
{
public string Encounter { get; set; }
public DateTime Admit_Date { get; set; }
public DateTime Discharge_Date { get; set; }
public string Physician { get; set; }
public string Physician_Group { get; set; }
public DateTime Date_of_Service { get; set; }
public string Rollup { get; set; }
public string Charge_Description { get; set; }
public int UOS { get; set; }
public string Unit_Direct_Variable_Cost { get; set; }
public string Total_Direct_Variable_Cost { get; set; }
public double TotalDirectVariableCost
{
get
{
return double.TryParse(Total_Direct_Variable_Cost.Replace("$", "").Replace("(", "-").Replace(")", ""), out var result) ? result : 0.0d;
}
}
}
public class Utilization
{
public string Rollup { get; set; }
public string Charge_Code { get; set; }
public string Direct_Variable_Cost { get; set; }
public string x { get; set; }
public string Cases1 { get; set; }
public string Quantity1 { get; set; }
public string Pct_of_Total_Cases1 { get; set; }
public string Qty_Used_Cases1 { get; set; }
public string Cases2 { get; set; }
public string Quantity2 { get; set; }
public string Pct_of_Total_Cases2 { get; set; }
public string Qty_Used_Cases2 { get; set; }
public string Pct_of_Total_Cases3 { get; set; }
public string Qty_Used_Cases3 { get; set; }
public string b { get; set; }
public string CostPerCase1 { get; set; }
public string CostPerCase2 { get; set; }
public string CostPerCase3 { get; set; }
public string Total_Direct_Variable_Cost1 { get; set; }
public string Total_Direct_Variable_Cost2 { get; set; }
public string Total_Direct_Variable_Cost3 { get; set; }
public double Baseline_TotalDirectVariableCost
{
get
{
return string.IsNullOrEmpty(Total_Direct_Variable_Cost1) ? 0.0d
: double.TryParse(Total_Direct_Variable_Cost1.Replace("$-", "0").Replace("$", "").Replace("(", "-").Replace(")", ""), out var result) ? result : 0.0d;
}
}
public double Tracking_TotalDirectVariableCost
{
get
{
return string.IsNullOrEmpty(Total_Direct_Variable_Cost2) ? 0.0d
: double.TryParse(Total_Direct_Variable_Cost2.Replace("$-", "0").Replace("$", "").Replace("(", "-").Replace(")", ""), out var result) ? result : 0.0d;
}
}
}
public class Consolidated
{
public string Charge_Code { get; set; }
public double TotalDirectVariableCost { get; set; }
public double Baseline_TotalDirectVariableCost { get; set; }
public double Tracking_TotalDirectVariableCost { get; set; }
}
+193
View File
@@ -0,0 +1,193 @@
<Query Kind="Program">
<Connection>
<ID>40766b24-ff74-431b-b387-6c221ede77cf</ID>
<Persist>true</Persist>
<Server>p3121-sql-02.sdt.local</Server>
<Database>jazz prd UNC 20180206.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
var validPayPeriods = PayPeriodCycles
.GroupBy(g => new { g.PayCycleID, g.PayCycleName }, (g, pp) =>
new
{
g.PayCycleID,
g.PayCycleName,
PayPeriods = pp.Select(p =>
new payperiodtiming
{
PayPeriodID = p.PayPeriodID,
PeriodEndCalendarDate = p.PeriodEndCalendarDate,
PeriodStartCalendarDate = p.PeriodStartCalendarDate
}).OrderByDescending(p => p.PeriodEndCalendarDate).Take(6)
})
.SelectMany(g => g.PayPeriods);
DeptPayPeriods
.ToList()
// .OrderBy(dpp => dpp.DepartmentID)
// .ThenByDescending(dpp => dpp.PayPeriodID)
.GroupBy(dpp => new { dpp.DepartmentID, dpp.Department }, (g, dpp) => new deptpayperiodtiming
{
DepartmentID = g.DepartmentID,
Department = g.Department,
PayPeriodTimings = dpp.Select(d => d.PayPeriodID).Distinct()
.Join(validPayPeriods, x => x, vpp => vpp.PayPeriodID, (x, vpp) => vpp)
.OrderByDescending(d => d.PayPeriodID)
})
.Where(dpp => dpp.PayPeriodTimings.Any())
.Dump("Department PayPeriods");
}
public void ShowCycles()
{
PayPeriodCycles
.GroupBy(g => new { g.PayCycleID, g.PayCycleName }, (g, pp) =>
new
{
g.PayCycleID,
g.PayCycleName,
PayPeriods = pp.Select(p =>
new payperiodtiming
{
PayPeriodID = p.PayPeriodID,
PeriodEndCalendarDate = p.PeriodEndCalendarDate,
PeriodStartCalendarDate = p.PeriodStartCalendarDate
}).OrderByDescending(p => p.PeriodEndCalendarDate).Take(6)
})
.Dump("Pay Period Cycles");
}
public IEnumerable<deptpayperiod> DeptPayPeriods => (from fact in FactPayrollSampledPayPeriods
join dept in DimDepartments on fact.DepartmentID equals dept.DepartmentID
select new deptpayperiod
{
PayPeriodID = fact.PayPeriodID,
DepartmentID = fact.DepartmentID,
Department = dept.Name
}).Union((from fact in ViewPrimaryStatisticsStaffingByPayPeriod
join dept in DimDepartments on fact.DepartmentID equals dept.DepartmentID
select new deptpayperiod
{
PayPeriodID = fact.PayPeriodID,
DepartmentID = fact.DepartmentID,
Department = dept.Name
})).Distinct();
public IEnumerable<payperiodcycle> PayPeriodCycles => from pp in DimPayPeriods
where pp.PeriodEndCalendarDate < DateTime.Now
select new payperiodcycle
{
PayPeriodID = pp.PayPeriodID,
PayCycleID = pp.PayCycleID,
PayCycleName = pp.PayCycleName,
PeriodEndCalendarDate = pp.PeriodEndCalendarDate,
PeriodStartCalendarDate = pp.PeriodStartCalendarDate
};
// Define other methods and classes here
public class deptpayperiod
{
public short PayPeriodID { get; set; }
public int DepartmentID { get; set; }
public string Department { get; set; }
}
public class deptpayperiodtiming
{
public int DepartmentID { get; set; }
public string Department { get; set; }
internal IEnumerable<payperiodtiming> PayPeriodTimings { get; set; }
public IDictionary<short, payperioddate> PayPeriods =>
PayPeriodTimings.ToDictionary(ppt => ppt.PayPeriodID,
ppt => new payperioddate
{
PeriodStartCalendarDate = ppt.PeriodStartCalendarDate,
PeriodEndCalendarDate = ppt.PeriodEndCalendarDate
});
public DateTime? PeriodStartDate => PayPeriodTimings.OrderByDescending(ppt => ppt.PayPeriodID).First().PeriodStartCalendarDate;
public DateTime? PeriodEndDate => PayPeriodTimings.OrderByDescending(ppt => ppt.PayPeriodID).First().PeriodEndCalendarDate;
}
public class payperioddate
{
public DateTime PeriodEndCalendarDate { get; set; }
public DateTime? PeriodStartCalendarDate { get; set; }
object ToDump() => new
{
PeriodStartDate = $"{PeriodStartCalendarDate:yyyy MM dd}",
PeriodEndDate = $"{PeriodEndCalendarDate:yyyy MM dd}"
};
}
public class payperiodtiming : payperioddate
{
public short PayPeriodID { get; set; }
object ToDump() => new
{
PayPeriodID = $"{PayPeriodID}",
PeriodStartDate = $"{PeriodStartCalendarDate:yyyy MM dd}",
PeriodEndDate = $"{PeriodEndCalendarDate:yyyy MM dd}"
};
}
public class payperiodcycle : payperiodtiming
{
public int PayCycleID { get; set; }
public string PayCycleName { get; set; }
}
@@ -0,0 +1,88 @@
<Query Kind="Statements">
<Connection>
<ID>77b65bea-e766-4e3c-a1ed-c4c2534b6019</ID>
<Persist>true</Persist>
<Server>D0001-SQL-01.sdt.local</Server>
<Database>jazz dev master</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel.Composition</Namespace>
<Namespace>System.ComponentModel.Composition.Hosting</Namespace>
<Namespace>System.ComponentModel.Composition.Primitives</Namespace>
<Namespace>System.ComponentModel.Composition.ReflectionModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Net.Http</Namespace>
<Namespace>System.Net.Http.Headers</Namespace>
<Namespace>System.Numerics</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
//var reportList = Reports.ToList();
var reports = Reports.ToList()
.Where(rpt => !string.IsNullOrEmpty(rpt.ReportSetupJson) && rpt.ReportSetupJson.StartsWith("{") && rpt.ReportSetupJson.EndsWith("}"))
.Select(rpt => new { rpt, reportSetup = JObject.Parse(rpt.ReportSetupJson)})
.ToList();
//reports.Dump();
//reports.ForEach(rpt => rpt.reportSetup.Dump());
var definitions = reports
.Select(rpt => new { rpt.rpt, definitions = rpt.reportSetup.SelectTokens("..StandardDefinitionGUID")
.Where(x => x.Value<string>() != Guid.Empty.ToString())
.Select(x => x.Value<string>()).ToList()})
.ToList();
foreach(var def in definitions.Where(def => def.definitions.Count() > 0))
{
var defJson = JsonConvert.SerializeObject(def.definitions);
defJson.Dump();
def.rpt.DefinitionsJson = defJson;
SubmitChanges();
}
@@ -0,0 +1,280 @@
<Query Kind="Program">
<Connection>
<ID>4f885e7e-d8bb-427c-a54e-8e3e1c3137a7</ID>
<Persist>true</Persist>
<Server>IOAK-SQL-LOG-01.sdt.local</Server>
<Database>jazz log prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.Dynamic</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Threading.Tasks</Namespace>
<Namespace>System.Data.Common</Namespace>
</Query>
#region *** Enumerations ***
public enum QueryRegions
{
Production,
Training,
Oak,
Dev
}
#endregion
#region *** Options ***
public static QueryRegions queryRegion = QueryRegions.Production;
public static int timeoutInMinutes = 2;
#endregion
#region *** Database Selection ***
public static string[] appVersions = { // This is a list of appVersions to filter for in the database list
};
public static string[] serverExclusions = { // This is a list of servers to exclude from the database list
@"paonsql19.sdt.local\instance1",
@"paonsql17.sdt.local\instance1",
@"p0555-sql-01.sdt.local\instance1",
"P0000-sql-01.sdt.local",
"P9900-SQL-03.sdt.local",
"P9900-sql-05.sdt.local"
};
public static string[] dbExclusions = { // This is a list of database physical names to exclude from the database list
};
public static string[] targetOrgPins = { // This is a list of org pins to target in the database list
};
public static string[] targetServers = { // This is a list of servers to target in the database list
};
public static string[] targetDBs = { // This is a list of database physicial names to target in the database list
};
#endregion *** Options ***
#region *** SMC Settings and queries ***
public static string smcSql => @"SELECT di.ServerName, di.DatabaseGUID, di.DatabaseName, di.PhysicalName, di.OrgPin, di.AppVersion, di.Description
FROM [dbo].[viewDatabaseInfo] di
WHERE 1=1"
+ (queryRegion == QueryRegions.Dev
? @"
AND di.PhysicalName like 'jazz%'"
: $@"
AND di.PhysicalName like 'jazz {(queryRegion != QueryRegions.Production ? "tst" : "prd")}%'
AND di.ServerName like 'p%'");
public static string smcServer { get; set; }
public static string smcDB { get; set; }
#endregion
#region *** Program variables and settings ***
public static IOrderedEnumerable<Database> databases => GetDatabases();
#endregion
void Main()
{
//databases.OrderBy(d => d.Server).ThenBy(d => d.PhysicalName).Dump($"{queryRegion} {nameof(databases)}");
var workList = databases.OrderBy(d => d.Server).ThenBy(d => d.PhysicalName).ToList();
var sqlQuery = @"select Name, t.Time, RepeatType, IsDisabled, HasRun, LastSubmittedDate, LastRunDate from TEScheduledTask t where name = 'Starter Set Report Card Validator'";
var start = new DateTime(2020, 3, 23, 3, 0, 0);
var interval = 3; // minutes
workList.ForEach(db =>
{
try
{
var connectionString = BuildConnectionString(db.Server, db.PhysicalName);
var database = new Database();
var results = SelectDynamic(database, connectionString, sqlQuery);
if (results.Any())
{
//var updateStatement = $@"Update TEScheduledTask set Time = '{start.ToString("hh:mm:ss tt")}' where name = 'Starter Set Report Card Validator'";
//ExecuteCommand(database, connectionString, updateStatement);
//var after = SelectDynamic(database, connectionString, sqlQuery);
new
{
connectionString,
//updateStatement,
results//,
//after
}.Dump();
start = start.AddMinutes(interval);
}
}
catch (SqlException sqlEx)
{
sqlEx.Dump();
return;
}
});
}
public class Database
{
public string Server { get; set; }
public Guid DatabaseGuid { get; set; }
public string DatabaseName { get; set; }
public string PhysicalName { get; set; }
public string OrgPin { get; set; }
public string AppVersion { get; set; }
public string Description { get; set; }
public Dictionary<string, string> Fields { get; set; }
public Database()
{
}
public Database(DataRow dr)
{
Server = dr.Field<string>("ServerName");
DatabaseGuid = dr.Field<Guid>("DatabaseGuid");
DatabaseName = dr.Field<string>("DatabaseName");
PhysicalName = dr.Field<string>("PhysicalName");
OrgPin = dr.Field<string>("OrgPin");
AppVersion = dr.Field<string>("AppVersion");
Description = dr.Field<string>("Description");
Fields = new Dictionary<string, string>();
foreach (DataColumn column in dr.Table.Columns)
{
var index = dr.Table.Columns.IndexOf(column);
Fields.Add(column.ColumnName, dr[index].ToString());
}
}
object ToDump() => (object)new
{
Server,
DatabaseGuid,
DatabaseName,
PhysicalName,
OrgPin,
AppVersion,
Description
};
}
public static IOrderedEnumerable<Database> GetDatabases()
{
switch (queryRegion)
{
case QueryRegions.Production:
smcServer = "ioak-sql-smc-01";
smcDB = "smc prod";
break;
case QueryRegions.Training:
smcServer = "ioak-sql-smc-01";
smcDB = "smc training";
break;
case QueryRegions.Oak:
smcServer = "ioak-sql-smc-01.sdt.local";
smcDB = "smc qa";
break;
default:
smcServer = "DDEN-SQL-SMC-01.sdt.local";
smcDB = "smc dev";
break;
}
List<Database> databases = new List<UserQuery.Database>();
var connStr = BuildConnectionString(smcServer, smcDB);
using (var conn = new SqlConnection(connStr))
{
var command = new SqlCommand(smcSql, conn);
command.CommandType = CommandType.Text;
var database = new DataSet();
conn.Open();
using (DbDataReader reader = command.ExecuteReader())
{
while (true)
{
var table = new DataTable();
database.Tables.Add(table);
table.Load(reader);
if (reader.IsClosed || !reader.NextResult()) break;
}
}
conn.Close();
databases = database.Tables[0].AsEnumerable().Select(dr => new Database(dr)).ToList();
databases = databases.Where(dr => !dbExclusions.Contains(dr.PhysicalName) && !serverExclusions.Contains(dr.Server)).ToList();
if (targetOrgPins.Any())
databases = databases.Where(dr => targetOrgPins.Contains(dr.OrgPin)).ToList();
if (targetServers.Any())
databases = databases.Where(dr => targetServers.Contains(dr.Server)).ToList();
if (targetDBs.Any())
databases = databases.Where(dr => targetDBs.Contains(dr.PhysicalName)).ToList();
if (appVersions.Any())
databases = databases.Where(dr => appVersions.Contains(dr.AppVersion)).ToList();
}
return databases
.OrderBy(d => d.Server).ThenBy(d => d.PhysicalName);
}
public static void ExecuteCommand(Database db, string connStr, string sql)
{
using (var conn = new SqlConnection(connStr))
{
var command = new SqlCommand(sql, conn);
command.CommandType = CommandType.Text;
command.CommandTimeout = (int)TimeSpan.FromMinutes(timeoutInMinutes).TotalSeconds;
conn.Open();
try
{
command.ExecuteNonQuery();
conn.Close();
}
catch (SqlException sqlEx)
{
sqlEx.Dump();
}
}
}
public static IEnumerable<dynamic> SelectDynamic(Database db, string connStr, string sql)
{
using (var conn = new SqlConnection(connStr))
{
var command = new SqlCommand(sql, conn);
command.CommandType = CommandType.Text;
command.CommandTimeout = (int)TimeSpan.FromMinutes(timeoutInMinutes).TotalSeconds;
var database = new DataSet();
conn.Open();
using (DbDataReader reader = command.ExecuteReader())
{
while (true)
{
var names = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList();
foreach (IDataRecord record in reader as IEnumerable)
{
var expando = new ExpandoObject() as IDictionary<string, object>;
foreach (var name in names)
expando[name] = record[name];
yield return expando;
}
if (reader.IsClosed || !reader.NextResult()) break;
}
}
conn.Close();
}
}
public static string BuildConnectionString(string server, string database, string username = null, string password = null)
{
return username == null
? $"data source={server};initial catalog='{database}';persist security info=True;Integrated Security=SSPI;"
: $"data source={server};initial catalog='{database}';User ID={username};pwd={password}";
}
+241
View File
@@ -0,0 +1,241 @@
<Query Kind="Program">
<Connection>
<ID>77b65bea-e766-4e3c-a1ed-c4c2534b6019</ID>
<Persist>true</Persist>
<Server>D0001-SQL-11.sdt.local</Server>
<Database>jazz dev master Prod</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
/*
(from roleDetail in ViewS3RoleAssignmentDetail
where roleDetail.RoleName.StartsWith("MR ")
&& roleDetail.LootID.Contains("MRDEPT|")
select roleDetail.RoleName)
.Distinct()
.OrderBy(p => p).ToList()
.Aggregate("var roles = new [] { ", (x, y) => x + $"\"{y}\", ").TrimEnd(", ".ToCharArray()) + " }"
*/
void Main()
{
var userNames = new List<string>{
"dachee"
};
// var userGUIDs = from up in UserProfiles
// where userNames.Contains(up.UserName)
// select up.UserGUID;
// new List<Guid>{
// //new Guid("0e8a4d58-f9c1-4a49-837c-dd7db45793fe")
// new Guid("76CD86B8-D769-4AAE-9083-F8E6D005AA9D")
// };
var users = (from user in UserProfiles
select new User
{
UserInfo = new UserInfo
{
UserGUID = user.UserGUID,
UserName = user.UserName,
NameFirst = user.NameFirst,
NameLast = user.NameLast,
EmailAddress = user.EmailAddress
}
})
.Where(u => userNames.Contains(u.UserInfo.UserName))
.ToList();
var roles = new[] {
// "MR - Commenter",
"MR - Director",
"MR - Exec Director AVP",
"MR - Executive",
// "MR - Finance",
"MR - Manager",
// "MR - Read Only",
// "MR - Read Write Only",
"MR - Vice President"
};
users
.ForEach(u =>
{
int x;
u.Roles = (from roleDetail in ViewS3RoleAssignmentDetail
where roleDetail.UserGUID == u.UserInfo.UserGUID
select roleDetail.RoleName).Distinct().OrderBy(r => r).ToList();
u.DepartmentIDs = (from roleDetail in ViewS3RoleAssignmentDetail
where roleDetail.UserGUID == u.UserInfo.UserGUID
&& roleDetail.LootID.Contains("MRDEPT|")
&& roles.Contains(roleDetail.RoleName)
select new { depts = roleDetail.LootID.Split('|').ToList() })
.ToList().SelectMany(d => d.depts).Where(d => int.TryParse(d, out x)).ToList().ConvertAll(int.Parse).Distinct()
.ToList();
u.DeptPayPeriods = (from fact in FactDepartmentProductivityMetrics
join pp in DimPayPeriods on fact.PayPeriodID equals pp.PayPeriodID
where u.DepartmentIDs.Contains(fact.DepartmentID)
&& pp.PeriodEndCalendarDate < new DateTime(2019, 6, 17)
&& pp.PeriodStartCalendarDate.HasValue
orderby pp.PeriodStartCalendarDate descending
select new { fact.DepartmentID, pp.PayPeriodID, PeriodStartCalendarDate = pp.PeriodStartCalendarDate.Value, pp.PeriodEndCalendarDate })
.Distinct().ToList()
.GroupBy(dpp => dpp.DepartmentID, (key, grp) => new DeptPayPeriods
{
DepartmentID = key,
PayPeriods = grp.Select(g => new PayPeriod
{
PeriodID = g.PayPeriodID,
StartDate = g.PeriodStartCalendarDate,
EndDate = g.PeriodEndCalendarDate
})
.ToList().OrderByDescending(pp => pp.StartDate).Take(6).ToList()
}).ToList();
var payperiodIDs = u.DeptPayPeriods.SelectMany(d => d.PayPeriods.Select(pp => pp.PeriodID));
var hours = from fact in FactPayrollSampledPayPeriods
join payperiod in DimPayPeriods on fact.PayPeriodID equals payperiod.PayPeriodID
join paycode in DimPayCodeGroups on fact.PayCodeGroupID equals paycode.PayCodeGroupID
join prodclass in DimProductiveClasses on paycode.ProductiveClassID equals prodclass.ProductiveClassID
join department in DimDepartments on fact.DepartmentID equals department.DepartmentID
where new[] { 1, 4 }.Contains(fact.TimeClassID)
&& prodclass.Name == "Productive"
&& u.DepartmentIDs.Contains(fact.DepartmentID)
&& payperiodIDs.Contains(fact.PayPeriodID)
select new DeptPayPeriodTime(fact.DepartmentID, fact.PayPeriodID, fact.TimeClassID, fact.Hours, "hours");
var dollars = from fact in FactPayrollSampledPayPeriods
join payperiod in DimPayPeriods on fact.PayPeriodID equals payperiod.PayPeriodID
join paycode in DimPayCodeGroups on fact.PayCodeGroupID equals paycode.PayCodeGroupID
//join prodclass in DimProductiveClasses on paycode.ProductiveClassID equals prodclass.ProductiveClassID
join department in DimDepartments on fact.DepartmentID equals department.DepartmentID
where new[] { 1, 4 }.Contains(fact.TimeClassID)
//&& prodclass.Name == "Productive"
&& u.DepartmentIDs.Contains(fact.DepartmentID)
&& payperiodIDs.Contains(fact.PayPeriodID)
select new DeptPayPeriodTime(fact.DepartmentID, fact.PayPeriodID, fact.TimeClassID, fact.Dollars, "dollars");
var uos = from fact in ViewPrimaryStatisticsStaffingByPayPeriod
join payperiod in DimPayPeriods on fact.PayPeriodID equals payperiod.PayPeriodID
//join paycode in DimPayCodeGroups on fact.PayCodeGroupID equals paycode.PayCodeGroupID
//join prodclass in DimProductiveClasses on paycode.ProductiveClassID equals prodclass.ProductiveClassID
join department in DimDepartments on fact.DepartmentID equals department.DepartmentID
where new[] { 1, 4 }.Contains(fact.TimeClassID)
//&& prodclass.Name == "Productive"
&& u.DepartmentIDs.Contains(fact.DepartmentID)
&& payperiodIDs.Contains(fact.PayPeriodID)
select new DeptPayPeriodTime(fact.DepartmentID, fact.PayPeriodID, fact.TimeClassID, fact.Units.HasValue ? fact.Units.Value : 0.0m, "uos");
var unitSummary = hours.ToList().Concat(dollars.ToList()).Concat(uos.ToList())
.GroupBy(dppt => new { dppt.DepartmentID, dppt.PeriodID, dppt.TimeClassID, dppt.UnitType },
(key, grp) => new DeptPayPeriodTime(key.DepartmentID, key.PeriodID, key.TimeClassID,
grp.Where(pp => u.DeptPeriodDict[pp.DepartmentID].Contains(pp.PeriodID)).Sum(i => i.Units), key.UnitType))
.Where(item => u.DeptPeriodDict[item.DepartmentID].Contains(item.PeriodID))
.OrderBy(item => item.DepartmentID)
.ThenByDescending(item => item.PeriodID).ToList();
u.Units = unitSummary;
});
users.Dump("Users");
users//.Where(u => userGUIDs.Contains(u.UserInfo.UserGUID))
.Aggregate("", (x, y) => x + y.DepartmentIDs.Aggregate(", ", (a, b) => $"{a}, {b}")).Substring(2)
.Dump();
users//.Where(u => userGUIDs.Contains(u.UserInfo.UserGUID))
.Aggregate("", (x, y) => x + y.DeptPayPeriods.SelectMany(dpp => dpp.PayPeriods.Select(pp => pp.PeriodID)).Distinct()
.Aggregate(", ", (a, b) => $"{a}, {b}")).Substring(2)
.Dump();
}
// Define other methods and classes here
public class User
{
public UserInfo UserInfo { get; set; }
public List<string> Roles { get; set; }
public List<int> DepartmentIDs { get; set; }
public List<DeptPayPeriods> DeptPayPeriods { get; set; }
internal Dictionary<int, List<short>> DeptPeriodDict =>
DeptPayPeriods.ToDictionary(dpp => dpp.DepartmentID, dpp => dpp.PayPeriods.Select(pp => pp.PeriodID).ToList());
public List<DeptPayPeriodTime> Units { get; set; }
}
public class UserInfo
{
public Guid UserGUID { get; set; }
public string UserName { get; set; }
public string NameFirst { get; set; }
public string NameLast { get; set; }
public string EmailAddress { get; set; }
}
public class DeptPayPeriods
{
public int DepartmentID { get; set; }
public List<PayPeriod> PayPeriods { get; set; }
//public List<DeptPayPeriodTime> Units { get; set; }
}
public class PayPeriod
{
public short PeriodID { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
public class DeptPayPeriodTime
{
public int DepartmentID { get; set; }
public short PeriodID { get; set; }
public byte TimeClassID { get; set; }
public decimal Units { get; set; }
public string UnitType { get; set; }
public DeptPayPeriodTime(int departmentID, short periodID, byte timeClassID, decimal units, string unitType)
{
DepartmentID = departmentID;
PeriodID = periodID;
TimeClassID = timeClassID;
Units = units;
UnitType = unitType;
}
}
+71
View File
@@ -0,0 +1,71 @@
<Query Kind="Program">
<Connection>
<ID>40766b24-ff74-431b-b387-6c221ede77cf</ID>
<Persist>true</Persist>
<Server>p3121-sql-02.sdt.local</Server>
<Database>jazz prd UNC 20180206.1</Database>
<ShowServer>true</ShowServer>
</Connection>
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
(from role in UserRoles
where role.Category == "MR"
select role).Dump();
}
// Define other methods and classes here
+96
View File
@@ -0,0 +1,96 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
void Main()
{
var testset = new string[] { "3", "167", "168", "172", "4", "5", "6" };
var IncludeSolution = "";
var ExcludeSolution = "";
foreach (var check in checkInclude(IncludeSolution, testset))
{
Console.WriteLine($"{check.Item1} is {check.Item2}");
}
Console.WriteLine("\r\nExclude \"\"");
foreach (var check in checkExclude(ExcludeSolution, testset))
{
Console.WriteLine($"{check.Item1} is {check.Item2}");
}
Console.WriteLine("\r\nInclude \"^3$\"");
IncludeSolution = "^3$";
foreach (var check in checkInclude(IncludeSolution, testset))
{
Console.WriteLine($"{check.Item1} is {check.Item2}");
}
ExcludeSolution = "^167$|^168$";
Console.WriteLine("\r\nExclude \"^167$|^168$\"");
foreach (var check in checkExclude(ExcludeSolution, testset))
{
Console.WriteLine($"{check.Item1} is {check.Item2}");
}
}
public IEnumerable<Tuple<string, bool>> checkInclude(string pattern, string[] testset)
{
var regex = string.IsNullOrEmpty(pattern) ? new Regex("^.+$") : new Regex(pattern);
return testset.ToList().ConvertAll(t => new Tuple<string, bool>(t, regex.IsMatch(t)));
}
public IEnumerable<Tuple<string, bool>> checkExclude(string pattern, string[] testset)
{
var regex = string.IsNullOrEmpty(pattern) ? new Regex("^$") : new Regex(pattern);
return testset.ToList().ConvertAll(t => new Tuple<string, bool>(t, regex.IsMatch(t)));
}
// Define other methods and classes here
+387
View File
@@ -0,0 +1,387 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel.Composition</Namespace>
<Namespace>System.ComponentModel.Composition.Hosting</Namespace>
<Namespace>System.ComponentModel.Composition.Primitives</Namespace>
<Namespace>System.ComponentModel.Composition.ReflectionModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Net.Http</Namespace>
<Namespace>System.Net.Http.Headers</Namespace>
<Namespace>System.Numerics</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
private XDocument xmlDoc = XDocument.Load(@"C:\Users\tlamb\Downloads\detailedreport_Strata_Jazz_Web_Jazz_web_201911511115217.xml");
void Main()
{
//xmlDoc.DumpFormatted();
var cwes = ParseVeracodeReport(xmlDoc).Where(cwe => cwe.count > 0);
var flaws = (from cwe in xmlDoc.Descendants()
where cwe.Name.LocalName == "cwe"
&& cwe.Attributes().Any(a => a.Name == "cweid")
orderby Int32.Parse(cwe.Attribute("cweid").Value)
select cwe.Descendants().Where(c => c.Name.LocalName == "flaw"));
flaws
.SelectMany(f => f.Select(x => new Flaw(x)))
.Where(x => new[] { 4, 5 }.Contains(x.severity) && !x.hasMitigations && x.remediation_status == "New")
.OrderByDescending(x => x.severity)
.ThenBy(x => x.categoryid)
.ThenBy(x => x.cweid)
.ThenBy(x => x.issueid).Dump();
//DumpTop20(cwes);
// DumpSummary(cwes);
// DumpModules(cwes);
// DumpByCweID(cwes);
}
void DumpTop20(IEnumerable<Cwe> cwes)
{
cwes.Where(cwe => cwe.count > 1 && new[] { 78, 15, 89 }.Contains(cwe.id))
.Select(cwe => new { cwe.severity, cwe.category, cwe.details })
.OrderByDescending(cwe => cwe.severity)
.Dump($"Top 20: ({cwes.Where(cwe => cwe.count > 1).Count()})");
}
void DumpSummary(IEnumerable<Cwe> cwes)
{
cwes.Where(cwe => cwe.count > 1)
.OrderByDescending(cwe => cwe.severity).ThenByDescending(cwe => cwe.count)
.Dump($"Summary: ({cwes.Where(cwe => cwe.count > 1).Count()})");
}
void DumpModules(IEnumerable<Cwe> cwes)
{
var regex = new Regex(@"\.Test\.|\.IntegrationTests\.|\.UnitTests\.");
var modules = from m in xmlDoc.Descendants()
where m.Name.LocalName == "module" && m.Parent.Name.LocalName == "modules"
select new Module(m, cwes);
modules.Where(m => !regex.IsMatch(m.name) && m.totalNumberOfFlaws > 0)
.OrderBy(m => m.score).ThenByDescending(m => m.numberOfImportantFlaws)
.Dump($"Modules: ({modules.Count(m => !regex.IsMatch(m.name) && m.totalNumberOfFlaws > 0)})");
}
void DumpByCweID(IEnumerable<Cwe> cwes)
{
cwes.Where(cwe => cwe.count > 1)
.OrderBy(cwe => cwe.id).ToList()
.ForEach(cwe => cwe.details.Dump($"ID: {cwe.id} {cwe.name} ({cwe.count})"));
//JsonConvert.SerializeObject(cwes, Newtonsoft.Json.Formatting.Indented).Dump("Json");
}
internal IEnumerable<Cwe> ParseVeracodeReport(XDocument xmlDoc)
{
return from module in xmlDoc.Descendants()
where module.Name.LocalName == "cwe"
&& module.Attributes().Any(a => a.Name == "cweid")
orderby Int32.Parse(module.Attribute("cweid").Value)
select new Cwe(module);
}
public static class IntExtensions
{
public static string SeverityLabel(this int severity)
{
switch (severity)
{
case 5: return "Very High";
case 4: return "High";
case 3: return "Medium";
case 2: return "Low";
case 1: return "Very Low";
default: return "Informational";
}
}
public static string CategoryLabel(this int category)
{
switch (category)
{
case 18: return "OS Command Injection";
case 19: return "SQL Injections";
case 24: return "Untrusted Initialization";
case 21: return "CRLF Injection";
case 10: return "Credentials Management";
default: return $"{category}";
}
}
}
internal class Module
{
public string name { get; set; }
public int score { get; set; }
public int totalNumberOfFlaws => flawsBySeverity.Values.Sum();
public int numberOfImportantFlaws => flawsBySeverity.Where(f => f.Key > 2).Select(f => f.Value).Sum();
private Dictionary<int, int> flawsBySeverity { get; set; }
public string flawsSummaryInfo => totalNumberOfFlaws > 0
? flawsBySeverity.Where(f => f.Value > 0).OrderByDescending(f => f.Key).Aggregate(new StringBuilder("Severity\n"), (x, y) =>
x.Append($"{y.Key.SeverityLabel()}: {y.Value}\r\n")).ToString().TrimEnd(new[] { '\r', '\n' })
: "";
public List<Severity> summary => totalNumberOfFlaws > 0
? flawsBySeverity.Where(f => f.Value > 0)
.OrderByDescending(f => f.Key)
.Select(y => new Severity
{
severity = y.Key,
Count = y.Value
}).ToList()
: new List<Severity>();
public string flawListInfo => !flaws.Any()
? "" : flaws.Aggregate(new StringBuilder("path\tfile\tline\ttype\n"), (x, y) =>
x.AppendLine($"{(string.IsNullOrEmpty(y.source.sourcefile) ? "na" : Path.GetDirectoryName(y.source.sourcefile))}\t"
+ $"{(string.IsNullOrEmpty(y.source.sourcefile) ? "na" : Path.GetFileName(y.source.sourcefile))}\t{y.source.line}\t{y.source.type}")).ToString();
public List<ModuleFlaw> flawList => !flaws.Any() ? null : flaws
.ConvertAll(y => (ModuleFlaw)y.source);
private List<ModuleSummary> flaws { get; set; }
public Module(XElement module, IEnumerable<Cwe> cwes)
{
name = module.Attribute("name")?.Value;
score = Convert.ToInt32(module.Attribute("score")?.Value ?? "0");
flawsBySeverity = new Dictionary<int, int>();
flawsBySeverity[0] = Convert.ToInt32(module.Attribute("numflawssev0")?.Value ?? "0");
flawsBySeverity[1] = Convert.ToInt32(module.Attribute("numflawssev1")?.Value ?? "0");
flawsBySeverity[2] = Convert.ToInt32(module.Attribute("numflawssev2")?.Value ?? "0");
flawsBySeverity[3] = Convert.ToInt32(module.Attribute("numflawssev3")?.Value ?? "0");
flawsBySeverity[4] = Convert.ToInt32(module.Attribute("numflawssev4")?.Value ?? "0");
flawsBySeverity[5] = Convert.ToInt32(module.Attribute("numflawssev5")?.Value ?? "0");
var cx = cwes.Where(c => c.details.Any(d => d.module.Equals(name, StringComparison.CurrentCultureIgnoreCase)));
flaws = cx.SelectMany(c => c.details.Where(d => d.module.Equals(name, StringComparison.CurrentCultureIgnoreCase)).Select(d => new ModuleFlaw(d)))
.GroupBy(d => $"{d.type}{d.sourcefile}{d.line}")
.Select(grp => new ModuleSummary
{
key = grp.Key,
source = grp.First(),
count = grp.Count()
})
.OrderBy(grp => grp.source.sourcefile).ThenBy(grp => grp.source.line).ThenBy(grp => grp.source.type).ToList();
}
object ToDump() => new
{
Info = new
{
name,
score = score.ToString().PadLeft(3),
totalNumberOfFlaws = totalNumberOfFlaws.ToString().PadLeft(5),
numberOfImportantFlaws = numberOfImportantFlaws.ToString().PadLeft(5)
},
summary,
flaws = flawList
};
}
internal class ModuleSummary
{
public string key { get; set; }
public ModuleFlaw source { get; set; }
public int count { get; set; }
}
internal class Severity
{
public string Level => severity.SeverityLabel();
internal int severity { get; set; }
public int Count { get; set; }
object ToDump() => new
{
Level,
Count = Count.ToString().PadLeft(4)
};
}
internal class ModuleFlaw
{
public string type { get; set; }
internal string sourcefile { get; set; }
public string path => string.IsNullOrEmpty(sourcefile) ? "n/a" : System.IO.Path.GetDirectoryName(sourcefile);
public string file => string.IsNullOrEmpty(sourcefile) ? "n/a" : System.IO.Path.GetFileName(sourcefile);
public int count { get; set; }
public int line { get; set; }
public int issueid { get; set; }
public int severity { get; set; }
public int cweid { get; set; }
public string cwename { get; set; }
public string remediation_status{ get; set; }
public int categoryid { get; set; }
public bool hasMitigations { get; set; }
public ModuleFlaw(XElement element)
{
var cwe = element.Ancestors().Where(e => e.Name.LocalName == "cwe").LastOrDefault();
cwename = cwe.Attribute("cwename")?.Value ?? "";
hasMitigations = element.Descendants().Any(sfd => sfd.Name.LocalName == "mitigations");
var regex = new Regex(@"\.!newinit_0_[0-9]|mscorlib_dll|system_xml_dll|system_web_dll|system_data_dll|system_directoryservices_dll|system_dll\.");
type = regex.Replace(element.Attribute("type")?.Value, "").Trim(new[] { '.' });
sourcefile = System.IO.Path.Combine((element.Attribute("sourcefilepath")?.Value ?? "").Replace("/jazz new", ""),
element.Attribute("sourcefile")?.Value ?? "");
remediation_status = element.Attribute("remediation_status")?.Value ?? "";
line = Convert.ToInt32(element.Attribute("line")?.Value ?? "0");
count = Convert.ToInt32(element.Attribute("count")?.Value ?? "0");
issueid = Convert.ToInt32(element.Attribute("issueid")?.Value ?? "0");
severity = Convert.ToInt32(element.Attribute("severity")?.Value ?? "0");
cweid = Convert.ToInt32(element.Attribute("cweid")?.Value ?? "0");
categoryid = Convert.ToInt32(element.Attribute("categoryid")?.Value ?? "0");
}
public ModuleFlaw(Flaw flaw)
{
hasMitigations = flaw.hasMitigations;
type = flaw.type;
sourcefile = flaw.sourcefile;
line = flaw.line;
}
object ToDump() => new
{
categoryid = categoryid.ToString().PadLeft(5),
cweid = cweid.ToString().PadLeft(5),
hasMitigations,
type,
path,
file,
line = line.ToString().PadLeft(5),
count = count.ToString().PadLeft(5),
issueid = issueid.ToString().PadLeft(5),
severity = severity.SeverityLabel()
};
}
internal class Flaw : ModuleFlaw
{
public string module { get; set; }
public string description { get; set; }
public Flaw(XElement element)
: base(element)
{
module = string.Join("\r\n", element.Attribute("module")?.Value.Split("/".ToCharArray()));
description = element.Attribute("description")?.Value;
}
object ToDump() => new
{
Info = new
{
categoryid = $"{categoryid.CategoryLabel()} ({categoryid})",
cweid = cweid.ToString().PadLeft(5),
cwename,
hasMitigations,
type,
path,
file,
line = line.ToString().PadLeft(5),
count = count.ToString().PadLeft(5),
issueid = issueid.ToString().PadLeft(5),
severity = severity.SeverityLabel()
},
description
};
}
internal class Cwe
{
public int id { get; set; }
public string category { get; set; }
public string name { get; set; }
public int severity { get; set; }
public int count { get; set; }
public string recommendation { get; set; }
public IEnumerable<Flaw> details { get; set; }
public Cwe(XElement module)
{
var categoryElement = module.Parent;
var severityElement = categoryElement.Parent;
severity = Convert.ToInt32(severityElement.Attribute("level")?.Value ?? "0");
category = categoryElement.Attribute("categoryname")?.Value ?? "";
var recommendations = categoryElement.Descendants().Where(d => d.Name.LocalName == "recommendations");
var content = recommendations.Descendants();
recommendation = string.Join("\r\n", content.ToList().Select(n => (n.Name.LocalName == "bulletitem" ? "- " : "") + n.Attribute("text")?.Value));
id = Convert.ToInt32(module.Attribute("cweid").Value);
name = module.Attribute("cwename").Value;
var staticFlaws = module.XPathSelectElements("./*").Where(m => m.Name.LocalName == "staticflaws");
var flaws = (staticFlaws.SelectMany(m => m.XPathSelectElements("./*").Where(sf => sf.Name.LocalName == "flaw")))?.ToList()
.Select(f => new Flaw(f))
.GroupBy(grp => new { grp.module, grp.type, grp.description })
.Select(x => x.First());
details = flaws
.Where(f => !f.hasMitigations)
.OrderBy(d => d.type).ThenBy(d => d.module).ThenBy(d => d.description);
count = details.Count();
}
object ToDump() => new
{
Info = new
{
Name = name,
Category = $"{category} ({id})",
Severity = severity.SeverityLabel(),
wo_Tests = count
},
recommendation
};
}
+293
View File
@@ -0,0 +1,293 @@
<Query Kind="Program">
<Reference>&lt;ProgramFilesX64&gt;\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll</Reference>
<NuGetReference>Amazon.Lambda.S3Events</NuGetReference>
<NuGetReference>AWSSDK.Core</NuGetReference>
<NuGetReference>AWSSDK.S3</NuGetReference>
<Namespace>Amazon</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy</Namespace>
<Namespace>Amazon.Auth.AccessControlPolicy.ActionIdentifiers</Namespace>
<Namespace>Amazon.Internal</Namespace>
<Namespace>Amazon.Lambda.S3Events</Namespace>
<Namespace>Amazon.MissingTypes</Namespace>
<Namespace>Amazon.Runtime</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement</Namespace>
<Namespace>Amazon.Runtime.CredentialManagement.Internal</Namespace>
<Namespace>Amazon.Runtime.EventStreams</Namespace>
<Namespace>Amazon.Runtime.EventStreams.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal</Namespace>
<Namespace>Amazon.Runtime.Internal.Auth</Namespace>
<Namespace>Amazon.Runtime.Internal.Settings</Namespace>
<Namespace>Amazon.Runtime.Internal.Transform</Namespace>
<Namespace>Amazon.Runtime.Internal.Util</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces</Namespace>
<Namespace>Amazon.Runtime.SharedInterfaces.Internal</Namespace>
<Namespace>Amazon.S3</Namespace>
<Namespace>Amazon.S3.Encryption</Namespace>
<Namespace>Amazon.S3.Encryption.Internal</Namespace>
<Namespace>Amazon.S3.Internal</Namespace>
<Namespace>Amazon.S3.IO</Namespace>
<Namespace>Amazon.S3.Model</Namespace>
<Namespace>Amazon.S3.Model.Internal.MarshallTransformations</Namespace>
<Namespace>Amazon.S3.Transfer</Namespace>
<Namespace>Amazon.S3.Util</Namespace>
<Namespace>Amazon.Util</Namespace>
<Namespace>Amazon.Util.Internal</Namespace>
<Namespace>Amazon.Util.Internal.PlatformServices</Namespace>
<Namespace>Newtonsoft.Json</Namespace>
<Namespace>Newtonsoft.Json.Converters</Namespace>
<Namespace>Newtonsoft.Json.Linq</Namespace>
<Namespace>Newtonsoft.Json.Schema</Namespace>
<Namespace>Newtonsoft.Json.Serialization</Namespace>
<Namespace>System</Namespace>
<Namespace>System.ComponentModel.Composition</Namespace>
<Namespace>System.ComponentModel.Composition.Hosting</Namespace>
<Namespace>System.ComponentModel.Composition.Primitives</Namespace>
<Namespace>System.ComponentModel.Composition.ReflectionModel</Namespace>
<Namespace>System.Diagnostics</Namespace>
<Namespace>System.Diagnostics.Tracing</Namespace>
<Namespace>System.IO.Compression</Namespace>
<Namespace>System.Net.Http</Namespace>
<Namespace>System.Net.Http.Headers</Namespace>
<Namespace>System.Numerics</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1</Namespace>
<Namespace>ThirdParty.BouncyCastle.Asn1.Utilities</Namespace>
<Namespace>ThirdParty.BouncyCastle.Math</Namespace>
<Namespace>ThirdParty.BouncyCastle.OpenSsl</Namespace>
<Namespace>ThirdParty.BouncyCastle.Utilities.IO.Pem</Namespace>
<Namespace>ThirdParty.Ionic.Zlib</Namespace>
<Namespace>ThirdParty.Json.LitJson</Namespace>
<Namespace>ThirdParty.MD5</Namespace>
</Query>
//private string xmlAnalyticsFile = @"C:\Users\tlamb\Downloads\detailedreport_Strata_Jazz_Web_Jazz_web_201911511115217.xml";
private string xmlAnalyticsFile = @"C:\Users\tlamb\Downloads\detailedreport_Strata_Jazz_Web_Strata_Jazz_Web_201953102954843.xml";
public static class IntExtensions
{
public static string SeverityLabel(this int severity)
{
switch (severity)
{
case 5: return "Very High";
case 4: return "High";
case 3: return "Medium";
case 2: return "Low";
case 1: return "Very Low";
default: return "Informational";
}
}
}
internal class Module
{
public string name { get; set; }
public int score { get; set; }
public int totalNumberOfFlaws => flawsBySeverity.Values.Sum();
public int numberOfImportantFlaws => flawsBySeverity.Where(f => f.Key > 2).Select(f => f.Value).Sum();
private Dictionary<int, int> flawsBySeverity { get; set; }
public string flawsSummary => totalNumberOfFlaws > 0
? flawsBySeverity.Where(f => f.Value > 0).OrderByDescending(f => f.Key).Aggregate(new StringBuilder("Severity\n"), (x, y) =>
x.Append($"{y.Key.SeverityLabel()}: {y.Value}\r\n")).ToString().TrimEnd(new[] { '\r', '\n' })
: "";
public IEnumerable<ModuleFlaw> flaws { get; set; }
public string flawList => !flaws.Any()
? "" : flaws.Aggregate(new StringBuilder("path\tfile\tline\ttype\n"), (x, y) =>
x.AppendLine($"{(string.IsNullOrEmpty(y.sourcefile) ? "na" : Path.GetDirectoryName(y.sourcefile))}\t"
+ $"{(string.IsNullOrEmpty(y.sourcefile) ? "na" : Path.GetFileName(y.sourcefile))}\t{y.line}\t{y.type}")).ToString();
public Module(XElement module, IEnumerable<Cwe> cwes)
{
name = module.Attribute("name")?.Value;
score = Convert.ToInt32(module.Attribute("score")?.Value ?? "0");
flawsBySeverity = new Dictionary<int, int>();
flawsBySeverity[0] = Convert.ToInt32(module.Attribute("numflawssev0")?.Value ?? "0");
flawsBySeverity[1] = Convert.ToInt32(module.Attribute("numflawssev1")?.Value ?? "0");
flawsBySeverity[2] = Convert.ToInt32(module.Attribute("numflawssev2")?.Value ?? "0");
flawsBySeverity[3] = Convert.ToInt32(module.Attribute("numflawssev3")?.Value ?? "0");
flawsBySeverity[4] = Convert.ToInt32(module.Attribute("numflawssev4")?.Value ?? "0");
flawsBySeverity[5] = Convert.ToInt32(module.Attribute("numflawssev5")?.Value ?? "0");
var cx = cwes.Where(c => c.details.Any(d => d.module.Equals(name, StringComparison.CurrentCultureIgnoreCase)));
flaws = cx.SelectMany(c => c.details.Where(d => d.module.Equals(name, StringComparison.CurrentCultureIgnoreCase))
.Select(d => new ModuleFlaw(d)))
//.GroupBy(d => $"{d.type}{d.sourcefile}{d.line}").Select(grp => grp.First())
.OrderBy(grp => grp.sourcefile).ThenBy(grp => grp.line).ThenBy(grp => grp.type);
}
}
internal class ModuleFlaw
{
public string type { get; set; }
public string sourcefile { get; set; }
public int line { get; set; }
public bool hasMitigations { get; set; }
public ModuleFlaw(XElement element)
{
hasMitigations = element.Descendants().Any(sfd => sfd.Name.LocalName == "mitigations");
var regex = new Regex(@"\.!newinit_0_[0-9]|mscorlib_dll|system_xml_dll|system_web_dll|system_data_dll|system_directoryservices_dll|system_dll\.");
type = regex.Replace(element.Attribute("type")?.Value, "").Trim(new[] { '.' });
sourcefile = System.IO.Path.Combine((element.Attribute("sourcefilepath")?.Value ?? "").Replace("/jazz new", ""),
element.Attribute("sourcefile")?.Value ?? "");
line = Convert.ToInt32(element.Attribute("line")?.Value ?? "0");
}
public ModuleFlaw(Flaw flaw)
{
hasMitigations = flaw.hasMitigations;
type = flaw.type;
sourcefile = flaw.sourcefile;
line = flaw.line;
}
}
internal class Flaw : ModuleFlaw
{
public string module { get; set; }
public string description { get; set; }
public string grace_period_expires { get; set; }
public string remediation_status { get; set; }
public bool remediated => (remediation_status == "Fixed");
public Flaw(XElement element)
: base(element)
{
module = string.Join("\r\n", element.Attribute("module")?.Value.Split("/".ToCharArray()));
description = element.Attribute("description")?.Value;
DateTime parsedDate;
var theDate = System.Net.WebUtility.HtmlDecode(element.Attribute("grace_period_expires")?.Value).Replace(" UTC", "Z");
if (DateTime.TryParse(theDate, out parsedDate))
{
grace_period_expires = parsedDate.ToShortDateString();
}
else
{
grace_period_expires = string.Empty;
}
remediation_status = element.Attribute("remediation_status")?.Value;
}
}
internal class Cwe
{
public int id { get; set; }
public string category { get; set; }
public string name { get; set; }
public int severity { get; set; }
public int count { get; set; }
public string recommendation { get; set; }
public IEnumerable<Flaw> details { get; set; }
public Cwe(XElement module)
{
var categoryElement = module.Parent;
var severityElement = categoryElement.Parent;
severity = Convert.ToInt32(severityElement.Attribute("level")?.Value ?? "0");
category = categoryElement.Attribute("categoryname")?.Value ?? "";
var recommendations = categoryElement.Descendants().Where(d => d.Name.LocalName == "recommendations");
var content = recommendations.Descendants();
recommendation = string.Join("\r\n", content.ToList().Select(n => (n.Name.LocalName == "bulletitem" ? "- " : "") + n.Attribute("text")?.Value));
id = Convert.ToInt32(module.Attribute("cweid").Value);
name = module.Attribute("cwename").Value;
var staticFlaws = module.XPathSelectElements("./*").Where(m => m.Name.LocalName == "staticflaws");
var flaws = (staticFlaws.SelectMany(m => m.XPathSelectElements("./*").Where(sf => sf.Name.LocalName == "flaw")))?.ToList()
.Select(f => new Flaw(f));
//.GroupBy(grp => new { grp.module, grp.type, grp.description })
//.Select(x => x.First());
details = flaws
//.Where(f => !f.hasMitigations)
.OrderBy(d => d.type).ThenBy(d => d.module).ThenBy(d => d.description);
count = details.Count();
}
}
internal IEnumerable<Cwe> ParseVeracodeReport(XDocument xmlDoc)
{
return from module in xmlDoc.Descendants()
where module.Name.LocalName == "cwe"
&& module.Attributes().Any(a => a.Name == "cweid")
orderby Int32.Parse(module.Attribute("cweid").Value)
select new Cwe(module);
}
void Main()
{
XDocument xmlDoc = XDocument.Load(xmlAnalyticsFile);
//xmlDoc.DumpFormatted();
var cwes = ParseVeracodeReport(xmlDoc).Where(cwe => cwe.count > 0);
cwes
.SelectMany(c => c.details.Select(d => new
{
c.severity,
c.category,
c.id,
c.name,
d.type,
d.sourcefile,
line = d.line.ToString(),
d.hasMitigations,
d.module,
d.grace_period_expires,
d.remediation_status,
d.remediated
}))
.Where(c => !c.remediated)
.OrderByDescending(c => c.severity).ThenBy(c => c.category).ThenBy(c => c.module).ThenBy(c => c.sourcefile).ThenBy(c => c.type).ThenBy(c => c.line)
.GroupBy(c => new
{
Severity = c.severity.SeverityLabel(),
Category = c.category,
CWE_Id = c.id.ToString(),
Description = c.name
}, (key, group) => new
{
Severity = key,
Items = group.ToList().Select(g => new
{
g.type,
g.sourcefile,
g.line,
g.hasMitigations,
g.module,
g.grace_period_expires
})
})
.Dump();
// cwes.SelectMany(c => c.details.Select(d => new { c.category, c.name, d.type, d.sourcefile, line = d.line.ToString(), d.hasMitigations, d.module }))
// .Where(c => c.module.Contains(".dss."))
// .OrderBy(c => c.module).ThenBy(c => c.category).ThenBy(c => c.sourcefile).ThenBy(c => c.type).ThenBy(c => c.line)
// .Dump();
// cwes.Where(cwe => cwe.count > 1)
// .OrderByDescending(cwe => cwe.severity).ThenByDescending(cwe => cwe.count)
// .Select(cwe => new
// {
// severity = cwe.severity.SeverityLabel(),
// category_id = $"{cwe.category} ({cwe.id})",
// wo_Tests = cwe.count,
// cwe.name,
// cwe.recommendation })
// .Dump($"Summary: ({cwes.Where(cwe => cwe.count > 1).Count()})");
//
// var regex = new Regex(@"\.Test\.|\.IntegrationTests\.|\.UnitTests\.");
// var modules = from m in xmlDoc.Descendants()
// where m.Name.LocalName == "module" && m.Parent.Name.LocalName == "modules"
// select new Module(m, cwes);
// modules.Where(m => !regex.IsMatch(m.name) && m.totalNumberOfFlaws > 0)
// .Select(m => new {m.name, m.score, m.totalNumberOfFlaws, m.numberOfImportantFlaws, m.flawsSummary, m.flawList})
// .Dump($"Modules: ({modules.Count(m => !regex.IsMatch(m.name) && m.totalNumberOfFlaws > 0)})");
//
// modules.Where(m => !regex.IsMatch(m.name) && m.totalNumberOfFlaws > 0
// && new [] {"Strata.CS.Jazz.Biz.DSS.Episodes.EpisodeDefinition.dll","Strata.CS.Jazz.Biz.DSS.Episodes.dll","Strata.Administrator.Base.dll"}.Contains(m.name))
// .Select(m => new { m.name, m.flaws })
// .Dump($"Module Flaws: ({modules.Count(m => !regex.IsMatch(m.name) && m.totalNumberOfFlaws > 0)})");
//
// cwes.Where(cwe => cwe.count > 1)
// .OrderBy(cwe => cwe.id).ToList()
// .ForEach(cwe => cwe.details.Dump($"ID: {cwe.id} {cwe.name} ({cwe.count})"));
// //JsonConvert.SerializeObject(cwes, Newtonsoft.Json.Formatting.Indented).Dump("Json");
}

Some files were not shown because too many files have changed in this diff Show More