Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
277 commits
Select commit Hold shift + click to select a range
db29bc2
Add validation for duplicate workspace names
cgivre Feb 11, 2026
4631bd2
Fix workspace initialization on first mount
cgivre Feb 11, 2026
83df832
More improvements
cgivre Feb 12, 2026
81ca850
Implement column menus for ResultsGrid with comprehensive feature set
cgivre Feb 12, 2026
3628ca8
Various improvements
cgivre Feb 12, 2026
64c116b
Dark mode:
cgivre Feb 12, 2026
96b8417
Minor bug fix
cgivre Feb 12, 2026
e6c6c81
Fix state
cgivre Feb 13, 2026
aab1d99
Fix Vault Unit Tests
cgivre Feb 13, 2026
2b905f8
Fix Docker based unit tests
cgivre Feb 13, 2026
c51d54c
Visualization improvements
cgivre Feb 13, 2026
ac0a09d
Link fix
cgivre Feb 13, 2026
e7a4fce
Various fixes
cgivre Feb 18, 2026
bc33172
Fixing time grain issues
cgivre Feb 18, 2026
35231eb
WIP Time Grain
cgivre Feb 18, 2026
7dda8ea
Time grain working
cgivre Feb 18, 2026
ea2971b
Filter improvements and hardening.
cgivre Feb 19, 2026
35ed9ca
Refactor SQL generator to use Java port of SQL Glot
cgivre Feb 23, 2026
7cecd07
Fix checkstyles
cgivre Feb 23, 2026
0ba27f9
Add trendlines
cgivre Feb 25, 2026
4ce9e66
Profile page improvements
cgivre Feb 26, 2026
e372572
Implement Profile Detail Page — Dashboard-style redesign with AI advisor
cgivre Feb 26, 2026
af22d45
Improve Profile Detail Page layout: add query display and evenly-spac…
cgivre Feb 26, 2026
3dd6fb4
Fix AI advisor context serialization error
cgivre Feb 26, 2026
269f118
Add credential redaction to prevent sensitive data exposure to AI
cgivre Feb 26, 2026
1a73b93
Improve CSRF token handling for hosted deployments
cgivre Feb 26, 2026
13ba7df
Revert "Improve CSRF token handling for hosted deployments"
cgivre Feb 26, 2026
0a084aa
Added new visualizations
cgivre Mar 2, 2026
0a1a3ce
Fix streaming UI bug
cgivre Mar 2, 2026
baf0754
WIP
cgivre Mar 6, 2026
8f2b744
Size improvements
cgivre Mar 6, 2026
f94893e
UI Improvements
cgivre Mar 8, 2026
2e33c0c
More data sources
cgivre Mar 9, 2026
065a4e4
More data sources
cgivre Mar 9, 2026
04d86f1
Schema tree fixes
cgivre Mar 9, 2026
a695ff6
Fix Metrics and Profiles Pages
cgivre Mar 10, 2026
c986312
Schema tree fixes
cgivre Mar 11, 2026
c486e35
Updated gitignore
cgivre Mar 11, 2026
717c164
Fix CodeQL issues
cgivre Mar 11, 2026
154200c
Add backend result cache service with security hardening
cgivre Mar 12, 2026
b875715
Add frontend memory optimization with LRU cache and backend integration
cgivre Mar 12, 2026
8b417fa
Add server-side pagination for large result sets
cgivre Mar 12, 2026
92a232b
Remove unused act import from useServerPagination test
cgivre Mar 12, 2026
df5c5f2
Fix CodeQL
cgivre Mar 12, 2026
aa3da0f
Fix build errors
cgivre Mar 12, 2026
ce69214
PDF Fix
cgivre Mar 12, 2026
31503f6
Various updates
cgivre Mar 12, 2026
b3f8998
Added sys project
cgivre Mar 12, 2026
01f49b4
Fix unit tests
cgivre Mar 13, 2026
f8d0408
Fix CodeQL issues
cgivre Mar 13, 2026
95179c7
Various AI improvements
cgivre Mar 16, 2026
2c3906e
Various fixes
cgivre Mar 17, 2026
c995ace
Project refinements
cgivre Mar 18, 2026
1ed8fe2
Fix Checkstyle
cgivre Mar 18, 2026
1c68a4a
Fix schema search
cgivre Mar 18, 2026
0e5ad97
Fix query tab
cgivre Mar 18, 2026
1e44103
Scheduler in progress
cgivre Mar 19, 2026
e0a59e3
Scheduler improvements
cgivre Mar 20, 2026
61e2061
Various fixes
cgivre Mar 22, 2026
ee11e7d
Improve SqlLab layout and AI suggestions
cgivre Mar 23, 2026
4f3db52
Fix: Add backtick escaping to INFORMATION_SCHEMA.COLUMNS query
cgivre Mar 24, 2026
45c72b4
Fix: Add missing backticks to INFORMATION_SCHEMA.COLUMNS and simplify…
cgivre Mar 24, 2026
a06e263
Fix: Extract fetchColumnsForTable private helper to fix getSchemaTree
cgivre Mar 24, 2026
4eeda56
Fix: Use fresh WebUserConnection for each metadata query
cgivre Mar 24, 2026
e16730e
Fix: Correct WebUserConnection constructor call
cgivre Mar 24, 2026
3d8170b
Refactor: Add boolean parameter to executeQuery for connection reuse …
cgivre Mar 24, 2026
bcb796d
Improve AI Query Suggestions: format, name tabs, remove panel expansion
cgivre Mar 24, 2026
1cf6c67
Fix: Remove unused Space import from QuerySuggestions
cgivre Mar 24, 2026
4c98a0b
Fix: Change allValidTables from let to const
cgivre Mar 24, 2026
47181a0
Fix: Pass suggestion title to parent component in AiAssistantModal
cgivre Mar 24, 2026
e04d3ac
Implement hierarchical geographic map support with lazy-loading
cgivre Mar 24, 2026
4a12a79
Update TODO: mark Choropleth Maps as complete
cgivre Mar 24, 2026
da98c2a
Fix project data loading: load saved queries and improve cache handling
cgivre Mar 24, 2026
3855a1c
Add US ZIP Code geographic map support
cgivre Mar 24, 2026
b55a3c6
Clean up: remove Python download scripts, fix linting
cgivre Mar 24, 2026
e561a2e
Fix: replace dynamic import with static import in SqlLabPage
cgivre Mar 24, 2026
702b743
Remove broken us-zipcodes placeholder
cgivre Mar 24, 2026
ee269d0
Add US ZIP Code support with DC data + full US instructions
cgivre Mar 24, 2026
8843008
Add .gitignore for large GeoJSON files + setup script
cgivre Mar 24, 2026
0b4f7c1
Add debugging logs for choropleth map rendering and GeoJSON loading
cgivre Mar 24, 2026
68ac5ed
Add state-level ZIP code support to GeoMapRegistry and create Python …
cgivre Mar 24, 2026
5971b68
Add multi-select UI for state-level ZIP code scopes
cgivre Mar 24, 2026
58fd761
Fix: Include 'US ZIP Codes (by State)' group in GEO_SCOPE_OPTIONS
cgivre Mar 24, 2026
496f9ba
Add merged US ZIP codes GeoJSON (4,388 ZIP codes from 14 states)
cgivre Mar 25, 2026
2fa1530
Improve ZIP code download: minification + 5-minute timeout
cgivre Mar 25, 2026
486286a
Add polygon simplification to reduce file sizes by 67%
cgivre Mar 25, 2026
5337ee4
Optimize ZIP code performance: use state-specific files instead of me…
cgivre Mar 25, 2026
a40e127
Replace NaN with 0 in choropleth visualization data
cgivre Mar 25, 2026
7f30aca
Convert us-zipcodes from GeoJSON to TopoJSON for 76% size reduction
cgivre Mar 25, 2026
54fc1f3
Add @types/topojson-client for TypeScript support
cgivre Mar 25, 2026
c85c6f6
Fix ESLint errors: remove self-assignments and any type annotation
cgivre Mar 25, 2026
bdc4db3
Add Apache License headers to scripts and data files
cgivre Mar 25, 2026
fce5850
Implement choropleth zoom and center configuration
cgivre Mar 25, 2026
c3de615
Allow capturing choropleth map view from interactive preview
cgivre Mar 25, 2026
8e8fda8
Add 'Manage Data Sources' to admin menu
cgivre Mar 25, 2026
3874233
Fix ref type annotations in map capture feature
cgivre Mar 25, 2026
7c1b681
Fix route parameter collision between project and dashboard IDs
cgivre Mar 25, 2026
99ace80
Fix: prevent first saved query from loading into new tabs
cgivre Mar 25, 2026
d07257b
Fix: preserve lock state and visualization IDs when duplicating tabs
cgivre Mar 25, 2026
bf5151a
Initialize lock and viz fields for new tabs
cgivre Mar 25, 2026
01d3eba
Add sort direction controls to metric and categorical visualizations
cgivre Mar 25, 2026
9aed5ec
Add number formatting, labels, and sparkline data limiting to metric …
cgivre Mar 25, 2026
80de71c
Add currency formatting and consolidate metric visualization options …
cgivre Mar 25, 2026
462d0f6
Move Sort Direction control to appear right after Order By for bigNumber
cgivre Mar 25, 2026
eab86e9
Fix AI Q&A panel data access across dashboard tabs
cgivre Mar 25, 2026
0f4b850
Include SQL queries in AI Q&A dashboard context
cgivre Mar 25, 2026
8de15db
Instruct AI to keep dashboard Q&A responses brief
cgivre Mar 25, 2026
d40c956
Make AI Q&A instruction explicit: use only dashboard data, no databas…
cgivre Mar 25, 2026
47d6dea
Fix AI Q&A to use only dashboard data, add clear button
cgivre Mar 25, 2026
2a7d8c0
Fix JDBC Config
cgivre Apr 6, 2026
fd912d7
Fix license
cgivre Apr 6, 2026
a5b343a
Various fixes
cgivre Apr 10, 2026
e6b338b
Enforce per-user authorization on schedule endpoints
cgivre Apr 24, 2026
8343a7d
Various fixes
cgivre May 1, 2026
7fcf0bd
Fix linting
cgivre May 1, 2026
62223ee
Fix CommandPalette test for Spotlight rebuild
cgivre May 1, 2026
a1e32a9
More Apple Design
cgivre May 5, 2026
a17d3be
Add Format SQL, Add-to-dashboard, column-dep badge
cgivre May 5, 2026
9ddf50b
Move schema browser to a dedicated left rail
cgivre May 6, 2026
82c0d05
Double-click table opens a new SQL tab
cgivre May 6, 2026
6237cbb
More progress
cgivre May 18, 2026
48f54d3
Additional Updates
cgivre Jun 10, 2026
4fa4da3
Remove stale code
cgivre Jun 16, 2026
21e9a4a
Various minor fixes
cgivre Jun 17, 2026
697cbc9
Fix unit tests
cgivre Jun 25, 2026
2977c7b
Add enterprise AI provider support for internal models
cgivre Jul 3, 2026
add7d66
Complete Phase 2: Implement proxy, SSL/TLS, custom headers with compr…
cgivre Jul 3, 2026
ef54f92
Update documentation with enterprise AI provider support
cgivre Jul 3, 2026
7c64877
Fix missing assertTrue import in test files
cgivre Jul 3, 2026
e9b345f
Lint fixees
cgivre Jul 3, 2026
47c667a
Fix flaky Splunk tests
cgivre Jul 9, 2026
9ae0f98
Validate AI endpoint scheme and dedupe endpoint normalization
cgivre Jul 9, 2026
bf90d08
Wait for Splunk ansible-complete log instead of HTTP probe
cgivre Jul 10, 2026
d38bdd1
Added OAuth for AI
cgivre Jul 10, 2026
f1e22c4
Fix SSL issues
cgivre Jul 10, 2026
f366e83
Connect Splunk tests over HTTPS and pin the container image
cgivre Jul 15, 2026
bd1cc36
Bypass the JVM global proxy for AI endpoints and accept PEM truststores
cgivre Jul 15, 2026
7b9ff0d
Add design spec for Prospector logging and project context
cgivre Jul 15, 2026
eb6b020
Add implementation plan for Prospector interaction logging
cgivre Jul 15, 2026
5929aa4
Enforce AI feature tagging with the type system rather than a grep test
cgivre Jul 15, 2026
5756e2b
Separate AI event construction from logging and fix success flag
cgivre Jul 15, 2026
55f01b1
Read the originating feature from ChatContext for AI analytics
cgivre Jul 15, 2026
8cd7a8a
Require an originating feature on every AI call
cgivre Jul 15, 2026
ca2d73e
Correct AiLogsResources path and registration in the logging plan
cgivre Jul 15, 2026
ae9f1fd
Remove client-side AI logging in favour of server events
cgivre Jul 15, 2026
a50ce23
Record AI setup failures and config-test calls
cgivre Jul 15, 2026
aae6428
Fix AiEvent.user null regression from commit 4ce54133d
cgivre Jul 15, 2026
1f17871
Distinguish unconfigured AI analytics from no usage
cgivre Jul 15, 2026
556d006
Document the AI analytics feature vocabulary
cgivre Jul 15, 2026
9b99034
Record failed AI config tests as failures, not successes
cgivre Jul 15, 2026
1e8c25e
Refresh AiEvent javadoc and cover resolveUser's empty-name branch
cgivre Jul 15, 2026
9bca791
Require event log matches to be files, not directories
cgivre Jul 15, 2026
af70840
Label every AI feature and fix the idle-dashboard banner
cgivre Jul 15, 2026
d90429a
Replace feature-slug source scanner with type-level enforcement
cgivre Jul 15, 2026
fa48bef
Add AI-created visualizations to the active project
cgivre Jul 15, 2026
54d346a
Accept projectId and notebook context instead of rejecting the chat
cgivre Jul 15, 2026
4b68ead
Add implementation plan for Prospector project context
cgivre Jul 15, 2026
215af14
Render the active project's metadata for the AI system prompt
cgivre Jul 15, 2026
41ac46f
Inject the active project's context into the Prospector prompt
cgivre Jul 15, 2026
16e9746
Add positive-path test proving project context reaches the system prompt
cgivre Jul 15, 2026
f1361bc
Add a get_project_docs tool for on-demand project documentation
cgivre Jul 15, 2026
f118a75
Tighten get_project_docs no-active-project test assertion
cgivre Jul 15, 2026
f111604
Carry notebook context to the model and honour sendDataToAi in tools
cgivre Jul 15, 2026
54386f5
Give global Prospector chat the active project from the route
cgivre Jul 15, 2026
9306205
Document Prospector's project context and get_project_docs
cgivre Jul 15, 2026
084b803
Authorize project context injected into the Prospector system prompt
cgivre Jul 15, 2026
cee0a1f
Read sendDataToAi from the server in useProspector so no caller can f…
cgivre Jul 15, 2026
e980709
Pin sendDataToAi fail-closed behavior with a shared hook and test
cgivre Jul 15, 2026
dc6da10
Fix prospector bugs
cgivre Jul 15, 2026
f855081
Bug fix
cgivre Jul 16, 2026
c807368
Fix unit test
cgivre Jul 16, 2026
5c72e24
Fix minor error
cgivre Jul 16, 2026
487da2b
Add design spec for saving queries as views and materialized views
cgivre Jul 15, 2026
64b4c8f
Correct view schema eligibility to a dedicated view-targets endpoint
cgivre Jul 16, 2026
16485b4
Add implementation plan for saving queries as views
cgivre Jul 16, 2026
6a5d57e
Test the view logic instead of relying on manual checks
cgivre Jul 16, 2026
61d1c44
Add view-targets endpoint listing schemas that can hold a view
cgivre Jul 16, 2026
23de968
Add pure SQL helpers for building view DDL
cgivre Jul 16, 2026
86752b4
Add view target API and widen table and dataset type unions
cgivre Jul 16, 2026
68ed768
Add view and materialized view modes to the save dialog
cgivre Jul 16, 2026
feb5fcf
Guard SaveQueryDialog against premature view saves and stale mode
cgivre Jul 16, 2026
6e203f4
Fix vacuous Bug 1 test in SaveQueryDialog to actually exercise the vi…
cgivre Jul 16, 2026
1b8b87a
Create views and materialized views from the save dialog
cgivre Jul 16, 2026
af71079
Give views and materialized views distinct icons in the schema tree
cgivre Jul 17, 2026
87147ad
Reload the schema tree after creating a view
cgivre Jul 17, 2026
ed0ecbd
Recognize view and materialized_view datasets in project schema filte…
cgivre Jul 17, 2026
ab49311
Add regression test for view/materialized_view in dataset allow list
cgivre Jul 17, 2026
a21dac4
Fix flaky SaveQueryDialog test that timed out under CI load
cgivre Jul 17, 2026
d7f3432
Extend BaseTest in TestViewTargets
cgivre Jul 17, 2026
809fab5
Add design spec for project schema cache
cgivre Jul 27, 2026
bb842cd
Scope schema cache per-project for access control; add table-type scan
cgivre Jul 27, 2026
0b6a24a
Refine schema cache to synchronous scan model (no background executor)
cgivre Jul 27, 2026
2cc9cea
Add implementation plan for project schema cache
cgivre Jul 27, 2026
3e2e4e0
Add ProjectSchemaCache store and scan/read/peek logic
cgivre Jul 27, 2026
3acc493
Fix ProjectSchemaCache staleness reset, singleton, and case handling
cgivre Jul 27, 2026
ca504c3
Guard removeProject against missing keys in ProjectSchemaCache
cgivre Jul 27, 2026
c87fb53
Scan project schemas on dataset add; add schema-cache refresh/inspect…
cgivre Jul 27, 2026
a27b657
Serve project-scoped schema metadata from cache in MetadataResources
cgivre Jul 27, 2026
b51ddff
Inject cached project schema into Prospector system prompt
cgivre Jul 27, 2026
af9a646
Cap the schema-cache block in the Prospector system prompt
cgivre Jul 27, 2026
77413d6
Add projectId params and schema-cache client functions to webapp API
cgivre Jul 27, 2026
c7d7c01
Pass projectId to tree and autocomplete metadata calls for cache scoping
cgivre Jul 27, 2026
094a9fa
Add schema-cache refresh button and last-scanned indicator to project…
cgivre Jul 27, 2026
17f0117
Document project schema cache
cgivre Jul 27, 2026
b3f6882
Collapse divergent resolveUser and add canRead-deny cache tests
cgivre Jul 27, 2026
f20bc6a
Fix minor bugs
cgivre Jul 28, 2026
5ea5745
Minor fixes
cgivre Jul 28, 2026
916ebd0
Fix dashboards created in a project being orphaned and unopenable
cgivre Jul 28, 2026
7a6c320
Make TestSpaServletFilter extend BaseTest
cgivre Jul 30, 2026
b889fa3
Fix Schema Tree
cgivre Aug 10, 2026
e1a91fe
Add schema sampling for dynamic-schema tables
cgivre Aug 11, 2026
fbcc239
Apply gitignore
cgivre Aug 21, 2026
ee5f002
Render markdown tables in AI-facing surfaces
cgivre Aug 30, 2026
798da23
Restore localStorage in the jsdom test environment
cgivre Aug 30, 2026
ea7e50a
Expose SQL function signatures and descriptions to the AI assistant
cgivre Aug 30, 2026
774589d
Disable the Run button until the editor holds a query
cgivre Aug 30, 2026
eff95ce
Add tab persistence design and implementation plan
cgivre Aug 30, 2026
ea1e9db
Add per-user query tab store
cgivre Aug 30, 2026
708088b
Add REST endpoints for query tabs
cgivre Aug 30, 2026
4c42632
Add tab API client
cgivre Aug 30, 2026
28bd71e
Use UUIDs for tab ids and migrate legacy ids
cgivre Aug 30, 2026
399175c
Add tab promotion rule
cgivre Aug 30, 2026
5d86dab
Add tab reconciliation
cgivre Aug 30, 2026
1deecdc
Sync promoted tabs to the server
cgivre Aug 30, 2026
8ededf0
Hide tabs on close instead of destroying them
cgivre Aug 30, 2026
868279b
List project tabs in the sidebar tree
cgivre Aug 30, 2026
40c3e00
Record the originating tab on a published query API
cgivre Aug 30, 2026
810d465
Warn about dependants before deleting a tab
cgivre Aug 30, 2026
8ab7454
Scope Prospector conversations to the active tab
cgivre Aug 30, 2026
1b611ba
Persist Prospector conversations per tab
cgivre Aug 30, 2026
6a09350
Document tab persistence, hide/delete and per-tab conversations
cgivre Aug 30, 2026
73add48
Sync Prospector conversations to the server with their tab
cgivre Aug 30, 2026
9d59e04
Fix tabs not appearing in the project tree
cgivre Aug 31, 2026
cef974c
Stop the assistant rediscovering schema it already has
cgivre Aug 31, 2026
cb699d1
Fix tab writes failing on filesystem-backed stores
cgivre Aug 31, 2026
58238d9
Show project tabs as a collapsible group with a count
cgivre Aug 31, 2026
8fecf1e
Make tab delete and rename update the sidebar
cgivre Aug 31, 2026
b1138c4
Disable tab delete when only one tab remains
cgivre Aug 31, 2026
eb45cba
Fix blank editor when every restored tab is hidden
cgivre Aug 31, 2026
cac8766
Add geospatial filter builder design and plan
cgivre Aug 31, 2026
56e5a94
Rework geo filter builder as an authoring tool
cgivre Aug 31, 2026
35b2ce7
Detect coordinate columns in query results
cgivre Aug 31, 2026
f9e04f2
Add UTM zone selection for metric distance filters
cgivre Aug 31, 2026
6bf3ad5
Generate spatial filter SQL from drawn geometry
cgivre Aug 31, 2026
56b5824
Add map tile configuration
cgivre Aug 31, 2026
95e0f85
Add map config API client
cgivre Aug 31, 2026
cb4b185
Add an OpenLayers map canvas with draw tools
cgivre Aug 31, 2026
7585b68
Add a Map tab with a geospatial filter builder
cgivre Aug 31, 2026
d78eeea
Skip the frontend build in CI test jobs
cgivre Aug 31, 2026
dd37032
Shard CI tests and raise the surefire fork count
cgivre Aug 31, 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
  •  
  •  
  •  
42 changes: 40 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ on: [push, pull_request]

jobs:
build:
name: Main Build
name: Main Build (java ${{ matrix.java }}, shard ${{ matrix.shard }})
runs-on: ubuntu-latest
if: github.repository == 'apache/drill'
timeout-minutes: 150
Expand All @@ -36,6 +36,12 @@ jobs:
# Java versions to run unit tests (Jetty 12 requires Java 17+)
java: [ '17', '21', '25' ]
profile: ['default-hadoop']
# exec/java-exec holds ~31 minutes of the suite in 577 classes, which dominates
# the build. Splitting it three ways by class name brings the longest shard to
# about 11 minutes. Boundaries were chosen from measured per-class times; the
# patterns are exhaustive, so a newly added test always lands in exactly one
# shard rather than being silently skipped.
shard: [ '1', '2', '3' ]
fail-fast: false
steps:
- name: Checkout
Expand All @@ -57,9 +63,41 @@ jobs:
mkswap /tmp/swapfile
swapon /tmp/swapfile
"
# Which slice of the suite this job runs. The patterns are exhaustive: every
# The patterns are spelled out one prefix at a time because surefire does NOT
# support character-class globs: -Dtest='Test[A-F]*' silently matches nothing and
# the build passes green having run no tests. Only '*' wildcards and comma
# separated lists work, so each letter gets its own entry, in both cases
# (TestforBaseTestInheritance has a lowercase f).
#
# Shard 3 repeats surefire's other default includes (*Test, *Tests, *TestCase) to
# pick up classes not named Test*. Verified exhaustive against all 894 test
# classes in the repo. TestFrameworkTest matches shards 1 and 3 and runs twice —
# harmless, and far safer than a gap that skips tests without saying so.
- name: Select test shard
id: shard
run: |
case "${{ matrix.shard }}" in
1) echo 'pattern=TestA*,Testa*,TestB*,Testb*,TestC*,Testc*,TestD*,Testd*,TestE*,Teste*,TestF*,Testf*' >> "$GITHUB_OUTPUT" ;;
2) echo 'pattern=TestG*,Testg*,TestH*,Testh*,TestI*,Testi*,TestJ*,Testj*,TestK*,Testk*,TestL*,Testl*,TestM*,Testm*,TestN*,Testn*,TestO*,Testo*,TestP*,Testp*' >> "$GITHUB_OUTPUT" ;;
3) echo 'pattern=TestQ*,Testq*,TestR*,Testr*,TestS*,Tests*,TestT*,Testt*,TestU*,Testu*,TestV*,Testv*,TestW*,Testw*,TestX*,Testx*,TestY*,Testy*,TestZ*,Testz*,*Test,*Tests,*TestCase,Test0*,Test1*,Test2*,Test3*,Test4*,Test5*,Test6*,Test7*,Test8*,Test9*,Test_*' >> "$GITHUB_OUTPUT" ;;
esac

# -DskipFrontend: no Java test uses webapp/dist, and building it here would
# download Node and run npm ci once per matrix entry. The SQL Lab frontend is
# built, type-checked, linted and tested by the sqllab-frontend workflow.
#
# -DforkCount=2: several of the slowest classes are wall-clock bound rather than
# CPU bound — TestTimedCallable spends 105 seconds asleep, and the RPC, SSL and
# graceful-shutdown tests wait on timeouts — so a second fork overlaps that idle
# time at little extra cost. Raise further only with memory headroom: the vector
# tests fail with OutOfMemoryException under pressure.
- name: Build and test
run: |
mvn -P${{ matrix.profile }} install --batch-mode --no-transfer-progress \
-DskipFrontend=true -DforkCount=2 \
-Dsurefire.failIfNoSpecifiedTests=false \
-Dtest='${{ steps.shard.outputs.pattern }}' \
-Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.httpconnectionManager.ttlSeconds=120
- name: Remove swap space
run : |
Expand Down Expand Up @@ -107,7 +145,7 @@ jobs:
# Builds Drill project, performs license checkstyle goal and regenerates java and C++ protobuf files
- name: Build
run: |
MAVEN_OPTS="-Xms1G -Xmx1G" mvn install -Drat.skip=false -Dlicense.skip=false --batch-mode --no-transfer-progress -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -DskipTests=true -Dmaven.javadoc.skip=true -Dmaven.source.skip=true && \
MAVEN_OPTS="-Xms1G -Xmx1G" mvn install -Drat.skip=false -Dlicense.skip=false --batch-mode --no-transfer-progress -DskipFrontend=true -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -DskipTests=true -Dmaven.javadoc.skip=true -Dmaven.source.skip=true && \
pushd protocol && mvn process-sources -P proto-compile && popd && \
mkdir contrib/native/client/build && pushd contrib/native/client/build && cmake -G "Unix Makefiles" .. && make cpProtobufs && popd; \
# Checks whether project files weren't changed after regenerating protobufs
Expand Down
63 changes: 63 additions & 0 deletions .github/workflows/sqllab-frontend.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#
# 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

# No separate type-check step: "npm run build" is "tsc && vite build", so the
# build below already fails on a type error.
- 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_*
70 changes: 70 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# 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) |
| **Tab persistence & project tree** — server-side tabs, hide vs delete, per-tab Prospector | [`docs/dev/TabPersistence.md`](docs/dev/TabPersistence.md) |
| **Geospatial filter builder** — draw shapes on a map, push into SQL as ST_ predicates | [`docs/dev/GeoFilterBuilder.md`](docs/dev/GeoFilterBuilder.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) ==="
Loading
Loading