public RelationSchemaLoaderResult GetResult() { var PrimitiveNames = new HashSet <String>(TypeRefs.Concat(Types).Where(t => t.OnPrimitive).Select(t => t.Primitive.Name).Distinct()); if (PrimitiveNames.Contains("Byte") && !PrimitiveNames.Contains("Binary")) { Types.Add(TypeDef.CreatePrimitive(new PrimitiveDef { Name = "Binary", Attributes = new List <KeyValuePair <String, List <String> > > { }, Description = "" })); } var rslr = new RelationSchemaLoaderResult { Schema = new Schema { Types = Types, TypeRefs = TypeRefs, Imports = Imports }, Positions = Positions }; RelationSchemaExtensions.VerifyDuplicatedNames(rslr); var Entities = Types.Where(t => t.OnEntity).ToDictionary(t => t.Entity.Name, t => t.Entity); foreach (var e in Types.Where(t => t.OnEntity).Select(t => t.Entity)) { FillEntity(e, Entities); } foreach (var e in Types.Where(t => t.OnEntity).Select(t => t.Entity)) { FillEntityNavigations(e, Entities); } return(rslr); }
private static RS.RelationSchemaLoaderResult GetRelationSchemaLoaderResult() { if (rslr != null) { return(rslr); } rslr = rsl.GetResult(); rslr.Verify(); return(rslr); }
public static void Verify(this RelationSchemaLoaderResult rslr) { VerifyDuplicatedNames(rslr); var s = rslr.Schema; VerifyTypes(s); VerifyEntityKeys(s); VerifyEntityForeignKeys(s); VerifyQuerySyntax(s); VerifyQuerySemantics(s); }
public static void VerifyDuplicatedNames(this RelationSchemaLoaderResult rslr) { var s = rslr.Schema; Func <String, Object, String> GetPositionedMessage = (Message, o) => { if (rslr.Positions.ContainsKey(o)) { var ftr = rslr.Positions[o]; if (ftr.Range.OnSome) { var r = ftr.Range.Value; return(String.Format("{0}({1},{2},{3},{4}): {5}", ftr.Text.Path, r.Start.Row, r.Start.Column, r.End.Row, r.End.Column, Message)); } else { return(String.Format("{0}: {1}", ftr.Text.Path, Message)); } } else { return(Message); } }; CheckDuplicatedNames(s.TypeRefs.Concat(s.Types).Where(t => !t.OnQueryList), t => t.Name(), t => GetPositionedMessage(String.Format("DuplicatedName: {0}", t.Name()), t)); foreach (var t in s.TypeRefs.Concat(s.Types)) { if (t.OnEntity) { var e = t.Entity; CheckDuplicatedNames(e.Fields, rf => rf.Name, rf => GetPositionedMessage(String.Format("DuplicatedField: {0}.{1}", e.Name, rf.Name), rf)); } else if (t.OnEnum) { var e = t.Enum; CheckDuplicatedNames(e.Literals, el => el.Name, el => GetPositionedMessage(String.Format("DuplicatedLiteral: {0}.{1}", e.Name, el.Name), el)); } else { } } }
private static void InvalidateSchema() { rslr = null; }