Searching: Add support to paginate Seshat search results.

pull/21833/head
Damir Jelić 2020-05-29 11:44:08 +02:00
parent 3c73930e9a
commit e94f3422df
2 changed files with 45 additions and 4 deletions

View File

@ -88,6 +88,7 @@ async function localSearch(searchTerm, roomId = undefined) {
} }
const emptyResult = { const emptyResult = {
seshatQuery: searchArgs,
results: [], results: [],
highlights: [], highlights: [],
}; };
@ -97,6 +98,7 @@ async function localSearch(searchTerm, roomId = undefined) {
const eventIndex = EventIndexPeg.get(); const eventIndex = EventIndexPeg.get();
const localResult = await eventIndex.search(searchArgs); const localResult = await eventIndex.search(searchArgs);
emptyResult.seshatQuery.next_batch = localResult.next_batch;
const response = { const response = {
search_categories: { search_categories: {
@ -104,8 +106,25 @@ async function localSearch(searchTerm, roomId = undefined) {
}, },
}; };
const result = MatrixClientPeg.get()._processRoomEventsSearch( return MatrixClientPeg.get()._processRoomEventsSearch(
emptyResult, response); emptyResult, response);
}
async function paginatedLocalSearch(searchResult) {
const eventIndex = EventIndexPeg.get();
let searchArgs = searchResult.seshatQuery;
const localResult = await eventIndex.search(searchArgs);
const response = {
search_categories: {
room_events: localResult,
},
};
const result = MatrixClientPeg.get()._processRoomEventsSearch(searchResult, response);
searchResult.pendingRequest = null;
return result; return result;
} }
@ -132,6 +151,29 @@ function eventIndexSearch(term, roomId = undefined) {
return searchPromise; return searchPromise;
} }
function eventIndexSearchPagination(searchResult) {
const client = MatrixClientPeg.get();
const query = searchResult.seshatQuery;
if (!query) {
return client.backPaginateRoomEventsSearch(searchResult);
} else {
const promise = paginatedLocalSearch(searchResult);
searchResult.pendingRequest = promise;
return promise;
}
}
export function searchPagination(searchResult) {
const eventIndex = EventIndexPeg.get();
const client = MatrixClientPeg.get();
if (searchResult.pendingRequest) return searchResult.pendingRequest;
if (eventIndex === null) return client.backPaginateRoomEventsSearch(searchResult);
else return eventIndexSearchPagination(searchResult);
}
export default function eventSearch(term, roomId = undefined) { export default function eventSearch(term, roomId = undefined) {
const eventIndex = EventIndexPeg.get(); const eventIndex = EventIndexPeg.get();

View File

@ -39,7 +39,7 @@ import Tinter from '../../Tinter';
import rate_limited_func from '../../ratelimitedfunc'; import rate_limited_func from '../../ratelimitedfunc';
import * as ObjectUtils from '../../ObjectUtils'; import * as ObjectUtils from '../../ObjectUtils';
import * as Rooms from '../../Rooms'; import * as Rooms from '../../Rooms';
import eventSearch from '../../Searching'; import eventSearch, {searchPagination} from '../../Searching';
import {isOnlyCtrlOrCmdIgnoreShiftKeyEvent, isOnlyCtrlOrCmdKeyEvent, Key} from '../../Keyboard'; import {isOnlyCtrlOrCmdIgnoreShiftKeyEvent, isOnlyCtrlOrCmdKeyEvent, Key} from '../../Keyboard';
@ -1035,8 +1035,7 @@ export default createReactClass({
if (this.state.searchResults.next_batch) { if (this.state.searchResults.next_batch) {
debuglog("requesting more search results"); debuglog("requesting more search results");
const searchPromise = this.context.backPaginateRoomEventsSearch( const searchPromise = searchPagination(this.state.searchResults);
this.state.searchResults);
return this._handleSearchResult(searchPromise); return this._handleSearchResult(searchPromise);
} else { } else {
debuglog("no more search results"); debuglog("no more search results");