Skip to content

Refactor Redis plugin and enhance query console features - #972

Merged
qianmoQ merged 56 commits into
devlive-community:devfrom
qianmoQ:2026.0.0
Oct 29, 2026
Merged

qianmoQ merged 56 commits into
devlive-community:devfrom
qianmoQ:2026.0.0

Conversation

@qianmoQ

@qianmoQ qianmoQ commented Oct 29, 2026

Copy link
Copy Markdown
Member

Changelog category (leave one)

  • New Feature
  • Bug Fix
  • Documentation (changelog entry is not required)
  • Other

Changelog entry (Details of this change)

If there is an issue connection, write it to the end of the question
e.g: issue-7
Please delete this information when submitting

  • e.g: Support xxxx

Affected version

  • e.g: latest version

- 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.
@qianmoQ
qianmoQ merged commit d0e8737 into devlive-community:dev Oct 29, 2026
6 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant