From 45303a1a81a4335de21191438a574f98019075da Mon Sep 17 00:00:00 2001 From: Olmo del Corral Cano Date: Tue, 30 Nov 2021 16:21:28 +0100 Subject: [PATCH] run Upgrade_20211130_ChunksAndMinBy --- .../Authorization/TypeAuthLogic.Conditions.cs | 2 +- .../Dynamic/DynamicSqlMigrationLogic.cs | 2 +- .../Dynamic/DynamicTypeLogic.cs | 4 +- .../Isolation/IsolationLogic.cs | 2 +- .../MachineLearning/PredictorSimpleSaver.cs | 4 +- .../Mailing/EmailPackageLogic.cs | 2 +- .../Mailing/Pop3/Pop3ConfigurationLogic.cs | 2 +- .../Processes/PackageLogic.cs | 4 +- .../Translation/AzureTranslator.cs | 2 +- .../TranslatedInstanceSynchronizer.cs | 2 +- .../Translation/TranslationSynchronizer.cs | 2 +- .../TensorFlowNeuralNetworkPredictor.cs | 2 +- .../CodeGeneration/EntityCodeGenerator.cs | 2 +- .../CodeGeneration/ReactCodeGenerator.cs | 2 +- Signum.Engine/Database.cs | 15 ++-- Signum.Engine/Engine/Saver.cs | 2 +- Signum.Engine/Engine/Synchronizer.cs | 2 +- Signum.Engine/Operations/OperationLogic.cs | 2 +- Signum.Engine/Patterns/DeletePart.cs | 2 +- Signum.Engine/Retriever.cs | 6 +- .../ActiveDirectoryConfiguration.cs | 8 ++ .../ActiveDirectoryController.cs | 4 +- .../Signum.Entities.Authorization.ts | 5 ++ .../Upgrade_20211130_ChunksAndMinBy.cs | 4 +- Signum.Utilities/ConsoleSwitch.cs | 2 +- .../DataStructures/DirectedEdgedGraph.cs | 2 +- .../DataStructures/DirectedGraph.cs | 2 +- .../Extensions/EnumerableExtensions.cs | 84 +------------------ .../Extensions/GroupExtensions.cs | 44 +--------- .../Extensions/RegexExtensions.cs | 4 +- 30 files changed, 57 insertions(+), 165 deletions(-) diff --git a/Signum.Engine.Extensions/Authorization/TypeAuthLogic.Conditions.cs b/Signum.Engine.Extensions/Authorization/TypeAuthLogic.Conditions.cs index 587df7fd9a..d91e1b77c7 100644 --- a/Signum.Engine.Extensions/Authorization/TypeAuthLogic.Conditions.cs +++ b/Signum.Engine.Extensions/Authorization/TypeAuthLogic.Conditions.cs @@ -134,7 +134,7 @@ static void AssertAllowed(PrimaryKey[] requested, TypeAllowedBasic typeAllowe { using (DisableQueryFilter()) { - var found = requested.GroupsOf(1000).SelectMany(gr => Database.Query().Where(a => gr.Contains(a.Id)).Select(a => new + var found = requested.Chunks(1000).SelectMany(gr => Database.Query().Where(a => gr.Contains(a.Id)).Select(a => new { a.Id, Allowed = a.IsAllowedFor(typeAllowed, ExecutionMode.InUserInterface), diff --git a/Signum.Engine.Extensions/Dynamic/DynamicSqlMigrationLogic.cs b/Signum.Engine.Extensions/Dynamic/DynamicSqlMigrationLogic.cs index f6b8c82245..cc2de55c12 100644 --- a/Signum.Engine.Extensions/Dynamic/DynamicSqlMigrationLogic.cs +++ b/Signum.Engine.Extensions/Dynamic/DynamicSqlMigrationLogic.cs @@ -159,7 +159,7 @@ public static void AddDynamicRename(string replacementKey, string oldName, strin private static string AutoReplacementEnums(Replacements.AutoReplacementContext ctx) { StringDistance sd = new StringDistance(); - return ctx.NewValues!.WithMin(nv => sd.LevenshteinDistance(nv, ctx.OldValue))!; + return ctx.NewValues!.MinBy(nv => sd.LevenshteinDistance(nv, ctx.OldValue))!; } public static string? DynamicAutoReplacementsSimple(Replacements.AutoReplacementContext ctx, List lastRenames, string replacementKey) diff --git a/Signum.Engine.Extensions/Dynamic/DynamicTypeLogic.cs b/Signum.Engine.Extensions/Dynamic/DynamicTypeLogic.cs index 881b5ac33e..5b24487ffb 100644 --- a/Signum.Engine.Extensions/Dynamic/DynamicTypeLogic.cs +++ b/Signum.Engine.Extensions/Dynamic/DynamicTypeLogic.cs @@ -274,7 +274,7 @@ public string GetFileCode() public string GetEntityCode() { StringBuilder sb = new StringBuilder(); - foreach (var gr in GetEntityAttributes().GroupsOf(a => a.Length, 100)) + foreach (var gr in GetEntityAttributes().Chunk(a => a.Length, 100)) { sb.AppendLine("[" + gr.ToString(", ") + "]"); } @@ -494,7 +494,7 @@ private string GetValidatorAttribute(DynamicValidator v) protected virtual void WriteAttributeTag(StringBuilder sb, IEnumerable attributes) { - foreach (var gr in attributes.GroupsOf(a => a.Length, 100)) + foreach (var gr in attributes.Chunk(a => a.Length, 100)) { sb.AppendLine("[" + gr.ToString(", ") + "]"); } diff --git a/Signum.Engine.Extensions/Isolation/IsolationLogic.cs b/Signum.Engine.Extensions/Isolation/IsolationLogic.cs index 06cf760b3e..5e990f6384 100644 --- a/Signum.Engine.Extensions/Isolation/IsolationLogic.cs +++ b/Signum.Engine.Extensions/Isolation/IsolationLogic.cs @@ -195,7 +195,7 @@ public static IEnumerable WhereCurrentIsolationInMemory(this IEnumerable? GetOnlyIsolation(IEnumerable> selectedEntities) where T : Entity { - return selectedEntities.Cast>().GroupsOf(100).Select(gr => + return selectedEntities.Cast>().Chunk(100).Select(gr => Database.Query().Where(e => gr.Contains(e.ToLite())).Select(e => e.Isolation()).Only() ).NotNull().Only(); } diff --git a/Signum.Engine.Extensions/MachineLearning/PredictorSimpleSaver.cs b/Signum.Engine.Extensions/MachineLearning/PredictorSimpleSaver.cs index a2aac42d98..b4cf7ac21c 100644 --- a/Signum.Engine.Extensions/MachineLearning/PredictorSimpleSaver.cs +++ b/Signum.Engine.Extensions/MachineLearning/PredictorSimpleSaver.cs @@ -62,7 +62,7 @@ public void SavePredictions(PredictorTrainingContext ctx) var pc = PredictorPredictLogic.CreatePredictContext(ctx.Predictor); int grIndex = 0; - foreach (var gr in dictionary.GroupsOf(PredictionBatchSize)) + foreach (var gr in dictionary.Chunk(PredictionBatchSize)) { using (HeavyProfiler.LogNoStackTrace("Group")) { @@ -110,7 +110,7 @@ public void SavePredictions(PredictorTrainingContext ctx) if (SaveAllResults) { - var groups = toInsert.GroupsOf(PredictionBatchSize).ToList(); + var groups = toInsert.Chunk(PredictionBatchSize).ToList(); foreach (var iter in groups.Iterate()) { ctx.ReportProgress($"Inserting {typeof(PredictSimpleResultEntity).NicePluralName()}", iter.Position / (decimal)groups.Count); diff --git a/Signum.Engine.Extensions/Mailing/EmailPackageLogic.cs b/Signum.Engine.Extensions/Mailing/EmailPackageLogic.cs index 3606583116..8859757512 100644 --- a/Signum.Engine.Extensions/Mailing/EmailPackageLogic.cs +++ b/Signum.Engine.Extensions/Mailing/EmailPackageLogic.cs @@ -126,7 +126,7 @@ public void Execute(ExecutingProcess executingProcess) using (AuthLogic.Disable()) { - foreach (var group in emails.GroupsOf(EmailLogic.Configuration.ChunkSizeSendingEmails)) + foreach (var group in emails.Chunk(EmailLogic.Configuration.ChunkSizeSendingEmails)) { var retrieved = group.RetrieveFromListOfLite(); foreach (var m in retrieved) diff --git a/Signum.Engine.Extensions/Mailing/Pop3/Pop3ConfigurationLogic.cs b/Signum.Engine.Extensions/Mailing/Pop3/Pop3ConfigurationLogic.cs index 9b9386567f..3161ce0e54 100644 --- a/Signum.Engine.Extensions/Mailing/Pop3/Pop3ConfigurationLogic.cs +++ b/Signum.Engine.Extensions/Mailing/Pop3/Pop3ConfigurationLogic.cs @@ -402,7 +402,7 @@ public static Pop3ReceptionEntity ReceiveEmailsFullComparation(this Pop3Configur { var messageInfos = client.GetMessageInfos(); - var already = messageInfos.Select(a => a.Uid).GroupsOf(50).SelectMany(l => + var already = messageInfos.Select(a => a.Uid).Chunk(50).SelectMany(l => (from em in Database.Query() let ri = em.Mixin().ReceptionInfo where ri != null && l.Contains(ri.UniqueId) diff --git a/Signum.Engine.Extensions/Processes/PackageLogic.cs b/Signum.Engine.Extensions/Processes/PackageLogic.cs index d3b855084e..23f42acc90 100644 --- a/Signum.Engine.Extensions/Processes/PackageLogic.cs +++ b/Signum.Engine.Extensions/Processes/PackageLogic.cs @@ -132,7 +132,7 @@ public static PackageEntity CreateLines(this PackageEntity package, IEnumerable< int inserts = lites.GroupBy(a => a.EntityType).Sum(gr => - gr.GroupsOf(100).Sum(gr2 => + gr.Chunk(100).Sum(gr2 => giInsertPackageLines.GetInvoker(gr.Key)(package, gr2))); return package; @@ -144,7 +144,7 @@ public static PackageEntity CreateLines(this PackageEntity package, IEnumerable< int inserts = entities.GroupBy(a => a.GetType()).Sum(gr => - gr.GroupsOf(100).Sum(gr2 => + gr.Chunk(100).Sum(gr2 => giInsertPackageLines.GetInvoker(gr.Key)(package, gr2.Select(a => a.ToLite())))); return package; diff --git a/Signum.Engine.Extensions/Translation/AzureTranslator.cs b/Signum.Engine.Extensions/Translation/AzureTranslator.cs index 435fe54be5..54e0123a7d 100644 --- a/Signum.Engine.Extensions/Translation/AzureTranslator.cs +++ b/Signum.Engine.Extensions/Translation/AzureTranslator.cs @@ -58,7 +58,7 @@ public AzureTranslator(Func azureKey, Func? region = null, Fun if(this.AzureKey() == null) return null; - var result = list.GroupsOf(10).SelectMany(listPart => Task.Run(async () => + var result = list.Chunk(10).SelectMany(listPart => Task.Run(async () => { return await this.TranslateBatchAsync(listPart, from, to); }).Result!).ToList(); diff --git a/Signum.Engine.Extensions/Translation/TranslatedInstanceSynchronizer.cs b/Signum.Engine.Extensions/Translation/TranslatedInstanceSynchronizer.cs index 109e36d54d..9f0a501021 100644 --- a/Signum.Engine.Extensions/Translation/TranslatedInstanceSynchronizer.cs +++ b/Signum.Engine.Extensions/Translation/TranslatedInstanceSynchronizer.cs @@ -16,7 +16,7 @@ public static TypeInstancesChanges GetTypeInstanceChangesTranslated(ITranslator[ totalInstances = instances.Count; if (instances.Sum(a => a.TotalOriginalLength()) > MaxTotalSyncCharacters) - instances = instances.GroupsOf(a => a.TotalOriginalLength(), MaxTotalSyncCharacters).First().ToList(); + instances = instances.Chunk(a => a.TotalOriginalLength(), MaxTotalSyncCharacters).First().ToList(); return TranslateInstances(translators, type, targetCulture, instances); } diff --git a/Signum.Engine.Extensions/Translation/TranslationSynchronizer.cs b/Signum.Engine.Extensions/Translation/TranslationSynchronizer.cs index 02c77b413e..b7ff80cf6b 100644 --- a/Signum.Engine.Extensions/Translation/TranslationSynchronizer.cs +++ b/Signum.Engine.Extensions/Translation/TranslationSynchronizer.cs @@ -20,7 +20,7 @@ public static LocalizedAssemblyChanges GetAssemblyChanges(ITranslator[] translat totalTypes = types.Count; if (types.Sum(a => a.TotalOriginalLength()) > MaxTotalSyncCharacters) - types = types.GroupsOf(a => a.TotalOriginalLength(), MaxTotalSyncCharacters).First().ToList(); + types = types.Chunk(a => a.TotalOriginalLength(), MaxTotalSyncCharacters).First().ToList(); var result = Translate(translators, target, types); diff --git a/Signum.Engine.MachineLearning.TensorFlow/TensorFlowNeuralNetworkPredictor.cs b/Signum.Engine.MachineLearning.TensorFlow/TensorFlowNeuralNetworkPredictor.cs index 4fb248c0e8..8e9de627f1 100644 --- a/Signum.Engine.MachineLearning.TensorFlow/TensorFlowNeuralNetworkPredictor.cs +++ b/Signum.Engine.MachineLearning.TensorFlow/TensorFlowNeuralNetworkPredictor.cs @@ -209,7 +209,7 @@ public void Train(PredictorTrainingContext ctx) } } - var best = candidate.WithMin(a => a.ResultValidation.Loss!.Value)!; + var best = candidate.MinBy(a => a.ResultValidation.Loss!.Value)!; p.ResultTraining = best.ResultTraining; p.ResultValidation = best.ResultValidation; diff --git a/Signum.Engine/CodeGeneration/EntityCodeGenerator.cs b/Signum.Engine/CodeGeneration/EntityCodeGenerator.cs index 353fbfcd47..50a2e2244a 100644 --- a/Signum.Engine/CodeGeneration/EntityCodeGenerator.cs +++ b/Signum.Engine/CodeGeneration/EntityCodeGenerator.cs @@ -158,7 +158,7 @@ protected virtual string GetNamespace(string fileName) protected virtual void WriteAttributeTag(StringBuilder sb, IEnumerable attributes) { - foreach (var gr in attributes.GroupsOf(a => a.Length, 100)) + foreach (var gr in attributes.Chunk(a => a.Length, 100)) { sb.AppendLine("[" + gr.ToString(", ") + "]"); } diff --git a/Signum.Engine/CodeGeneration/ReactCodeGenerator.cs b/Signum.Engine/CodeGeneration/ReactCodeGenerator.cs index 5f825f097f..da85732425 100644 --- a/Signum.Engine/CodeGeneration/ReactCodeGenerator.cs +++ b/Signum.Engine/CodeGeneration/ReactCodeGenerator.cs @@ -310,7 +310,7 @@ protected virtual string WriteClientFile(Module mod) foreach (var gr in mod.Types.GroupBy(a => a.Namespace)) { sb.AppendLine("import { " - + gr.Select(t => t.Name).GroupsOf(5).ToString(a => a.ToString(", "), ",\r\n") + + gr.Select(t => t.Name).Chunk(5).ToString(a => a.ToString(", "), ",\r\n") + " } from './" + gr.Key + "'"); } diff --git a/Signum.Engine/Database.cs b/Signum.Engine/Database.cs index 6fd19684c2..5eb3a93441 100644 --- a/Signum.Engine/Database.cs +++ b/Signum.Engine/Database.cs @@ -2,6 +2,7 @@ using Signum.Engine.Maps; using Signum.Entities.Basics; using Signum.Entities.Internal; +using Signum.Utilities; using Signum.Utilities.Reflection; using System.Collections; using System.Collections.ObjectModel; @@ -701,7 +702,7 @@ static List RetrieveFromDatabaseOrCache(List ids, string? mess } if (message == null) - return ids.GroupsOf(Schema.Current.Settings.MaxNumberOfParameters) + return ids.Chunk(Schema.Current.Settings.MaxNumberOfParameters) .SelectMany(gr => Database.Query().Where(a => gr.Contains(a.Id))) .ToList(); else @@ -709,8 +710,8 @@ static List RetrieveFromDatabaseOrCache(List ids, string? mess SafeConsole.WriteLineColor(ConsoleColor.Cyan, message == "auto" ? "Retriving " + typeof(T).Name : message); var result = new List(); - var groups = ids.GroupsOf(Schema.Current.Settings.MaxNumberOfParameters).ToList(); - groups.ProgressForeach(gr => gr.Count.ToString(), gr => + var groups = ids.Chunk(Schema.Current.Settings.MaxNumberOfParameters).ToList(); + groups.ProgressForeach(gr => gr.Length.ToString(), gr => { result.AddRange(Database.Query().Where(a => gr.Contains(a.Id))); }); @@ -794,7 +795,7 @@ static async Task> RetrieveFromDatabaseOrCache(List ids, } } - var tasks = ids.GroupsOf(Schema.Current.Settings.MaxNumberOfParameters) + var tasks = ids.Chunk(Schema.Current.Settings.MaxNumberOfParameters) .Select(gr => Database.Query().Where(a => gr.Contains(a.Id)).ToListAsync(token)) .ToList(); @@ -837,7 +838,7 @@ public static List> RetrieveListLite(List ids) return ids.Select(id => (Lite)new LiteImp(id, cc.GetToString(id))).ToList(); } - var retrieved = ids.GroupsOf(Schema.Current.Settings.MaxNumberOfParameters).SelectMany(gr => Database.Query().Where(a => gr.Contains(a.Id)).Select(a => a.ToLite())).ToDictionary(a => a.Id); + var retrieved = ids.Chunk(Schema.Current.Settings.MaxNumberOfParameters).SelectMany(gr => Database.Query().Where(a => gr.Contains(a.Id)).Select(a => a.ToLite())).ToDictionary(a => a.Id); var missing = ids.Except(retrieved.Keys); @@ -865,7 +866,7 @@ public static async Task>> RetrieveListLiteAsync(List (Lite)new LiteImp(id, cc.GetToString(id))).ToList(); } - var tasks = ids.GroupsOf(Schema.Current.Settings.MaxNumberOfParameters) + var tasks = ids.Chunk(Schema.Current.Settings.MaxNumberOfParameters) .Select(gr => Database.Query().Where(a => gr.Contains(a.Id)).Select(a => a.ToLite()).ToListAsync(token)) .ToList(); @@ -1059,7 +1060,7 @@ public static void DeleteList(IList ids) { using (var tr = new Transaction()) { - var groups = ids.GroupsOf(Schema.Current.Settings.MaxNumberOfParameters); + var groups = ids.Chunk(Schema.Current.Settings.MaxNumberOfParameters); int result = 0; foreach (var group in groups) result += Database.Query().Where(a => group.Contains(a.Id)).UnsafeDelete(); diff --git a/Signum.Engine/Engine/Saver.cs b/Signum.Engine/Engine/Saver.cs index 694011933d..8fa6d81e56 100644 --- a/Signum.Engine/Engine/Saver.cs +++ b/Signum.Engine/Engine/Saver.cs @@ -94,7 +94,7 @@ private static void SaveGraph(Schema schema, DirectedGraph identifiables { IGrouping<(Type type, bool isNew), Entity> group = clone.Sinks() .GroupBy(ident => (ident.GetType(), ident.IsNew)) - .WithMin(g => stats[g.Key] - g.Count())!; + .MinBy(g => stats[g.Key] - g.Count())!; foreach (var node in group) clone.RemoveFullNode(node, inv.RelatedTo(node)); diff --git a/Signum.Engine/Engine/Synchronizer.cs b/Signum.Engine/Engine/Synchronizer.cs index 38dbd4346f..a0e9265c65 100644 --- a/Signum.Engine/Engine/Synchronizer.cs +++ b/Signum.Engine/Engine/Synchronizer.cs @@ -300,7 +300,7 @@ public virtual void AskForReplacements( while (oldOnly.Count > 0 && newOnly.Count > 0) { - var oldDist = distances.WithMin(kvp => kvp.Value.Values.Min()); + var oldDist = distances.MinBy(kvp => kvp.Value.Values.Min()); var alternatives = oldDist.Value.OrderBy(a => a.Value).Select(a => a.Key).ToList(); diff --git a/Signum.Engine/Operations/OperationLogic.cs b/Signum.Engine/Operations/OperationLogic.cs index 46978d56ba..65a05e5596 100644 --- a/Signum.Engine/Operations/OperationLogic.cs +++ b/Signum.Engine/Operations/OperationLogic.cs @@ -673,7 +673,7 @@ internal static Dictionary GetContextualGraphCanExecute { var getState = Graph.GetState; - var states = lites.GroupsOf(200).SelectMany(list => + var states = lites.Chunk(200).SelectMany(list => Database.Query().Where(e => list.Contains(e.ToLite())).Select(getState).Distinct()).Distinct().ToList(); return (from o in operations.Cast.IGraphFromStatesOperation>() diff --git a/Signum.Engine/Patterns/DeletePart.cs b/Signum.Engine/Patterns/DeletePart.cs index 6c7695d1bc..eda87f7333 100644 --- a/Signum.Engine/Patterns/DeletePart.cs +++ b/Signum.Engine/Patterns/DeletePart.cs @@ -35,7 +35,7 @@ public static FluentInclude WithDeletePart(this FluentInclude fi, Ex var toDelete = filteredQuery.Select(relatedEntity).Select(a => a.ToLite()).ToList().NotNull().Distinct().ToList(); return new Disposable(() => { - var groups = toDelete.GroupsOf(Connector.Current.Schema.Settings.MaxNumberOfParameters).ToList(); + var groups = toDelete.Chunk(Connector.Current.Schema.Settings.MaxNumberOfParameters).ToList(); groups.ForEach(l => Database.DeleteList(l)); }); }; diff --git a/Signum.Engine/Retriever.cs b/Signum.Engine/Retriever.cs index f1cfb61ce1..d71de16c43 100644 --- a/Signum.Engine/Retriever.cs +++ b/Signum.Engine/Retriever.cs @@ -180,7 +180,7 @@ public async Task CompleteAllPrivate(CancellationToken? token) { while (requests.Count > 0) { - var group = requests.WithMax(a => a.Value.Count); + var group = requests.MaxBy(a => a.Value.Count); var dic = group.Value; @@ -305,7 +305,7 @@ static async Task> GetStrings(List } else if (token != null) { - var tasks = ids.GroupsOf(Schema.Current.Settings.MaxNumberOfParameters) + var tasks = ids.Chunk(Schema.Current.Settings.MaxNumberOfParameters) .Select(gr => Database.Query().Where(e => gr.Contains(e.Id)).Select(a => KeyValuePair.Create(a.Id, a.ToString())).ToListAsync(token!.Value)) .ToList(); @@ -316,7 +316,7 @@ static async Task> GetStrings(List } else { - var dic = ids.GroupsOf(Schema.Current.Settings.MaxNumberOfParameters) + var dic = ids.Chunk(Schema.Current.Settings.MaxNumberOfParameters) .SelectMany(gr => Database.Query().Where(e => gr.Contains(e.Id)).Select(a => KeyValuePair.Create(a.Id, a.ToString()))) .ToDictionaryEx(); diff --git a/Signum.Entities.Extensions/Authorization/ActiveDirectoryConfiguration.cs b/Signum.Entities.Extensions/Authorization/ActiveDirectoryConfiguration.cs index 87cb16a98b..dba4fb5c92 100644 --- a/Signum.Entities.Extensions/Authorization/ActiveDirectoryConfiguration.cs +++ b/Signum.Entities.Extensions/Authorization/ActiveDirectoryConfiguration.cs @@ -1,3 +1,4 @@ +using Signum.Entities.Scheduler; using System.ComponentModel; namespace Signum.Entities.Authorization; @@ -163,3 +164,10 @@ public static class ADGroupOperation public static readonly ExecuteSymbol Save; public static readonly DeleteSymbol Delete; } + +[AutoInit] +public static class ActiveDirectoryTask +{ + public static readonly SimpleTaskSymbol DeactivateUsers; +} + diff --git a/Signum.React.Extensions/Authorization/ActiveDirectoryController.cs b/Signum.React.Extensions/Authorization/ActiveDirectoryController.cs index fac04b5a3f..eba2c2721d 100644 --- a/Signum.React.Extensions/Authorization/ActiveDirectoryController.cs +++ b/Signum.React.Extensions/Authorization/ActiveDirectoryController.cs @@ -18,7 +18,7 @@ public Task> FindADUsers(string subString, int count, { var config = ((ActiveDirectoryAuthorizer)AuthLogic.Authorizer!).GetConfig(); if (config.Azure_ApplicationID.HasText()) - return MicrosoftGraphLogic.FindActiveDirectoryUsers(subString, count, token); + return AzureADLogic.FindActiveDirectoryUsers(subString, count, token); if (config.DomainName.HasText()) return ActiveDirectoryLogic.SearchUser(subString); @@ -33,7 +33,7 @@ public Lite CreateADUser([FromBody][Required] ActiveDirectoryUser us var config = ((ActiveDirectoryAuthorizer)AuthLogic.Authorizer!).GetConfig(); if (config.Azure_ApplicationID.HasText()) - return MicrosoftGraphLogic.CreateUserFromAD(user).ToLite(); + return AzureADLogic.CreateUserFromAD(user).ToLite(); if (config.DomainName.HasText()) return ActiveDirectoryLogic.CreateUserFromAD(user).ToLite(); diff --git a/Signum.React.Extensions/Authorization/Signum.Entities.Authorization.ts b/Signum.React.Extensions/Authorization/Signum.Entities.Authorization.ts index d7405c9f7d..82433db7a7 100644 --- a/Signum.React.Extensions/Authorization/Signum.Entities.Authorization.ts +++ b/Signum.React.Extensions/Authorization/Signum.Entities.Authorization.ts @@ -7,6 +7,7 @@ import * as Entities from '../../Signum.React/Scripts/Signum.Entities' import * as Basics from '../../Signum.React/Scripts/Signum.Entities.Basics' import * as Signum from '../Basics/Signum.Entities.Basics' import * as Mailing from '../Mailing/Signum.Entities.Mailing' +import * as Scheduler from '../Scheduler/Signum.Entities.Scheduler' export interface UserEntity { newPassword: string; @@ -59,6 +60,10 @@ export module ActiveDirectoryPermission { export const InviteUsersFromAD : PermissionSymbol = registerSymbol("Permission", "ActiveDirectoryPermission.InviteUsersFromAD"); } +export module ActiveDirectoryTask { + export const DeactivateUsers : Scheduler.SimpleTaskSymbol = registerSymbol("SimpleTask", "ActiveDirectoryTask.DeactivateUsers"); +} + export const ADGroupEntity = new Type("ADGroup"); export interface ADGroupEntity extends Entities.Entity { Type: "ADGroup"; diff --git a/Signum.Upgrade/Upgrades/Upgrade_20211130_ChunksAndMinBy.cs b/Signum.Upgrade/Upgrades/Upgrade_20211130_ChunksAndMinBy.cs index 7e5817d5fd..a0498756c3 100644 --- a/Signum.Upgrade/Upgrades/Upgrade_20211130_ChunksAndMinBy.cs +++ b/Signum.Upgrade/Upgrades/Upgrade_20211130_ChunksAndMinBy.cs @@ -2,7 +2,7 @@ namespace Signum.Upgrade.Upgrades; class Upgrade_20211130_ChunksAndMinBy : CodeUpgradeBase { - public override string Description => "Replace some Signum.Utilities methods (GroupsOf, WithMin, WithMax) with the .Net 6 counterparts (Chunks, MinBy, MaxBy)"; + public override string Description => "Replace some Signum.Utilities methods (GroupsOf, WithMin, WithMax) with the .Net 6 counterparts (Chunk, MinBy, MaxBy)"; public override void Execute(UpgradeContext uctx) { @@ -10,7 +10,7 @@ public override void Execute(UpgradeContext uctx) { file.Replace(".WithMin(", ".MinBy("); file.Replace(".WithMax(", ".MaxBy("); - file.Replace(".GroupsOf(", ".Chunks("); + file.Replace(".GroupsOf(", ".Chunk("); }); } } diff --git a/Signum.Utilities/ConsoleSwitch.cs b/Signum.Utilities/ConsoleSwitch.cs index 9af2c6379c..ddacabccc2 100644 --- a/Signum.Utilities/ConsoleSwitch.cs +++ b/Signum.Utilities/ConsoleSwitch.cs @@ -204,7 +204,7 @@ int GetIndex(string value) return exact; var sd = new StringDistance(); - var best = dictionary.Keys.WithMin(a => sd.LevenshteinDistance(input.ToLowerInvariant(), a.ToLowerInvariant())); + var best = dictionary.Keys.MinBy(a => sd.LevenshteinDistance(input.ToLowerInvariant(), a.ToLowerInvariant())); if (best != null && sd.LevenshteinDistance(input.ToLowerInvariant(), best.ToLowerInvariant()) <= 2) { if (SafeConsole.Ask($"Did you mean '{best}'?")) diff --git a/Signum.Utilities/DataStructures/DirectedEdgedGraph.cs b/Signum.Utilities/DataStructures/DirectedEdgedGraph.cs index 2a73f57638..d248c9c896 100644 --- a/Signum.Utilities/DataStructures/DirectedEdgedGraph.cs +++ b/Signum.Utilities/DataStructures/DirectedEdgedGraph.cs @@ -496,7 +496,7 @@ public DirectedEdgedGraph FeedbackEdgeSet() Func fanInOut = n => clone.RelatedTo(n).Count() - inv.RelatedTo(n).Count(); - MinMax mm = clone.WithMinMaxPair(fanInOut); + MinMax mm = clone.MinMaxBy(fanInOut); if (fanInOut(mm.Max) > -fanInOut(mm.Min)) { diff --git a/Signum.Utilities/DataStructures/DirectedGraph.cs b/Signum.Utilities/DataStructures/DirectedGraph.cs index 10423896a0..c0fca4efe2 100644 --- a/Signum.Utilities/DataStructures/DirectedGraph.cs +++ b/Signum.Utilities/DataStructures/DirectedGraph.cs @@ -464,7 +464,7 @@ public DirectedGraph FeedbackEdgeSet() int fanInOut(T n) => clone.RelatedTo(n).Count() - inv.RelatedTo(n).Count(); - MinMax mm = clone.WithMinMaxPair(fanInOut); + MinMax mm = clone.MinMaxBy(fanInOut); if (fanInOut(mm.Max) > -fanInOut(mm.Min)) { diff --git a/Signum.Utilities/Extensions/EnumerableExtensions.cs b/Signum.Utilities/Extensions/EnumerableExtensions.cs index 8b5e0a2d5e..1ebceca230 100644 --- a/Signum.Utilities/Extensions/EnumerableExtensions.cs +++ b/Signum.Utilities/Extensions/EnumerableExtensions.cs @@ -700,89 +700,7 @@ public static string ToFormattedTable(this IEnumerable collection, string? #endregion #region Min Max - public static T? WithMin(this IEnumerable collection, Func valueSelector) - where V : IComparable - { - T result = default!; - bool hasMin = false; - V min = default!; - foreach (var item in collection) - { - V val = valueSelector(item); - if (!hasMin || val.CompareTo(min) < 0) - { - hasMin = true; - min = val; - result = item; - } - } - - return result; - } - - public static T? WithMax(this IEnumerable collection, Func valueSelector) - where V : IComparable - { - T result = default!; - bool hasMax = false; - V max = default!; - - foreach (var item in collection) - { - V val = valueSelector(item); - if (!hasMax || val.CompareTo(max) > 0) - { - hasMax = true; - max = val; - result = item; - } - } - return result; - } - - public static List WithMinList(this IEnumerable collection, Func valueSelector) - where V : IComparable - { - List result = new List(); - V min = default!; - - foreach (var item in collection) - { - V val = valueSelector(item); - int comp = 0; - if (result.Count == 0 || (comp = val.CompareTo(min)) <= 0) - { - if (comp < 0) - result.Clear(); - result.Add(item); - min = val; - } - } - return result; - } - - public static List WithMaxList(this IEnumerable collection, Func valueSelector) - where V : IComparable - { - List result = new List(); - V max = default!; - - foreach (var item in collection) - { - V val = valueSelector(item); - int comp = 0; - if (result.Count == 0 || (comp = val.CompareTo(max)) >= 0) - { - if (comp > 0) - result.Clear(); - result.Add(item); - max = val; - } - } - return result; - } - - public static MinMax WithMinMaxPair(this IEnumerable collection, Func valueSelector) + public static MinMax MinMaxBy(this IEnumerable collection, Func valueSelector) where V : IComparable { T withMin = default!, withMax = default!; diff --git a/Signum.Utilities/Extensions/GroupExtensions.cs b/Signum.Utilities/Extensions/GroupExtensions.cs index 255cf13793..6270612c8c 100644 --- a/Signum.Utilities/Extensions/GroupExtensions.cs +++ b/Signum.Utilities/Extensions/GroupExtensions.cs @@ -122,46 +122,7 @@ public static Dictionary AgGroupToDictionaryDescending(this IEnum .ToDictionaryEx(g => g.Key, aggregateSelector); } - - public static IEnumerable> GroupsOf(this IEnumerable collection, int groupSize) - { - List newList = new List(groupSize); - foreach (var item in collection) - { - newList.Add(item); - if (newList.Count == groupSize) - { - yield return newList; - newList = new List(groupSize); - } - } - - if (newList.Count != 0) - yield return newList; - } - - public static IEnumerable>> GroupsOfWithIndex(this IEnumerable collection, int groupSize) - { - int i = 0; - List newList = new List(groupSize); - foreach (var item in collection) - { - newList.Add(item); - if (newList.Count == groupSize) - { - i++; - yield return ValueTuple.Create(i,newList); - newList = new List(groupSize); - } - } - - if (newList.Count != 0) - yield return ValueTuple.Create(i,newList); - } - - - - public static IEnumerable> GroupsOf(this IEnumerable collection, Func elementSize, int groupSize) + public static IEnumerable> Chunk(this IEnumerable collection, Func elementSize, int groupSize) { List newList = new List(); int accumSize = 0; @@ -188,11 +149,10 @@ public static IEnumerable> GroupsOf(this IEnumerable collection, F public static IEnumerable> IntervalsOf(this IEnumerable collection, int groupSize) where T : struct, IEquatable, IComparable { - return collection.OrderBy().GroupsOf(groupSize).Select(gr => new IntervalWithEnd(gr.Min(), gr.Max())); + return collection.OrderBy().Chunk(groupSize).Select(gr => new IntervalWithEnd(gr.Min(), gr.Max())); } - public static List> GroupWhen(this IEnumerable collection, Func isGroupKey, BeforeFirstKey beforeFirstKey = BeforeFirstKey.Throw, bool includeKeyInGroup = false) { List> result = new List>(); diff --git a/Signum.Utilities/Extensions/RegexExtensions.cs b/Signum.Utilities/Extensions/RegexExtensions.cs index 6695df978c..859ad37277 100644 --- a/Signum.Utilities/Extensions/RegexExtensions.cs +++ b/Signum.Utilities/Extensions/RegexExtensions.cs @@ -34,7 +34,7 @@ public static IEnumerable Groups(this Match match) public static T? MostSimilar(this IEnumerable collection, Func stringSelector, string pattern) { StringDistance sd = new StringDistance(); - return collection.WithMin(item => sd.LevenshteinDistance(stringSelector(item), pattern)); + return collection.MinBy(item => sd.LevenshteinDistance(stringSelector(item), pattern)); } public static IEnumerable JoinSimilar(this List outer, List inner, @@ -51,7 +51,7 @@ select KeyValuePair.Create(Tuple.Create(o, i), sd.LevenshteinDistance(outerKeySelector(o), innerKeySelector(i)))).ToDictionary(); while (distances.Count > 0) { - var kvp = distances.WithMin(a => a.Value); + var kvp = distances.MinBy(a => a.Value); var tuple = kvp.Key; distances.RemoveRange(distances.Keys.Where(a => a.Item1.Equals(tuple.Item1) || a.Item2.Equals(tuple.Item2)).ToList());