예제 #1
0
        /// <summary>
        /// Lists the event.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <remarks>
        ///  - Удаляет FilterElement с source (DTStart, DTEnd)в запросе и формирует на основании их предикат
        ///    позволяющий производить выборку по данным критериям из произвольной коллекции
        ///
        /// </remarks>
        /// <returns></returns>
        public static ListResponse ListEvent(CalendarEventListRequest request)
        {
            List <CalendarEventEntity> retVal = new List <CalendarEventEntity>();

            TZID dtStartTZID = String.IsNullOrEmpty(request.DTStartTimeZoneId) ? null : new TZID(request.DTStartTimeZoneId);
            TZID dtEndTZID   = String.IsNullOrEmpty(request.DTEndTimeZoneId) ? null : new TZID(request.DTEndTimeZoneId);

            //Заполняем FIlterElementCollection элементами исходного массива фильтров
            FilterElementCollection filterColl = new FilterElementCollection();

            foreach (FilterElement filterEl in request.Filters)
            {
                filterColl.Add(filterEl);
            }
            AndBlockFilterElementPredicate <DateTime> andBlockDTStartFilterPredicate =
                new AndBlockFilterElementPredicate <DateTime>();
            AndBlockFilterElementPredicate <DateTime> andBlockDTEndFilterPredicate =
                new AndBlockFilterElementPredicate <DateTime>();

            ConstructPredicate(andBlockDTStartFilterPredicate, filterColl, CalendarEventEntity.FieldStart);
            ConstructPredicate(andBlockDTEndFilterPredicate, filterColl, CalendarEventEntity.FieldEnd);

            //Получаем все FilterElement которые связаны с датой и формируем на основе их дерево выражений
            foreach (FilterElement filterEl in FindFilterElementBySource(new string[] { CalendarEventEntity.FieldStart,
                                                                                        CalendarEventEntity.FieldEnd },
                                                                         request.Filters, true))
            {
                //Рекурсивно удаляем найденный filterElement из исходного набора
                DeepRemoveFilter(filterColl, filterEl);
            }
            //добавляем дополнительные критерии
            AddExtraCriteria(filterColl);
            //Получаем список эвентов
            retVal.AddRange(ListEvents(filterColl, request));

            //Применяем критерии отбора по датам начала и завершения взятые из первоначального запроса, и преобразованные
            //для отбора из коллекции EntityObjects
            retVal.RemoveAll(delegate(CalendarEventEntity eventEntity) { return(!andBlockDTStartFilterPredicate.Evaluate(eventEntity.Start)); });
            retVal.RemoveAll(delegate(CalendarEventEntity eventEntity) { return(!andBlockDTEndFilterPredicate.Evaluate(eventEntity.End)); });

            retVal.Sort();

            return(new ListResponse(retVal.ToArray()));
        }
예제 #2
0
        FilterElementPredicate <T> IFactoryMethod <FilterElementPredicate <T> > .Create(object obj)
        {
            FilterElementPredicate <T> retVal = null;
            FilterElement filterEl            = obj as FilterElement;

            if (filterEl != null)
            {
                if (filterEl.Type == FilterElementType.AndBlock)
                {
                    retVal = new AndBlockFilterElementPredicate <T>();
                    foreach (FilterElement childFilterEl in filterEl.ChildElements)
                    {
                        retVal.AppendChildPredicate(childFilterEl);
                    }
                }
                if (filterEl.Type == FilterElementType.OrBlock)
                {
                    retVal = new OrBlockFilterElementPredicate <T>();
                    foreach (FilterElement childFilterEl in filterEl.ChildElements)
                    {
                        retVal.AppendChildPredicate(childFilterEl);
                    }
                }
                else
                {
                    IComparable <T> filterValue = TryConvertFilterValue(filterEl.Value) as IComparable <T>;
                    if (filterValue != null)
                    {
                        Func <T, bool> functor = null;
                        switch (filterEl.Type)
                        {
                        case FilterElementType.Equal:
                            functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) == 0); };
                            break;

                        case FilterElementType.NotEqual:
                            functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) != 0); };
                            break;

                        case FilterElementType.Less:
                            functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) > 0); };
                            break;

                        case FilterElementType.LessOrEqual:
                            functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) >= 0); };
                            break;

                        case FilterElementType.Greater:
                            functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) < 0); };
                            break;

                        case FilterElementType.GreaterOrEqual:
                            functor = delegate(T obj1) { return(filterValue.CompareTo(obj1) <= 0); };
                            break;
                        }
                        if (functor != null)
                        {
                            retVal = new FilterElementPredicate <T>(filterEl, functor);
                        }
                    }
                }
            }

            return(retVal);
        }