Example #1
0
        /// <summary>
        /// Парсинг параметра в дерево
        /// </summary>
        /// <param name="item">Параметр</param>
        /// <param name="separator">Символ разделитель элементов строки</param>
        /// <returns>Узел дерева, соответствующий последнему элементу дерева</returns>
        private TreeNode ParseItem(ParameterStringItem item, TreeNode root, IList <string> vals)
        {
            var val = vals[0];

            vals.RemoveAt(0);

            var currentNode = FindNode(root, val);

            if (currentNode == null)
            {
                if (vals.Count == 0)
                {
                    currentNode = root.Add(val, item);
                }
                else
                {
                    currentNode = root.Add(val, null);
                }
            }
            else
            {
                if (vals.Count == 0)
                {
                    currentNode.Value = item;
                }
            }

            if (vals.Count > 0)
            {
                currentNode = ParseItem(item, currentNode, vals);
            }

            return(currentNode);
        }
Example #2
0
        private void CreateFilterCondition <T, TParent>(object criterion, ParameterStringItem value, string key, bool isClass)
            where T : class
            where TParent : class
        {
            object crit = criterion;
            int    last = key.LastIndexOf('.');

            if (last > 0)
            {
                crit = CreateCriteria <T>(key, criterion);
            }

            object val = "";

            if (value.Value is IList <string> )
            {
                val = (value.Value as IList <string>)[0];
            }
            else
            {
                val = value.Value;
            }

            switch (value.Operation)
            {
            case ParameterStringItem.OperationType.Like:
                if ((val as string).Length > 0)
                {
                    crit.GetType().GetMethod("Like", new Type[] { typeof(string), typeof(string) })
                    .Invoke(crit, new object[] { key.Substring(last + 1), val });
                }
                break;

            case ParameterStringItem.OperationType.Eq:
                if (val == null || (val as string).Length > 0)
                {
                    crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) })
                    .Invoke(crit, new object[] { key.Substring(last + 1) + (isClass ? ".Id" : ""), CriteriaCond.Eq, val });
                }
                break;

            case ParameterStringItem.OperationType.NotEq:
                if (val == null || (val as string).Length > 0)
                {
                    crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) })
                    .Invoke(crit, new object[] { key.Substring(last + 1) + (isClass ? ".Id" : ""), CriteriaCond.NotEq, val });
                }
                break;

            case ParameterStringItem.OperationType.OneOf:
                crit.GetType().GetMethod("OneOf", new Type[] { typeof(string), typeof(IEnumerable) })
                .Invoke(crit, new object[] { key.Substring(last + 1) + (isClass ? ".Id" : ""), value.Value });
                break;

            case ParameterStringItem.OperationType.NotOneOf:
                crit.GetType().GetMethod("NotOneOf", new Type[] { typeof(string), typeof(IEnumerable) })
                .Invoke(crit, new object[] { key.Substring(last + 1) + (isClass ? ".Id" : ""), value.Value });
                break;
            }
        }
Example #3
0
        /// <summary>
        /// Добавление дочернего узла дерева
        /// </summary>
        /// <param name="name">имя узла</param>
        /// <param name="value">значение узла</param>
        /// <returns>Добавленный узел</returns>
        public TreeNode Add(string name, ParameterStringItem value = null)
        {
            var node = new TreeNode(name, value);

            childNodes.Add(node);

            return(node);
        }
Example #4
0
        /// <summary>
        /// Парсинг параметра в дерево
        /// </summary>
        /// <param name="item">Параметр</param>
        /// <param name="separator">Символ разделитель элементов строки</param>
        /// <returns>Узел дерева, соответствующий последнему элементу дерева</returns>
        private TreeNode ParseItem(ParameterStringItem item, char separator)
        {
            var vals        = new List <string>(item.Key.Split(separator, '.'));
            var currentNode = root;

            currentNode = ParseItem(item, root, vals);

            return(currentNode);
        }
Example #5
0
        private void CreateFilterConditionOR <T>(object criteria, ParameterStringItem value) where T : class
        {
            Type type;
            var  list = value.Value as List <ParameterStringItem>;

            type = GetProperty(typeof(T), list[0].Key);
            if (type != typeof(string))
            {
                CreateFilterCondition <T>(criteria, list[0], type.IsClass);
            }
            else
            {
                if (list[0].Operation == ParameterStringItem.OperationType.Eq)
                {
                    list[0].Operation = ParameterStringItem.OperationType.Like;
                }
                CreateFilterCondition <T>(criteria, list[0], false);
            }

            type = GetProperty(typeof(T), list[1].Key);
            if (type != typeof(string))
            {
                CreateFilterCondition <T>(criteria, list[1], type.IsClass);
            }
            else
            {
                if (list[1].Operation == ParameterStringItem.OperationType.Eq)
                {
                    list[1].Operation = ParameterStringItem.OperationType.Like;
                }
                CreateFilterCondition <T>(criteria, list[1], false);
            }


            criteria.GetType().GetMethod("Or", System.Type.EmptyTypes).Invoke(criteria, null);
        }
Example #6
0
        /// <summary>
        /// Ограничение выборки задач по пользователям
        /// </summary>
        /// <param name="ps">Параметры фильтрации</param>
        /// <param name="key">имя поля</param>
        /// <param name="user">Пользователь</param>
        /// <param name="permission">Право, по корому ограничивается выборка</param>
        private ParameterStringItem RestrictOnUserByPermission(string key, User user, Permission permission)
        {
            ParameterStringItem result = null;

            switch (user.GetPermissionDistributionType(permission))
            {
            case PermissionDistributionType.All:
                result = new ParameterStringItem("Id", ParameterStringItem.OperationType.NotEq, "0");       // Заведомо истинное условие
                break;

            case PermissionDistributionType.None:
                result = new ParameterStringItem(key, ParameterStringItem.OperationType.Eq, "0");
                break;

            case PermissionDistributionType.Personal:
                result = new ParameterStringItem(key, ParameterStringItem.OperationType.Eq, user.Id.ToString());
                break;

            case PermissionDistributionType.Teams:
                var list = user.Teams.SelectMany(x => x.Users).Select(x => x.Id.ToString());
                if (list.Count() > 0)
                {
                    result = new ParameterStringItem(key, ParameterStringItem.OperationType.OneOf, list);
                }
                else
                {
                    result = new ParameterStringItem(key, ParameterStringItem.OperationType.Eq, user.Id.ToString());
                }
                break;

            default:
                throw new Exception(String.Format("Неизвестное распространение права «{0}».", permission.GetDisplayName()));
            }

            return(result);
        }
Example #7
0
 /// <summary>
 /// Конструктор
 /// </summary>
 /// <param name="name">имя узла</param>
 /// <param name="value">значение узла</param>
 public TreeNode(string name, ParameterStringItem value = null)
 {
     Name  = name;
     Value = value;
 }
Example #8
0
        private void CreateFilterCondition <T>(object criteria, ParameterStringItem value, bool isClass) where T : class
        {
            var key = value.Key.Replace("_", ".");

            var    crit = CreateCriteria <T>(key, criteria);
            object val  = "";

            if (value.Value is IList <string> )
            {
                //Проверяем наличие значений, если нет, то выходим
                if ((value.Value as IList <string>).Count == 0)
                {
                    return;
                }
                //Значения есть, обрабатываем
                val = (value.Value as IList <string>)[0];
            }
            else
            {
                val = value.Value;
            }

            var propKey = key.Substring(key.LastIndexOf('.') + 1);

            switch (value.Operation)
            {
            case ParameterStringItem.OperationType.Like:
                if ((val as string).Length > 0)
                {
                    crit = crit.GetType().GetMethod("Like", new Type[] { typeof(string), typeof(string) })
                           .Invoke(crit, new object[] { propKey, val });
                }
                break;

            case ParameterStringItem.OperationType.Eq:
                if (val == null || ((val is Guid) || (val is string && (val as string).Length > 0)))
                {
                    crit = crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) })
                           .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), CriteriaCond.Eq, val });
                }
                break;

            case ParameterStringItem.OperationType.NotEq:
                if (val == null || (val as string).Length > 0)
                {
                    crit = crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) })
                           .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), CriteriaCond.NotEq, val });
                }
                break;

            case ParameterStringItem.OperationType.OneOf:
                crit = crit.GetType().GetMethod("OneOf", new Type[] { typeof(string), typeof(IEnumerable) })
                       .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), value.Value });
                break;

            case ParameterStringItem.OperationType.NotOneOf:
                crit = crit.GetType().GetMethod("NotOneOf", new Type[] { typeof(string), typeof(IEnumerable) })
                       .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), value.Value });
                break;

            case ParameterStringItem.OperationType.Gt:
                if (val == null || ((val is Guid) || (val is string && (val as string).Length > 0)))
                {
                    crit = crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) })
                           .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), CriteriaCond.Gt, val });
                }
                break;

            case ParameterStringItem.OperationType.Ge:
                if (val == null || ((val is Guid) || (val is string && (val as string).Length > 0)))
                {
                    crit = crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) })
                           .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), CriteriaCond.Ge, val });
                }
                break;

            case ParameterStringItem.OperationType.Lt:
                if (val == null || ((val is Guid) || (val is string && (val as string).Length > 0)))
                {
                    crit = crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) })
                           .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), CriteriaCond.Lt, val });
                }
                break;

            case ParameterStringItem.OperationType.Le:
                if (val == null || ((val is Guid) || (val is string && (val as string).Length > 0)))
                {
                    crit = crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) })
                           .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), CriteriaCond.Le, val });
                }
                break;
            }
        }