Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
239 commits
Select commit Hold shift + click to select a range
a01f399
Intial commit for phase 4: Dashboards
cgivre Feb 6, 2026
5e65b53
More Phase 4 work
cgivre Feb 6, 2026
7a1ae29
Dashboard Improvements
cgivre Feb 6, 2026
924948d
Fix RAT
cgivre Feb 6, 2026
b4f70b1
Add Image Upload to Dashboard
cgivre Feb 6, 2026
b271e26
Image upload working
cgivre Feb 6, 2026
7516c26
Added Frontend Unit tests
cgivre Feb 6, 2026
17704e7
Unit test fix
cgivre Feb 6, 2026
7b7614f
Fix CodeQL issues
cgivre Feb 8, 2026
85a359e
Fix CodeQL issues
cgivre Feb 8, 2026
8029883
Try again...
cgivre Feb 8, 2026
83106cd
More CodeQL Fixes
cgivre Feb 8, 2026
3af152a
More code fixes
cgivre Feb 8, 2026
f514533
Fix build error
cgivre Feb 8, 2026
080ae13
Various fixes
cgivre Feb 9, 2026
d227331
XML Nav Tree Improvements
cgivre Feb 9, 2026
9ba271c
Nav Tree working
cgivre Feb 9, 2026
c7e2ee3
Add big number
cgivre Feb 9, 2026
7d5af38
Finished File System Config
cgivre Feb 11, 2026
be06552
Fix Linting
cgivre Feb 11, 2026
eadd10b
Fix useEffect dependency order in ProspectorSettingsModal
cgivre Feb 11, 2026
789d3ea
Improve workspace tab UI with instructions, validation, and security
cgivre Feb 11, 2026
44463fe
Fix Add Workspace button and handle classpath plugin special case
cgivre Feb 11, 2026
5b8d984
Hide workspace tab for classpath plugin
cgivre Feb 11, 2026
ba9daad
Fix Add Workspace button with proper useCallback dependencies
cgivre Feb 11, 2026
ea65a5e
Stabilize workspace handlers and table columns with useCallback and u…
cgivre Feb 11, 2026
821464f
Fix Add Workspace button state persistence issue
cgivre Feb 11, 2026
53ecf55
Add validation for duplicate workspace names
cgivre Feb 11, 2026
00953c1
Fix workspace initialization on first mount
cgivre Feb 11, 2026
76b824e
More improvements
cgivre Feb 12, 2026
625d542
Implement column menus for ResultsGrid with comprehensive feature set
cgivre Feb 12, 2026
4fb00b3
Various improvements
cgivre Feb 12, 2026
d96e1a3
Dark mode:
cgivre Feb 12, 2026
77e529f
Minor bug fix
cgivre Feb 12, 2026
c385869
Fix state
cgivre Feb 13, 2026
8f4da63
Fix Vault Unit Tests
cgivre Feb 13, 2026
ec9a1bd
Fix Docker based unit tests
cgivre Feb 13, 2026
2360d9e
Visualization improvements
cgivre Feb 13, 2026
b070c97
Link fix
cgivre Feb 13, 2026
ad750ab
Various fixes
cgivre Feb 18, 2026
9b2d064
Fixing time grain issues
cgivre Feb 18, 2026
ca7d46f
WIP Time Grain
cgivre Feb 18, 2026
f4ced00
Time grain working
cgivre Feb 18, 2026
db5ed83
Filter improvements and hardening.
cgivre Feb 19, 2026
fe27d6c
Refactor SQL generator to use Java port of SQL Glot
cgivre Feb 23, 2026
bba7302
Fix checkstyles
cgivre Feb 23, 2026
f626eb8
Add trendlines
cgivre Feb 25, 2026
18fcec0
Profile page improvements
cgivre Feb 26, 2026
79a8255
Implement Profile Detail Page — Dashboard-style redesign with AI advisor
cgivre Feb 26, 2026
efb1555
Improve Profile Detail Page layout: add query display and evenly-spac…
cgivre Feb 26, 2026
8bdf28d
Fix AI advisor context serialization error
cgivre Feb 26, 2026
6069d28
Add credential redaction to prevent sensitive data exposure to AI
cgivre Feb 26, 2026
43118e3
Improve CSRF token handling for hosted deployments
cgivre Feb 26, 2026
1c9fc7f
Revert "Improve CSRF token handling for hosted deployments"
cgivre Feb 26, 2026
9794780
Added new visualizations
cgivre Mar 2, 2026
821a064
Fix streaming UI bug
cgivre Mar 2, 2026
1ed415f
WIP
cgivre Mar 6, 2026
21626e7
Size improvements
cgivre Mar 6, 2026
a8eb629
UI Improvements
cgivre Mar 8, 2026
35b3bed
More data sources
cgivre Mar 9, 2026
da9db2c
More data sources
cgivre Mar 9, 2026
ec18aa4
Schema tree fixes
cgivre Mar 9, 2026
f19b9d6
Fix Metrics and Profiles Pages
cgivre Mar 10, 2026
508c5b5
Schema tree fixes
cgivre Mar 11, 2026
b6d5b06
Updated gitignore
cgivre Mar 11, 2026
f013c87
Fix CodeQL issues
cgivre Mar 11, 2026
ebac772
Add backend result cache service with security hardening
cgivre Mar 12, 2026
f9016d7
Add frontend memory optimization with LRU cache and backend integration
cgivre Mar 12, 2026
bfdfb3d
Add server-side pagination for large result sets
cgivre Mar 12, 2026
8e83956
Remove unused act import from useServerPagination test
cgivre Mar 12, 2026
bb4af98
Fix CodeQL
cgivre Mar 12, 2026
9afaec5
Fix build errors
cgivre Mar 12, 2026
98e8aa6
PDF Fix
cgivre Mar 12, 2026
e58c535
Various updates
cgivre Mar 12, 2026
296535b
Added sys project
cgivre Mar 12, 2026
5321f19
Fix unit tests
cgivre Mar 13, 2026
58ff92f
Fix CodeQL issues
cgivre Mar 13, 2026
ce8a930
Various AI improvements
cgivre Mar 16, 2026
ef8839f
Various fixes
cgivre Mar 17, 2026
0182aa0
Project refinements
cgivre Mar 18, 2026
d852846
Fix Checkstyle
cgivre Mar 18, 2026
b8a52e8
Fix schema search
cgivre Mar 18, 2026
fe5d75b
Fix query tab
cgivre Mar 18, 2026
2050e1b
Scheduler in progress
cgivre Mar 19, 2026
4ba055d
Scheduler improvements
cgivre Mar 20, 2026
644c0b5
Various fixes
cgivre Mar 22, 2026
0ad5f3d
Improve SqlLab layout and AI suggestions
cgivre Mar 23, 2026
98b3e45
Fix: Add backtick escaping to INFORMATION_SCHEMA.COLUMNS query
cgivre Mar 24, 2026
2f0d41b
Fix: Add missing backticks to INFORMATION_SCHEMA.COLUMNS and simplify…
cgivre Mar 24, 2026
a1a0853
Fix: Extract fetchColumnsForTable private helper to fix getSchemaTree
cgivre Mar 24, 2026
a70deb1
Fix: Use fresh WebUserConnection for each metadata query
cgivre Mar 24, 2026
8a5e13a
Fix: Correct WebUserConnection constructor call
cgivre Mar 24, 2026
7035d1d
Refactor: Add boolean parameter to executeQuery for connection reuse …
cgivre Mar 24, 2026
30f6844
Improve AI Query Suggestions: format, name tabs, remove panel expansion
cgivre Mar 24, 2026
ab96e98
Fix: Remove unused Space import from QuerySuggestions
cgivre Mar 24, 2026
a62ef13
Fix: Change allValidTables from let to const
cgivre Mar 24, 2026
04e3daa
Fix: Pass suggestion title to parent component in AiAssistantModal
cgivre Mar 24, 2026
d051588
Implement hierarchical geographic map support with lazy-loading
cgivre Mar 24, 2026
bf22e08
Update TODO: mark Choropleth Maps as complete
cgivre Mar 24, 2026
bf52407
Fix project data loading: load saved queries and improve cache handling
cgivre Mar 24, 2026
994e1d3
Add US ZIP Code geographic map support
cgivre Mar 24, 2026
33f81cc
Clean up: remove Python download scripts, fix linting
cgivre Mar 24, 2026
5654692
Fix: replace dynamic import with static import in SqlLabPage
cgivre Mar 24, 2026
574eae6
Remove broken us-zipcodes placeholder
cgivre Mar 24, 2026
5977283
Add US ZIP Code support with DC data + full US instructions
cgivre Mar 24, 2026
c5dac1a
Add .gitignore for large GeoJSON files + setup script
cgivre Mar 24, 2026
0083c62
Add debugging logs for choropleth map rendering and GeoJSON loading
cgivre Mar 24, 2026
e5fdd1f
Add state-level ZIP code support to GeoMapRegistry and create Python …
cgivre Mar 24, 2026
25534cc
Add multi-select UI for state-level ZIP code scopes
cgivre Mar 24, 2026
aaf7a9f
Fix: Include 'US ZIP Codes (by State)' group in GEO_SCOPE_OPTIONS
cgivre Mar 24, 2026
b3df79b
Add merged US ZIP codes GeoJSON (4,388 ZIP codes from 14 states)
cgivre Mar 25, 2026
b7b7cc6
Improve ZIP code download: minification + 5-minute timeout
cgivre Mar 25, 2026
68c52ab
Add polygon simplification to reduce file sizes by 67%
cgivre Mar 25, 2026
de22224
Optimize ZIP code performance: use state-specific files instead of me…
cgivre Mar 25, 2026
37a0b1b
Replace NaN with 0 in choropleth visualization data
cgivre Mar 25, 2026
5587dbf
Convert us-zipcodes from GeoJSON to TopoJSON for 76% size reduction
cgivre Mar 25, 2026
90468fb
Add @types/topojson-client for TypeScript support
cgivre Mar 25, 2026
7ae8555
Fix ESLint errors: remove self-assignments and any type annotation
cgivre Mar 25, 2026
f6ae355
Add Apache License headers to scripts and data files
cgivre Mar 25, 2026
104b218
Implement choropleth zoom and center configuration
cgivre Mar 25, 2026
0000307
Allow capturing choropleth map view from interactive preview
cgivre Mar 25, 2026
34f0fef
Add 'Manage Data Sources' to admin menu
cgivre Mar 25, 2026
6fed5df
Fix ref type annotations in map capture feature
cgivre Mar 25, 2026
276534a
Fix route parameter collision between project and dashboard IDs
cgivre Mar 25, 2026
505c0c1
Fix: prevent first saved query from loading into new tabs
cgivre Mar 25, 2026
1936249
Fix: preserve lock state and visualization IDs when duplicating tabs
cgivre Mar 25, 2026
158b178
Initialize lock and viz fields for new tabs
cgivre Mar 25, 2026
594b515
Add sort direction controls to metric and categorical visualizations
cgivre Mar 25, 2026
e1944f8
Add number formatting, labels, and sparkline data limiting to metric …
cgivre Mar 25, 2026
b3d3d11
Add currency formatting and consolidate metric visualization options …
cgivre Mar 25, 2026
257dfd6
Move Sort Direction control to appear right after Order By for bigNumber
cgivre Mar 25, 2026
ae0f982
Fix AI Q&A panel data access across dashboard tabs
cgivre Mar 25, 2026
8332b79
Include SQL queries in AI Q&A dashboard context
cgivre Mar 25, 2026
b21f5a8
Instruct AI to keep dashboard Q&A responses brief
cgivre Mar 25, 2026
dd6dd9c
Make AI Q&A instruction explicit: use only dashboard data, no databas…
cgivre Mar 25, 2026
4d7ac96
Fix AI Q&A to use only dashboard data, add clear button
cgivre Mar 25, 2026
152645d
Fix JDBC Config
cgivre Apr 6, 2026
3490cd4
Fix license
cgivre Apr 6, 2026
d5b5c5d
Various fixes
cgivre Apr 10, 2026
ef5150e
Enforce per-user authorization on schedule endpoints
cgivre Apr 24, 2026
fb1ce16
Various fixes
cgivre May 1, 2026
9c381af
Fix linting
cgivre May 1, 2026
a224b3a
Fix CommandPalette test for Spotlight rebuild
cgivre May 1, 2026
181daaf
More Apple Design
cgivre May 5, 2026
5871c17
Add Format SQL, Add-to-dashboard, column-dep badge
cgivre May 5, 2026
99d26c7
Move schema browser to a dedicated left rail
cgivre May 6, 2026
cfae39f
Double-click table opens a new SQL tab
cgivre May 6, 2026
d860fa3
More progress
cgivre May 18, 2026
a58bb6b
Additional Updates
cgivre Jun 10, 2026
38b7789
Remove stale code
cgivre Jun 16, 2026
b6244c1
Various minor fixes
cgivre Jun 17, 2026
dd15485
Fix unit tests
cgivre Jun 25, 2026
666e6d0
Add enterprise AI provider support for internal models
cgivre Jul 3, 2026
ef922cb
Complete Phase 2: Implement proxy, SSL/TLS, custom headers with compr…
cgivre Jul 3, 2026
69f40f3
Update documentation with enterprise AI provider support
cgivre Jul 3, 2026
363263c
Fix missing assertTrue import in test files
cgivre Jul 3, 2026
527a41c
Lint fixees
cgivre Jul 3, 2026
ef054dc
Fix flaky Splunk tests
cgivre Jul 9, 2026
2503347
Validate AI endpoint scheme and dedupe endpoint normalization
cgivre Jul 9, 2026
1dc0bba
Wait for Splunk ansible-complete log instead of HTTP probe
cgivre Jul 10, 2026
6ea4313
Added OAuth for AI
cgivre Jul 10, 2026
3f39b42
Fix SSL issues
cgivre Jul 10, 2026
e97d5e3
Connect Splunk tests over HTTPS and pin the container image
cgivre Jul 15, 2026
2dbe59d
Bypass the JVM global proxy for AI endpoints and accept PEM truststores
cgivre Jul 15, 2026
90b696e
Add design spec for Prospector logging and project context
cgivre Jul 15, 2026
7654744
Add implementation plan for Prospector interaction logging
cgivre Jul 15, 2026
d42bb37
Enforce AI feature tagging with the type system rather than a grep test
cgivre Jul 15, 2026
eb9186b
Separate AI event construction from logging and fix success flag
cgivre Jul 15, 2026
fa63125
Read the originating feature from ChatContext for AI analytics
cgivre Jul 15, 2026
e0e4e30
Require an originating feature on every AI call
cgivre Jul 15, 2026
0963ccf
Correct AiLogsResources path and registration in the logging plan
cgivre Jul 15, 2026
50aa1d6
Remove client-side AI logging in favour of server events
cgivre Jul 15, 2026
5c8dae7
Record AI setup failures and config-test calls
cgivre Jul 15, 2026
0c24a32
Fix AiEvent.user null regression from commit 4ce54133d
cgivre Jul 15, 2026
e902d71
Distinguish unconfigured AI analytics from no usage
cgivre Jul 15, 2026
2b4368a
Document the AI analytics feature vocabulary
cgivre Jul 15, 2026
f0b66e6
Record failed AI config tests as failures, not successes
cgivre Jul 15, 2026
e773177
Refresh AiEvent javadoc and cover resolveUser's empty-name branch
cgivre Jul 15, 2026
1821882
Require event log matches to be files, not directories
cgivre Jul 15, 2026
fd30a0d
Label every AI feature and fix the idle-dashboard banner
cgivre Jul 15, 2026
8c834ad
Replace feature-slug source scanner with type-level enforcement
cgivre Jul 15, 2026
fe86b30
Add AI-created visualizations to the active project
cgivre Jul 15, 2026
8b02ff0
Accept projectId and notebook context instead of rejecting the chat
cgivre Jul 15, 2026
20f4d33
Add implementation plan for Prospector project context
cgivre Jul 15, 2026
383e805
Render the active project's metadata for the AI system prompt
cgivre Jul 15, 2026
ac33d23
Inject the active project's context into the Prospector prompt
cgivre Jul 15, 2026
90584b9
Add positive-path test proving project context reaches the system prompt
cgivre Jul 15, 2026
ffbc973
Add a get_project_docs tool for on-demand project documentation
cgivre Jul 15, 2026
109ddb7
Tighten get_project_docs no-active-project test assertion
cgivre Jul 15, 2026
802a201
Carry notebook context to the model and honour sendDataToAi in tools
cgivre Jul 15, 2026
83755d1
Give global Prospector chat the active project from the route
cgivre Jul 15, 2026
079011a
Document Prospector's project context and get_project_docs
cgivre Jul 15, 2026
e0355e4
Authorize project context injected into the Prospector system prompt
cgivre Jul 15, 2026
442346c
Read sendDataToAi from the server in useProspector so no caller can f…
cgivre Jul 15, 2026
a0c0e10
Pin sendDataToAi fail-closed behavior with a shared hook and test
cgivre Jul 15, 2026
b451ff2
Fix prospector bugs
cgivre Jul 15, 2026
38f536b
Bug fix
cgivre Jul 16, 2026
8457efc
Fix unit test
cgivre Jul 16, 2026
35c1114
Fix minor error
cgivre Jul 16, 2026
b831b61
Add design spec for saving queries as views and materialized views
cgivre Jul 15, 2026
0a4e03b
Correct view schema eligibility to a dedicated view-targets endpoint
cgivre Jul 16, 2026
355cb81
Add implementation plan for saving queries as views
cgivre Jul 16, 2026
ab464e0
Test the view logic instead of relying on manual checks
cgivre Jul 16, 2026
7ed06f0
Add view-targets endpoint listing schemas that can hold a view
cgivre Jul 16, 2026
9a2c07d
Add pure SQL helpers for building view DDL
cgivre Jul 16, 2026
3123539
Add view target API and widen table and dataset type unions
cgivre Jul 16, 2026
28caa00
Add view and materialized view modes to the save dialog
cgivre Jul 16, 2026
6b1b894
Guard SaveQueryDialog against premature view saves and stale mode
cgivre Jul 16, 2026
a696f9d
Fix vacuous Bug 1 test in SaveQueryDialog to actually exercise the vi…
cgivre Jul 16, 2026
de3434e
Create views and materialized views from the save dialog
cgivre Jul 16, 2026
fec5c8e
Give views and materialized views distinct icons in the schema tree
cgivre Jul 17, 2026
ddf2bf5
Reload the schema tree after creating a view
cgivre Jul 17, 2026
92252a2
Recognize view and materialized_view datasets in project schema filte…
cgivre Jul 17, 2026
c562ba5
Add regression test for view/materialized_view in dataset allow list
cgivre Jul 17, 2026
0ff8d9a
Fix flaky SaveQueryDialog test that timed out under CI load
cgivre Jul 17, 2026
672c8e2
Extend BaseTest in TestViewTargets
cgivre Jul 17, 2026
16dd7d8
Add design spec for project schema cache
cgivre Jul 27, 2026
596c469
Scope schema cache per-project for access control; add table-type scan
cgivre Jul 27, 2026
85e687e
Refine schema cache to synchronous scan model (no background executor)
cgivre Jul 27, 2026
82f3ae1
Add implementation plan for project schema cache
cgivre Jul 27, 2026
6dc13ae
Add ProjectSchemaCache store and scan/read/peek logic
cgivre Jul 27, 2026
c49d780
Fix ProjectSchemaCache staleness reset, singleton, and case handling
cgivre Jul 27, 2026
f5a0a3c
Guard removeProject against missing keys in ProjectSchemaCache
cgivre Jul 27, 2026
aa318a7
Scan project schemas on dataset add; add schema-cache refresh/inspect…
cgivre Jul 27, 2026
6f96253
Serve project-scoped schema metadata from cache in MetadataResources
cgivre Jul 27, 2026
4c81dfd
Inject cached project schema into Prospector system prompt
cgivre Jul 27, 2026
f13846e
Cap the schema-cache block in the Prospector system prompt
cgivre Jul 27, 2026
b14df9a
Add projectId params and schema-cache client functions to webapp API
cgivre Jul 27, 2026
78f89cc
Pass projectId to tree and autocomplete metadata calls for cache scoping
cgivre Jul 27, 2026
39ff13d
Add schema-cache refresh button and last-scanned indicator to project…
cgivre Jul 27, 2026
2545a73
Document project schema cache
cgivre Jul 27, 2026
9a6901a
Collapse divergent resolveUser and add canRead-deny cache tests
cgivre Jul 27, 2026
3763921
Fix minor bugs
cgivre Jul 28, 2026
9e033b1
Minor fixes
cgivre Jul 28, 2026
fa4e6e1
Fix dashboards created in a project being orphaned and unopenable
cgivre Jul 28, 2026
c124807
Make TestSpaServletFilter extend BaseTest
cgivre Jul 30, 2026
257771f
Fix Schema Tree
cgivre Aug 10, 2026
65f6b74
Add schema sampling for dynamic-schema tables
cgivre Aug 11, 2026
1ffabfe
Apply gitignore
cgivre Aug 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
64 changes: 64 additions & 0 deletions .github/workflows/sqllab-frontend.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

name: SQL Lab Frontend CI

on:
push:
paths:
- 'exec/java-exec/src/main/resources/webapp/**'
pull_request:
paths:
- 'exec/java-exec/src/main/resources/webapp/**'

defaults:
run:
working-directory: exec/java-exec/src/main/resources/webapp

jobs:
build-and-test:
name: Build & Test
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [20]
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
cache-dependency-path: exec/java-exec/src/main/resources/webapp/package-lock.json

- name: Install dependencies
run: npm ci

- name: TypeScript type check
run: npx tsc --noEmit

- name: Lint
run: npm run lint

- name: Run tests
run: npx vitest run --passWithNoTests

- name: Build
run: npm run build
29 changes: 28 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,31 @@ target/
tools/venv/
venv/
.vscode/*
exec/java-exec/src/main/resources/webapp/
/exec/java-exec/src/main/resources/python/.venv/
__pycache__/
*.pyc
.pytest_cache/
.coverage

# Frontend (webapp)
node_modules/
.vite/
.env
.env.local
.env.*.local
*.swo
Thumbs.db
coverage/
/exec/java-exec/src/main/resources/webapp/dist/
/exec/java-exec/src/main/resources/webapp/node/
result-cache/

# Large GeoJSON files (for local development only, not committed to git)
# Exception: us-zipcodes.topojson (merged all-states, 91 MB) is committed to git
# Individual state files (us-al-zipcodes.json, us-ca-zipcodes.json, etc.) are git-ignored
# These can be regenerated locally using scripts/process-zipcodes.py
/exec/java-exec/src/main/resources/webapp/public/geojson/us-*-zipcodes.json
/exec/java-exec/src/main/resources/webapp/public/geojson/us-zipcodes.json
!/exec/java-exec/src/main/resources/webapp/public/geojson/us-zipcodes.topojson
/exec/java-exec/src/main/resources/webapp/public/geojson/*.zip
/exec/java-exec/src/main/resources/webapp/public/geojson/cb_*
68 changes: 68 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Apache Drill — Claude / AI assistant guide

Apache Drill is a schema-free SQL query engine for Hadoop, NoSQL, and cloud storage. This file is the entry point for AI coding assistants working in this repo: it points you to where the docs live, calls out hard constraints, and lists must-run commands.

## Where the docs live

All developer documentation is under [`docs/dev/`](docs/dev/). Start with [`docs/dev/DevDocs.md`](docs/dev/DevDocs.md) for the broader index.

| Topic | Doc |
|---|---|
| **Web UI (React SPA)** — architecture, routing, sidebar, contexts, page-by-page reference | [`docs/dev/ui/README.md`](docs/dev/ui/README.md) |
| **Login / authentication refactor** — design notes, current auth model, options | [`docs/dev/LoginRefactor.md`](docs/dev/LoginRefactor.md) |
| Prospector AI assistant — backend | [`docs/dev/PROSPECTOR.md`](docs/dev/PROSPECTOR.md) |
| Enterprise AI provider configuration — proxy, SSL/TLS, custom headers, static parameters | [`docs/dev/ai/ENTERPRISE_PROVIDERS.md`](docs/dev/ai/ENTERPRISE_PROVIDERS.md) |
| SQL transpiler (GraalPy + sqlglot) | [`docs/dev/TRANSPILER.md`](docs/dev/TRANSPILER.md) |
| AI features overview | [`docs/dev/AI_FEATURES.md`](docs/dev/AI_FEATURES.md) |
| Dev environment setup | [`docs/dev/Environment.md`](docs/dev/Environment.md) |
| Testing | [`docs/dev/Testing.md`](docs/dev/Testing.md) |
| Maven build | [`docs/dev/Maven.md`](docs/dev/Maven.md) |
| Jetty 12 migration notes | [`docs/dev/Jetty12Migration.md`](docs/dev/Jetty12Migration.md) |
| License headers | [`docs/dev/LicenseHeadersAndNotices.md`](docs/dev/LicenseHeadersAndNotices.md) |

If you write new documentation, place it in [`docs/dev/`](docs/dev/), not in source directories. Update this table and the relevant index file.

## Hard constraints

These are easy to get wrong and break the build.

### Checkstyle

After modifying anything in `exec/java-exec`, run:

```bash
mvn checkstyle:check -pl exec/java-exec
```

Common failures: `if` statements without braces, unused imports, missing Apache license headers on new files.

### `jdbc-all` jar size limit

The shaded JDBC driver (`exec/jdbc-all`) has a size limit enforced by `maven-enforcer-plugin` (~62 MB).

If you add large resources to `exec/java-exec` (anything in `src/main/resources/webapp/`, large fonts, model files, etc.), update the exclusion filters in [`exec/jdbc-all/pom.xml`](exec/jdbc-all/pom.xml) under the `maven-shade-plugin` configuration. The `webapp/**` filter is already present.

### License headers

Every source file (Java, TypeScript, TSX, JavaScript, CSS, HTML) must have an Apache 2.0 license header. See [`docs/dev/LicenseHeadersAndNotices.md`](docs/dev/LicenseHeadersAndNotices.md).

## UI workflow

The web UI is a React SPA at `exec/java-exec/src/main/resources/webapp/`. Build, dev server, conventions, and per-page reference are all in [`docs/dev/ui/`](docs/dev/ui/README.md).

Quick reference:

```bash
# Production build (run from repo root via Maven, or directly):
cd exec/java-exec/src/main/resources/webapp && npm install && npm run build

# Dev server (with HMR; proxies API calls to a running Drillbit on :8047):
cd exec/java-exec/src/main/resources/webapp && npm run dev
```

When adding or substantially modifying a UI page, update its doc under [`docs/dev/ui/pages/`](docs/dev/ui/pages/) in the same PR. See [`docs/dev/ui/README.md`](docs/dev/ui/README.md) for conventions.

## Git conventions

- Do **not** add Claude as a co-author on commits.
- Commits should be descriptive in the imperative ("Add cluster page", not "Added cluster page").
92 changes: 92 additions & 0 deletions LINTER_RESULTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# Code Quality & Linter Results
**Date**: 2026-04-06
**Branch**: feature/sqllab-react-ui

## Frontend (React/TypeScript) - `/src/main/resources/webapp`

### ✅ ESLint
```
npm run lint
```
**Status**: ✅ PASSED (0 warnings, 0 errors)
- Configuration: ESLint 8.56.0 with TypeScript support
- Plugins: @typescript-eslint, react-hooks
- Settings: max-warnings=0 (strict mode)
- Extensions checked: ts, tsx

### ✅ TypeScript Type Checking
```
npx tsc --noEmit
```
**Status**: ✅ PASSED (0 errors)
- Version: 5.3.3
- All source files in `src/` directory compile without type errors
- Strict mode enabled

### ✅ Production Build
```
npm run build
```
**Status**: ✅ PASSED
- Build time: 23.33s
- Vite 5.4.21
- No compilation errors
- All modules transform successfully
- Output: Ready for production deployment

---

## Backend (Java) - Drill Project Root

### ✅ Maven Checkstyle
```
mvn checkstyle:check -DskipTests
```
**Status**: ✅ PASSED (0 violations across all 59 modules)

**Modules Checked**:
- Drill Core (protocol, common, logical plan)
- Drill Exec (Java execution engine, memory, RPC, vectors)
- All 50+ contrib modules:
- Storage: JDBC, MongoDB, HBase, Cassandra, Elasticsearch, Splunk, GoogleSheets, Phoenix, Druid, Kudu, HTTP, Kafka, Hive, etc.
- Formats: XML, Syslog, Httpd/Nginx Logs, PDF, HDF5, SPSS, SAS, LTSV, Image, Pcap-NG, Esri, Excel, MS Access, Log Regex, Iceberg, Paimon, Delta Lake
- Utilities, UDFs, Packaging
- Metadata (Iceberg, Mongo, RDBMS)
- JDBC Driver
- On-YARN
- Distribution Assembly

**Build Time**: 7.857s

### ✅ Maven Clean Build
```
mvn clean
```
**Status**: ✅ PASSED (59/59 modules)

---

## Summary

| Tool | Status | Details |
|------|--------|---------|
| ESLint | ✅ PASS | 0 warnings, 0 errors (strict mode) |
| TypeScript | ✅ PASS | 0 type errors |
| Vite Build | ✅ PASS | Production ready |
| Maven Checkstyle | ✅ PASS | 0 violations in 59 modules |

### Code Quality Metrics
- **Frontend**: Fully type-safe, no linting issues
- **Backend**: All code follows Checkstyle guidelines (Google Java Style Guide)
- **Overall**: Production-ready code quality

---

## Recent Changes Verified
All recent changes related to tab selection UX and close tab improvements have passed linting:
- ✅ `src/pages/SqlLabPage.tsx` - Tab selection and close handler logic
- ✅ `src/hooks/useTabPersistence.ts` - Tab persistence with empty tab filtering
- ✅ `src/components/schema-explorer/SchemaExplorer.tsx` - Query navigator integration
- ✅ `src/components/schema-explorer/QueryNavigator.tsx` - Query selection UI

All changes are clean, type-safe, and follow project conventions.
1 change: 1 addition & 0 deletions TODO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
4. Force Directed Graph Visualization
53 changes: 53 additions & 0 deletions build-frontend.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Build the SQL Lab frontend and update the distribution.
# Usage: ./build-frontend.sh

set -e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
WEBAPP_DIR="$SCRIPT_DIR/exec/java-exec/src/main/resources/webapp"
DIST_BASE="$SCRIPT_DIR/distribution/target"

echo "=== Building SQL Lab frontend ==="
cd "$WEBAPP_DIR"
npm run build

echo ""
echo "=== Building java-exec module ==="
cd "$SCRIPT_DIR"
mvn package -pl exec/java-exec -DskipTests -Dcheckstyle.skip=true -q

# Find the distribution directory and copy the jar
DIST_DIR=$(find "$DIST_BASE" -name "jars" -type d 2>/dev/null | head -1)
if [ -n "$DIST_DIR" ]; then
echo ""
echo "=== Copying jar to distribution ==="
cp "$SCRIPT_DIR/exec/java-exec/target/drill-java-exec-"*"-SNAPSHOT.jar" "$DIST_DIR/"
echo "Updated: $DIST_DIR/"
else
echo ""
echo "WARNING: Distribution directory not found under $DIST_BASE"
echo "Run a full 'mvn package' first to create the distribution, or copy the jar manually:"
echo " cp exec/java-exec/target/drill-java-exec-*-SNAPSHOT.jar <drill-distribution>/jars/"
fi

echo ""
echo "=== Done! Restart Drill and hard-refresh your browser (Cmd+Shift+R) ==="
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,13 @@ public List<String> extensions() {
return this.extensions;
}

/**
* Standard getter for extensions, consistent with other FormatPluginConfig implementations.
*/
public List<String> getExtensions() {
return this.extensions;
}

public boolean combinePages() {
return this.combinePages;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,8 +161,8 @@ public void close() {

/**
* This function processes the XML elements. This function stops reading when the
* limit (if any) which came from the query has been reached or the Iterator runs out of
* elements.
* limit (if any) which came from the query has been reached, a complete row has been
* read, or the Iterator runs out of elements.
* @return True if there are more elements to parse, false if not
*/
private boolean processElements() {
Expand Down Expand Up @@ -197,6 +197,13 @@ private boolean processElements() {

// Process the event
processEvent(currentEvent, lastEvent, reader.peek());

// After completing a row, return to let next() check batch capacity.
// This prevents batch overflow errors that occur when rows accumulate
// beyond what the batch can hold without the isFull() check running.
if (currentState == xmlState.ROW_ENDED) {
return true;
}
} catch (XMLStreamException e) {
throw UserException
.dataReadError(e)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.testcontainers.DockerClientFactory;
import org.testcontainers.containers.CassandraContainer;

@Category(SlowTest.class)
Expand All @@ -42,6 +43,10 @@ public class TestCassandraSuite extends BaseTest {

@BeforeClass
public static void initCassandra() {
org.junit.Assume.assumeTrue(
"Docker is not available, skipping container tests",
DockerClientFactory.instance().isDockerAvailable()
);
synchronized (TestCassandraSuite.class) {
if (initCount.get() == 0) {
startCassandra();
Expand Down
Loading
Loading