예제 #1
0
    public static void Start(SchemaBuilder sb)
    {
        if (sb.NotDefined(MethodInfo.GetCurrentMethod()))
        {
            sb.Include <OrderEntity>()
            .WithQuery(() => o => new
            {
                Entity = o,
                o.Id,
                o.State,
                o.Customer,
                o.Employee,
                o.OrderDate,
                o.RequiredDate,
                o.ShipAddress,
                o.ShipVia,
            });

            QueryLogic.Queries.Register(OrderQuery.OrderLines, () =>
                                        from o in Database.Query <OrderEntity>()
                                        from od in o.Details
                                        select new
            {
                Entity = o,
                o.Id,
                od.Product,
                od.Quantity,
                od.UnitPrice,
                od.Discount,
                od.SubTotalPrice,
            });

            OrderGraph.Register();

            ProcessLogic.Register(OrderProcess.CancelOrders, new CancelOrderAlgorithm());

            SimpleTaskLogic.Register(OrderTask.CancelOldOrdersWithProcess, ctx =>
            {
                var package = new PackageEntity().CreateLines(Database.Query <OrderEntity>().Where(a => a.OrderDate < DateTime.Now.AddDays(-7) && a.State != OrderState.Canceled));

                var process = ProcessLogic.Create(OrderProcess.CancelOrders, package);

                process.Execute(ProcessOperation.Execute);

                return(process.ToLite());
            });

            SimpleTaskLogic.Register(OrderTask.CancelOldOrders, ctx =>
            {
                Database.Query <OrderEntity>()
                .Where(a => a.OrderDate < DateTime.Now.AddDays(-7))
                .UnsafeUpdate()
                .Set(o => o.CancelationDate, o => DateTime.Now)
                .Set(o => o.State, o => OrderState.Canceled)
                .Execute();

                return(null);
            });//CancelOldOrdersProcess
        }
    }
예제 #2
0
        private static ProcessEntity?UpdateMessages(List <SMSMessageEntity> messages)
        {
            if (!messages.Any())
            {
                return(null);
            }

            SMSUpdatePackageEntity package = new SMSUpdatePackageEntity().Save();

            var packLite = package.ToLite();

            if (messages.Any(m => m.State != SMSMessageState.Sent))
            {
                throw new ApplicationException("SMS messages must be sent prior to update the status");
            }

            messages.ForEach(ms => ms.UpdatePackage = packLite);
            messages.SaveList();

            var process = ProcessLogic.Create(SMSMessageProcess.UpdateStatus, package);

            process.Execute(ProcessOperation.Execute);

            return(process);
        }
예제 #3
0
        public static void Start(SchemaBuilder sb)
        {
            if (sb.NotDefined(MethodInfo.GetCurrentMethod()))
            {
                sb.Schema.Settings.AssertImplementedBy((ProcessEntity p) => p.Data, typeof(EmailPackageEntity));
                sb.Include <EmailPackageEntity>()
                .WithQuery(() => e => new
                {
                    Entity = e,
                    e.Id,
                    e.Name,
                });

                QueryLogic.Expressions.Register((EmailPackageEntity ep) => ep.Messages(), () => EmailMessageMessage.Messages.NiceToString());
                QueryLogic.Expressions.Register((EmailPackageEntity ep) => ep.RemainingMessages(), () => EmailMessageMessage.RemainingMessages.NiceToString());
                QueryLogic.Expressions.Register((EmailPackageEntity ep) => ep.ExceptionMessages(), () => EmailMessageMessage.ExceptionMessages.NiceToString());

                ProcessLogic.AssertStarted(sb);
                ProcessLogic.Register(EmailMessageProcess.CreateEmailsSendAsync, new CreateEmailsSendAsyncProcessAlgorithm());
                ProcessLogic.Register(EmailMessageProcess.SendEmails, new SendEmailProcessAlgorithm());

                new Graph <ProcessEntity> .ConstructFromMany <EmailMessageEntity>(EmailMessageOperation.ReSendEmails)
                {
                    Construct = (messages, args) =>
                    {
                        if (!messages.Any())
                        {
                            return(null);
                        }

                        EmailPackageEntity emailPackage = new EmailPackageEntity()
                        {
                            Name = args.TryGetArgC <string>()
                        }.Save();

                        foreach (var m in messages.Select(m => m.RetrieveAndForget()))
                        {
                            new EmailMessageEntity()
                            {
                                Package         = emailPackage.ToLite(),
                                From            = m.From,
                                Recipients      = m.Recipients.ToMList(),
                                Target          = m.Target,
                                Body            = new BigStringEmbedded(m.Body.Text),
                                IsBodyHtml      = m.IsBodyHtml,
                                Subject         = m.Subject,
                                Template        = m.Template,
                                EditableMessage = m.EditableMessage,
                                State           = EmailMessageState.RecruitedForSending,
                                Attachments     = m.Attachments.Select(a => a.Clone()).ToMList()
                            }.Save();
                        }

                        return(ProcessLogic.Create(EmailMessageProcess.SendEmails, emailPackage));
                    }
                }

                .Register();
            }
        }
예제 #4
0
        public static ProcessEntity?CreateProcess(FileTypeSymbol?fileType = null)
        {
            using (Transaction tr = new Transaction())
            {
                var query = Database.Query <PrintLineEntity>()
                            .Where(a => a.State == PrintLineState.ReadyToPrint);

                if (fileType != null)
                {
                    query = query.Where(a => a.File.FileType == fileType);
                }

                if (query.Count() == 0)
                {
                    return(null);
                }

                var package = new PrintPackageEntity()
                {
                    Name = fileType?.ToString() + " (" + query.Count() + ")"
                }.Save();

                query.UnsafeUpdate()
                .Set(a => a.Package, a => package.ToLite())
                .Set(a => a.State, a => PrintLineState.Enqueued)
                .Execute();

                var result = ProcessLogic.Create(PrintPackageProcess.PrintPackage, package).Save();

                return(tr.Commit(result));
            }
        }
예제 #5
0
        public static void Start(SchemaBuilder sb, FileTypeSymbol?testFileType = null)
        {
            if (sb.NotDefined(MethodInfo.GetCurrentMethod()))
            {
                TestFileType = testFileType;

                sb.Include <PrintLineEntity>()
                .WithQuery(() => p => new
                {
                    Entity = p,
                    p.CreationDate,
                    p.File,
                    p.State,
                    p.Package,
                    p.PrintedOn,
                    p.Referred,
                });

                sb.Include <PrintPackageEntity>()
                .WithQuery(() => e => new
                {
                    Entity = e,
                    e.Id,
                    e.Name
                });

                ProcessLogic.AssertStarted(sb);
                ProcessLogic.Register(PrintPackageProcess.PrintPackage, new PrintPackageAlgorithm());
                PermissionAuthLogic.RegisterPermissions(PrintPermission.ViewPrintPanel);
                PrintLineGraph.Register();

                SimpleTaskLogic.Register(PrintTask.RemoveOldFiles, (ScheduledTaskContext ctx) =>
                {
                    var lines = Database.Query <PrintLineEntity>().Where(a => a.State == PrintLineState.Printed).Where(b => b.CreationDate <= DateTime.Now.AddMinutes(-DeleteFilesAfter));
                    foreach (var line in lines)
                    {
                        try
                        {
                            using (Transaction tr = new Transaction())
                            {
                                line.File.DeleteFileOnCommit();
                                line.State = PrintLineState.PrintedAndDeleted;
                                using (OperationLogic.AllowSave <PackageLineEntity>())
                                    line.Save();

                                tr.Commit();
                            }
                        }
                        catch (Exception e)
                        {
                            e.LogException();
                        }
                    }
                    return(null);
                });
            }
        }
예제 #6
0
        public static void RegisterSMSOwnerData <T>(Expression <Func <T, SMSOwnerData> > phoneExpression) where T : Entity
        {
            new Graph <ProcessEntity> .ConstructFromMany <T>(SMSMessageOperation.SendMultipleSMSMessages)
            {
                Construct = (providers, args) =>
                {
                    var sMSOwnerDatas = Database.Query <T>().Where(p => providers.Contains(p.ToLite()))
                                        .Select(pr => phoneExpression.Evaluate(pr))
                                        .AsEnumerable().NotNull().Distinct().ToList();

                    MultipleSMSModel model = args.GetArg <MultipleSMSModel>();

                    IntegrityCheck?ic = model.IntegrityCheck();

                    if (!model.Message.HasText())
                    {
                        throw new ApplicationException("The text for the SMS message has not been set");
                    }

                    var owners = (from od in sMSOwnerDatas
                                  from n in od.TelephoneNumber.SplitNoEmpty(",")
                                  select new { TelephoneNumber = n, SMSOwnerData = od });

                    if (!owners.Any())
                    {
                        return(null);
                    }

                    SMSSendPackageEntity package = new SMSSendPackageEntity().Save();

                    var packLite = package.ToLite();

                    using (OperationLogic.AllowSave <SMSMessageEntity>())
                    {
                        owners.Select(o =>
                                      new SMSMessageEntity
                        {
                            DestinationNumber = o.TelephoneNumber,
                            SendPackage       = packLite,
                            Referred          = o.SMSOwnerData.Owner,
                            Message           = model.Message,
                            From      = model.From,
                            Certified = model.Certified,
                            State     = SMSMessageState.Created,
                        }).SaveList();
                    }

                    var process = ProcessLogic.Create(SMSMessageProcess.Send, package);

                    process.Execute(ProcessOperation.Execute);

                    return(process);
                }
            }

            .Register();
        }
예제 #7
0
        public static ProcessEntity SendMultipleEmailsAsync(Lite <EmailTemplateEntity> template, List <Lite <Entity> > targets, ModelConverterSymbol?converter)
        {
            if (converter == null)
            {
                return(ProcessLogic.Create(EmailMessageProcess.CreateEmailsSendAsync, new PackageEntity().SetOperationArgs(new object[] { template }).CreateLines(targets)));
            }

            return(ProcessLogic.Create(EmailMessageProcess.CreateEmailsSendAsync, new PackageEntity().SetOperationArgs(new object[] { template, converter }).CreateLines(targets)));
        }
예제 #8
0
    public void Execute()
    {
        var user = ExecutionMode.Global().Using(_ => CurrentProcess.User.RetrieveAndRemember());

        using (UserHolder.UserSession(user))
        {
            using (ProcessLogic.OnApplySession(CurrentProcess))
            {
                if (UserEntity.Current == null)
                {
                    UserEntity.Current = AuthLogic.SystemUser !;
                }
                try
                {
                    Algorithm.Execute(this);

                    CurrentProcess.ExecutionEnd = Clock.Now;
                    CurrentProcess.State        = ProcessState.Finished;
                    CurrentProcess.Progress     = null;
                    CurrentProcess.User.ClearEntity();
                    using (OperationLogic.AllowSave <ProcessEntity>())
                        CurrentProcess.Save();
                }
                catch (OperationCanceledException e)
                {
                    if (!e.CancellationToken.Equals(this.CancellationToken))
                    {
                        throw;
                    }

                    CurrentProcess.SuspendDate = Clock.Now;
                    CurrentProcess.State       = ProcessState.Suspended;
                    using (OperationLogic.AllowSave <ProcessEntity>())
                        CurrentProcess.Save();
                }
                catch (Exception e)
                {
                    if (Transaction.InTestTransaction)
                    {
                        throw;
                    }

                    CurrentProcess.State         = ProcessState.Error;
                    CurrentProcess.ExceptionDate = Clock.Now;
                    CurrentProcess.Exception     = e.LogException(el => el.ActionName = CurrentProcess.Algorithm.ToString()).ToLite();
                    using (OperationLogic.AllowSave <ProcessEntity>())
                        CurrentProcess.Save();
                }
                finally
                {
                    ProcessRunnerLogic.OnFinally?.Invoke(this);
                }
            }
        }
    }
예제 #9
0
        public static void RegisterPhoneNumberProvider <T>(Expression <Func <T, string> > phoneExpression, Expression <Func <T, CultureInfo> > cultureExpression) where T : Entity
        {
            phoneNumberProviders[typeof(T)] = phoneExpression;
            cultureProviders[typeof(T)]     = cultureExpression;

            new Graph <ProcessEntity> .ConstructFromMany <T>(SMSMessageOperation.SendSMSMessages)
            {
                Construct = (providers, args) =>
                {
                    var numbers = Database.Query <T>().Where(p => providers.Contains(p.ToLite()))
                                  .Select(pr => new { Exp = phoneExpression.Evaluate(pr), Referred = pr.ToLite() }).AsEnumerable().NotNull().Distinct().ToList();

                    var splitNumbers = (from p in numbers.Where(p => p.Exp.Contains(','))
                                        from n in p.Exp.Split('n')
                                        select new { Exp = n.Trim(), p.Referred }).Concat(numbers.Where(p => !p.Exp.Contains(','))).Distinct().ToList();

                    numbers = splitNumbers;

                    MultipleSMSModel model = args.GetArg <MultipleSMSModel>();

                    IntegrityCheck ic = model.IntegrityCheck();

                    if (!model.Message.HasText())
                    {
                        throw new ApplicationException("The text for the SMS message has not been set");
                    }

                    SMSSendPackageEntity package = new SMSSendPackageEntity().Save();

                    var packLite = package.ToLite();

                    using (OperationLogic.AllowSave <SMSMessageEntity>())
                        numbers.Select(n => new SMSMessageEntity
                        {
                            DestinationNumber = n.Exp,
                            SendPackage       = packLite,
                            Referred          = n.Referred,

                            Message   = model.Message,
                            From      = model.From,
                            Certified = model.Certified,
                            State     = SMSMessageState.Created,
                        }).SaveList();

                    var process = ProcessLogic.Create(SMSMessageProcess.Send, package);

                    process.Execute(ProcessOperation.Execute);

                    return(process);
                }
            }

            .Register();
        }
예제 #10
0
        public static void Start(SchemaBuilder sb, Func <NewsletterEntity, EmailSenderConfigurationEntity> getEmailSenderConfiguration)
        {
            if (sb.NotDefined(MethodInfo.GetCurrentMethod()))
            {
                sb.Include <NewsletterEntity>();
                sb.Include <NewsletterDeliveryEntity>();

                NewsletterLogic.GetEmailSenderConfiguration = getEmailSenderConfiguration;

                ProcessLogic.AssertStarted(sb);
                ProcessLogic.Register(NewsletterProcess.SendNewsletter, new NewsletterProcessAlgorithm());

                QueryLogic.Queries.Register(typeof(NewsletterEntity), () =>
                                            from n in Database.Query <NewsletterEntity>()
                                            let p = n.LastProcess()
                                                    select new
                {
                    Entity = n,
                    n.Id,
                    n.Name,
                    n.Subject,
                    Text = n.Text.Try(a => a.Etc(100)),
                    n.State,
                    NumDeliveries = n.Deliveries().Count(),
                    LastProcess   = p,
                    NumErrors     = n.Deliveries().Count(d => d.Exception(p) != null)
                });

                QueryLogic.Queries.Register(typeof(NewsletterDeliveryEntity), () =>
                                            from e in Database.Query <NewsletterDeliveryEntity>()
                                            let p = e.Newsletter.Entity.LastProcess()
                                                    select new
                {
                    Entity = e,
                    e.Id,
                    e.Newsletter,
                    e.Recipient,
                    e.Sent,
                    e.SendDate,
                    LastProcess = p,
                    Exception   = e.Exception(p)
                });

                NewsletterGraph.Register();

                sb.AddUniqueIndex <NewsletterDeliveryEntity>(nd => new { nd.Newsletter, nd.Recipient });

                Validator.PropertyValidator((NewsletterEntity news) => news.Text).StaticPropertyValidation    += (sender, pi) => ValidateTokens(sender, sender.Text);
                Validator.PropertyValidator((NewsletterEntity news) => news.Subject).StaticPropertyValidation += (sender, pi) => ValidateTokens(sender, sender.Subject);

                sb.Schema.EntityEvents <NewsletterEntity>().PreSaving += Newsletter_PreSaving;
            }
        }
예제 #11
0
        public static void Start(SchemaBuilder sb, DynamicQueryManager dqm)
        {
            if (sb.NotDefined(MethodInfo.GetCurrentMethod()))
            {
                sb.Include <EmailPackageEntity>()
                .WithQuery(dqm, () => e => new
                {
                    Entity = e,
                    e.Id,
                    e.Name,
                });

                dqm.RegisterExpression((EmailPackageEntity ep) => ep.Messages(), () => EmailMessageMessage.Messages.NiceToString());
                dqm.RegisterExpression((EmailPackageEntity ep) => ep.RemainingMessages(), () => EmailMessageMessage.RemainingMessages.NiceToString());
                dqm.RegisterExpression((EmailPackageEntity ep) => ep.ExceptionMessages(), () => EmailMessageMessage.ExceptionMessages.NiceToString());

                ProcessLogic.AssertStarted(sb);
                ProcessLogic.Register(EmailMessageProcess.CreateEmailsSendAsync, new CreateEmailsSendAsyncProcessAlgorithm());
                ProcessLogic.Register(EmailMessageProcess.SendEmails, new SendEmailProcessAlgorithm());

                new Graph <ProcessEntity> .ConstructFromMany <EmailMessageEntity>(EmailMessageOperation.ReSendEmails)
                {
                    Construct = (messages, args) =>
                    {
                        EmailPackageEntity emailPackage = new EmailPackageEntity()
                        {
                            Name = args.TryGetArgC <string>()
                        }.Save();

                        foreach (var m in messages.Select(m => m.RetrieveAndForget()))
                        {
                            new EmailMessageEntity()
                            {
                                Package         = emailPackage.ToLite(),
                                From            = m.From,
                                Recipients      = m.Recipients.ToMList(),
                                Target          = m.Target,
                                Body            = m.Body,
                                IsBodyHtml      = m.IsBodyHtml,
                                Subject         = m.Subject,
                                Template        = m.Template,
                                EditableMessage = m.EditableMessage,
                                State           = EmailMessageState.RecruitedForSending
                            }.Save();
                        }

                        return(ProcessLogic.Create(EmailMessageProcess.SendEmails, emailPackage));
                    }
                }

                .Register();
            }
        }
예제 #12
0
        void MainForm_Load(object sender, EventArgs e)
        {
            _lblPID.Text = string.Format("PID:{0}", Process.GetCurrentProcess().Id);

            Configuration = new ClientConfiguration();
            var localIp4Address = Dns.GetHostAddresses(string.Empty).FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);

            Configuration.OutboundProxyIpEndPoint = localIp4Address + ":33333";
            Configuration.BindIpEndPoint          = localIp4Address + ":" + (22220 + ProcessLogic.CountProcessesByName(Process.GetCurrentProcess().ProcessName));

            ExecuteActionHelper.ExecuteAction(delegate()
            {
                FormsManager.Configure(this, _toolStripOpenedForms);
            });
        }
예제 #13
0
        public static void Start(SchemaBuilder sb)
        {
            if (sb.NotDefined(MethodInfo.GetCurrentMethod()))
            {
                sb.Include <SMSSendPackageEntity>();
                sb.Include <SMSUpdatePackageEntity>();
                SMSLogic.AssertStarted(sb);
                ProcessLogic.AssertStarted(sb);
                ProcessLogic.Register(SMSMessageProcess.Send, new SMSMessageSendProcessAlgortihm());
                ProcessLogic.Register(SMSMessageProcess.UpdateStatus, new SMSMessageUpdateStatusProcessAlgorithm());
                SimpleTaskLogic.Register(SMSMessageTask.UpdateSMSStatus, ctx => UpdateAllSentSMS()?.ToLite());

                new Graph <ProcessEntity> .ConstructFromMany <SMSMessageEntity>(SMSMessageOperation.CreateUpdateStatusPackage)
                {
                    Construct = (messages, _) => UpdateMessages(messages.RetrieveFromListOfLite())
                }

                .Register();

                QueryLogic.Queries.Register(typeof(SMSSendPackageEntity), () =>
                                            from e in Database.Query <SMSSendPackageEntity>()
                                            let p = e.LastProcess()
                                                    select new
                {
                    Entity = e,
                    e.Id,
                    e.Name,
                    NumLines    = e.SMSMessages().Count(),
                    LastProcess = p,
                    NumErrors   = e.SMSMessages().Count(s => s.Exception(p) != null),
                });

                QueryLogic.Queries.Register(typeof(SMSUpdatePackageEntity), () =>
                                            from e in Database.Query <SMSUpdatePackageEntity>()
                                            let p = e.LastProcess()
                                                    select new
                {
                    Entity = e,
                    e.Id,
                    e.Name,
                    NumLines    = e.SMSMessages().Count(),
                    LastProcess = p,
                    NumErrors   = e.SMSMessages().Count(s => s.Exception(p) != null),
                });
            }
        }
예제 #14
0
        public static void Start(string connectionString)
        {
            using (HeavyProfiler.Log("Start"))
                using (var initial = HeavyProfiler.Log("Initial"))
                {
                    StartParameters.IgnoredDatabaseMismatches = new List <Exception>();
                    StartParameters.IgnoredCodeErrors         = new List <Exception>();

                    string?logDatabase = Connector.TryExtractDatabaseNameWithPostfix(ref connectionString, "_Log");

                    SchemaBuilder sb = new CustomSchemaBuilder {
                        LogDatabaseName = logDatabase, Tracer = initial
                    };
                    sb.Schema.Version          = typeof(Starter).Assembly.GetName().Version;
                    sb.Schema.ForceCultureInfo = CultureInfo.GetCultureInfo("en-US");

                    MixinDeclarations.Register <OperationLogEntity, DiffLogMixin>();
                    MixinDeclarations.Register <UserEntity, UserEmployeeMixin>();

                    OverrideAttributes(sb);

                    var detector = SqlServerVersionDetector.Detect(connectionString);
                    Connector.Default = new SqlConnector(connectionString, sb.Schema, detector !.Value);

                    CacheLogic.Start(sb);

                    DynamicLogicStarter.Start(sb);
                    DynamicLogic.CompileDynamicCode();

                    DynamicLogic.RegisterMixins();
                    DynamicLogic.BeforeSchema(sb);

                    TypeLogic.Start(sb);

                    OperationLogic.Start(sb);
                    ExceptionLogic.Start(sb);

                    MigrationLogic.Start(sb);

                    CultureInfoLogic.Start(sb);
                    FilePathEmbeddedLogic.Start(sb);
                    SmtpConfigurationLogic.Start(sb);
                    EmailLogic.Start(sb, () => Configuration.Value.Email, (et, target) => Configuration.Value.SmtpConfiguration);

                    AuthLogic.Start(sb, "System", null);

                    AuthLogic.StartAllModules(sb);
                    ResetPasswordRequestLogic.Start(sb);
                    UserTicketLogic.Start(sb);
                    SessionLogLogic.Start(sb);

                    ProcessLogic.Start(sb);
                    PackageLogic.Start(sb, packages: true, packageOperations: true);

                    SchedulerLogic.Start(sb);

                    QueryLogic.Start(sb);
                    UserQueryLogic.Start(sb);
                    UserQueryLogic.RegisterUserTypeCondition(sb, SouthwindGroup.UserEntities);
                    UserQueryLogic.RegisterRoleTypeCondition(sb, SouthwindGroup.RoleEntities);
                    ChartLogic.Start(sb);


                    UserChartLogic.RegisterUserTypeCondition(sb, SouthwindGroup.UserEntities);
                    UserChartLogic.RegisterRoleTypeCondition(sb, SouthwindGroup.RoleEntities);
                    DashboardLogic.Start(sb);
                    DashboardLogic.RegisterUserTypeCondition(sb, SouthwindGroup.UserEntities);
                    DashboardLogic.RegisterRoleTypeCondition(sb, SouthwindGroup.RoleEntities);
                    ViewLogLogic.Start(sb, new HashSet <Type> {
                        typeof(UserQueryEntity), typeof(UserChartEntity), typeof(DashboardEntity)
                    });
                    DiffLogLogic.Start(sb, registerAll: true);
                    ExcelLogic.Start(sb, excelReport: true);
                    ToolbarLogic.Start(sb);

                    SMSLogic.Start(sb, null, () => Configuration.Value.Sms);
                    SMSLogic.RegisterPhoneNumberProvider <PersonEntity>(p => p.Phone, p => null);
                    SMSLogic.RegisterDataObjectProvider((PersonEntity p) => new { p.FirstName, p.LastName, p.Title, p.DateOfBirth });
                    SMSLogic.RegisterPhoneNumberProvider <CompanyEntity>(p => p.Phone, p => null);

                    NoteLogic.Start(sb, typeof(UserEntity), /*Note*/ typeof(OrderEntity));
                    AlertLogic.Start(sb, typeof(UserEntity), /*Alert*/ typeof(OrderEntity));
                    FileLogic.Start(sb);

                    TranslationLogic.Start(sb, countLocalizationHits: false);
                    TranslatedInstanceLogic.Start(sb, () => CultureInfo.GetCultureInfo("en"));

                    HelpLogic.Start(sb);
                    WordTemplateLogic.Start(sb);
                    MapLogic.Start(sb);
                    PredictorLogic.Start(sb, () => new FileTypeAlgorithm(f => new PrefixPair(Starter.Configuration.Value.Folders.PredictorModelFolder)));
                    PredictorLogic.RegisterAlgorithm(CNTKPredictorAlgorithm.NeuralNetwork, new CNTKNeuralNetworkPredictorAlgorithm());
                    PredictorLogic.RegisterPublication(ProductPredictorPublication.MonthlySales, new PublicationSettings(typeof(OrderEntity)));

                    RestLogLogic.Start(sb);
                    RestApiKeyLogic.Start(sb);

                    WorkflowLogicStarter.Start(sb, () => Starter.Configuration.Value.Workflow);

                    EmployeeLogic.Start(sb);
                    ProductLogic.Start(sb);
                    CustomerLogic.Start(sb);
                    OrderLogic.Start(sb);
                    ShipperLogic.Start(sb);

                    StartSouthwindConfiguration(sb);

                    TypeConditionLogic.Register <OrderEntity>(SouthwindGroup.UserEntities, o => o.Employee == EmployeeEntity.Current);
                    TypeConditionLogic.Register <EmployeeEntity>(SouthwindGroup.UserEntities, e => EmployeeEntity.Current.Is(e));

                    TypeConditionLogic.Register <OrderEntity>(SouthwindGroup.CurrentCustomer, o => o.Customer == CustomerEntity.Current);
                    TypeConditionLogic.Register <PersonEntity>(SouthwindGroup.CurrentCustomer, o => o == CustomerEntity.Current);
                    TypeConditionLogic.Register <CompanyEntity>(SouthwindGroup.CurrentCustomer, o => o == CustomerEntity.Current);

                    ProfilerLogic.Start(sb,
                                        timeTracker: true,
                                        heavyProfiler: true,
                                        overrideSessionTimeout: true);

                    DynamicLogic.StartDynamicModules(sb);
                    DynamicLogic.RegisterExceptionIfAny();

                    SetupCache(sb);

                    Schema.Current.OnSchemaCompleted();
                }
        }
예제 #15
0
        public static void Start(string connectionString, bool isPostgres, bool includeDynamic = true, bool detectSqlVersion = true)
        {
            using (HeavyProfiler.Log("Start"))
                using (var initial = HeavyProfiler.Log("Initial"))
                {
                    StartParameters.IgnoredDatabaseMismatches = new List <Exception>();
                    StartParameters.IgnoredCodeErrors         = new List <Exception>();

                    string?logDatabase = Connector.TryExtractDatabaseNameWithPostfix(ref connectionString, "_Log");

                    SchemaBuilder sb = new CustomSchemaBuilder {
                        LogDatabaseName = logDatabase, Tracer = initial
                    };
                    sb.Schema.Version          = typeof(Starter).Assembly.GetName().Version !;
                    sb.Schema.ForceCultureInfo = CultureInfo.GetCultureInfo("en-US");

                    MixinDeclarations.Register <OperationLogEntity, DiffLogMixin>();
                    MixinDeclarations.Register <UserEntity, UserEmployeeMixin>();
                    MixinDeclarations.Register <OrderDetailEmbedded, OrderDetailMixin>();
                    MixinDeclarations.Register <BigStringEmbedded, BigStringMixin>();

                    ConfigureBigString(sb);
                    OverrideAttributes(sb);

                    if (!isPostgres)
                    {
                        var sqlVersion = detectSqlVersion ? SqlServerVersionDetector.Detect(connectionString) : SqlServerVersion.AzureSQL;
                        Connector.Default = new SqlServerConnector(connectionString, sb.Schema, sqlVersion !.Value);
                    }
                    else
                    {
                        var postgreeVersion = detectSqlVersion ? PostgresVersionDetector.Detect(connectionString) : null;
                        Connector.Default = new PostgreSqlConnector(connectionString, sb.Schema, postgreeVersion);
                    }

                    CacheLogic.Start(sb, cacheInvalidator: sb.Settings.IsPostgres ? new PostgresCacheInvalidation() : null);

                    DynamicLogicStarter.Start(sb);
                    if (includeDynamic)//Dynamic
                    {
                        DynamicLogic.CompileDynamicCode();

                        DynamicLogic.RegisterMixins();
                        DynamicLogic.BeforeSchema(sb);
                    }//Dynamic

                    // Framework modules

                    TypeLogic.Start(sb);

                    OperationLogic.Start(sb);
                    ExceptionLogic.Start(sb);
                    QueryLogic.Start(sb);

                    // Extensions modules

                    MigrationLogic.Start(sb);

                    CultureInfoLogic.Start(sb);
                    FilePathEmbeddedLogic.Start(sb);
                    BigStringLogic.Start(sb);
                    EmailLogic.Start(sb, () => Configuration.Value.Email, (template, target, message) => Configuration.Value.EmailSender);

                    AuthLogic.Start(sb, "System", "Anonymous"); /* null); anonymous*/

                    AuthLogic.StartAllModules(sb);
                    ResetPasswordRequestLogic.Start(sb);
                    UserTicketLogic.Start(sb);
                    SessionLogLogic.Start(sb);
                    WebAuthnLogic.Start(sb, () => Configuration.Value.WebAuthn);

                    ProcessLogic.Start(sb);
                    PackageLogic.Start(sb, packages: true, packageOperations: true);

                    SchedulerLogic.Start(sb);
                    OmniboxLogic.Start(sb);

                    UserQueryLogic.Start(sb);
                    UserQueryLogic.RegisterUserTypeCondition(sb, RG2Group.UserEntities);
                    UserQueryLogic.RegisterRoleTypeCondition(sb, RG2Group.RoleEntities);
                    UserQueryLogic.RegisterTranslatableRoutes();

                    ChartLogic.Start(sb, googleMapsChartScripts: false /*requires Google Maps API key in ChartClient */);
                    UserChartLogic.RegisterUserTypeCondition(sb, RG2Group.UserEntities);
                    UserChartLogic.RegisterRoleTypeCondition(sb, RG2Group.RoleEntities);
                    UserChartLogic.RegisterTranslatableRoutes();

                    DashboardLogic.Start(sb);
                    DashboardLogic.RegisterUserTypeCondition(sb, RG2Group.UserEntities);
                    DashboardLogic.RegisterRoleTypeCondition(sb, RG2Group.RoleEntities);
                    DashboardLogic.RegisterTranslatableRoutes();
                    ViewLogLogic.Start(sb, new HashSet <Type> {
                        typeof(UserQueryEntity), typeof(UserChartEntity), typeof(DashboardEntity)
                    });
                    DiffLogLogic.Start(sb, registerAll: true);
                    ExcelLogic.Start(sb, excelReport: true);
                    ToolbarLogic.Start(sb);
                    ToolbarLogic.RegisterTranslatableRoutes();
                    FileLogic.Start(sb);

                    TranslationLogic.Start(sb, countLocalizationHits: false);
                    TranslatedInstanceLogic.Start(sb, () => CultureInfo.GetCultureInfo("en"));

                    HelpLogic.Start(sb);
                    WordTemplateLogic.Start(sb);
                    MapLogic.Start(sb);
                    RestLogLogic.Start(sb);
                    RestApiKeyLogic.Start(sb);

                    WorkflowLogicStarter.Start(sb, () => Starter.Configuration.Value.Workflow);

                    ProfilerLogic.Start(sb,
                                        timeTracker: true,
                                        heavyProfiler: true,
                                        overrideSessionTimeout: true);

                    // RG2 modules

                    EmployeeLogic.Start(sb);
                    ProductLogic.Start(sb);
                    CustomerLogic.Start(sb);
                    OrderLogic.Start(sb);
                    ShipperLogic.Start(sb);
                    ItemLogic.Start(sb);
                    ItemCategoryLogic.Start(sb);

                    StartRG2Configuration(sb);

                    TypeConditionLogic.Register <OrderEntity>(RG2Group.UserEntities, o => o.Employee == EmployeeEntity.Current);
                    TypeConditionLogic.Register <EmployeeEntity>(RG2Group.UserEntities, e => EmployeeEntity.Current.Is(e));

                    TypeConditionLogic.Register <OrderEntity>(RG2Group.CurrentCustomer, o => o.Customer == CustomerEntity.Current);
                    TypeConditionLogic.Register <PersonEntity>(RG2Group.CurrentCustomer, o => o == CustomerEntity.Current);
                    TypeConditionLogic.Register <CompanyEntity>(RG2Group.CurrentCustomer, o => o == CustomerEntity.Current);

                    if (includeDynamic)//2
                    {
                        DynamicLogic.StartDynamicModules(sb);
                    }//2

                    SetupCache(sb);

                    Schema.Current.OnSchemaCompleted();

                    if (includeDynamic)//3
                    {
                        DynamicLogic.RegisterExceptionIfAny();
                    }//3
                }
        }
예제 #16
0
    public static void Start(string connectionString, bool isPostgres, string?azureStorageConnectionString, string?broadcastSecret, string?broadcastUrls, bool includeDynamic = true, bool detectSqlVersion = true)
    {
        AzureStorageConnectionString = azureStorageConnectionString;

        using (HeavyProfiler.Log("Start"))
            using (var initial = HeavyProfiler.Log("Initial"))
            {
                StartParameters.IgnoredDatabaseMismatches = new List <Exception>();
                StartParameters.IgnoredCodeErrors         = new List <Exception>();

                string?logDatabase = Connector.TryExtractDatabaseNameWithPostfix(ref connectionString, "_Log");

                SchemaBuilder sb = new CustomSchemaBuilder {
                    LogDatabaseName = logDatabase, Tracer = initial
                };
                sb.Schema.Version          = typeof(Starter).Assembly.GetName().Version !;
                sb.Schema.ForceCultureInfo = CultureInfo.GetCultureInfo("en-US");

                MixinDeclarations.Register <OperationLogEntity, DiffLogMixin>();
                MixinDeclarations.Register <UserEntity, UserEmployeeMixin>();
                MixinDeclarations.Register <OrderDetailEmbedded, OrderDetailMixin>();
                MixinDeclarations.Register <BigStringEmbedded, BigStringMixin>();

                ConfigureBigString(sb);
                OverrideAttributes(sb);

                if (!isPostgres)
                {
                    var sqlVersion = detectSqlVersion ? SqlServerVersionDetector.Detect(connectionString) : SqlServerVersion.AzureSQL;
                    Connector.Default = new SqlServerConnector(connectionString, sb.Schema, sqlVersion !.Value);
                }
                else
                {
                    var postgreeVersion = detectSqlVersion ? PostgresVersionDetector.Detect(connectionString) : null;
                    Connector.Default = new PostgreSqlConnector(connectionString, sb.Schema, postgreeVersion);
                }

                CacheLogic.Start(sb, serverBroadcast:
                                 sb.Settings.IsPostgres ? new PostgresBroadcast() :
                                 broadcastSecret != null && broadcastUrls != null ? new SimpleHttpBroadcast(broadcastSecret, broadcastUrls) :
                                 null);/*Cache*/

                /* LightDynamic
                *  DynamicLogic.Start(sb, withCodeGen: false);
                *  LightDynamic */
                DynamicLogicStarter.Start(sb);
                if (includeDynamic)//Dynamic
                {
                    DynamicLogic.CompileDynamicCode();

                    DynamicLogic.RegisterMixins();
                    DynamicLogic.BeforeSchema(sb);
                }//Dynamic

                // Framework modules

                TypeLogic.Start(sb);

                OperationLogic.Start(sb);
                ExceptionLogic.Start(sb);
                QueryLogic.Start(sb);

                // Extensions modules

                MigrationLogic.Start(sb);

                CultureInfoLogic.Start(sb);
                FilePathEmbeddedLogic.Start(sb);
                BigStringLogic.Start(sb);
                EmailLogic.Start(sb, () => Configuration.Value.Email, (template, target, message) => Configuration.Value.EmailSender);

                AuthLogic.Start(sb, "System", "Anonymous"); /* null); anonymous*/
                AuthLogic.Authorizer = new SouthwindAuthorizer(() => Configuration.Value.ActiveDirectory);
                AuthLogic.StartAllModules(sb, activeDirectoryIntegration: true);
                AzureADLogic.Start(sb, adGroups: true, deactivateUsersTask: true);
                ResetPasswordRequestLogic.Start(sb);
                UserTicketLogic.Start(sb);
                SessionLogLogic.Start(sb);
                TypeConditionLogic.RegisterCompile <UserEntity>(SouthwindTypeCondition.UserEntities, u => u.Is(UserEntity.Current));

                ProcessLogic.Start(sb);
                PackageLogic.Start(sb, packages: true, packageOperations: true);

                SchedulerLogic.Start(sb);
                OmniboxLogic.Start(sb);

                UserQueryLogic.Start(sb);
                UserQueryLogic.RegisterUserTypeCondition(sb, SouthwindTypeCondition.UserEntities);
                UserQueryLogic.RegisterRoleTypeCondition(sb, SouthwindTypeCondition.RoleEntities);
                UserQueryLogic.RegisterTranslatableRoutes();

                ChartLogic.Start(sb, googleMapsChartScripts: false /*requires Google Maps API key in ChartClient */);
                UserChartLogic.RegisterUserTypeCondition(sb, SouthwindTypeCondition.UserEntities);
                UserChartLogic.RegisterRoleTypeCondition(sb, SouthwindTypeCondition.RoleEntities);
                UserChartLogic.RegisterTranslatableRoutes();

                DashboardLogic.Start(sb, GetFileTypeAlgorithm(p => p.CachedQueryFolder));
                DashboardLogic.RegisterUserTypeCondition(sb, SouthwindTypeCondition.UserEntities);
                DashboardLogic.RegisterRoleTypeCondition(sb, SouthwindTypeCondition.RoleEntities);
                DashboardLogic.RegisterTranslatableRoutes();
                ViewLogLogic.Start(sb, new HashSet <Type> {
                    typeof(UserQueryEntity), typeof(UserChartEntity), typeof(DashboardEntity)
                });
                SystemEventLogLogic.Start(sb);
                DiffLogLogic.Start(sb, registerAll: true);
                ExcelLogic.Start(sb, excelReport: true);
                ToolbarLogic.Start(sb);
                ToolbarLogic.RegisterTranslatableRoutes();

                SMSLogic.Start(sb, null, () => Configuration.Value.Sms);

                NoteLogic.Start(sb, typeof(UserEntity), /*Note*/ typeof(OrderEntity));
                AlertLogic.Start(sb, typeof(UserEntity), /*Alert*/ typeof(OrderEntity));
                FileLogic.Start(sb);

                TranslationLogic.Start(sb, countLocalizationHits: false);
                TranslatedInstanceLogic.Start(sb, () => CultureInfo.GetCultureInfo("en"));

                HelpLogic.Start(sb);
                WordTemplateLogic.Start(sb);
                MapLogic.Start(sb);
                PredictorLogic.Start(sb, GetFileTypeAlgorithm(p => p.PredictorModelFolder));
                PredictorLogic.RegisterAlgorithm(TensorFlowPredictorAlgorithm.NeuralNetworkGraph, new TensorFlowNeuralNetworkPredictor());
                PredictorLogic.RegisterPublication(ProductPredictorPublication.MonthlySales, new PublicationSettings(typeof(OrderEntity)));

                RestLogLogic.Start(sb);
                RestApiKeyLogic.Start(sb);

                WorkflowLogicStarter.Start(sb, () => Starter.Configuration.Value.Workflow);

                ProfilerLogic.Start(sb,
                                    timeTracker: true,
                                    heavyProfiler: true,
                                    overrideSessionTimeout: true);

                // Southwind modules

                EmployeeLogic.Start(sb);
                ProductLogic.Start(sb);
                CustomerLogic.Start(sb);
                OrderLogic.Start(sb);
                ShipperLogic.Start(sb);

                StartSouthwindConfiguration(sb);

                TypeConditionLogic.Register <OrderEntity>(SouthwindTypeCondition.CurrentEmployee, o => o.Employee.Is(EmployeeEntity.Current));

                if (includeDynamic)//2
                {
                    DynamicLogic.StartDynamicModules(sb);
                }//2

                SetupCache(sb);

                Schema.Current.OnSchemaCompleted();

                if (includeDynamic)//3
                {
                    DynamicLogic.RegisterExceptionIfAny();
                }//3
            }
    }
예제 #17
0
    public static void Start(SchemaBuilder sb, IFileTypeAlgorithm predictorFileAlgorithm)
    {
        if (sb.NotDefined(MethodInfo.GetCurrentMethod()))
        {
            sb.Settings.AssertIgnored((PredictorEntity p) => p.MainQuery.Filters.Single().Pinned, "use PredictorLogic", "by calling PredictorLogic.IgnorePinned in Starter.OverrideAttributes");
            sb.Settings.AssertIgnored((PredictorSubQueryEntity p) => p.Filters.Single().Pinned, "use PredictorLogic", "by calling PredictorLogic.IgnorePinned in Starter.OverrideAttributes");

            sb.Include <PredictorEntity>()
            .WithVirtualMList(p => p.SubQueries, mc => mc.Predictor)
            .WithQuery(() => e => new
            {
                Entity = e,
                e.Id,
                e.Name,
                e.MainQuery.Query,
                e.Algorithm,
                e.State,
                e.TrainingException,
            });

            PredictorGraph.Register();

            sb.Include <PredictorSubQueryEntity>()
            .WithQuery(() => e => new
            {
                Entity = e,
                e.Id,
                e.Name,
                e.Query,
                e.Predictor
            });

            sb.Include <PredictorCodificationEntity>()
            .WithUniqueIndex(pc => new { pc.Predictor, pc.Index, pc.Usage })
            .WithExpressionFrom((PredictorEntity e) => e.Codifications())
            .WithQuery(() => e => new
            {
                Entity = e,
                e.Id,
                e.Predictor,
                e.Index,
                e.Usage,
                e.OriginalColumnIndex,
                e.SubQueryIndex,
                e.SplitKey0,
                e.SplitKey1,
                e.SplitKey2,
                e.IsValue,
                e.Min,
                e.Max,
                e.Average,
                e.StdDev,
            });

            sb.Include <PredictorEpochProgressEntity>()
            .WithExpressionFrom((PredictorEntity e) => e.EpochProgresses())
            .WithQuery(() => e => new
            {
                Entity = e,
                e.Predictor,
                e.Id,
                e.Epoch,
                e.Ellapsed,
                e.LossTraining,
                e.AccuracyTraining,
                e.LossValidation,
                e.AccuracyValidation,
            });

            FileTypeLogic.Register(PredictorFileType.PredictorFile, predictorFileAlgorithm);

            SymbolLogic <PredictorAlgorithmSymbol> .Start(sb, () => Algorithms.Keys);

            SymbolLogic <PredictorColumnEncodingSymbol> .Start(sb, () => Algorithms.Values.SelectMany(a => a.GetRegisteredEncodingSymbols()).Distinct());

            SymbolLogic <PredictorResultSaverSymbol> .Start(sb, () => ResultSavers.Keys);

            SymbolLogic <PredictorPublicationSymbol> .Start(sb, () => Publications.Keys);

            sb.Schema.EntityEvents <PredictorEntity>().Retrieved         += PredictorEntity_Retrieved;
            sb.Schema.EntityEvents <PredictorSubQueryEntity>().Retrieved += PredictorMultiColumnEntity_Retrieved;

            Validator.PropertyValidator((PredictorColumnEmbedded c) => c.Encoding).StaticPropertyValidation      += Column_StaticPropertyValidation;
            Validator.PropertyValidator((PredictorSubQueryColumnEmbedded c) => c.Token).StaticPropertyValidation += GroupKey_StaticPropertyValidation;
            Validator.PropertyValidator((PredictorSubQueryEntity c) => c.Columns).StaticPropertyValidation       += SubQueryColumns_StaticPropertyValidation;

            sb.Include <PredictSimpleResultEntity>()
            .WithQuery(() => e => new
            {
                Entity = e,
                e.Id,
                e.Predictor,
                e.Target,
                e.Type,
                e.OriginalValue,
                e.PredictedValue,
                e.OriginalCategory,
                e.PredictedCategory,
            });

            RegisterResultSaver(PredictorSimpleResultSaver.StatisticsOnly, new PredictorSimpleSaver {
                SaveAllResults = false
            });
            RegisterResultSaver(PredictorSimpleResultSaver.Full, new PredictorSimpleSaver {
                SaveAllResults = true
            });

            sb.Schema.EntityEvents <PredictorEntity>().PreUnsafeDelete += query =>
            {
                Database.Query <PredictSimpleResultEntity>().Where(a => query.Contains(a.Predictor.Entity)).UnsafeDelete();
                return(null);
            };

            sb.Schema.WhenIncluded <ProcessEntity>(() =>
            {
                sb.Schema.Settings.AssertImplementedBy((ProcessEntity p) => p.Data, typeof(PredictorEntity));
                sb.Schema.Settings.AssertImplementedBy((ProcessEntity p) => p.Data, typeof(AutoconfigureNeuralNetworkEntity));
                ProcessLogic.Register(PredictorProcessAlgorithm.AutoconfigureNeuralNetwork, new AutoconfigureNeuralNetworkAlgorithm());

                new Graph <ProcessEntity> .ConstructFrom <PredictorEntity>(PredictorOperation.AutoconfigureNetwork)
                {
                    CanConstruct = p => p.AlgorithmSettings is NeuralNetworkSettingsEntity ? null : ValidationMessage._0ShouldBeOfType1.NiceToString(p.NicePropertyName(_ => _.AlgorithmSettings), typeof(NeuralNetworkSettingsEntity).NiceName()),
                    Construct    = (p, _) =>
                    {
                        return(ProcessLogic.Create(PredictorProcessAlgorithm.AutoconfigureNeuralNetwork, new AutoconfigureNeuralNetworkEntity
                        {
                            InitialPredictor = p.ToLite()
                        }));
                    }
                }.Register();
            });
        }
    }
예제 #18
0
        public static void Start(string connectionString)
        {
            string logDatabase = Connector.TryExtractDatabaseNameWithPostfix(ref connectionString, "_Log");

            SchemaBuilder sb = new SchemaBuilder();

            sb.Schema.Version          = typeof(Starter).Assembly.GetName().Version;
            sb.Schema.ForceCultureInfo = CultureInfo.GetCultureInfo("en-US");

            MixinDeclarations.Register <OperationLogEntity, DiffLogMixin>();
            MixinDeclarations.Register <UserEntity, UserEmployeeMixin>();

            OverrideAttributes(sb);

            SetupDisconnectedStrategies(sb);

            DynamicQueryManager dqm = new DynamicQueryManager();

            Connector.Default = new SqlConnector(connectionString, sb.Schema, dqm, SqlServerVersion.SqlServer2012);

            CacheLogic.Start(sb);

            TypeLogic.Start(sb, dqm);

            OperationLogic.Start(sb, dqm);

            MigrationLogic.Start(sb, dqm);

            CultureInfoLogic.Start(sb, dqm);
            EmbeddedFilePathLogic.Start(sb, dqm);
            SmtpConfigurationLogic.Start(sb, dqm);
            EmailLogic.Start(sb, dqm, () => Configuration.Value.Email, et => Configuration.Value.SmtpConfiguration);

            AuthLogic.Start(sb, dqm, "System", null);

            AuthLogic.StartAllModules(sb, dqm);
            ResetPasswordRequestLogic.Start(sb, dqm);
            UserTicketLogic.Start(sb, dqm);
            SessionLogLogic.Start(sb, dqm);

            ProcessLogic.Start(sb, dqm);
            PackageLogic.Start(sb, dqm, packages: true, packageOperations: true);

            MapLogic.Start(sb, dqm);
            SchedulerLogic.Start(sb, dqm);

            QueryLogic.Start(sb);
            UserQueryLogic.Start(sb, dqm);
            UserQueryLogic.RegisterUserTypeCondition(sb, SouthwindGroup.UserEntities);
            UserQueryLogic.RegisterRoleTypeCondition(sb, SouthwindGroup.RoleEntities);
            ChartLogic.Start(sb, dqm);
            UserChartLogic.RegisterUserTypeCondition(sb, SouthwindGroup.UserEntities);
            UserChartLogic.RegisterRoleTypeCondition(sb, SouthwindGroup.RoleEntities);
            DashboardLogic.Start(sb, dqm);
            DashboardLogic.RegisterUserTypeCondition(sb, SouthwindGroup.UserEntities);
            DashboardLogic.RegisterRoleTypeCondition(sb, SouthwindGroup.RoleEntities);
            ViewLogLogic.Start(sb, dqm, new HashSet <Type> {
                typeof(UserQueryEntity), typeof(UserChartEntity), typeof(DashboardEntity)
            });
            DiffLogLogic.Start(sb, dqm);

            ExceptionLogic.Start(sb, dqm);

            SMSLogic.Start(sb, dqm, null, () => Configuration.Value.Sms);
            SMSLogic.RegisterPhoneNumberProvider <PersonEntity>(p => p.Phone, p => null);
            SMSLogic.RegisterDataObjectProvider((PersonEntity p) => new { p.FirstName, p.LastName, p.Title, p.DateOfBirth });
            SMSLogic.RegisterPhoneNumberProvider <CompanyEntity>(p => p.Phone, p => null);

            NoteLogic.Start(sb, dqm, typeof(UserEntity), /*Note*/ typeof(OrderEntity));
            AlertLogic.Start(sb, dqm, typeof(UserEntity), /*Alert*/ typeof(OrderEntity));
            FileLogic.Start(sb, dqm);

            TranslationLogic.Start(sb, dqm);
            TranslatedInstanceLogic.Start(sb, dqm, () => CultureInfo.GetCultureInfo("en"));

            HelpLogic.Start(sb, dqm);
            WordTemplateLogic.Start(sb, dqm);

            EmployeeLogic.Start(sb, dqm);
            ProductLogic.Start(sb, dqm);
            CustomerLogic.Start(sb, dqm);
            OrderLogic.Start(sb, dqm);
            ShipperLogic.Start(sb, dqm);

            StartSouthwindConfiguration(sb, dqm);

            TypeConditionLogic.Register <OrderEntity>(SouthwindGroup.UserEntities, o => o.Employee.RefersTo(EmployeeEntity.Current));
            TypeConditionLogic.Register <EmployeeEntity>(SouthwindGroup.UserEntities, e => e == EmployeeEntity.Current);

            TypeConditionLogic.Register <OrderEntity>(SouthwindGroup.CurrentCustomer, o => o.Customer == CustomerEntity.Current);
            TypeConditionLogic.Register <PersonEntity>(SouthwindGroup.CurrentCustomer, o => o == CustomerEntity.Current);
            TypeConditionLogic.Register <CompanyEntity>(SouthwindGroup.CurrentCustomer, o => o == CustomerEntity.Current);

            DisconnectedLogic.Start(sb, dqm);
            DisconnectedLogic.BackupFolder        = @"D:\SouthwindTemp\Backups";
            DisconnectedLogic.BackupNetworkFolder = @"D:\SouthwindTemp\Backups";
            DisconnectedLogic.DatabaseFolder      = @"D:\SouthwindTemp\Database";

            ProfilerLogic.Start(sb, dqm,
                                timeTracker: true,
                                heavyProfiler: true,
                                overrideSessionTimeout: true);

            SetupCache(sb);

            SetSchemaNames(Schema.Current);

            if (logDatabase.HasText())
            {
                SetLogDatabase(sb.Schema, new DatabaseName(null, logDatabase));
            }

            Schema.Current.OnSchemaCompleted();
        }
예제 #19
0
    public static void StartRunningProcesses()
    {
        if (running)
        {
            throw new InvalidOperationException("ProcessLogic is running");
        }

        using (ExecutionContext.SuppressFlow())
            Task.Factory.StartNew(() =>
            {
                var database = Schema.Current.Table(typeof(ProcessEntity)).Name.Schema?.Database;

                SystemEventLogLogic.Log("Start ProcessRunner");
                ExceptionEntity?exception = null;
                using (AuthLogic.Disable())
                {
                    try
                    {
                        running = true;

                        (from p in Database.Query <ProcessEntity>()
                         where p.IsMine() && (p.State == ProcessState.Executing || p.State == ProcessState.Suspending || p.State == ProcessState.Suspended) ||
                         p.IsShared() && p.State == ProcessState.Suspended
                         select p).SetAsQueued();

                        CancelNewProcesses = new CancellationTokenSource();

                        autoResetEvent.Set();

                        timerNextExecution = new Timer(ob => WakeUp("TimerNextExecution", null), // main timer
                                                       null,
                                                       Timeout.Infinite,
                                                       Timeout.Infinite);

                        if (!CacheLogic.WithSqlDependency)
                        {
                            timerPeriodic = new Timer(ob => WakeUp("TimerPeriodic", null), null, PoolingPeriodMilliseconds, PoolingPeriodMilliseconds);
                        }

                        while (autoResetEvent.WaitOne())
                        {
                            if (CancelNewProcesses.IsCancellationRequested)
                            {
                                return;
                            }

                            using (HeavyProfiler.Log("PWL", () => "Process Runner"))
                            {
                                (from p in Database.Query <ProcessEntity>()
                                 where p.State == ProcessState.Planned && p.PlannedDate <= Clock.Now
                                 select p).SetAsQueued();

                                var list = Database.Query <ProcessEntity>()
                                           .Where(p => p.IsMine() || p.IsShared())
                                           .Where(p => p.State == ProcessState.Planned)
                                           .Select(p => p.PlannedDate)
                                           .ToListWakeup("Planned dependency");

                                SetNextPannedExecution(list.Min());

                                lock (executing)
                                {
                                    int remaining = MaxDegreeOfParallelism - executing.Count;

                                    if (remaining > 0)
                                    {
                                        retry:
                                        var queued = Database.Query <ProcessEntity>()
                                                     .Where(p => p.State == ProcessState.Queued)
                                                     .Where(p => p.IsMine() || p.IsShared())
                                                     .Select(a => new { Process = a.ToLite(), a.QueuedDate, a.MachineName })
                                                     .ToListWakeup("Planned dependency");

                                        var afordable = queued
                                                        .OrderByDescending(p => p.MachineName == Environment.MachineName)
                                                        .OrderBy(a => a.QueuedDate)
                                                        .Take(remaining).ToList();

                                        var taken = afordable.Where(p => p.MachineName == ProcessEntity.None).Select(a => a.Process).ToList();

                                        if (taken.Any())
                                        {
                                            using (var tr = Transaction.ForceNew())
                                            {
                                                Database.Query <ProcessEntity>()
                                                .Where(p => taken.Contains(p.ToLite()) && p.MachineName == ProcessEntity.None)
                                                .UnsafeUpdate()
                                                .Set(p => p.MachineName, p => Environment.MachineName)
                                                .Set(p => p.ApplicationName, p => Schema.Current.ApplicationName)
                                                .Execute();

                                                tr.Commit();
                                            }


                                            goto retry;
                                        }


                                        foreach (var pair in afordable)
                                        {
                                            ProcessEntity pro = pair.Process !.RetrieveAndRemember();

                                            IProcessAlgorithm algorithm = ProcessLogic.GetProcessAlgorithm(pro.Algorithm);

                                            ExecutingProcess executingProcess = new ExecutingProcess(algorithm, pro);

                                            executing.Add(pro.ToLite(), executingProcess);

                                            executingProcess.TakeForThisMachine();

                                            using (ExecutionContext.SuppressFlow())
                                                Task.Run(() =>
                                                {
                                                    try
                                                    {
                                                        executingProcess.Execute();
                                                    }
                                                    catch (Exception ex)
                                                    {
                                                        try
                                                        {
                                                            ex.LogException(edn =>
                                                            {
                                                                edn.ControllerName = "ProcessWorker";
                                                                edn.ActionName     = executingProcess.CurrentProcess.ToLite().Key();
                                                            });
                                                        }
                                                        catch { }
                                                    }
                                                    finally
                                                    {
                                                        lock (executing)
                                                        {
                                                            executing.Remove(pro.ToLite());
                                                            WakeUp("Process ended", null);
                                                        }
                                                    }
                                                });
                                        }

                                        var suspending = Database.Query <ProcessEntity>()
                                                         .Where(p => p.State == ProcessState.Suspending)
                                                         .Where(p => p.IsMine())
                                                         .Select(a => a.ToLite())
                                                         .ToListWakeup("Suspending dependency");

                                        foreach (var s in suspending)
                                        {
                                            ExecutingProcess execProc = executing.GetOrThrow(s);

                                            if (execProc.CurrentProcess.State != ProcessState.Finished)
                                            {
                                                execProc.CurrentProcess = s.RetrieveAndRemember();
                                                execProc.CancelationSource.Cancel();
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    catch (ThreadAbortException)
                    {
                        //Ignore
                    }
                    catch (Exception e)
                    {
                        try
                        {
                            exception = e.LogException(edn =>
                            {
                                edn.ControllerName = "ProcessWorker";
                                edn.ActionName     = "MainLoop";
                            });
                        }
                        catch { }
                    }
                    finally
                    {
                        lock (executing)
                            executing.Clear();

                        SystemEventLogLogic.Log("Stop ProcessRunner", exception);

                        running = false;
                    }
                }
            }, TaskCreationOptions.LongRunning);
    }
예제 #20
0
            public static void Register()
            {
                GetState = o => o.State;

                new Construct(OrderOperation.Create)
                {
                    ToStates  = { OrderState.New },
                    Construct = (args) =>
                    {
                        var customer = args.TryGetArgC <Lite <CustomerEntity> >()?.Retrieve();

                        return(new OrderEntity
                        {
                            Customer = customer,
                            ShipAddress = customer?.Address.Clone(),
                            State = OrderState.New,
                            Employee = EmployeeEntity.Current,
                            RequiredDate = DateTime.Now.AddDays(3),
                        });
                    }
                }.Register();

                new ConstructFrom <CustomerEntity>(OrderOperation.CreateOrderFromCustomer)
                {
                    ToStates  = { OrderState.New },
                    Construct = (c, _) => new OrderEntity
                    {
                        State        = OrderState.New,
                        Customer     = c,
                        Employee     = EmployeeEntity.Current,
                        ShipAddress  = c.Address,
                        RequiredDate = DateTime.Now.AddDays(3),
                    }
                }.Register();

                new ConstructFromMany <ProductEntity>(OrderOperation.CreateOrderFromProducts)
                {
                    ToStates  = { OrderState.New },
                    Construct = (prods, args) =>
                    {
                        var dic = Database.Query <ProductEntity>()
                                  .Where(p => prods.Contains(p.ToLite()))
                                  .Select(p => new KeyValuePair <Lite <ProductEntity>, decimal>(p.ToLite(), p.UnitPrice)).ToDictionary();

                        var customer = args.TryGetArgC <Lite <CustomerEntity> >()?.Retrieve();

                        return(new OrderEntity
                        {
                            Customer = customer,
                            ShipAddress = customer?.Address.Clone(),
                            State = OrderState.New,
                            Employee = EmployeeEntity.Current,
                            RequiredDate = DateTime.Now.AddDays(3),
                            Details = prods.Select(p => new OrderDetailEmbedded
                            {
                                Product = p,
                                UnitPrice = dic[p],
                                Quantity = 1,
                            }).ToMList()
                        });
                    }
                }.Register();

                new Graph <ProcessEntity> .ConstructFromMany <OrderEntity>(OrderOperation.CancelWithProcess)
                {
                    Construct = (orders, _) =>
                    {
                        return(ProcessLogic.Create(OrderProcess.CancelOrders, new PackageEntity().CreateLines(orders)));
                    }
                }

                .Register();

                new Execute(OrderOperation.SaveNew)
                {
                    FromStates    = { OrderState.New },
                    ToStates      = { OrderState.Ordered },
                    CanBeNew      = true,
                    CanBeModified = true,
                    Execute       = (o, args) =>
                    {
                        o.OrderDate = DateTime.Now;
                        o.State     = OrderState.Ordered;
                    }
                }.Register();

                new Execute(OrderOperation.Save)
                {
                    FromStates    = { OrderState.Ordered },
                    ToStates      = { OrderState.Ordered },
                    CanBeModified = true,
                    Execute       = (o, _) =>
                    {
                    }
                }.Register();

                new Execute(OrderOperation.Ship)
                {
                    CanExecute    = o => o.Details.IsEmpty() ? "No order lines" : null,
                    FromStates    = { OrderState.Ordered },
                    ToStates      = { OrderState.Shipped },
                    CanBeModified = true,
                    Execute       = (o, args) =>
                    {
                        o.ShippedDate = args.TryGetArgS <DateTime>() ?? DateTime.Now;
                        o.State       = OrderState.Shipped;
                    }
                }.Register();

                new Execute(OrderOperation.Cancel)
                {
                    FromStates = { OrderState.Ordered, OrderState.Shipped },
                    ToStates   = { OrderState.Canceled },
                    Execute    = (o, args) =>
                    {
                        o.CancelationDate = DateTime.Now;
                        o.State           = OrderState.Canceled;
                    }
                }.Register();

                new Delete(OrderOperation.Delete)
                {
                    FromStates = { OrderState.Ordered },
                    Delete     = (o, args) =>
                    {
                        o.Delete();
                    }
                }.Register();
            }
예제 #21
0
        public static void RegisterDataObjectProvider <T, A>(Expression <Func <T, A> > func) where T : Entity
        {
            dataObjectProviders[typeof(T)] = func;

            new Graph <ProcessEntity> .ConstructFromMany <T>(SMSMessageOperation.SendSMSMessagesFromTemplate)
            {
                Construct = (providers, args) =>
                {
                    var template = args.GetArg <SMSTemplateEntity>();

                    if (TypeLogic.EntityToType[template.AssociatedType] != typeof(T))
                    {
                        throw new ArgumentException("The SMS template is associated with the type {0} instead of {1}"
                                                    .FormatWith(template.AssociatedType.FullClassName, typeof(T).FullName));
                    }

                    var phoneFunc = (Expression <Func <T, string> >)phoneNumberProviders
                                    .GetOrThrow(typeof(T), "{0} is not registered as PhoneNumberProvider".FormatWith(typeof(T).NiceName()));

                    var cultureFunc = (Expression <Func <T, CultureInfo> >)cultureProviders
                                      .GetOrThrow(typeof(T), "{0} is not registered as CultureProvider".FormatWith(typeof(T).NiceName()));

                    var numbers = Database.Query <T>().Where(p => providers.Contains(p.ToLite()))
                                  .Select(p => new
                    {
                        Phone    = phoneFunc.Evaluate(p),
                        Data     = func.Evaluate(p),
                        Referred = p.ToLite(),
                        Culture  = cultureFunc.Evaluate(p)
                    }).Where(n => n.Phone.HasText()).AsEnumerable().ToList();

                    var splitdNumbers = (from p in numbers.Where(p => p.Phone.Contains(','))
                                         from n in p.Phone.Split(',')
                                         select new
                    {
                        Phone = n.Trim(),
                        p.Data,
                        p.Referred,
                        p.Culture
                    }).Concat(numbers.Where(p => !p.Phone.Contains(','))).Distinct().ToList();

                    numbers = splitdNumbers;

                    SMSSendPackageEntity package = new SMSSendPackageEntity().Save();
                    var packLite = package.ToLite();

                    using (OperationLogic.AllowSave <SMSMessageEntity>())
                    {
                        numbers.Select(n => new SMSMessageEntity
                        {
                            Message           = template.ComposeMessage(n.Data, n.Culture),
                            EditableMessage   = template.EditableMessage,
                            From              = template.From,
                            DestinationNumber = n.Phone,
                            SendPackage       = packLite,
                            State             = SMSMessageState.Created,
                            Referred          = n.Referred
                        }).SaveList();
                    }

                    var process = ProcessLogic.Create(SMSMessageProcess.Send, package);

                    process.Execute(ProcessOperation.Execute);

                    return(process);
                }
            }

            .Register();

            new Graph <SMSMessageEntity> .ConstructFrom <T>(SMSMessageOperation.CreateSMSWithTemplateFromEntity)
            {
                Construct = (provider, args) =>
                {
                    var template = args.GetArg <SMSTemplateEntity>();

                    if (template.AssociatedType != null &&
                        TypeLogic.EntityToType[template.AssociatedType] != typeof(T))
                    {
                        throw new ArgumentException("The SMS template is associated with the type {0} instead of {1}"
                                                    .FormatWith(template.AssociatedType.FullClassName, typeof(T).FullName));
                    }

                    return(new SMSMessageEntity
                    {
                        Message = template.ComposeMessage(func.Evaluate(provider), GetCulture(provider)),
                        EditableMessage = template.EditableMessage,
                        From = template.From,
                        DestinationNumber = GetPhoneNumber(provider),
                        State = SMSMessageState.Created,
                        Referred = provider.ToLite(),
                        Certified = template.Certified
                    });
                }
            }

            .Register();
        }
예제 #22
0
        public static void Register()
        {
            GetState = n => n.State;

            new ConstructFrom <NewsletterEntity>(NewsletterOperation.Clone)
            {
                ToStates  = { NewsletterState.Created },
                Construct = (n, _) => new NewsletterEntity
                {
                    Name        = n.Name,
                    From        = n.From,
                    DisplayFrom = n.DisplayFrom,
                    Query       = n.Query,
                    Subject     = n.Subject,
                    Text        = n.Text,
                }
            }.Register();

            new Execute(NewsletterOperation.Save)
            {
                CanBeNew      = true,
                CanBeModified = true,
                FromStates    = { NewsletterState.Created, NewsletterState.Saved },
                ToStates      = { NewsletterState.Saved },
                Execute       = (n, _) => n.State = NewsletterState.Saved
            }.Register();

            new Execute(NewsletterOperation.AddRecipients)
            {
                FromStates = { NewsletterState.Saved },
                ToStates   = { NewsletterState.Saved },
                Execute    = (n, args) =>
                {
                    var p        = args.GetArg <List <Lite <IEmailOwnerEntity> > >();
                    var existent = Database.Query <NewsletterDeliveryEntity>().Where(d => d.Newsletter.Is(n)).Select(d => d.Recipient).ToList();
                    p.Except(existent).Select(ie => new NewsletterDeliveryEntity
                    {
                        Recipient  = ie,
                        Newsletter = n.ToLite()
                    }).ToList().SaveList();

                    n.State = NewsletterState.Saved;
                }
            }.Register();

            new Execute(NewsletterOperation.RemoveRecipients)
            {
                FromStates = { NewsletterState.Saved },
                ToStates   = { NewsletterState.Saved },
                Execute    = (n, args) =>
                {
                    var p = args.GetArg <List <Lite <NewsletterDeliveryEntity> > >();
                    foreach (var nd in p.GroupsOf(20))
                    {
                        Database.DeleteList(nd);
                    }

                    n.State = NewsletterState.Saved;
                }
            }.Register();

            new Graph <ProcessEntity> .ConstructFrom <NewsletterEntity>(NewsletterOperation.Send)
            {
                CanConstruct = n =>
                {
                    if (n.Subject.IsNullOrEmpty())
                    {
                        return("Subject must be set");
                    }

                    if (n.Text.IsNullOrEmpty())
                    {
                        return("Text must be set");
                    }

                    if (!Database.Query <NewsletterDeliveryEntity>().Any(d => d.Newsletter.Is(n)))
                    {
                        return("There is not any delivery for this newsletter");
                    }

                    return(null);
                },
                Construct = (n, _) => ProcessLogic.Create(NewsletterProcess.SendNewsletter, n)
            }

            .Register();
        }
예제 #23
0
        public static void Start(string connectionString, bool includeDynamic = true)
        {
            using (HeavyProfiler.Log("Start"))
            using (var initial = HeavyProfiler.Log("Initial"))
            {
                string? logDatabase = Connector.TryExtractDatabaseNameWithPostfix(ref connectionString, "_Log");

                SchemaBuilder sb = new CustomSchemaBuilder { LogDatabaseName = logDatabase, Tracer = initial };
                sb.Schema.Version = typeof(Starter).Assembly.GetName().Version!;
                sb.Schema.ForceCultureInfo = CultureInfo.GetCultureInfo("en-US");

                MixinDeclarations.Register<OperationLogEntity, DiffLogMixin>();
                MixinDeclarations.Register<UserEntity, UserEmployeeMixin>();

                OverrideAttributes(sb);

                var detector = SqlServerVersionDetector.Detect(connectionString);
                Connector.Default = new SqlConnector(connectionString, sb.Schema, detector!.Value);

                CacheLogic.Start(sb);
                }

                TypeLogic.Start(sb);

                OperationLogic.Start(sb);
                ExceptionLogic.Start(sb);

                MigrationLogic.Start(sb);

                CultureInfoLogic.Start(sb);
                FilePathEmbeddedLogic.Start(sb);
                EmailLogic.Start(sb, () => Configuration.Value.Email, (et, target) => Configuration.Value.EmailSender);

                AuthLogic.Start(sb, "System", null);

                AuthLogic.StartAllModules(sb);
                ResetPasswordRequestLogic.Start(sb);
                UserTicketLogic.Start(sb);
                ProcessLogic.Start(sb);
                PackageLogic.Start(sb, packages: true, packageOperations: true);

                SchedulerLogic.Start(sb);

                QueryLogic.Start(sb);
                UserQueryLogic.Start(sb);
                UserQueryLogic.RegisterUserTypeCondition(sb, AtTestGroup.UserEntities);
                UserQueryLogic.RegisterRoleTypeCondition(sb, AtTestGroup.RoleEntities);
                ChartLogic.Start(sb);


                UserChartLogic.RegisterUserTypeCondition(sb, AtTestGroup.UserEntities);
                UserChartLogic.RegisterRoleTypeCondition(sb, AtTestGroup.RoleEntities);
                DashboardLogic.Start(sb);
                DashboardLogic.RegisterUserTypeCondition(sb, AtTestGroup.UserEntities);
                DashboardLogic.RegisterRoleTypeCondition(sb, AtTestGroup.RoleEntities);
                ViewLogLogic.Start(sb, new HashSet<Type> { typeof(UserQueryEntity), typeof(UserChartEntity), typeof(DashboardEntity) });
                DiffLogLogic.Start(sb, registerAll: true);
                ExcelLogic.Start(sb, excelReport: true);
                ToolbarLogic.Start(sb);
                FileLogic.Start(sb);

                TranslationLogic.Start(sb, countLocalizationHits: false);
                TranslatedInstanceLogic.Start(sb, () => CultureInfo.GetCultureInfo("en"));
                WordTemplateLogic.Start(sb);
                MapLogic.Start(sb);
                PredictorLogic.Start(sb, () => new FileTypeAlgorithm(f => new PrefixPair(Starter.Configuration.Value.Folders.PredictorModelFolder)));
                PredictorLogic.RegisterAlgorithm(CNTKPredictorAlgorithm.NeuralNetwork, new CNTKNeuralNetworkPredictorAlgorithm());
                PredictorLogic.RegisterPublication(ProductPredictorPublication.MonthlySales, new PublicationSettings(typeof(OrderEntity)));
                EmployeeLogic.Start(sb);
                ProductLogic.Start(sb);
                CustomerLogic.Start(sb);
                OrderLogic.Start(sb);
                ShipperLogic.Start(sb);

                StartAtTestConfiguration(sb);

                TypeConditionLogic.Register<OrderEntity>(AtTestGroup.UserEntities, o => o.Employee == EmployeeEntity.Current);
                TypeConditionLogic.Register<EmployeeEntity>(AtTestGroup.UserEntities, e => EmployeeEntity.Current.Is(e));

                TypeConditionLogic.Register<OrderEntity>(AtTestGroup.CurrentCustomer, o => o.Customer == CustomerEntity.Current);
                TypeConditionLogic.Register<PersonEntity>(AtTestGroup.CurrentCustomer, o => o == CustomerEntity.Current);
                TypeConditionLogic.Register<CompanyEntity>(AtTestGroup.CurrentCustomer, o => o == CustomerEntity.Current);

                ProfilerLogic.Start(sb,
                    timeTracker: true,
                    heavyProfiler: true,
                    overrideSessionTimeout: true);

                if (includeDynamic)
                {
                }
                SetupCache(sb);

                Schema.Current.OnSchemaCompleted();
            }
 /// <summary>
 /// Public constructor of render person controller class
 /// </summary>
 public RenderPersonController()
 {
     processLogic = new ProcessLogic();
 }
예제 #25
0
    public static void Start(SchemaBuilder sb, bool packages, bool packageOperations)
    {
        if (sb.NotDefined(MethodInfo.GetCurrentMethod()))
        {
            ProcessLogic.AssertStarted(sb);

            sb.Settings.AssertImplementedBy((ProcessExceptionLineEntity pel) => pel.Line, typeof(PackageLineEntity));

            sb.Include <PackageLineEntity>()
            .WithQuery(() => pl => new
            {
                Entity = pl,
                pl.Package,
                pl.Id,
                pl.Target,
                pl.Result,
                pl.FinishTime,
            });

            QueryLogic.Queries.Register(PackageQuery.PackageLineLastProcess, () =>
                                        from pl in Database.Query <PackageLineEntity>()
                                        let p = pl.Package.Entity.LastProcess()
                                                select new
            {
                Entity = pl,
                pl.Package,
                pl.Id,
                pl.Target,
                pl.Result,
                pl.FinishTime,
                LastProcess = p,
                Exception   = pl.Exception(p),
            });


            QueryLogic.Expressions.Register((PackageEntity p) => p.Lines(), ProcessMessage.Lines);

            if (packages)
            {
                sb.Settings.AssertImplementedBy((PackageLineEntity pl) => pl.Package, typeof(PackageEntity));
                sb.Settings.AssertImplementedBy((ProcessEntity pe) => pe.Data, typeof(PackageEntity));

                sb.Include <PackageEntity>()
                .WithQuery(() => pk => new
                {
                    Entity = pk,
                    pk.Id,
                    pk.Name,
                });

                QueryLogic.Queries.Register(PackageQuery.PackageLastProcess, () =>
                                            from pk in Database.Query <PackageEntity>()
                                            let pe = pk.LastProcess()
                                                     select new
                {
                    Entity = pk,
                    pk.Id,
                    pk.Name,
                    NumLines    = pk.Lines().Count(),
                    LastProcess = pe,
                    NumErrors   = pk.Lines().Count(l => l.Exception(pe) != null),
                });

                ExceptionLogic.DeleteLogs += ExceptionLogic_DeletePackages <PackageEntity>;
            }

            if (packageOperations)
            {
                sb.Settings.AssertImplementedBy((PackageLineEntity pl) => pl.Package, typeof(PackageOperationEntity));
                sb.Settings.AssertImplementedBy((ProcessEntity pe) => pe.Data, typeof(PackageOperationEntity));

                sb.Include <PackageOperationEntity>()
                .WithQuery(() => pk => new
                {
                    Entity = pk,
                    pk.Id,
                    pk.Name,
                    pk.Operation,
                });

                QueryLogic.Queries.Register(PackageQuery.PackageOperationLastProcess, () =>
                                            from p in Database.Query <PackageOperationEntity>()
                                            let pe = p.LastProcess()
                                                     select new
                {
                    Entity = p,
                    p.Id,
                    p.Name,
                    p.Operation,
                    NumLines    = p.Lines().Count(),
                    LastProcess = pe,
                    NumErrors   = p.Lines().Count(l => l.Exception(pe) != null),
                });

                ProcessLogic.Register(PackageOperationProcess.PackageOperation, new PackageOperationAlgorithm());
                ExceptionLogic.DeleteLogs += ExceptionLogic_DeletePackages <PackageOperationEntity>;
            }
        }
    }