예제 #1
0
        /// <summary>
        ///Inserts two foreign key refernces into a mapping table
        /// </summary>
        public virtual void InsertManyToMany <T>(IDwarf obj1, IDwarf obj2, string alternateTableName = null)
        {
            if (!obj1.IsSaved)
            {
                obj1.Save();
            }

            if (!obj2.IsSaved)
            {
                obj2.Save();
            }

            var type1 = obj1.GetType();
            var type2 = obj2.GetType();

            var tableName = ManyToManyAttribute.GetManyToManyTableName(type1, type2, alternateTableName);

            DbContextHelper <T> .ClearCacheForType(type1);

            DbContextHelper <T> .ClearCacheForType(type2);

            var preReq = string.Format("IF NOT EXISTS (SELECT * FROM [{0}] WHERE {1}Id = {2} AND {3}Id = {4}) \r\n",
                                       tableName, type1.Name, ValueToSqlString(obj1.Id), type2.Name, ValueToSqlString(obj2.Id));

            var query = new QueryBuilder <T>()
                        .InsertInto(tableName)
                        .Values(type1.Name + "Id", obj1.Id)
                        .Values(type2.Name + "Id", obj2.Id)
                        .ToQuery();

            ExecuteNonQuery <T>(preReq + query);
        }
        public string CraftPresent(string presentName)
        {
            IPresent present     = presentRepository.FindByName(presentName);
            var      dwarfsReady = dwarfRepository.Models.OrderByDescending(x => x.Energy).Where(x => x.Energy >= 50).ToList();
            var      workShop    = new Workshop();

            if (!dwarfsReady.Any())
            {
                throw new InvalidOperationException(ExceptionMessages.DwarfsNotReady);
            }

            while (dwarfsReady.Any())
            {
                IDwarf currentDwarf = dwarfsReady.First();

                workShop.Craft(present, currentDwarf);

                dwarfsReady.Remove(currentDwarf);
            }

            if (present.IsDone())
            {
                return(string.Format(OutputMessages.PresentIsDone, present.Name));
            }

            else
            {
                return(string.Format(OutputMessages.PresentIsNotDone, present.Name));
            }
        }
예제 #3
0
        public void Craft(IPresent present, IDwarf dwarf)
        {
            while (dwarf.Energy > 0 && dwarf.Instruments.Any()) // итерираме между инструментите
            {
                IInstrument currInstrument = dwarf.Instruments.First();

                while (!present.IsDone() && dwarf.Energy > 0 && !currInstrument.IsBroken()) // правим подаръка
                {
                    dwarf.Work(); // намаляме енергията
                    present.GetCrafted(); // намаляме необходимото за правенето на подаръка
                    currInstrument.Use(); // намаляме здравето на инструмента
                }

                if (currInstrument.IsBroken()) //ако заедно с направата на подарък се е счупил и инструмента !!!!
                {
                    dwarf.Instruments.Remove(currInstrument);
                }

                if (present.IsDone()) //подаръка е готов и излизаме
                {
                    break;
                }

            }
        }
예제 #4
0
        public void Craft(IPresent present, IDwarf dwarf)
        {
            while (dwarf.Energy > DwarfMinEnergy && dwarf.Instruments.Any())
            {
                var currentInstrument = dwarf.Instruments.First();

                while (!present.IsDone() && dwarf.Energy > DwarfMinEnergy &&
                       !currentInstrument.IsBroken())
                {
                    dwarf.Work();
                    present.GetCrafted();
                    currentInstrument.Use();
                }

                if (currentInstrument.IsBroken())
                {
                    dwarf.Instruments.Remove(currentInstrument);
                }

                if (present.IsDone())
                {
                    break;
                }
            }
        }
        public void Craft(IPresent present, IDwarf dwarf)
        {
            while (!present.IsDone() || dwarf.Energy > 0)
            {
                foreach (var instrument in dwarf.Instruments)
                {
                    if (!instrument.IsBroken())
                    {
                        instrument.Use();
                        present.GetCrafted();

                        if (instrument.Power <= 0)
                        {
                            instrument.IsBroken();
                        }

                        if (present.IsDone())
                        {
                            break;
                        }
                        else
                        {
                            instrument.Use();
                            present.GetCrafted();
                        }
                    }
                }
            }
        }
예제 #6
0
        public void Craft(IPresent present, IDwarf dwarf)
        {
            var instruments = dwarf.Instruments.ToList();

            while (true)
            {
                if (dwarf.Energy <= 0 || present.IsDone())
                {
                    break;
                }

                if (instruments[0].IsBroken())
                {
                    dwarf.Instruments.Remove(instruments[0]);
                    instruments.RemoveAt(0);

                    if (instruments.Count > 0)
                    {
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }

                instruments[0].Use();
                dwarf.Work();
                present.GetCrafted();
            }
        }
예제 #7
0
        public void Craft(IPresent present, IDwarf dwarf)
        {
            IInstrument instrument = null;

            while (dwarf.Energy > 0 && dwarf.Instruments.Any(x => x.Power > 0))
            {
                instrument = dwarf.Instruments.FirstOrDefault(x => x.Power > 0);

                while (!present.IsDone() && dwarf.Energy > 0 && !instrument.IsBroken())
                {
                    dwarf.Work();
                    instrument.Use();
                    present.GetCrafted();
                }

                if (instrument.IsBroken())
                {
                    dwarf.Instruments.Remove(instrument);
                }

                if (present.IsDone())
                {
                    break;
                }
            }
        }
예제 #8
0
 public void Craft(IPresent present, IDwarf dwarf)
 {
     while (!present.IsDone() && dwarf.Instruments.Any(x => !x.IsBroken()))
     {
         present.GetCrafted();
         dwarf.Instruments.FirstOrDefault(x => x.IsBroken() == false).Use();
     }
 }
예제 #9
0
        public string CraftPresent(string presentName)
        {
            Workshop workshop = new Workshop();

            IPresent present = this.presents.FindByName(presentName); // намираме подаръка

            ICollection <IDwarf> dwarves = this.dwarfs.Models.Where(dw => dw.Energy >= 50).OrderByDescending(dw => dw.Energy).ToList();

            // намираме тези дуорфи, които имат енергия над 50 и ги подреждаме по нея

            if (!dwarves.Any()) // ако е празна колекцията
            {
                throw new InvalidOperationException(ExceptionMessages.DwarfsNotReady);
            }

            while (dwarves.Any())
            {
                IDwarf currDwarf = dwarves.First();

                workshop.Craft(present, currDwarf);

                if (!currDwarf.Instruments.Any()) // ако му свършат инструментите
                {
                    dwarves.Remove(currDwarf);    //махаме го само от локалната колекция !!!
                }

                if (currDwarf.Energy == 0) //ако му свърши енергията
                {
                    dwarves.Remove(currDwarf);
                    this.dwarfs.Remove(currDwarf); // премахваме го от двете колекции
                }

                if (present.IsDone())
                {
                    break;
                }
            }



            //string result;

            //if (present.IsDone())
            //{
            //    result = string.Format(OutputMessages.PresentIsDone, presentName);
            //}
            //else
            //{
            //    result = string.Format(OutputMessages.PresentIsNotDone, presentName);
            //}

            //return result;

            string result = string.Format(present.IsDone() ? OutputMessages.PresentIsDone : OutputMessages.PresentIsNotDone, presentName);

            return(result);
        }
예제 #10
0
 public void Craft(IPresent present, IDwarf dwarf)
 {
     while (dwarf.Energy > 0 && dwarf.Instruments.Sum(el => el.Power) > 0 && !present.IsDone())
     {
         dwarf.Work();
         dwarf.Instruments.First(el => !el.IsBroken()).Use();
         present.GetCrafted();
     }
 }
예제 #11
0
 public void Craft(IPresent present, IDwarf dwarf)
 {
     while (dwarf.Energy >= 0 && dwarf.Instruments.Any(x => x.IsBroken() == false) && (present.IsDone() == false))
     {
         var instrument = dwarf.Instruments.First(x => x.IsBroken() == false);
         instrument.Use();
         dwarf.Work();
         present.GetCrafted();
     }
 }
예제 #12
0
 public string AddInstrumentToDwarf(string dwarfName, int power)
 {
     dwarf      = dwarfs.FindByName(dwarfName);
     instrument = new Instrument(power);
     if (dwarf == null)
     {
         throw new InvalidOperationException(ExceptionMessages.InexistentDwarf);
     }
     dwarf.AddInstrument(instrument);
     return(string.Format(OutputMessages.InstrumentAdded, power, dwarfName));
 }
예제 #13
0
        public string AddDwarf(string dwarfType, string dwarfName)
        {
            IDwarf dwarf = this.dwarfFactory.Create(dwarfType, dwarfName);

            this.dwarfRepository.Add(dwarf);

            return(string.Format(
                       OutputMessages.DwarfAdded,
                       dwarfType,
                       dwarfName));
        }
예제 #14
0
        /// <summary>
        /// Returns true if the object contains faulty Foreign Key values
        /// </summary>
        private static IEnumerable <string> FaultyForeignKeys(IDwarf obj)
        {
            foreach (var pi in Cfg.FKProperties[DwarfHelper.DeProxyfy(obj)])
            {
                var att = DwarfPropertyAttribute.GetAttribute(pi.ContainedProperty);

                if (!att.IsNullable && (pi.GetValue(obj) == null || !((IDwarf)pi.GetValue(obj)).IsSaved))
                {
                    yield return(pi.Name);
                }
            }
        }
예제 #15
0
 public void Craft(IPresent present, IDwarf dwarf)
 {
     while (true)
     {
         dwarf.Work();
         present.GetCrafted();
         if (present.IsDone)
         {
             break;
         }
     }
 }
예제 #16
0
 /// <summary>
 /// Returns all AuditLog events for the supplied object
 /// </summary>
 public static List <AuditLog> GetAllEvents <T>(IDwarf obj)
 {
     return(DwarfContext <T> .GetDatabase().SelectReferencing <T, AuditLog>
            (
                new WhereCondition <AuditLog> {
         Column = x => x.ClassType, Value = obj.GetType().Name
     },
                new WhereCondition <AuditLog> {
         Column = x => x.ObjectId, Value = obj.Id
     }
            ));
 }
예제 #17
0
        //The dwarf starts crafting the present.This is only possible,
        //if the dwarf has energy and an instrument that isn't broken.
        //At the same time the present is getting crafted, so call the GetCrafted() method for the present.
        //Keep working until the present is done or the dwarf has energy and instruments to use.
        //If at some point the power of the current instrument reaches or drops below 0,
        //meaning it is broken, then the dwarf should take the next instrument from its collection, if it has any left.


        public void Craft(IPresent present, IDwarf dwarf)
        {
            if (dwarf.Energy > 0 && dwarf.Instruments.Any(i => i.Power > 0))
            {
                while ((dwarf.Energy > 0 && dwarf.Instruments.Any(i => i.Power > 0)) ||
                       !present.IsDone())
                {
                    dwarf.Work();
                    present.GetCrafted();
                }
            }
        }
예제 #18
0
        public string AddInstrumentToDwarf(string dwarfName, int power)
        {
            IDwarf dwarf = this.dwarfRepository.FindByName(dwarfName);

            if (dwarf == null)
            {
                throw new InvalidOperationException(ExceptionMessages.InexistentDwarf);
            }

            dwarf.AddInstrument(new Instrument(power));

            return(string.Format(OutputMessages.InstrumentAdded, power, dwarfName));
        }
예제 #19
0
        public string AddInstrumentToDwarf(string dwarfName, int power)
        {
            IDwarf dwarf = this.dwarfs.FindByName(dwarfName);

            if (dwarf == null)
            {
                throw new InvalidOperationException("The dwarf you want to add an instrument to doesn't exist!");
            }
            IInstrument instrument = new Instrument(power);

            dwarf.AddInstrument(instrument);
            return($"Successfully added instrument with power {instrument.Power} to dwarf {dwarf.Name}!");
        }
예제 #20
0
        public string AddInstrumentToDwarf(string dwarfName, int power)
        {
            IDwarf wantedDwarf = this.dwarfs.Models.FirstOrDefault(d => d.Name == dwarfName);

            if (wantedDwarf == null)
            {
                throw new InvalidOperationException(ExceptionMessages.InexistentDwarf);
            }
            IInstrument instrument = new Instrument(power);

            wantedDwarf.AddInstrument(instrument);
            return(String.Format(OutputMessages.InstrumentAdded, power, dwarfName));
        }
예제 #21
0
        /// <summary>
        ///Inserts two foreign key refernces into a mapping tables
        /// </summary>
        public virtual List <T> SelectManyToMany <T>(IDwarf owner, string alternateTableName = null) where T : Dwarf <T>, new()
        {
            if (owner == null || !owner.IsSaved)
            {
                return(new List <T>());
            }

            var targetType = typeof(T);
            var ownerType  = owner.GetType();

            var tableName = ManyToManyAttribute.GetManyToManyTableName(targetType, ownerType, alternateTableName);

            var command = new QueryBuilderLight().Select <T>()
                          .From <T>()
                          .InnerJoin("[" + tableName + "] ON [" + tableName + "].[" + targetType.Name + "Id] = [" + targetType.Name + "].[Id]")
                          .Where("[" + tableName + "].[" + ownerType.Name + "Id]", owner.Id, ownerType).ToQuery();

            if (!typeof(T).Implements <ICacheless>())
            {
                var cache = CacheManager.GetCacheList <T>(command);
                if (cache != null)
                {
                    return(cache);
                }
            }

            var sdr = ExecuteReader <T>(command);

            var result = new List <T>();

            try
            {
                while (sdr.Read())
                {
                    result.Add(TupleToObject <T>(sdr));
                }
            }
            catch (Exception e)
            {
                DwarfContext <T> .GetConfiguration().ErrorLogService.Logg(e);

                throw new DatabaseOperationException(e.Message, e);
            }
            finally
            {
                sdr.Close();
            }

            return(typeof(T).Implements <ICacheless>() ? result : CacheManager.SetCacheList(command, result));
        }
        public string AddInstrumentToDwarf(string dwarfName, int power)
        {
            IInstrument instrument = new Instrument(power);

            IDwarf dwarf = this.dwarfs.FindByName(dwarfName);

            if (dwarf == null)
            {
                throw new InvalidOperationException(ExceptionMessages.InexistentDwarf);
            }

            dwarf.AddInstrument(instrument);
            return($"Successfully added instrument with power {power} to dwarf {dwarfName}!");
        }
        private int GetCount(IDwarf item)
        {
            var counter = 0;

            foreach (var inst in item.Instruments)
            {
                if (!inst.IsBroken())
                {
                    counter++;
                }
            }

            return(counter);
        }
        public string CraftPresent(string presentName)
        {
            var present = this.presents.FindByName(presentName);

            IDwarf dwarf = this.dwarfs.Models.FirstOrDefault(d => d.Energy >= 50 && d.Instruments.Any(i => !i.IsBroken()));

            if (this.dwarfs.Models.Any(d => d.Instruments.Any(i => i.Power > 0)))
            {
                foreach (var instrument in this.dwarfs.Models)
                {
                    var instCount = this.GetCount(instrument);

                    if (instrument.Energy >= dwarf.Energy && instCount > this.GetCount(dwarf))
                    {
                        dwarf = instrument;
                    }
                }
            }
            else
            {
                dwarf = this.dwarfs.Models.FirstOrDefault(d => d.Energy >= 50 && d.Instruments.Any(i => !i.IsBroken()));
            }

            if (dwarf is null)
            {
                throw new InvalidOperationException(ExceptionMessages.DwarfsNotReady);
            }

            if (!present.IsDone())
            {
                this.workshop.Craft(present, dwarf);
            }

            if (dwarf.Energy == 0)
            {
                this.dwarfs.Remove(dwarf);
            }

            var masage = present.IsDone() == true ? "done" : "not done";

            if (masage == "done")
            {
                return(string.Format(OutputMessages.PresentIsDone, presentName));
            }
            else
            {
                return(string.Format(OutputMessages.PresentIsNotDone, presentName));
            }
        }
예제 #25
0
        private IDwarf CreateDwarfByType(string dwarfType, string dwarfName)
        {
            IDwarf dwarf = null;

            if (dwarfType == "HappyDwarf")
            {
                dwarf = new HappyDwarf(dwarfName);
            }
            else
            {
                dwarf = new SleepyDwarf(dwarfName);
            }

            return(dwarf);
        }
예제 #26
0
        public string AddDwarf(string dwarfType, string dwarfName)
        {
            IDwarf dwarf = null;

            switch (dwarfType)
            {
            case "HappyDwarf": dwarf = new HappyDwarf(dwarfName); break;

            case "SleepyDwarf": dwarf = new SleepyDwarf(dwarfName); break;

            default: throw new InvalidOperationException(ExceptionMessages.InvalidDwarfType);
            }
            this.dwarfs.Add(dwarf);
            return(string.Format(OutputMessages.DwarfAdded, dwarfType, dwarfName));
        }
예제 #27
0
 public void Craft(IPresent present, IDwarf dwarf)
 {
     while (dwarf.Energy > 0 || !present.IsDone() || dwarf.Instruments.Any(x => !x.IsBroken()))
     {
         foreach (var instrument in dwarf.Instruments)
         {
             while (!instrument.IsBroken())
             {
                 instrument.Use();
                 dwarf.Work();
                 present.GetCrafted();
             }
         }
     }
 }
예제 #28
0
        public string CraftPresent(string presentName)
        {
            IPresent present = this.presents.FindByName(presentName);
            IDwarf   dwarf   = dwarves.Models
                               .Where(d => d.Energy >= 50)
                               .OrderByDescending(d => d.Energy)
                               .FirstOrDefault(d => d.Instruments.Count > 0);

            Workshop workshop = new Workshop();

            while (dwarves.Models.Any(d => d.Energy >= 50))
            {
                if (dwarf == null)
                {
                    throw new InvalidOperationException(ExceptionMessages.DwarfsNotReady);
                }

                workshop.Craft(present, dwarf);

                if (dwarf.Energy == 0)
                {
                    this.dwarves.Remove(dwarf);
                }

                if (present.IsDone())
                {
                    break;
                }

                if (!dwarf.Instruments.Any(i => i.Power > 0))
                {
                    break;
                }
            }

            string result;

            if (present.IsDone())
            {
                result = string.Format(OutputMessages.PresentIsDone, presentName);
            }
            else
            {
                result = string.Format(OutputMessages.PresentIsNotDone, presentName);
            }

            return(result);
        }
        public void Craft(IPresent present, IDwarf dwarf)
        {
            if (dwarf.Energy > 0 && dwarf.Instruments.Any(i => i.IsBroken() == false))
            {
                while (true)
                {
                    if (present.IsDone() || dwarf.Energy <= 0 || dwarf.Instruments.All(i => i.IsBroken()))
                    {
                        break;
                    }

                    present.GetCrafted();
                    dwarf.Work();
                }
            }
        }
예제 #30
0
        public void Craft(IPresent present, IDwarf dwarf)
        {
            var instrument = dwarf.Instruments.FirstOrDefault(x => x.IsBroken() == false);

            while (present.IsDone() == false && dwarf.Energy > 0 && instrument != null)
            {
                present.GetCrafted();
                instrument.Use();
                dwarf.Work();


                if (instrument.IsBroken())
                {
                    instrument = dwarf.Instruments.FirstOrDefault(x => x.IsBroken() == false);
                }
            }
        }