コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: blockspacer/niveum
 private static RS.RelationSchemaLoaderResult GetRelationSchemaLoaderResult()
 {
     if (rslr != null)
     {
         return(rslr);
     }
     rslr = rsl.GetResult();
     rslr.Verify();
     return(rslr);
 }
コード例 #3
0
        public static void Verify(this RelationSchemaLoaderResult rslr)
        {
            VerifyDuplicatedNames(rslr);
            var s = rslr.Schema;

            VerifyTypes(s);
            VerifyEntityKeys(s);
            VerifyEntityForeignKeys(s);
            VerifyQuerySyntax(s);
            VerifyQuerySemantics(s);
        }
コード例 #4
0
        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
                {
                }
            }
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: blockspacer/niveum
 private static void InvalidateSchema()
 {
     rslr = null;
 }