private IEnumerable <CommandBase> ToCommands() { yield return(new CreateTableCommand( TableName, Columns.Select(c => new TableColumn(c.ColumnName, c.PrimitiveType)), Folder, DocString)); var columnsWithDocString = Columns .Where(c => c.DocString != null && !c.DocString.Equals(QuotedText.Empty)) .Select(c => new AlterMergeTableColumnDocStringsCommand.ColumnDocString( c.ColumnName, c.DocString !)); if (columnsWithDocString.Any()) { yield return(new AlterMergeTableColumnDocStringsCommand( TableName, columnsWithDocString)); } foreach (var mapping in Mappings) { yield return(mapping.ToCreateMappingCommand(TableName)); } if (AutoDeletePolicy != null) { yield return(AutoDeletePolicy); } if (CachingPolicy != null) { yield return(CachingPolicy); } if (IngestionBatchingPolicy != null) { yield return(IngestionBatchingPolicy); } if (MergePolicy != null) { yield return(MergePolicy); } if (RetentionPolicy != null) { yield return(RetentionPolicy); } if (ShardingPolicy != null) { yield return(ShardingPolicy); } if (UpdatePolicy != null) { yield return(UpdatePolicy); } }
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); } }