public async Task GetRecordsList_ForExistingThemeFilter_ShouldReturnAllMatches() { var context = CreateContext(); Create_30Themes_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20)); var(themeId1, recordsNamesForTheme1, themeId2, recordsNamesForTheme2) = BindRecordsWithThemes(context, ThemesTestDataSet.ThemesOnly); var searchService = GetRecordsSearchService(context); var filter = new RecordsFilter(); filter.AddThemeId(themeId1); var result = await searchService.GetRecordsList(filter); result.Select(r => r.Name).Should().BeEquivalentTo(recordsNamesForTheme1); //----------------------------------------// filter.AddThemeId(themeId2); filter.RemoveThemeId(themeId1); result = await searchService.GetRecordsList(filter); result.Select(r => r.Name).Should().BeEquivalentTo(recordsNamesForTheme2); //----------------------------------------// filter.AddThemeId(themeId1); result = await searchService.GetRecordsList(filter); result.Select(r => r.Name).Should().BeEquivalentTo(recordsNamesForTheme2.Intersect(recordsNamesForTheme1)); }
public async Task GetRecordsList_ForDateAndTheme_ShouldReturnOnlyMatchedRecords() { var context = CreateContext(); Create_30Themes_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20)); var(themeId1, recordsNamesForTheme1, themeId2, recordsNamesForTheme2) = BindRecordsWithThemes(context, ThemesTestDataSet.DatesAndThemesRec); var searchService = GetRecordsSearchService(context); var dateFrom = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-10)); var dateTo = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-5)); var filter = new RecordsFilter { FromDate = dateFrom, ToDate = dateTo }; filter.AddThemeId(themeId1); var list = context.Records.Where(r => r.Date >= dateFrom && r.Date <= dateTo); var result = await searchService.GetRecordsList(filter); result.Should().OnlyContain(rec => rec.Date >= dateFrom && rec.Date <= dateTo); result.Select(r => r.Name).Should().BeEquivalentTo(new string[] { "05", "07", "09", "10" }); //-------------------------------------------------// filter.AddThemeId(themeId2); filter.RemoveThemeId(themeId1); result = await searchService.GetRecordsList(filter); result.Select(r => r.Name).Should().BeEquivalentTo(new string[] { "05" }); }
public async Task GetRecordsCount_WithWhiteSpaceInNameFilter_ShouldReturnAllRecordsCount() { var context = CreateContext(); Create_20Records(context, GetNumberList(20), GetDatesList(20)); var svc = GetRecordsSearchService(context); var filterWithWhiteSpace = new RecordsFilter { FilterName = " " }; var filterWithNull = new RecordsFilter { FilterName = null }; var filterWithRmRf = new RecordsFilter { FilterName = "\r\r\n\r\n \r \n\n " }; int recCount1 = await svc.GetRecordsCount(filterWithWhiteSpace); int recCount2 = await svc.GetRecordsCount(filterWithNull); int recCount3 = await svc.GetRecordsCount(filterWithRmRf); recCount1.Should().Be(context.Records.Count()); recCount2.Should().Be(context.Records.Count()); recCount3.Should().Be(context.Records.Count()); }
public async Task <List <DiaryRecord> > GetRecordsList(RecordsFilter filter) { if (filter == null) { throw new ArgumentNullException(nameof(filter)); } var recordsPage = await FetchRecordsListFilteredQuery(filter) .OrderByDescending(r => r.Date) .Skip(filter.PageNo * filter.PageSize) .Take(filter.PageSize) .ToListAsync() .ConfigureAwait(false); var placeholder = _appSettingsService.GetHostAndPortPlaceholder(); var currentHostAndPort = await _appSettingsService.GetHostAndPort(); foreach (var rec in recordsPage) { rec.Text = rec.Text?.Replace(placeholder, currentHostAndPort, StringComparison.OrdinalIgnoreCase) ?? ""; rec.Name = rec.Name?.Replace(placeholder, currentHostAndPort, StringComparison.OrdinalIgnoreCase) ?? ""; foreach (var cog in rec.Cogitations) { cog.Text = cog.Text?.Replace(placeholder, currentHostAndPort, StringComparison.OrdinalIgnoreCase) ?? ""; } } return(recordsPage); }
public async Task OnGetAsync( DateTime?fromDate, DateTime?toDate, Guid[] themes, string?filterName, bool?combineThemes, int?pageNo) { CombineThemes = combineThemes ?? false; Filters = new RecordsFilter { PageSize = _pageSize, FromDate = fromDate == null ? null : DateOnly.FromDateTime(fromDate.Value), ToDate = toDate == null ? null : DateOnly.FromDateTime(toDate.Value), FilterName = filterName?.Trim(), PageNo = (pageNo ?? 1) - 1, CombineThemes = CombineThemes }; if (themes != null && themes.Length > 0) { Filters.AddThemeId(themes); SelectedThemes = themes; } var recordsCount = await _searchRecordsService.GetRecordsCount(Filters); Pages = PagesInfo.GetPagesInfo(recordsCount, Filters.PageNo + 1, _pageSize, 10); Records = await _searchRecordsService.GetRecordsList(Filters); AllScopes = await _scopesSvc.GetScopes(); }
public async Task GetRecordsCount_ForExistingThemeFilter_And_COmbineThemesTrue_ShouldReturnAllMatchesCount() { var context = CreateContext(); Create_30Themes_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20)); var(themeId1, recordsNamesForTheme1, themeId2, recordsNamesForTheme2) = BindRecordsWithThemes(context, ThemesTestDataSet.ThemesOnly); var searchService = GetRecordsSearchService(context); var filter = new RecordsFilter { CombineThemes = true }; filter.AddThemeId(themeId1); var result = await searchService.GetRecordsCount(filter); result.Should().Be(recordsNamesForTheme1.Count); //----------------------------------------// filter.AddThemeId(themeId2); filter.RemoveThemeId(themeId1); result = await searchService.GetRecordsCount(filter); result.Should().Be(recordsNamesForTheme2.Count); //----------------------------------------// filter.AddThemeId(themeId1); result = await searchService.GetRecordsCount(filter); result.Should().Be(recordsNamesForTheme2.Union(recordsNamesForTheme1).Count()); }
public async Task <int> GetRecordsCount(RecordsFilter filter) { if (filter == null) { throw new ArgumentNullException(nameof(filter)); } return(await FetchRecordsListFilteredQuery(filter).CountAsync().ConfigureAwait(false)); }
public async Task <ActionResult <RecordsPageDto> > GetRecordsList( [FromQuery] DateTime?from, [FromQuery] DateTime?to, [FromQuery] string?name, [FromQuery] bool?combinedThemes, [FromQuery] Guid[]?themeId, [FromQuery] int?pageSize, [FromQuery] int?pageNo) { try { pageSize ??= 20; pageSize = pageSize > 100 ? 100 : pageSize; pageNo ??= 0; var filters = new RecordsFilter { CombineThemes = combinedThemes ?? false, PageSize = pageSize.Value, PageNo = pageNo.Value, FromDate = from.HasValue ? DateOnly.FromDateTime(from.Value) : null, ToDate = to.HasValue ? DateOnly.FromDateTime(to.Value) : null, FilterName = name }; if (themeId != null && themeId.Length > 0) { filters.AddThemeId(themeId); } var records = await _recordsSearchService.GetRecordsList(filters); int allCount = await _recordsSearchService.GetRecordsCount(filters); var pagesInfo = PagesInfo.GetPagesInfo(allCount, pageNo.Value, pageSize.Value); var dto = new RecordsPageDto { PagesInfo = pagesInfo, Records = records.Select(r => new RecordListItemDto { Date = r.Date, CreatedDate = r.CreateDate, ModifiedDate = r.ModifyDate, DisplayedName = r.GetRecordNameDisplay(), DisplayedText = r.GetRecordTextShort(), RecordId = r.Id }).ToList() }; return(Ok(dto)); } catch (ArgumentException exc) { return(BadRequest(exc.Message)); } }
public RecordsComparer(Func <TRecord, TKey> recordKeySelector, Func <TRecord, bool> filter = null) { this.RecordKeySelector = recordKeySelector; if (filter != null) { _filter = new RecordsFilter(filter); } else { _filter = new NoFilter(); } }
public async Task GetRecordsCount_WithNotExistingThemeId_ShouldReturn0() { var context = CreateContext(); Create_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20)); var searchService = GetRecordsSearchService(context); var filter = new RecordsFilter(); filter.AddThemeId(Guid.NewGuid()); int count = await searchService.GetRecordsCount(filter); count.Should().Be(0); }
public async Task CheckEntityFrameworkQuert() { var context = CreateContext(); Create_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20)); var filter = new RecordsFilter(); filter.AddThemeId(Guid.NewGuid()); IQueryable <DiaryRecord> result; List <DiaryRecord>? r = null; if (!filter.IsEmptyTypeFilter) { var temp = context.RecordThemes .Where(rt => filter.Themes.Contains(rt.ThemeId)) .Select(r => new { r.RecordId, r.ThemeId }) .ToList() .GroupBy(r => r.RecordId) .Where(g => filter.Themes.All(id => g.Select(r => r.ThemeId).Contains(id))) .Select(g => g.Key); result = context.Records.Where(r => temp.Contains(r.Id)); } else { result = context.Records.AsQueryable(); } if (!RecordsFilter.IsEmpty(filter)) { if (!string.IsNullOrWhiteSpace(filter.FilterName)) { result = result.Where(r => r.Name.Contains(filter.FilterName, StringComparison.OrdinalIgnoreCase)); } if (filter.FromDate != null) { result = result.Where(r => r.Date >= filter.FromDate); } if (filter.ToDate != null) { result = result.Where(r => r.Date <= filter.ToDate); } } var list = r ?? await result.ToListAsync(); Assert.IsEmpty(list); }
public async Task GetRecordsList_ByDate_ForLastWeek_ShouldReturn6Records() { var context = CreateContext(); Create_20Records(context, GetNumberList(20), GetDatesList(20)); var svc = GetRecordsSearchService(context); var dateFrom = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-7)); var filters = new RecordsFilter { FromDate = dateFrom }; var resList = await svc.GetRecordsList(filters); resList.Should().OnlyContain(r => r.Date >= dateFrom); }
public async Task GetRecordsList_WithNotExistingThemeId_And_CombineThemesTrue_ShouldReturnEmptyList() { var context = CreateContext(); Create_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20)); var searchService = GetRecordsSearchService(context); var filter = new RecordsFilter(); filter.AddThemeId(Guid.NewGuid()); filter.CombineThemes = true; var list = await searchService.GetRecordsList(filter); list.Should().BeEmpty(); }
public async Task GetRecordsCount_ByDate_ForConcreteDate_ShouldReturn2() { var context = CreateContext(); Create_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20)); var svc = GetRecordsSearchService(context); var concreteDate = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-7)); int testCount = 2; var filters = new RecordsFilter { FromDate = concreteDate, ToDate = concreteDate }; int count = await svc.GetRecordsCount(filters); count.Should().Be(testCount); }
public async Task GetRecordsList_ByDate_ForConcreteDate_ShouldReturnWeekAgoRecords() { var context = CreateContext(); Create_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20)); var svc = GetRecordsSearchService(context); var concreteDate = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-7)); var filters = new RecordsFilter { FromDate = concreteDate, ToDate = concreteDate }; var resList = await svc.GetRecordsList(filters); resList.Should().NotBeEmpty(); resList.Should().OnlyContain(rec => rec.Date.Year == concreteDate.Year && rec.Date.Day == concreteDate.Day); }
public async Task GetRecordsCount_ByDate_ForLastWeek_ShouldReturn7() { var context = CreateContext(); Create_20Records(context, GetNumberList(20), GetDatesList(20)); var svc = GetRecordsSearchService(context); var dateFrom = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-6)); int testCount = 6; // all records for last week, except today var filters = new RecordsFilter { FromDate = dateFrom }; int count = await svc.GetRecordsCount(filters); count.Should().Be(testCount); }
public async Task GetRecordsCount_WithNameFilter_ShouldReturnAllMathchesCount() { string searchName = "SearchТекстІї*01"; const int matches = 4; var context = CreateContext(); Create_20Records(context, GetNamesList(), GetDatesList(20)); var svc = GetRecordsSearchService(context); var filters = new RecordsFilter { FilterName = searchName }; int matchesFound = await svc.GetRecordsCount(filters); matchesFound.Should().Be(matches); }
public void Filter_SetDateFromAndDateToProperties_TheSameDate_ShouldSet() { var date = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-7)); var filter = new RecordsFilter { FromDate = date, ToDate = date }; Assert.AreEqual(filter.FromDate, date); Assert.AreEqual(filter.ToDate, date); Assert.AreEqual(filter.ToDate, filter.FromDate); filter.FromDate = null; filter.ToDate = null; Assert.IsNull(filter.FromDate); Assert.IsNull(filter.ToDate); }
public async Task GetRecordsCount_ByDate_ForBeforeLastWeek_ShouldReturn13() { var context = CreateContext(); Create_20Records(context, GetNumberList(20), GetDatesList(20)); var svc = GetRecordsSearchService(context); var dateTo = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-7)); int testCount = 20 - 6; // 20 days except last week (Today date is not added) var filters = new RecordsFilter { ToDate = dateTo }; int count = await svc.GetRecordsCount(filters); count.Should().Be(testCount); }
public async Task GetRecordsCount_ForNameAndTheme_ShouldReturnOnlyMatchedRecordsCount() { var context = CreateContext(); var(themeId1, _, _) = await CreateRecordsWithNamesAndThemes(context); var searchService = GetRecordsSearchService(context); string searchName = "SearchТекстІї*01"; var filter = new RecordsFilter { FilterName = searchName }; filter.AddThemeId(themeId1); int count = await searchService.GetRecordsCount(filter); count.Should().Be(2); }
public async Task GetRecordsCount_ForDateAndTheme_ShouldReturnOnlyMatchedRecordsCount() { var context = CreateContext(); Create_30Themes_20Records(context, GetNumberList(20), GetDatesListWithTwoSameDatesWeekAgo(20)); var(themeId1, _, _, _) = BindRecordsWithThemes(context, ThemesTestDataSet.DatesAndThemesCount); var searchService = GetRecordsSearchService(context); var dateFrom = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-10)); var dateTo = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-5)); var filter = new RecordsFilter { FromDate = dateFrom, ToDate = dateTo }; filter.AddThemeId(themeId1); int count = await searchService.GetRecordsCount(filter); count.Should().Be(3); }
public async Task GetRecordsList_WithWhiteSpaceInNameFilter_ShouldReturnAllPageRecords() { var context = CreateContext(); Create_20Records(context, GetNumberList(20), GetDatesList(20)); var svc = GetRecordsSearchService(context); var filterWithWhiteSpace = new RecordsFilter { FilterName = " " }; var filterWithNull = new RecordsFilter { FilterName = null }; var filterWithRmRf = new RecordsFilter { FilterName = "\r\r\n\r\n \r \n\n " }; var pageList1 = await svc.GetRecordsList(filterWithWhiteSpace); var pageList2 = await svc.GetRecordsList(filterWithNull); var pageList3 = await svc.GetRecordsList(filterWithRmRf); pageList1.Should().HaveCount(context.Records.Count()); pageList1.Should().BeEquivalentTo( context.Records.ToList(), options => options .Including(r => r.Id) .Including(r => r.Name)); pageList2.Should().HaveCount(context.Records.Count()); pageList2.Should().BeEquivalentTo( context.Records.ToList(), options => options .Including(r => r.Id) .Including(r => r.Name)); pageList3.Should().HaveCount(context.Records.Count()); pageList3.Should().BeEquivalentTo( context.Records.ToList(), options => options .Including(r => r.Id) .Including(r => r.Name)); }
public async Task GetRecordsList_WithNameFilter_ShouldReturnAllMatches() { string searchName = "SearchТекстІї*01"; const int matches = 4; var context = CreateContext(); Create_20Records(context, GetNamesList(), GetDatesList(20)); var svc = GetRecordsSearchService(context); var filters = new RecordsFilter { FilterName = searchName }; var resPage = await svc.GetRecordsList(filters); resPage.Should().HaveCount(matches); resPage.Should().SatisfyRespectively( first => first.Name.Should().Be("893472983 SearchТекстІї*01"), second => second.Name.Should().Be("* /*SearchтекстІї*01/*"), third => third.Name.Should().Be("_SearchТекстІї*011АРРОПРОлрффлвыа"), fourth => fourth.Name.Should().Be("№%№SearCHТекстІї*01%№!::!;%№:%; ")); }
public async Task GetRecordsCount_ByDateAndName_ShouldReturn2() { string searchName = "SearchТекстІї*01"; const int matchesInRange = 2; var dateFrom = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-14)); var dateTo = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-9)); var context = CreateContext(); Create_20Records(context, GetNamesList(), GetDatesList(20)); var searchService = GetRecordsSearchService(context); var filters = new RecordsFilter { FilterName = searchName, FromDate = dateFrom, ToDate = dateTo }; int count = await searchService.GetRecordsCount(filters); count.Should().Be(matchesInRange); }
public async Task GetRecordsList_ForNameAndTheme_ShouldReturnOnlyMatchedRecords() { var context = CreateContext(); var(themeId1, themeId2, names) = await CreateRecordsWithNamesAndThemes(context); var searchService = GetRecordsSearchService(context); string searchName = "SearchТекстІї*01"; var filter = new RecordsFilter { FilterName = searchName }; filter.AddThemeId(themeId1); var result = await searchService.GetRecordsList(filter); result.Should().NotBeEmpty(); result.Should().SatisfyRespectively( first => first.Name.Should().Be("56SearchТекстІї*01"), second => second.Name.Should().Be("_SearchТекстІї*011АРРОПРОлрффлвыа")); }
public async Task GetRecordsList_ByDateAndName_ShouldReturn2Records() { string searchName = "SearchТекстІї*01"; var dateFrom = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-14)); var dateTo = DateOnly.FromDateTime(DateTime.UtcNow.AddDays(-9)); var context = CreateContext(); Create_20Records(context, GetNamesList(), GetDatesList(20)); var svc = GetRecordsSearchService(context); var filters = new RecordsFilter { FilterName = searchName, FromDate = dateFrom, ToDate = dateTo }; var resList = await svc.GetRecordsList(filters); resList.Should().OnlyContain(rec => rec.Name.IndexOf(searchName, StringComparison.InvariantCultureIgnoreCase) != -1 && rec.Date >= dateFrom && rec.Date <= dateTo); }
protected IQueryable <DiaryRecord> FetchRecordsListFilteredQuery(RecordsFilter filter) { var result = _context.Records .AsNoTracking() .Include(r => r.Cogitations) .Include(r => r.ThemesRefs) .ThenInclude(rt => rt.Theme) .Include(r => r.ImagesRefs.OrderBy(x => x.Order)) .ThenInclude(ri => ri.Image) .AsQueryable(); if (!filter.IsEmptyTypeFilter) { IEnumerable <Guid> preliminaryRecordsList; if (filter.CombineThemes) { preliminaryRecordsList = _context.RecordThemes .AsNoTracking() .Where(rt => filter.Themes.Contains(rt.ThemeId)) .Select(rt => rt.RecordId) .Distinct(); } else { preliminaryRecordsList = _context.RecordThemes .AsNoTracking() .Where(rt => filter.Themes.Contains(rt.ThemeId)) .Select(r => new { r.RecordId, r.ThemeId }) .ToList() .GroupBy(r => r.RecordId) .Where(g => filter.Themes.All(id => g.Select(r => r.ThemeId).Contains(id))) .Select(g => g.Key); } result = result.Where(r => preliminaryRecordsList.Contains(r.Id)); } if (!RecordsFilter.IsEmpty(filter)) { if (!string.IsNullOrWhiteSpace(filter.FilterName)) { IEnumerable <Guid> recordsWithMatchedNames = _context.Records .AsNoTracking() .Select(r => new { r.Id, r.Name }) .ToList() .Where(r => r.Name.ToUpper().Contains(filter.FilterName.ToUpper())) .Select(r => r.Id); result = result.Where(r => recordsWithMatchedNames.Contains(r.Id)); } if (filter.FromDate != null) { result = result.Where(r => r.Date >= filter.FromDate); } if (filter.ToDate != null) { result = result.Where(r => r.Date <= filter.ToDate); } } return(result); }
public async Task <ActionResult <RecordsDetailPageDto> > GetRecordsListExpanded( [FromQuery] DateTime?from, [FromQuery] DateTime?to, [FromQuery] string?name, [FromQuery] bool?combinedThemes, [FromQuery] Guid[]?themeId, [FromQuery] int?pageSize, [FromQuery] int?pageNo) { try { pageSize ??= 20; pageSize = pageSize > 100 ? 100 : pageSize; pageNo ??= 0; var filters = new RecordsFilter { CombineThemes = combinedThemes ?? false, PageSize = pageSize.Value, PageNo = pageNo.Value, FromDate = from.HasValue ? DateOnly.FromDateTime(from.Value) : null, ToDate = to.HasValue ? DateOnly.FromDateTime(to.Value) : null, FilterName = name }; if (themeId != null && themeId.Length > 0) { filters.AddThemeId(themeId); } var records = await _recordsSearchService.GetRecordsList(filters); int allCount = await _recordsSearchService.GetRecordsCount(filters); var pagesInfo = PagesInfo.GetPagesInfo(allCount, pageNo.Value, pageSize.Value); var dto = new RecordsDetailPageDto { PagesInfo = pagesInfo, Records = records.Select(record => new RecordDto { Id = record.Id, Date = record.Date, CreatedDate = record.CreateDate, ModifiedDate = record.ModifyDate, Name = record.Name, Text = record.Text, Cogitations = record.Cogitations .Select(c => new CogitationDto { Id = c.Id, CreateDate = c.Date, Text = c.Text }) .ToArray(), Themes = record.ThemesRefs .Select(rt => rt.Theme) .Select(t => new ThemeDto { ThemeId = t !.Id, ThemeName = t.ThemeName, Actual = t.Actual }) .ToArray(), Images = record.ImagesRefs .Select(ri => ri.Image) .Select(i => new ImageListItemDto { Id = i !.Id, Name = i.Name, Width = i.Width, Height = i.Height, SizeKb = i.GetSizeKbString(), Base64Thumbnail = i.GetBase64Thumbnail() })