Пример #1
0
        public override WSFilter GetCustomFilter(Expression parent, int level)
        {
            try
            {
                if (parent != null && IsFiltrable && EntitySchema != null)
                {
                    level++;
                    Expression member = Expression.Property(parent, Param.WSColumnRef.NAME);
                    if (member != null)
                    {
                        ParameterExpression id = Expression.Parameter(EntitySchema.Source.ReturnType, level.ToHex());

                        WSFilter subFilter = EntitySchema.GetCustomFilter(id, level);

                        if (subFilter != null && subFilter.IsValid)
                        {
                            dynamic subExpr = subFilter.GetType().GetMethod("ToLambda").MakeGenericMethod(new Type[] { EntitySchema.Source.ReturnType }).Invoke(subFilter, new object[] { id });

                            return(new WSEntityListFFilter(Param, member, WSEntityListFFilter.OPERATIONS.Any)
                            {
                                Value = (subExpr == null) ? true : subExpr
                            });
                        }
                    }
                }
            }
            catch (Exception e) { WSStatus status = WSStatus.NONE.clone(); Func.RegError(GetType(), e, ref status); }
            return(null);
        }
Пример #2
0
        public WSFilter GetMainFilter(WSRequest Request, Expression _EntityExpression, int _level)
        {
            WSCombineFilter mainFilter = new WSCombineFilter(WSCombineFilter.SQLMode.AndAlso);

            WSFilter BaseFilter = GetBaseFilter(Request, _EntityExpression, _level);
            if (BaseFilter != null && BaseFilter.IsValid) { mainFilter.Save(BaseFilter); }

            WSFilter CustomFilter = GetCustomFilter(_EntityExpression, _level);
            if (CustomFilter != null && CustomFilter.IsValid) { mainFilter.Save(CustomFilter); }

            return mainFilter != null && mainFilter.IsValid ? mainFilter.Reduce() : null;
        }
Пример #3
0
        public override WSFilter GetFieldFilter(MetaFunctions CFunc, WSTableParam param, Expression parent, int level, string state = null, bool?negate = null)
        {
            try
            {
                ///**************************************************
                //* if(filter array contains any conditional 'IOJFilter'
                //* like : "[{option_name1:value1},{option_name2:value2}]" (example:"[{max:123},{min:123}]") , - then use 'CombineMode.AndAlso'
                //* else
                //* (if all values in the filter array are simple type values)
                //* like : "{value1,value2,value3,...}" ,- use 'CombineMode.Or'
                //* ***********************************************/
                WSCombineFilter filter = new WSCombineFilter(WSCombineFilter.SQLMode.OrElse, negate);

                foreach (WSJson j in Value)
                {
                    WSFilter jFilter = j.GetFieldFilter(CFunc, param, parent, level, state, negate);
                    filter.Save(jFilter);
                }

                return(filter.Any() ? (filter.Count == 1 && !filter.Negate) ? filter.FirstOrDefault() : filter : null);
            }
            catch (Exception e) { WSStatus status = WSStatus.NONE.clone(); CFunc.RegError(GetType(), e, ref status); }
            return(null);
        }
Пример #4
0
        public override WSFilter GetCustomFilter(Expression parent, int level)
        {
            WSFilter filter = !IsFiltrable ? null : IOBaseOptions.GetFieldFilter(Func, param, parent, level);

            return(filter != null && filter.IsValid ? filter : null);
        }
Пример #5
0
        public override WSFilter GetFieldFilter(MetaFunctions CFunc, WSTableParam param, Expression parent, int level, string state = null, bool?negate = null)
        {
            WSCombineFilter filter = new WSCombineFilter(WSCombineFilter.SQLMode.AndAlso);

            try
            {
                if (param != null && param.isValid && (param.DataType.IsNullable() || Value != null))
                {
                    if (param.DataType.IsSimple())
                    {
                        bool localNegate = WSConstants.ALIACES.NOT.Match(state);
                        negate = negate == null ? localNegate : localNegate != negate;
                        WSFilter pFilter = Value.GetFieldFilter(CFunc, param, parent, level, Key, negate);
                        filter.Save(pFilter);
                    }
                    else if (param.DataType.IsSameOrSubclassOf(typeof(WSEntity)) || param.DataType.IsCollectionOf <WSEntity>())
                    {
                        if (WSConstants.ALIACES.NOT.Match(Key))
                        {
                            return(Value.GetFieldFilter(CFunc, param, parent, level, state, true));
                        }
                        else if (WSConstants.ALIACES.ANY.Match(Key))
                        {
                            return(Value.GetFieldFilter(CFunc, param, parent, level, Key, true));
                        }
                        else
                        {
                            WSTableSource PSource = (WSTableSource)CFunc.GetSourceByType/*<WSTableSource>*/ (param.DataType.GetEntityType());

                            WSTableParam subParam = PSource == null ? null : (WSTableParam)PSource.GetXParam(Key);
                            Expression   member   = Expression.Property(parent, param.WSColumnRef.NAME);
                            if (subParam == null && WSConstants.SPECIAL_CASES.Any(c => c.Match(Key)))
                            {
                                if (param.DataType.IsSameOrSubclassOf(typeof(WSEntity)))
                                {
                                    return(new WSEntityFFilter(param, member, WSEntityFFilter.OPERATIONS.STATE_OPERATIONS.FirstOrDefault(x => x.Match(Key)))
                                    {
                                        Value = null
                                    });
                                }
                                else if (param.DataType.IsCollectionOf <WSEntity>())
                                {
                                    return(new WSEntityListFFilter(param, member, WSEntityListFFilter.OPERATIONS.STATE_OPERATIONS.FirstOrDefault(x => x.Match(Key)))
                                    {
                                        Value = null
                                    });
                                }
                            }
                            else
                            {
                                WSFilter subFilter = null;
                                if (param.DataType.IsSameOrSubclassOf(typeof(WSEntity)))
                                {
                                    filter.Save(new WSEntityFFilter(param, member, WSEntityFFilter.OPERATIONS.NotEqual)
                                    {
                                        Value = null
                                    });

                                    subFilter = Value.GetFieldFilter(CFunc, subParam, member, level, Key);
                                    if (subFilter != null && subFilter.IsValid)
                                    {
                                        filter.Save(new WSEntityFFilter(param, member, WSEntityFFilter.OPERATIONS.Filter)
                                        {
                                            Value = subFilter
                                        });
                                    }
                                }
                                else if (param.DataType.IsCollectionOf <WSEntity>())
                                {
                                    level++;

                                    Type elemType          = param.DataType.GetEntityType();
                                    ParameterExpression id = Expression.Parameter(elemType, level.ToHex());
                                    subFilter = Value.GetFieldFilter(CFunc, subParam, id, level, Key, negate);
                                    if (subFilter != null && subFilter.IsValid)
                                    {
                                        dynamic subExpr = subFilter.GetType().GetMethod("ToLambda").MakeGenericMethod(new Type[] { elemType }).Invoke(subFilter, new object[] { id });

                                        filter.Save(new WSEntityListFFilter(subParam, member, WSEntityListFFilter.OPERATIONS.Any)
                                        {
                                            Value = (subExpr == null) ? true : subExpr
                                        });
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception e) { WSStatus status = WSStatus.NONE.clone(); CFunc.RegError(GetType(), e, ref status); }
            return(filter.Any() ? (filter.Count == 1 && !filter.Negate) ? filter.FirstOrDefault() : filter : null);
        }
Пример #6
0
        public override WSFilter GetBaseFilter(WSRequest Request, Expression _member, int _level, WSJson _BaseFilter = null)
        {
            WSJson          BaseFilter = _BaseFilter == null ? Source.BaseFilter : _BaseFilter;
            WSCombineFilter filter     = new WSCombineFilter(WSCombineFilter.SQLMode.AndAlso);

            if (filter != null && BaseFilter != null && BaseFilter.IsValid)
            {
                Expression member = null;
                filter = BaseFilter is WSJArray ? new WSCombineFilter(WSCombineFilter.SQLMode.OrElse) : filter;

                BaseFilter.apply(Request, Func);

                if (BaseFilter != null && BaseFilter.IsValid)
                {
                    if (_member.Type == Source.ReturnType)
                    {
                        member = _member;
                    }
                    else if (Parent != null)
                    {
                        WSTableParam paramExt = (WSTableParam)Parent.Source.GetXParam(Name);
                        if (paramExt != null)
                        {
                            member = Expression.Property(_member, paramExt.WSColumnRef.NAME);
                        }
                    }

                    if (member != null)
                    {
                        if (BaseFilter is WSJValue)
                        {
                            if (((WSJValue)BaseFilter).Value.IsTrue() || ((WSJValue)BaseFilter).Value.IsFalse())
                            {
                                WSFilter subFilter = ((WSJValue)BaseFilter).GetOptionFilter(Func, member, _level);
                                if (subFilter != null)
                                {
                                    filter.Add(subFilter);
                                }
                            }
                        }
                        else if (BaseFilter is WSJObject)
                        {
                            foreach (WSJProperty item in ((WSJObject)BaseFilter).Value)
                            {
                                bool replace = true;
                                List <WSMemberSchema> _schemas = readFieldSchema(item, out replace);
                                if (_schemas.Any())
                                {
                                    foreach (WSMemberSchema _schema in _schemas)
                                    {
                                        WSFilter subFilter = _schema.GetCustomFilter(member, _level);
                                        if (subFilter != null)
                                        {
                                            filter.Add(subFilter);
                                        }
                                    }
                                }
                            }
                        }
                        else if (BaseFilter is WSJArray)
                        {
                            foreach (WSJson item in ((WSJArray)BaseFilter).Value)
                            {
                                bool replace = true;
                                List <WSMemberSchema> _schemas = readFieldSchema(item, out replace);
                                if (_schemas.Any())
                                {
                                    foreach (WSMemberSchema _schema in _schemas)
                                    {
                                        WSFilter subFilter = _schema.GetCustomFilter(member, _level);
                                        if (subFilter != null)
                                        {
                                            filter.Add(subFilter);
                                        }
                                    }
                                }
                                else if (item is WSJValue && (((WSJValue)item).Value.IsTrue() || ((WSJValue)item).Value.IsFalse()))
                                {
                                    WSFilter subFilter = ((WSJValue)item).GetOptionFilter(Func, member, _level);
                                    if (subFilter != null)
                                    {
                                        filter.Add(subFilter);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            WSFilter result = filter != null && filter.IsValid ? filter.Reduce() : null;

            return(result);
        }