Repository navigation
Refactor Redis plugin and enhance query console features - #972
Merged
Merged
Conversation
- drop the native redis plugin and its protocol service - rename metaforge-plugin-redis-jdbc to metaforge-plugin-redis with classes RedisPlugin and RedisService - expose the connector as "Redis" instead of "Redis Jdbc" - point the service driver to the real RedisJdbcDriver class, the old name referenced a missing class and broke connections - sync registries, store metadata, docs and icons
- add SourceTypeMigration, a keyed one-time upgrade that renames metaforge_source._type from "Redis Jdbc" to "Redis" - extract the keyed migration flow from NavigationMigration into a reusable SchemaMigration helper - run all migrations from a renamed SchemaMigrationRunner and during setup - add tests for the rename and the uninstalled-instance skip
- split page into metadata tree, editor and dataset side panel filling the viewport via a workspace route mode in LayoutContainer - add source picker card, keyword-filtered tree with tables group node - build result panel with status bar, quick filter, CSV export, custom pagination and empty states; keep message tab for feedback - add side panel tabs for datasets, snippets, structure and history - theme ag-grid with metaforge tokens instead of hardcoded blue - keep SQL formatting on the backend FormatService endpoint - fix AceEditor wrapper dropping external value updates
- font size and ace theme chips persist through the existing changeEditorConfigure user API and remount the editor live - cmd/ctrl+enter executes the active editor like the toolbar button
The metadata service imported the shared HttpUtils singleton, which captures the authorization header once at module load. Requests fired after a fresh SPA sign-in (no full page reload) went out without the bearer token and failed with 4003. Instantiate the client per call like every other service.
- expose POST /api/v1/execute/plan wrapping the editor SQL into the EXPLAIN statement of the referenced engine (EXPLAIN PLAN FOR on H2) - engines without plan support answer with a failure response - add a query plan toolbar button; plan rows render in the result grid while the editor keeps the original SQL, failures land in messages - audit the plan run through the same plugin audit aspect
- drag handles between the tree, editor and side panel resize panes within safe bounds; the editor/result split stores a ratio - the layout persists in local storage and survives reloads
- the ace wrapper emits the editor instance on mount - execute menu gains execute-selection, falling back to the whole statement when nothing is selected; selection runs keep the editor content instead of applying the response SQL
Result sets with ten columns or fewer now size columns to the grid width after the first render, matching the prototype; wider results keep natural widths and scroll horizontally
The historical admin template feature was removed and superseded by snippets, so the side panel tab now follows the prototype naming (template) while keeping the snippet backend for create, edit, load and run
- the dropdown wrapper now fills the panel so the trigger card and the search input share edges; long source names truncate with an ellipsis instead of overflowing the panel clip - the floating menu follows the trigger width, and the meta line is composed in script so type and version keep their spacing
- MfTree never forwarded the title slot to its root node items, so the metadata icons never rendered; databases now show a green database glyph and tables a table glyph - remove the vertical guide line between tree levels - replace the metadata skeleton with the shared branded spinner; node loading already used it
- editor tabs scroll horizontally instead of wrapping, auto-scroll the active tab into view and show a tooltip with the tab title - side panel tabs truncate with an ellipsis at narrow widths and reveal the full label on hover; result tabs never wrap
Hover and selected backgrounds of adjacent tree rows sat two pixels apart and read as touching; use the shared four-pixel vertical gap convention for the root list and nested levels alike
The tree auto-expanded the first database and prefetched its tables; databases now stay collapsed until they are expanded manually
The rename form showed a frozen loader glyph while checking username availability; swap it for the shared branded loading icon
The structure column list still showed a skeleton while loading; use the same branded spinner as the rest of the console
The children container butted against the parent row, so a hovered parent and a highlighted first child touched; add the same four-pixel gap above the container as between siblings
The structure column list was clipped by the panel without a scrollbar; the shared tab body now scrolls for every tab
Buttons with a slot icon showed two glyphs while loading; the shared loading icon now hides every svg inside the slot until loading ends
The selected-source card used a generic database glyph while the dropdown items showed the plugin logo; the trigger now renders the same plugin avatar (generic glyph only as the empty placeholder)
VAceEditor has no intrinsic width, so as a flex child (snippet form item) it collapsed to zero and could neither render nor accept input; give it a 100 percent width and re-measure once after mount for transition hosts
Follow the admin user page: filters and tools on top, the table below, title and create action inside the shared DataTable header. Drop the page banner and per-page statistic cards that duplicated table data
Give the source its own column with the plugin avatar and a tooltip for long names, keep the state popover column, and slim the name cell to the link only so it stops stretching across the table
The table already carries the create action in its toolbar
Source preview cells wrapped long values into tall rows; the preview table now truncates each cell and reveals the full value in a tooltip
Snapshot of the parallel in-progress work the following fixes build on: four-step dataset wizard and detail page, column configuration with virtual expressions, column expression migration, dataset column function catalog endpoints, plugin/dev-environment loading fixes and the shared language pack entries
The step summary wrapped the full data source name across lines; truncate it and reveal the complete name on hover
The popup always opened downward and clipped against the bottom of the screen; estimate the option list height and drop upward when the trigger sits near the bottom edge
Type and mode were read-only tags editable only through the column drawer; both are now selects in the field table, and the drawer keeps the full editing form
Identified fields were renamed to generic column_N storage names; derive the default storage name from the source field, sanitized to a safe identifier and deduplicated against existing names
The physical field and function selects reset to their placeholder right after inserting, which read as if the choice did nothing; the selection now stays visible after the token lands in the expression
A failed virtual column validation kept its error banner above the field list even after the expression was fixed and saved
The confirm step reuses the truncating preview table and truncates the source summary row with a hover tooltip like the source step
Saving a dataset returned the entity graph and Jackson walked into the detached user's lazy sources collection, failing with no-Session. Neither client consumes sources through these entities, so exclude it at both the dataset user relation and the user type itself
The snippet drawer is shared with the snippet page, so it takes a kind prop: the query console template tab now shows create/modify template titles and the matching saved toast
Every content column gets a fixed width and the name column absorbs the remaining space so its text fills instead of leaving blank gaps; total rows falls back to a dash when the build has not run
Row action buttons used the default 12px MfSpace gap, which read as large blanks inside table rows; action cells across the list pages now use the extra-small gap. Dataset content columns get fixed widths and the name column absorbs the remaining space, and total rows falls back to a dash before the first build
The select popup was absolutely positioned inside the trigger, so any scroll or overflow ancestor (wizard cards, drawers) clipped it no matter the flip; the popup now teleports to body with the shared fixed-position overlay composable, which also flips it above the trigger when the viewport has no room below
Drop the extra description paragraph under the dataset list title; the user page shows the list name alone
Menu items open targets such as error modals and pages, but the dropdown stayed open underneath; clicks on buttons, links and menu items inside the overlay now close the menu
The enter transition scaled the popup, so its measured box was 5 percent short while the fixed position was computed and the flipped popup overlapped its trigger; fade-only keeps the measured geometry stable
Closing a modal restored focus to the button under the pointer and the focusin handler re-showed the tooltip without any user action; focus now only reveals the tooltip for keyboard focus (:focus-visible) while hover keeps working as before
Pressing next ran a manual basic check that surfaced a page-level alert; the basic step now submits the MfForm so required and validator rules render under each input, the columns step surfaces its errors inside the field card, and save on step one defers to the same inline validation before continuing
The overlay composable writes a viewport-sized inline max-height that overrode the popup's own cap, so long option lists (38 tables) rendered unbounded down the screen; re-apply the 16rem cap after merging the position style
Runs the server test module against MySQL and PostgreSQL service containers as the first step of the multi-database support work; PostgreSQL has no baseline schema yet and is wired for when the migration lands
Introduce a Liquibase changelog that creates the metadata schema on H2, MySQL, PostgreSQL, SQL Server and Oracle and upgrades installations made by the old setup scripts. - baseline uses portable types and names; one-to-many links become id columns and many-to-many links become explicit link tables - legacy changesets backfill the id columns from the relation tables, rename reserved and underscore-prefixed columns, then drop the tables - seed the catalogue through bound parameters, resolved by code - tests prove a legacy H2 or MySQL install converges to a fresh one The changelog is not wired into startup or setup yet.
Drop Hibernate and every JPA association so persistence is plain SQL that runs the same on H2, MySQL, PostgreSQL, SQL Server and Oracle. - entities map one table each; associations become id columns plus transient references loaded explicitly in batches - many-to-many links (user-role, role-menu, dashboard-report) are read and replaced with explicit SQL against the new link tables - listing filters, visibility and paging build portable SQL instead of JPA specifications; cascades that JPA did are explicit deletes - the changelog migrates installed databases on boot before any JDBC bean starts, and the setup wizard installs through it - remove the ad-hoc schema scripts and one-off migration runner BREAKING CHANGE: the metadata schema moves to the Liquibase changelog; relation tables are dropped and several columns are renamed on upgrade.
The setup wizard offers MySQL, PostgreSQL, SQL Server and Oracle as external metadata databases next to the embedded store. - each engine builds its own JDBC URL and default port; Oracle takes a service name instead of a database name - switching engines swaps the default port and account without overwriting values the user already typed - install tests run the real wizard flow on the selected database
Replace the MySQL/PostgreSQL service-container job with a Testcontainers matrix over H2, MySQL 8.0, PostgreSQL 16, SQL Server 2022 and Oracle 23 that runs the changelog, entity mapping, filter and setup install tests. The job only runs when the persistence modules or the workflow change.
The Liquibase changelog now creates and upgrades the metadata schema, so the hand-maintained MySQL dump is removed, the schema README points to the changelog, and the demo cleanup script uses portable DELETE statements against the new link tables.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Changelog category (leave one)
Changelog entry (Details of this change)
Affected version
latest version