From 76e099b4beac3650f8d6cc4c7dc6a76e2d0360a9 Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Fri, 17 Jun 2022 14:53:18 -0400 Subject: [PATCH] [Gekidou] Improve performance on find channels queries (#6395) --- app/queries/servers/channel.ts | 10 +++++----- .../filtered_list/filtered_list.tsx | 13 ++++++++++--- app/screens/find_channels/filtered_list/index.ts | 10 ++++++---- app/screens/find_channels/index.tsx | 16 +++------------- .../quick_options/quick_options.tsx | 2 +- .../unfiltered_list/unfiltered_list.tsx | 2 +- 6 files changed, 26 insertions(+), 27 deletions(-) diff --git a/app/queries/servers/channel.ts b/app/queries/servers/channel.ts index b58aef016..246d2adf4 100644 --- a/app/queries/servers/channel.ts +++ b/app/queries/servers/channel.ts @@ -480,13 +480,13 @@ export const observeDirectChannelsByTerm = (database: Database, term: string, ta const currentUserId = observeCurrentUserId(database); return currentUserId.pipe( switchMap((uId) => { - return database.get(CHANNEL).query( + return database.get(MY_CHANNEL).query( Q.unsafeSqlQuery(`SELECT DISTINCT my.* FROM ${MY_CHANNEL} my INNER JOIN ${CHANNEL} c ON c.id=my.id AND c.team_id='' AND c.delete_at=0 ${onlyDMs} INNER JOIN ${CHANNEL_MEMBERSHIP} cm ON cm.channel_id=my.id - INNER JOIN ${USER} u ON u.id=cm.user_id AND (cm.user_id != '${uId}' AND ${username}) - OR ${displayname} - ORDER BY my.last_viewed_at DESC + LEFT JOIN ${USER} u ON u.id=cm.user_id AND (CASE WHEN c.type = 'D' THEN cm.user_id != '${uId}' ELSE 1 END) + WHERE ${displayname} OR CASE WHEN c.type = 'G' THEN 0 ELSE ${username} END + ORDER BY CASE c.type WHEN 'D' THEN 0 ELSE 1 END ASC, my.last_viewed_at DESC LIMIT ${take}`), ).observe(); }), @@ -525,7 +525,7 @@ export const observeNotDirectChannelsByTerm = (database: Database, term: string, Q.unsafeSqlQuery(`SELECT DISTINCT u.* FROM User u LEFT JOIN ChannelMembership cm ON cm.user_id=u.id LEFT JOIN Channel c ON c.id=cm.id AND c.type='${General.DM_CHANNEL}' - WHERE cm.user_id IS NULL AND (${displayname} OR ${username} OR ${nickname}) + WHERE cm.user_id IS NULL AND (${displayname} OR ${username} OR ${nickname}) AND u.delete_at=0 ${sortBy} LIMIT ${take}`), ).observe(); }), diff --git a/app/screens/find_channels/filtered_list/filtered_list.tsx b/app/screens/find_channels/filtered_list/filtered_list.tsx index 2979d2fc4..e25a18b8b 100644 --- a/app/screens/find_channels/filtered_list/filtered_list.tsx +++ b/app/screens/find_channels/filtered_list/filtered_list.tsx @@ -244,6 +244,13 @@ const FilteredList = ({ items.push(...usersMatchStart); } + // Archived channels local + if (items.length < MAX_RESULTS) { + const archivedAlpha = archivedChannels. + sort(sortChannelsByDisplayName.bind(null, locale)); + items.push(...archivedAlpha.slice(0, MAX_RESULTS + 1)); + } + // Remote Channels that start with if (items.length < MAX_RESULTS) { items.push(...remoteChannels.startWith); @@ -258,7 +265,7 @@ const FilteredList = ({ // Archived channels if (items.length < MAX_RESULTS) { - const archivedAlpha = [...archivedChannels, ...remoteChannels.archived]. + const archivedAlpha = remoteChannels.archived. sort(sortChannelsByDisplayName.bind(null, locale)); items.push(...archivedAlpha.slice(0, MAX_RESULTS + 1)); } @@ -285,8 +292,8 @@ const FilteredList = ({ return ( { const directChannelsMatchStart = observeDirectChannelsByTerm(database, term, MAX_RESULTS, true); const directChannelsMatch = observeDirectChannelsByTerm(database, term, MAX_RESULTS); - const channelsMatchStart = combineLatest([joinedChannelsMatchStart, directChannelsMatchStart]).pipe( + const channelsMatchStart = joinedChannelsMatchStart.pipe( + combineLatestWith(directChannelsMatchStart), switchMap((matchStart) => { return retrieveChannels(database, matchStart.flat(), true); }), ); - const channelsMatch = combineLatest([joinedChannelsMatch, directChannelsMatch]).pipe( + const channelsMatch = joinedChannelsMatch.pipe( + combineLatestWith(directChannelsMatch), switchMap((matched) => retrieveChannels(database, matched.flat(), true)), ); diff --git a/app/screens/find_channels/index.tsx b/app/screens/find_channels/index.tsx index 3b0ec8e50..ad191b6e8 100644 --- a/app/screens/find_channels/index.tsx +++ b/app/screens/find_channels/index.tsx @@ -1,8 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import {debounce, DebouncedFunc} from 'lodash'; -import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'; +import React, {useCallback, useEffect, useMemo, useState} from 'react'; import {DeviceEventEmitter, Keyboard, View} from 'react-native'; import {Navigation} from 'react-native-navigation'; @@ -45,7 +44,6 @@ const FindChannels = ({closeButtonId, componentId}: Props) => { const theme = useTheme(); const [term, setTerm] = useState(''); const [loading, setLoading] = useState(false); - const bounce = useRef void>>(); const styles = getStyleSheet(theme); const color = useMemo(() => changeOpacity(theme.centerChannelColor, 0.72), [theme]); const keyboardHeight = useKeyboardHeight(); @@ -68,18 +66,10 @@ const FindChannels = ({closeButtonId, componentId}: Props) => { }, []); const onChangeText = useCallback((text) => { - if (text) { - bounce.current?.cancel(); - bounce.current = debounce(() => { - setTerm(text); - }, 100); - bounce.current(); - } else { - setTerm(text); + setTerm(text); + if (!text) { setLoading(false); } - - return () => bounce.current?.cancel(); }, []); useEffect(() => { diff --git a/app/screens/find_channels/quick_options/quick_options.tsx b/app/screens/find_channels/quick_options/quick_options.tsx index de2c60b35..36f891c1a 100644 --- a/app/screens/find_channels/quick_options/quick_options.tsx +++ b/app/screens/find_channels/quick_options/quick_options.tsx @@ -66,7 +66,7 @@ const QuickOptions = ({canCreateChannels, canJoinChannels, close}: Props) => { return ( diff --git a/app/screens/find_channels/unfiltered_list/unfiltered_list.tsx b/app/screens/find_channels/unfiltered_list/unfiltered_list.tsx index 9e11db430..8ec103763 100644 --- a/app/screens/find_channels/unfiltered_list/unfiltered_list.tsx +++ b/app/screens/find_channels/unfiltered_list/unfiltered_list.tsx @@ -90,7 +90,7 @@ const UnfilteredList = ({close, keyboardHeight, recentChannels, showTeamName, un return (