protected void AddDateSearch( Func <TokenBase, bool> tokenFilter, Func <DatesRangeLimits, ISearchTerm> toObjectSearchTerm, Func <DatesRangeLimits, ISearchTerm> toFileSearchTerm, ISearchExpression expression, IQueryBuilder attributesQueryBuilder, IQueryBuilder filesQueryBuilder) { var dateRangeTokens = expression.Tokens.OfType <TokenBase>().Where(x => tokenFilter(x)).ToList(); var dateRangeGroups = dateRangeTokens.GroupBy(x => x.Context[RangeToken.RangeGroupKey].Value).Where(g => g.Key != null); var dateRanges = new List <DatesRangeLimits>(); foreach (var group in dateRangeGroups) { var dateTextPresetToken = (DateTextArgumentToken)group.FirstOrDefault(x => x is DateTextArgumentToken); if (dateTextPresetToken != null) { var presetRange = DatesRangeLimits.GetRangeLimits(dateTextPresetToken); dateRanges.Add(presetRange); continue; } var groupTail = group.Last(); var from = groupTail.Context[RangeToken.FromValueKey].Value; var to = groupTail.Context[RangeToken.ToValueKey].Value; if (from == null || to == null) { continue; } var range = new DatesRangeLimits((DateTime)from, (DateTime)to); if (groupTail.Context[RangeToken.RangeKindKey].Value is DateAttributeGreaterToken) { range = DatesRangeLimits.GreaterThanRange(range); } if (groupTail.Context[RangeToken.RangeKindKey].Value is DateAttributeLessToken) { range = DatesRangeLimits.LessThanRange(range); } dateRanges.Add(range); } if (!dateRanges.Any()) { return; } var context = dateRangeTokens.First().Context; attributesQueryBuilder?.AddAnyOf(dateRanges.Select(toObjectSearchTerm).ToArray(), context.GetTermOccur()); filesQueryBuilder?.AddAnyOf(dateRanges.Select(toFileSearchTerm).ToArray(), context.GetTermOccur()); }
public virtual IEnumerable <IPresetItem> GetPresetItems(IToken target) { var today = DateTime.Today; var weekStart = DatesRangeLimits.GetStartOfTheWeek(today); if (target is DateTextArgumentToken) { return new List <IPresetItem> { new PresetItem(DateTextArgumentToken.Today, "today", today.ToString(DateRangeToken.FullDateStringFormat)), new PresetItem(DateTextArgumentToken.Yesterday, "yesterday", today.AddDays(-1).ToString(DateRangeToken.FullDateStringFormat)), new PresetItem(DateTextArgumentToken.ThisWeek, "this week", $"{weekStart.ToString(DateRangeToken.FullDateStringFormat)}{SearchTokenAliases.DateRangeTokenAlias}{weekStart.AddDays(7).ToString(DateRangeToken.FullDateStringFormat)}"), new PresetItem(DateTextArgumentToken.LastWeek, "last week", $"{weekStart.AddDays(-14).ToString(DateRangeToken.FullDateStringFormat)}{SearchTokenAliases.DateRangeTokenAlias}{weekStart.AddDays(-7).ToString(DateRangeToken.FullDateStringFormat)}"), new PresetItem(DateTextArgumentToken.ThisMonth, "this month", today.ToString(DateRangeToken.ShortDateStringFormat)), new PresetItem(DateTextArgumentToken.LastMonth, "last month", today.AddMonths(-1).ToString(DateRangeToken.ShortDateStringFormat)), new PresetItem(DateTextArgumentToken.ThisYear, "this year", today.ToString("yyyy")), new PresetItem(DateTextArgumentToken.LastYear, "last year", today.AddYears(-1).ToString("yyyy")) } } ; if (target is YearToken) { var targetIsEmpty = string.IsNullOrEmpty(((YearToken)target).Value); var year = DateTime.Today.Year; var years = new List <IPresetItem> { new PresetItem(year.ToString(), year.ToString(), targetIsEmpty && !((YearToken)target).GetIsTopSubgroup() ? "specify custom date or range" : "specify a year") }; if (targetIsEmpty) { return(years); } for (var delta = 1; delta < 16; delta++) { var prevYear = (year - delta).ToString(); years.Add(new PresetItem(prevYear, prevYear)); } return(years); } if (target is MonthToken) { var months = new List <IPresetItem>(); for (var month = 0; month < 12; month++) { var monthString = (month + 1).ToString("D2"); months.Add(new PresetItem(monthString, monthString)); } return(months); } if (target is DayToken) { var days = new List <IPresetItem>(); for (var day = 0; day < 31; day++) { var monthString = (day + 1).ToString("D2"); days.Add(new PresetItem(monthString, monthString)); } return(days); } if (target is NumberAttributeValueToken) { return new List <IPresetItem> { new PresetItem(string.Empty, string.Empty, "enter numeric value or range"), } } ; if (target is OrgUnitAttributeValueToken) { return(GetOrgUnitAttributePresetItems()); } return(new List <IPresetItem>()); }