private void TestAutoDeletePolicy(
            string tableName,
            DateTime expiryDate,
            bool deleteIfNotEmpty)
        {
            var commandText = new AlterAutoDeletePolicyCommand(
                new EntityName(tableName),
                expiryDate,
                deleteIfNotEmpty)
                              .ToScript(null);
            var command = ParseOneCommand(commandText);

            Assert.IsType <AlterAutoDeletePolicyCommand>(command);
        }
Exemplo n.º 2
0
        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}'");
                    }
                }
            }
        }
Exemplo n.º 3
0
        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);
            }
        }