/// <summary> /// Получить все ссылки на доски. /// </summary> /// <param name="query">Запрос.</param> /// <returns>Ссылки на доски.</returns> protected virtual async Task <IList <ILink> > DoGetBoardLinks(BoardReferenceStoreQuery query) { CheckModuleReady(); await WaitForTablesInitialize(); return(await OpenSession(session => { using (new Transaction(session.Session)) { using (var table = OpenTable(session, OpenTableGrbit.ReadOnly)) { var idSet = new HashSet <string>(StringComparer.OrdinalIgnoreCase); if (SelectIndex(table, query)) { do { idSet.Add(table.Columns.Id); } while (table.TryMoveNext()); } IList <ILink> result = idSet.Select(CreateBoardLink).ToList(); return result; } } })); }
/// <summary> /// Получить количество досок. /// </summary> /// <param name="query">Запрос.</param> /// <returns>Количество досок.</returns> protected virtual async Task <int> DoGetCount(BoardReferenceStoreQuery query) { CheckModuleReady(); await WaitForTablesInitialize(); return(await OpenSession(session => { var sid = session.Session; using (var table = OpenTable(session, OpenTableGrbit.ReadOnly)) { if (!SelectIndex(table, query)) { return 0; } int count; Api.JetIndexRecordCount(sid, table, out count, int.MaxValue); return count; } })); }
/// <summary> /// Выбрать индекс и включить фильтр в зависимости от запроса. /// </summary> /// <param name="table">Таблица.</param> /// <param name="query">Запрос.</param> /// <returns>Результат позиционирования на первой записи индекса.</returns> protected virtual bool SelectIndex(BoardReferenceTable table, BoardReferenceStoreQuery query) { if (query.Category == null && query.IsAdult == null) { Api.JetSetTableSequential(table.Session, table, SetTableSequentialGrbit.None); return(table.TryMoveFirst()); } if (query.Category == null) { table.Indexes.IsAdultIndex.SetAsCurrentIndex(); table.Indexes.IsAdultIndex.SetKey(table.Indexes.IsAdultIndex.CreateKey(query.IsAdult.Value)); return(Api.TrySeek(table.Session, table, SeekGrbit.SeekEQ | SeekGrbit.SetIndexRange)); } if (query.IsAdult == null) { table.Indexes.CategoryIndex.SetAsCurrentIndex(); table.Indexes.CategoryIndex.SetKey(table.Indexes.CategoryIndex.CreateKey(query.Category)); return(Api.TrySeek(table.Session, table.Table, SeekGrbit.SeekEQ | SeekGrbit.SetIndexRange)); } table.Indexes.IsAdultAndCategoryIndex.SetAsCurrentIndex(); table.Indexes.IsAdultAndCategoryIndex.SetKey(table.Indexes.IsAdultAndCategoryIndex.CreateKey(query.IsAdult.Value, query.Category)); return(Api.TrySeek(table.Session, table.Table, SeekGrbit.SeekEQ | SeekGrbit.SetIndexRange)); }
/// <summary> /// Загрузить ссылки. /// </summary> /// <param name="start">Начало.</param> /// <param name="count">Количество.</param> /// <param name="query">Запрос.</param> /// <returns>Ссылки.</returns> protected virtual async Task <IList <IBoardShortInfo> > DoLoadShortReferences(int start, int count, BoardReferenceStoreQuery query) { CheckModuleReady(); if (count < 1) { IList <IBoardShortInfo> result = new List <IBoardShortInfo>(); return(result); } await WaitForTablesInitialize(); return(await OpenSession(session => { var sid = session.Session; using (new Transaction(sid)) { using (var table = OpenTable(session, OpenTableGrbit.ReadOnly)) { IList <IBoardShortInfo> result = new List <IBoardShortInfo>(); bool isMoved = SelectIndex(table, query); if (isMoved) { if (start > 0) { isMoved = Api.TryMove(table.Session, table, (JET_Move)start, MoveGrbit.None); } } if (isMoved) { int cnt = count; do { cnt--; result.Add(ReadShortInfo(table)); } while (table.TryMoveNext() && cnt > 0); } return result; } } })); }
/// <summary> /// Загрузить ссылки. /// </summary> /// <param name="start">Начало.</param> /// <param name="count">Количество.</param> /// <param name="query">Запрос.</param> /// <returns>Ссылки.</returns> public IAsyncOperation <IList <IBoardShortInfo> > LoadShortReferences(int start, int count, BoardReferenceStoreQuery query) { return(DoLoadShortReferences(start, count, query).AsAsyncOperation()); }
/// <summary> /// Получить все ссылки на доски. /// </summary> /// <param name="query">Запрос.</param> /// <returns>Ссылки на доски.</returns> public IAsyncOperation <IList <ILink> > GetBoardLinks(BoardReferenceStoreQuery query) { return(DoGetBoardLinks(query).AsAsyncOperation()); }
/// <summary> /// Получить количество досок. /// </summary> /// <param name="query">Запрос.</param> /// <returns>Количество досок.</returns> public IAsyncOperation <int> GetCount(BoardReferenceStoreQuery query) { return(DoGetCount(query).AsAsyncOperation()); }