From b3b2a29fb38e61ee33d536af52918e5e5f1e9a34 Mon Sep 17 00:00:00 2001 From: James Clarke Date: Mon, 20 Jan 2025 17:32:25 +0000 Subject: [PATCH] Fix copying results in query editor when implicit limit is disabled (#401) --- shared/inspector/state.ts | 19 +++++++++ shared/studio/tabs/queryEditor/state/index.ts | 38 ++++++++---------- shared/studio/tabs/repl/state/index.ts | 40 ++++++++----------- 3 files changed, 53 insertions(+), 44 deletions(-) diff --git a/shared/inspector/state.ts b/shared/inspector/state.ts index 1975c58c..b73275b1 100644 --- a/shared/inspector/state.ts +++ b/shared/inspector/state.ts @@ -34,6 +34,25 @@ export type NestedDataGetter = ( fieldName: string ) => Promise<{data: any; codec: _ICodec}>; +export function createInspector( + result: any[] & {_codec: _ICodec}, + implicitLimit: number | null, + extendedViewerIds: Set, + openExtendedView: (item: Item) => void +) { + const inspector = new InspectorState({ + implicitLimit: + implicitLimit != null && !Number.isNaN(implicitLimit) + ? implicitLimit + : null, + noMultiline: true, + }); + inspector.extendedViewIds = extendedViewerIds; + inspector.openExtendedView = openExtendedView; + inspector.initData({data: result, codec: result._codec}); + return inspector; +} + @model("edb/Inspector") export class InspectorState extends Model({ $modelId: idProp, diff --git a/shared/studio/tabs/queryEditor/state/index.ts b/shared/studio/tabs/queryEditor/state/index.ts index 6d975d84..41dd0351 100644 --- a/shared/studio/tabs/queryEditor/state/index.ts +++ b/shared/studio/tabs/queryEditor/state/index.ts @@ -21,7 +21,7 @@ import { import {Text} from "@codemirror/state"; -import {InspectorState, Item} from "@edgedb/inspector/state"; +import {createInspector, InspectorState, Item} from "@edgedb/inspector/state"; import { storeQueryHistoryItem, @@ -110,7 +110,7 @@ export const explainStateCache = new ObservableLRU(10); export class QueryHistoryResultItem extends ExtendedModel(QueryHistoryItem, { status: prop(), hasResult: prop(), - implicitLimit: prop(), + implicitLimit: prop(), }) { get queryEditor() { return queryEditorCtx.get(this)!; @@ -121,8 +121,11 @@ export class QueryHistoryResultItem extends ExtendedModel(QueryHistoryItem, { let state = resultInspectorCache.get(this.$modelId); if (!state) { - state = createInspector(data, this.implicitLimit, (item) => - queryEditor.setExtendedViewerItem(item) + state = createInspector( + data, + this.implicitLimit, + extendedViewerIds, + (item) => queryEditor.setExtendedViewerItem(item) ); resultInspectorCache.set(this.$modelId, state); } @@ -156,18 +159,6 @@ export class QueryHistoryErrorItem extends ExtendedModel(QueryHistoryItem, { error: prop>(), }) {} -function createInspector( - result: EdgeDBSet, - implicitLimit: number, - openExtendedView: (item: Item) => void -) { - const inspector = new InspectorState({implicitLimit, noMultiline: true}); - inspector.extendedViewIds = extendedViewerIds; - inspector.openExtendedView = openExtendedView; - inspector.initData({data: result, codec: result._codec}); - return inspector; -} - type QueryData = { [EditorKind.EdgeQL]: Text; [EditorKind.SQL]: Text; @@ -641,7 +632,7 @@ export class QueryEditor extends Model({ resultBuf: Uint8Array; protoVer: ProtocolVersion; status: string; - implicitLimit: number; + implicitLimit: number | null; } | { error: ErrorDetails; @@ -781,9 +772,10 @@ export class QueryEditor extends Model({ }; const timestamp = Date.now(); const thumbnailData = getThumbnailData({query}); - const implicitLimit = sessionStateCtx + const implicitLimitConfig = sessionStateCtx .get(this)! - .activeState.options.find((opt) => opt.name === "Implicit Limit")?.value; + .activeState.options.find((opt) => opt.name === "Implicit Limit") + ?.value as bigint | undefined; try { const {result, outCodecBuf, resultBuf, protoVer, capabilities, status} = @@ -796,7 +788,9 @@ export class QueryEditor extends Model({ : undefined, { implicitLimit: - implicitLimit != null ? implicitLimit + BigInt(1) : undefined, + implicitLimitConfig != null + ? implicitLimitConfig + BigInt(1) + : undefined, replQueryTag: true, }, this.runningQueryAbort?.signal, @@ -806,6 +800,8 @@ export class QueryEditor extends Model({ ) ); + const implicitLimit = + implicitLimitConfig != null ? Number(implicitLimitConfig) : null; this.addHistoryCell({ queryData, timestamp, @@ -815,7 +811,7 @@ export class QueryEditor extends Model({ resultBuf, protoVer, status, - implicitLimit: Number(implicitLimit), + implicitLimit, }); return {success: true, capabilities, status}; } catch (e: any) { diff --git a/shared/studio/tabs/repl/state/index.ts b/shared/studio/tabs/repl/state/index.ts index 04a78e9b..8b4d560f 100644 --- a/shared/studio/tabs/repl/state/index.ts +++ b/shared/studio/tabs/repl/state/index.ts @@ -21,7 +21,7 @@ import { ErrorDetails, extractErrorDetails, } from "../../../utils/extractErrorDetails"; -import {InspectorState, Item} from "@edgedb/inspector/state"; +import {createInspector, InspectorState, Item} from "@edgedb/inspector/state"; import {baseOptions, decode, EdgeDBSet} from "../../../utils/decodeRawBuffer"; import {CommandResult, handleSlashCommand} from "./commands"; import { @@ -54,18 +54,6 @@ import {Language} from "edgedb/dist/ifaces"; export const defaultItemHeight = 85; -function createInspector( - result: EdgeDBSet, - implicitLimit: number | null, - openExtendedView: (item: Item) => void -) { - const inspector = new InspectorState({implicitLimit, noMultiline: true}); - inspector.extendedViewIds = extendedViewerIds; - inspector.openExtendedView = openExtendedView; - inspector.initData({data: result, codec: result._codec}); - return inspector; -} - export enum ReplLang { EdgeQL, SQL, @@ -150,11 +138,15 @@ export class ReplHistoryItem extends Model({ const cache = cachesCtx.get(this)!.inspector; let state = cache.get(this.$modelId); if (!state) { - state = createInspector(data, this.implicitLimit, (item) => - findParent( - this, - (p) => p instanceof Repl - )!.setExtendedViewerItem(item) + state = createInspector( + data, + this.implicitLimit, + extendedViewerIds, + (item) => + findParent( + this, + (p) => p instanceof Repl + )!.setExtendedViewerItem(item) ); cache.set(this.$modelId, state); } @@ -486,9 +478,8 @@ export class Repl extends Model({ } else { const implicitLimitConfig = sessionStateCtx .get(this)! - .activeState.options.find( - (opt) => opt.name === "Implicit Limit" - )?.value; + .activeState.options.find((opt) => opt.name === "Implicit Limit") + ?.value as bigint | undefined; const { result, @@ -534,8 +525,11 @@ export class Repl extends Model({ } else { this.resultInspectorCache.set( historyItem.$modelId, - createInspector(result, implicitLimit, (item) => - this.setExtendedViewerItem(item) + createInspector( + result, + implicitLimit, + extendedViewerIds, + (item) => this.setExtendedViewerItem(item) ) ); }