public void VerifyThatContainerConstructsString()
        {
            var container = new WhereQueryContainer()
            {
                Comparer = "=",
                Property = typeof(Thing).GetProperty("ThingType"),
                Value    = new List <object>()
                {
                    "someVal12", "someval3", 4, DateTime.UtcNow
                }
            };

            var container2 = new WhereQueryContainer()
            {
                Comparer = "=",
                Property = typeof(Thing).GetProperty("ThingType"),
                Value    = new List <object>()
                {
                    DateTime.UtcNow
                }
            };

            Console.WriteLine(container.GetSqlString());
        }
        /// <summary>
        /// Processes the request to get the correct set up for this container.
        /// </summary>
        /// <param name="request">
        /// The nancy Request to process.
        /// </param>
        /// <param name="entityType">
        /// The entity Type.
        /// </param>
        public void Process(Request request, Type entityType)
        {
            // process query parameters
            var limit = request.Query["limit"];
            var page  = request.Query["page"];
            var order = request.Query["order"];
            var desc  = request.Query["desc"];
            var count = request.Query["count"];

            int  pageNumber, limitNumber;
            bool countExpected;

            this.IsPaginated = int.TryParse(page, out pageNumber);
            this.IsLimited   = int.TryParse(limit, out limitNumber);

            var isCountProvided = bool.TryParse(count, out countExpected);

            if (isCountProvided)
            {
                this.IsCountExpected = countExpected;
            }

            if (this.IsPaginated)
            {
                this.PageNumber = pageNumber;

                if (!this.IsLimited)
                {
                    this.Limit = DefaultLimit;
                }
                else
                {
                    this.Limit = limitNumber;
                }

                this.Offset = (this.PageNumber - 1) * this.Limit;
            }

            var primaryKey = !(Activator.CreateInstance(entityType) is IEntityObject instance) ? "Uuid" : instance.PrimaryKey;

            this.OrderProperty = entityType.GetProperty(primaryKey);
            this.IsDescending  = true;

            if (desc != null)
            {
                // parse descending
                bool descBool;

                var canDescParse = bool.TryParse(desc.ToString(), out descBool);
                if (canDescParse)
                {
                    this.IsDescending = descBool;
                }
            }

            // get the ordering property
            if (!string.IsNullOrEmpty(order))
            {
                var orderString = order.ToString() as string;

                var overrideOrderProperty = entityType.GetProperty(orderString.ToTitleCase());
                if (overrideOrderProperty != null)
                {
                    this.OrderProperty = overrideOrderProperty;
                    this.IsOrdered     = true;
                }
            }

            // get filtering properties
            var map = EntityResolverMap.TypeToPropertyResolverMap[entityType];

            foreach (var property in map)
            {
                var val = request.Query[property.Key];

                if (val != null)
                {
                    var valueString = val.ToString() as string;

                    if (valueString == null)
                    {
                        continue;
                    }

                    var whereContainer = new WhereQueryContainer
                    {
                        Comparer = "=",
                        Property =
                            entityType.GetProperty(
                                property.Key.ToTitleCase())
                    };

                    // split by ;
                    var values = valueString.Split(new[] { ';' });

                    foreach (var value in values)
                    {
                        // parse the value into correct type
                        var typeConverter = TypeDescriptor.GetConverter(property.Value);
                        var parsedValue   = typeConverter.ConvertFromString(value);

                        whereContainer.Value.Add(parsedValue);
                    }

                    this.FilterList.Add(whereContainer);
                }
            }
        }
Esempio n. 3
0
        public void VerifyThatQueryContainersCanBeJoinedByORAND()
        {
            var template = new User();

            DatabaseSession.Instance.Connector.CreateTableWithColumns(template);

            var user1 = new User()
            {
                Uuid         = Guid.NewGuid(),
                Usergroup_Id = 4,
                Name         = "Name1"
            };

            user1.Save();

            var user2 = new User()
            {
                Uuid         = Guid.NewGuid(),
                Usergroup_Id = 5,
                Name         = "Name2"
            };

            user2.Save();

            var whereQuery1 = new WhereQueryContainer()
            {
                Comparer = "=",
                Property = typeof(User).GetProperty("Name"),
                Value    = new List <object>()
                {
                    "Name1"
                }
            };

            var whereQuery2 = new WhereQueryContainer()
            {
                Comparer = "=",
                Property = typeof(User).GetProperty("Usergroup_Id"),
                Value    = new List <object>()
                {
                    5
                }
            };

            Assert.AreEqual(0, User.Where(new List <IWhereQueryContainer>()
            {
                whereQuery1, whereQuery2
            }, true).Count);
            Assert.AreEqual(2, User.Where(new List <IWhereQueryContainer>()
            {
                whereQuery1, whereQuery2
            }, false).Count);

            Assert.AreEqual(0, User.CountWhere(new List <IWhereQueryContainer>()
            {
                whereQuery1, whereQuery2
            }, true));
            Assert.AreEqual(2, User.CountWhere(new List <IWhereQueryContainer>()
            {
                whereQuery1, whereQuery2
            }, false));
        }