Analysis-Services/AsPartitionProcessing/AsPartitionProcessing.SampleClient/Program.cs

359 lines
15 KiB
C#
Raw Permalink Normal View History

2016-12-02 11:25:57 +08:00
using System;
using System.Collections.Generic;
using Microsoft.AnalysisServices.Tabular;
using System.Diagnostics;
2016-12-02 11:25:57 +08:00
namespace AsPartitionProcessing.SampleClient
{
2017-01-09 12:02:38 +08:00
#region enum ExecutionMode
/// <summary>
/// Execution mode of the SampleClient application.
/// </summary>
enum ExecutionMode
2016-12-06 13:37:16 +08:00
{
2017-01-09 12:02:38 +08:00
/// <summary>
/// Initialize configuration inline using sample values.
/// </summary>
2016-12-06 13:37:16 +08:00
InitializeInline,
2017-01-09 12:02:38 +08:00
/// <summary>
/// Initialize from configuration and logging database.
/// </summary>
2016-12-06 13:37:16 +08:00
InitializeFromDatabase,
2017-01-09 12:02:38 +08:00
/// <summary>
/// Merge partitions in a table based on other parameters.
/// </summary>
2016-12-19 16:43:00 +08:00
MergePartitions,
2017-01-09 12:02:38 +08:00
/// <summary>
/// Defragment partitioned tables in the model. List of partitioned tables defined in the configuration and logging database.
/// </summary>
2016-12-19 16:43:00 +08:00
DefragPartitionedTables
2016-12-06 13:37:16 +08:00
}
2017-01-09 12:02:38 +08:00
#endregion
2016-12-02 11:25:57 +08:00
class Program
{
2016-12-06 13:37:16 +08:00
//Set sample execution mode here:
private static ExecutionMode _executionMode = ExecutionMode.InitializeInline;
private static string _modelConfigurationIDs;
2016-12-02 11:25:57 +08:00
2017-01-07 12:18:32 +08:00
static int Main(string[] args)
2016-12-02 11:25:57 +08:00
{
try
{
2017-01-07 12:18:32 +08:00
#region Set defaults for merging & read command-line arguments if provided
2017-01-07 12:18:32 +08:00
string mergeTable = "Internet Sales";
Granularity mergeTargetGranuarity = Granularity.Yearly;
string mergePartitionKey = "2012";
2017-01-09 12:02:38 +08:00
bool help;
2017-01-07 12:18:32 +08:00
2017-01-09 12:02:38 +08:00
ParseArgs(args, ref mergeTable, ref mergeTargetGranuarity, ref mergePartitionKey, out help);
if (help)
return 0; //ERROR_SUCCESS
#endregion
2017-01-07 12:18:32 +08:00
2017-01-09 12:02:38 +08:00
if (_executionMode == ExecutionMode.InitializeInline)
2016-12-02 11:25:57 +08:00
{
//Perform Processing
PartitionProcessor.PerformProcessing(InitializeInline(), LogMessage);
2016-12-02 11:25:57 +08:00
}
else
2016-12-02 11:25:57 +08:00
{
List<ModelConfiguration> modelsConfig = InitializeFromDatabase();
2016-12-02 11:25:57 +08:00
foreach (ModelConfiguration modelConfig in modelsConfig)
2016-12-19 16:43:00 +08:00
{
SetCredentials(modelConfig); //For Azure AS
switch (_executionMode)
{
2017-01-09 12:02:38 +08:00
case ExecutionMode.InitializeFromDatabase:
//Perform Processing
PartitionProcessor.PerformProcessing(modelConfig, LogMessage);
break;
2017-01-09 12:02:38 +08:00
case ExecutionMode.MergePartitions:
//Perform Merging
2017-01-07 12:18:32 +08:00
PartitionProcessor.MergePartitions(modelConfig, LogMessage, mergeTable, mergeTargetGranuarity, mergePartitionKey);
break;
2017-01-09 12:02:38 +08:00
case ExecutionMode.DefragPartitionedTables:
//Perform Defrag
PartitionProcessor.DefragPartitionedTables(modelConfig, LogMessage);
break;
default:
break;
}
2016-12-06 13:37:16 +08:00
}
2016-12-02 11:25:57 +08:00
}
}
catch (Exception exc)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine();
2017-01-09 12:02:38 +08:00
Console.WriteLine(exc.Message);
2016-12-19 16:43:00 +08:00
Console.WriteLine();
2017-01-07 12:18:32 +08:00
Console.ForegroundColor = ConsoleColor.White;
if (exc is ArgumentException)
{
return 160; //ERROR_BAD_ARGUMENTS
}
else
{
return 1360; //ERROR_GENERIC_NOT_MAPPED
}
2016-12-02 11:25:57 +08:00
}
2017-01-09 12:02:38 +08:00
finally
{
2017-01-09 12:02:38 +08:00
if (Debugger.IsAttached)
{
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
2017-01-07 12:18:32 +08:00
return 0; //ERROR_SUCCESS
2016-12-02 11:25:57 +08:00
}
private static ModelConfiguration InitializeInline()
2016-12-02 11:25:57 +08:00
{
ModelConfiguration partitionedModel = new ModelConfiguration(
modelConfigurationID: 1,
analysisServicesServer: "localhost",
analysisServicesDatabase: "AdventureWorks",
initialSetUp: true,
incrementalOnline: true,
integratedAuth: true,
userName: "",
password: "",
2016-12-29 08:58:53 +08:00
maxParallelism: -1,
2016-12-20 16:34:25 +08:00
commitTimeout: -1,
2017-04-19 09:48:52 +08:00
retryAttempts: 0,
retryWaitTimeSeconds: 0,
2016-12-02 11:25:57 +08:00
tableConfigurations:
new List<TableConfiguration>
{
new TableConfiguration(
tableConfigurationID: 1,
analysisServicesTable: "Internet Sales",
partitioningConfigurations:
new List<PartitioningConfiguration>
{
new PartitioningConfiguration(
partitioningConfigurationID: 1,
granularity: Granularity.Monthly,
numberOfPartitionsFull: 12,
numberOfPartitionsForIncrementalProcess: 3,
maxDateIsNow: false,
2016-12-02 11:25:57 +08:00
maxDate: Convert.ToDateTime("2012-12-01"),
integerDateKey: true,
2017-04-18 11:14:33 +08:00
templateSourceQuery:
"let\n" +
" Source = #\"AdventureWorks\",\n" +
" dbo_FactInternetSales = Source{[Schema=\"dbo\",Item=\"FactInternetSales\"]}[Data],\n" +
2017-04-18 12:15:07 +08:00
" #\"Filtered Rows\" = Table.SelectRows(dbo_FactInternetSales, each [OrderDateKey] >= {0} and [OrderDateKey] < {1}),\n" +
" #\"Sorted Rows\" = Table.Sort(#\"Filtered Rows\",{{\"OrderDateKey\", Order.Ascending}})\n" +
2017-04-18 11:14:33 +08:00
"in\n" +
" #\"Sorted Rows\"\n"
2016-12-02 11:25:57 +08:00
)
}
),
new TableConfiguration(
tableConfigurationID: 2,
analysisServicesTable: "Reseller Sales",
partitioningConfigurations:
new List<PartitioningConfiguration>
{
new PartitioningConfiguration(
partitioningConfigurationID: 2,
granularity: Granularity.Yearly,
numberOfPartitionsFull: 3,
numberOfPartitionsForIncrementalProcess: 1,
maxDateIsNow: false,
2016-12-02 11:25:57 +08:00
maxDate: Convert.ToDateTime("2012-12-01"),
2017-04-18 11:14:33 +08:00
integerDateKey: false,
templateSourceQuery:
"let\n" +
" Source = #\"AdventureWorks\",\n" +
" dbo_FactResellerSales = Source{[Schema=\"dbo\",Item=\"FactResellerSales\"]}[Data],\n" +
2017-04-18 12:15:07 +08:00
" #\"Filtered Rows\" = Table.SelectRows(dbo_FactResellerSales, each [OrderDate] >= {0} and [OrderDate] < {1}),\n" +
" #\"Sorted Rows\" = Table.Sort(#\"Filtered Rows\",{{\"OrderDate\", Order.Ascending}})\n" +
2017-04-18 11:14:33 +08:00
"in\n" +
" #\"Sorted Rows\"\n"
2016-12-02 11:25:57 +08:00
)
}
)
}
);
return partitionedModel;
2016-12-02 11:25:57 +08:00
}
private static List<ModelConfiguration> InitializeFromDatabase()
{
ConfigDatabaseConnectionInfo connectionInfo = new ConfigDatabaseConnectionInfo();
connectionInfo.Server = Settings.Default.ConfigServer;
connectionInfo.Database = Settings.Default.ConfigDatabase;
connectionInfo.IntegratedAuth = Settings.Default.ConfigDatabaseIntegratedAuth;
if (!Settings.Default.ConfigDatabaseIntegratedAuth)
{
Console.Write("User name for config database: ");
connectionInfo.UserName = Console.ReadLine();
Console.Write("Password for config database: ");
connectionInfo.Password = ReadPassword();
}
return ConfigDatabaseHelper.ReadConfig(connectionInfo, _modelConfigurationIDs);
2016-12-02 11:25:57 +08:00
}
2017-01-10 02:43:07 +08:00
private static void ParseArgs(string[] args, ref string mergeTable, ref Granularity mergeTargetGranuarity, ref string mergePartitionKey, out bool help)
{
help = false;
if (args.Length > 0)
{
ArgumentOptions options = new ArgumentOptions();
if (CommandLine.Parser.Default.ParseArguments(args, options))
{
if (!String.IsNullOrEmpty(options.ModelConfigurationIDs))
{
Console.WriteLine($"ModelConfigurationIDs: {options.ModelConfigurationIDs}");
_modelConfigurationIDs = options.ModelConfigurationIDs;
}
2017-01-10 02:43:07 +08:00
Console.WriteLine($"Argument ExecutionMode: {options.ExecutionMode}");
switch (options.ExecutionMode)
{
case "InitializeInline":
_executionMode = ExecutionMode.InitializeInline;
break;
case "InitializeFromDatabase":
_executionMode = ExecutionMode.InitializeFromDatabase;
break;
case "MergePartitions":
_executionMode = ExecutionMode.MergePartitions;
if (options.MergeTable == null || options.TargetGranularity == null || options.MergePartitionKey == null)
{
throw new ArgumentException($"ExecutionMode MergePartitions additional arguments not provided or not recognized. Requires --MergeTable, --TargetGranularity, --MergePartitionKey.");
}
Console.WriteLine($"Argument MergeTable: {options.MergeTable}");
Console.WriteLine($"Argument TargetGranularity: {options.TargetGranularity}");
Console.WriteLine($"Argument MergePartitionKey: {options.MergePartitionKey}");
mergeTable = options.MergeTable;
mergeTargetGranuarity = options.TargetGranularity == "Yearly" ? Granularity.Yearly : Granularity.Monthly;
mergePartitionKey = options.MergePartitionKey;
break;
case "DefragPartitionedTables":
_executionMode = ExecutionMode.DefragPartitionedTables;
break;
default:
throw new ArgumentException($"Argument --ExecutionMode {options.ExecutionMode} not recognized.");
//break;
}
}
else
{
if (args[0].ToLower() != "--help")
{
throw new ArgumentException($"Arguments provided not recognized.");
}
help = true;
}
}
}
2017-04-19 09:48:52 +08:00
private static void LogMessage(string message, MessageType messageType, ModelConfiguration partitionedModel)
2016-12-02 11:25:57 +08:00
{
//Can provide custom logger here
2016-12-06 13:37:16 +08:00
2016-12-02 11:25:57 +08:00
try
{
2017-01-09 12:02:38 +08:00
if (!(_executionMode == ExecutionMode.InitializeInline))
2016-12-06 13:37:16 +08:00
{
2017-04-19 09:48:52 +08:00
ConfigDatabaseHelper.LogMessage(message, messageType, partitionedModel);
2016-12-06 13:37:16 +08:00
}
2016-12-02 11:25:57 +08:00
Console.WriteLine(message);
}
catch (Exception exc)
{
2016-12-19 16:43:00 +08:00
Console.ForegroundColor = ConsoleColor.Red;
2016-12-02 11:25:57 +08:00
Console.WriteLine(exc.Message);
2016-12-19 16:43:00 +08:00
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.White;
2016-12-02 11:25:57 +08:00
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
2017-01-07 12:18:32 +08:00
Console.ForegroundColor = ConsoleColor.White;
2016-12-02 11:25:57 +08:00
Environment.Exit(0); //Avoid recursion if errored connecting to db
}
}
private static void SetCredentials(ModelConfiguration modelConfig)
{
if (!modelConfig.IntegratedAuth) //For Azure AS
{
Console.WriteLine();
Console.Write("User name for AS server: ");
modelConfig.UserName = Console.ReadLine();
Console.Write("Password for AS server: ");
modelConfig.Password = ReadPassword();
}
}
private static string ReadPassword()
2016-12-02 11:25:57 +08:00
{
string password = "";
ConsoleKeyInfo info = Console.ReadKey(true);
while (info.Key != ConsoleKey.Enter)
{
if (info.Key != ConsoleKey.Backspace)
{
Console.Write("*");
password += info.KeyChar;
}
else if (info.Key == ConsoleKey.Backspace)
{
if (!string.IsNullOrEmpty(password))
{
// remove one character from the list of password characters
password = password.Substring(0, password.Length - 1);
// get the location of the cursor
int pos = Console.CursorLeft;
// move the cursor to the left by one character
Console.SetCursorPosition(pos - 1, Console.CursorTop);
// replace it with space
Console.Write(" ");
// move the cursor to the left by one character again
Console.SetCursorPosition(pos - 1, Console.CursorTop);
}
}
info = Console.ReadKey(true);
}
// add a new line because user pressed enter at the end of password
Console.WriteLine();
return password;
}
}
}