Optimize query in StartPlan

Closes #98
This commit is contained in:
Brandon Presley 2022-10-26 18:31:40 +13:00
parent 3be82e0b36
commit 97827c68b2
3 changed files with 22 additions and 34 deletions

View File

@ -11,7 +11,7 @@ import MassiveInput from './MassiveInput';
import {useSnackbar} from './MassiveSnack'; import {useSnackbar} from './MassiveSnack';
import {PlanPageParams} from './plan-page-params'; import {PlanPageParams} from './plan-page-params';
import Set from './set'; import Set from './set';
import {addSet, countManyToday, getDistinctSets} from './set.service'; import {addSet, countMany} from './set.service';
import SetForm from './SetForm'; import SetForm from './SetForm';
import StackHeader from './StackHeader'; import StackHeader from './StackHeader';
import {useSettings} from './use-settings'; import {useSettings} from './use-settings';
@ -30,7 +30,6 @@ export default function StartPlan() {
const [selected, setSelected] = useState(0); const [selected, setSelected] = useState(0);
const {settings} = useSettings(); const {settings} = useSettings();
const [counts, setCounts] = useState<CountMany[]>(); const [counts, setCounts] = useState<CountMany[]>();
const [distinctSets, setDistinctSets] = useState<Set[]>();
const weightRef = useRef<TextInput>(null); const weightRef = useRef<TextInput>(null);
const repsRef = useRef<TextInput>(null); const repsRef = useRef<TextInput>(null);
const unitRef = useRef<TextInput>(null); const unitRef = useRef<TextInput>(null);
@ -44,16 +43,10 @@ export default function StartPlan() {
useFocusEffect( useFocusEffect(
useCallback(() => { useCallback(() => {
countManyToday().then(newCounts => { countMany(workouts).then(newCounts => {
setCounts(newCounts); setCounts(newCounts);
console.log(`${StartPlan.name}.focus:`, {newCounts}); console.log(`${StartPlan.name}.focus:`, {newCounts});
}); });
getDistinctSets({limit: 100, offset: 0, search: '%'}).then(
newDistinct => {
setDistinctSets(newDistinct);
console.log(`${StartPlan.name}.focus:`, {newDistinct});
},
);
}, [params]), }, [params]),
); );
@ -69,7 +62,7 @@ export default function StartPlan() {
image: set.image, image: set.image,
unit, unit,
}); });
countManyToday().then(setCounts); countMany(workouts).then(setCounts);
if ( if (
settings.notify && settings.notify &&
(+weight > best.weight || (+reps > best.reps && +weight === best.weight)) (+weight > best.weight || (+reps > best.reps && +weight === best.weight))
@ -110,20 +103,6 @@ export default function StartPlan() {
[name, workouts], [name, workouts],
); );
const getDescription = useCallback(
(countName: string) => {
const count = counts?.find(c => c.name === countName);
console.log(`${StartPlan.name}:`, {count, countName});
if (!distinctSets) return;
const distinct = distinctSets.find(d => d.name === countName);
console.log(`${StartPlan.name}:`, {distinct});
if (settings.showSets)
return `${count?.total || 0} / ${distinct?.sets || 3}`;
return count?.total || '0';
},
[counts, distinctSets, settings.showSets],
);
return ( return (
<> <>
<StackHeader title={params.plan.days.replace(/,/g, ', ')} /> <StackHeader title={params.plan.days.replace(/,/g, ', ')} />
@ -157,13 +136,17 @@ export default function StartPlan() {
innerRef={unitRef} innerRef={unitRef}
/> />
)} )}
{counts && distinctSets && ( {counts && (
<FlatList <FlatList
data={workouts} data={counts}
renderItem={({item, index}) => ( renderItem={({item, index}) => (
<List.Item <List.Item
title={item} title={item.name}
description={getDescription(item)} description={
settings.showSets
? `${item.total} / ${item.sets ?? 3}`
: item.total
}
onPress={() => select(index)} onPress={() => select(index)}
left={() => ( left={() => (
<View <View

View File

@ -1,4 +1,5 @@
export default interface CountMany { export default interface CountMany {
name: string; name: string;
total: number; total: number;
sets?: number;
} }

View File

@ -166,14 +166,18 @@ export const countToday = async (name: string): Promise<number> => {
return Number(result.rows.item(0)?.total); return Number(result.rows.item(0)?.total);
}; };
export const countManyToday = async (): Promise<CountMany[]> => { export const countMany = async (names: string[]): Promise<CountMany[]> => {
const questions = names.map(_ => '?').join(',');
const select = ` const select = `
SELECT COUNT(*) as total, name FROM sets SELECT workouts.name, COUNT(sets.id) as total, sets.sets
WHERE created LIKE strftime('%Y-%m-%d%%', 'now', 'localtime') FROM (SELECT distinct name FROM sets) workouts
AND NOT hidden LEFT JOIN sets ON sets.name = workouts.name
GROUP BY name AND sets.created LIKE STRFTIME('%Y-%m-%d%%', 'now', 'localtime')
AND NOT hidden
WHERE sets.name IN (${questions})
GROUP BY workouts.name;
`; `;
const [result] = await db.executeSql(select); const [result] = await db.executeSql(select, names);
return result.rows.raw(); return result.rows.raw();
}; };