public System.Collections.Generic.IEnumerable <IConceptInfo> CreateNewConcepts(System.Collections.Generic.IEnumerable <IConceptInfo> existingConcepts) { var activePropertyInfo = new BoolPropertyInfo { DataStructure = Entity, Name = "Active" }; var composableFilterActiveAndThis = new ComposableFilterByInfo { Expression = @"(items, repository, parameter) => { if (parameter != null && parameter.ItemID.HasValue) return items.Where(item => item.Active == null || item.Active.Value || item.ID == parameter.ItemID.Value); else return items.Where(item => item.Active == null || item.Active.Value); }", Parameter = "Rhetos.Dom.DefaultConcepts.ActiveItems", Source = Entity }; var systemRequired = new SystemRequiredInfo { Property = activePropertyInfo }; return(new IConceptInfo[] { activePropertyInfo, composableFilterActiveAndThis, systemRequired }); }
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 itemFilterRegExMatchProperty = new ComposableFilterByInfo { Expression = filterExpression, Parameter = filterParameter.Module.Name + "." + filterParameter.Name, Source = Property.DataStructure }; var invalidDataRegExMatchProperty = new InvalidDataMarkPropertyInfo { DependedProperty = Property, FilterType = itemFilterRegExMatchProperty.Parameter, ErrorMessage = ErrorMessage, Source = Property.DataStructure }; return(new IConceptInfo[] { filterParameter, itemFilterRegExMatchProperty, invalidDataRegExMatchProperty }); }
public IEnumerable <IConceptInfo> CreateNewConcepts(IEnumerable <IConceptInfo> existingConcepts) { string limitSnippet = MinValueInfo.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 + "_MaxValueFilter" }; 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 InvalidDataMarkPropertyInfo { DependedProperty = Property, FilterType = filter.Parameter, ErrorMessage = String.Format("Maximum value of {0} is {1}.", Property.Name, Value), Source = Property.DataStructure }; return(new IConceptInfo[] { filterParameter, filter, invalidData }); }
public System.Collections.Generic.IEnumerable<IConceptInfo> CreateNewConcepts(System.Collections.Generic.IEnumerable<IConceptInfo> existingConcepts) { var activePropertyInfo = new BoolPropertyInfo { DataStructure = Entity, Name = "Active" }; var composableFilterActiveAndThis = new ComposableFilterByInfo { Expression = @"(items, repository, filterParameter) => { if (filterParameter != null && filterParameter.ItemID.HasValue) return items.Where(item => item.Active == null || item.Active.Value || item.ID == filterParameter.ItemID.Value); else return items.Where(item => item.Active == null || item.Active.Value); }", Parameter = "Rhetos.Dom.DefaultConcepts.ActiveItems", Source = Entity }; var systemRequired = new SystemRequiredInfo { Property = activePropertyInfo }; return new IConceptInfo[] { activePropertyInfo, composableFilterActiveAndThis, systemRequired }; }
public IEnumerable<IConceptInfo> CreateNewConcepts(IEnumerable<IConceptInfo> existingConcepts) { var newConcepts = new List<IConceptInfo>(); ParameterInfo filterParameter; var filterNameElements = FilterName.Split('.'); if (filterNameElements.Count() == 2) filterParameter = new ParameterInfo { Module = new ModuleInfo { Name = filterNameElements[0] }, Name = filterNameElements[1] }; else filterParameter = new ParameterInfo { Module = Source.Module, Name = FilterName }; if (!existingConcepts.OfType<DataStructureInfo>() // Existing filter parameter does not have to be a ParameterInfo. Any DataStructureInfo is allowed. .Any(item => item.Module.Name == filterParameter.Module.Name && item.Name == filterParameter.Name)) newConcepts.Add(filterParameter); var composableFilter = new ComposableFilterByInfo { Source = Source, Parameter = filterParameter.GetKeyProperties(), Expression = "(source, repository, parameter) => source.Where(" + Expression + ")" }; newConcepts.Add(composableFilter); return newConcepts; }
private static string FilterImplementationSnippet(ComposableFilterByInfo info) { return string.Format( @" private static readonly Func<IQueryable<{0}>, Common.DomRepository, {1}, IQueryable<{0}>> {2} = {3}; public IQueryable<{0}> Filter(IQueryable<{0}> source, {1} parameter) {{ return {2}(source, _domRepository, parameter); }} ", info.Source.GetKeyProperties(), info.Parameter, FilterExpressionPropertyName(info), info.Expression); }
private static string FilterImplementationSnippet(ComposableFilterByInfo info) { return string.Format( @"public IQueryable<Common.Queryable.{0}_{1}> Filter(IQueryable<Common.Queryable.{0}_{1}> localSource, {2} localParameter) {{ Func<IQueryable<Common.Queryable.{0}_{1}>, Common.DomRepository, {2}" + AdditionalParametersTypeTag.Evaluate(info) + @", IQueryable<Common.Queryable.{0}_{1}>> filterFunction = {3}; " + BeforeFilterTag.Evaluate(info) + @" return filterFunction(localSource, _domRepository, localParameter" + AdditionalParametersArgumentTag.Evaluate(info) + @"); }} ", info.Source.Module.Name, info.Source.Name, info.Parameter, info.Expression); }
private static string FilterImplementationSnippet(ComposableFilterByInfo info) { return string.Format( @" private static readonly Func<IQueryable<{0}>, Common.DomRepository, {1}{4}, IQueryable<{0}>> {2} = {3}; public IQueryable<{0}> Filter(IQueryable<{0}> source, {1} parameter) {{ {6} return {2}(source, _domRepository, parameter{5}); }} ", info.Source.GetKeyProperties(), info.Parameter, FilterExpressionPropertyName(info), info.Expression, AdditionalParametersTypeTag.Evaluate(info), AdditionalParametersArgumentTag.Evaluate(info), BeforeFilterTag.Evaluate(info)); }
public IEnumerable <IConceptInfo> CreateNewConcepts(ItemFilterInfo conceptInfo, IDslModel existingConcepts) { var newConcepts = new List <IConceptInfo>(); ParameterInfo filterParameter = GetGeneratedFilter(conceptInfo); if (!existingConcepts.FindByType <DataStructureInfo>() // Existing filter parameter does not have to be a ParameterInfo. Any DataStructureInfo is allowed. .Any(item => item.Module.Name == filterParameter.Module.Name && item.Name == filterParameter.Name)) { newConcepts.Add(filterParameter); } var composableFilter = new ComposableFilterByInfo { Source = conceptInfo.Source, Parameter = filterParameter.GetKeyProperties(), Expression = "(source, repository, parameter) => source.Where(" + conceptInfo.Expression + ")" }; newConcepts.Add(composableFilter); return(newConcepts); }
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 limitSnippet = MinValueInfo.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 + "_MaxValueFilter" }; 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 InvalidDataMarkPropertyInfo { DependedProperty = Property, FilterType = filter.Parameter, ErrorMessage = String.Format("Maximum value of {0} is {1}.", Property.Name, Value), Source = Property.DataStructure }; return new IConceptInfo[] { filterParameter, filter, invalidData }; }
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 InvalidDataMarkPropertyInfo { FilterType = "Common.OlderThanHistoryEntries", Source = Entity, ErrorMessage = "ActiveSince is not allowed to be older than last entry in history.", DependedProperty = activeSinceProperty }; newConcepts.AddRange(new IConceptInfo[] { denyFilter, invalidDataValidation, new ParameterInfo { Module = new ModuleInfo { Name = "Common" }, Name = "OlderThanHistoryEntries" } }); // 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 UniquePropertiesInfo { DataStructure = Dependency_ChangesEntity, Property1 = currentProperty, Property2 = historyActiveSinceProperty } }); // 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 InvalidDataMarkPropertyInfo { FilterType = "Common.NewerThanCurrentEntry", Source = Dependency_ChangesEntity, ErrorMessage = "ActiveSince of history entry is not allowed to be newer than current entry.", DependedProperty = historyActiveSinceProperty }; newConcepts.AddRange(new IConceptInfo[] { denyFilterHistory, invalidDataValidationHistory, new ParameterInfo { Module = new ModuleInfo { Name = "Common" }, Name = "NewerThanCurrentEntry" } }); // 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 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 InvalidDataMarkPropertyInfo { FilterType = "Common.OlderThanHistoryEntries", Source = Entity, ErrorMessage = "ActiveSince is not allowed to be older than last entry in history.", DependedProperty = activeSinceProperty }; newConcepts.AddRange(new IConceptInfo[] { denyFilter, invalidDataValidation, new ParameterInfo { Module = new ModuleInfo { Name = "Common" }, Name = "OlderThanHistoryEntries" } }); // 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 UniquePropertiesInfo { DataStructure = Dependency_ChangesEntity, Property1 = currentProperty, Property2 = historyActiveSinceProperty } }); // 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 InvalidDataMarkPropertyInfo { FilterType = "Common.NewerThanCurrentEntry", Source = Dependency_ChangesEntity, ErrorMessage = "ActiveSince of history entry is not allowed to be newer than current entry.", DependedProperty = historyActiveSinceProperty }; newConcepts.AddRange(new IConceptInfo[] { denyFilterHistory, invalidDataValidationHistory, new ParameterInfo { Module = new ModuleInfo { Name = "Common" }, Name = "NewerThanCurrentEntry" } }); // 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; }
private static string FilterExpressionPropertyName(ComposableFilterByInfo info) { return "_composableFilterExpression_" + CsUtility.TextToIdentifier(info.Parameter); }
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 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 itemFilterRegExMatchProperty = new ComposableFilterByInfo { Expression = filterExpression, Parameter = filterParameter.Module.Name + "." + filterParameter.Name, Source = Property.DataStructure }; var invalidDataRegExMatchProperty = new InvalidDataMarkPropertyInfo { DependedProperty = Property, FilterType = itemFilterRegExMatchProperty.Parameter, ErrorMessage = ErrorMessage, Source = Property.DataStructure }; return new IConceptInfo[] { filterParameter, itemFilterRegExMatchProperty, invalidDataRegExMatchProperty }; }