private static void ValidateExistsOperator(FilterTerm.Operator op)
 {
     if (op != FilterTerm.Operator.Exists && op != FilterTerm.Operator.NotExists)
     {
         throw new InvalidOperationException(string.Format("You can only apply {0} or {1} operators to numbers having no value", FilterTerm.Operator.Exists, FilterTerm.Operator.NotExists));
     }
 }
        /// <summary>
        /// Adds comparison term. Only specified Operators supported:
        /// <ul>
        /// <li>GreaterThan</li>
        /// <li>GreaterThanOrEqual</li>
        /// <li>LessThan</li>
        /// <li>LessThanOrEqual</li>
        /// <li>Equal</li>
        /// </ul>
        /// </summary>
        /// <param name="op">Operator to apply.</param>
        /// <param name="date">Value to compare with.</param>
        public override void AddTerm(FilterTerm.Operator op, DateTime date)
        {
            DateTime roundedDate = new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second);

            switch (op)
            {
            case FilterTerm.Operator.GreaterThan:
                base.AddTerm(FilterTerm.Operator.GreaterThanOrEqual, roundedDate.AddSeconds(1));
                break;

            case FilterTerm.Operator.GreaterThanOrEqual:
                base.AddTerm(FilterTerm.Operator.GreaterThanOrEqual, roundedDate);
                break;

            case FilterTerm.Operator.LessThan:
                base.AddTerm(FilterTerm.Operator.LessThan, roundedDate);
                break;

            case FilterTerm.Operator.LessThanOrEqual:
                base.AddTerm(FilterTerm.Operator.LessThan, roundedDate.AddSeconds(1));
                break;

            case FilterTerm.Operator.Equal:
                base.AddTerm(FilterTerm.Operator.GreaterThanOrEqual, roundedDate);
                base.AddTerm(FilterTerm.Operator.LessThan, roundedDate.AddSeconds(1));
                break;

            default:
                throw new NotSupportedException("This operation is not supported: " + op);
            }
        }
        /// <summary>
        /// Add new filtering term. Supplied terms are AND'ed.
        /// </summary>
        /// <param name="op">Filtering operator. In case of null value it can only be either Exists or NotExists.</param>
        /// <param name="value">Value to compare with.</param>
        public void AddTerm(FilterTerm.Operator op, double?value = null)
        {
            if (value.HasValue)
            {
                searcher.AddTerm(op, value.Value);
                return;
            }

            ValidateExistsOperator(op);
            existsOperator = op;
        }
        public void Comparison <T>(string name, FilterTerm.Operator @operator, T value)
        {
            var term = Root.Term(Resolve(name));

            switch (@operator)
            {
            case FilterTerm.Operator.Exists:
                term.Exists();
                break;

            case FilterTerm.Operator.NotExists:
                term.NotExists();
                break;

            default:
                term.Operate(@operator, value);
                break;
            }
        }
Пример #5
0
        /// <summary>
        /// Add new filtering term.
        /// </summary>
        /// <param name="op">Filtering operator.</param>
        /// <param name="value">Value to compare with.</param>
        public virtual void AddTerm(FilterTerm.Operator op, T value)
        {
            T   old;
            var operatorNotExists = !terms.TryGetValue(op, out old);

            switch (op)
            {
            case FilterTerm.Operator.Exists:
                if (terms.ContainsKey(FilterTerm.Operator.NotExists))
                {
                    throw new InvalidOperationException("Cannot contain both " + op + " and " + FilterTerm.Operator.NotExists + " terms.");
                }

                if (operatorNotExists)
                {
                    terms.Add(op, value);
                }

                break;

            case FilterTerm.Operator.NotExists:
                if (terms.ContainsKey(FilterTerm.Operator.Exists))
                {
                    throw new InvalidOperationException("Cannot contain both " + op + " and " + FilterTerm.Operator.Exists + " terms.");
                }

                if (operatorNotExists)
                {
                    terms.Add(op, value);
                }

                break;

            case FilterTerm.Operator.Equal:
            case FilterTerm.Operator.NotEqual:
                if (operatorNotExists)
                {
                    terms.Add(op, value);
                }
                else
                {
                    throw new InvalidOperationException("Cannot contain more than one " + op + " term.");
                }

                break;

            case FilterTerm.Operator.GreaterThan:
            case FilterTerm.Operator.GreaterThanOrEqual:
                if (operatorNotExists)
                {
                    terms.Add(op, value);
                }
                else if (old.CompareTo(value) < 0)
                {
                    // new > old
                    terms[op] = value;
                }

                break;

            case FilterTerm.Operator.LessThan:
            case FilterTerm.Operator.LessThanOrEqual:
                if (operatorNotExists)
                {
                    terms.Add(op, value);
                }
                else if (old.CompareTo(value) > 0)
                {
                    // new < old
                    terms[op] = value;
                }
                break;
            }
        }
 /// <summary>
 /// Clear internal term collection.
 /// </summary>
 public void Clear()
 {
     searcher.Terms.Clear();
     existsOperator = FilterTerm.Operator.None;
 }
Пример #7
0
 public static Tuple <string, object, FilterTerm.Operator> Get(string field,
                                                               object value, FilterTerm.Operator oper = FilterTerm.Operator.Equal)
 {
     return(new Tuple <string, object, FilterTerm.Operator>(field, value, oper));
 }