From 5c95e84d61db1c239923c3d348053a87529f20c5 Mon Sep 17 00:00:00 2001 From: Benjamin Kane Date: Thu, 23 Jan 2025 17:48:33 -0500 Subject: [PATCH 1/3] is query performant --- .../state/src/recoil/queryPerformance.ts | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/app/packages/state/src/recoil/queryPerformance.ts b/app/packages/state/src/recoil/queryPerformance.ts index 439f167889f..3431a398642 100644 --- a/app/packages/state/src/recoil/queryPerformance.ts +++ b/app/packages/state/src/recoil/queryPerformance.ts @@ -209,13 +209,9 @@ const queryPerformanceStore = atomFamily({ ], }); -export const queryPerformance = selector({ - key: "queryPerformance", +export const queryPerformanceSetting = selector({ + key: "queryPerformanceSetting", get: ({ get }) => { - if (get(view).length) { - return false; - } - if (!get(enableQueryPerformanceConfig)) { return false; } @@ -234,3 +230,31 @@ export const queryPerformance = selector({ ); }, }); + +export const queryPerformance = selector({ + key: "queryPerformance", + get: ({ get }) => { + return get(queryPerformanceSetting) && isQueryPerformantView(get(view)); + }, + set: ({ get, set }, value) => { + set( + queryPerformanceStore(get(datasetId)), + value instanceof DefaultValue ? undefined : value + ); + }, +}); + +const SELECT_GROUP_SLICES = "fiftyone.core.stages.SelectGroupSlices"; +const VALID_QP_STAGES = new Set([SELECT_GROUP_SLICES]); + +const isQueryPerformantView = (view: State.Stage[]) => { + if (!view.length) { + return true; + } + + if (view.length === 1) { + return VALID_QP_STAGES.has(view[0]._cls); + } + + return false; +}; From c69a3a7ecb2a0c8df2e0e97419447f65280ea621 Mon Sep 17 00:00:00 2001 From: Benjamin Kane Date: Thu, 23 Jan 2025 17:57:11 -0500 Subject: [PATCH 2/3] is qp view selector --- .../state/src/recoil/queryPerformance.test.ts | 39 +++++++++- .../state/src/recoil/queryPerformance.ts | 74 ++++++++++--------- 2 files changed, 77 insertions(+), 36 deletions(-) diff --git a/app/packages/state/src/recoil/queryPerformance.test.ts b/app/packages/state/src/recoil/queryPerformance.test.ts index cc3f901ab74..348b4fb1aa4 100644 --- a/app/packages/state/src/recoil/queryPerformance.test.ts +++ b/app/packages/state/src/recoil/queryPerformance.test.ts @@ -3,7 +3,10 @@ import { describe, expect, it, vi } from "vitest"; vi.mock("recoil"); vi.mock("recoil-relay"); -import type { TestSelectorFamily } from "../../../../__mocks__/recoil"; +import type { + TestSelector, + TestSelectorFamily, +} from "../../../../__mocks__/recoil"; import { setMockAtoms } from "../../../../__mocks__/recoil"; import * as queryPerformance from "./queryPerformance"; @@ -23,4 +26,38 @@ describe("tests query performance selectors", () => { expect(test()).toEqual(new Set(["ground_truth.id", "ground_truth.label"])); }); + + it("resolves query performant views", () => { + const test = >( + (queryPerformance.isQueryPerformantView) + ); + + setMockAtoms({ + _view__setter: [], + }); + expect(test()).toBe(true); + + setMockAtoms({ + _view__setter: [ + { + _cls: "fiftyone.core.stages.SelectGroupSlices", + }, + ], + }); + expect(test()).toBe(true); + + setMockAtoms({ + _view__setter: [ + { + _cls: "unsupported", + }, + ], + }); + expect(test()).toBe(false); + + setMockAtoms({ + _view__setter: [{}, {}], + }); + expect(test()).toBe(false); + }); }); diff --git a/app/packages/state/src/recoil/queryPerformance.ts b/app/packages/state/src/recoil/queryPerformance.ts index 3431a398642..e00bfca2ad9 100644 --- a/app/packages/state/src/recoil/queryPerformance.ts +++ b/app/packages/state/src/recoil/queryPerformance.ts @@ -19,6 +19,9 @@ import { datasetId, datasetName } from "./selectors"; import { State } from "./types"; import { view } from "./view"; +const SELECT_GROUP_SLICES = "fiftyone.core.stages.SelectGroupSlices"; +const VALID_QP_STAGES = new Set([SELECT_GROUP_SLICES]); + export const lightningQuery = graphQLSelectorFamily< foq.lightningQuery$variables, foq.LightningInput["paths"], @@ -188,6 +191,22 @@ export const indexedPaths = selectorFamily, string>({ }, }); +export const isQueryPerformantView = selector({ + key: "isQueryPerformantView", + get: ({ get }) => { + const stages = get(view); + if (!stages?.length) { + return true; + } + + if (stages.length === 1) { + return VALID_QP_STAGES.has(stages[0]._cls); + } + + return false; + }, +}); + export const enableQueryPerformanceConfig = selector({ key: "enableQueryPerformanceConfig", get: ({ get }) => get(config).enableQueryPerformance, @@ -198,15 +217,17 @@ export const defaultQueryPerformanceConfig = selector({ get: ({ get }) => get(config).defaultQueryPerformance, }); -const queryPerformanceStore = atomFamily({ - key: "queryPerformanceStore", - default: undefined, - effects: (datasetId) => [ - getBrowserStorageEffectForKey(`queryPerformance-${datasetId}`, { - sessionStorage: true, - valueClass: "boolean", - }), - ], +export const queryPerformance = selector({ + key: "queryPerformance", + get: ({ get }) => { + return get(queryPerformanceSetting) && get(isQueryPerformantView); + }, + set: ({ get, set }, value) => { + set( + queryPerformanceStore(get(datasetId)), + value instanceof DefaultValue ? undefined : value + ); + }, }); export const queryPerformanceSetting = selector({ @@ -231,30 +252,13 @@ export const queryPerformanceSetting = selector({ }, }); -export const queryPerformance = selector({ - key: "queryPerformance", - get: ({ get }) => { - return get(queryPerformanceSetting) && isQueryPerformantView(get(view)); - }, - set: ({ get, set }, value) => { - set( - queryPerformanceStore(get(datasetId)), - value instanceof DefaultValue ? undefined : value - ); - }, +const queryPerformanceStore = atomFamily({ + key: "queryPerformanceStore", + default: undefined, + effects: (datasetId) => [ + getBrowserStorageEffectForKey(`queryPerformance-${datasetId}`, { + sessionStorage: true, + valueClass: "boolean", + }), + ], }); - -const SELECT_GROUP_SLICES = "fiftyone.core.stages.SelectGroupSlices"; -const VALID_QP_STAGES = new Set([SELECT_GROUP_SLICES]); - -const isQueryPerformantView = (view: State.Stage[]) => { - if (!view.length) { - return true; - } - - if (view.length === 1) { - return VALID_QP_STAGES.has(view[0]._cls); - } - - return false; -}; From aa6e84bfa304e4a1b979c1ce540355ca2920a1fd Mon Sep 17 00:00:00 2001 From: Benjamin Kane Date: Thu, 23 Jan 2025 18:02:58 -0500 Subject: [PATCH 3/3] linting --- app/packages/state/src/recoil/queryPerformance.ts | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/app/packages/state/src/recoil/queryPerformance.ts b/app/packages/state/src/recoil/queryPerformance.ts index e00bfca2ad9..dc6f5b2eaa9 100644 --- a/app/packages/state/src/recoil/queryPerformance.ts +++ b/app/packages/state/src/recoil/queryPerformance.ts @@ -219,15 +219,8 @@ export const defaultQueryPerformanceConfig = selector({ export const queryPerformance = selector({ key: "queryPerformance", - get: ({ get }) => { - return get(queryPerformanceSetting) && get(isQueryPerformantView); - }, - set: ({ get, set }, value) => { - set( - queryPerformanceStore(get(datasetId)), - value instanceof DefaultValue ? undefined : value - ); - }, + get: ({ get }) => get(queryPerformanceSetting) && get(isQueryPerformantView), + set: ({ set }, value) => set(queryPerformanceSetting, value), }); export const queryPerformanceSetting = selector({