private static void GetDependsOnWriteableDataStructure(DataStructureInfo dataStructure, List <DataStructureInfo> dependencies, IDslModel allConcepts, IConceptInfo errorContext, HashSet <string> done) { var conceptKey = dataStructure.GetKey(); if (done.Contains(conceptKey)) { return; } done.Add(conceptKey); if (dataStructure is EntityInfo) { dependencies.Add(dataStructure); } else if (dataStructure is SqlQueryableInfo) { var deps = allConcepts.FindByType <SqlDependsOnDataStructureInfo>().Where(dep => dep.Dependent == dataStructure).ToArray(); foreach (var dep in deps) { GetDependsOnWriteableDataStructure(dep.DependsOn, dependencies, allConcepts, errorContext, done); } } else { throw new DslSyntaxException(errorContext.GetKeywordOrTypeName() + " is not supported on dependency type '" + dataStructure.GetKeywordOrTypeName() + "'. " + errorContext.GetUserDescription() + " depends on " + dataStructure.GetUserDescription() + "."); } }
private static ValueOrError <DataStructureInfo> NavigateToNextDataStructure(DataStructureInfo source, string referenceName, IDslModel existingConcepts) { var selectedProperty = FindProperty(existingConcepts, source, referenceName); IEnumerable <DataStructureExtendsInfo> allExtensions; allExtensions = existingConcepts.FindByType <DataStructureExtendsInfo>(); if (selectedProperty == null && referenceName == "Base") { var baseDataStructure = allExtensions .Where(ex => ex.Extension == source) .Select(ex => ex.Base).SingleOrDefault(); if (baseDataStructure != null) { return(baseDataStructure); } if (selectedProperty == null) { return(ValueOrError.CreateError("There is no property '" + referenceName + "' nor a base data structure on " + source.GetUserDescription() + ".")); } } if (selectedProperty == null && referenceName.StartsWith("Extension_")) { string extensionName = referenceName.Substring("Extension_".Length); var extendsionDataStructure = allExtensions .Where(ex => ex.Base == source) .Where(ex => ex.Extension.Module == source.Module && ex.Extension.Name == extensionName || ex.Extension.Module.Name + "_" + ex.Extension.Name == extensionName) .Select(ex => ex.Extension).SingleOrDefault(); if (extendsionDataStructure != null) { return(extendsionDataStructure); } if (selectedProperty == null) { return(ValueOrError.CreateError("There is no property '" + referenceName + "' nor an extension '" + extensionName + "' on " + source.GetUserDescription() + ".")); } } if (selectedProperty == null) { return(ValueOrError.CreateError("There is no property '" + referenceName + "' on " + source.GetUserDescription() + ".")); } if (!(selectedProperty is ReferencePropertyInfo)) { return(ValueOrError.CreateError(string.Format("Property {0} cannot be used in the path because it is '{1}'. Only Reference properties can be used in a path.", selectedProperty.Name, selectedProperty.GetKeywordOrTypeName()))); } return(((ReferencePropertyInfo)selectedProperty).Referenced); }
private static void GetDependsOnWriteableDataStructure(DataStructureInfo dataStructure, List<DataStructureInfo> dependencies, IEnumerable<IConceptInfo> allConcepts, IConceptInfo errorContext, HashSet<string> done) { var conceptKey = dataStructure.GetKey(); if (done.Contains(conceptKey)) return; done.Add(conceptKey); if (dataStructure is EntityInfo) dependencies.Add(dataStructure); else if (dataStructure is SqlQueryableInfo) { var deps = allConcepts.OfType<SqlDependsOnDataStructureInfo>().Where(dep => dep.Dependent == dataStructure).ToArray(); foreach (var dep in deps) GetDependsOnWriteableDataStructure(dep.DependsOn, dependencies, allConcepts, errorContext, done); } else throw new DslSyntaxException(errorContext.GetKeywordOrTypeName() + " is not supported on dependency type '" + dataStructure.GetKeywordOrTypeName() + "'. " + errorContext.GetUserDescription() + " depends on " + dataStructure.GetUserDescription() + "."); }
private static ValueOrError<DataStructureInfo> NavigateToNextDataStructure(DataStructureInfo source, string referenceName, IDslModel existingConcepts) { var selectedProperty = FindProperty(existingConcepts, source, referenceName); IEnumerable<DataStructureExtendsInfo> allExtensions; allExtensions = existingConcepts.FindByType<DataStructureExtendsInfo>(); if (selectedProperty == null && referenceName == "Base") { var baseDataStructure = allExtensions .Where(ex => ex.Extension == source) .Select(ex => ex.Base).SingleOrDefault(); if (baseDataStructure != null) return baseDataStructure; if (selectedProperty == null) return ValueOrError.CreateError("There is no property '" + referenceName + "' nor a base data structure on " + source.GetUserDescription() + "."); } if (selectedProperty == null && referenceName.StartsWith("Extension_")) { string extensionName = referenceName.Substring("Extension_".Length); var extendsionDataStructure = allExtensions .Where(ex => ex.Base == source) .Where(ex => ex.Extension.Module == source.Module && ex.Extension.Name == extensionName || ex.Extension.Module.Name + "_" + ex.Extension.Name == extensionName) .Select(ex => ex.Extension).SingleOrDefault(); if (extendsionDataStructure != null) return extendsionDataStructure; if (selectedProperty == null) return ValueOrError.CreateError("There is no property '" + referenceName + "' nor an extension '" + extensionName + "' on " + source.GetUserDescription() + "."); } if (selectedProperty == null) return ValueOrError.CreateError("There is no property '" + referenceName + "' on " + source.GetUserDescription() + "."); if (!(selectedProperty is ReferencePropertyInfo)) return ValueOrError.CreateError(string.Format("Property {0} cannot be used in the path because it is '{1}'. Only Reference properties can be used in a path.", selectedProperty.Name, selectedProperty.GetKeywordOrTypeName())); return ((ReferencePropertyInfo)selectedProperty).Referenced; }