mirror of
https://github.com/l0ng-ai/openidea.git
synced 2026-11-08 08:52:12 +00:00
New query, data and schema tools for the Database feature (SQLite, PostgreSQL, MySQL). ## Query console - **Explain Plan** tab: SQLite `EXPLAIN QUERY PLAN`, PostgreSQL `EXPLAIN (FORMAT JSON)`, MySQL `EXPLAIN`, parsed in `ide-db::plan` into an operation tree (Full Scan / Index Scan / Group By / Order By …) under a statement root, with a properties panel. - **Query history**: `ide-db::history` keeps executed statements per project and source in `db-history.json` (deduplicated, newest first, 500 max). The Browse Query History dialog has search, a highlighted preview, Paste and Delete. - Output reports `(execution: X ms, fetching: Y ms)`. ## Results and table editor - Local column filter (value list with counts) and local sort. - Record / Value / Aggregates side panel. - Chart view (bar / line) with X / Y / aggregation settings. - Export Data dialog: extractor, Transpose, headers, preview, file or clipboard. An extractor drop-down sits on the data toolbars. - Import Data from a CSV / TSV file. - Table editor gets a WHERE | ORDER BY row. Column headers fit their names, with filter and sort indicators. Whole SQLite REALs display as `3108`, not `3108.0`. ## Database tree - Triggers under tables. Routines, sequences and materialized views under schemas, with DDL, Quick Documentation and Drop. - Data source options: object filter, show template databases, single database mode (PostgreSQL). - New ▸ Import from Clipboard (connection URLs). ## IPC New commands: `db_schema_objects`, `db_object_ddl`, `db_explain`, `db_history`, `db_remove_history`. Bindings are regenerated. ## Testing - `cargo test -p ide-db`: plan parsing, history store, trigger listing and DDL, explain without executing. - `cargo clippy -p ide-db -p openidea --all-targets -- -D warnings` is clean. - `pnpm typecheck` and eslint pass. `pnpm vitest run src/features/database src/ui`: 226 passed. - Checked in the running app against a SQLite database: - tree with triggers - result grid, local filter, side panel - chart - Explain Plan - history dialog - Export Data dialog - table editor ORDER BY - CSV import Merge follow-up: grouped the new `--chart-series` token under a section comment and added it to the theme plugin template (theme.test.ts on main), regenerated docs/plugins/themes.md. Re-verified after merging main on macOS with a SQLite source: query + result grid with filter/sort headers, Explain Plan tab (Full Scan / Index Scan / Group By / Order By), Query History dialog; `cargo nextest run -p ide-db` 45 passed, bindings unchanged after regeneration. https://claude.ai/code/session_01VUYsdXA2nkF5v6zsC93dpn
37 lines
1.0 KiB
TypeScript
37 lines
1.0 KiB
TypeScript
/** Read-only text with line numbers (IDEA's preview editors), SQL in the editor's syntax colours. */
|
|
import { useEffect, useRef } from "react";
|
|
import clsx from "clsx";
|
|
import { highlightInto } from "@/editor/lsp/markdown";
|
|
import styles from "./Database.module.css";
|
|
|
|
export function CodePreview({
|
|
text,
|
|
sql = false,
|
|
className,
|
|
"aria-label": ariaLabel,
|
|
}: {
|
|
text: string;
|
|
sql?: boolean;
|
|
className?: string;
|
|
"aria-label"?: string;
|
|
}) {
|
|
const ref = useRef<HTMLPreElement>(null);
|
|
useEffect(() => {
|
|
const el = ref.current;
|
|
if (!el) return;
|
|
el.textContent = text;
|
|
if (sql) void highlightInto(el, text, "SQL");
|
|
}, [text, sql]);
|
|
const lines = text.split("\n").length;
|
|
return (
|
|
<div className={clsx(styles.codePreview, className)}>
|
|
<div className={styles.codeGutter} aria-hidden>
|
|
{Array.from({ length: lines }, (_, i) => (
|
|
<div key={i}>{i + 1}</div>
|
|
))}
|
|
</div>
|
|
<pre ref={ref} className={styles.codeText} aria-label={ariaLabel} />
|
|
</div>
|
|
);
|
|
}
|