internal static QueryDefinitionInfo Convert(QueryDefinition query)
        {
            var result = new QueryDefinitionInfo
            {
                Target     = query.Target,
                Properties = query.Properties.Select(x => new KeyValuePair <AttributeInfo, AttributeInfo>(
                                                         new AttributeInfo
                {
                    Content = Normalize(string.Join(" ", x.Key.Select(w => w.Content)))
                },
                                                         new AttributeInfo
                {
                    Content = Normalize(string.Join(" ", x.Value.Select(w => w.Content))),
                    Type    = x.Value.Type,
                    Hint    = x.Value.Hint,
                }))
                             .ToList()
            };

            return(result);
        }
Exemple #2
0
        public static IEnumerable <Certificate> Find(QueryDefinitionInfo query)
        {
            var result = new List <Certificate>();
            var cache  = new Dictionary <CertificateKind, IDictionary <string, PropertyInfo> >();

            if (query.Target == null)
            {
                return(Enumerable.Empty <Certificate>());
            }

            if (query.Properties.IsEmpty())
            {
                return(_certificates.Where(x => "{0}".ToInvariantFormat(x.Kind).ToLowerInvariant().OrdinalEquals(query.Target.ToLowerInvariant())).ToList());
            }

            foreach (var item in _certificates)
            {
                if ("{0}".ToInvariantFormat(item.Kind).ToLowerInvariant().OrdinalEquals(query.Target.ToLowerInvariant()) == false)
                {
                    continue;
                }

                if (cache.ContainsKey(item.Kind) == false)
                {
                    cache[item.Kind] = item.GetType()
                                       .GetProperties(BindingFlags.Instance | BindingFlags.Public)
                                       .ToDictionary(x => x.Name.ToLowerInvariant(), x => x);
                }

                bool canAdd = true;

                foreach (var attribute in query.Properties)
                {
                    var key1 = attribute.Key.Content.ToLowerInvariant();
                    var key2 = CreateClrProperty(key1).ToLowerInvariant();

                    if (cache[item.Kind].ContainsKey(key1))
                    {
                        if (attribute.Value.Type == null)
                        {
                            var value = cache[item.Kind][key1].GetValue(item);

                            if (value == null || value.Equals(attribute.Value.Content) == false)
                            {
                                canAdd = false;
                                continue;
                            }
                        }

                        if (attribute.Value.Type == typeof(TimeSpan))
                        {
                            var value = cache[item.Kind][key1].GetValue(item);

                            if ((value is DateTime) == false)
                            {
                                canAdd = false;
                            }

                            var dbDate = ((DateTime)value).Date;
                            var qdDate = (DateTime.Now - (TimeSpan)attribute.Value.Hint).Date;

                            if (dbDate != qdDate)
                            {
                                canAdd = false;
                                continue;
                            }
                        }
                    }
                    else if (cache[item.Kind].ContainsKey(key2))
                    {
                        var value = cache[item.Kind][key2].GetValue(item);

                        if (value == null || value.Equals(attribute.Value.Content) == false)
                        {
                            canAdd = false;
                        }
                    }
                }

                if (canAdd)
                {
                    result.Add(item);
                }
            }

            return(result);
        }