private static bool TryMatchFieldWithCondition(string fieldName, QueryFilter resultFilter, SearchConditions conditions)
        {
            List<SearchCondition> conditionList;
            if (!conditions.TryGetValue(fieldName, out conditionList))
            {
                return false;
            }

            switch (conditionList.Count)
            {
                case 2: // checking for the between operator
                {
                    var lessThanOrEqualCondition = conditionList.SingleOrDefault(c => c.Operator == ScanOperator.LessThanOrEqual);
                    var greaterThanOrEqualCondition = conditionList.SingleOrDefault(c => c.Operator == ScanOperator.GreaterThanOrEqual);

                    if ((lessThanOrEqualCondition == null) || (greaterThanOrEqualCondition == null))
                    {
                        throw new InvalidOperationException("Multiple conditions for the same field are only supported for the BETWEEN case");
                    }

                    if
                    (
                        (lessThanOrEqualCondition.Values.Length != 1)
                        ||
                        (greaterThanOrEqualCondition.Values.Length != 1)
                    )
                    {
                        return false;
                    }

                    resultFilter.AddCondition(fieldName, QueryOperator.Between, greaterThanOrEqualCondition.Values[0], lessThanOrEqualCondition.Values[0]);
                }
                break;
                case 1:
                {
                    SearchCondition condition = conditionList[0];

                    // here we need to convert operators, as AWS SDK's default conversion is buggy
                    QueryOperator queryOperator;
                    if 
                    (
                        (!TryConvertScanOperatorToQueryOperator(condition.Operator, out queryOperator))
                        ||
                        (condition.Values.Length != 1)
                    )
                    {
                        return false;
                    }

                    resultFilter.AddCondition(fieldName, queryOperator, condition.Values[0]);
                }
                break;
                default:
                    throw new InvalidOperationException(string.Format("Too many conditions for field {0}", fieldName));
            }

            // removing the matched condition
            conditions.Remove(fieldName);

            return true;
        }
示例#2
0
        public void AddSearchConditions(SearchCondition condition)
        {
            var cond = SearchConditions.SingleOrDefault(x => x.field == condition.field);

            if (cond != null)
            {
                SearchConditions.Remove(cond);
            }
            SearchConditions.Add(condition);
        }
        public void AddSearchConditions(SearchCondition condition)
        {
            var cond = SearchConditions.SingleOrDefault(x => x.field == condition.field);

            if (cond != null)
            {
                SearchConditions.Remove(cond);
            }
            condition.query = condition.query.Replace("/", @"\/");
            SearchConditions.Add(condition);
        }
示例#4
0
        private static bool TryMatchFieldWithCondition(string fieldName, QueryFilter resultFilter, SearchConditions conditions)
        {
            List <SearchCondition> conditionList;

            if (!conditions.TryGetValue(fieldName, out conditionList))
            {
                return(false);
            }

            switch (conditionList.Count)
            {
            case 2:     // checking for the between operator
            {
                var lessThanOrEqualCondition    = conditionList.SingleOrDefault(c => c.Operator == ScanOperator.LessThanOrEqual);
                var greaterThanOrEqualCondition = conditionList.SingleOrDefault(c => c.Operator == ScanOperator.GreaterThanOrEqual);

                if ((lessThanOrEqualCondition == null) || (greaterThanOrEqualCondition == null))
                {
                    throw new InvalidOperationException("Multiple conditions for the same field are only supported for the BETWEEN case");
                }

                if
                (
                    (lessThanOrEqualCondition.Values.Length != 1)
                    ||
                    (greaterThanOrEqualCondition.Values.Length != 1)
                )
                {
                    return(false);
                }

                resultFilter.AddCondition(fieldName, QueryOperator.Between, greaterThanOrEqualCondition.Values[0], lessThanOrEqualCondition.Values[0]);
            }
            break;

            case 1:
            {
                SearchCondition condition = conditionList[0];

                // here we need to convert operators, as AWS SDK's default conversion is buggy
                QueryOperator queryOperator;
                if
                (
                    (!TryConvertScanOperatorToQueryOperator(condition.Operator, out queryOperator))
                    ||
                    (condition.Values.Length != 1)
                )
                {
                    return(false);
                }

                resultFilter.AddCondition(fieldName, queryOperator, condition.Values[0]);
            }
            break;

            default:
                throw new InvalidOperationException(string.Format("Too many conditions for field {0}", fieldName));
            }

            // removing the matched condition
            conditions.Remove(fieldName);

            return(true);
        }