private void TestIngestionBatchingPolicy( EntityType type, string name, TimeSpan maximumBatchingTimeSpan, int maximumNumberOfItems, int maximumRawDataSizeMb) { var commandText = new AlterIngestionBatchingPolicyCommand( type, new EntityName(name), maximumBatchingTimeSpan, maximumNumberOfItems, maximumRawDataSizeMb) .ToScript(null); var command = ParseOneCommand(commandText); Assert.IsType <AlterIngestionBatchingPolicyCommand>(command); }
private static CommandBase?CreateCommand( string script, KustoCode code, bool ignoreUnknownCommands) { var commandBlock = code.Syntax as CommandBlock; if (commandBlock == null) { throw new DeltaException("Script isn't a command"); } var unknownCommand = commandBlock.GetDescendants <UnknownCommand>().FirstOrDefault(); if (unknownCommand != null) { return(RerouteUnknownCommand(script, unknownCommand, ignoreUnknownCommands)); } else { var customCommand = commandBlock.GetUniqueDescendant <CustomCommand>("custom command"); switch (customCommand.CommandKind) { case "CreateFunction": case "CreateOrAlterFunction": return(CreateFunctionCommand.FromCode(commandBlock)); case "DropFunction": return(DropFunctionCommand.FromCode(commandBlock)); case "DropFunctions": return(DropFunctionsCommand.FromCode(commandBlock)); case "CreateTable": return(CreateTableCommand.FromCode(commandBlock)); case "CreateMergeTable": // We need to do this since the parsing is quite different with the with-node // between a .create and .create-merge (for unknown reasons) return(ParseAndCreateCommand( ReplaceFirstOccurence(script, "create-merge", "create"), ignoreUnknownCommands)); case "AlterMergeTable": return(ParseAndCreateCommand( ReplaceFirstOccurence(script, "alter-merge", "create"), ignoreUnknownCommands)); case "CreateTables": return(CreateTablesCommand.FromCode(commandBlock)); case "DropTable": return(DropTableCommand.FromCode(commandBlock)); case "DropTables": return(DropTablesCommand.FromCode(commandBlock)); case "AlterColumnType": return(AlterColumnTypeCommand.FromCode(commandBlock)); case "AlterMergeTableColumnDocStrings": return(AlterMergeTableColumnDocStringsCommand.FromCode(commandBlock)); case "DropTableColumns": return(DropTableColumnsCommand.FromCode(commandBlock)); case "CreateTableIngestionMapping": return(CreateMappingCommand.FromCode(commandBlock)); case "DropTableIngestionMapping": return(DropMappingCommand.FromCode(commandBlock)); case "AlterTablePolicyUpdate": return(AlterUpdatePolicyCommand.FromCode(commandBlock)); #region Policies case "AlterTablePolicyAutoDelete": return(AlterAutoDeletePolicyCommand.FromCode(commandBlock)); case "DeleteTablePolicyAutoDelete": return(DeleteAutoDeletePolicyCommand.FromCode(commandBlock)); case "AlterDatabasePolicyCaching": case "AlterTablePolicyCaching": var partitioning = commandBlock.GetDescendants <SyntaxElement>(s => s.Kind == SyntaxKind.PartitioningKeyword).Count(); if (partitioning == 1) { if (ignoreUnknownCommands) { return(null); } else { throw new DeltaException( $"Can't handle CommandKind 'AlterTablePolicyPartitioning'"); } } else { return(AlterCachingPolicyCommand.FromCode(commandBlock)); } case "DeleteDatabasePolicyCaching": case "DeleteTablePolicyCaching": return(DeleteCachingPolicyCommand.FromCode(commandBlock)); case "AlterDatabasePolicyIngestionBatching": case "AlterTablePolicyIngestionBatching": return(AlterIngestionBatchingPolicyCommand.FromCode(commandBlock)); case "DeleteDatabasePolicyIngestionBatching": case "DeleteTablePolicyIngestionBatching": return(DeleteIngestionBatchingPolicyCommand.FromCode(commandBlock)); case "AlterDatabasePolicyMerge": case "AlterTablePolicyMerge": return(AlterMergePolicyCommand.FromCode(commandBlock)); case "DeleteDatabasePolicyMerge": case "DeleteTablePolicyMerge": return(DeleteMergePolicyCommand.FromCode(commandBlock)); case "AlterDatabasePolicyRetention": case "AlterTablePolicyRetention": return(AlterRetentionPolicyCommand.FromCode(commandBlock)); case "AlterTablesPolicyRetention": return(AlterTablesRetentionPolicyCommand.FromCode(commandBlock)); case "DeleteDatabasePolicyRetention": case "DeleteTablePolicyRetention": return(DeleteRetentionPolicyCommand.FromCode(commandBlock)); case "AlterDatabasePolicySharding": case "AlterTablePolicySharding": return(AlterShardingPolicyCommand.FromCode(commandBlock)); case "DeleteDatabasePolicySharding": case "DeleteTablePolicySharding": return(DeleteShardingPolicyCommand.FromCode(commandBlock)); #endregion default: if (ignoreUnknownCommands) { return(null); } else { throw new DeltaException( $"Can't handle CommandKind '{customCommand.CommandKind}'"); } } } }
private IEnumerable <CommandBase> ComputeDelta(TableModel targetModel) { var includeFolder = !object.Equals(targetModel.Folder, Folder); var includeDocString = !object.Equals(targetModel.DocString, DocString); var currentColumns = Columns.ToImmutableDictionary(c => c.ColumnName); var targetColumns = targetModel.Columns.ToImmutableDictionary(c => c.ColumnName); var currentColumnNames = Columns.Select(c => c.ColumnName).ToImmutableHashSet(); var targetColumnNames = targetModel.Columns.Select(c => c.ColumnName).ToImmutableHashSet(); var dropColumnNames = currentColumnNames.Except(targetColumnNames); var createColumnNames = targetColumnNames.Except(currentColumnNames); var keepingColumnNames = currentColumnNames.Intersect(targetColumnNames); var updateTypeColumnNames = keepingColumnNames .Where(n => currentColumns[n].PrimitiveType != targetColumns[n].PrimitiveType); var updateDocStringColumnNames = keepingColumnNames .Where(n => !object.Equals( currentColumns[n].DocString, targetColumns[n].DocString)); var mappingCommands = MappingModel.ComputeDelta( TableName, Mappings, targetModel.Mappings); var autoDeletePolicyCommands = AlterAutoDeletePolicyCommand.ComputeDelta( AutoDeletePolicy, targetModel.AutoDeletePolicy); var cachingPolicyCommands = AlterCachingPolicyCommand.ComputeDelta(CachingPolicy, targetModel.CachingPolicy); var ingestionBatchingPolicyCommands = AlterIngestionBatchingPolicyCommand.ComputeDelta( IngestionBatchingPolicy, targetModel.IngestionBatchingPolicy); var mergePolicyCommands = AlterMergePolicyCommand.ComputeDelta( MergePolicy, targetModel.MergePolicy); var retentionPolicyCommands = AlterRetentionPolicyCommand.ComputeDelta( RetentionPolicy, targetModel.RetentionPolicy); var shardingPolicyCommands = AlterShardingPolicyCommand.ComputeDelta( ShardingPolicy, targetModel.ShardingPolicy); var updatePolicyCommands = AlterUpdatePolicyCommand.ComputeDelta(UpdatePolicy, targetModel.UpdatePolicy); if (dropColumnNames.Any()) { yield return(new DropTableColumnsCommand( TableName, dropColumnNames.ToImmutableArray())); } if (createColumnNames.Any() || includeFolder || includeDocString) { yield return(new CreateTableCommand( TableName, targetModel.Columns.Select( c => new TableColumn(c.ColumnName, c.PrimitiveType)), includeFolder ? (targetModel.Folder ?? QuotedText.Empty) : null, includeDocString ? (targetModel.DocString ?? QuotedText.Empty) : null)); } if (updateDocStringColumnNames.Any()) { yield return(new AlterMergeTableColumnDocStringsCommand( TableName, updateDocStringColumnNames.Select( n => new AlterMergeTableColumnDocStringsCommand.ColumnDocString( n, targetColumns[n].DocString != null ? targetColumns[n].DocString ! : QuotedText.Empty)))); } foreach (var columnName in updateTypeColumnNames) { yield return(new AlterColumnTypeCommand( TableName, columnName, targetColumns[columnName].PrimitiveType)); } foreach (var command in mappingCommands .Concat(autoDeletePolicyCommands) .Concat(cachingPolicyCommands) .Concat(ingestionBatchingPolicyCommands) .Concat(mergePolicyCommands) .Concat(retentionPolicyCommands) .Concat(shardingPolicyCommands) .Concat(updatePolicyCommands)) { yield return(command); } }