Exemplo n.º 1
0
        /// <summary>
        /// Compiles the filter.
        /// </summary>
        /// <remarks>
        /// <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa746475(v=vs.85).aspx">Search
        /// Filter Syntax</a>
        /// </remarks>
        /// <returns>
        /// The filter.
        /// </returns>
        /// <param name='filter'>
        /// Filter.
        /// </param>
        string CompileFilter(Filter filter)
        {
            if (filter == null)
            {
                return(string.Empty);
            }

            if (filter is AndFilter)
            {
                return("(&" + string.Join(string.Empty, ((AndFilter)filter).Filters.Select(CompileFilter)) + ")");
            }
            else if (filter is OrFilter)
            {
                return("(|" + string.Join(string.Empty, ((OrFilter)filter).Filters.Select(CompileFilter)) + ")");
            }
            else if (filter is NotFilter)
            {
                return("(!" + CompileFilter(((NotFilter)filter).InnerFilter) + ")");
            }
            else if (filter is EqualsFilter)
            {
                var f     = (EqualsFilter)filter;
                var attrs = GetAttributeTypes(f.PropertyName);
                var q     = attrs.Select(a => "(" + a + "=" + f.Value + ")");

                if (attrs.Length == 1)
                {
                    return(q.First());
                }
                else
                {
                    return("(|" + string.Join("", q) + ")");
                }
            }
            else if (filter is ContainsFilter)
            {
                var f     = (ContainsFilter)filter;
                var attrs = GetAttributeTypes(f.PropertyName);
                var q     = attrs.Select(a => "(" + a + "=*" + f.Value + "*)");

                if (attrs.Length == 1)
                {
                    return(q.First());
                }
                else
                {
                    return("(|" + string.Join("", q) + ")");
                }
            }
            else
            {
                throw new NotSupportedException(filter.GetType().Name);
            }
        }
Exemplo n.º 2
0
        IEnumerable <Person> Search(Filter filter)
        {
            if (filter is OrFilter)
            {
                var f = (OrFilter)filter;
                var r = Enumerable.Empty <Person> ();

                foreach (var sf in f.Filters)
                {
                    r = r.Concat(Search(sf));
                }

                return(r.Distinct());
            }
            else if (filter is AndFilter)
            {
                throw new NotImplementedException();
            }
            else if (filter is NotFilter)
            {
                throw new NotImplementedException();
            }
            else if (filter is EqualsFilter)
            {
                var f     = (EqualsFilter)filter;
                var upper = f.Value.ToUpperInvariant();
                var prop  = properties [f.PropertyName];
                var q     = from p in people
                            let v = prop.GetValue(p, null)
                                    where v != null && v.ToString().ToUpperInvariant() == upper
                                    select p;
                return(q);
            }
            else if (filter is ContainsFilter)
            {
                var f    = (ContainsFilter)filter;
                var re   = new Regex(Regex.Escape(f.Value).Replace("\\ ", "|"), RegexOptions.IgnoreCase);
                var prop = properties [f.PropertyName];
                var q    = from p in people
                           let v = prop.GetValue(p, null)
                                   where v != null && re.IsMatch(v.ToString())
                                   select p;
                return(q);
            }
            else
            {
                throw new NotSupportedException("Unsupported filter type: " + filter.GetType());
            }
        }
        IEnumerable<Person> Search(Filter filter)
        {
            if (filter is OrFilter) {
                var f = (OrFilter)filter;
                var r = Enumerable.Empty<Person> ();

                foreach (var sf in f.Filters)
                    r = r.Concat (Search (sf));

                return r.Distinct ();
            } else if (filter is AndFilter) {
                throw new NotImplementedException ();
            } else if (filter is NotFilter) {
                throw new NotImplementedException ();
            } else if (filter is EqualsFilter) {
                var f = (EqualsFilter)filter;
                var upper = f.Value.ToUpperInvariant ();
                var prop = properties [f.PropertyName];
                var q = from p in people
                        let v = prop.GetValue (p, null)
                        where v != null && v.ToString ().ToUpperInvariant () == upper
                        select p;
                return q;
            } else if (filter is ContainsFilter) {
                var f = (ContainsFilter)filter;
                var re = new Regex (Regex.Escape (f.Value).Replace ("\\ ", "|"), RegexOptions.IgnoreCase);
                var prop = properties [f.PropertyName];
                var q = from p in people
                        let v = prop.GetValue (p, null)
                        where v != null && re.IsMatch (v.ToString ())
                        select p;
                return q;
            } else {
                throw new NotSupportedException ("Unsupported filter type: " + filter.GetType ());
            }
        }
		/// <summary>
		/// Compiles the filter.
		/// </summary>
		/// <remarks>
		/// <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa746475(v=vs.85).aspx">Search
		/// Filter Syntax</a>
		/// </remarks>
		/// <returns>
		/// The filter.
		/// </returns>
		/// <param name='filter'>
		/// Filter.
		/// </param>
		string CompileFilter (Filter filter)
		{
			if (filter == null)
				return string.Empty;

			if (filter is AndFilter) {
				return "(&" + string.Join (string.Empty, ((AndFilter)filter).Filters.Select (CompileFilter)) + ")";
			} else if (filter is OrFilter) {
				return "(|" + string.Join (string.Empty, ((OrFilter)filter).Filters.Select (CompileFilter)) + ")";
			} else if (filter is NotFilter) {
				return "(!" + CompileFilter (((NotFilter)filter).InnerFilter) + ")";
			} else if (filter is EqualsFilter) {
				var f = (EqualsFilter)filter;
				var attrs = GetAttributeTypes (f.PropertyName);
				var q = attrs.Select (a => "(" + a + "=" + f.Value + ")");

				if (attrs.Length == 1)
					return q.First ();
				else
					return "(|" + string.Join ("", q) + ")";

			} else if (filter is ContainsFilter) {
				var f = (ContainsFilter)filter;
				var attrs = GetAttributeTypes (f.PropertyName);
				var q = attrs.Select (a => "(" + a + "=*" + f.Value + "*)");

				if (attrs.Length == 1)
					return q.First ();
				else
					return "(|" + string.Join ("", q) + ")";
			
			} else {
				throw new NotSupportedException (filter.GetType ().Name);
			}
		}