/// <summary> `BuildUsingDirection` builds a new `Dictionary` from an enumeration of directions. </summary>
        /// <typeparam name="V"> The type of value the constructed dictionary is filled with. </typeparam>
        /// <param name="constructor"> The `ConstructionFunction` used in building the new dictionary. </param>
        public static Dictionary <Direction, V> BuildUsingDirection <V>(ConstructorFunction <V> constructor)
        {
            var dictionary = new Dictionary <Direction, V>();
            var keys       = Enum.GetValues(typeof(Direction));

            foreach (Direction key in keys)
            {
                V value = constructor(key);
                dictionary.Add(key, value);
            }

            return(dictionary);
        }
        internal static ConstructorFunction GetConstructor(Type type, BuiltinFunction realTarget, params MethodBase[] mems)
        {
            ConstructorFunction res = null;

            if (mems.Length != 0)
            {
                ReflectionCache.MethodBaseCache cache = new ReflectionCache.MethodBaseCache("__new__", mems);
                lock (_ctors) {
                    if (!_ctors.TryGetValue(cache, out res))
                    {
                        _ctors[cache] = res = new ConstructorFunction(realTarget, mems);
                    }
                }
            }

            return(res);
        }
 public ConstructorOverloadMapper(ConstructorFunction builtinFunction, object instance)
     : base(builtinFunction, instance)
 {
 }
Beispiel #4
0
        public DBFile(string name, string module)
        {
            TableList = new List <Table>();


            using (var sr = new StreamReader(name))
            {
                var str = sr.ReadToEnd();
                foreach (var item in str.GetSlices("/* Create", "/* Create"))
                {
                    if (item.Contains("/* Create Tables */"))
                    {
                        GetTable(item);
                    }
                    else if (item.Contains("/* Create Primary Keys, Indexes, Uniques, Checks */"))
                    {
                        foreach (var constraint in item.GetSlices("ALTER TABLE", $";{NewLine}"))
                        {
                            GetPrimaryKeyAndIndex(constraint);
                        }
                    }
                    else if (item.Contains("/* Create Foreign Key Constraints */"))
                    {
                        foreach (var constraint in item.GetSlices("ALTER TABLE", $";{NewLine}"))
                        {
                            GetForeignKey(constraint);
                        }
                    }
                    else if (item.Contains("/* Create Table Comments, Sequences for Autonumber Columns */"))
                    {
                        foreach (var sequence in item.GetSlices("CREATE SEQUENCE", ";"))
                        {
                            GetSequence(sequence);
                        }
                        foreach (var constraint in item.GetSlices("COMMENT ON", $";{NewLine}"))
                        {
                            if (constraint.Trim().StartsWith("COMMENT ON TABLE"))
                            {
                                GetTableComment(constraint);
                            }
                            else if (constraint.Trim().StartsWith("COMMENT ON COLUMN"))
                            {
                                GetColumnComment(constraint);
                            }
                        }
                    }
                }
            }


            EntityConstraintDic = new Dictionary <string, EntityConstraintsClass>();
            EntityDic           = new Dictionary <string, EntityClass>();
            foreach (var table in TableList)
            {
                table.Schema = "KOVAN_" + module.ToUpperEn();
                var moduleName = module.ToLowerEn();
                var ec         = new EntityConstraintsClass(table, "workshop");
                EntityConstraintDic.Add(ec.Name, ec);

                var entity = new EntityClass(ec, "workshop");
                EntityDic.Add(entity.Name, entity);
            }


            foreach (var table in TableList)
            {
                table.Columns.Any(x => x.Constraints.Count > 0);
                foreach (var col in table.Columns)
                {
                    if (col.Constraints.Any(x => x is ForeignKey))
                    {
                        var entityClass   = EntityDic.Values.First(x => x.EntityConstraints.Table.Name == col.Table.Name);
                        var fkEntityClass = EntityDic.Values.First(x => x.EntityConstraints.Table.Name == (col.Constraints.First(y => y is ForeignKey) as ForeignKey).ReferenceColumn.Table.Name);
                        if (entityClass.Name == fkEntityClass.Name)
                        {
                            continue;
                        }
                        var cm = entityClass.ClassMembers.ClassMembers.First(x => x.Name == col.Name.ToCamelCase());

                        var entityClassMember = new ClassMember(fkEntityClass.Name.Replace("Entity", "").ToLowerFirstCharacter(), fkEntityClass, null, Models.DataModels.Enum.AccessModifier.Private);
                        entityClass.ClassMembers.Replace(col.Name.ToCamelCase(), entityClassMember);

                        var listClass = Models.DataModels.Predefined.PredefinedClasses.JavaList;
                        listClass.GenericList.Add(entityClass);
                        var fkEntityClassMember = new ClassMember(entityClass.Name.Replace("Entity", "") + "List", listClass, null, Models.DataModels.Enum.AccessModifier.Private);
                        if (col.Constraints.Any(x => x is Unique) && (col.Constraints.FirstOrDefault(x => x is Unique) as Unique).Columns.Count > 1)
                        {
                            fkEntityClass.ClassMembers.Add(fkEntityClassMember);
                            fkEntityClassMember.Annotations.Add(Models.DataModels.Predefined.PredefinedAnnotations.OneToMany()
                                                                .SetParameter("cascade", new ReferenceValue("CascadeType.ALL"))
                                                                .SetParameter("mappedBy", entityClassMember.Name));

                            entityClassMember.Annotations.Add(Models.DataModels.Predefined.PredefinedAnnotations.ManyToOne());
                            entityClassMember.Annotations.Add(Models.DataModels.Predefined.PredefinedAnnotations.JoinColumn()
                                                              .SetParameter("referencedColumnName", fkEntityClass.EntityConstraints.GetStaticMemberByValue((col.Constraints.FirstOrDefault(x => x is ForeignKey) as ForeignKey).Column.Name))
                                                              .SetParameter("name", KoGen.Models.DataModels.ReferenceValue.FromStaticMemberByValue(entityClass.EntityConstraints, col.Name))
                                                              .SetParameter("foreignKey", Models.DataModels.Predefined.PredefinedAnnotations.ForeignKey()
                                                                            .SetParameter("name", (col.Constraints.FirstOrDefault(x => x is ForeignKey) as ForeignKey).Name)));
                        }
                        else
                        {
                            entityClassMember.Annotations.Add(Models.DataModels.Predefined.PredefinedAnnotations.OneToOne());
                        }
                    }
                }
            }

            ModelDic = new Dictionary <string, ModelClass>();
            foreach (var entityClass in EntityDic.Values)
            {
                var m = new ModelClass(entityClass, "workshop");
                ModelDic.Add(m.Name, m);
            }

            foreach (var modelClass in ModelDic.Values)
            {
                foreach (var classMember in modelClass.ClassMembers.ClassMembers)
                {
                    var mClass = ModelDic.Values.FirstOrDefault(x => x.EntityClass.Name == classMember.Type.Name || (classMember.Type == Models.DataModels.Predefined.PredefinedClasses.JavaList && x.EntityClass.Name == classMember.Type.GenericList.First().Name));
                    if (mClass != null)
                    {
                        modelClass.ClassMembers.ChangeType(classMember.Name, mClass);
                    }
                }
            }

            ConverterDic = new Dictionary <string, ConverterClass>();
            foreach (var modelClass in ModelDic.Values)
            {
                var m = new ConverterClass(modelClass, "workshop");
                ConverterDic.Add(m.Name, m);
            }
            foreach (var converterClass in ConverterDic.Values)
            {
                foreach (var expression in converterClass.Functions.First(x => x.Name == "doConvertToEntity").Expressions.Where(x => x is SetterAssignExpression).Select(x => x as SetterAssignExpression))
                {
                    if (expression.DestinationClassMember.Type != expression.SourceClassMember.Type)
                    {
                        var converter = ConverterDic.Values.FirstOrDefault(x => x.ModelClass != converterClass.ModelClass && x.ModelClass == expression.SourceClassMember.Type);
                        if (converter != null)
                        {
                            if (!converterClass.ClassMembers.ClassMembers.Any(x => x.Type == converter))
                            {
                                converterClass.ClassMembers.Add(new ClassMember(converter.Name.ToLowerFirstCharacter(), converter, null, Models.DataModels.Enum.AccessModifier.Private, Models.DataModels.Enum.NonAccessModifier.Transient), false);
                            }
                        }
                    }
                }
                if (converterClass.ClassMembers.ClassMembers.Count > 0)
                {
                    var ctor = new ConstructorFunction(converterClass);
                    ctor.Annotations.Add(Models.DataModels.Predefined.PredefinedAnnotations.Autowired());
                    converterClass.Functions.Insert(0, ctor);
                }
            }
        }