public IEnumerable <IConceptInfo> CreateNewConcepts(IEnumerable <IConceptInfo> existingConcepts) { var itemFilter = new ItemFilterInfo { Expression = String.Format("item => item.{0} != null && item.{1} != null && item.{0} > item.{1}", PropertyFrom.Name, PropertyTo.Name), FilterName = PropertyFrom.Name + "_" + PropertyTo.Name + "_RangeFilter", Source = PropertyFrom.DataStructure }; var invalidData = new InvalidDataInfo { Source = PropertyFrom.DataStructure, FilterType = itemFilter.FilterName, ErrorMessage = "Value of {0} has to be less than or equal to {1}." }; var messageParameters = new InvalidDataMessageParametersConstantInfo { InvalidData = invalidData, MessageParameters = CsUtility.QuotedString(PropertyFrom.Name) + ", " + CsUtility.QuotedString(PropertyTo.Name) }; var invalidProperty = new InvalidDataMarkProperty2Info { InvalidData = invalidData, MarkProperty = PropertyFrom }; return(new IConceptInfo[] { itemFilter, invalidData, messageParameters, invalidProperty }); }
public IEnumerable <IConceptInfo> CreateNewConcepts(IEnumerable <IConceptInfo> existingConcepts) { string filterName = "SystemRequired" + Property.Name; var filter = new ItemFilterInfo { Source = Property.DataStructure, FilterName = filterName, Expression = "item => item." + Property.Name + " == null" }; var invalidData = new InvalidDataInfo { Source = Property.DataStructure, FilterType = filterName, ErrorMessage = "System required property {0} is not set." }; var messageParameters = new InvalidDataMessageParametersConstantInfo { InvalidData = invalidData, MessageParameters = CsUtility.QuotedString(Property.GetUserDescription()) }; var invalidProperty = new InvalidDataMarkProperty2Info { InvalidData = invalidData, MarkProperty = Property }; return(new IConceptInfo[] { filter, invalidData, messageParameters, invalidProperty }); }
public IEnumerable<IConceptInfo> CreateNewConcepts(IEnumerable<IConceptInfo> existingConcepts) { var itemFilter = new ItemFilterInfo { Expression = String.Format("item => item.{0} != null && item.{1} != null && item.{0} > item.{1}", PropertyFrom.Name, PropertyTo.Name), FilterName = PropertyFrom.Name + "_" + PropertyTo.Name + "_RangeFilter", Source = PropertyFrom.DataStructure }; var invalidData = new InvalidDataInfo { Source = PropertyFrom.DataStructure, FilterType = itemFilter.FilterName, ErrorMessage = "Value of {0} has to be less than or equal to {1}." }; var messageParameters = new InvalidDataMessageParametersConstantInfo { InvalidData = invalidData, MessageParameters = CsUtility.QuotedString(PropertyFrom.Name) + ", " + CsUtility.QuotedString(PropertyTo.Name) }; var invalidProperty = new InvalidDataMarkProperty2Info { InvalidData = invalidData, MarkProperty = PropertyFrom }; return new IConceptInfo[] { itemFilter, invalidData, messageParameters, invalidProperty }; }
public IEnumerable <IConceptInfo> CreateNewConcepts(IEnumerable <IConceptInfo> existingConcepts) { var itemFilter = new ItemFilterInfo { Expression = String.Format("item => !String.IsNullOrEmpty(item.{0}) && item.{0}.Length > {1}", Property.Name, Length), FilterName = Property.Name + "_MaxLengthFilter", Source = Property.DataStructure }; var invalidData = new InvalidDataInfo { Source = Property.DataStructure, FilterType = itemFilter.FilterName, ErrorMessage = "Maximum allowed length of {0} is {1} characters." }; var messageParameters = new InvalidDataMessageParametersConstantInfo { InvalidData = invalidData, MessageParameters = CsUtility.QuotedString(Property.Name) + ", " + Length }; var invalidProperty = new InvalidDataMarkProperty2Info { InvalidData = invalidData, MarkProperty = Property }; return(new IConceptInfo[] { itemFilter, invalidData, messageParameters, invalidProperty }); }
public IEnumerable<IConceptInfo> CreateNewConcepts(IEnumerable<IConceptInfo> existingConcepts) { var itemFilter = new ItemFilterInfo { Expression = String.Format("item => !String.IsNullOrEmpty(item.{0}) && item.{0}.Length > {1}", Property.Name, Length), FilterName = Property.Name + "_MaxLengthFilter", Source = Property.DataStructure }; var invalidData = new InvalidDataInfo { Source = Property.DataStructure, FilterType = itemFilter.FilterName, ErrorMessage = "Maximum allowed length of {0} is {1} characters." }; var messageParameters = new InvalidDataMessageParametersConstantInfo { InvalidData = invalidData, MessageParameters = CsUtility.QuotedString(Property.Name) + ", " + Length }; var invalidProperty = new InvalidDataMarkProperty2Info { InvalidData = invalidData, MarkProperty = Property }; return new IConceptInfo[] { itemFilter, invalidData, messageParameters, invalidProperty }; }
public IEnumerable<IConceptInfo> CreateNewConcepts(IEnumerable<IConceptInfo> existingConcepts) { string filterName = "SystemRequired" + Property.Name; var filter = new ItemFilterInfo { Source = Property.DataStructure, FilterName = filterName, Expression = "item => item." + Property.Name + " == null" }; var invalidData = new InvalidDataInfo { Source = Property.DataStructure, FilterType = filterName, ErrorMessage = "System required property {0} is not set." }; var messageParameters = new InvalidDataMessageParametersConstantInfo { InvalidData = invalidData, MessageParameters = CsUtility.QuotedString(Property.GetUserDescription()) }; var invalidProperty = new InvalidDataMarkProperty2Info { InvalidData = invalidData, MarkProperty = Property }; return new IConceptInfo[] { filter, invalidData, messageParameters, invalidProperty }; }
private static string CheckInvalidItemsSnippet(InvalidDataInfo info) { return string.Format( @" if (insertedNew.Count() > 0 || updatedNew.Count() > 0) {{ {0}[] changedItems = inserted.Concat(updated).ToArray(); var invalidItems = _domRepository.{0}.Filter(this.Query(changedItems.Select(item => item.ID)), new {1}()); if (invalidItems.Count() > 0) throw new Rhetos.UserException({2}, ""DataStructure:{0},ID:"" + invalidItems.First().ID.ToString(){3}); }} ", info.Source.GetKeyProperties(), info.FilterType, CsUtility.QuotedString(info.ErrorMessage), UserMessageAppend.Evaluate(info)); }
private static string CheckInvalidItemsSnippet(InvalidDataInfo info) { return string.Format( @" if (inserted.Length > 0 || updated.Length > 0) {{ {0}[] changedItems = inserted.Concat(updated).ToArray(); var invalidItems = _domRepository.{0}.Filter(changedItems.AsQueryable(), new {1}()); if (invalidItems.Count() > 0) throw new Rhetos.UserException({2}, ""DataStructure:{0},ID:"" + invalidItems.First().ID.ToString(){3}); // Workaround to restore NH proxies if NHSession.Clear() is called inside filter. for (int i=0; i<inserted.Length; i++) inserted[i] = _executionContext.NHibernateSession.Load<{0}>(inserted[i].ID); for (int i=0; i<updated.Length; i++) updated[i] = _executionContext.NHibernateSession.Load<{0}>(updated[i].ID); }} ", info.Source.GetKeyProperties(), info.FilterType, CsUtility.QuotedString(info.ErrorMessage), UserMessageAppend.Evaluate(info)); }
public IEnumerable <IConceptInfo> CreateNewConcepts() { var filterParameter = new ParameterInfo { Module = Property.DataStructure.Module, Name = Property.Name + "_RegExMatchFilter", }; string filterExpression = string.Format(@"(source, parameter) => {{ var items = source.Where(item => !string.IsNullOrEmpty(item.{0})).Select(item => new {{ item.ID, item.{0} }}).ToList(); var regex = new System.Text.RegularExpressions.Regex({1}); var invalidItemIds = items.Where(item => !regex.IsMatch(item.{0})).Select(item => item.ID).ToList(); return Filter(source, invalidItemIds); }}", Property.Name, CsUtility.QuotedString("^" + RegularExpression + "$")); var itemFilter = new QueryFilterExpressionInfo { Expression = filterExpression, Parameter = filterParameter.Module.Name + "." + filterParameter.Name, Source = Property.DataStructure }; var invalidData = new InvalidDataInfo { Source = Property.DataStructure, FilterType = itemFilter.Parameter, ErrorMessage = ErrorMessage }; var invalidProperty = new InvalidDataMarkProperty2Info { InvalidData = invalidData, MarkProperty = Property }; return(new IConceptInfo[] { filterParameter, itemFilter, invalidData, invalidProperty }); }
public void GetErrorMessageMethodName() { var tests = new ListOfTuples<string, string, string>() { { "Mod.Ent", "Filt", "GetErrorMessage_Filt" }, { "Mod.Ent", "Mod.Filt", "GetErrorMessage_Filt" }, { "Mod.Ent", "Mod2.Filt", "GetErrorMessage_Mod2_2E_Filt" }, { "Mod.Ent", "Dictionary<List<System.Guid>, object[]>", "GetErrorMessage_Dictionary_3C_List_3C_System_2E_Guid_3E__2C__20_object_5B__5D__3E_" }, }; foreach (var test in tests) { Console.WriteLine("Input: " + test.Item1 + ", " + test.Item2 + "."); var dataStructureParts = test.Item1.Split('.'); var invalidData = new InvalidDataInfo { Source = new DataStructureInfo { Module = new ModuleInfo { Name = dataStructureParts[0] }, Name = dataStructureParts[1] }, FilterType = test.Item2, ErrorMessage = "[Test]" }; Assert.AreEqual(test.Item3, invalidData.GetErrorMessageMethodName()); } }
public IEnumerable <IConceptInfo> CreateNewConcepts(IEnumerable <IConceptInfo> existingConcepts) { string limitSnippet = LimitSnippetByType .Where(snippet => snippet.Key.IsAssignableFrom(Property.GetType())) .Select(snippet => snippet.Value.Invoke(Value)) .Single(); var filterParameter = new ParameterInfo { Module = Property.DataStructure.Module, Name = Property.Name + "_MinValueFilter" }; var filter = new ComposableFilterByInfo { Expression = String.Format(@"(items, repository, parameter) => {{ {1}; return items.Where(item => item.{0} != null && item.{0} < limit); }}", Property.Name, limitSnippet), Parameter = filterParameter.Module.Name + "." + filterParameter.Name, Source = Property.DataStructure }; var invalidData = new InvalidDataInfo { Source = Property.DataStructure, FilterType = filter.Parameter, ErrorMessage = "Minimum value of {0} is {1}." }; var messageParameters = new InvalidDataMessageParametersConstantInfo { InvalidData = invalidData, MessageParameters = CsUtility.QuotedString(Property.Name) + ", " + CsUtility.QuotedString(Value) }; var invalidProperty = new InvalidDataMarkProperty2Info { InvalidData = invalidData, MarkProperty = Property }; return(new IConceptInfo[] { filterParameter, filter, invalidData, messageParameters, invalidProperty }); }
public IEnumerable <IConceptInfo> CreateNewConcepts(IEnumerable <IConceptInfo> existingConcepts) { string filterName = "RequiredAllowSave" + Property.Name; string emptyStringOrCondition = (Property is ShortStringPropertyInfo || Property is LongStringPropertyInfo) ? "|| item." + Property.Name + " == \"\" " : ""; var filter = new ItemFilterInfo { Source = Property.DataStructure, FilterName = filterName, Expression = "item => item." + Property.Name + " == null " + emptyStringOrCondition + OrCondition.Evaluate(this) }; var invalidData = new InvalidDataInfo { Source = Property.DataStructure, FilterType = filterName, ErrorMessage = "The required property {0} is not set." }; var messageParameters = new InvalidDataMessageParametersConstantInfo { InvalidData = invalidData, MessageParameters = CsUtility.QuotedString(Property.Name) }; var invalidProperty = new InvalidDataMarkProperty2Info { InvalidData = invalidData, MarkProperty = Property }; var allowSave = new InvalidDataAllowSaveInfo { InvalidData = invalidData }; return(new IConceptInfo[] { filter, invalidData, messageParameters, invalidProperty, allowSave }); }
public IEnumerable<IConceptInfo> CreateNewConcepts(IEnumerable<IConceptInfo> existingConcepts) { string limitSnippet = LimitSnippetByType .Where(snippet => snippet.Key.IsAssignableFrom(Property.GetType())) .Select(snippet => snippet.Value.Invoke(Value)) .Single(); var filterParameter = new ParameterInfo { Module = Property.DataStructure.Module, Name = Property.Name + "_MinValueFilter" }; var filter = new ComposableFilterByInfo { Expression = String.Format(@"(items, repository, parameter) => {{ {1}; return items.Where(item => item.{0} != null && item.{0} < limit); }}", Property.Name, limitSnippet), Parameter = filterParameter.Module.Name + "." + filterParameter.Name, Source = Property.DataStructure }; var invalidData = new InvalidDataInfo { Source = Property.DataStructure, FilterType = filter.Parameter, ErrorMessage = "Minimum value of {0} is {1}." }; var messageParameters = new InvalidDataMessageParametersConstantInfo { InvalidData = invalidData, MessageParameters = CsUtility.QuotedString(Property.Name) + ", " + CsUtility.QuotedString(Value) }; var invalidProperty = new InvalidDataMarkProperty2Info { InvalidData = invalidData, MarkProperty = Property }; return new IConceptInfo[] { filterParameter, filter, invalidData, messageParameters, invalidProperty }; }
public IEnumerable <IConceptInfo> CreateNewConcepts(IEnumerable <IConceptInfo> existingConcepts) { var newConcepts = new List <IConceptInfo>(); // Expand the base entity: var activeSinceProperty = new DateTimePropertyInfo { DataStructure = Entity, Name = "ActiveSince" }; // TODO: SystemRequired, Default 1.1.1900. var activeSinceHistory = new EntityHistoryPropertyInfo { Property = activeSinceProperty }; newConcepts.AddRange(new IConceptInfo[] { activeSinceProperty, activeSinceHistory }); // InvalidData for base entity: it is not allowed to save with ActiveSince older than last one used in History var denyFilter = new ComposableFilterByInfo { Parameter = "Common.OlderThanHistoryEntries", Source = Entity, Expression = String.Format( @"(items, repository, parameter) => items.Where(item => repository.{0}.{1}_Changes.Subquery.Where(his => his.ActiveSince >= item.ActiveSince && his.Entity == item).Count() > 0)", Entity.Module.Name, Entity.Name) }; var invalidDataValidation = new InvalidDataInfo { FilterType = "Common.OlderThanHistoryEntries", Source = Entity, ErrorMessage = "ActiveSince is not allowed to be older than last entry in history." }; newConcepts.AddRange(new IConceptInfo[] { denyFilter, invalidDataValidation, new ParameterInfo { Module = new ModuleInfo { Name = "Common" }, Name = "OlderThanHistoryEntries" }, new InvalidDataMarkProperty2Info { InvalidData = invalidDataValidation, MarkProperty = activeSinceProperty } }); // Create a new entity for history data: var currentProperty = new ReferencePropertyInfo { DataStructure = Dependency_ChangesEntity, Name = "Entity", Referenced = Entity }; var historyActiveSinceProperty = new DateTimePropertyInfo { DataStructure = Dependency_ChangesEntity, Name = activeSinceProperty.Name }; newConcepts.AddRange(new IConceptInfo[] { currentProperty, new ReferenceDetailInfo { Reference = currentProperty }, new RequiredPropertyInfo { Property = currentProperty }, // TODO: SystemRequired new PropertyFromInfo { Destination = Dependency_ChangesEntity, Source = activeSinceProperty }, historyActiveSinceProperty, new UniqueMultiplePropertiesInfo { DataStructure = Dependency_ChangesEntity, PropertyNames = $"{currentProperty.Name} {historyActiveSinceProperty.Name}" } }); // InvalidData for history entity: it is not allowed to save with ActiveSince newer than current entity var denyFilterHistory = new ComposableFilterByInfo { Parameter = "Common.NewerThanCurrentEntry", Source = Dependency_ChangesEntity, Expression = @"(items, repository, parameter) => items.Where(item => item.ActiveSince > item.Entity.ActiveSince)" }; var invalidDataValidationHistory = new InvalidDataInfo { FilterType = "Common.NewerThanCurrentEntry", Source = Dependency_ChangesEntity, ErrorMessage = "ActiveSince of history entry is not allowed to be newer than current entry." }; newConcepts.AddRange(new IConceptInfo[] { denyFilterHistory, invalidDataValidationHistory, new ParameterInfo { Module = new ModuleInfo { Name = "Common" }, Name = "NewerThanCurrentEntry" }, new InvalidDataMarkProperty2Info { InvalidData = invalidDataValidationHistory, MarkProperty = historyActiveSinceProperty } }); // Create ActiveUntil SqlQueryable: var activeUntilSqlQueryable = new SqlQueryableInfo { Module = Entity.Module, Name = Entity.Name + "_ChangesActiveUntil", SqlSource = ActiveUntilSqlSnippet() }; newConcepts.AddRange(new IConceptInfo[] { activeUntilSqlQueryable, new DateTimePropertyInfo { DataStructure = activeUntilSqlQueryable, Name = "ActiveUntil" }, new SqlDependsOnDataStructureInfo { Dependent = activeUntilSqlQueryable, DependsOn = Dependency_ChangesEntity }, new SqlDependsOnDataStructureInfo { Dependent = activeUntilSqlQueryable, DependsOn = Entity }, new DataStructureExtendsInfo { Base = Dependency_ChangesEntity, Extension = activeUntilSqlQueryable } }); // Configure History SqlQueryable: newConcepts.AddRange(new IConceptInfo[] { new SqlDependsOnDataStructureInfo { Dependent = Dependency_HistorySqlQueryable, DependsOn = Entity }, new SqlDependsOnDataStructureInfo { Dependent = Dependency_HistorySqlQueryable, DependsOn = Dependency_ChangesEntity }, new SqlDependsOnDataStructureInfo { Dependent = Dependency_HistorySqlQueryable, DependsOn = activeUntilSqlQueryable }, new DateTimePropertyInfo { DataStructure = Dependency_HistorySqlQueryable, Name = "ActiveUntil" }, new AllPropertiesFromInfo { Source = Dependency_ChangesEntity, Destination = Dependency_HistorySqlQueryable } }); // Configure AtTime SqlFunction: newConcepts.Add(new SqlDependsOnDataStructureInfo { Dependent = Dependency_AtTimeSqlFunction, DependsOn = Dependency_HistorySqlQueryable }); return(newConcepts); }
public IEnumerable<IConceptInfo> CreateNewConcepts(IEnumerable<IConceptInfo> existingConcepts) { var filterParameter = new ParameterInfo { Module = Property.DataStructure.Module, Name = Property.Name + "_RegExMatchFilter", }; string filterExpression = string.Format(@"(source, repository, parameter) => {{ var items = source.Where(item => !string.IsNullOrEmpty(item.{0})).Select(item => new {{ item.ID, item.{0} }}).ToList(); var regex = new System.Text.RegularExpressions.Regex({1}); var invalidItemIds = items.Where(item => !regex.IsMatch(item.{0})).Select(item => item.ID).ToList(); return Filter(source, invalidItemIds); }}", Property.Name, CsUtility.QuotedString("^" + RegularExpression + "$")); var itemFilter = new ComposableFilterByInfo { Expression = filterExpression, Parameter = filterParameter.Module.Name + "." + filterParameter.Name, Source = Property.DataStructure }; var invalidData = new InvalidDataInfo { Source = Property.DataStructure, FilterType = itemFilter.Parameter, ErrorMessage = ErrorMessage }; var invalidProperty = new InvalidDataMarkProperty2Info { InvalidData = invalidData, MarkProperty = Property }; return new IConceptInfo[] { filterParameter, itemFilter, invalidData, invalidProperty }; }