{"id":39511956,"url":"https://github.com/krpors/gimlet","last_synced_at":"2026-01-18T06:05:29.258Z","repository":{"id":41176226,"uuid":"114373363","full_name":"krpors/gimlet","owner":"krpors","description":"A JDBC-based database drill down utility.","archived":false,"fork":false,"pushed_at":"2023-12-11T16:19:56.000Z","size":871,"stargazers_count":32,"open_issues_count":8,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2023-12-11T17:33:55.652Z","etag":null,"topics":["drilldown","java","javafx","jdbc","jdbc-utilities","querying"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/krpors.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2017-12-15T13:25:31.000Z","updated_at":"2023-05-15T15:20:35.000Z","dependencies_parsed_at":"2023-12-11T17:43:33.520Z","dependency_job_id":null,"html_url":"https://github.com/krpors/gimlet","commit_stats":null,"previous_names":[],"tags_count":4,"template":null,"template_full_name":null,"purl":"pkg:github/krpors/gimlet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krpors%2Fgimlet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krpors%2Fgimlet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krpors%2Fgimlet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krpors%2Fgimlet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/krpors","download_url":"https://codeload.github.com/krpors/gimlet/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krpors%2Fgimlet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28531993,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["drilldown","java","javafx","jdbc","jdbc-utilities","querying"],"created_at":"2026-01-18T06:05:29.149Z","updated_at":"2026-01-18T06:05:29.249Z","avatar_url":"https://github.com/krpors.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Gimlet\n\nGImlet is an attempt to make a useful query application. Users can create their\nown predefined (parameterized) queries to run against a database. Following the\nresult set of that query, you can 'drill down' further into other tables by\neffectively executing a sub-query, based on the resultset of the previous query.\nIn a sense, it's a lazy query evaluator.\n\n#### Screenshots\n\nScreenshots speak louder when it comes to user interfaces:\n\n![Get an overview of all database objects.](https://i.imgur.com/AbcRMKh.png)\n👆 Loading database objects from a database. Red rows are the primary keys. Tabs can be\ngiven an explicit color as a hint of what database/environment you are connected\nto.\n\n![Plain SQL](https://i.imgur.com/2A2nnbi.png)\n👆 Plain SQL can be entered in the SQL tab. Selected rows can be copied into the\nclipboard.\n\n![Drilldown tab](https://i.imgur.com/II4ThcY.png)\n👆 Execute a configured child query, based on results from the previous (parent) query.\n\n![Query configuration](https://i.imgur.com/hPkhugT.png)\n👆 This screenshot shows the relationship between named parameters (`:ID`) and how the\nquery is completed using the result from the second row in the table (`13`). The actual\nquery which is executed by Gimlet will be\n\n```sql\nselect * from item where invoiceid = 13\n```\n\n## But why not just use JOINs?\n\nJoins are useful of course, but fail to display data properly when you have to\nfind specific information when there is more than 1 join. You could get double\ndata and things. Also, when there are N:M relations between tables, a drill-down\nfunctionality might come in handy. This tool attempts to make that drill down\nconfigurable.\n\n## Example\n\nGiven two tables:\n\n    CUSTOMER\n    -------------------------\n    ID    NAME    LASTNAME\n    1     A       Einstein\n    2     T       Raadt, de\n    3     G       Rossum, van\n    4     P       Fry\n\n\n    INVOICE\n    -------------------------\n    ID    CUSTOMER_ID\n    1     1\n    2     1\n    3     1\n    4     3\n    5     3\n    6     4\n\nIn Gimlet we can now define the following query tree:\n\n1. Select all customers: `select * from CUSTOMER`\n   1. Select invoices for customer: `select * from INVOICE where CUSTOMER_ID = :ID`\n\nThe `:ID` is crucial here: this is input from the column `ID` from the previous query.\n\n# Compiling and packaging\n\nThis codebase is targeted from Java 11 and onwards, and can be compiled with Maven 3.5+.\n\nAfter cloning the repository, just run\n\n    mvn clean install\n\nto compile the code. To create `.tar.gz` and `.zip` distribution:\n\n    mvn clean package assembly:single\n\nIn the `target` directory a file will be created, called `gimlet-$VERSION.tar.gz`.\nThe contents are as follows:\n\n    gimlet-$VERSION\n\t\tREADME.md       \u003c-- this file you're reading\n\t\tLICENSE         \u003c-- license file\n\t\t/bin/\n\t\t\tgimlet.sh   \u003c-- shell script for Linux\n\t\t\tgimlet.bat  \u003c-- batch file for Windows\n\t\t\tgimletw.bat \u003c-- batch file for Windows, without console\n\t\t/drivers/\n\t\t    (drop any JDBC driver JARs here)\n\t\t/lib/\n\t\t\t(all libraries requires to run the application)\n\n# Running from Maven\n\nTo directly run from within Maven, just run:\n\n    mvn exec:java\n\n# JDBC driver installation\n\nThe only thing required is that the necessary JARs are to be put on the classpath.\nIf you have a driver JAR, for example `ojdbc6.jar`, just drop it in the `./lib/`\nor `./drivers/` folder. When Gimlet is run the next time (using the run scripts),\nall JARs are added to the classpath, thus loading the JDBC driver automatically.\nIn the Alias editor dialog, the combobox *should* then list all available drivers.\n\n# Parameter formatting\n\nThere are multiple ways to configure parameters in a formatted query, and can be\nof influence for user input. Depending on the configuration, a `PreparedStatement`\nreceives a different type.\n\nParameter format | Parsing notes | UI element\n---------------- | ------------- | ----------\n`:ID` | Basic parameter input. Result will be given as a `java.lang.String` | Text field\n`:ID[STRING]` | Same as `:ID`, but more explicit. Rather redundant. | Text field\n`:ID[NUMBER]` | The given parameter will be given as a `java.lang.Number` into the statement. | Number text field\n`:ID[DATE]` | A `java.sql.Date` is used. | Date picker\n`:ID[DATETIME]` | A `java.sql.Timestamp` is used. | Date/time picker\n\nFor example, if a query is configured as follows:\n\n```sql\nselect * from some_table\nwhere\n    id         = :someId[NUMBER]\nand start_date \u003e :startDate[DATE]\nand click_time \u003c :clicketyTime[DATETIME]\nand user       = :userName[STRING]\n```\n\nand the query is directly executed, you are prompted with this screen:\n\n![image](http://i.imgur.com/bdV4fYQ.png)\n\n# TODOs and ideas\n\nA list of things to be done, or some ideas. Not in any particular order.\n\n#### Milestones for 1.1 release\n\n1. Recent queries: save them in different file.\n1. Multiple select, and multiple sub-query execution. For instance, select 4 rows, right\n   click and then select a sub query. This will result in 4 new tabs with results.\n\n#### Nice to haves\n\n1. Add some kind of list of known JDBC drivers + connection strings. This eases up the\n   initial setup of a JDBC connection.\n1. Help file/screen.\n\n1. Query wizard or something: start by a root query, execute sample query, then hit next\nto configure the next query, until finished, then a query tree is a result.\n1. Easier column selector (hide all/show all)\n1. Syntax highlighter?\n\n#### Code cleanups\n\n1. Fix the way the `QueryTree` and the backed `Query` object tree work?\n1. Moar Javadoc.\n\n# Notes\n\nThese are some notes about things used to help development of certain features.\n\n[Mimic network latency](https://wiki.linuxfoundation.org/networking/netem) using NetEm (`man netem`),\nusing the `tc` utility. This can be used to test connections such as longer roundtrips, connection\ntimeouts, interruptions, etc.\n\n[Icons](https://materialdesignicons.com/) used can be found here.\n\nMimic network cutoffs by using `socat` as a TCP proxy between Gimlet and\nthe target database host, for example\n\n    socat -x -v tcp4-listen:1521,bind=127.0.0.1,reuseaddr,fork tcp4:targetmachine:1521 2\u003e lol.txt\n\nThen establish a connection to `localhost:1521` and interrupt using `^C`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrpors%2Fgimlet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkrpors%2Fgimlet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrpors%2Fgimlet/lists"}