Example #1
0
            public SqlBuilder Configure()
            {
                var data = new ClauseData();

                _transforms.ForEach(t => t(data));
                return(_parent.AddClause(
                           data.Name,
                           data.Sql,
                           data.Parameters,
                           data.Joiner,
                           data.Prefix,
                           data.PostFix,
                           data.IsInclusive
                           ));
            }
Example #2
0
        internal OperationResult ContainsAnyOperationDelegate(Clause clause, object?state1, object?state2, IEnumerable <ClauseCapture>?captures)
        {
            var typeHolder = state1 ?? state2;

            if (typeHolder?.GetType().IsDefined(typeof(FlagsAttribute), false) is true)
            {
                bool ParseContainsAnyEnum(Enum state)
                {
                    foreach (var datum in clause.Data ?? new List <string>())
                    {
#if !NETSTANDARD2_0
                        if (Enum.TryParse(typeHolder.GetType(), datum, out var result))
                        {
                            if (result is Enum eresult)
                            {
                                if (state.HasFlag(eresult))
                                {
                                    return(true);
                                }
                            }
                        }
                        else
                        {
                            return(false);
                        }
#else
                        try
                        {
                            var result = Enum.Parse(typeHolder.GetType(), datum);
                            if (state.HasFlag(result as Enum))
                            {
                                return(true);
                            }
                        }
                        catch (Exception)
                        {
                            return(false);
                        }
#endif
                    }
                    return(false);
                }

                if (state1 is Enum enum1)
                {
                    var res = ParseContainsAnyEnum(enum1);
                    if ((res && !clause.Invert) || (clause.Invert && !res))
                    {
                        return(new OperationResult(true, !clause.Capture ? null : new TypedClauseCapture <Enum>(clause, enum1, state1, null)));
                    }
                }
                if (state2 is Enum enum2)
                {
                    var res = ParseContainsAnyEnum(enum2);
                    if ((res && !clause.Invert) || (clause.Invert && !res))
                    {
                        return(new OperationResult(true, !clause.Capture ? null : new TypedClauseCapture <Enum>(clause, enum2, null, state2)));
                    }
                }

                return(new OperationResult(false, null));
            }

            (var stateOneList, var stateOneDict) = Analyzer?.ObjectToValues(state1) ?? (new List <string>(), new List <KeyValuePair <string, string> >());
            (var stateTwoList, var stateTwoDict) = Analyzer?.ObjectToValues(state2) ?? (new List <string>(), new List <KeyValuePair <string, string> >());

            if (clause.DictData is List <KeyValuePair <string, string> > ContainsData)
            {
                if (stateOneDict.Any())
                {
                    var captured = new List <KeyValuePair <string, string> >();
                    foreach (var entry in stateOneDict)
                    {
                        var res = ContainsData.Contains(entry);
                        if ((res && !clause.Invert) || (clause.Invert && !res))
                        {
                            captured.Add(entry);
                        }
                    }

                    if (captured.Any())
                    {
                        var returnVal = clause.Capture ?
                                        new TypedClauseCapture <List <KeyValuePair <string, string> > >(clause, captured, state1, null) :
                                        null;
                        return(new OperationResult(true, returnVal));
                    }
                }
                if (stateTwoDict.Any())
                {
                    var captured = new List <KeyValuePair <string, string> >();
                    foreach (var entry in stateTwoDict)
                    {
                        var res = ContainsData.Contains(entry);
                        if ((res && !clause.Invert) || (clause.Invert && !res))
                        {
                            captured.Add(entry);
                        }
                    }

                    if (captured.Any())
                    {
                        var returnVal = clause.Capture ?
                                        new TypedClauseCapture <List <KeyValuePair <string, string> > >(clause, captured, null, state2) :
                                        null;
                        return(new OperationResult(true, returnVal));
                    }
                }
                return(new OperationResult(false, null));
            }

            if (clause.Data is List <string> ClauseData)
            {
                (bool Applies, List <string>?Matches) ClauseAppliesToList(List <string> stateList)
                {
                    // If we are dealing with an array on the object side
                    if (typeHolder is List <string> )
                    {
                        var foundStates = new List <string>();
                        foreach (var entry in stateList)
                        {
                            if ((!clause.Invert && ClauseData.Contains(entry)) || (clause.Invert && !ClauseData.Contains(entry)))
                            {
                                foundStates.Add(entry);
                            }
                        }
                        if (foundStates.Count == 0)
                        {
                            return(false, null);
                        }

                        return(true, foundStates);
                    }
                    // If we are dealing with a single string we do a .Contains instead
                    else if (typeHolder is string)
                    {
                        var results = new List <string>();
                        foreach (var datum in stateList)
                        {
                            if (clause.Data.Any(x => (clause.Invert && !datum.Contains(x)) || (!clause.Invert && datum.Contains(x))))
                            {
                                results.Add(datum);
                            }
                        }
                        return(results.Any(), clause.Capture ? results : null);
                    }
                    return(false, new List <string>());
                }

                var result = ClauseAppliesToList(stateOneList);
                if (result.Applies)
                {
                    if (result.Matches?.Any() is true)
                    {
                        return(typeHolder switch
                        {
                            string _ => new OperationResult(true, new TypedClauseCapture <string>(clause, result.Matches.First(), state1, null)),
                            _ => new OperationResult(true, new TypedClauseCapture <List <string> >(clause, result.Matches, state1, null)),
                        });