コード例 #1
0
ファイル: CodeGenerator.cs プロジェクト: blockspacer/niveum
            public Writer(Schema Schema, String EntityNamespaceName, String NamespaceName)
            {
                this.Schema = Schema;
                this.EntityNamespaceName = EntityNamespaceName;
                this.NamespaceName       = NamespaceName;
                InnerSchema   = PlainObjectSchemaGenerator.Generate(Schema, EntityNamespaceName);
                TypeDict      = Schema.GetMap().ToDictionary(p => p.Key, p => p.Value, StringComparer.OrdinalIgnoreCase);
                InnerTypeDict = Niveum.ObjectSchema.ObjectSchemaExtensions.GetMap(InnerSchema).ToDictionary(p => p.Key.Split('.').Last(), p => p.Value, StringComparer.OrdinalIgnoreCase);

                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "Unit").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: Unit");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "Boolean").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: Boolean");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "String").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: String");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "Int").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: Int");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "Int64").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: Int64");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "Real").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: Real");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "Byte").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: Byte");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "Optional").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: Optional");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "List").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: List");
                }

                InnerWriter = new CSharpPlain.CodeGenerator.Writer(Schema, EntityNamespaceName);
            }
コード例 #2
0
ファイル: CodeGenerator.cs プロジェクト: blockspacer/niveum
            public Writer(Schema Schema, String EntityNamespaceName, String NamespaceName)
            {
                this.Schema = Schema;
                this.EntityNamespaceName = EntityNamespaceName;
                this.NamespaceName       = NamespaceName;
                InnerSchema   = PlainObjectSchemaGenerator.Generate(Schema, EntityNamespaceName);
                TypeDict      = Schema.GetMap().ToDictionary(p => p.Key, p => p.Value, StringComparer.OrdinalIgnoreCase);
                InnerTypeDict = Niveum.ObjectSchema.ObjectSchemaExtensions.GetMap(InnerSchema).ToDictionary(p => p.Key.Split('.').Last(), p => p.Value, StringComparer.OrdinalIgnoreCase);

                KeysDict = new Dictionary <String, Key[]>(StringComparer.OrdinalIgnoreCase);
                foreach (var e in Schema.Types.Where(t => t.OnEntity).Select(t => t.Entity))
                {
                    var Keys = (new Key[] { e.PrimaryKey }).Concat(e.UniqueKeys).Concat(e.NonUniqueKeys.Select(k => ConvertNonUniqueKeyToUniqueKey(k, e.PrimaryKey))).Select(k => new Key {
                        Columns = k.Columns, IsClustered = false
                    }).Distinct(new KeyComparer()).ToArray();
                    KeysDict.Add(e.Name, Keys);
                }

                var Queries = Schema.Types.Where(t => t.OnQueryList).SelectMany(t => t.QueryList.Queries).ToList();

                QueryToSearchKey = new Dictionary <QueryDef, Key>();
                foreach (var q in Queries)
                {
                    var e = TypeDict[q.EntityName].Entity;

                    var By = q.By;
                    if (q.Verb.OnInsert || q.Verb.OnUpdate || q.Verb.OnUpsert)
                    {
                        By = e.PrimaryKey.Columns.Select(c => c.Name).ToList();
                    }
                    var ByColumns     = new HashSet <String>(By, StringComparer.OrdinalIgnoreCase);
                    var ActualOrderBy = q.OrderBy.Where(c => !ByColumns.Contains(c.Name)).ToList();
                    Key SearchKey     = null;
                    foreach (var k in KeysDict[e.Name])
                    {
                        if (k.Columns.Count < By.Count + ActualOrderBy.Count)
                        {
                            continue;
                        }
                        if (!k.Columns.Take(By.Count).Zip(By, (Left, Right) => Left.Name.Equals(Right, StringComparison.OrdinalIgnoreCase)).Any(f => !f))
                        {
                            if (!k.Columns.Skip(By.Count).Take(ActualOrderBy.Count).Zip(ActualOrderBy, (Left, Right) => Left.Name.Equals(Right.Name) && (Left.IsDescending == Right.IsDescending)).Any(f => !f))
                            {
                                SearchKey = k;
                                break;
                            }
                        }
                    }
                    if (SearchKey == null)
                    {
                        throw new InvalidOperationException();
                    }
                    QueryToSearchKey.Add(q, SearchKey);
                }

                KeyCanBePartitioned = new Dictionary <Key, Boolean>();
                var EntityNameToQueries = Queries.GroupBy(q => q.EntityName).ToDictionary(g => g.Key, g => g.ToList());

                foreach (var e in Schema.Types.Where(t => t.OnEntity).Select(t => t.Entity))
                {
                    var or         = InnerTypeDict[e.Name].Record;
                    var d          = or.Fields.ToDictionary(f => f.Name, StringComparer.OrdinalIgnoreCase);
                    var Keys       = KeysDict[e.Name];
                    var KeyQueries = (EntityNameToQueries.ContainsKey(e.Name) ? EntityNameToQueries[e.Name] : new List <QueryDef>()).GroupBy(q => QueryToSearchKey[q]).ToDictionary(g => g.Key, g => g.ToList());
                    foreach (var k in Keys)
                    {
                        var CanBePartitioned = true;
                        if (KeyQueries.ContainsKey(k))
                        {
                            foreach (var q in KeyQueries[k])
                            {
                                if (q.Verb.OnSelect || q.Verb.OnLock || q.Verb.OnDelete)
                                {
                                    if ((q.By.Count == 0) && (q.OrderBy.Count != 0))
                                    {
                                        CanBePartitioned = false;
                                        break;
                                    }
                                }
                            }
                        }
                        var FirstColumnType = d[k.Columns.First().Name].Type;
                        if (!FirstColumnType.OnTypeRef || !FirstColumnType.TypeRef.Name.Equals("Int"))
                        {
                            CanBePartitioned = false;
                        }
                        KeyCanBePartitioned.Add(k, CanBePartitioned);
                    }
                }

                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "Unit").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: Unit");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "Boolean").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: Boolean");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "String").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: String");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "Int").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: Int");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "Int64").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: Int64");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "Real").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: Real");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "Byte").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: Byte");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "Optional").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: Optional");
                }
                if (!Schema.TypeRefs.Concat(Schema.Types).Where(t => t.OnPrimitive && t.Primitive.Name == "List").Any())
                {
                    throw new InvalidOperationException("PrimitiveMissing: List");
                }

                InnerWriter = new CSharpPlain.CodeGenerator.Writer(Schema, EntityNamespaceName);
            }