private async Task <string> GetMembers(string index, int page, FieldModel field) { return((await _cache.GetOrCreateAsync(index + field.UniqueName, async(cacheEntry) => { cacheEntry.SetSize(1); JsonSerializerOptions options = new JsonSerializerOptions { Converters = { new MembersResponseJsonConverter() } }; IDataStructure data = await LoadData(index); var namesAndTypes = data.GetNameAndTypes(); DataSlice dataSlice = new DataSlice(data); List <object> members = null; bool sorted = false; if (namesAndTypes[field.UniqueName] == ColumnType.stringType) { var column = DataSlice.Data.GetColumn <string>(field.UniqueName); var stringMembers = dataSlice.DataColumnIndexes.Select(index => column[index]).Distinct().ToList(); if (stringMembers.Count != 0) { var first = stringMembers.First(); if (Enum.TryParse(first.ToString(), out Month m) || Enum.TryParse(first.ToString(), out ShortMonth m1)) { stringMembers.Sort(new MonthComparator <string>()); sorted = true; } } members = stringMembers.ConvertAll <object>(new Converter <string, object>(str => (object)str)); } else { var column = DataSlice.Data.GetColumn <double?>(field.UniqueName); members = dataSlice.DataColumnIndexes.Select(index => column[index] as object).Distinct().ToList(); } int pageTotal = (int)Math.Ceiling(members.Count / (double)MEMBERS_PAGE_SIZE); pageTotal = pageTotal == 0 ? 1 : pageTotal; string[] responses = new string[pageTotal]; int currentPage = 0; while (currentPage < pageTotal) { MembersResponse response = new MembersResponse(); response.Sorted = sorted; response.Page = currentPage; response.PageTotal = pageTotal; int from = currentPage * MEMBERS_PAGE_SIZE; int size = Math.Min(members.Count, from + MEMBERS_PAGE_SIZE); for (int i = from; i < size; i++) { response.Members.Add(members[i]); } responses[currentPage] = JsonSerializer.Serialize(response, options); currentPage++; } return responses; }))[page]);
public DataSlice(IDataStructure data) { Data = data; _columnNameTypes = Data.GetNameAndTypes(); var firstNameAndType = _columnNameTypes.First(); int dataVauesCount = 0; if (firstNameAndType.Value == ColumnType.stringType) { dataVauesCount = Data.GetColumn <string>(firstNameAndType.Key).Count(); } else { dataVauesCount = Data.GetColumn <double?>(firstNameAndType.Key).Count(); } DataColumnIndexes = new int[dataVauesCount]; _indexesCount = 0; for (int i = 0; i < dataVauesCount; i++) { DataColumnIndexes[i] = i; _indexesCount++; } }