diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7853e8e8..7203a09a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.0 + rev: v0.6.1 hooks: - id: ruff-format - id: ruff diff --git a/CHANGELOG.md b/CHANGELOG.md index c374fe5c..273f3893 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Features + +- Harlequin's Data Catalog is now interactive! Adapters can define interactions on catalog nodes, which can be selected via a context menu by right-clicking on nodes in the context menu or pressing `.` (this binding is configurable via the `data_catalog.show_context_menu` action). +- For adapters that support it, Harlequin's Data Catalog now loads lazily. This should dramatically improve Data Catalog load time for catalogs with thousands of nodes. The Data Catalog is no longer cached. +- The DuckDB and SQLite adapters now support lazy-loading and a wide range of interactions, including `use`ing database and schemas, previewing data, dropping objects, and showing DDL for objects. + + ## [1.24.1] - 2024-09-25 ### Bug Fixes diff --git a/poetry.lock b/poetry.lock index e25b3b5b..2c6db418 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2422,64 +2422,6 @@ files = [ {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] -[[package]] -name = "pandas" -version = "2.1.0" -description = "Powerful data structures for data analysis, time series, and statistics" -optional = true -python-versions = ">=3.9" -files = [ - {file = "pandas-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:40dd20439ff94f1b2ed55b393ecee9cb6f3b08104c2c40b0cb7186a2f0046242"}, - {file = "pandas-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d4f38e4fedeba580285eaac7ede4f686c6701a9e618d8a857b138a126d067f2f"}, - {file = "pandas-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e6a0fe052cf27ceb29be9429428b4918f3740e37ff185658f40d8702f0b3e09"}, - {file = "pandas-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d81e1813191070440d4c7a413cb673052b3b4a984ffd86b8dd468c45742d3cc"}, - {file = "pandas-2.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eb20252720b1cc1b7d0b2879ffc7e0542dd568f24d7c4b2347cb035206936421"}, - {file = "pandas-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:38f74ef7ebc0ffb43b3d633e23d74882bce7e27bfa09607f3c5d3e03ffd9a4a5"}, - {file = "pandas-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cda72cc8c4761c8f1d97b169661f23a86b16fdb240bdc341173aee17e4d6cedd"}, - {file = "pandas-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d97daeac0db8c993420b10da4f5f5b39b01fc9ca689a17844e07c0a35ac96b4b"}, - {file = "pandas-2.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8c58b1113892e0c8078f006a167cc210a92bdae23322bb4614f2f0b7a4b510f"}, - {file = "pandas-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:629124923bcf798965b054a540f9ccdfd60f71361255c81fa1ecd94a904b9dd3"}, - {file = "pandas-2.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:70cf866af3ab346a10debba8ea78077cf3a8cd14bd5e4bed3d41555a3280041c"}, - {file = "pandas-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:d53c8c1001f6a192ff1de1efe03b31a423d0eee2e9e855e69d004308e046e694"}, - {file = "pandas-2.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86f100b3876b8c6d1a2c66207288ead435dc71041ee4aea789e55ef0e06408cb"}, - {file = "pandas-2.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28f330845ad21c11db51e02d8d69acc9035edfd1116926ff7245c7215db57957"}, - {file = "pandas-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9a6ccf0963db88f9b12df6720e55f337447aea217f426a22d71f4213a3099a6"}, - {file = "pandas-2.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99e678180bc59b0c9443314297bddce4ad35727a1a2656dbe585fd78710b3b9"}, - {file = "pandas-2.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b31da36d376d50a1a492efb18097b9101bdbd8b3fbb3f49006e02d4495d4c644"}, - {file = "pandas-2.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0164b85937707ec7f70b34a6c3a578dbf0f50787f910f21ca3b26a7fd3363437"}, - {file = "pandas-2.1.0.tar.gz", hash = "sha256:62c24c7fc59e42b775ce0679cfa7b14a5f9bfb7643cfbe708c960699e05fb918"}, -] - -[package.dependencies] -numpy = {version = ">=1.23.2", markers = "python_version >= \"3.11\""} -python-dateutil = ">=2.8.2" -pytz = ">=2020.1" -tzdata = ">=2022.1" - -[package.extras] -all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] -aws = ["s3fs (>=2022.05.0)"] -clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] -compression = ["zstandard (>=0.17.0)"] -computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] -consortium-standard = ["dataframe-api-compat (>=0.1.7)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] -feather = ["pyarrow (>=7.0.0)"] -fss = ["fsspec (>=2022.05.0)"] -gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] -hdf5 = ["tables (>=3.7.0)"] -html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] -mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] -parquet = ["pyarrow (>=7.0.0)"] -performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] -plot = ["matplotlib (>=3.6.1)"] -postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] -spss = ["pyreadstat (>=1.1.5)"] -sql-other = ["SQLAlchemy (>=1.4.36)"] -test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.8.0)"] - [[package]] name = "pandas" version = "2.1.4" @@ -3047,7 +2989,7 @@ textual = ">=0.28.0" type = "git" url = "https://github.com/tconbeer/pytest-textual-snapshot.git" reference = "main" -resolved_reference = "f8f09d0a5fc375430859e3ee707c5da745c83368" +resolved_reference = "c470cccb2d8641046debe0569201d12d5b0bdf60" [[package]] name = "python-dateutil" diff --git a/src/harlequin/actions.py b/src/harlequin/actions.py index db5481f1..fe6e545f 100644 --- a/src/harlequin/actions.py +++ b/src/harlequin/actions.py @@ -15,6 +15,7 @@ ResultsTable, ResultsViewer, ) +from harlequin.components.data_catalog import ContextMenu if TYPE_CHECKING: from textual.widget import Widget @@ -225,6 +226,10 @@ class Action: "data_catalog.focus_results_viewer": Action( target=DataCatalog, action="focus_results_viewer" ), + "data_catalog.show_context_menu": Action( + target=HarlequinTree, action="show_context_menu", show=True + ), + "data_catalog.hide_context_menu": Action(target=ContextMenu, action="hide"), ####################################################### # ResultsViewer ACTIONS ####################################################### diff --git a/src/harlequin/app.py b/src/harlequin/app.py index 9ee6aee5..5aa3aeda 100644 --- a/src/harlequin/app.py +++ b/src/harlequin/app.py @@ -8,6 +8,7 @@ from pathlib import Path from typing import ( TYPE_CHECKING, + Callable, Dict, List, Optional, @@ -38,8 +39,16 @@ from harlequin.adapter import HarlequinAdapter, HarlequinCursor from harlequin.app_base import AppBase from harlequin.autocomplete import completer_factory +from harlequin.autocomplete.completers import MemberCompleter, WordCompleter from harlequin.bindings import bind -from harlequin.catalog import Catalog, NewCatalog +from harlequin.catalog import ( + Catalog, + CatalogItem, + Interaction, + NewCatalog, + NewCatalogItems, + TCatalogItem_contra, +) from harlequin.catalog_cache import ( CatalogCache, get_catalog_cache, @@ -57,7 +66,11 @@ RunQueryBar, export_callback, ) +from harlequin.components.confirm_modal import ConfirmModal +from harlequin.components.data_catalog import ContextMenu +from harlequin.components.data_catalog.tree import HarlequinTree from harlequin.copy_formats import HARLEQUIN_COPY_FORMATS, WINDOWS_COPY_FORMATS +from harlequin.driver import HarlequinDriver from harlequin.editor_cache import BufferState, Cache from harlequin.editor_cache import write_cache as write_editor_cache from harlequin.exception import ( @@ -147,6 +160,15 @@ def __init__(self, new_mode: HarlequinTransactionMode | None) -> None: self.new_mode = new_mode +class CompletersReady(Message): + def __init__( + self, word_completer: WordCompleter, member_completer: MemberCompleter + ) -> None: + super().__init__() + self.word_completer = word_completer + self.member_completer = member_completer + + class Harlequin(AppBase): """ The SQL IDE for your Terminal. @@ -180,7 +202,6 @@ def __init__( ) self.adapter = adapter self.connection_hash = connection_hash - self.catalog: Catalog | None = None self.history: History | None = None self.theme = theme self.show_files = show_files @@ -199,6 +220,7 @@ def __init__( ) self.query_timer: Union[float, None] = None self.connection: HarlequinConnection | None = None + self.harlequin_driver = HarlequinDriver(app=self) if keymap_names is None: keymap_names = ("vscode",) @@ -361,22 +383,24 @@ def initialize_app(self, message: DatabaseConnected) -> None: self.notify("Database Connected.") self.update_schema_data() - @on(DataCatalog.NodeSubmitted) - def insert_node_into_editor(self, message: DataCatalog.NodeSubmitted) -> None: + @on(HarlequinTree.NodeSubmitted) + def insert_node_into_editor(self, message: HarlequinTree.NodeSubmitted) -> None: message.stop() if self.editor is None: # recycle message while editor loads - self.post_message(message=message) + callback = partial(self.post_message, message) + self.set_timer(delay=0.1, callback=callback) return self.editor.insert_text_at_selection(text=message.insert_name) self.editor.focus() - @on(DataCatalog.NodeCopied) - def copy_node_name(self, message: DataCatalog.NodeCopied) -> None: + @on(HarlequinTree.NodeCopied) + def copy_node_name(self, message: HarlequinTree.NodeCopied) -> None: message.stop() if self.editor is None: # recycle message while we wait for the editor to load - self.post_message(message=message) + callback = partial(self.post_message, message) + self.set_timer(delay=0.1, callback=callback) return self.editor.text_input.clipboard = message.copy_name if ( @@ -390,6 +414,55 @@ def copy_node_name(self, message: DataCatalog.NodeCopied) -> None: else: self.notify("Selected label copied to clipboard.") + @on(HarlequinDriver.InsertTextAtSelection) + def driver_insert_text_into_editor( + self, message: HarlequinDriver.InsertTextAtSelection + ) -> None: + message.stop() + if self.editor is None: + # recycle message while editor loads + callback = partial(self.post_message, message) + self.set_timer(delay=0.1, callback=callback) + return + self.editor.insert_text_at_selection(text=message.text) + self.editor.focus() + + @on(HarlequinDriver.InsertTextInNewBuffer) + async def driver_insert_text_in_new_buffer( + self, message: HarlequinDriver.InsertTextInNewBuffer + ) -> None: + message.stop() + if self.editor is None: + # recycle message while editor loads + callback = partial(self.post_message, message) + self.set_timer(delay=0.1, callback=callback) + return + await self.editor_collection.insert_buffer_with_text(query_text=message.text) + + @on(HarlequinDriver.ConfirmAndExecute) + def driver_confirm_and_execute( + self, message: HarlequinDriver.ConfirmAndExecute + ) -> None: + message.stop() + + def screen_callback(dismiss_value: bool | None) -> None: + if dismiss_value: + self._execute_callback(callback=message.callback) + + self.push_screen( + ConfirmModal(prompt=message.instructions), callback=screen_callback + ) + + @on(HarlequinDriver.Notify) + def driver_notify(self, message: HarlequinDriver.Notify) -> None: + message.stop() + self.notify(message=message.notify_message, severity=message.severity) + + @on(HarlequinDriver.Refreshcatalog) + def driver_refresh_catalog(self, message: HarlequinDriver.Refreshcatalog) -> None: + message.stop() + self.update_schema_data() + @on(EditorCollection.EditorSwitched) def update_internal_editor_state( self, message: EditorCollection.EditorSwitched @@ -440,7 +513,8 @@ def copy_data_to_clipboard(self, message: DataTable.SelectionCopied) -> None: message.stop() if self.editor is None: # recycle the message while we wait for the editor to load - self.post_message(message=message) + callback = partial(self.post_message, message) + self.set_timer(delay=0.1, callback=callback) return # Excel, sheets, and Snowsight all use a TSV format for copying tabular data text = os.linesep.join("\t".join(map(str, row)) for row in message.values) @@ -487,8 +561,8 @@ async def _handle_worker_error(self, message: Worker.StateChanged) -> None: ) self.exit(return_code=2, message=pretty_error_message(error)) - @on(DataCatalog.CatalogError) - def handle_catalog_error(self, message: DataCatalog.CatalogError) -> None: + @on(HarlequinTree.CatalogError) + def handle_catalog_error(self, message: HarlequinTree.CatalogError) -> None: self._push_error_modal( title=f"Catalog Error: {message.catalog_type}", header=f"Could not populate the {message.catalog_type} data catalog", @@ -518,12 +592,33 @@ def handle_data_load_error(self, message: DataTable.DataLoadError) -> None: error=message.error, ) + @on(ContextMenu.ExecuteInteraction) + def execute_interaction_in_thread( + self, message: ContextMenu.ExecuteInteraction + ) -> None: + self._execute_interaction( + interaction=message.interaction, + item=message.item, + driver=self.harlequin_driver, + ) + @on(NewCatalog) - def update_tree_and_completers(self, message: NewCatalog) -> None: - self.catalog = message.catalog + def handle_new_catalog(self, message: NewCatalog) -> None: self.data_catalog.update_database_tree(message.catalog) self.update_completers(message.catalog) + @on(NewCatalogItems) + def handle_new_catalog_item(self, message: NewCatalogItems) -> None: + if ( + self.editor_collection.word_completer is not None + and self.editor_collection.member_completer is not None + ): + self.extend_completers(parent=message.parent, items=message.items) + else: + # recycle message while completers are built + callback = partial(self.post_message, message) + self.set_timer(delay=0.5, callback=callback) + @on(QueriesExecuted) def fetch_data_or_reset_table(self, message: QueriesExecuted) -> None: if message.cursors: # select query @@ -684,6 +779,11 @@ def update_transaction_button_label(self, message: TransactionModeChanged) -> No self.run_query_bar.commit_button.add_class("hidden") self.run_query_bar.rollback_button.add_class("hidden") + @on(CompletersReady) + def update_editor_completers(self, message: CompletersReady) -> None: + self.editor_collection.word_completer = message.word_completer + self.editor_collection.member_completer = message.member_completer + def action_noop(self) -> None: """ A no-op action to unmap keys. @@ -830,7 +930,7 @@ async def action_quit(self) -> None: write_editor_cache(Cache(focus_index=focus_index, buffers=buffers)) update_catalog_cache( connection_hash=self.connection_hash, - catalog=self.catalog, + catalog=None, # TODO: cache completions instead. s3_tree=self.data_catalog.s3_tree, history=self.history, ) @@ -982,13 +1082,18 @@ def _fetch_data( ResultsFetched(cursors=cursors, data=data, errors=errors, elapsed=elapsed) ) - @work( - thread=True, - exclusive=True, - exit_on_error=True, - group="completer_builders", - description="building completers", - ) + def extend_completers(self, parent: CatalogItem, items: list[CatalogItem]) -> None: + if ( + self.editor_collection.word_completer is not None + and self.editor_collection.member_completer is not None + ): + self.editor_collection.word_completer.extend_catalog( + parent=parent, items=items + ) + self.editor_collection.member_completer.extend_catalog( + parent=parent, items=items + ) + def update_completers(self, catalog: Catalog) -> None: if self.connection is None: return @@ -999,14 +1104,28 @@ def update_completers(self, catalog: Catalog) -> None: self.editor_collection.word_completer.update_catalog(catalog=catalog) self.editor_collection.member_completer.update_catalog(catalog=catalog) else: - extra_completions = self.connection.get_completions() - word_completer, member_completer = completer_factory( - catalog=catalog, - extra_completions=extra_completions, - type_color=self.app_colors.gray, + self._build_completers(catalog) + + @work( + thread=True, + exclusive=True, + exit_on_error=True, + group="completer_builders", + description="building completers", + ) + def _build_completers(self, catalog: Catalog) -> None: + assert self.connection is not None + extra_completions = self.connection.get_completions() + word_completer, member_completer = completer_factory( + catalog=catalog, + extra_completions=extra_completions, + type_color=self.app_colors.gray, + ) + self.post_message( + CompletersReady( + word_completer=word_completer, member_completer=member_completer ) - self.editor_collection.word_completer = word_completer - self.editor_collection.member_completer = member_completer + ) @work(thread=True, exclusive=True, exit_on_error=False, group="schema_updaters") def update_schema_data(self) -> None: @@ -1096,6 +1215,53 @@ def rollback(self) -> None: self.notify(f"Transaction rolled back in {elapsed:.2f} seconds.") self.update_schema_data() + @work( + thread=True, + exclusive=True, + exit_on_error=False, + group="interactions", + description="_execute_interaction", + ) + def _execute_interaction( + self, + interaction: Interaction, + item: TCatalogItem_contra, + driver: HarlequinDriver, + ) -> None: + try: + interaction(item=item, driver=driver) + except Exception as e: + self.call_from_thread( + self._push_error_modal, + title="Data Catalog Interaction Error", + header=( + "Harlequin could not execute an interaction from your data catalog." + ), + error=e, + ) + + @work( + thread=True, + exclusive=True, + exit_on_error=False, + group="interactions", + ) + def _execute_callback( + self, + callback: Callable[[], None], + ) -> None: + try: + callback() + except Exception as e: + self.call_from_thread( + self._push_error_modal, + title="Data Catalog Interaction Error", + header=( + "Harlequin could not execute an interaction from your data catalog." + ), + error=e, + ) + def _get_keymap(self, keymap_name: str) -> "HarlequinKeyMap" | None: try: keymap = self.all_keymaps[keymap_name] diff --git a/src/harlequin/app.tcss b/src/harlequin/app.tcss index 14dd5f7a..7bf09130 100644 --- a/src/harlequin/app.tcss +++ b/src/harlequin/app.tcss @@ -54,6 +54,7 @@ Lazy { DataCatalog { height: 1fr; width: 1fr; + layers: main overlay; } DataCatalog DatabaseTree, @@ -84,6 +85,37 @@ DataCatalog * .directory-tree--hidden { color: $text-muted; } +DataCatalog ContextMenu { + layer: overlay; + display: none; + padding: 1 1; + border: none; + color: $text; + margin: 0 2; + overflow: hidden auto; + width: 1fr; + max-width: 100%; + max-height: 10; + background: $background-lighten-2 ; + &.open { + display: block; + } + &:focus{ + background: $secondary ; + } + &>.option-list--option-hover { + color: $background; + background: $secondary; + text-style: bold; + } + &>.option-list--option-highlighted { + color: $background; + background: $secondary; + text-style: reverse bold; + } +} + + /* RIGHT HAND CONTAINER */ #main_panel { width: 3fr; @@ -553,3 +585,57 @@ HistoryScreen OptionList > .option-list--option-hover-highlighted { color: auto; text-style: none; } + + +/* ConfirmModal */ + +ConfirmModal { + align: center middle; + padding: 0; +} + +ConfirmModal Vertical#outer { + border: round $border-color-focus; + background: $background; + margin: 2 0; + padding: 1 1; + height: auto; + max-height: 30; + width: auto; + max-width: 88; +} + +ConfirmModal Label { + width: 100%; + text-align: center; + +} + +ConfirmModal Horizontal#button_row { + height: auto; + width: auto; + align: center bottom; + margin: 2 0 1 0; +} + +ConfirmModal Horizontal#button_row Button { + background: $primary; + height: 3; + margin: 0 4; + padding: 0 1; + min-width: 16; + border: none; + &:hover { + background: $secondary; + } + &:focus { + text-style: reverse; + } +} + +ConfirmModal Horizontal#button_row Button#no{ + background: $error; + &:hover { + background: $secondary; + } +} diff --git a/src/harlequin/autocomplete/completers.py b/src/harlequin/autocomplete/completers.py index 46aa611d..a65716c1 100644 --- a/src/harlequin/autocomplete/completers.py +++ b/src/harlequin/autocomplete/completers.py @@ -62,6 +62,18 @@ def update_catalog(self, catalog: Catalog) -> None: self._extra_completions, ) + def extend_catalog(self, parent: CatalogItem, items: list[CatalogItem]) -> None: + # TODO: dedupe/merge on the parent's unique key, so we can load items from + # a cache and update them later when they are lazy-loaded. + new_completions = _build_children_completions(items=items, context=parent.label) + self._catalog_completions.extend(new_completions) + self.completions = self._merge_completions( + self._keyword_completions, + self._function_completions, + self._catalog_completions, + self._extra_completions, + ) + @staticmethod def _merge_completions( *completion_lists: list[HarlequinCompletion], diff --git a/src/harlequin/catalog.py b/src/harlequin/catalog.py index d3d48987..c4fee5ab 100644 --- a/src/harlequin/catalog.py +++ b/src/harlequin/catalog.py @@ -1,34 +1,93 @@ +from __future__ import annotations + from dataclasses import dataclass, field -from typing import List +from typing import TYPE_CHECKING, ClassVar, Generic, Protocol, Sequence, TypeVar from textual.message import Message +if TYPE_CHECKING: + from harlequin.adapter import HarlequinConnection + from harlequin.driver import HarlequinDriver + @dataclass class CatalogItem: """ - A representation of a database object. + A basic representation of a database object for Harlequin's Data Catalog. Args: qualified_identifier (str): The fully-scoped and (optionally) quoted database identifier for this object. Should be globally unique for the Connection. e.g., a postgres table: "mydb"."myschema"."mytable" query_name (str): The text to be inserted into the query editor for this - object. + object. This is typically the qualified_indentifier, but often + for columns it is just the quoted name of the column (without + the qualifying schema/table/etc). label (str): The unqualified name for this object, to appear in the Data Catalog widget. type_label (str): A short (1-3 chars) label denoting the type of this object or the data it contains. e.g., ("t") for "table" or "##" for "bigint column". children (list[CatalogItem]): Other nodes nested under this one (e.g., - a list of columns if this is a table.) + a list of columns if this is a table.). If the list is empty and + a CatalogItem subclass implements the `fetch_children()` method, + Harlequin will attempt to call that method to lazy-load children. """ qualified_identifier: str query_name: str label: str type_label: str - children: List["CatalogItem"] = field(default_factory=list) + children: list["CatalogItem"] = field(default_factory=list) + + +TCatalogItem_contra = TypeVar( + "TCatalogItem_contra", bound=CatalogItem, contravariant=True +) +TAdapterConnection_contra = TypeVar( + "TAdapterConnection_contra", bound="HarlequinConnection", contravariant=True +) + + +class Interaction(Protocol[TCatalogItem_contra]): + def __call__( + self, + item: TCatalogItem_contra, + driver: "HarlequinDriver", + ) -> None: ... + + +@dataclass +class InteractiveCatalogItem(CatalogItem, Generic[TAdapterConnection_contra]): + """ + An advanced representation of a database object that can lazy-load its + children and provide other interactions via a context menu. Subclass + this class and define the INTERACTIONS class variable to populate + Harlequin's context menu. + + Each list item is a tuple with a label (for the context menu) and a + callable that takes three arguments: the CatalogItem node that is clicked + on, the initialized HarlequinConnection, and a HarlequinDriver that + provides a simplified interface to the Harlequin App and allows the + interactions to do things like insert text into the editor, show + a confirmation modal, and display a notification (toast). + """ + + INTERACTIONS: ClassVar[Sequence[tuple[str, Interaction]] | None] = None + loaded: bool = False + """ + Harlequin will set loaded to True after calling fetch_children. You + can prevent calls to fetch_children by initializing loaded=True. + """ + connection: TAdapterConnection_contra | None = None + + def fetch_children(self) -> Sequence[CatalogItem]: + """ + Returns a list of CatalogItems (or subclass instances, like other + InteractiveCatalogItems) to be shown under this item in the catalog + tree viewer. Return an empty list if this item has no children. + """ + return [] @dataclass @@ -42,10 +101,17 @@ class Catalog: a database object, like a database, schema, table, or column. """ - items: List[CatalogItem] + items: list[CatalogItem] class NewCatalog(Message): def __init__(self, catalog: Catalog) -> None: self.catalog = catalog super().__init__() + + +class NewCatalogItems(Message): + def __init__(self, parent: CatalogItem, items: list[CatalogItem]) -> None: + self.parent = parent + self.items = items + super().__init__() diff --git a/src/harlequin/catalog_cache.py b/src/harlequin/catalog_cache.py index 04a3679f..443343d4 100644 --- a/src/harlequin/catalog_cache.py +++ b/src/harlequin/catalog_cache.py @@ -41,8 +41,8 @@ class CatalogCache: history: dict[str, History] def get_db(self, connection_hash: str) -> Catalog | None: - if connection_hash: - return self.databases.get(connection_hash, None) + # if connection_hash: + # return self.databases.get(connection_hash, None) return None def get_history(self, connection_hash: str) -> History | None: @@ -84,8 +84,8 @@ def update_catalog_cache( cache = _load_cache() if cache is None: cache = CatalogCache(databases={}, s3={}, history={}) - if catalog is not None and connection_hash: - cache.databases[connection_hash] = catalog + # if catalog is not None and connection_hash: + # cache.databases[connection_hash] = catalog if s3_tree is not None and s3_tree.catalog_data is not None: cache.s3[s3_tree.cache_key] = s3_tree.catalog_data if history is not None and connection_hash: diff --git a/src/harlequin/components/confirm_modal.py b/src/harlequin/components/confirm_modal.py new file mode 100644 index 00000000..722db28b --- /dev/null +++ b/src/harlequin/components/confirm_modal.py @@ -0,0 +1,34 @@ +from __future__ import annotations + +from textual import on +from textual.app import ComposeResult +from textual.containers import Horizontal, Vertical +from textual.screen import ModalScreen +from textual.widgets import Button, Label + + +class ConfirmModal(ModalScreen[bool]): + def __init__(self, prompt: str) -> None: + super().__init__() + self.prompt = prompt + + def compose(self) -> ComposeResult: + with Vertical(id="outer"): + yield Label(self.prompt, id="prompt_label") + with Horizontal(id="button_row"): + yield Button(label="No", id="no") + yield Button(label="Yes", variant="primary", id="yes") + + @on(Button.Pressed, "#yes") + def save_from_button(self) -> None: + self.action_continue() + + @on(Button.Pressed, "#no") + def cancel_from_button(self) -> None: + self.action_cancel() + + def action_continue(self) -> None: + self.dismiss(True) + + def action_cancel(self) -> None: + self.dismiss(False) diff --git a/src/harlequin/components/data_catalog.py b/src/harlequin/components/data_catalog.py deleted file mode 100644 index 6637ed92..00000000 --- a/src/harlequin/components/data_catalog.py +++ /dev/null @@ -1,476 +0,0 @@ -from __future__ import annotations - -from pathlib import Path -from typing import ClassVar, Generic, List, Set, Tuple, Union -from urllib.parse import urlsplit - -from rich.text import TextType -from textual import on, work -from textual.css.query import NoMatches -from textual.events import Click -from textual.message import Message -from textual.widgets import ( - DirectoryTree, - TabbedContent, - TabPane, - Tabs, - Tree, -) -from textual.widgets._directory_tree import DirEntry -from textual.widgets._tree import EventTreeDataType, TreeNode -from textual.worker import Worker, WorkerState - -from harlequin.catalog import Catalog, CatalogItem -from harlequin.catalog_cache import CatalogCache, recursive_dict -from harlequin.messages import WidgetMounted - -try: - import boto3 -except ImportError: - boto3 = None # type: ignore - - -class DataCatalog(TabbedContent, can_focus=True): - BORDER_TITLE = "Data Catalog" - - class NodeSubmitted(Generic[EventTreeDataType], Message): - def __init__(self, node: TreeNode[EventTreeDataType]) -> None: - self.node: TreeNode[EventTreeDataType] = node - super().__init__() - - @property - def insert_name(self) -> str: - if not self.node.data: - return "" - elif isinstance(self.node.data, CatalogItem): - return self.node.data.query_name - elif isinstance(self.node.data, DirEntry): - return f"'{self.node.data.path}'" - else: - return str(self.node.data) - - class NodeCopied(Generic[EventTreeDataType], Message): - def __init__(self, node: TreeNode[EventTreeDataType]) -> None: - self.node: TreeNode[EventTreeDataType] = node - super().__init__() - - @property - def copy_name(self) -> str: - if not self.node.data: - return "" - elif isinstance(self.node.data, CatalogItem): - return self.node.data.query_name - elif isinstance(self.node.data, DirEntry): - return str(self.node.data.path) - else: - return str(self.node.data) - - class CatalogError(Message): - def __init__(self, catalog_type: str, error: BaseException) -> None: - self.catalog_type = catalog_type - self.error = error - super().__init__() - - def __init__( - self, - *titles: TextType, - initial: str = "", - name: Union[str, None] = None, - id: Union[str, None] = None, # noqa: A002 - classes: Union[str, None] = None, - disabled: bool = False, - show_files: Path | None = None, - show_s3: str | None = None, - type_color: str = "#888888", - ): - super().__init__( - *titles, - initial=initial, - name=name, - id=id, - classes=classes, - disabled=disabled, - ) - self.show_files = show_files - self.show_s3 = show_s3 - self.type_color = type_color - - def on_mount(self) -> None: - self.database_tree = DatabaseTree(type_color=self.type_color) - self.add_pane(TabPane("Databases", self.database_tree)) - if self.show_files is not None: - self.file_tree: FileTree | None = FileTree(path=self.show_files) - self.add_pane(TabPane("Files", self.file_tree)) - else: - self.file_tree = None - - if self.show_s3 is not None and boto3 is not None: - self.s3_tree: S3Tree | None = S3Tree(uri=self.show_s3) - self.add_pane(TabPane("S3", self.s3_tree)) - elif self.show_s3 is not None and boto3 is None: - self.post_message( - DataCatalog.CatalogError( - catalog_type="s3", - error=Exception( - "Could not load s3 catalog because boto3 is not available.\n\n" - "Re-install harlequin with the s3 extra, like this:\n" - "pip install harlequin[s3]" - ), - ) - ) - self.s3_tree = None - else: - self.s3_tree = None - - if self.show_files is None and self.show_s3 is None: - self.add_class("hide-tabs") - self.query_one(Tabs).can_focus = False - self.post_message(WidgetMounted(widget=self)) - - def on_focus(self) -> None: - try: - active_widget = self.query_one(f"#{self.active}").children[0] - except NoMatches: - self.database_tree.focus() - else: - active_widget.focus() - - @on(TabbedContent.TabActivated) - def focus_on_widget_in_active_pane(self) -> None: - self.focus() - - def update_database_tree(self, catalog: Catalog) -> None: - self.database_tree.update_tree(catalog) - - def update_file_tree(self) -> None: - if self.file_tree is not None: - self.file_tree.reload() - - def update_s3_tree(self) -> None: - if self.s3_tree is not None: - self.s3_tree.reload() - - def load_s3_tree_from_cache(self, cache: CatalogCache) -> None: - if self.show_s3 is None or self.s3_tree is None: - return - cache_data = cache.get_s3(self.s3_tree.cache_key) - if cache_data is None: - return - self.s3_tree.build_tree(data=cache_data) - - def action_switch_tab(self, offset: int) -> None: - if not self.active: - return - if self.tab_count == 1: - return - tab_number = int(self.active.split("-")[1]) - unsafe_tab_number = tab_number + offset - if unsafe_tab_number < 1: - new_tab_number = self.tab_count - elif unsafe_tab_number > self.tab_count: - new_tab_number = 1 - else: - new_tab_number = unsafe_tab_number - self.active = f"tab-{new_tab_number}" - self.focus() - - def action_focus_results_viewer(self) -> None: - if hasattr(self.app, "action_focus_results_viewer"): - self.app.action_focus_results_viewer() - - def action_focus_query_editor(self) -> None: - if hasattr(self.app, "action_focus_query_editor"): - self.app.action_focus_query_editor() - - -class HarlequinTree(Tree, inherit_bindings=False): - double_click: int | None = None - - async def on_click(self, event: Click) -> None: - meta = event.style.meta - click_line: Union[int, None] = meta.get("line", None) - if ( - self.double_click is not None - and click_line is not None - and self.double_click == click_line - ): - event.prevent_default() - node = self.get_node_at_line(click_line) - if node is not None: - self.post_message(DataCatalog.NodeSubmitted(node=node)) - node.expand() - else: - self.double_click = click_line - self.set_timer( - delay=0.5, callback=self._clear_double_click, name="double_click_timer" - ) - - def _clear_double_click(self) -> None: - self.double_click = None - - def action_submit(self) -> None: - if self.cursor_node is not None: - self.post_message(DataCatalog.NodeSubmitted(node=self.cursor_node)) - - def action_copy(self) -> None: - if self.cursor_node is not None: - self.post_message(DataCatalog.NodeCopied(node=self.cursor_node)) - - -class DatabaseTree(HarlequinTree, Tree[CatalogItem], inherit_bindings=False): - def __init__( - self, - type_color: str = "#888888", - data: CatalogItem | None = None, - name: str | None = None, - id: str | None = None, # noqa: A002 - classes: str | None = None, - disabled: bool = False, - ) -> None: - self.type_color = type_color - super().__init__( - "Root", data, name=name, id=id, classes=classes, disabled=disabled - ) - - def update_tree(self, catalog: Catalog) -> None: - tree_state = self._get_node_states(self.root) - expanded_nodes: Set[str] = set(tree_state[0]) - # todo: tree's select_node() not working - # unless the tree is modified, the selection will stay - # in the same place - # selected_node = tree_state[1] - self.clear() - if catalog.items: - self._build_subtree(catalog.items, self.root, expanded_nodes) - self.loading = False - - def on_mount(self) -> None: - self.loading = True - self.show_root = False - self.guide_depth = 3 - self.root.expand() - self.post_message(WidgetMounted(widget=self)) - - def _build_item_label(self, label: str, type_label: str) -> str: - return f"{label} [{self.type_color}]{type_label}[/]" if type_label else label - - def _build_subtree( - self, - items: List[CatalogItem], - parent: TreeNode[CatalogItem], - expanded_nodes: Set[str], - ) -> None: - for item in items: - if item.children: - new_node = parent.add( - label=self._build_item_label(item.label, item.type_label), - data=item, - expand=item.qualified_identifier in expanded_nodes, - ) - self._build_subtree(item.children, new_node, expanded_nodes) - else: - parent.add_leaf( - label=self._build_item_label(item.label, item.type_label), data=item - ) - - @classmethod - def _get_node_states( - cls, node: TreeNode[CatalogItem] - ) -> Tuple[List[str], Union[str, None]]: - expanded_nodes = [] - selected_node = None - if node.is_expanded and node.data is not None: - expanded_nodes.append(node.data.qualified_identifier) - if node._selected and node.data is not None: - selected_node = node.data.qualified_identifier - for child in node.children: - expanded_children, selected_child = cls._get_node_states(child) - expanded_nodes.extend(expanded_children) - selected_node = selected_child or selected_node - return expanded_nodes, selected_node - - -class FileTree(HarlequinTree, DirectoryTree, inherit_bindings=False): - COMPONENT_CLASSES: ClassVar[set[str]] = { - "directory-tree--extension", - "directory-tree--file", - "directory-tree--folder", - "directory-tree--hidden", - } - - def on_mount(self) -> None: - self.guide_depth = 3 - self.root.expand() - self.post_message(WidgetMounted(widget=self)) - - -class S3Tree(HarlequinTree, Tree[str], inherit_bindings=False): - COMPONENT_CLASSES: ClassVar[set[str]] = { - "directory-tree--extension", - "directory-tree--file", - "directory-tree--folder", - "directory-tree--hidden", - } - - class DataReady(Message): - def __init__(self, data: dict) -> None: - self.data = data - super().__init__() - - def __init__( - self, - uri: str, - data: CatalogItem | None = None, - name: str | None = None, - id: str | None = None, # noqa: A002 - classes: str | None = None, - disabled: bool = False, - ) -> None: - self.endpoint_url, self.bucket, self.prefix = self._parse_s3_uri(uri) - self.catalog_data: dict | None = None - super().__init__( - "Root", data, name=name, id=id, classes=classes, disabled=disabled - ) - - render_label = DirectoryTree.render_label - - def on_mount(self) -> None: - self.guide_depth = 3 - self.show_root = False - self.root.data = self.endpoint_url or "s3:/" - self.reload() - self.post_message(WidgetMounted(widget=self)) - - @property - def cache_key(self) -> tuple[str | None, str | None, str | None]: - return (self.endpoint_url, self.bucket, self.prefix) - - @on(DataReady) - def build_tree_from_message_data(self, message: S3Tree.DataReady) -> None: - self.build_tree(message.data) - - def build_tree(self, data: dict) -> None: - self.catalog_data = data - self.clear() - self._build_subtree(data=data, parent=self.root) - self.root.expand() - self.loading = False - - @on(Worker.StateChanged) - async def handle_worker_state_change(self, message: Worker.StateChanged) -> None: - if message.state == WorkerState.ERROR: - await self._handle_worker_error(message) - - async def _handle_worker_error(self, message: Worker.StateChanged) -> None: - if ( - message.worker.name == "_reload_objects" - and message.worker.error is not None - ): - self.post_message( - DataCatalog.CatalogError(catalog_type="s3", error=message.worker.error) - ) - self.loading = False - - @staticmethod - def _parse_s3_uri(uri: str) -> tuple[str | None, str | None, str | None]: - """ - Any of these are acceptable: - my-bucket - my-bucket/my-prefix - s3://my-bucket - s3://my-bucket/my-prefix - https://my-storage.com/my-bucket/ - https://my-storage.com/my-bucket/my-prefix - https://my-bucket.s3.amazonaws.com/my-prefix - https://my-bucket.storage.googleapis.com/my-prefix - """ - - def _is_prefixed_aws_url(netloc: str) -> bool: - parts = netloc.split(".") - print(parts) - if ".".join(parts[1:]) == "s3.amazonaws.com": - return True - return False - - def _is_prefixed_gcs_url(netloc: str) -> bool: - parts = netloc.split(".") - if ".".join(parts[1:]) == "storage.googleapis.com": - return True - return False - - if uri == "all": - # special keyword so we list all buckets - return None, None, None - - scheme, netloc, path, *_ = urlsplit(uri) - path = path.lstrip("/") - bucket: str | None - - if not scheme: - assert not netloc - endpoint_url = None - bucket = path.split("/")[0] - prefix = "/".join(path.split("/")[1:]) - elif scheme == "s3": - endpoint_url = None - bucket = netloc - prefix = path - elif _is_prefixed_aws_url(netloc): - endpoint_url = None - bucket = netloc.split(".")[0] - prefix = path - elif _is_prefixed_gcs_url(netloc): - endpoint_url = "https://storage.googleapis.com" - bucket = netloc.split(".")[0] - prefix = path - else: - endpoint_url = f"{scheme}://{netloc}" - bucket = path.split("/")[0] or None - prefix = "/".join(path.split("/")[1:]) - - return endpoint_url, bucket, prefix - - def reload(self) -> None: - self.loading = True - self._reload_objects() - - @work(thread=True, exclusive=True, exit_on_error=False) - def _reload_objects(self) -> None: - if boto3 is None: - return - - data = {} - s3 = boto3.resource("s3", endpoint_url=self.endpoint_url) - if self.bucket is None: - buckets = [b for b in s3.buckets.all()] - else: - buckets = [s3.Bucket(self.bucket)] - for bucket in buckets: - data[bucket.name] = recursive_dict() - object_gen = ( - bucket.objects.filter(Prefix=self.prefix) - if self.prefix - else bucket.objects.all() - ) - for obj in object_gen: - key_parts = obj.key.split("/") - target = data[bucket.name] - for part in key_parts: - target = target[part] - - self.post_message(S3Tree.DataReady(data=data)) - - def _build_subtree( - self, - data: dict[str, dict], - parent: TreeNode[str], - ) -> None: - for k in data: - if data[k]: - new_node = parent.add( - label=k, - data=f"{parent.data}/{k}", - ) - self._build_subtree(data[k], new_node) - else: - parent.add_leaf(label=k, data=f"{parent.data}/{k}") diff --git a/src/harlequin/components/data_catalog/__init__.py b/src/harlequin/components/data_catalog/__init__.py new file mode 100644 index 00000000..cb93d0d8 --- /dev/null +++ b/src/harlequin/components/data_catalog/__init__.py @@ -0,0 +1,247 @@ +from __future__ import annotations + +from pathlib import Path +from typing import TYPE_CHECKING, ClassVar, Sequence + +from rich.markup import escape +from rich.text import TextType +from textual import on +from textual.css.query import NoMatches +from textual.message import Message +from textual.widgets import ( + DirectoryTree, + OptionList, + TabbedContent, + TabPane, + Tabs, +) +from textual.widgets._tree import TreeNode + +from harlequin.catalog import Catalog, CatalogItem, InteractiveCatalogItem +from harlequin.catalog_cache import CatalogCache +from harlequin.components.data_catalog.database_tree import DatabaseTree +from harlequin.components.data_catalog.s3_tree import S3Tree as S3Tree +from harlequin.components.data_catalog.tree import HarlequinTree as HarlequinTree +from harlequin.messages import WidgetMounted + +if TYPE_CHECKING: + from harlequin.catalog import Interaction + from harlequin.driver import HarlequinDriver + +try: + import boto3 +except ImportError: + boto3 = None # type: ignore + + +def insert_name_at_cursor(item: CatalogItem, driver: HarlequinDriver) -> None: + driver.insert_text_at_selection(text=item.query_name) + + +class ContextMenu(OptionList): + class ExecuteInteraction(Message): + def __init__(self, interaction: "Interaction", item: CatalogItem) -> None: + self.interaction = interaction + self.item = item + super().__init__() + + DEFAULT_INTERACTIONS: list[tuple[str, "Interaction"]] = [ + ("Insert Name at Cursor", insert_name_at_cursor), + ] + + def __init__(self) -> None: + self.interactions: list[tuple[str, "Interaction"]] = self.DEFAULT_INTERACTIONS + self.item: CatalogItem | None = None + super().__init__() + + def reload(self, node: TreeNode) -> None: + self.clear_options() + + if not isinstance(node.data, CatalogItem): + return + + self.item = node.data + + other_interactions: Sequence[tuple[str, "Interaction"]] = [] + + if isinstance(node.data, InteractiveCatalogItem): + if node.data.INTERACTIONS is not None: + other_interactions = node.data.INTERACTIONS + + self.interactions = [*self.DEFAULT_INTERACTIONS, *other_interactions] + + for label, _ in self.interactions: + self.add_option(escape(label)) + + assert isinstance(self.parent, TabPane) + parent_height = self.parent.scrollable_content_region.height + context_menu_height = self.option_count + 2 + scroll_offset = node.tree.scroll_offset.y + if (node.line - scroll_offset + context_menu_height) < parent_height: + self.styles.offset = (0, node.line - scroll_offset + 1) + else: + self.styles.offset = (0, node.line - scroll_offset - context_menu_height) + + self.add_class("open") + self.highlighted = 0 + self.focus() + + @on(OptionList.OptionSelected) + def execute_interaction(self, event: OptionList.OptionSelected) -> None: + if event.option_list is not self or self.item is None: + return + _, interaction = self.interactions[event.option_index] + self.post_message( + self.ExecuteInteraction(interaction=interaction, item=self.item) + ) + self.remove_class("open") + + def on_blur(self) -> None: + self.action_hide() + + def action_hide(self) -> None: + self.remove_class("open") + + +class DataCatalog(TabbedContent, can_focus=True): + BORDER_TITLE = "Data Catalog" + + def __init__( + self, + *titles: TextType, + initial: str = "", + name: str | None = None, + id: str | None = None, # noqa: A002 + classes: str | None = None, + disabled: bool = False, + show_files: Path | None = None, + show_s3: str | None = None, + type_color: str = "#888888", + ): + super().__init__( + *titles, + initial=initial, + name=name, + id=id, + classes=classes, + disabled=disabled, + ) + self.show_files = show_files + self.show_s3 = show_s3 + self.type_color = type_color + + def on_mount(self) -> None: + self.database_tree = DatabaseTree(type_color=self.type_color) + self.database_context_menu = ContextMenu() + self.add_pane( + TabPane("Databases", self.database_tree, self.database_context_menu) + ) + if self.show_files is not None: + self.file_tree: FileTree | None = FileTree(path=self.show_files) + self.add_pane(TabPane("Files", self.file_tree)) + else: + self.file_tree = None + + if self.show_s3 is not None and boto3 is not None: + self.s3_tree: S3Tree | None = S3Tree(uri=self.show_s3) + self.add_pane(TabPane("S3", self.s3_tree)) + elif self.show_s3 is not None and boto3 is None: + self.post_message( + S3Tree.CatalogError( + catalog_type="s3", + error=Exception( + "Could not load s3 catalog because boto3 is not available.\n\n" + "Re-install harlequin with the s3 extra, like this:\n" + "pip install harlequin[s3]" + ), + ) + ) + self.s3_tree = None + else: + self.s3_tree = None + + if self.show_files is None and self.show_s3 is None: + self.add_class("hide-tabs") + self.query_one(Tabs).can_focus = False + self.post_message(WidgetMounted(widget=self)) + + def on_focus(self) -> None: + try: + active_widget = self.query_one(f"#{self.active}").children[0] + except NoMatches: + self.database_tree.focus() + else: + active_widget.focus() + + @on(TabbedContent.TabActivated) + def focus_on_widget_in_active_pane(self) -> None: + self.focus() + + @on(HarlequinTree.HideContextMenu) + def hide_context_menu(self, event: HarlequinTree.HideContextMenu) -> None: + event.stop() + self.database_context_menu.remove_class("open") + + @on(HarlequinTree.ShowContextMenu) + def load_interactions_and_show_context_menu( + self, event: HarlequinTree.ShowContextMenu + ) -> None: + event.stop() + self.database_context_menu.reload(node=event.node) + + def update_database_tree(self, catalog: Catalog) -> None: + self.database_tree.catalog = catalog + + def update_file_tree(self) -> None: + if self.file_tree is not None: + self.file_tree.reload() + + def update_s3_tree(self) -> None: + if self.s3_tree is not None: + self.s3_tree.reload() + + def load_s3_tree_from_cache(self, cache: CatalogCache) -> None: + if self.show_s3 is None or self.s3_tree is None: + return + cache_data = cache.get_s3(self.s3_tree.cache_key) + if cache_data is None: + return + self.s3_tree.build_tree(data=cache_data) + + def action_switch_tab(self, offset: int) -> None: + if not self.active: + return + if self.tab_count == 1: + return + tab_number = int(self.active.split("-")[1]) + unsafe_tab_number = tab_number + offset + if unsafe_tab_number < 1: + new_tab_number = self.tab_count + elif unsafe_tab_number > self.tab_count: + new_tab_number = 1 + else: + new_tab_number = unsafe_tab_number + self.active = f"tab-{new_tab_number}" + self.focus() + + def action_focus_results_viewer(self) -> None: + if hasattr(self.app, "action_focus_results_viewer"): + self.app.action_focus_results_viewer() + + def action_focus_query_editor(self) -> None: + if hasattr(self.app, "action_focus_query_editor"): + self.app.action_focus_query_editor() + + +class FileTree(HarlequinTree, DirectoryTree, inherit_bindings=False): + COMPONENT_CLASSES: ClassVar[set[str]] = { + "directory-tree--extension", + "directory-tree--file", + "directory-tree--folder", + "directory-tree--hidden", + } + + def on_mount(self) -> None: + self.guide_depth = 3 + self.root.expand() + self.post_message(WidgetMounted(widget=self)) diff --git a/src/harlequin/components/data_catalog/database_tree.py b/src/harlequin/components/data_catalog/database_tree.py new file mode 100644 index 00000000..4cef9f22 --- /dev/null +++ b/src/harlequin/components/data_catalog/database_tree.py @@ -0,0 +1,366 @@ +from __future__ import annotations + +from asyncio import PriorityQueue +from contextlib import suppress +from pathlib import Path +from typing import TYPE_CHECKING, Generator, Iterable, TypeVar + +from rich.text import TextType +from textual import work +from textual.await_complete import AwaitComplete +from textual.reactive import var +from textual.widgets._tree import Tree, TreeNode +from textual.worker import WorkerCancelled, WorkerFailed, get_current_worker + +from harlequin.catalog import ( + Catalog, + CatalogItem, + InteractiveCatalogItem, + NewCatalogItems, +) +from harlequin.components.data_catalog.tree import HarlequinTree +from harlequin.messages import WidgetMounted + +if TYPE_CHECKING: + from typing_extensions import Self + + +class DatabaseTree(HarlequinTree[CatalogItem], inherit_bindings=False): + catalog: var[Catalog | None] = var["Catalog | None"]( + None, init=False, always_update=True + ) + + def __init__( + self, + type_color: str = "#888888", + name: str | None = None, + id: str | None = None, # noqa: A002 + classes: str | None = None, + disabled: bool = False, + ) -> None: + self._load_queue: PriorityQueue[ + tuple[int, str, int, TreeNode[InteractiveCatalogItem]] + ] = PriorityQueue() + """ + _load_queue is a priority queue, ordered by a priority int, + then the string label of the node, then the id of the node, + which should prevent any comparisons between TreeNodes, which + do not implement cmp operators. + """ + self.type_color = type_color + super().__init__( + label="Root", + data=CatalogItem( + qualified_identifier="__root__", + query_name="", + label="Root", + type_label="", + children=[], + ), + name=name, + id=id, + classes=classes, + disabled=disabled, + ) + + def on_mount(self) -> None: + self.loading = True + self.show_root = False + self.guide_depth = 3 + self.root.expand() + self.post_message(WidgetMounted(widget=self)) + + def _build_item_label(self, label: str, type_label: str) -> str: + return f"{label} [{self.type_color}]{type_label}[/]" if type_label else label + + async def watch_catalog(self, catalog: Catalog | None) -> None: + """Watch for changes to the `catalog` of the database tree. + + If the Catalog is changed the directory tree will be repopulated using + the new value as the root. + """ + assert isinstance(self.root.data, CatalogItem) + self.root.data.children = catalog.items if catalog is not None else [] + await self.reload() + # add the root's children to the prefetch queue + for child in self.root.children: + if isinstance(child.data, InteractiveCatalogItem) and not child.data.loaded: + self._add_to_load_queue(child) # type: ignore[arg-type] + self.loading = False + + def _add_to_load_queue( + self, node: TreeNode[InteractiveCatalogItem], priority: int = 100 + ) -> AwaitComplete: + """Add the given node to the load priority queue. + + The return value can optionally be awaited until the queue is empty. + + Args: + node: The node to add to the load queue. + priority: An order for this node to be loaded; lowest first. + + Returns: + An optionally awaitable object that can be awaited until the + load queue has finished processing. + """ + assert node.data is not None + if not node.data.loaded: + with suppress(TypeError): + # typeError will be raised if this node already exists in the queue, + # since TreeNodes do not implement cmp operators. + self._load_queue.put_nowait((priority, str(node.label), id(node), node)) + + return AwaitComplete(self._load_queue.join()) + + def reload(self) -> AwaitComplete: + """Reload the `DirectoryTree` contents. + + Returns: + An optionally awaitable that ensures the tree has finished reloading. + """ + # Orphan the old queue... + self._load_queue = PriorityQueue() + # ... reset the root node ... + processed = self.reload_node(self.root) + # ... and replace the old loader with a new one. + self._loader() + return processed + + def clear_node(self, node: TreeNode[CatalogItem]) -> Self: + """Clear all nodes under the given node. + + Returns: + The `Tree` instance. + """ + self._clear_line_cache() + node.remove_children() + self._updates += 1 + self.refresh() + return self + + def reset_node( + self, + node: TreeNode[CatalogItem], + label: TextType, + data: CatalogItem | None = None, + ) -> Self: + """Clear the subtree and reset the given node. + + Args: + node: The node to reset. + label: The label for the node. + data: Optional data for the node. + + Returns: + The `Tree` instance. + """ + self.clear_node(node) + node.label = label + node.data = data + return self + + async def _reload(self, node: TreeNode[CatalogItem]) -> None: + """Reloads the subtree rooted at the given node while preserving state. + + After reloading the subtree, nodes that were expanded and still exist + will remain expanded and the highlighted node will be preserved, if it + still exists. If it doesn't, highlighting goes up to the first parent + directory that still exists. + + Args: + node: The root of the subtree to reload. + """ + async with self.lock: + # Track nodes that were expanded before reloading. + currently_open: set[str] = set() + to_check: list[TreeNode[CatalogItem]] = [node] + while to_check: + checking = to_check.pop() + if checking.allow_expand and checking.is_expanded: + if checking.data: + currently_open.add(checking.data.qualified_identifier) + to_check.extend(checking.children) + + # Track node that was highlighted before reloading. + highlighted_identifier: None | str = None + if self.cursor_line > -1: + highlighted_node = self.get_node_at_line(self.cursor_line) + if highlighted_node is not None and highlighted_node.data is not None: + highlighted_identifier = highlighted_node.data.qualified_identifier + + if node.data is not None: + self.reset_node( + node, + self._build_item_label(node.data.label, node.data.type_label), + node.data, + ) + + # Reopen nodes that were expanded and still exist. + to_reopen = [node] + while to_reopen: + reopening = to_reopen.pop() + if not reopening.data: + continue + if reopening.allow_expand and ( + reopening.data.qualified_identifier in currently_open + or reopening == node + ): + try: + content = await self._load_children(reopening).wait() + except (WorkerCancelled, WorkerFailed): + continue + self._populate_node(reopening, content) + to_reopen.extend(reopening.children) + reopening.expand() + + if highlighted_identifier is None: + return + + # Restore the highlighted path and consider the parents as fallbacks. + looking = [node] + + def parents(qualified_identifier: str) -> Generator[str, None, None]: + parent = qualified_identifier + while parent := parent.rpartition(".")[0]: + yield parent + yield "__root__" + + highlight_candidates = set(parents(highlighted_identifier)) + highlight_candidates.add(highlighted_identifier) + best_found: None | TreeNode[CatalogItem] = None + while looking: + checking = looking.pop() + checking_path = ( + checking.data.qualified_identifier + if checking.data is not None + else None + ) + if checking_path in highlight_candidates: + best_found = checking + if checking_path == highlighted_identifier: + break + if checking.allow_expand and checking.is_expanded: + looking.extend(checking.children) + if best_found is not None: + # We need valid lines. Make sure the tree lines have been computed: + _ = self._tree_lines + self.cursor_line = best_found.line + + def reload_node(self, node: TreeNode[CatalogItem]) -> AwaitComplete: + """Reload the given node's contents. + + The return value may be awaited to ensure the DirectoryTree has reached + a stable state and is no longer performing any node reloading (of this node + or any other nodes). + + Args: + node: The root of the subtree to reload. + + Returns: + An optionally awaitable that ensures the subtree has finished reloading. + """ + return AwaitComplete(self._reload(node)) + + TCatalogItem_co = TypeVar("TCatalogItem_co", bound=CatalogItem, covariant=True) + + def _populate_node( + self, node: TreeNode[TCatalogItem_co], content: Iterable[TCatalogItem_co] + ) -> None: + """Populate the given tree node with the given directory content. + + Args: + node: The Tree node to populate. + content: The collection of `Path` objects to populate the node with. + """ + node.remove_children() + for item in content: + node.add( + self._build_item_label(item.label, item.type_label), + data=item, + allow_expand=bool(item.children) or not getattr(item, "loaded", True), + ) + + @work(thread=True, exit_on_error=False, description="_load_children") + def _load_children(self, node: TreeNode[CatalogItem]) -> list[CatalogItem]: + """Load the children for a given node. + + Args: + node: The node to load the children for. + + Returns: + The list of entries within the directory associated with the node. + """ + assert node.data is not None + if ( + not node.data.children + and isinstance(node.data, InteractiveCatalogItem) + and not node.data.loaded + ): + try: + children = list(node.data.fetch_children()) + except BaseException as e: + self.post_message(self.CatalogError(catalog_type="database", error=e)) + return [] + else: + node.data.children = children + self.post_message(NewCatalogItems(parent=node.data, items=children)) + finally: + node.data.loaded = True + node.allow_expand = bool(node.data.children) + + return sorted( + node.data.children, + key=lambda catalog_item: catalog_item.label, + ) + + @work(name="_database_tree_background_loader", exclusive=True) + async def _loader(self) -> None: + """Background loading queue processor.""" + worker = get_current_worker() + while not worker.is_cancelled: + # Get the next node that needs loading off the queue. Note that + # this blocks if the queue is empty. + *_, node = await self._load_queue.get() + content: list[Path] = [] + async with self.lock: + try: + # Spin up a short-lived thread that will load the content of + # the directory associated with that node. + content = await self._load_children(node).wait() + except WorkerCancelled: + # The worker was cancelled, that would suggest we're all + # done here and we should get out of the loader in general. + break + except WorkerFailed: + # This particular worker failed to start. We don't know the + # reason so let's no-op that (for now anyway). + pass + else: + # We're still here and we have directory content, get it into + # the tree. + if content: + self._populate_node(node, content) + finally: + # Mark this iteration as done. + self._load_queue.task_done() + + async def _on_tree_node_expanded( + self, event: Tree.NodeExpanded[CatalogItem] + ) -> None: + event.stop() + node = event.node + if node.data is None: + return + if isinstance(node.data, InteractiveCatalogItem) and not node.data.loaded: + # if this node isn't loaded yet, add it to the front of the queue + await self._add_to_load_queue(node, priority=0) # type: ignore[arg-type] + if ( + isinstance(node.data, CatalogItem) + and node.data.children + and not node.children + ): + self._populate_node(node, content=node.data.children) + # pre-fetch the node's grandchildren + for child in node.children: + if isinstance(child.data, InteractiveCatalogItem): + self._add_to_load_queue(child) # type: ignore[arg-type] diff --git a/src/harlequin/components/data_catalog/file_tree.py b/src/harlequin/components/data_catalog/file_tree.py new file mode 100644 index 00000000..0bb2cede --- /dev/null +++ b/src/harlequin/components/data_catalog/file_tree.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +from typing import ClassVar + +from textual.widgets import ( + DirectoryTree, +) + +from harlequin.components.data_catalog.tree import HarlequinTree as HarlequinTree +from harlequin.messages import WidgetMounted + + +class FileTree(HarlequinTree, DirectoryTree, inherit_bindings=False): + COMPONENT_CLASSES: ClassVar[set[str]] = { + "directory-tree--extension", + "directory-tree--file", + "directory-tree--folder", + "directory-tree--hidden", + } + + def on_mount(self) -> None: + self.guide_depth = 3 + self.root.expand() + self.post_message(WidgetMounted(widget=self)) diff --git a/src/harlequin/components/data_catalog/s3_tree.py b/src/harlequin/components/data_catalog/s3_tree.py new file mode 100644 index 00000000..1a929726 --- /dev/null +++ b/src/harlequin/components/data_catalog/s3_tree.py @@ -0,0 +1,193 @@ +from __future__ import annotations + +from typing import ClassVar +from urllib.parse import urlsplit + +from textual import on, work +from textual.message import Message +from textual.widgets import ( + DirectoryTree, +) +from textual.widgets._tree import TreeNode +from textual.worker import Worker, WorkerState + +from harlequin.catalog_cache import recursive_dict +from harlequin.components.data_catalog.tree import HarlequinTree as HarlequinTree +from harlequin.messages import WidgetMounted + +try: + import boto3 +except ImportError: + boto3 = None # type: ignore + + +class S3Tree(HarlequinTree[str], inherit_bindings=False): + COMPONENT_CLASSES: ClassVar[set[str]] = { + "directory-tree--extension", + "directory-tree--file", + "directory-tree--folder", + "directory-tree--hidden", + } + + class DataReady(Message): + def __init__(self, data: dict) -> None: + self.data = data + super().__init__() + + def __init__( + self, + uri: str, + data: str | None = None, + name: str | None = None, + id: str | None = None, # noqa: A002 + classes: str | None = None, + disabled: bool = False, + ) -> None: + self.endpoint_url, self.bucket, self.prefix = self._parse_s3_uri(uri) + self.catalog_data: dict | None = None + super().__init__( + "Root", data, name=name, id=id, classes=classes, disabled=disabled + ) + + render_label = DirectoryTree.render_label # type: ignore[assignment] + + def on_mount(self) -> None: + self.guide_depth = 3 + self.show_root = False + self.root.data = self.endpoint_url or "s3:/" + self.reload() + self.post_message(WidgetMounted(widget=self)) + + @property + def cache_key(self) -> tuple[str | None, str | None, str | None]: + return (self.endpoint_url, self.bucket, self.prefix) + + @on(DataReady) + def build_tree_from_message_data(self, message: S3Tree.DataReady) -> None: + self.build_tree(message.data) + + def build_tree(self, data: dict) -> None: + self.catalog_data = data + self.clear() + self._build_subtree(data=data, parent=self.root) + self.root.expand() + self.loading = False + + @on(Worker.StateChanged) + async def handle_worker_state_change(self, message: Worker.StateChanged) -> None: + if message.state == WorkerState.ERROR: + await self._handle_worker_error(message) + + async def _handle_worker_error(self, message: Worker.StateChanged) -> None: + if ( + message.worker.name == "_reload_objects" + and message.worker.error is not None + ): + self.post_message( + self.CatalogError(catalog_type="s3", error=message.worker.error) + ) + self.loading = False + + @staticmethod + def _parse_s3_uri(uri: str) -> tuple[str | None, str | None, str | None]: + """ + Any of these are acceptable: + my-bucket + my-bucket/my-prefix + s3://my-bucket + s3://my-bucket/my-prefix + https://my-storage.com/my-bucket/ + https://my-storage.com/my-bucket/my-prefix + https://my-bucket.s3.amazonaws.com/my-prefix + https://my-bucket.storage.googleapis.com/my-prefix + """ + + def _is_prefixed_aws_url(netloc: str) -> bool: + parts = netloc.split(".") + print(parts) + if ".".join(parts[1:]) == "s3.amazonaws.com": + return True + return False + + def _is_prefixed_gcs_url(netloc: str) -> bool: + parts = netloc.split(".") + if ".".join(parts[1:]) == "storage.googleapis.com": + return True + return False + + if uri == "all": + # special keyword so we list all buckets + return None, None, None + + scheme, netloc, path, *_ = urlsplit(uri) + path = path.lstrip("/") + bucket: str | None + + if not scheme: + assert not netloc + endpoint_url = None + bucket = path.split("/")[0] + prefix = "/".join(path.split("/")[1:]) + elif scheme == "s3": + endpoint_url = None + bucket = netloc + prefix = path + elif _is_prefixed_aws_url(netloc): + endpoint_url = None + bucket = netloc.split(".")[0] + prefix = path + elif _is_prefixed_gcs_url(netloc): + endpoint_url = "https://storage.googleapis.com" + bucket = netloc.split(".")[0] + prefix = path + else: + endpoint_url = f"{scheme}://{netloc}" + bucket = path.split("/")[0] or None + prefix = "/".join(path.split("/")[1:]) + + return endpoint_url, bucket, prefix + + def reload(self) -> None: + self.loading = True + self._reload_objects() + + @work(thread=True, exclusive=True, exit_on_error=False) + def _reload_objects(self) -> None: + if boto3 is None: + return + + data = {} + s3 = boto3.resource("s3", endpoint_url=self.endpoint_url) + if self.bucket is None: + buckets = [b for b in s3.buckets.all()] + else: + buckets = [s3.Bucket(self.bucket)] + for bucket in buckets: + data[bucket.name] = recursive_dict() + object_gen = ( + bucket.objects.filter(Prefix=self.prefix) + if self.prefix + else bucket.objects.all() + ) + for obj in object_gen: + key_parts = obj.key.split("/") + target = data[bucket.name] + for part in key_parts: + target = target[part] + + self.post_message(S3Tree.DataReady(data=data)) + + def _build_subtree( + self, + data: dict[str, dict], + parent: TreeNode[str], + ) -> None: + for k in data: + if data[k]: + new_node = parent.add( + label=k, + data=f"{parent.data}/{k}", + ) + self._build_subtree(data[k], new_node) + else: + parent.add_leaf(label=k, data=f"{parent.data}/{k}") diff --git a/src/harlequin/components/data_catalog/tree.py b/src/harlequin/components/data_catalog/tree.py new file mode 100644 index 00000000..e8ad2b9c --- /dev/null +++ b/src/harlequin/components/data_catalog/tree.py @@ -0,0 +1,116 @@ +from __future__ import annotations + +from typing import Generic, TypeVar, Union + +from textual.events import Click +from textual.message import Message +from textual.widgets import ( + Tree, +) +from textual.widgets._directory_tree import DirEntry +from textual.widgets._tree import EventTreeDataType, TreeNode + +from harlequin.catalog import CatalogItem + +TTreeNode = TypeVar("TTreeNode") + + +class HarlequinTree(Tree[TTreeNode], inherit_bindings=False): + double_click: int | None = None + + class CatalogError(Message): + def __init__(self, catalog_type: str, error: BaseException) -> None: + self.catalog_type = catalog_type + self.error = error + super().__init__() + + class NodeSubmitted(Generic[EventTreeDataType], Message): + def __init__(self, node: TreeNode[EventTreeDataType]) -> None: + self.node: TreeNode[EventTreeDataType] = node + super().__init__() + + @property + def insert_name(self) -> str: + if not self.node.data: + return "" + elif isinstance(self.node.data, CatalogItem): + return self.node.data.query_name + elif isinstance(self.node.data, DirEntry): + return f"'{self.node.data.path}'" + else: + return str(self.node.data) + + class NodeCopied(Generic[EventTreeDataType], Message): + def __init__(self, node: TreeNode[EventTreeDataType]) -> None: + self.node: TreeNode[EventTreeDataType] = node + super().__init__() + + @property + def copy_name(self) -> str: + if not self.node.data: + return "" + elif isinstance(self.node.data, CatalogItem): + return self.node.data.query_name + elif isinstance(self.node.data, DirEntry): + return str(self.node.data.path) + else: + return str(self.node.data) + + class ShowContextMenu(Message): + def __init__(self, node: TreeNode) -> None: + self.node = node + super().__init__() + + class HideContextMenu(Message): + pass + + def on_focus(self) -> None: + if self.cursor_line < 0: + self.cursor_line = 0 + + async def on_click(self, event: Click) -> None: + meta = event.style.meta + click_line: Union[int, None] = meta.get("line", None) + if event.button == 1: # left button click + self.post_message(self.HideContextMenu()) + if ( + self.double_click is not None + and click_line is not None + and self.double_click == click_line + ): + event.prevent_default() + node = self.get_node_at_line(click_line) + if node is not None: + self.post_message(self.NodeSubmitted(node=node)) + node.expand() + else: + self.double_click = click_line + self.set_timer( + delay=0.5, + callback=self._clear_double_click, + name="double_click_timer", + ) + elif event.button == 3 and click_line is not None: # right click + node = self.get_node_at_line(click_line) + if node is not None and isinstance(node.data, CatalogItem): + self.post_message(self.ShowContextMenu(node=node)) + + def _clear_double_click(self) -> None: + self.double_click = None + + def action_submit(self) -> None: + if self.cursor_node is not None: + self.post_message(self.NodeSubmitted(node=self.cursor_node)) + + def action_copy(self) -> None: + if self.cursor_node is not None: + self.post_message(self.NodeCopied(node=self.cursor_node)) + + def action_show_context_menu(self) -> None: + if self.cursor_node is not None and isinstance( + self.cursor_node.data, CatalogItem + ): + self.post_message(self.ShowContextMenu(node=self.cursor_node)) + + def action_hide_context_menu(self) -> None: + self.post_message(self.HideContextMenu()) diff --git a/src/harlequin/driver.py b/src/harlequin/driver.py new file mode 100644 index 00000000..2c89f077 --- /dev/null +++ b/src/harlequin/driver.py @@ -0,0 +1,82 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Callable + +from textual.message import Message + +if TYPE_CHECKING: + from textual.notifications import SeverityLevel + + from harlequin.app import Harlequin + + +class HarlequinDriver: + """ + Provides an interface for Data Catalog interactions to drive + the Harlequin UI. These will always be called from worker + threads, so they use Messages to update the main Harlequin + state. + """ + + class ConfirmAndExecute(Message): + def __init__(self, callback: Callable[[], None], instructions: str) -> None: + super().__init__() + self.callback = callback + self.instructions = instructions + + class InsertTextAtSelection(Message): + def __init__(self, text: str) -> None: + super().__init__() + self.text = text + + class InsertTextInNewBuffer(Message): + def __init__(self, text: str) -> None: + super().__init__() + self.text = text + + class Notify(Message): + def __init__(self, notify_message: str, severity: "SeverityLevel") -> None: + super().__init__() + self.notify_message = notify_message + self.severity = severity + + class Refreshcatalog(Message): + pass + + def __init__(self, app: Harlequin) -> None: + self.app = app + + def insert_text_at_selection(self, text: str) -> None: + """ + Insert text at the cursor in Harlequin's editor. + """ + self.app.post_message(self.InsertTextAtSelection(text=text)) + + def insert_text_in_new_buffer(self, text: str) -> None: + """ + Create a new buffer (tab) in Harlequin's editor and insert the text. + """ + self.app.post_message(self.InsertTextInNewBuffer(text=text)) + + def confirm_and_execute( + self, callback: Callable[[], None], instructions: str = "Are you sure?" + ) -> None: + """ + Display a confirmation modal in Harlequin; If the user selects "Yes", + then Harlequin will invoke the callback. + """ + self.app.post_message( + self.ConfirmAndExecute(callback=callback, instructions=instructions) + ) + + def notify(self, message: str, severity: "SeverityLevel" = "information") -> None: + """ + Show a toast notification in Harlequin. + """ + self.app.post_message(self.Notify(notify_message=message, severity=severity)) + + def refresh_catalog(self) -> None: + """ + Force a refresh of the catalog. + """ + self.app.post_message(self.Refreshcatalog()) diff --git a/src/harlequin_duckdb/adapter.py b/src/harlequin_duckdb/adapter.py index a01f26a6..e9ddaf82 100644 --- a/src/harlequin_duckdb/adapter.py +++ b/src/harlequin_duckdb/adapter.py @@ -16,6 +16,7 @@ HarlequinConnectionError, HarlequinQueryError, ) +from harlequin_duckdb.catalog import DatabaseCatalogItem from harlequin_duckdb.cli_options import DUCKDB_OPTIONS from harlequin_duckdb.completions import get_completion_data @@ -55,6 +56,17 @@ def fetchall(self) -> AutoBackendType | None: ) from e return result + def fetchone(self) -> tuple | None: + try: + result = self.relation.fetchone() + except duckdb.InterruptException: + return None + except duckdb.Error as e: + raise HarlequinQueryError( + msg=str(e), title="DuckDB raised an error when running your query:" + ) from e + return result + class DuckDbConnection(HarlequinConnection): RELATION_TYPE_MAPPING = { @@ -126,52 +138,9 @@ def cancel(self) -> None: def get_catalog(self) -> Catalog: catalog_items: list[CatalogItem] = [] databases = self._get_databases() - for (database,) in databases: - database_identifier = f'"{database}"' - schemas = self._get_schemas(database) - schema_items: list[CatalogItem] = [] - for (schema,) in schemas: - schema_identifier = f'{database_identifier}."{schema}"' - tables = self._get_tables(database, schema) - table_items: list[CatalogItem] = [] - for table, kind in tables: - table_identifier = f'{schema_identifier}."{table}"' - columns = self._get_columns(database, schema, table) - column_items = [ - CatalogItem( - qualified_identifier=f'{table_identifier}."{col[0]}"', - query_name=f'"{col[0]}"', - label=col[0], - type_label=self._short_column_type(col[1]), - ) - for col in columns - ] - table_items.append( - CatalogItem( - qualified_identifier=table_identifier, - query_name=table_identifier, - label=table, - type_label=self._short_relation_type(kind), - children=column_items, - ) - ) - schema_items.append( - CatalogItem( - qualified_identifier=schema_identifier, - query_name=schema_identifier, - label=schema, - type_label="sch", - children=table_items, - ) - ) + for (database_label,) in databases: catalog_items.append( - CatalogItem( - qualified_identifier=database_identifier, - query_name=database_identifier, - label=database, - type_label="db", - children=schema_items, - ) + DatabaseCatalogItem.from_label(label=database_label, connection=self) ) return Catalog(items=catalog_items) diff --git a/src/harlequin_duckdb/catalog.py b/src/harlequin_duckdb/catalog.py new file mode 100644 index 00000000..67b424a8 --- /dev/null +++ b/src/harlequin_duckdb/catalog.py @@ -0,0 +1,231 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING + +from harlequin.catalog import InteractiveCatalogItem +from harlequin_duckdb.interactions import ( + execute_drop_schema_statement, + execute_drop_table_statement, + execute_drop_view_statement, + execute_use_statement, + insert_columns_at_cursor, + show_describe_relation, + show_export_database, + show_select_star, + show_summarize_relation, + show_table_ddl, + show_view_ddl, +) + +if TYPE_CHECKING: + from harlequin_duckdb.adapter import DuckDbConnection + + +@dataclass +class ColumnCatalogItem(InteractiveCatalogItem["DuckDbConnection"]): + parent: "RelationCatalogItem" | None = None + + @classmethod + def from_parent( + cls, + parent: "RelationCatalogItem", + label: str, + type_label: str, + ) -> "ColumnCatalogItem": + column_qualified_identifier = f'{parent.qualified_identifier}."{label}"' + column_query_name = f'"{label}"' + return cls( + qualified_identifier=column_qualified_identifier, + query_name=column_query_name, + label=label, + type_label=type_label, + connection=parent.connection, + parent=parent, + loaded=True, + ) + + +@dataclass +class RelationCatalogItem(InteractiveCatalogItem["DuckDbConnection"]): + INTERACTIONS = [ + ("Insert Columns at Cursor", insert_columns_at_cursor), + ("Preview Data", show_select_star), + ("Describe", show_describe_relation), + ("Summarize", show_summarize_relation), + ] + parent: "SchemaCatalogItem" | None = None + + def fetch_children(self) -> list[ColumnCatalogItem]: + if self.parent is None or self.parent.parent is None or self.connection is None: + return [] + result = self.connection._get_columns( + self.parent.parent.label, self.parent.label, self.label + ) + return [ + ColumnCatalogItem.from_parent( + parent=self, + label=column_name, + type_label=self.connection._short_column_type(column_type), + ) + for column_name, column_type in result + ] + + +class ViewCatalogItem(RelationCatalogItem): + INTERACTIONS = RelationCatalogItem.INTERACTIONS + [ + ("Show DDL", show_view_ddl), + ("Drop View", execute_drop_view_statement), + ] + + @classmethod + def from_parent( + cls, + parent: "SchemaCatalogItem", + label: str, + ) -> "ViewCatalogItem": + relation_query_name = f'"{parent.label}"."{label}"' + relation_qualified_identifier = f'{parent.qualified_identifier}."{label}"' + return cls( + qualified_identifier=relation_qualified_identifier, + query_name=relation_query_name, + label=label, + type_label="v", + connection=parent.connection, + parent=parent, + ) + + +class TableCatalogItem(RelationCatalogItem): + INTERACTIONS = RelationCatalogItem.INTERACTIONS + [ + ("Show DDL", show_table_ddl), + ("Drop Table", execute_drop_table_statement), + ] + + @classmethod + def from_parent( + cls, + parent: "SchemaCatalogItem", + label: str, + ) -> "TableCatalogItem": + relation_query_name = f'"{parent.label}"."{label}"' + relation_qualified_identifier = f'{parent.qualified_identifier}."{label}"' + return cls( + qualified_identifier=relation_qualified_identifier, + query_name=relation_query_name, + label=label, + type_label="t", + connection=parent.connection, + parent=parent, + ) + + +class TempTableCatalogItem(TableCatalogItem): + INTERACTIONS = RelationCatalogItem.INTERACTIONS + [ + ("Show DDL", show_table_ddl), + ("Drop Table", execute_drop_table_statement), + ] + + @classmethod + def from_parent( + cls, + parent: "SchemaCatalogItem", + label: str, + ) -> "TempTableCatalogItem": + relation_query_name = f'"{parent.label}"."{label}"' + relation_qualified_identifier = f'{parent.qualified_identifier}."{label}"' + return cls( + qualified_identifier=relation_qualified_identifier, + query_name=relation_query_name, + label=label, + type_label="tmp", + connection=parent.connection, + parent=parent, + ) + + +@dataclass +class SchemaCatalogItem(InteractiveCatalogItem["DuckDbConnection"]): + INTERACTIONS = [ + ("Switch Editor Context (Use)", execute_use_statement), + ("Drop Schema", execute_drop_schema_statement), + ] + parent: "DatabaseCatalogItem" | None = None + + @classmethod + def from_parent( + cls, + parent: "DatabaseCatalogItem", + label: str, + ) -> "SchemaCatalogItem": + schema_identifier = f'{parent.qualified_identifier}."{label}"' + return cls( + qualified_identifier=schema_identifier, + query_name=schema_identifier, + label=label, + type_label="sch", + connection=parent.connection, + parent=parent, + ) + + def fetch_children(self) -> list[RelationCatalogItem]: + if self.parent is None or self.connection is None: + return [] + children: list[RelationCatalogItem] = [] + result = self.connection._get_tables(self.parent.label, self.label) + for table_label, table_type in result: + if table_type == "VIEW": + children.append( + ViewCatalogItem.from_parent( + parent=self, + label=table_label, + ) + ) + elif table_type == "LOCAL TEMPORARY": + children.append( + TempTableCatalogItem.from_parent( + parent=self, + label=table_label, + ) + ) + else: + children.append( + TableCatalogItem.from_parent( + parent=self, + label=table_label, + ) + ) + + return children + + +class DatabaseCatalogItem(InteractiveCatalogItem["DuckDbConnection"]): + INTERACTIONS = [ + ("Switch Editor Context (Use)", execute_use_statement), + ("Export Database", show_export_database), + ] + + @classmethod + def from_label( + cls, label: str, connection: "DuckDbConnection" + ) -> "DatabaseCatalogItem": + database_identifier = f'"{label}"' + return cls( + qualified_identifier=database_identifier, + query_name=database_identifier, + label=label, + type_label="db", + connection=connection, + ) + + def fetch_children(self) -> list[SchemaCatalogItem]: + if self.connection is None: + return [] + schemas = self.connection._get_schemas(self.label) + return [ + SchemaCatalogItem.from_parent( + parent=self, + label=schema_label, + ) + for (schema_label,) in schemas + ] diff --git a/src/harlequin_duckdb/interactions.py b/src/harlequin_duckdb/interactions.py new file mode 100644 index 00000000..e3ab9ae0 --- /dev/null +++ b/src/harlequin_duckdb/interactions.py @@ -0,0 +1,179 @@ +from __future__ import annotations + +from textwrap import dedent +from typing import TYPE_CHECKING, Literal, Sequence + +from harlequin.catalog import CatalogItem +from harlequin.exception import HarlequinQueryError + +if TYPE_CHECKING: + from harlequin.driver import HarlequinDriver + from harlequin_duckdb.catalog import ( + ColumnCatalogItem, + DatabaseCatalogItem, + RelationCatalogItem, + SchemaCatalogItem, + ) + + +def execute_use_statement( + item: "DatabaseCatalogItem" | "SchemaCatalogItem", + driver: "HarlequinDriver", +) -> None: + if item.connection is None: + return + try: + item.connection.execute(f"use {item.qualified_identifier}") + except HarlequinQueryError: + driver.notify("Could not switch context", severity="error") + raise + else: + driver.notify(f"Editor context switched to {item.label}") + + +def execute_drop_schema_statement( + item: "SchemaCatalogItem", + driver: "HarlequinDriver", +) -> None: + def _drop_schema() -> None: + if item.connection is None: + return + try: + item.connection.execute(f"drop schema {item.qualified_identifier} cascade") + except HarlequinQueryError: + driver.notify(f"Could not drop schema {item.label}", severity="error") + raise + else: + driver.notify(f"Dropped schema {item.label}") + driver.refresh_catalog() + + if item.children or item.fetch_children(): + driver.confirm_and_execute(callback=_drop_schema) + else: + _drop_schema() + + +def execute_drop_relation_statement( + item: "RelationCatalogItem", + driver: "HarlequinDriver", + relation_type: Literal["view", "table"], +) -> None: + def _drop_relation() -> None: + if item.connection is None: + return + try: + item.connection.execute(f"drop {relation_type} {item.qualified_identifier}") + except HarlequinQueryError: + driver.notify( + f"Could not drop {relation_type} {item.label}", severity="error" + ) + raise + else: + driver.notify(f"Dropped {relation_type} {item.label}") + driver.refresh_catalog() + + driver.confirm_and_execute(callback=_drop_relation) + + +def execute_drop_table_statement( + item: "RelationCatalogItem", driver: "HarlequinDriver" +) -> None: + execute_drop_relation_statement(item=item, driver=driver, relation_type="table") + + +def execute_drop_view_statement( + item: "RelationCatalogItem", driver: "HarlequinDriver" +) -> None: + execute_drop_relation_statement(item=item, driver=driver, relation_type="view") + + +def show_export_database( + item: "DatabaseCatalogItem", + driver: "HarlequinDriver", +) -> None: + driver.insert_text_in_new_buffer( + dedent( + f""" + use {item.qualified_identifier}; + export database './target_directory'; + """.strip("\n") + ) + ) + + +def show_describe_relation( + item: "RelationCatalogItem", + driver: "HarlequinDriver", +) -> None: + driver.insert_text_in_new_buffer(text=f"describe {item.qualified_identifier}") + + +def show_summarize_relation( + item: "RelationCatalogItem", + driver: "HarlequinDriver", +) -> None: + driver.insert_text_in_new_buffer(text=f"summarize {item.qualified_identifier}") + + +def show_relation_ddl( + item: "RelationCatalogItem", + driver: "HarlequinDriver", + relation_type: Literal["view", "table"], +) -> None: + if item.parent is None or item.parent.parent is None or item.connection is None: + return + table_function = "duckdb_tables()" if relation_type == "table" else "duckdb_views()" + cursor = item.connection.execute( + f""" + select sql + from {table_function} + where database_name = '{item.parent.parent.label}' + and schema_name = '{item.parent.label}' + and {relation_type}_name = '{item.label}' + limit 1 + """ + ) + assert cursor is not None + result = cursor.fetchone() + if result is not None: + driver.insert_text_in_new_buffer(text=result[0]) + + +def show_table_ddl( + item: "RelationCatalogItem", + driver: "HarlequinDriver", +) -> None: + show_relation_ddl(item=item, driver=driver, relation_type="table") + + +def show_view_ddl( + item: "RelationCatalogItem", + driver: "HarlequinDriver", +) -> None: + show_relation_ddl(item=item, driver=driver, relation_type="view") + + +def show_select_star( + item: "RelationCatalogItem", + driver: "HarlequinDriver", +) -> None: + driver.insert_text_in_new_buffer( + dedent( + f""" + select * + from {item.qualified_identifier} + limit 100 + """.strip("\n") + ) + ) + + +def insert_columns_at_cursor( + item: "RelationCatalogItem", + driver: "HarlequinDriver", +) -> None: + if item.loaded: + cols: Sequence["CatalogItem" | "ColumnCatalogItem"] = item.children + else: + cols = item.fetch_children() + driver.insert_text_at_selection(text=",\n".join(c.query_name for c in cols)) diff --git a/src/harlequin_sqlite/adapter.py b/src/harlequin_sqlite/adapter.py index e1e7313f..b47932c4 100644 --- a/src/harlequin_sqlite/adapter.py +++ b/src/harlequin_sqlite/adapter.py @@ -19,6 +19,7 @@ ) from harlequin.options import HarlequinAdapterOption, HarlequinCopyFormat from harlequin.transaction_mode import HarlequinTransactionMode +from harlequin_sqlite.catalog import DatabaseCatalogItem from harlequin_sqlite.cli_options import SQLITE_OPTIONS from harlequin_sqlite.completions import get_completion_data @@ -72,6 +73,9 @@ def fetchall(self) -> AutoBackendType | None: else: return None + def fetchone(self) -> tuple | None: + return self._first_row + class HarlequinSqliteConnection(HarlequinConnection): def __init__(self, conn: sqlite3.Connection, init_message: str = "") -> None: @@ -128,39 +132,9 @@ def cancel(self) -> None: def get_catalog(self) -> Catalog: catalog_items: list[CatalogItem] = [] databases = self._get_databases() - for db_name in databases: - relations = self._get_relations(db_name=db_name) - db_identifier = f'"{db_name}"' - rel_items: list[CatalogItem] = [] - for rel_name, rel_type in relations: - rel_identifier = f'{db_identifier}."{rel_name}"' - cols = self._get_columns(db_name=db_name, rel_name=rel_name) - col_items = [ - CatalogItem( - qualified_identifier=f'{rel_identifier}."{col_name}"', - query_name=f'"{col_name}"', - label=col_name, - type_label=self._short_column_type(col_type), - ) - for _, col_name, col_type, *_ in cols - ] - rel_items.append( - CatalogItem( - qualified_identifier=rel_identifier, - query_name=rel_identifier, - label=rel_name, - type_label=self._short_relation_type(rel_type), - children=col_items, - ) - ) + for database_label in databases: catalog_items.append( - CatalogItem( - qualified_identifier=db_identifier, - query_name=db_identifier, - label=db_name, - type_label="db", - children=rel_items, - ) + DatabaseCatalogItem.from_label(label=database_label, connection=self) ) return Catalog(items=catalog_items) diff --git a/src/harlequin_sqlite/catalog.py b/src/harlequin_sqlite/catalog.py new file mode 100644 index 00000000..8c43333d --- /dev/null +++ b/src/harlequin_sqlite/catalog.py @@ -0,0 +1,151 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING + +from harlequin.catalog import InteractiveCatalogItem +from harlequin_sqlite.interactions import ( + execute_drop_table_statement, + execute_drop_view_statement, + insert_columns_at_cursor, + show_describe_relation, + show_relation_ddl, + show_select_star, +) + +if TYPE_CHECKING: + from harlequin_sqlite.adapter import HarlequinSqliteConnection + + +@dataclass +class ColumnCatalogItem(InteractiveCatalogItem["HarlequinSqliteConnection"]): + parent: "RelationCatalogItem" | None = None + + @classmethod + def from_parent( + cls, + parent: "RelationCatalogItem", + label: str, + type_label: str, + ) -> "ColumnCatalogItem": + column_qualified_identifier = f'{parent.qualified_identifier}."{label}"' + column_query_name = f'"{label}"' + return cls( + qualified_identifier=column_qualified_identifier, + query_name=column_query_name, + label=label, + type_label=type_label, + connection=parent.connection, + parent=parent, + loaded=True, + ) + + +@dataclass +class RelationCatalogItem(InteractiveCatalogItem["HarlequinSqliteConnection"]): + INTERACTIONS = [ + ("Insert Columns at Cursor", insert_columns_at_cursor), + ("Preview Data", show_select_star), + ("Describe", show_describe_relation), + ("Show DDL", show_relation_ddl), + ] + parent: "DatabaseCatalogItem" | None = None + + def fetch_children(self) -> list[ColumnCatalogItem]: + if self.parent is None is None or self.connection is None: + return [] + result = self.connection._get_columns(self.parent.label, self.label) + return [ + ColumnCatalogItem.from_parent( + parent=self, + label=column_name, + type_label=self.connection._short_column_type(column_type), + ) + for _, column_name, column_type, *_ in result + ] + + +class ViewCatalogItem(RelationCatalogItem): + INTERACTIONS = RelationCatalogItem.INTERACTIONS + [ + ("Drop View", execute_drop_view_statement), + ] + + @classmethod + def from_parent( + cls, + parent: "DatabaseCatalogItem", + label: str, + ) -> "ViewCatalogItem": + relation_query_name = f'"{parent.label}"."{label}"' + relation_qualified_identifier = f'{parent.qualified_identifier}."{label}"' + return cls( + qualified_identifier=relation_qualified_identifier, + query_name=relation_query_name, + label=label, + type_label="v", + connection=parent.connection, + parent=parent, + ) + + +class TableCatalogItem(RelationCatalogItem): + INTERACTIONS = RelationCatalogItem.INTERACTIONS + [ + ("Drop Table", execute_drop_table_statement), + ] + + @classmethod + def from_parent( + cls, + parent: "DatabaseCatalogItem", + label: str, + ) -> "TableCatalogItem": + relation_query_name = f'"{parent.label}"."{label}"' + relation_qualified_identifier = f'{parent.qualified_identifier}."{label}"' + return cls( + qualified_identifier=relation_qualified_identifier, + query_name=relation_query_name, + label=label, + type_label="t", + connection=parent.connection, + parent=parent, + ) + + +class DatabaseCatalogItem(InteractiveCatalogItem["HarlequinSqliteConnection"]): + INTERACTIONS = [] + + @classmethod + def from_label( + cls, label: str, connection: "HarlequinSqliteConnection" + ) -> "DatabaseCatalogItem": + database_identifier = f'"{label}"' + return cls( + qualified_identifier=database_identifier, + query_name=database_identifier, + label=label, + type_label="db", + connection=connection, + ) + + def fetch_children(self) -> list[RelationCatalogItem]: + if self.connection is None: + return [] + children: list[RelationCatalogItem] = [] + result = self.connection._get_relations(self.label) + for table_label, table_type in result: + if table_type == "view": + children.append( + ViewCatalogItem.from_parent( + parent=self, + label=table_label, + ) + ) + else: + children.append( + TableCatalogItem.from_parent( + parent=self, + label=table_label, + ) + ) + + return children diff --git a/src/harlequin_sqlite/interactions.py b/src/harlequin_sqlite/interactions.py new file mode 100644 index 00000000..016328e6 --- /dev/null +++ b/src/harlequin_sqlite/interactions.py @@ -0,0 +1,103 @@ +from __future__ import annotations + +from textwrap import dedent +from typing import TYPE_CHECKING, Literal, Sequence + +from harlequin.catalog import CatalogItem +from harlequin.exception import HarlequinQueryError + +if TYPE_CHECKING: + from harlequin.driver import HarlequinDriver + from harlequin_sqlite.catalog import ( + ColumnCatalogItem, + RelationCatalogItem, + ) + + +def execute_drop_relation_statement( + item: "RelationCatalogItem", + driver: "HarlequinDriver", + relation_type: Literal["view", "table"], +) -> None: + def _drop_relation() -> None: + if item.connection is None: + return + try: + item.connection.execute(f"drop {relation_type} {item.qualified_identifier}") + except HarlequinQueryError: + driver.notify( + f"Could not drop {relation_type} {item.label}", severity="error" + ) + raise + else: + driver.notify(f"Dropped {relation_type} {item.label}") + driver.refresh_catalog() + + driver.confirm_and_execute(callback=_drop_relation) + + +def execute_drop_table_statement( + item: "RelationCatalogItem", driver: "HarlequinDriver" +) -> None: + execute_drop_relation_statement(item=item, driver=driver, relation_type="table") + + +def execute_drop_view_statement( + item: "RelationCatalogItem", driver: "HarlequinDriver" +) -> None: + execute_drop_relation_statement(item=item, driver=driver, relation_type="view") + + +def show_describe_relation( + item: "RelationCatalogItem", + driver: "HarlequinDriver", +) -> None: + driver.insert_text_in_new_buffer( + text=f"pragma table_info({item.qualified_identifier})" + ) + + +def show_relation_ddl( + item: "RelationCatalogItem", + driver: "HarlequinDriver", +) -> None: + if item.parent is None or item.connection is None: + return + cursor = item.connection.execute( + f""" + select sql + from sqlite_schema + where tbl_name = '{item.label}' + limit 1 + """ + ) + assert cursor is not None + result = cursor.fetchone() + if result is not None: + driver.insert_text_in_new_buffer(text=result[0]) + + +def show_select_star( + item: "RelationCatalogItem", + driver: "HarlequinDriver", +) -> None: + driver.insert_text_in_new_buffer( + dedent( + f""" + select * + from {item.qualified_identifier} + limit 100 + """.strip("\n") + ) + ) + + +def insert_columns_at_cursor( + item: "RelationCatalogItem", + driver: "HarlequinDriver", +) -> None: + if item.loaded: + cols: Sequence["CatalogItem" | "ColumnCatalogItem"] = item.children + else: + cols = item.fetch_children() + driver.insert_text_at_selection(text=",\n".join(c.query_name for c in cols)) diff --git a/src/harlequin_vscode/__init__.py b/src/harlequin_vscode/__init__.py index 5e9875c5..36404c30 100644 --- a/src/harlequin_vscode/__init__.py +++ b/src/harlequin_vscode/__init__.py @@ -77,6 +77,8 @@ HarlequinKeyBinding("space", "data_catalog.toggle_node"), HarlequinKeyBinding("up", "data_catalog.cursor_up"), HarlequinKeyBinding("down", "data_catalog.cursor_down"), + HarlequinKeyBinding("full_stop", "data_catalog.show_context_menu"), + HarlequinKeyBinding("escape", "data_catalog.hide_context_menu"), ] VSCODE_RESULTS_VIEWER_BINDINGS = [ HarlequinKeyBinding("j", "results_viewer.previous_tab"), diff --git a/src/scripts/export_screenshots.py b/src/scripts/export_screenshots.py index 85258c55..8a3d6de1 100644 --- a/src/scripts/export_screenshots.py +++ b/src/scripts/export_screenshots.py @@ -20,13 +20,21 @@ """.strip() +async def wait_for_filtered_workers(app: Harlequin) -> None: + filtered_workers = [ + w for w in app.workers if w.name != "_database_tree_background_loader" + ] + if filtered_workers: + await app.workers.wait_for_complete(filtered_workers) + + async def save_all_screenshots() -> None: adapter = DuckDbAdapter(("f1.db",), no_init=True) for theme in get_all_styles(): print(f"Screenshotting {theme}") app = Harlequin(adapter=adapter, theme=theme) async with app.run_test(size=(120, 36)) as pilot: - await app.workers.wait_for_complete() + await wait_for_filtered_workers(app) await pilot.pause() if app.editor is None: await pilot.pause(0.2) diff --git a/src/scripts/profile_buffers.py b/src/scripts/profile_buffers.py index 8c4d279b..07d349a7 100644 --- a/src/scripts/profile_buffers.py +++ b/src/scripts/profile_buffers.py @@ -8,6 +8,14 @@ from harlequin_duckdb import DuckDbAdapter +async def wait_for_filtered_workers(app: Harlequin) -> None: + filtered_workers = [ + w for w in app.workers if w.name != "_database_tree_background_loader" + ] + if filtered_workers: + await app.workers.wait_for_complete(filtered_workers) + + async def load_lots_of_buffers() -> None: with patch("harlequin.components.code_editor.load_cache") as mock_load_cache: buff = BufferState( @@ -21,7 +29,7 @@ async def load_lots_of_buffers() -> None: app = Harlequin(adapter=adapter) async with app.run_test() as pilot: - await app.workers.wait_for_complete() + await wait_for_filtered_workers(app) await pilot.pause() app.exit() diff --git a/tests/adapter_tests/test_duckdb.py b/tests/adapter_tests/test_duckdb.py index d00e26cd..428db32f 100644 --- a/tests/adapter_tests/test_duckdb.py +++ b/tests/adapter_tests/test_duckdb.py @@ -5,7 +5,7 @@ import pytest -from harlequin.catalog import Catalog, CatalogItem +from harlequin.catalog import Catalog, CatalogItem, InteractiveCatalogItem from harlequin.exception import HarlequinConnectionError from harlequin_duckdb.adapter import DuckDbAdapter @@ -224,7 +224,33 @@ def test_get_catalog(tiny_duck: Path, small_duck: Path) -> None: ), ] ) - assert conn.get_catalog() == expected + catalog = conn.get_catalog() + assert [item.label for item in catalog.items] == [ + item.label for item in expected.items + ] + for i, database_item in enumerate(catalog.items): + assert isinstance(database_item, InteractiveCatalogItem) + assert database_item.children == [] + schema_items = database_item.fetch_children() + assert [item.label for item in schema_items] == [ + item.label for item in expected.items[i].children + ] + for j, schema_item in enumerate(schema_items): + assert isinstance(schema_item, InteractiveCatalogItem) + assert schema_item.children == [] + relation_items = schema_item.fetch_children() + assert [(item.label, item.type_label) for item in relation_items] == [ + (item.label, item.type_label) + for item in expected.items[i].children[j].children + ] + for k, relation_item in enumerate(relation_items): + assert isinstance(relation_item, InteractiveCatalogItem) + assert relation_item.children == [] + column_items = relation_item.fetch_children() + assert [(item.label, item.type_label) for item in column_items] == [ + (item.label, item.type_label) + for item in expected.items[i].children[j].children[k].children + ] def test_init_script(tiny_duck: Path, tmp_path: Path) -> None: diff --git a/tests/adapter_tests/test_sqlite.py b/tests/adapter_tests/test_sqlite.py index 92dd79a3..cbc4bd0a 100644 --- a/tests/adapter_tests/test_sqlite.py +++ b/tests/adapter_tests/test_sqlite.py @@ -6,7 +6,7 @@ import pytest -from harlequin.catalog import Catalog, CatalogItem +from harlequin.catalog import Catalog, CatalogItem, InteractiveCatalogItem from harlequin.exception import HarlequinConfigError, HarlequinConnectionError from harlequin_sqlite import HarlequinSqliteAdapter @@ -179,7 +179,33 @@ def test_get_catalog(tiny_sqlite: Path, small_sqlite: Path) -> None: ), ] ) - assert conn.get_catalog() == expected + catalog = conn.get_catalog() + assert [item.label for item in catalog.items] == [ + item.label for item in expected.items + ] + for i, database_item in enumerate(catalog.items): + assert isinstance(database_item, InteractiveCatalogItem) + assert database_item.children == [] + schema_items = database_item.fetch_children() + assert [item.label for item in schema_items] == [ + item.label for item in expected.items[i].children + ] + for j, schema_item in enumerate(schema_items): + assert isinstance(schema_item, InteractiveCatalogItem) + assert schema_item.children == [] + relation_items = schema_item.fetch_children() + assert [(item.label, item.type_label) for item in relation_items] == [ + (item.label, item.type_label) + for item in expected.items[i].children[j].children + ] + for k, relation_item in enumerate(relation_items): + assert isinstance(relation_item, InteractiveCatalogItem) + assert relation_item.children == [] + column_items = relation_item.fetch_children() + assert [(item.label, item.type_label) for item in column_items] == [ + (item.label, item.type_label) + for item in expected.items[i].children[j].children[k].children + ] def test_init_script(tiny_sqlite: Path, tmp_path: Path) -> None: diff --git a/tests/functional_tests/__snapshots__/test_app.ambr b/tests/functional_tests/__snapshots__/test_app.ambr index e9e3103a..e13b2b66 100644 --- a/tests/functional_tests/__snapshots__/test_app.ambr +++ b/tests/functional_tests/__snapshots__/test_app.ambr @@ -22,147 +22,147 @@ font-weight: 700; } - .terminal-29070646-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-29070646-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-29070646-r1 { fill: #777777 } - .terminal-29070646-r2 { fill: #c5c8c6 } - .terminal-29070646-r3 { fill: #dfdfdf } - .terminal-29070646-r4 { fill: #858585 } - .terminal-29070646-r5 { fill: #feffac;font-weight: bold } - .terminal-29070646-r6 { fill: #dddddd } - .terminal-29070646-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-29070646-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-29070646-r9 { fill: #212116;font-weight: bold } - .terminal-29070646-r10 { fill: #feffac } - .terminal-29070646-r11 { fill: #dfdfdf;font-weight: bold } - .terminal-29070646-r12 { fill: #686868 } - .terminal-29070646-r13 { fill: #232323 } - .terminal-29070646-r14 { fill: #777777;font-weight: bold } - .terminal-29070646-r15 { fill: #08211a } - .terminal-29070646-r16 { fill: #45ffca;font-weight: bold } - .terminal-29070646-r17 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r12 { fill: #686868 } + .terminal-9999999-r13 { fill: #232323 } + .terminal-9999999-r14 { fill: #777777;font-weight: bold } + .terminal-9999999-r15 { fill: #08211a } + .terminal-9999999-r16 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r17 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db││1  select1select2 - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Selection  - ╭─ Query Results (1 Records) ──────────────────────────────╮ - - Result 1Result 2 - ━╸━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -  1 #                                                     │ -    1  - - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db││1  select1select2 + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Selection  + ╭─ Query Results (1 Records) ──────────────────────────────╮ + + Result 1Result 2 + ━╸━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +  1 #                                                     │ +    1  + + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -192,147 +192,147 @@ font-weight: 700; } - .terminal-2005767480-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2005767480-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2005767480-r1 { fill: #777777 } - .terminal-2005767480-r2 { fill: #c5c8c6 } - .terminal-2005767480-r3 { fill: #dfdfdf } - .terminal-2005767480-r4 { fill: #858585 } - .terminal-2005767480-r5 { fill: #feffac;font-weight: bold } - .terminal-2005767480-r6 { fill: #dddddd } - .terminal-2005767480-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-2005767480-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-2005767480-r9 { fill: #212116;font-weight: bold } - .terminal-2005767480-r10 { fill: #feffac } - .terminal-2005767480-r11 { fill: #686868 } - .terminal-2005767480-r12 { fill: #dfdfdf;font-weight: bold } - .terminal-2005767480-r13 { fill: #232323 } - .terminal-2005767480-r14 { fill: #777777;font-weight: bold } - .terminal-2005767480-r15 { fill: #08211a } - .terminal-2005767480-r16 { fill: #45ffca;font-weight: bold } - .terminal-2005767480-r17 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #686868 } + .terminal-9999999-r12 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r13 { fill: #232323 } + .terminal-9999999-r14 { fill: #777777;font-weight: bold } + .terminal-9999999-r15 { fill: #08211a } + .terminal-9999999-r16 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r17 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db││1  select1select2 - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Selection  - ╭─ Query Results (1 Records) ──────────────────────────────╮ - - Result 1Result 2 - ━━━━━━━━━━━━╸━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -  2 #                                                     │ -    2  - - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db││1  select1select2 + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Selection  + ╭─ Query Results (1 Records) ──────────────────────────────╮ + + Result 1Result 2 + ━━━━━━━━━━━━╸━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +  2 #                                                     │ +    2  + + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -362,147 +362,147 @@ font-weight: 700; } - .terminal-2005767480-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2005767480-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2005767480-r1 { fill: #777777 } - .terminal-2005767480-r2 { fill: #c5c8c6 } - .terminal-2005767480-r3 { fill: #dfdfdf } - .terminal-2005767480-r4 { fill: #858585 } - .terminal-2005767480-r5 { fill: #feffac;font-weight: bold } - .terminal-2005767480-r6 { fill: #dddddd } - .terminal-2005767480-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-2005767480-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-2005767480-r9 { fill: #212116;font-weight: bold } - .terminal-2005767480-r10 { fill: #feffac } - .terminal-2005767480-r11 { fill: #686868 } - .terminal-2005767480-r12 { fill: #dfdfdf;font-weight: bold } - .terminal-2005767480-r13 { fill: #232323 } - .terminal-2005767480-r14 { fill: #777777;font-weight: bold } - .terminal-2005767480-r15 { fill: #08211a } - .terminal-2005767480-r16 { fill: #45ffca;font-weight: bold } - .terminal-2005767480-r17 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #686868 } + .terminal-9999999-r12 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r13 { fill: #232323 } + .terminal-9999999-r14 { fill: #777777;font-weight: bold } + .terminal-9999999-r15 { fill: #08211a } + .terminal-9999999-r16 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r17 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db││1  select1select2 - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Selection  - ╭─ Query Results (1 Records) ──────────────────────────────╮ - - Result 1Result 2 - ━━━━━━━━━━━━╸━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -  2 #                                                     │ -    2  - - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db││1  select1select2 + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Selection  + ╭─ Query Results (1 Records) ──────────────────────────────╮ + + Result 1Result 2 + ━━━━━━━━━━━━╸━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +  2 #                                                     │ +    2  + + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -532,144 +532,144 @@ font-weight: 700; } - .terminal-3829311374-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3829311374-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3829311374-r1 { fill: #777777 } - .terminal-3829311374-r2 { fill: #c5c8c6 } - .terminal-3829311374-r3 { fill: #dfdfdf } - .terminal-3829311374-r4 { fill: #858585 } - .terminal-3829311374-r5 { fill: #feffac;font-weight: bold } - .terminal-3829311374-r6 { fill: #dddddd } - .terminal-3829311374-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-3829311374-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-3829311374-r9 { fill: #212116;font-weight: bold } - .terminal-3829311374-r10 { fill: #feffac } - .terminal-3829311374-r11 { fill: #777777;font-weight: bold } - .terminal-3829311374-r12 { fill: #08211a } - .terminal-3829311374-r13 { fill: #45ffca;font-weight: bold } - .terminal-3829311374-r14 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #08211a } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db││1  select1select2 - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (1 Records) ──────────────────────────────╮ -  1 #                                                     │ -    1  - - - - - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db││1  select1select2 + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (1 Records) ──────────────────────────────╮ +  1 #                                                     │ +    1  + + + + + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -699,147 +699,147 @@ font-weight: 700; } - .terminal-423313598-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-423313598-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-423313598-r1 { fill: #777777 } - .terminal-423313598-r2 { fill: #c5c8c6 } - .terminal-423313598-r3 { fill: #dfdfdf } - .terminal-423313598-r4 { fill: #858585 } - .terminal-423313598-r5 { fill: #feffac;font-weight: bold } - .terminal-423313598-r6 { fill: #dddddd } - .terminal-423313598-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-423313598-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-423313598-r9 { fill: #212116;font-weight: bold } - .terminal-423313598-r10 { fill: #feffac } - .terminal-423313598-r11 { fill: #dfdfdf;font-weight: bold } - .terminal-423313598-r12 { fill: #686868 } - .terminal-423313598-r13 { fill: #232323 } - .terminal-423313598-r14 { fill: #777777;font-weight: bold } - .terminal-423313598-r15 { fill: #08211a } - .terminal-423313598-r16 { fill: #45ffca;font-weight: bold } - .terminal-423313598-r17 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r12 { fill: #686868 } + .terminal-9999999-r13 { fill: #232323 } + .terminal-9999999-r14 { fill: #777777;font-weight: bold } + .terminal-9999999-r15 { fill: #08211a } + .terminal-9999999-r16 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r17 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - main db││1  select1select2 - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Selection  - ╭─ Query Results (1 Records) ──────────────────────────────╮ - - Result 1Result 2 - ━╸━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -  1 ##                                                    │ -     1  - - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + main db││1  select1select2 + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Selection  + ╭─ Query Results (1 Records) ──────────────────────────────╮ + + Result 1Result 2 + ━╸━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +  1 ##                                                    │ +     1  + + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -869,147 +869,147 @@ font-weight: 700; } - .terminal-2399944896-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2399944896-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2399944896-r1 { fill: #777777 } - .terminal-2399944896-r2 { fill: #c5c8c6 } - .terminal-2399944896-r3 { fill: #dfdfdf } - .terminal-2399944896-r4 { fill: #858585 } - .terminal-2399944896-r5 { fill: #feffac;font-weight: bold } - .terminal-2399944896-r6 { fill: #dddddd } - .terminal-2399944896-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-2399944896-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-2399944896-r9 { fill: #212116;font-weight: bold } - .terminal-2399944896-r10 { fill: #feffac } - .terminal-2399944896-r11 { fill: #686868 } - .terminal-2399944896-r12 { fill: #dfdfdf;font-weight: bold } - .terminal-2399944896-r13 { fill: #232323 } - .terminal-2399944896-r14 { fill: #777777;font-weight: bold } - .terminal-2399944896-r15 { fill: #08211a } - .terminal-2399944896-r16 { fill: #45ffca;font-weight: bold } - .terminal-2399944896-r17 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #686868 } + .terminal-9999999-r12 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r13 { fill: #232323 } + .terminal-9999999-r14 { fill: #777777;font-weight: bold } + .terminal-9999999-r15 { fill: #08211a } + .terminal-9999999-r16 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r17 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - main db││1  select1select2 - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Selection  - ╭─ Query Results (1 Records) ──────────────────────────────╮ - - Result 1Result 2 - ━━━━━━━━━━━━╸━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -  2 ##                                                    │ -     2  - - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + main db││1  select1select2 + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Selection  + ╭─ Query Results (1 Records) ──────────────────────────────╮ + + Result 1Result 2 + ━━━━━━━━━━━━╸━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +  2 ##                                                    │ +     2  + + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -1039,147 +1039,147 @@ font-weight: 700; } - .terminal-2399944896-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2399944896-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2399944896-r1 { fill: #777777 } - .terminal-2399944896-r2 { fill: #c5c8c6 } - .terminal-2399944896-r3 { fill: #dfdfdf } - .terminal-2399944896-r4 { fill: #858585 } - .terminal-2399944896-r5 { fill: #feffac;font-weight: bold } - .terminal-2399944896-r6 { fill: #dddddd } - .terminal-2399944896-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-2399944896-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-2399944896-r9 { fill: #212116;font-weight: bold } - .terminal-2399944896-r10 { fill: #feffac } - .terminal-2399944896-r11 { fill: #686868 } - .terminal-2399944896-r12 { fill: #dfdfdf;font-weight: bold } - .terminal-2399944896-r13 { fill: #232323 } - .terminal-2399944896-r14 { fill: #777777;font-weight: bold } - .terminal-2399944896-r15 { fill: #08211a } - .terminal-2399944896-r16 { fill: #45ffca;font-weight: bold } - .terminal-2399944896-r17 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #686868 } + .terminal-9999999-r12 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r13 { fill: #232323 } + .terminal-9999999-r14 { fill: #777777;font-weight: bold } + .terminal-9999999-r15 { fill: #08211a } + .terminal-9999999-r16 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r17 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - main db││1  select1select2 - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Selection  - ╭─ Query Results (1 Records) ──────────────────────────────╮ - - Result 1Result 2 - ━━━━━━━━━━━━╸━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -  2 ##                                                    │ -     2  - - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + main db││1  select1select2 + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Selection  + ╭─ Query Results (1 Records) ──────────────────────────────╮ + + Result 1Result 2 + ━━━━━━━━━━━━╸━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +  2 ##                                                    │ +     2  + + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -1209,144 +1209,144 @@ font-weight: 700; } - .terminal-2677691158-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2677691158-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2677691158-r1 { fill: #777777 } - .terminal-2677691158-r2 { fill: #c5c8c6 } - .terminal-2677691158-r3 { fill: #dfdfdf } - .terminal-2677691158-r4 { fill: #858585 } - .terminal-2677691158-r5 { fill: #feffac;font-weight: bold } - .terminal-2677691158-r6 { fill: #dddddd } - .terminal-2677691158-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-2677691158-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-2677691158-r9 { fill: #212116;font-weight: bold } - .terminal-2677691158-r10 { fill: #feffac } - .terminal-2677691158-r11 { fill: #777777;font-weight: bold } - .terminal-2677691158-r12 { fill: #08211a } - .terminal-2677691158-r13 { fill: #45ffca;font-weight: bold } - .terminal-2677691158-r14 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #08211a } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - main db││1  select1select2 - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (1 Records) ──────────────────────────────╮ -  1 ##                                                    │ -     1  - - - - - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + main db││1  select1select2 + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (1 Records) ──────────────────────────────╮ +  1 ##                                                    │ +     1  + + + + + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -1376,192 +1376,192 @@ font-weight: 700; } - .terminal-4090317160-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4090317160-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4090317160-r1 { fill: #777777 } - .terminal-4090317160-r2 { fill: #c5c8c6 } - .terminal-4090317160-r3 { fill: #dfdfdf } - .terminal-4090317160-r4 { fill: #858585 } - .terminal-4090317160-r5 { fill: #feffac;font-weight: bold } - .terminal-4090317160-r6 { fill: #dddddd } - .terminal-4090317160-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-4090317160-r8 { fill: #45ffca } - .terminal-4090317160-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-4090317160-r10 { fill: #212116;font-weight: bold } - .terminal-4090317160-r11 { fill: #feffac } - .terminal-4090317160-r12 { fill: #777777;font-weight: bold } - .terminal-4090317160-r13 { fill: #08211a } - .terminal-4090317160-r14 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #45ffca } + .terminal-9999999-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r10 { fill: #212116;font-weight: bold } + .terminal-9999999-r11 { fill: #feffac } + .terminal-9999999-r12 { fill: #777777;font-weight: bold } + .terminal-9999999-r13 { fill: #08211a } + .terminal-9999999-r14 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select0::struct(id int)select1 - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Selection  - ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ -  1 #                                                                                   │ -    1  - - - - - - - - - - - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select0::struct(id int)select1 + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Selection  + ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ +  1 #                                                                                   │ +    1  + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -1591,193 +1591,193 @@ font-weight: 700; } - .terminal-208800248-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-208800248-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-208800248-r1 { fill: #363636 } - .terminal-208800248-r2 { fill: #c5c8c6 } - .terminal-208800248-r3 { fill: #dfdfdf } - .terminal-208800248-r4 { fill: #606060 } - .terminal-208800248-r5 { fill: #3c3c3c } - .terminal-208800248-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-208800248-r7 { fill: #5f5f5f } - .terminal-208800248-r8 { fill: #6d505e;font-weight: bold } - .terminal-208800248-r9 { fill: #226d58 } - .terminal-208800248-r10 { fill: #ffb6d9 } - .terminal-208800248-r11 { fill: #9d9d9d } - .terminal-208800248-r12 { fill: #777777 } - .terminal-208800248-r13 { fill: #141410;font-weight: bold } - .terminal-208800248-r14 { fill: #6c6d4c } - .terminal-208800248-r15 { fill: #226d58;font-weight: bold } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #606060 } + .terminal-9999999-r5 { fill: #3c3c3c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #5f5f5f } + .terminal-9999999-r8 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r9 { fill: #226d58 } + .terminal-9999999-r10 { fill: #ffb6d9 } + .terminal-9999999-r11 { fill: #9d9d9d } + .terminal-9999999-r12 { fill: #777777 } + .terminal-9999999-r13 { fill: #141410;font-weight: bold } + .terminal-9999999-r14 { fill: #6c6d4c } + .terminal-9999999-r15 { fill: #226d58;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select0::struct(id int)select1 - ││ - ││ - ││ - ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ - - DuckDB raised an error when running your query: - - ╭────────────────────────────────────────────────────────────────────────────────╮ - - Conversion Error: Unimplemented type for cast (INTEGER -> STRUCT(id  - INTEGER)) - - - - ───────────────╯ - un Selection  - ───────────────╮ -                │ - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────╯ - - Press any key to continue. Click error to copy. - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select0::struct(id int)select1 + ││ + ││ + ││ + ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ + + DuckDB raised an error when running your query: + + ╭────────────────────────────────────────────────────────────────────────────────╮ + + Conversion Error: Unimplemented type for cast (INTEGER -> STRUCT(id  + INTEGER)) + + + + ───────────────╯ + un Selection  + ───────────────╮ +                │ + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────╯ + + Press any key to continue. Click error to copy. + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -1807,191 +1807,191 @@ font-weight: 700; } - .terminal-4210796684-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4210796684-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4210796684-r1 { fill: #777777 } - .terminal-4210796684-r2 { fill: #feffac } - .terminal-4210796684-r3 { fill: #c5c8c6 } - .terminal-4210796684-r4 { fill: #dfdfdf } - .terminal-4210796684-r5 { fill: #858585 } - .terminal-4210796684-r6 { fill: #feffac;font-weight: bold } - .terminal-4210796684-r7 { fill: #dddddd } - .terminal-4210796684-r8 { fill: #ffb6d9;font-weight: bold } - .terminal-4210796684-r9 { fill: #45ffca } - .terminal-4210796684-r10 { fill: #181818 } - .terminal-4210796684-r11 { fill: #0c0c0c;font-weight: bold } - .terminal-4210796684-r12 { fill: #212116;font-weight: bold } - .terminal-4210796684-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #feffac;font-weight: bold } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r9 { fill: #45ffca } + .terminal-9999999-r10 { fill: #181818 } + .terminal-9999999-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r12 { fill: #212116;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db1  select0::struct(id int) - - - - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Selection  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db1  select0::struct(id int) + + + + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Selection  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -2021,194 +2021,194 @@ font-weight: 700; } - .terminal-4111323278-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4111323278-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4111323278-r1 { fill: #363636 } - .terminal-4111323278-r2 { fill: #6c6d4c } - .terminal-4111323278-r3 { fill: #c5c8c6 } - .terminal-4111323278-r4 { fill: #dfdfdf } - .terminal-4111323278-r5 { fill: #606060 } - .terminal-4111323278-r6 { fill: #3c3c3c } - .terminal-4111323278-r7 { fill: #6c6d4c;font-weight: bold } - .terminal-4111323278-r8 { fill: #5f5f5f } - .terminal-4111323278-r9 { fill: #6d505e;font-weight: bold } - .terminal-4111323278-r10 { fill: #226d58 } - .terminal-4111323278-r11 { fill: #101010 } - .terminal-4111323278-r12 { fill: #ffb6d9 } - .terminal-4111323278-r13 { fill: #9d9d9d } - .terminal-4111323278-r14 { fill: #777777 } - .terminal-4111323278-r15 { fill: #141410;font-weight: bold } - .terminal-4111323278-r16 { fill: #226d58;font-weight: bold } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #6c6d4c } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #606060 } + .terminal-9999999-r6 { fill: #3c3c3c } + .terminal-9999999-r7 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r8 { fill: #5f5f5f } + .terminal-9999999-r9 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r10 { fill: #226d58 } + .terminal-9999999-r11 { fill: #101010 } + .terminal-9999999-r12 { fill: #ffb6d9 } + .terminal-9999999-r13 { fill: #9d9d9d } + .terminal-9999999-r14 { fill: #777777 } + .terminal-9999999-r15 { fill: #141410;font-weight: bold } + .terminal-9999999-r16 { fill: #226d58;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db1  select0::struct(id int) - - - - ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ - - DuckDB raised an error when running your query: - - ╭────────────────────────────────────────────────────────────────────────────────╮ - - Conversion Error: Unimplemented type for cast (INTEGER -> STRUCT(id  - INTEGER)) - - - - ───────────────╯ - un Selection  - ───────────────╮ - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────╯ - - Press any key to continue. Click error to copy. - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db1  select0::struct(id int) + + + + ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ + + DuckDB raised an error when running your query: + + ╭────────────────────────────────────────────────────────────────────────────────╮ + + Conversion Error: Unimplemented type for cast (INTEGER -> STRUCT(id  + INTEGER)) + + + + ───────────────╯ + un Selection  + ───────────────╮ + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────╯ + + Press any key to continue. Click error to copy. + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -2238,192 +2238,192 @@ font-weight: 700; } - .terminal-2489862504-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2489862504-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2489862504-r1 { fill: #777777 } - .terminal-2489862504-r2 { fill: #c5c8c6 } - .terminal-2489862504-r3 { fill: #dfdfdf } - .terminal-2489862504-r4 { fill: #858585 } - .terminal-2489862504-r5 { fill: #feffac;font-weight: bold } - .terminal-2489862504-r6 { fill: #dddddd } - .terminal-2489862504-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-2489862504-r8 { fill: #45ffca } - .terminal-2489862504-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-2489862504-r10 { fill: #212116;font-weight: bold } - .terminal-2489862504-r11 { fill: #feffac } - .terminal-2489862504-r12 { fill: #777777;font-weight: bold } - .terminal-2489862504-r13 { fill: #08211a } - .terminal-2489862504-r14 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #45ffca } + .terminal-9999999-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r10 { fill: #212116;font-weight: bold } + .terminal-9999999-r11 { fill: #feffac } + .terminal-9999999-r12 { fill: #777777;font-weight: bold } + .terminal-9999999-r13 { fill: #08211a } + .terminal-9999999-r14 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1select0::struct(id int) - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Selection  - ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ -  1 #                                                                                   │ -    1  - - - - - - - - - - - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1select0::struct(id int) + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Selection  + ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ +  1 #                                                                                   │ +    1  + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -2453,193 +2453,193 @@ font-weight: 700; } - .terminal-4148890104-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4148890104-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4148890104-r1 { fill: #363636 } - .terminal-4148890104-r2 { fill: #c5c8c6 } - .terminal-4148890104-r3 { fill: #dfdfdf } - .terminal-4148890104-r4 { fill: #606060 } - .terminal-4148890104-r5 { fill: #3c3c3c } - .terminal-4148890104-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-4148890104-r7 { fill: #5f5f5f } - .terminal-4148890104-r8 { fill: #6d505e;font-weight: bold } - .terminal-4148890104-r9 { fill: #226d58 } - .terminal-4148890104-r10 { fill: #ffb6d9 } - .terminal-4148890104-r11 { fill: #9d9d9d } - .terminal-4148890104-r12 { fill: #777777 } - .terminal-4148890104-r13 { fill: #141410;font-weight: bold } - .terminal-4148890104-r14 { fill: #6c6d4c } - .terminal-4148890104-r15 { fill: #226d58;font-weight: bold } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #606060 } + .terminal-9999999-r5 { fill: #3c3c3c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #5f5f5f } + .terminal-9999999-r8 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r9 { fill: #226d58 } + .terminal-9999999-r10 { fill: #ffb6d9 } + .terminal-9999999-r11 { fill: #9d9d9d } + .terminal-9999999-r12 { fill: #777777 } + .terminal-9999999-r13 { fill: #141410;font-weight: bold } + .terminal-9999999-r14 { fill: #6c6d4c } + .terminal-9999999-r15 { fill: #226d58;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1select0::struct(id int) - ││ - ││ - ││ - ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ - - DuckDB raised an error when running your query: - - ╭────────────────────────────────────────────────────────────────────────────────╮ - - Conversion Error: Unimplemented type for cast (INTEGER -> STRUCT(id  - INTEGER)) - - - - ───────────────╯ - un Selection  - ───────────────╮ -                │ - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────╯ - - Press any key to continue. Click error to copy. - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1select0::struct(id int) + ││ + ││ + ││ + ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ + + DuckDB raised an error when running your query: + + ╭────────────────────────────────────────────────────────────────────────────────╮ + + Conversion Error: Unimplemented type for cast (INTEGER -> STRUCT(id  + INTEGER)) + + + + ───────────────╯ + un Selection  + ───────────────╮ +                │ + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────╯ + + Press any key to continue. Click error to copy. + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -2669,191 +2669,191 @@ font-weight: 700; } - .terminal-1411406563-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1411406563-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1411406563-r1 { fill: #777777 } - .terminal-1411406563-r2 { fill: #feffac } - .terminal-1411406563-r3 { fill: #c5c8c6 } - .terminal-1411406563-r4 { fill: #dfdfdf } - .terminal-1411406563-r5 { fill: #858585 } - .terminal-1411406563-r6 { fill: #feffac;font-weight: bold } - .terminal-1411406563-r7 { fill: #dddddd } - .terminal-1411406563-r8 { fill: #ffb6d9;font-weight: bold } - .terminal-1411406563-r9 { fill: #45ffca } - .terminal-1411406563-r10 { fill: #181818 } - .terminal-1411406563-r11 { fill: #0c0c0c;font-weight: bold } - .terminal-1411406563-r12 { fill: #212116;font-weight: bold } - .terminal-1411406563-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #feffac;font-weight: bold } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r9 { fill: #45ffca } + .terminal-9999999-r10 { fill: #181818 } + .terminal-9999999-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r12 { fill: #212116;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db1  selectselect0::struct(id int) - - - - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db1  selectselect0::struct(id int) + + + + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -2883,194 +2883,194 @@ font-weight: 700; } - .terminal-4043135775-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4043135775-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4043135775-r1 { fill: #363636 } - .terminal-4043135775-r2 { fill: #6c6d4c } - .terminal-4043135775-r3 { fill: #c5c8c6 } - .terminal-4043135775-r4 { fill: #dfdfdf } - .terminal-4043135775-r5 { fill: #606060 } - .terminal-4043135775-r6 { fill: #3c3c3c } - .terminal-4043135775-r7 { fill: #6c6d4c;font-weight: bold } - .terminal-4043135775-r8 { fill: #5f5f5f } - .terminal-4043135775-r9 { fill: #6d505e;font-weight: bold } - .terminal-4043135775-r10 { fill: #226d58 } - .terminal-4043135775-r11 { fill: #101010 } - .terminal-4043135775-r12 { fill: #ffb6d9 } - .terminal-4043135775-r13 { fill: #9d9d9d } - .terminal-4043135775-r14 { fill: #777777 } - .terminal-4043135775-r15 { fill: #141410;font-weight: bold } - .terminal-4043135775-r16 { fill: #226d58;font-weight: bold } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #6c6d4c } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #606060 } + .terminal-9999999-r6 { fill: #3c3c3c } + .terminal-9999999-r7 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r8 { fill: #5f5f5f } + .terminal-9999999-r9 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r10 { fill: #226d58 } + .terminal-9999999-r11 { fill: #101010 } + .terminal-9999999-r12 { fill: #ffb6d9 } + .terminal-9999999-r13 { fill: #9d9d9d } + .terminal-9999999-r14 { fill: #777777 } + .terminal-9999999-r15 { fill: #141410;font-weight: bold } + .terminal-9999999-r16 { fill: #226d58;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db1  selectselect0::struct(id int) - - - - ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ - - DuckDB raised an error when running your query: - - ╭────────────────────────────────────────────────────────────────────────────────╮ - - Conversion Error: Unimplemented type for cast (INTEGER -> STRUCT(id  - INTEGER)) - - - - ───────────────╯ -  Run Query  - ───────────────╮ - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────╯ - - Press any key to continue. Click error to copy. - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db1  selectselect0::struct(id int) + + + + ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ + + DuckDB raised an error when running your query: + + ╭────────────────────────────────────────────────────────────────────────────────╮ + + Conversion Error: Unimplemented type for cast (INTEGER -> STRUCT(id  + INTEGER)) + + + + ───────────────╯ +  Run Query  + ───────────────╮ + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────╯ + + Press any key to continue. Click error to copy. + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -3100,189 +3100,189 @@ font-weight: 700; } - .terminal-2981061078-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2981061078-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2981061078-r1 { fill: #777777 } - .terminal-2981061078-r2 { fill: #feffac } - .terminal-2981061078-r3 { fill: #c5c8c6 } - .terminal-2981061078-r4 { fill: #dfdfdf } - .terminal-2981061078-r5 { fill: #858585 } - .terminal-2981061078-r6 { fill: #feffac;font-weight: bold } - .terminal-2981061078-r7 { fill: #181818 } - .terminal-2981061078-r8 { fill: #dddddd } - .terminal-2981061078-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-2981061078-r10 { fill: #212116;font-weight: bold } - .terminal-2981061078-r11 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #feffac;font-weight: bold } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #dddddd } + .terminal-9999999-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r10 { fill: #212116;font-weight: bold } + .terminal-9999999-r11 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db1  select - - - - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db1  select + + + + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -3312,192 +3312,192 @@ font-weight: 700; } - .terminal-303197150-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-303197150-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-303197150-r1 { fill: #363636 } - .terminal-303197150-r2 { fill: #6c6d4c } - .terminal-303197150-r3 { fill: #c5c8c6 } - .terminal-303197150-r4 { fill: #dfdfdf } - .terminal-303197150-r5 { fill: #606060 } - .terminal-303197150-r6 { fill: #3c3c3c } - .terminal-303197150-r7 { fill: #6c6d4c;font-weight: bold } - .terminal-303197150-r8 { fill: #101010 } - .terminal-303197150-r9 { fill: #5f5f5f } - .terminal-303197150-r10 { fill: #ffb6d9 } - .terminal-303197150-r11 { fill: #9d9d9d } - .terminal-303197150-r12 { fill: #777777 } - .terminal-303197150-r13 { fill: #141410;font-weight: bold } - .terminal-303197150-r14 { fill: #226d58;font-weight: bold } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #6c6d4c } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #606060 } + .terminal-9999999-r6 { fill: #3c3c3c } + .terminal-9999999-r7 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r8 { fill: #101010 } + .terminal-9999999-r9 { fill: #5f5f5f } + .terminal-9999999-r10 { fill: #ffb6d9 } + .terminal-9999999-r11 { fill: #9d9d9d } + .terminal-9999999-r12 { fill: #777777 } + .terminal-9999999-r13 { fill: #141410;font-weight: bold } + .terminal-9999999-r14 { fill: #226d58;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db1  select - - - - ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ - - DuckDB raised an error when compiling or running your query: - - ╭────────────────────────────────────────────────────────────────────────────────╮ - - Parser Error: SELECT clause without selection list - - - - - ───────────────╯ -  Run Query  - ───────────────╮ - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────╯ - - Press any key to continue. Click error to copy. - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db1  select + + + + ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ + + DuckDB raised an error when compiling or running your query: + + ╭────────────────────────────────────────────────────────────────────────────────╮ + + Parser Error: SELECT clause without selection list + + + + + ───────────────╯ +  Run Query  + ───────────────╮ + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────╯ + + Press any key to continue. Click error to copy. + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -3527,191 +3527,191 @@ font-weight: 700; } - .terminal-3657002124-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3657002124-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3657002124-r1 { fill: #777777 } - .terminal-3657002124-r2 { fill: #feffac } - .terminal-3657002124-r3 { fill: #c5c8c6 } - .terminal-3657002124-r4 { fill: #dfdfdf } - .terminal-3657002124-r5 { fill: #858585 } - .terminal-3657002124-r6 { fill: #feffac;font-weight: bold } - .terminal-3657002124-r7 { fill: #dddddd } - .terminal-3657002124-r8 { fill: #ffb6d9;font-weight: bold } - .terminal-3657002124-r9 { fill: #45ffca } - .terminal-3657002124-r10 { fill: #181818 } - .terminal-3657002124-r11 { fill: #0c0c0c;font-weight: bold } - .terminal-3657002124-r12 { fill: #212116;font-weight: bold } - .terminal-3657002124-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #feffac;font-weight: bold } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r9 { fill: #45ffca } + .terminal-9999999-r10 { fill: #181818 } + .terminal-9999999-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r12 { fill: #212116;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - main db1  select0::struct(id int)select1 - - - - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Selection  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + main db1  select0::struct(id int)select1 + + + + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Selection  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -3741,194 +3741,194 @@ font-weight: 700; } - .terminal-201907021-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-201907021-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-201907021-r1 { fill: #363636 } - .terminal-201907021-r2 { fill: #6c6d4c } - .terminal-201907021-r3 { fill: #c5c8c6 } - .terminal-201907021-r4 { fill: #dfdfdf } - .terminal-201907021-r5 { fill: #606060 } - .terminal-201907021-r6 { fill: #3c3c3c } - .terminal-201907021-r7 { fill: #6c6d4c;font-weight: bold } - .terminal-201907021-r8 { fill: #5f5f5f } - .terminal-201907021-r9 { fill: #6d505e;font-weight: bold } - .terminal-201907021-r10 { fill: #226d58 } - .terminal-201907021-r11 { fill: #101010 } - .terminal-201907021-r12 { fill: #ffb6d9 } - .terminal-201907021-r13 { fill: #9d9d9d } - .terminal-201907021-r14 { fill: #777777 } - .terminal-201907021-r15 { fill: #141410;font-weight: bold } - .terminal-201907021-r16 { fill: #226d58;font-weight: bold } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #6c6d4c } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #606060 } + .terminal-9999999-r6 { fill: #3c3c3c } + .terminal-9999999-r7 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r8 { fill: #5f5f5f } + .terminal-9999999-r9 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r10 { fill: #226d58 } + .terminal-9999999-r11 { fill: #101010 } + .terminal-9999999-r12 { fill: #ffb6d9 } + .terminal-9999999-r13 { fill: #9d9d9d } + .terminal-9999999-r14 { fill: #777777 } + .terminal-9999999-r15 { fill: #141410;font-weight: bold } + .terminal-9999999-r16 { fill: #226d58;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - main db1  select0::struct(id int)select1 - - - - ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ - - SQLite raised an error when compiling or running your query: - - ╭────────────────────────────────────────────────────────────────────────────────╮ - - unrecognized token: ":" - - - - - ───────────────╯ - un Selection  - ───────────────╮ - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────╯ - - Press any key to continue. Click error to copy. - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + main db1  select0::struct(id int)select1 + + + + ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ + + SQLite raised an error when compiling or running your query: + + ╭────────────────────────────────────────────────────────────────────────────────╮ + + unrecognized token: ":" + + + + + ───────────────╯ + un Selection  + ───────────────╮ + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────╯ + + Press any key to continue. Click error to copy. + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -3958,191 +3958,191 @@ font-weight: 700; } - .terminal-2170049553-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2170049553-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2170049553-r1 { fill: #777777 } - .terminal-2170049553-r2 { fill: #feffac } - .terminal-2170049553-r3 { fill: #c5c8c6 } - .terminal-2170049553-r4 { fill: #dfdfdf } - .terminal-2170049553-r5 { fill: #858585 } - .terminal-2170049553-r6 { fill: #feffac;font-weight: bold } - .terminal-2170049553-r7 { fill: #dddddd } - .terminal-2170049553-r8 { fill: #ffb6d9;font-weight: bold } - .terminal-2170049553-r9 { fill: #45ffca } - .terminal-2170049553-r10 { fill: #181818 } - .terminal-2170049553-r11 { fill: #0c0c0c;font-weight: bold } - .terminal-2170049553-r12 { fill: #212116;font-weight: bold } - .terminal-2170049553-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #feffac;font-weight: bold } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r9 { fill: #45ffca } + .terminal-9999999-r10 { fill: #181818 } + .terminal-9999999-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r12 { fill: #212116;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - main db1  select0::struct(id int) - - - - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Selection  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + main db1  select0::struct(id int) + + + + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Selection  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -4172,194 +4172,194 @@ font-weight: 700; } - .terminal-4232169130-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4232169130-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4232169130-r1 { fill: #363636 } - .terminal-4232169130-r2 { fill: #6c6d4c } - .terminal-4232169130-r3 { fill: #c5c8c6 } - .terminal-4232169130-r4 { fill: #dfdfdf } - .terminal-4232169130-r5 { fill: #606060 } - .terminal-4232169130-r6 { fill: #3c3c3c } - .terminal-4232169130-r7 { fill: #6c6d4c;font-weight: bold } - .terminal-4232169130-r8 { fill: #5f5f5f } - .terminal-4232169130-r9 { fill: #6d505e;font-weight: bold } - .terminal-4232169130-r10 { fill: #226d58 } - .terminal-4232169130-r11 { fill: #101010 } - .terminal-4232169130-r12 { fill: #ffb6d9 } - .terminal-4232169130-r13 { fill: #9d9d9d } - .terminal-4232169130-r14 { fill: #777777 } - .terminal-4232169130-r15 { fill: #141410;font-weight: bold } - .terminal-4232169130-r16 { fill: #226d58;font-weight: bold } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #6c6d4c } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #606060 } + .terminal-9999999-r6 { fill: #3c3c3c } + .terminal-9999999-r7 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r8 { fill: #5f5f5f } + .terminal-9999999-r9 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r10 { fill: #226d58 } + .terminal-9999999-r11 { fill: #101010 } + .terminal-9999999-r12 { fill: #ffb6d9 } + .terminal-9999999-r13 { fill: #9d9d9d } + .terminal-9999999-r14 { fill: #777777 } + .terminal-9999999-r15 { fill: #141410;font-weight: bold } + .terminal-9999999-r16 { fill: #226d58;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - main db1  select0::struct(id int) - - - - ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ - - SQLite raised an error when compiling or running your query: - - ╭────────────────────────────────────────────────────────────────────────────────╮ - - unrecognized token: ":" - - - - - ───────────────╯ - un Selection  - ───────────────╮ - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────╯ - - Press any key to continue. Click error to copy. - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + main db1  select0::struct(id int) + + + + ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ + + SQLite raised an error when compiling or running your query: + + ╭────────────────────────────────────────────────────────────────────────────────╮ + + unrecognized token: ":" + + + + + ───────────────╯ + un Selection  + ───────────────╮ + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────╯ + + Press any key to continue. Click error to copy. + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -4389,192 +4389,192 @@ font-weight: 700; } - .terminal-1494676705-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1494676705-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1494676705-r1 { fill: #777777 } - .terminal-1494676705-r2 { fill: #c5c8c6 } - .terminal-1494676705-r3 { fill: #dfdfdf } - .terminal-1494676705-r4 { fill: #858585 } - .terminal-1494676705-r5 { fill: #feffac;font-weight: bold } - .terminal-1494676705-r6 { fill: #dddddd } - .terminal-1494676705-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-1494676705-r8 { fill: #45ffca } - .terminal-1494676705-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-1494676705-r10 { fill: #212116;font-weight: bold } - .terminal-1494676705-r11 { fill: #feffac } - .terminal-1494676705-r12 { fill: #777777;font-weight: bold } - .terminal-1494676705-r13 { fill: #08211a } - .terminal-1494676705-r14 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #45ffca } + .terminal-9999999-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r10 { fill: #212116;font-weight: bold } + .terminal-9999999-r11 { fill: #feffac } + .terminal-9999999-r12 { fill: #777777;font-weight: bold } + .terminal-9999999-r13 { fill: #08211a } + .terminal-9999999-r14 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - main db││1  select1select0::struct(id int) - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Selection  - ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ -  1 ##                                                                                  │ -     1  - - - - - - - - - - - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + main db││1  select1select0::struct(id int) + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Selection  + ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ +  1 ##                                                                                  │ +     1  + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -4604,193 +4604,193 @@ font-weight: 700; } - .terminal-1443692564-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1443692564-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1443692564-r1 { fill: #363636 } - .terminal-1443692564-r2 { fill: #c5c8c6 } - .terminal-1443692564-r3 { fill: #dfdfdf } - .terminal-1443692564-r4 { fill: #606060 } - .terminal-1443692564-r5 { fill: #3c3c3c } - .terminal-1443692564-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-1443692564-r7 { fill: #5f5f5f } - .terminal-1443692564-r8 { fill: #6d505e;font-weight: bold } - .terminal-1443692564-r9 { fill: #226d58 } - .terminal-1443692564-r10 { fill: #ffb6d9 } - .terminal-1443692564-r11 { fill: #9d9d9d } - .terminal-1443692564-r12 { fill: #777777 } - .terminal-1443692564-r13 { fill: #141410;font-weight: bold } - .terminal-1443692564-r14 { fill: #6c6d4c } - .terminal-1443692564-r15 { fill: #226d58;font-weight: bold } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #606060 } + .terminal-9999999-r5 { fill: #3c3c3c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #5f5f5f } + .terminal-9999999-r8 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r9 { fill: #226d58 } + .terminal-9999999-r10 { fill: #ffb6d9 } + .terminal-9999999-r11 { fill: #9d9d9d } + .terminal-9999999-r12 { fill: #777777 } + .terminal-9999999-r13 { fill: #141410;font-weight: bold } + .terminal-9999999-r14 { fill: #6c6d4c } + .terminal-9999999-r15 { fill: #226d58;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - main db││1  select1select0::struct(id int) - ││ - ││ - ││ - ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ - - SQLite raised an error when compiling or running your query: - - ╭────────────────────────────────────────────────────────────────────────────────╮ - - unrecognized token: ":" - - - - - ───────────────╯ - un Selection  - ───────────────╮ -                │ - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────╯ - - Press any key to continue. Click error to copy. - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + main db││1  select1select0::struct(id int) + ││ + ││ + ││ + ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ + + SQLite raised an error when compiling or running your query: + + ╭────────────────────────────────────────────────────────────────────────────────╮ + + unrecognized token: ":" + + + + + ───────────────╯ + un Selection  + ───────────────╮ +                │ + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────╯ + + Press any key to continue. Click error to copy. + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -4820,191 +4820,191 @@ font-weight: 700; } - .terminal-3552567641-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3552567641-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3552567641-r1 { fill: #777777 } - .terminal-3552567641-r2 { fill: #feffac } - .terminal-3552567641-r3 { fill: #c5c8c6 } - .terminal-3552567641-r4 { fill: #dfdfdf } - .terminal-3552567641-r5 { fill: #858585 } - .terminal-3552567641-r6 { fill: #feffac;font-weight: bold } - .terminal-3552567641-r7 { fill: #dddddd } - .terminal-3552567641-r8 { fill: #ffb6d9;font-weight: bold } - .terminal-3552567641-r9 { fill: #45ffca } - .terminal-3552567641-r10 { fill: #181818 } - .terminal-3552567641-r11 { fill: #0c0c0c;font-weight: bold } - .terminal-3552567641-r12 { fill: #212116;font-weight: bold } - .terminal-3552567641-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #feffac;font-weight: bold } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r9 { fill: #45ffca } + .terminal-9999999-r10 { fill: #181818 } + .terminal-9999999-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r12 { fill: #212116;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - main db1  selectselect0::struct(id int) - - - - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Selection  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + main db1  selectselect0::struct(id int) + + + + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Selection  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -5034,194 +5034,194 @@ font-weight: 700; } - .terminal-3240644947-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3240644947-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3240644947-r1 { fill: #363636 } - .terminal-3240644947-r2 { fill: #6c6d4c } - .terminal-3240644947-r3 { fill: #c5c8c6 } - .terminal-3240644947-r4 { fill: #dfdfdf } - .terminal-3240644947-r5 { fill: #606060 } - .terminal-3240644947-r6 { fill: #3c3c3c } - .terminal-3240644947-r7 { fill: #6c6d4c;font-weight: bold } - .terminal-3240644947-r8 { fill: #5f5f5f } - .terminal-3240644947-r9 { fill: #6d505e;font-weight: bold } - .terminal-3240644947-r10 { fill: #226d58 } - .terminal-3240644947-r11 { fill: #101010 } - .terminal-3240644947-r12 { fill: #ffb6d9 } - .terminal-3240644947-r13 { fill: #9d9d9d } - .terminal-3240644947-r14 { fill: #777777 } - .terminal-3240644947-r15 { fill: #141410;font-weight: bold } - .terminal-3240644947-r16 { fill: #226d58;font-weight: bold } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #6c6d4c } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #606060 } + .terminal-9999999-r6 { fill: #3c3c3c } + .terminal-9999999-r7 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r8 { fill: #5f5f5f } + .terminal-9999999-r9 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r10 { fill: #226d58 } + .terminal-9999999-r11 { fill: #101010 } + .terminal-9999999-r12 { fill: #ffb6d9 } + .terminal-9999999-r13 { fill: #9d9d9d } + .terminal-9999999-r14 { fill: #777777 } + .terminal-9999999-r15 { fill: #141410;font-weight: bold } + .terminal-9999999-r16 { fill: #226d58;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - main db1  selectselect0::struct(id int) - - - - ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ - - SQLite raised an error when compiling or running your query: - - ╭────────────────────────────────────────────────────────────────────────────────╮ - - incomplete input - - - - - ───────────────╯ - un Selection  - ───────────────╮ - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────╯ - - Press any key to continue. Click error to copy. - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + main db1  selectselect0::struct(id int) + + + + ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ + + SQLite raised an error when compiling or running your query: + + ╭────────────────────────────────────────────────────────────────────────────────╮ + + incomplete input + + + + + ───────────────╯ + un Selection  + ───────────────╮ + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────╯ + + Press any key to continue. Click error to copy. + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -5251,189 +5251,189 @@ font-weight: 700; } - .terminal-120514636-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-120514636-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-120514636-r1 { fill: #777777 } - .terminal-120514636-r2 { fill: #feffac } - .terminal-120514636-r3 { fill: #c5c8c6 } - .terminal-120514636-r4 { fill: #dfdfdf } - .terminal-120514636-r5 { fill: #858585 } - .terminal-120514636-r6 { fill: #feffac;font-weight: bold } - .terminal-120514636-r7 { fill: #181818 } - .terminal-120514636-r8 { fill: #dddddd } - .terminal-120514636-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-120514636-r10 { fill: #212116;font-weight: bold } - .terminal-120514636-r11 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #feffac;font-weight: bold } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #dddddd } + .terminal-9999999-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r10 { fill: #212116;font-weight: bold } + .terminal-9999999-r11 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - main db1  select - - - - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Selection  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + main db1  select + + + + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Selection  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -5463,192 +5463,192 @@ font-weight: 700; } - .terminal-4147864219-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4147864219-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4147864219-r1 { fill: #363636 } - .terminal-4147864219-r2 { fill: #6c6d4c } - .terminal-4147864219-r3 { fill: #c5c8c6 } - .terminal-4147864219-r4 { fill: #dfdfdf } - .terminal-4147864219-r5 { fill: #606060 } - .terminal-4147864219-r6 { fill: #3c3c3c } - .terminal-4147864219-r7 { fill: #6c6d4c;font-weight: bold } - .terminal-4147864219-r8 { fill: #101010 } - .terminal-4147864219-r9 { fill: #5f5f5f } - .terminal-4147864219-r10 { fill: #ffb6d9 } - .terminal-4147864219-r11 { fill: #9d9d9d } - .terminal-4147864219-r12 { fill: #777777 } - .terminal-4147864219-r13 { fill: #141410;font-weight: bold } - .terminal-4147864219-r14 { fill: #226d58;font-weight: bold } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #6c6d4c } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #606060 } + .terminal-9999999-r6 { fill: #3c3c3c } + .terminal-9999999-r7 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r8 { fill: #101010 } + .terminal-9999999-r9 { fill: #5f5f5f } + .terminal-9999999-r10 { fill: #ffb6d9 } + .terminal-9999999-r11 { fill: #9d9d9d } + .terminal-9999999-r12 { fill: #777777 } + .terminal-9999999-r13 { fill: #141410;font-weight: bold } + .terminal-9999999-r14 { fill: #226d58;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - main db1  select - - - - ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ - - SQLite raised an error when compiling or running your query: - - ╭────────────────────────────────────────────────────────────────────────────────╮ - - incomplete input - - - - - ───────────────╯ - un Selection  - ───────────────╮ - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────╯ - - Press any key to continue. Click error to copy. - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + main db1  select + + + + ╭─ Query Error ────────────────────────────────────────────────────────────────────────╮ + + SQLite raised an error when compiling or running your query: + + ╭────────────────────────────────────────────────────────────────────────────────╮ + + incomplete input + + + + + ───────────────╯ + un Selection  + ───────────────╮ + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────╯ + + Press any key to continue. Click error to copy. + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -5678,144 +5678,144 @@ font-weight: 700; } - .terminal-3980533001-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3980533001-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3980533001-r1 { fill: #777777 } - .terminal-3980533001-r2 { fill: #c5c8c6 } - .terminal-3980533001-r3 { fill: #dfdfdf } - .terminal-3980533001-r4 { fill: #858585 } - .terminal-3980533001-r5 { fill: #feffac;font-weight: bold } - .terminal-3980533001-r6 { fill: #dddddd } - .terminal-3980533001-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-3980533001-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-3980533001-r9 { fill: #212116;font-weight: bold } - .terminal-3980533001-r10 { fill: #feffac } - .terminal-3980533001-r11 { fill: #777777;font-weight: bold } - .terminal-3980533001-r12 { fill: #08211a } - .terminal-3980533001-r13 { fill: #45ffca;font-weight: bold } - .terminal-3980533001-r14 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #08211a } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db││1  select1as foo                                       - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (1 Records) ──────────────────────────────╮ -  foo #                                                   │ -      1  - - - - - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db││1  select1as foo                                       + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (1 Records) ──────────────────────────────╮ +  foo #                                                   │ +      1  + + + + + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -5845,144 +5845,144 @@ font-weight: 700; } - .terminal-2500118658-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2500118658-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2500118658-r1 { fill: #777777 } - .terminal-2500118658-r2 { fill: #c5c8c6 } - .terminal-2500118658-r3 { fill: #dfdfdf } - .terminal-2500118658-r4 { fill: #858585 } - .terminal-2500118658-r5 { fill: #feffac;font-weight: bold } - .terminal-2500118658-r6 { fill: #dddddd } - .terminal-2500118658-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-2500118658-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-2500118658-r9 { fill: #212116;font-weight: bold } - .terminal-2500118658-r10 { fill: #feffac } - .terminal-2500118658-r11 { fill: #777777;font-weight: bold } - .terminal-2500118658-r12 { fill: #08211a } - .terminal-2500118658-r13 { fill: #45ffca;font-weight: bold } - .terminal-2500118658-r14 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #08211a } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - main db││1  select1as foo                                       - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (1 Records) ──────────────────────────────╮ -  foo ##                                                  │ -       1  - - - - - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + main db││1  select1as foo                                       + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (1 Records) ──────────────────────────────╮ +  foo ##                                                  │ +       1  + + + + + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  diff --git a/tests/functional_tests/__snapshots__/test_data_catalog.ambr b/tests/functional_tests/__snapshots__/test_data_catalog.ambr index bb7f9dd8..aefb68f8 100644 --- a/tests/functional_tests/__snapshots__/test_data_catalog.ambr +++ b/tests/functional_tests/__snapshots__/test_data_catalog.ambr @@ -1,4 +1,855 @@ # serializer version: 1 +# name: test_context_menu[db context menu expanded] + ''' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Harlequin + + + + + + + + + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▼ small db1   + + Insert Name at Cursor  + Switch Editor Context  + (Use)                  + Export Database        + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + + + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  + + + + + ''' +# --- +# name: test_context_menu[db name inserted] + ''' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Harlequin + + + + + + + + + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▼ small db1  "small" + ├─ empty sch + └─ ▼ main sch +    └─ ▶ drivers t + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + + + + ''' +# --- +# name: test_context_menu[schema context menu expanded] + ''' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Harlequin + + + + + + + + + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▼ small db1  "small"                                                                             + ├─ empty sch + + Insert Name at Cursor  + Switch Editor Context  + (Use)                  + Drop Schema            + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + + + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  + + + + + ''' +# --- +# name: test_context_menu[table context menu expanded] + ''' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Harlequin + + + + + + + + + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▼ small db1  "small"                                                                             + ├─ empty sch + └─ ▼ main sch +    └─ ▶ drivers t + + Insert Name at Cursor  + Insert Columns at      + Cursor                 + Preview Data           + Describe               + Summarize              + Show DDL               + Drop Table             + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + + + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  + + + + + ''' +# --- # name: test_data_catalog[Initialization] ''' @@ -22,188 +873,188 @@ font-weight: 700; } - .terminal-420809782-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-420809782-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-420809782-r1 { fill: #777777 } - .terminal-420809782-r2 { fill: #feffac } - .terminal-420809782-r3 { fill: #c5c8c6 } - .terminal-420809782-r4 { fill: #dfdfdf } - .terminal-420809782-r5 { fill: #858585 } - .terminal-420809782-r6 { fill: #181818 } - .terminal-420809782-r7 { fill: #dddddd } - .terminal-420809782-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-420809782-r9 { fill: #212116;font-weight: bold } - .terminal-420809782-r10 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #181818 } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ small db1   - ▶ tiny db - - - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ small db1   + ▶ tiny db + + + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -233,190 +1084,190 @@ font-weight: 700; } - .terminal-1227425220-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1227425220-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1227425220-r1 { fill: #777777 } - .terminal-1227425220-r2 { fill: #feffac } - .terminal-1227425220-r3 { fill: #c5c8c6 } - .terminal-1227425220-r4 { fill: #dfdfdf } - .terminal-1227425220-r5 { fill: #858585 } - .terminal-1227425220-r6 { fill: #dddddd } - .terminal-1227425220-r7 { fill: #feffac;font-weight: bold } - .terminal-1227425220-r8 { fill: #181818 } - .terminal-1227425220-r9 { fill: #001b14;font-weight: bold } - .terminal-1227425220-r10 { fill: #0c0c0c;font-weight: bold } - .terminal-1227425220-r11 { fill: #212116;font-weight: bold } - .terminal-1227425220-r12 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #feffac;font-weight: bold } + .terminal-9999999-r8 { fill: #181818 } + .terminal-9999999-r9 { fill: #001b14;font-weight: bold } + .terminal-9999999-r10 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r11 { fill: #212116;font-weight: bold } + .terminal-9999999-r12 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▼ small db1  "small"."main" - ├─ empty sch - └─ ▼ main sch -    └─ ▶ drivers t - ▶ tiny db - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▼ small db1  "small"."main" + ├─ empty sch + └─ ▼ main sch +    └─ ▶ drivers t + ▶ tiny db + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -446,189 +1297,189 @@ font-weight: 700; } - .terminal-42125519-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-42125519-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-42125519-r1 { fill: #feffac } - .terminal-42125519-r2 { fill: #777777 } - .terminal-42125519-r3 { fill: #c5c8c6 } - .terminal-42125519-r4 { fill: #dfdfdf } - .terminal-42125519-r5 { fill: #08211a;font-weight: bold } - .terminal-42125519-r6 { fill: #858585 } - .terminal-42125519-r7 { fill: #dddddd } - .terminal-42125519-r8 { fill: #45ffca;font-weight: bold } - .terminal-42125519-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-42125519-r10 { fill: #212116;font-weight: bold } - .terminal-42125519-r11 { fill: #45ffca } + .terminal-9999999-r1 { fill: #feffac } + .terminal-9999999-r2 { fill: #777777 } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #08211a;font-weight: bold } + .terminal-9999999-r6 { fill: #858585 } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r10 { fill: #212116;font-weight: bold } + .terminal-9999999-r11 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - - - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▼ small db1   - ┣━ empty sch - ┗━ ▶ main sch - ▶ tiny db - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - - - - - - - - - - - - - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Insert Name  + + + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▼ small db1   + ┣━ empty sch + ┗━ ▶ main sch + ▶ tiny db + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + + + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Insert Name  . Show Context Menu  @@ -658,189 +1509,189 @@ font-weight: 700; } - .terminal-2232766834-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2232766834-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2232766834-r1 { fill: #feffac } - .terminal-2232766834-r2 { fill: #777777 } - .terminal-2232766834-r3 { fill: #c5c8c6 } - .terminal-2232766834-r4 { fill: #dfdfdf } - .terminal-2232766834-r5 { fill: #858585 } - .terminal-2232766834-r6 { fill: #dddddd } - .terminal-2232766834-r7 { fill: #08211a;font-weight: bold } - .terminal-2232766834-r8 { fill: #45ffca;font-weight: bold } - .terminal-2232766834-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-2232766834-r10 { fill: #212116;font-weight: bold } - .terminal-2232766834-r11 { fill: #45ffca } + .terminal-9999999-r1 { fill: #feffac } + .terminal-9999999-r2 { fill: #777777 } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #08211a;font-weight: bold } + .terminal-9999999-r8 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r10 { fill: #212116;font-weight: bold } + .terminal-9999999-r11 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - - - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▼ small db1   - ├─ empty sch - └─ ▼ main sch - ┗━ ▶ drivers t - ▶ tiny db - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - - - - - - - - - - - - - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Insert Name  + + + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▼ small db1   + ├─ empty sch + └─ ▼ main sch + ┗━ ▶ drivers t + ▶ tiny db + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + + + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Insert Name  . Show Context Menu  @@ -870,189 +1721,189 @@ font-weight: 700; } - .terminal-2022038081-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2022038081-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2022038081-r1 { fill: #777777 } - .terminal-2022038081-r2 { fill: #feffac } - .terminal-2022038081-r3 { fill: #c5c8c6 } - .terminal-2022038081-r4 { fill: #dfdfdf } - .terminal-2022038081-r5 { fill: #858585 } - .terminal-2022038081-r6 { fill: #dddddd } - .terminal-2022038081-r7 { fill: #181818 } - .terminal-2022038081-r8 { fill: #001b14;font-weight: bold } - .terminal-2022038081-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-2022038081-r10 { fill: #212116;font-weight: bold } - .terminal-2022038081-r11 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #001b14;font-weight: bold } + .terminal-9999999-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r10 { fill: #212116;font-weight: bold } + .terminal-9999999-r11 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▼ small db1  "dob" - ├─ empty sch - └─ ▼ main sch -    └─ ▼ drivers t -       ├─ code s -       ├─ dob d -       ├─ driverId ## -       ├─ driverRef s -       ├─ forename s -       ├─ nationality s -       ├─ number s -       ├─ surname s -       └─ url s - ▶ tiny db - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▼ small db1  "dob" + ├─ empty sch + └─ ▼ main sch +    └─ ▼ drivers t +       ├─ code s +       ├─ dob d +       ├─ driverId ## +       ├─ driverRef s +       ├─ forename s +       ├─ nationality s +       ├─ number s +       ├─ surname s +       └─ url s + ▶ tiny db + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -1082,190 +1933,190 @@ font-weight: 700; } - .terminal-422966249-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-422966249-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-422966249-r1 { fill: #feffac } - .terminal-422966249-r2 { fill: #777777 } - .terminal-422966249-r3 { fill: #c5c8c6 } - .terminal-422966249-r4 { fill: #dfdfdf } - .terminal-422966249-r5 { fill: #858585 } - .terminal-422966249-r6 { fill: #dddddd } - .terminal-422966249-r7 { fill: #feffac;font-weight: bold } - .terminal-422966249-r8 { fill: #08211a;font-weight: bold } - .terminal-422966249-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-422966249-r10 { fill: #212116;font-weight: bold } - .terminal-422966249-r11 { fill: #45ffca;font-weight: bold } - .terminal-422966249-r12 { fill: #45ffca } + .terminal-9999999-r1 { fill: #feffac } + .terminal-9999999-r2 { fill: #777777 } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #feffac;font-weight: bold } + .terminal-9999999-r8 { fill: #08211a;font-weight: bold } + .terminal-9999999-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r10 { fill: #212116;font-weight: bold } + .terminal-9999999-r11 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r12 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - - - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▼ small db1  "small"."main"                                                                      - ├─ empty sch - └─ ▼ main sch -    └─ ▼ drivers t -       ├─ code s -       ├─ dob d -       ├─ driverId ## -       ├─ driverRef s -       ├─ forename s -       ├─ nationality s -       ├─ number s -       ├─ surname s -       └─ url s - ▶ tiny db - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - - - - - - - - - - - - - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Insert Name  + + + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▼ small db1  "small"."main"                                                                      + ├─ empty sch + └─ ▼ main sch +    └─ ▼ drivers t +       ├─ code s +       ├─ dob d +       ├─ driverId ## +       ├─ driverRef s +       ├─ forename s +       ├─ nationality s +       ├─ number s +       ├─ surname s +       └─ url s + ▶ tiny db + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + + + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Insert Name  . Show Context Menu  @@ -1295,193 +2146,193 @@ font-weight: 700; } - .terminal-3218704510-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3218704510-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3218704510-r1 { fill: #feffac } - .terminal-3218704510-r2 { fill: #777777 } - .terminal-3218704510-r3 { fill: #c5c8c6 } - .terminal-3218704510-r4 { fill: #dfdfdf } - .terminal-3218704510-r5 { fill: #858585 } - .terminal-3218704510-r6 { fill: #dddddd } - .terminal-3218704510-r7 { fill: #686868 } - .terminal-3218704510-r8 { fill: #dfdfdf;font-weight: bold } - .terminal-3218704510-r9 { fill: #232323 } - .terminal-3218704510-r10 { fill: #08211a;font-weight: bold } - .terminal-3218704510-r11 { fill: #45ffca;font-weight: bold } - .terminal-3218704510-r12 { fill: #9d9d9d;font-style: italic; } - .terminal-3218704510-r13 { fill: #0c0c0c;font-weight: bold } - .terminal-3218704510-r14 { fill: #212116;font-weight: bold } - .terminal-3218704510-r15 { fill: #45ffca } + .terminal-9999999-r1 { fill: #feffac } + .terminal-9999999-r2 { fill: #777777 } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #686868 } + .terminal-9999999-r8 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r9 { fill: #232323 } + .terminal-9999999-r10 { fill: #08211a;font-weight: bold } + .terminal-9999999-r11 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r12 { fill: #9d9d9d;font-style: italic; } + .terminal-9999999-r13 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r14 { fill: #212116;font-weight: bold } + .terminal-9999999-r15 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - - - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - 1   - DatabasesFiles - ━━━━━━━━━━━━━╸━━━━━╺━━━━━━━━ - 📂 files - ┣━ 📁 foo - ┣━ 📄 .hidden - ┣━ 📄 bar.csv - ┣━ 📄 baz.parquet - ┗━ 📄 qux.py - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - - - - - - - - - - - - - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Insert Name  + + + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + 1   + DatabasesFiles + ━━━━━━━━━━━━━╸━━━━━╺━━━━━━━━ + 📂 files + ┣━ 📁 foo + ┣━ 📄 .hidden + ┣━ 📄 bar.csv + ┣━ 📄 baz.parquet + ┗━ 📄 qux.py + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + + + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Insert Name  . Show Context Menu  @@ -1511,193 +2362,193 @@ font-weight: 700; } - .terminal-2132831129-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2132831129-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2132831129-r1 { fill: #feffac } - .terminal-2132831129-r2 { fill: #777777 } - .terminal-2132831129-r3 { fill: #c5c8c6 } - .terminal-2132831129-r4 { fill: #dfdfdf } - .terminal-2132831129-r5 { fill: #858585 } - .terminal-2132831129-r6 { fill: #dddddd } - .terminal-2132831129-r7 { fill: #686868 } - .terminal-2132831129-r8 { fill: #dfdfdf;font-weight: bold } - .terminal-2132831129-r9 { fill: #232323 } - .terminal-2132831129-r10 { fill: #08211a;font-weight: bold } - .terminal-2132831129-r11 { fill: #45ffca;font-weight: bold } - .terminal-2132831129-r12 { fill: #9d9d9d;font-style: italic; } - .terminal-2132831129-r13 { fill: #0c0c0c;font-weight: bold } - .terminal-2132831129-r14 { fill: #212116;font-weight: bold } - .terminal-2132831129-r15 { fill: #45ffca } + .terminal-9999999-r1 { fill: #feffac } + .terminal-9999999-r2 { fill: #777777 } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #686868 } + .terminal-9999999-r8 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r9 { fill: #232323 } + .terminal-9999999-r10 { fill: #08211a;font-weight: bold } + .terminal-9999999-r11 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r12 { fill: #9d9d9d;font-style: italic; } + .terminal-9999999-r13 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r14 { fill: #212116;font-weight: bold } + .terminal-9999999-r15 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - - - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - 1   - DatabasesFiles - ━━━━━━━━━━━━━╸━━━━━╺━━━━━━━━ - 📂 files - ├─ 📂 foo - │  ┗━ 📄 foo.csv - ├─ 📄 .hidden - ├─ 📄 bar.csv - ├─ 📄 baz.parquet - └─ 📄 qux.py - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - - - - - - - - - - - - - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Insert Name  + + + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + 1   + DatabasesFiles + ━━━━━━━━━━━━━╸━━━━━╺━━━━━━━━ + 📂 files + ├─ 📂 foo + │  ┗━ 📄 foo.csv + ├─ 📄 .hidden + ├─ 📄 bar.csv + ├─ 📄 baz.parquet + └─ 📄 qux.py + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + + + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Insert Name  . Show Context Menu  @@ -1727,191 +2578,192 @@ font-weight: 700; } - .terminal-3161496987-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3161496987-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3161496987-r1 { fill: #feffac } - .terminal-3161496987-r2 { fill: #777777 } - .terminal-3161496987-r3 { fill: #c5c8c6 } - .terminal-3161496987-r4 { fill: #dfdfdf } - .terminal-3161496987-r5 { fill: #858585 } - .terminal-3161496987-r6 { fill: #dddddd } - .terminal-3161496987-r7 { fill: #686868 } - .terminal-3161496987-r8 { fill: #dfdfdf;font-weight: bold } - .terminal-3161496987-r9 { fill: #232323 } - .terminal-3161496987-r10 { fill: #0c0c0c;font-weight: bold } - .terminal-3161496987-r11 { fill: #212116;font-weight: bold } - .terminal-3161496987-r12 { fill: #45ffca;font-weight: bold } - .terminal-3161496987-r13 { fill: #45ffca } + .terminal-9999999-r1 { fill: #feffac } + .terminal-9999999-r2 { fill: #777777 } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #686868 } + .terminal-9999999-r8 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r9 { fill: #232323 } + .terminal-9999999-r10 { fill: #08211a;font-weight: bold } + .terminal-9999999-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r12 { fill: #212116;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - - - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - 1   - DatabasesS3 - ━━━━━━━━━━━━━╸━━╺━━━━━━━━━━━ - 📁 my-bucket - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - - - - - - - - - - - - - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Insert Name  + + + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + 1   + DatabasesS3 + ━━━━━━━━━━━━━╸━━╺━━━━━━━━━━━ + 📁 my-bucket + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + + + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Insert Name  . Show Context Menu  @@ -1941,192 +2793,192 @@ font-weight: 700; } - .terminal-3234209571-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3234209571-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3234209571-r1 { fill: #feffac } - .terminal-3234209571-r2 { fill: #777777 } - .terminal-3234209571-r3 { fill: #c5c8c6 } - .terminal-3234209571-r4 { fill: #dfdfdf } - .terminal-3234209571-r5 { fill: #858585 } - .terminal-3234209571-r6 { fill: #dddddd } - .terminal-3234209571-r7 { fill: #686868 } - .terminal-3234209571-r8 { fill: #dfdfdf;font-weight: bold } - .terminal-3234209571-r9 { fill: #232323 } - .terminal-3234209571-r10 { fill: #08211a;font-weight: bold } - .terminal-3234209571-r11 { fill: #45ffca;font-weight: bold } - .terminal-3234209571-r12 { fill: #0c0c0c;font-weight: bold } - .terminal-3234209571-r13 { fill: #212116;font-weight: bold } - .terminal-3234209571-r14 { fill: #45ffca } + .terminal-9999999-r1 { fill: #feffac } + .terminal-9999999-r2 { fill: #777777 } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #686868 } + .terminal-9999999-r8 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r9 { fill: #232323 } + .terminal-9999999-r10 { fill: #08211a;font-weight: bold } + .terminal-9999999-r11 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r12 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r13 { fill: #212116;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - - - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - 1   - DatabasesS3 - ━━━━━━━━━━━━━╸━━╺━━━━━━━━━━━ - 📂 my-bucket - ├─ 📂 one - │  ┣━ 📁 alpha - │  ┗━ 📁 bravo - └─ 📁 two - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - - - - - - - - - - - - - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Insert Name  + + + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + 1   + DatabasesS3 + ━━━━━━━━━━━━━╸━━╺━━━━━━━━━━━ + 📂 my-bucket + ├─ 📂 one + │  ┣━ 📁 alpha + │  ┗━ 📁 bravo + └─ 📁 two + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + + + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Insert Name  . Show Context Menu  @@ -2156,193 +3008,193 @@ font-weight: 700; } - .terminal-4056085466-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4056085466-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4056085466-r1 { fill: #363636 } - .terminal-4056085466-r2 { fill: #6c6d4c } - .terminal-4056085466-r3 { fill: #c5c8c6 } - .terminal-4056085466-r4 { fill: #dfdfdf } - .terminal-4056085466-r5 { fill: #606060 } - .terminal-4056085466-r6 { fill: #3c3c3c } - .terminal-4056085466-r7 { fill: #101010 } - .terminal-4056085466-r8 { fill: #5f5f5f } - .terminal-4056085466-r9 { fill: #606060;font-weight: bold } - .terminal-4056085466-r10 { fill: #151515 } - .terminal-4056085466-r11 { fill: #ffb6d9 } - .terminal-4056085466-r12 { fill: #9d9d9d } - .terminal-4056085466-r13 { fill: #777777 } - .terminal-4056085466-r14 { fill: #141410;font-weight: bold } - .terminal-4056085466-r15 { fill: #226d58;font-weight: bold } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #6c6d4c } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #606060 } + .terminal-9999999-r6 { fill: #3c3c3c } + .terminal-9999999-r7 { fill: #101010 } + .terminal-9999999-r8 { fill: #5f5f5f } + .terminal-9999999-r9 { fill: #606060;font-weight: bold } + .terminal-9999999-r10 { fill: #151515 } + .terminal-9999999-r11 { fill: #ffb6d9 } + .terminal-9999999-r12 { fill: #9d9d9d } + .terminal-9999999-r13 { fill: #777777 } + .terminal-9999999-r14 { fill: #141410;font-weight: bold } + .terminal-9999999-r15 { fill: #226d58;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - 1   - Databases - ━╸━━━━━━━━━╺━━━━━━━━━━━━━━━━ - ▶ memory db - ╭─ Catalog Error: s3 ──────────────────────────────────────────────────────────────────╮ - - Could not populate the s3 data catalog - - ╭────────────────────────────────────────────────────────────────────────────────╮ - - Could not load s3 catalog because boto3 is not available. - - Re-install harlequin with the s3 extra, like this: - pip install harlequin[s3] - - ───────────────╯ -  Run Query  - ───────────────╮ - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────╯ - - Press any key to continue. Click error to copy. - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + 1   + Databases + ━╸━━━━━━━━━╺━━━━━━━━━━━━━━━━ + ▶ memory db + ╭─ Catalog Error: s3 ──────────────────────────────────────────────────────────────────╮ + + Could not populate the s3 data catalog + + ╭────────────────────────────────────────────────────────────────────────────────╮ + + Could not load s3 catalog because boto3 is not available. + + Re-install harlequin with the s3 extra, like this: + pip install harlequin[s3] + + ───────────────╯ +  Run Query  + ───────────────╮ + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────╯ + + Press any key to continue. Click error to copy. + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  diff --git a/tests/functional_tests/__snapshots__/test_export.ambr b/tests/functional_tests/__snapshots__/test_export.ambr index 433f3e6c..40802cd2 100644 --- a/tests/functional_tests/__snapshots__/test_export.ambr +++ b/tests/functional_tests/__snapshots__/test_export.ambr @@ -22,192 +22,192 @@ font-weight: 700; } - .terminal-3144483172-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3144483172-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3144483172-r1 { fill: #777777 } - .terminal-3144483172-r2 { fill: #c5c8c6 } - .terminal-3144483172-r3 { fill: #dfdfdf } - .terminal-3144483172-r4 { fill: #858585 } - .terminal-3144483172-r5 { fill: #feffac;font-weight: bold } - .terminal-3144483172-r6 { fill: #dddddd } - .terminal-3144483172-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-3144483172-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-3144483172-r9 { fill: #212116;font-weight: bold } - .terminal-3144483172-r10 { fill: #feffac } - .terminal-3144483172-r11 { fill: #777777;font-weight: bold } - .terminal-3144483172-r12 { fill: #08211a } - .terminal-3144483172-r13 { fill: #45ffca;font-weight: bold } - .terminal-3144483172-r14 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #08211a } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1as a                                                                       - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ -  a #                                                                                   │ -    1  - - - - - - - - - - - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1as a                                                                       + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ +  a #                                                                                   │ +    1  + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -237,197 +237,197 @@ font-weight: 700; } - .terminal-2383935842-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2383935842-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2383935842-r1 { fill: #363636 } - .terminal-2383935842-r2 { fill: #c5c8c6 } - .terminal-2383935842-r3 { fill: #dfdfdf } - .terminal-2383935842-r4 { fill: #606060 } - .terminal-2383935842-r5 { fill: #3c3c3c } - .terminal-2383935842-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-2383935842-r7 { fill: #5f5f5f } - .terminal-2383935842-r8 { fill: #6d505e;font-weight: bold } - .terminal-2383935842-r9 { fill: #feffac } - .terminal-2383935842-r10 { fill: #0c0c0c } - .terminal-2383935842-r11 { fill: #686868 } - .terminal-2383935842-r12 { fill: #777777 } - .terminal-2383935842-r13 { fill: #9d9d9d } - .terminal-2383935842-r14 { fill: #141410;font-weight: bold } - .terminal-2383935842-r15 { fill: #6c6d4c } - .terminal-2383935842-r16 { fill: #ededed;font-weight: bold } - .terminal-2383935842-r17 { fill: #212116;font-weight: bold } - .terminal-2383935842-r18 { fill: #226d58;font-weight: bold } - .terminal-2383935842-r19 { fill: #226d58 } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #606060 } + .terminal-9999999-r5 { fill: #3c3c3c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #5f5f5f } + .terminal-9999999-r8 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #0c0c0c } + .terminal-9999999-r11 { fill: #686868 } + .terminal-9999999-r12 { fill: #777777 } + .terminal-9999999-r13 { fill: #9d9d9d } + .terminal-9999999-r14 { fill: #141410;font-weight: bold } + .terminal-9999999-r15 { fill: #6c6d4c } + .terminal-9999999-r16 { fill: #ededed;font-weight: bold } + .terminal-9999999-r17 { fill: #212116;font-weight: bold } + .terminal-9999999-r18 { fill: #226d58;font-weight: bold } + .terminal-9999999-r19 { fill: #226d58 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1as a                                                                       - ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ - - Export the results of your query to a file. - - ╭────────────────────────────────────────────────────────────────────────────────╮ - /path/to/file  (tab autocompletes, enter exports, esc cancels) - ╰────────────────────────────────────────────────────────────────────────────────╯ - - - ╭──────────────────────────────────────╮ -               Format:  Select - ╰──────────────────────────────────────╯ - - - ───────────────╯ -  Run Query  - ───────────────╮ -                │ - - - - - - - - - - -  Cancel  Export  - - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1as a                                                                       + ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ + + Export the results of your query to a file. + + ╭────────────────────────────────────────────────────────────────────────────────╮ + /path/to/file  (tab autocompletes, enter exports, esc cancels) + ╰────────────────────────────────────────────────────────────────────────────────╯ + + + ╭──────────────────────────────────────╮ +               Format:  Select + ╰──────────────────────────────────────╯ + + + ───────────────╯ +  Run Query  + ───────────────╮ +                │ + + + + + + + + + + +  Cancel  Export  + + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -457,197 +457,197 @@ font-weight: 700; } - .terminal-2137362106-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2137362106-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2137362106-r1 { fill: #363636 } - .terminal-2137362106-r2 { fill: #c5c8c6 } - .terminal-2137362106-r3 { fill: #dfdfdf } - .terminal-2137362106-r4 { fill: #606060 } - .terminal-2137362106-r5 { fill: #3c3c3c } - .terminal-2137362106-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-2137362106-r7 { fill: #5f5f5f } - .terminal-2137362106-r8 { fill: #6d505e;font-weight: bold } - .terminal-2137362106-r9 { fill: #feffac } - .terminal-2137362106-r10 { fill: #0c0c0c } - .terminal-2137362106-r11 { fill: #777777 } - .terminal-2137362106-r12 { fill: #9d9d9d } - .terminal-2137362106-r13 { fill: #e8e8e8 } - .terminal-2137362106-r14 { fill: #141410;font-weight: bold } - .terminal-2137362106-r15 { fill: #6c6d4c } - .terminal-2137362106-r16 { fill: #ededed;font-weight: bold } - .terminal-2137362106-r17 { fill: #212116;font-weight: bold } - .terminal-2137362106-r18 { fill: #226d58;font-weight: bold } - .terminal-2137362106-r19 { fill: #226d58 } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #606060 } + .terminal-9999999-r5 { fill: #3c3c3c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #5f5f5f } + .terminal-9999999-r8 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #0c0c0c } + .terminal-9999999-r11 { fill: #777777 } + .terminal-9999999-r12 { fill: #9d9d9d } + .terminal-9999999-r13 { fill: #e8e8e8 } + .terminal-9999999-r14 { fill: #141410;font-weight: bold } + .terminal-9999999-r15 { fill: #6c6d4c } + .terminal-9999999-r16 { fill: #ededed;font-weight: bold } + .terminal-9999999-r17 { fill: #212116;font-weight: bold } + .terminal-9999999-r18 { fill: #226d58;font-weight: bold } + .terminal-9999999-r19 { fill: #226d58 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1as a                                                                       - ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ - - Export the results of your query to a file. - - ╭────────────────────────────────────────────────────────────────────────────────╮ - /tmp/foo-bar-static/one.csv - ╰────────────────────────────────────────────────────────────────────────────────╯ - - - ╭──────────────────────────────────────╮ -               Format:  CSV - ╰──────────────────────────────────────╯ - - ▔▔▔▔▔▔▔▔ -               Header:  ───────────────╯ - ▁▁▁▁▁▁▁▁ Run Query  - ───────────────╮ - ╭──────────────────────────────────────╮               │ -            Separator:  ,                                  - ╰──────────────────────────────────────╯ - - ╭──────────────────────────────────────╮ -          Compression:  Auto - ╰──────────────────────────────────────╯ - - ▔▔▔▔▔▔▔▔ - - -  Cancel  Export  - - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1as a                                                                       + ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ + + Export the results of your query to a file. + + ╭────────────────────────────────────────────────────────────────────────────────╮ + /tmp/foo-bar-static/one.csv + ╰────────────────────────────────────────────────────────────────────────────────╯ + + + ╭──────────────────────────────────────╮ +               Format:  CSV + ╰──────────────────────────────────────╯ + + ▔▔▔▔▔▔▔▔ +               Header:  ───────────────╯ + ▁▁▁▁▁▁▁▁ Run Query  + ───────────────╮ + ╭──────────────────────────────────────╮               │ +            Separator:  ,                                  + ╰──────────────────────────────────────╯ + + ╭──────────────────────────────────────╮ +          Compression:  Auto + ╰──────────────────────────────────────╯ + + ▔▔▔▔▔▔▔▔ + + +  Cancel  Export  + + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -677,192 +677,192 @@ font-weight: 700; } - .terminal-3144483172-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3144483172-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3144483172-r1 { fill: #777777 } - .terminal-3144483172-r2 { fill: #c5c8c6 } - .terminal-3144483172-r3 { fill: #dfdfdf } - .terminal-3144483172-r4 { fill: #858585 } - .terminal-3144483172-r5 { fill: #feffac;font-weight: bold } - .terminal-3144483172-r6 { fill: #dddddd } - .terminal-3144483172-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-3144483172-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-3144483172-r9 { fill: #212116;font-weight: bold } - .terminal-3144483172-r10 { fill: #feffac } - .terminal-3144483172-r11 { fill: #777777;font-weight: bold } - .terminal-3144483172-r12 { fill: #08211a } - .terminal-3144483172-r13 { fill: #45ffca;font-weight: bold } - .terminal-3144483172-r14 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #08211a } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1as a                                                                       - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ -  a #                                                                                   │ -    1  - - - - - - - - - - - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1as a                                                                       + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ +  a #                                                                                   │ +    1  + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -892,197 +892,197 @@ font-weight: 700; } - .terminal-2383935842-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2383935842-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2383935842-r1 { fill: #363636 } - .terminal-2383935842-r2 { fill: #c5c8c6 } - .terminal-2383935842-r3 { fill: #dfdfdf } - .terminal-2383935842-r4 { fill: #606060 } - .terminal-2383935842-r5 { fill: #3c3c3c } - .terminal-2383935842-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-2383935842-r7 { fill: #5f5f5f } - .terminal-2383935842-r8 { fill: #6d505e;font-weight: bold } - .terminal-2383935842-r9 { fill: #feffac } - .terminal-2383935842-r10 { fill: #0c0c0c } - .terminal-2383935842-r11 { fill: #686868 } - .terminal-2383935842-r12 { fill: #777777 } - .terminal-2383935842-r13 { fill: #9d9d9d } - .terminal-2383935842-r14 { fill: #141410;font-weight: bold } - .terminal-2383935842-r15 { fill: #6c6d4c } - .terminal-2383935842-r16 { fill: #ededed;font-weight: bold } - .terminal-2383935842-r17 { fill: #212116;font-weight: bold } - .terminal-2383935842-r18 { fill: #226d58;font-weight: bold } - .terminal-2383935842-r19 { fill: #226d58 } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #606060 } + .terminal-9999999-r5 { fill: #3c3c3c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #5f5f5f } + .terminal-9999999-r8 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #0c0c0c } + .terminal-9999999-r11 { fill: #686868 } + .terminal-9999999-r12 { fill: #777777 } + .terminal-9999999-r13 { fill: #9d9d9d } + .terminal-9999999-r14 { fill: #141410;font-weight: bold } + .terminal-9999999-r15 { fill: #6c6d4c } + .terminal-9999999-r16 { fill: #ededed;font-weight: bold } + .terminal-9999999-r17 { fill: #212116;font-weight: bold } + .terminal-9999999-r18 { fill: #226d58;font-weight: bold } + .terminal-9999999-r19 { fill: #226d58 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1as a                                                                       - ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ - - Export the results of your query to a file. - - ╭────────────────────────────────────────────────────────────────────────────────╮ - /path/to/file  (tab autocompletes, enter exports, esc cancels) - ╰────────────────────────────────────────────────────────────────────────────────╯ - - - ╭──────────────────────────────────────╮ -               Format:  Select - ╰──────────────────────────────────────╯ - - - ───────────────╯ -  Run Query  - ───────────────╮ -                │ - - - - - - - - - - -  Cancel  Export  - - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1as a                                                                       + ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ + + Export the results of your query to a file. + + ╭────────────────────────────────────────────────────────────────────────────────╮ + /path/to/file  (tab autocompletes, enter exports, esc cancels) + ╰────────────────────────────────────────────────────────────────────────────────╯ + + + ╭──────────────────────────────────────╮ +               Format:  Select + ╰──────────────────────────────────────╯ + + + ───────────────╯ +  Run Query  + ───────────────╮ +                │ + + + + + + + + + + +  Cancel  Export  + + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -1112,197 +1112,197 @@ font-weight: 700; } - .terminal-1880835072-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1880835072-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1880835072-r1 { fill: #363636 } - .terminal-1880835072-r2 { fill: #c5c8c6 } - .terminal-1880835072-r3 { fill: #dfdfdf } - .terminal-1880835072-r4 { fill: #606060 } - .terminal-1880835072-r5 { fill: #3c3c3c } - .terminal-1880835072-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-1880835072-r7 { fill: #5f5f5f } - .terminal-1880835072-r8 { fill: #6d505e;font-weight: bold } - .terminal-1880835072-r9 { fill: #feffac } - .terminal-1880835072-r10 { fill: #0c0c0c } - .terminal-1880835072-r11 { fill: #777777 } - .terminal-1880835072-r12 { fill: #9d9d9d } - .terminal-1880835072-r13 { fill: #141410;font-weight: bold } - .terminal-1880835072-r14 { fill: #6c6d4c } - .terminal-1880835072-r15 { fill: #1d1d1d } - .terminal-1880835072-r16 { fill: #ededed;font-weight: bold } - .terminal-1880835072-r17 { fill: #212116;font-weight: bold } - .terminal-1880835072-r18 { fill: #226d58;font-weight: bold } - .terminal-1880835072-r19 { fill: #226d58 } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #606060 } + .terminal-9999999-r5 { fill: #3c3c3c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #5f5f5f } + .terminal-9999999-r8 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #0c0c0c } + .terminal-9999999-r11 { fill: #777777 } + .terminal-9999999-r12 { fill: #9d9d9d } + .terminal-9999999-r13 { fill: #141410;font-weight: bold } + .terminal-9999999-r14 { fill: #6c6d4c } + .terminal-9999999-r15 { fill: #1d1d1d } + .terminal-9999999-r16 { fill: #ededed;font-weight: bold } + .terminal-9999999-r17 { fill: #212116;font-weight: bold } + .terminal-9999999-r18 { fill: #226d58;font-weight: bold } + .terminal-9999999-r19 { fill: #226d58 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1as a                                                                       - ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ - - Export the results of your query to a file. - - ╭────────────────────────────────────────────────────────────────────────────────╮ - /tmp/foo-bar-static/one.feather - ╰────────────────────────────────────────────────────────────────────────────────╯ - - - ╭──────────────────────────────────────╮ -               Format:  Feather - ╰──────────────────────────────────────╯ - - ╭──────────────────────────────────────╮ -          Compression:  Uncompressed───────────────╯ - ╰──────────────────────────────────────╯ Run Query  - ───────────────╮ - ╭──────────────────────────────────────╮               │ -    Compression Level:   - ╰──────────────────────────────────────╯ - - ╭──────────────────────────────────────╮ -           Chunk Size:   - ╰──────────────────────────────────────╯ - ▆▆ - ╭──────────────────────────────────────╮ - - -  Cancel  Export  - - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1as a                                                                       + ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ + + Export the results of your query to a file. + + ╭────────────────────────────────────────────────────────────────────────────────╮ + /tmp/foo-bar-static/one.feather + ╰────────────────────────────────────────────────────────────────────────────────╯ + + + ╭──────────────────────────────────────╮ +               Format:  Feather + ╰──────────────────────────────────────╯ + + ╭──────────────────────────────────────╮ +          Compression:  Uncompressed───────────────╯ + ╰──────────────────────────────────────╯ Run Query  + ───────────────╮ + ╭──────────────────────────────────────╮               │ +    Compression Level:   + ╰──────────────────────────────────────╯ + + ╭──────────────────────────────────────╮ +           Chunk Size:   + ╰──────────────────────────────────────╯ + ▆▆ + ╭──────────────────────────────────────╮ + + +  Cancel  Export  + + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -1332,192 +1332,192 @@ font-weight: 700; } - .terminal-3144483172-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3144483172-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3144483172-r1 { fill: #777777 } - .terminal-3144483172-r2 { fill: #c5c8c6 } - .terminal-3144483172-r3 { fill: #dfdfdf } - .terminal-3144483172-r4 { fill: #858585 } - .terminal-3144483172-r5 { fill: #feffac;font-weight: bold } - .terminal-3144483172-r6 { fill: #dddddd } - .terminal-3144483172-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-3144483172-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-3144483172-r9 { fill: #212116;font-weight: bold } - .terminal-3144483172-r10 { fill: #feffac } - .terminal-3144483172-r11 { fill: #777777;font-weight: bold } - .terminal-3144483172-r12 { fill: #08211a } - .terminal-3144483172-r13 { fill: #45ffca;font-weight: bold } - .terminal-3144483172-r14 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #08211a } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1as a                                                                       - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ -  a #                                                                                   │ -    1  - - - - - - - - - - - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1as a                                                                       + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ +  a #                                                                                   │ +    1  + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -1547,197 +1547,197 @@ font-weight: 700; } - .terminal-2383935842-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2383935842-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2383935842-r1 { fill: #363636 } - .terminal-2383935842-r2 { fill: #c5c8c6 } - .terminal-2383935842-r3 { fill: #dfdfdf } - .terminal-2383935842-r4 { fill: #606060 } - .terminal-2383935842-r5 { fill: #3c3c3c } - .terminal-2383935842-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-2383935842-r7 { fill: #5f5f5f } - .terminal-2383935842-r8 { fill: #6d505e;font-weight: bold } - .terminal-2383935842-r9 { fill: #feffac } - .terminal-2383935842-r10 { fill: #0c0c0c } - .terminal-2383935842-r11 { fill: #686868 } - .terminal-2383935842-r12 { fill: #777777 } - .terminal-2383935842-r13 { fill: #9d9d9d } - .terminal-2383935842-r14 { fill: #141410;font-weight: bold } - .terminal-2383935842-r15 { fill: #6c6d4c } - .terminal-2383935842-r16 { fill: #ededed;font-weight: bold } - .terminal-2383935842-r17 { fill: #212116;font-weight: bold } - .terminal-2383935842-r18 { fill: #226d58;font-weight: bold } - .terminal-2383935842-r19 { fill: #226d58 } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #606060 } + .terminal-9999999-r5 { fill: #3c3c3c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #5f5f5f } + .terminal-9999999-r8 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #0c0c0c } + .terminal-9999999-r11 { fill: #686868 } + .terminal-9999999-r12 { fill: #777777 } + .terminal-9999999-r13 { fill: #9d9d9d } + .terminal-9999999-r14 { fill: #141410;font-weight: bold } + .terminal-9999999-r15 { fill: #6c6d4c } + .terminal-9999999-r16 { fill: #ededed;font-weight: bold } + .terminal-9999999-r17 { fill: #212116;font-weight: bold } + .terminal-9999999-r18 { fill: #226d58;font-weight: bold } + .terminal-9999999-r19 { fill: #226d58 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1as a                                                                       - ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ - - Export the results of your query to a file. - - ╭────────────────────────────────────────────────────────────────────────────────╮ - /path/to/file  (tab autocompletes, enter exports, esc cancels) - ╰────────────────────────────────────────────────────────────────────────────────╯ - - - ╭──────────────────────────────────────╮ -               Format:  Select - ╰──────────────────────────────────────╯ - - - ───────────────╯ -  Run Query  - ───────────────╮ -                │ - - - - - - - - - - -  Cancel  Export  - - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1as a                                                                       + ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ + + Export the results of your query to a file. + + ╭────────────────────────────────────────────────────────────────────────────────╮ + /path/to/file  (tab autocompletes, enter exports, esc cancels) + ╰────────────────────────────────────────────────────────────────────────────────╯ + + + ╭──────────────────────────────────────╮ +               Format:  Select + ╰──────────────────────────────────────╯ + + + ───────────────╯ +  Run Query  + ───────────────╮ +                │ + + + + + + + + + + +  Cancel  Export  + + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -1767,199 +1767,199 @@ font-weight: 700; } - .terminal-2476373557-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2476373557-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2476373557-r1 { fill: #363636 } - .terminal-2476373557-r2 { fill: #c5c8c6 } - .terminal-2476373557-r3 { fill: #dfdfdf } - .terminal-2476373557-r4 { fill: #606060 } - .terminal-2476373557-r5 { fill: #3c3c3c } - .terminal-2476373557-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-2476373557-r7 { fill: #5f5f5f } - .terminal-2476373557-r8 { fill: #6d505e;font-weight: bold } - .terminal-2476373557-r9 { fill: #feffac } - .terminal-2476373557-r10 { fill: #0c0c0c } - .terminal-2476373557-r11 { fill: #777777 } - .terminal-2476373557-r12 { fill: #9d9d9d } - .terminal-2476373557-r13 { fill: #e8e8e8 } - .terminal-2476373557-r14 { fill: #141410;font-weight: bold } - .terminal-2476373557-r15 { fill: #6c6d4c } - .terminal-2476373557-r16 { fill: #686868 } - .terminal-2476373557-r17 { fill: #1d1d1d } - .terminal-2476373557-r18 { fill: #ededed;font-weight: bold } - .terminal-2476373557-r19 { fill: #212116;font-weight: bold } - .terminal-2476373557-r20 { fill: #226d58;font-weight: bold } - .terminal-2476373557-r21 { fill: #226d58 } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #606060 } + .terminal-9999999-r5 { fill: #3c3c3c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #5f5f5f } + .terminal-9999999-r8 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #0c0c0c } + .terminal-9999999-r11 { fill: #777777 } + .terminal-9999999-r12 { fill: #9d9d9d } + .terminal-9999999-r13 { fill: #e8e8e8 } + .terminal-9999999-r14 { fill: #141410;font-weight: bold } + .terminal-9999999-r15 { fill: #6c6d4c } + .terminal-9999999-r16 { fill: #686868 } + .terminal-9999999-r17 { fill: #1d1d1d } + .terminal-9999999-r18 { fill: #ededed;font-weight: bold } + .terminal-9999999-r19 { fill: #212116;font-weight: bold } + .terminal-9999999-r20 { fill: #226d58;font-weight: bold } + .terminal-9999999-r21 { fill: #226d58 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1as a                                                                       - ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ - - Export the results of your query to a file. - - ╭────────────────────────────────────────────────────────────────────────────────╮ - /tmp/foo-bar-static/one.json - ╰────────────────────────────────────────────────────────────────────────────────╯ - - - ╭──────────────────────────────────────╮ -               Format:  JSON - ╰──────────────────────────────────────╯ - - ▔▔▔▔▔▔▔▔ -                Array:  ───────────────╯ - ▁▁▁▁▁▁▁▁ Run Query  - ───────────────╮ - ╭──────────────────────────────────────╮               │ -          Compression:  Auto - ╰──────────────────────────────────────╯ - - ╭──────────────────────────────────────╮ -          Date Format:  %Y-%m-%d - ╰──────────────────────────────────────╯ - ▆▆ - ╭──────────────────────────────────────╮ - - -  Cancel  Export  - - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1as a                                                                       + ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ + + Export the results of your query to a file. + + ╭────────────────────────────────────────────────────────────────────────────────╮ + /tmp/foo-bar-static/one.json + ╰────────────────────────────────────────────────────────────────────────────────╯ + + + ╭──────────────────────────────────────╮ +               Format:  JSON + ╰──────────────────────────────────────╯ + + ▔▔▔▔▔▔▔▔ +                Array:  ───────────────╯ + ▁▁▁▁▁▁▁▁ Run Query  + ───────────────╮ + ╭──────────────────────────────────────╮               │ +          Compression:  Auto + ╰──────────────────────────────────────╯ + + ╭──────────────────────────────────────╮ +          Date Format:  %Y-%m-%d + ╰──────────────────────────────────────╯ + ▆▆ + ╭──────────────────────────────────────╮ + + +  Cancel  Export  + + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -1989,192 +1989,192 @@ font-weight: 700; } - .terminal-3144483172-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3144483172-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3144483172-r1 { fill: #777777 } - .terminal-3144483172-r2 { fill: #c5c8c6 } - .terminal-3144483172-r3 { fill: #dfdfdf } - .terminal-3144483172-r4 { fill: #858585 } - .terminal-3144483172-r5 { fill: #feffac;font-weight: bold } - .terminal-3144483172-r6 { fill: #dddddd } - .terminal-3144483172-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-3144483172-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-3144483172-r9 { fill: #212116;font-weight: bold } - .terminal-3144483172-r10 { fill: #feffac } - .terminal-3144483172-r11 { fill: #777777;font-weight: bold } - .terminal-3144483172-r12 { fill: #08211a } - .terminal-3144483172-r13 { fill: #45ffca;font-weight: bold } - .terminal-3144483172-r14 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #08211a } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1as a                                                                       - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ -  a #                                                                                   │ -    1  - - - - - - - - - - - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1as a                                                                       + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ +  a #                                                                                   │ +    1  + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -2204,197 +2204,197 @@ font-weight: 700; } - .terminal-2383935842-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2383935842-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2383935842-r1 { fill: #363636 } - .terminal-2383935842-r2 { fill: #c5c8c6 } - .terminal-2383935842-r3 { fill: #dfdfdf } - .terminal-2383935842-r4 { fill: #606060 } - .terminal-2383935842-r5 { fill: #3c3c3c } - .terminal-2383935842-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-2383935842-r7 { fill: #5f5f5f } - .terminal-2383935842-r8 { fill: #6d505e;font-weight: bold } - .terminal-2383935842-r9 { fill: #feffac } - .terminal-2383935842-r10 { fill: #0c0c0c } - .terminal-2383935842-r11 { fill: #686868 } - .terminal-2383935842-r12 { fill: #777777 } - .terminal-2383935842-r13 { fill: #9d9d9d } - .terminal-2383935842-r14 { fill: #141410;font-weight: bold } - .terminal-2383935842-r15 { fill: #6c6d4c } - .terminal-2383935842-r16 { fill: #ededed;font-weight: bold } - .terminal-2383935842-r17 { fill: #212116;font-weight: bold } - .terminal-2383935842-r18 { fill: #226d58;font-weight: bold } - .terminal-2383935842-r19 { fill: #226d58 } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #606060 } + .terminal-9999999-r5 { fill: #3c3c3c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #5f5f5f } + .terminal-9999999-r8 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #0c0c0c } + .terminal-9999999-r11 { fill: #686868 } + .terminal-9999999-r12 { fill: #777777 } + .terminal-9999999-r13 { fill: #9d9d9d } + .terminal-9999999-r14 { fill: #141410;font-weight: bold } + .terminal-9999999-r15 { fill: #6c6d4c } + .terminal-9999999-r16 { fill: #ededed;font-weight: bold } + .terminal-9999999-r17 { fill: #212116;font-weight: bold } + .terminal-9999999-r18 { fill: #226d58;font-weight: bold } + .terminal-9999999-r19 { fill: #226d58 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1as a                                                                       - ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ - - Export the results of your query to a file. - - ╭────────────────────────────────────────────────────────────────────────────────╮ - /path/to/file  (tab autocompletes, enter exports, esc cancels) - ╰────────────────────────────────────────────────────────────────────────────────╯ - - - ╭──────────────────────────────────────╮ -               Format:  Select - ╰──────────────────────────────────────╯ - - - ───────────────╯ -  Run Query  - ───────────────╮ -                │ - - - - - - - - - - -  Cancel  Export  - - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1as a                                                                       + ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ + + Export the results of your query to a file. + + ╭────────────────────────────────────────────────────────────────────────────────╮ + /path/to/file  (tab autocompletes, enter exports, esc cancels) + ╰────────────────────────────────────────────────────────────────────────────────╯ + + + ╭──────────────────────────────────────╮ +               Format:  Select + ╰──────────────────────────────────────╯ + + + ───────────────╯ +  Run Query  + ───────────────╮ +                │ + + + + + + + + + + +  Cancel  Export  + + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -2424,197 +2424,197 @@ font-weight: 700; } - .terminal-2043432483-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2043432483-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2043432483-r1 { fill: #363636 } - .terminal-2043432483-r2 { fill: #c5c8c6 } - .terminal-2043432483-r3 { fill: #dfdfdf } - .terminal-2043432483-r4 { fill: #606060 } - .terminal-2043432483-r5 { fill: #3c3c3c } - .terminal-2043432483-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-2043432483-r7 { fill: #5f5f5f } - .terminal-2043432483-r8 { fill: #6d505e;font-weight: bold } - .terminal-2043432483-r9 { fill: #feffac } - .terminal-2043432483-r10 { fill: #0c0c0c } - .terminal-2043432483-r11 { fill: #777777 } - .terminal-2043432483-r12 { fill: #9d9d9d } - .terminal-2043432483-r13 { fill: #141410;font-weight: bold } - .terminal-2043432483-r14 { fill: #1d1d1d } - .terminal-2043432483-r15 { fill: #6c6d4c } - .terminal-2043432483-r16 { fill: #ededed;font-weight: bold } - .terminal-2043432483-r17 { fill: #212116;font-weight: bold } - .terminal-2043432483-r18 { fill: #226d58;font-weight: bold } - .terminal-2043432483-r19 { fill: #226d58 } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #606060 } + .terminal-9999999-r5 { fill: #3c3c3c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #5f5f5f } + .terminal-9999999-r8 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #0c0c0c } + .terminal-9999999-r11 { fill: #777777 } + .terminal-9999999-r12 { fill: #9d9d9d } + .terminal-9999999-r13 { fill: #141410;font-weight: bold } + .terminal-9999999-r14 { fill: #1d1d1d } + .terminal-9999999-r15 { fill: #6c6d4c } + .terminal-9999999-r16 { fill: #ededed;font-weight: bold } + .terminal-9999999-r17 { fill: #212116;font-weight: bold } + .terminal-9999999-r18 { fill: #226d58;font-weight: bold } + .terminal-9999999-r19 { fill: #226d58 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1as a                                                                       - ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ - - Export the results of your query to a file. - - ╭────────────────────────────────────────────────────────────────────────────────╮ - /tmp/foo-bar-static/one.orc - ╰────────────────────────────────────────────────────────────────────────────────╯ - - - ╭──────────────────────────────────────╮ -               Format:  ORC - ╰──────────────────────────────────────╯ - - ╭──────────────────────────────────────╮ -         File Version:  0.12───────────────╯ - ╰──────────────────────────────────────╯ Run Query  - ▄▄───────────────╮ - ╭──────────────────────────────────────╮               │ -           Batch Size:  1024                               - ╰──────────────────────────────────────╯ - - ╭──────────────────────────────────────╮ -          Stripe Size:  67108864                           - ╰──────────────────────────────────────╯ - - ╭──────────────────────────────────────╮ - - -  Cancel  Export  - - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1as a                                                                       + ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ + + Export the results of your query to a file. + + ╭────────────────────────────────────────────────────────────────────────────────╮ + /tmp/foo-bar-static/one.orc + ╰────────────────────────────────────────────────────────────────────────────────╯ + + + ╭──────────────────────────────────────╮ +               Format:  ORC + ╰──────────────────────────────────────╯ + + ╭──────────────────────────────────────╮ +         File Version:  0.12───────────────╯ + ╰──────────────────────────────────────╯ Run Query  + ▄▄───────────────╮ + ╭──────────────────────────────────────╮               │ +           Batch Size:  1024                               + ╰──────────────────────────────────────╯ + + ╭──────────────────────────────────────╮ +          Stripe Size:  67108864                           + ╰──────────────────────────────────────╯ + + ╭──────────────────────────────────────╮ + + +  Cancel  Export  + + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -2644,192 +2644,192 @@ font-weight: 700; } - .terminal-3144483172-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3144483172-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3144483172-r1 { fill: #777777 } - .terminal-3144483172-r2 { fill: #c5c8c6 } - .terminal-3144483172-r3 { fill: #dfdfdf } - .terminal-3144483172-r4 { fill: #858585 } - .terminal-3144483172-r5 { fill: #feffac;font-weight: bold } - .terminal-3144483172-r6 { fill: #dddddd } - .terminal-3144483172-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-3144483172-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-3144483172-r9 { fill: #212116;font-weight: bold } - .terminal-3144483172-r10 { fill: #feffac } - .terminal-3144483172-r11 { fill: #777777;font-weight: bold } - .terminal-3144483172-r12 { fill: #08211a } - .terminal-3144483172-r13 { fill: #45ffca;font-weight: bold } - .terminal-3144483172-r14 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #08211a } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1as a                                                                       - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ -  a #                                                                                   │ -    1  - - - - - - - - - - - - - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1as a                                                                       + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (1 Records) ────────────────────────────────────────────────────────────╮ +  a #                                                                                   │ +    1  + + + + + + + + + + + + + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -2859,197 +2859,197 @@ font-weight: 700; } - .terminal-2383935842-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2383935842-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2383935842-r1 { fill: #363636 } - .terminal-2383935842-r2 { fill: #c5c8c6 } - .terminal-2383935842-r3 { fill: #dfdfdf } - .terminal-2383935842-r4 { fill: #606060 } - .terminal-2383935842-r5 { fill: #3c3c3c } - .terminal-2383935842-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-2383935842-r7 { fill: #5f5f5f } - .terminal-2383935842-r8 { fill: #6d505e;font-weight: bold } - .terminal-2383935842-r9 { fill: #feffac } - .terminal-2383935842-r10 { fill: #0c0c0c } - .terminal-2383935842-r11 { fill: #686868 } - .terminal-2383935842-r12 { fill: #777777 } - .terminal-2383935842-r13 { fill: #9d9d9d } - .terminal-2383935842-r14 { fill: #141410;font-weight: bold } - .terminal-2383935842-r15 { fill: #6c6d4c } - .terminal-2383935842-r16 { fill: #ededed;font-weight: bold } - .terminal-2383935842-r17 { fill: #212116;font-weight: bold } - .terminal-2383935842-r18 { fill: #226d58;font-weight: bold } - .terminal-2383935842-r19 { fill: #226d58 } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #606060 } + .terminal-9999999-r5 { fill: #3c3c3c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #5f5f5f } + .terminal-9999999-r8 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #0c0c0c } + .terminal-9999999-r11 { fill: #686868 } + .terminal-9999999-r12 { fill: #777777 } + .terminal-9999999-r13 { fill: #9d9d9d } + .terminal-9999999-r14 { fill: #141410;font-weight: bold } + .terminal-9999999-r15 { fill: #6c6d4c } + .terminal-9999999-r16 { fill: #ededed;font-weight: bold } + .terminal-9999999-r17 { fill: #212116;font-weight: bold } + .terminal-9999999-r18 { fill: #226d58;font-weight: bold } + .terminal-9999999-r19 { fill: #226d58 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1as a                                                                       - ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ - - Export the results of your query to a file. - - ╭────────────────────────────────────────────────────────────────────────────────╮ - /path/to/file  (tab autocompletes, enter exports, esc cancels) - ╰────────────────────────────────────────────────────────────────────────────────╯ - - - ╭──────────────────────────────────────╮ -               Format:  Select - ╰──────────────────────────────────────╯ - - - ───────────────╯ -  Run Query  - ───────────────╮ -                │ - - - - - - - - - - -  Cancel  Export  - - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1as a                                                                       + ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ + + Export the results of your query to a file. + + ╭────────────────────────────────────────────────────────────────────────────────╮ + /path/to/file  (tab autocompletes, enter exports, esc cancels) + ╰────────────────────────────────────────────────────────────────────────────────╯ + + + ╭──────────────────────────────────────╮ +               Format:  Select + ╰──────────────────────────────────────╯ + + + ───────────────╯ +  Run Query  + ───────────────╮ +                │ + + + + + + + + + + +  Cancel  Export  + + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -3079,196 +3079,196 @@ font-weight: 700; } - .terminal-3252314956-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3252314956-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3252314956-r1 { fill: #363636 } - .terminal-3252314956-r2 { fill: #c5c8c6 } - .terminal-3252314956-r3 { fill: #dfdfdf } - .terminal-3252314956-r4 { fill: #606060 } - .terminal-3252314956-r5 { fill: #3c3c3c } - .terminal-3252314956-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-3252314956-r7 { fill: #5f5f5f } - .terminal-3252314956-r8 { fill: #6d505e;font-weight: bold } - .terminal-3252314956-r9 { fill: #feffac } - .terminal-3252314956-r10 { fill: #0c0c0c } - .terminal-3252314956-r11 { fill: #777777 } - .terminal-3252314956-r12 { fill: #9d9d9d } - .terminal-3252314956-r13 { fill: #141410;font-weight: bold } - .terminal-3252314956-r14 { fill: #6c6d4c } - .terminal-3252314956-r15 { fill: #ededed;font-weight: bold } - .terminal-3252314956-r16 { fill: #212116;font-weight: bold } - .terminal-3252314956-r17 { fill: #226d58;font-weight: bold } - .terminal-3252314956-r18 { fill: #226d58 } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #606060 } + .terminal-9999999-r5 { fill: #3c3c3c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #5f5f5f } + .terminal-9999999-r8 { fill: #6d505e;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #0c0c0c } + .terminal-9999999-r11 { fill: #777777 } + .terminal-9999999-r12 { fill: #9d9d9d } + .terminal-9999999-r13 { fill: #141410;font-weight: bold } + .terminal-9999999-r14 { fill: #6c6d4c } + .terminal-9999999-r15 { fill: #ededed;font-weight: bold } + .terminal-9999999-r16 { fill: #212116;font-weight: bold } + .terminal-9999999-r17 { fill: #226d58;font-weight: bold } + .terminal-9999999-r18 { fill: #226d58 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db││1  select1as a                                                                       - ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ - - Export the results of your query to a file. - - ╭────────────────────────────────────────────────────────────────────────────────╮ - /tmp/foo-bar-static/one.parquet - ╰────────────────────────────────────────────────────────────────────────────────╯ - - - ╭──────────────────────────────────────╮ -               Format:  Parquet - ╰──────────────────────────────────────╯ - - ╭──────────────────────────────────────╮ -          Compression:  Snappy───────────────╯ - ╰──────────────────────────────────────╯ Run Query  - ───────────────╮ -                │ - - - - - - - - - - -  Cancel  Export  - - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db││1  select1as a                                                                       + ╭─ Data Exporter ──────────────────────────────────────────────────────────────────────╮ + + Export the results of your query to a file. + + ╭────────────────────────────────────────────────────────────────────────────────╮ + /tmp/foo-bar-static/one.parquet + ╰────────────────────────────────────────────────────────────────────────────────╯ + + + ╭──────────────────────────────────────╮ +               Format:  Parquet + ╰──────────────────────────────────────╯ + + ╭──────────────────────────────────────╮ +          Compression:  Snappy───────────────╯ + ╰──────────────────────────────────────╯ Run Query  + ───────────────╮ +                │ + + + + + + + + + + +  Cancel  Export  + + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  diff --git a/tests/functional_tests/__snapshots__/test_help_screen.ambr b/tests/functional_tests/__snapshots__/test_help_screen.ambr index d9898107..6a0be8e8 100644 --- a/tests/functional_tests/__snapshots__/test_help_screen.ambr +++ b/tests/functional_tests/__snapshots__/test_help_screen.ambr @@ -22,197 +22,197 @@ font-weight: 700; } - .terminal-3667354983-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3667354983-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3667354983-r1 { fill: #363636 } - .terminal-3667354983-r2 { fill: #6c6d4c } - .terminal-3667354983-r3 { fill: #c5c8c6 } - .terminal-3667354983-r4 { fill: #dfdfdf } - .terminal-3667354983-r5 { fill: #606060 } - .terminal-3667354983-r6 { fill: #3c3c3c } - .terminal-3667354983-r7 { fill: #101010 } - .terminal-3667354983-r8 { fill: #5f5f5f } - .terminal-3667354983-r9 { fill: #feffac } - .terminal-3667354983-r10 { fill: #777777 } - .terminal-3667354983-r11 { fill: #45ffca;font-weight: bold } - .terminal-3667354983-r12 { fill: #1d1d1d } - .terminal-3667354983-r13 { fill: #d2d2d2 } - .terminal-3667354983-r14 { fill: #eeffff } - .terminal-3667354983-r15 { fill: #c3e88d } - .terminal-3667354983-r16 { fill: #141410;font-weight: bold } - .terminal-3667354983-r17 { fill: #dfdfdf;text-decoration: underline; } - .terminal-3667354983-r18 { fill: #9d9d9d } - .terminal-3667354983-r19 { fill: #226d58;font-weight: bold } + .terminal-9999999-r1 { fill: #363636 } + .terminal-9999999-r2 { fill: #6c6d4c } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #606060 } + .terminal-9999999-r6 { fill: #3c3c3c } + .terminal-9999999-r7 { fill: #101010 } + .terminal-9999999-r8 { fill: #5f5f5f } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #777777 } + .terminal-9999999-r11 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r12 { fill: #1d1d1d } + .terminal-9999999-r13 { fill: #d2d2d2 } + .terminal-9999999-r14 { fill: #eeffff } + .terminal-9999999-r15 { fill: #c3e88d } + .terminal-9999999-r16 { fill: #141410;font-weight: bold } + .terminal-9999999-r17 { fill: #dfdfdf;text-decoration: underline; } + .terminal-9999999-r18 { fill: #9d9d9d } + .terminal-9999999-r19 { fill: #226d58;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db1   - ╭─ Harlequin Help ─────────────────────────────────────────────────────────────────────╮ - - Welcome to Harlequin! This screen contains a small subset of the online docs,  - available at https://harlequin.sh/docs/getting-started - - ╭────────────────────────────────────────────────────────────────────────────────╮ - - Using Harlequin with DuckDB - -   Harlequin defaults to using its DuckDB database adapter. - ▅▅ -   From any shell, to open one or more DuckDB database files: - - - harlequin "path/to/duck.db""another_duck.db"───────────────╯ -  Run Query  - ───────────────╮ -   To open an in-memory DuckDB session, run Harlequin with no arguments: - - - harlequin - - -   If you want to control the version of DuckDB that Harlequin uses, see the    - Troubleshooting page. - - Using Harlequin with SQLite and Other Adapters - ╰────────────────────────────────────────────────────────────────────────────────╯ - - Scroll with arrows. Press any other key to continue. - - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db1   + ╭─ Harlequin Help ─────────────────────────────────────────────────────────────────────╮ + + Welcome to Harlequin! This screen contains a small subset of the online docs,  + available at https://harlequin.sh/docs/getting-started + + ╭────────────────────────────────────────────────────────────────────────────────╮ + + Using Harlequin with DuckDB + +   Harlequin defaults to using its DuckDB database adapter. + ▅▅ +   From any shell, to open one or more DuckDB database files: + + + harlequin "path/to/duck.db""another_duck.db"───────────────╯ +  Run Query  + ───────────────╮ +   To open an in-memory DuckDB session, run Harlequin with no arguments: + + + harlequin + + +   If you want to control the version of DuckDB that Harlequin uses, see the    + Troubleshooting page. + + Using Harlequin with SQLite and Other Adapters + ╰────────────────────────────────────────────────────────────────────────────────╯ + + Scroll with arrows. Press any other key to continue. + + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  diff --git a/tests/functional_tests/__snapshots__/test_history_screen.ambr b/tests/functional_tests/__snapshots__/test_history_screen.ambr index b79910ef..0a8af533 100644 --- a/tests/functional_tests/__snapshots__/test_history_screen.ambr +++ b/tests/functional_tests/__snapshots__/test_history_screen.ambr @@ -22,192 +22,192 @@ font-weight: 700; } - .terminal-880833008-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-880833008-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-880833008-r1 { fill: #feffac } - .terminal-880833008-r2 { fill: #777777 } - .terminal-880833008-r3 { fill: #c5c8c6 } - .terminal-880833008-r4 { fill: #dfdfdf } - .terminal-880833008-r5 { fill: #dfdfdf;font-weight: bold } - .terminal-880833008-r6 { fill: #f4005f;font-weight: bold;font-style: italic; } - .terminal-880833008-r7 { fill: #c8c8c8;font-weight: bold } - .terminal-880833008-r8 { fill: #4a4a4a } - .terminal-880833008-r9 { fill: #feffac;font-weight: bold } - .terminal-880833008-r10 { fill: #dddddd } - .terminal-880833008-r11 { fill: #ffb6d9;font-weight: bold } - .terminal-880833008-r12 { fill: #08211a } - .terminal-880833008-r13 { fill: #08211a;font-weight: bold } - .terminal-880833008-r14 { fill: #1d1d1d } + .terminal-9999999-r1 { fill: #feffac } + .terminal-9999999-r2 { fill: #777777 } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r6 { fill: #f4005f;font-weight: bold;font-style: italic; } + .terminal-9999999-r7 { fill: #c8c8c8;font-weight: bold } + .terminal-9999999-r8 { fill: #4a4a4a } + .terminal-9999999-r9 { fill: #feffac;font-weight: bold } + .terminal-9999999-r10 { fill: #dddddd } + .terminal-9999999-r11 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r12 { fill: #08211a } + .terminal-9999999-r13 { fill: #08211a;font-weight: bold } + .terminal-9999999-r14 { fill: #1d1d1d } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Query History ──────────────────────────────────────────╮╭─ Highlighted Query Preview ──────────────────────────────╮ - Fri, Jan 26 10:15:00                            ERRORselect14 -  sel                                                     - - Fri, Jan 26 10:14:00         1 record in 1.00s -  select 14                                               - - Fri, Jan 26 10:13:00         1 record in 1.00s -  select 13                                               - - Fri, Jan 26 10:12:00         1 record in 1.00s -  select 12                                               - - Fri, Jan 26 10:11:00         1 record in 1.00s -  select 11                                               - - Fri, Jan 26 10:10:00         1 record in 1.00s -  select 10                                               - - Fri, Jan 26 10:09:00         1 record in 1.00s -  select 9                                                - - Fri, Jan 26 10:08:00         1 record in 1.00s -  select 8                                                - - Fri, Jan 26 10:07:00         1 record in 1.00s▇▇ -  select 7                                                - - Fri, Jan 26 10:06:00         1 record in 1.00s -  select 6                                                - - Fri, Jan 26 10:05:00         1 record in 1.00s -  select 5                                                - - Fri, Jan 26 10:04:00         1 record in 1.00s - ╰───────────── Enter or click to select; Escape to cancel ─╯╰──────────────────────────────────────────────────────────╯ + + ╭─ Query History ──────────────────────────────────────────╮╭─ Highlighted Query Preview ──────────────────────────────╮ + Fri, Jan 26 10:15:00                            ERRORselect14 +  sel                                                     + + Fri, Jan 26 10:14:00         1 record in 1.00s +  select 14                                               + + Fri, Jan 26 10:13:00         1 record in 1.00s +  select 13                                               + + Fri, Jan 26 10:12:00         1 record in 1.00s +  select 12                                               + + Fri, Jan 26 10:11:00         1 record in 1.00s +  select 11                                               + + Fri, Jan 26 10:10:00         1 record in 1.00s +  select 10                                               + + Fri, Jan 26 10:09:00         1 record in 1.00s +  select 9                                                + + Fri, Jan 26 10:08:00         1 record in 1.00s +  select 8                                                + + Fri, Jan 26 10:07:00         1 record in 1.00s▇▇ +  select 7                                                + + Fri, Jan 26 10:06:00         1 record in 1.00s +  select 6                                                + + Fri, Jan 26 10:05:00         1 record in 1.00s +  select 5                                                + + Fri, Jan 26 10:04:00         1 record in 1.00s + ╰───────────── Enter or click to select; Escape to cancel ─╯╰──────────────────────────────────────────────────────────╯ @@ -237,193 +237,194 @@ font-weight: 700; } - .terminal-119510548-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-119510548-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-119510548-r1 { fill: #777777 } - .terminal-119510548-r2 { fill: #feffac } - .terminal-119510548-r3 { fill: #c5c8c6 } - .terminal-119510548-r4 { fill: #dfdfdf } - .terminal-119510548-r5 { fill: #686868 } - .terminal-119510548-r6 { fill: #dfdfdf;font-weight: bold } - .terminal-119510548-r7 { fill: #232323 } - .terminal-119510548-r8 { fill: #858585 } - .terminal-119510548-r9 { fill: #181818;font-weight: bold } - .terminal-119510548-r10 { fill: #feffac;font-weight: bold } - .terminal-119510548-r11 { fill: #dddddd } - .terminal-119510548-r12 { fill: #ffb6d9;font-weight: bold } - .terminal-119510548-r13 { fill: #0c0c0c;font-weight: bold } - .terminal-119510548-r14 { fill: #212116;font-weight: bold } - .terminal-119510548-r15 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #001b14;font-weight: bold } + .terminal-9999999-r6 { fill: #686868 } + .terminal-9999999-r7 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r8 { fill: #232323 } + .terminal-9999999-r9 { fill: #858585 } + .terminal-9999999-r10 { fill: #181818;font-weight: bold } + .terminal-9999999-r11 { fill: #feffac;font-weight: bold } + .terminal-9999999-r12 { fill: #dddddd } + .terminal-9999999-r13 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r14 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r15 { fill: #212116;font-weight: bold } + .terminal-9999999-r16 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - - - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db - Tab 1Tab 2 - ━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - 1  select14 - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db + Tab 1Tab 2 + ━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 1  select14 + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  diff --git a/tests/functional_tests/__snapshots__/test_keys_app.ambr b/tests/functional_tests/__snapshots__/test_keys_app.ambr index 2646ff07..77387c50 100644 --- a/tests/functional_tests/__snapshots__/test_keys_app.ambr +++ b/tests/functional_tests/__snapshots__/test_keys_app.ambr @@ -22,201 +22,200 @@ font-weight: 700; } - .terminal-3144241796-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3144241796-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3144241796-r1 { fill: #dfdfdf } - .terminal-3144241796-r2 { fill: #606060;font-style: italic; } - .terminal-3144241796-r3 { fill: #c5c8c6 } - .terminal-3144241796-r4 { fill: #606060;font-weight: bold } - .terminal-3144241796-r5 { fill: #6c6d4c } - .terminal-3144241796-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-3144241796-r7 { fill: #feffac } - .terminal-3144241796-r8 { fill: #606060 } - .terminal-3144241796-r9 { fill: #dfdfdf;font-weight: bold } - .terminal-3144241796-r10 { fill: #8a8a8a;font-style: italic; } - .terminal-3144241796-r11 { fill: #0a1411 } - .terminal-3144241796-r12 { fill: #8a8a8a;font-weight: bold } - .terminal-3144241796-r13 { fill: #8a8a8a } - .terminal-3144241796-r14 { fill: #121212 } - .terminal-3144241796-r15 { fill: #777777 } - .terminal-3144241796-r16 { fill: #ffb6d9 } - .terminal-3144241796-r17 { fill: #45ffca } - .terminal-3144241796-r18 { fill: #45ffca;font-weight: bold } - .terminal-3144241796-r19 { fill: #686868 } - .terminal-3144241796-r20 { fill: #ededed;font-weight: bold } - .terminal-3144241796-r21 { fill: #212116;font-weight: bold } - .terminal-3144241796-r22 { fill: #226d58;font-weight: bold } - .terminal-3144241796-r23 { fill: #226d58 } + .terminal-9999999-r1 { fill: #dfdfdf } + .terminal-9999999-r2 { fill: #606060;font-style: italic; } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #606060;font-weight: bold } + .terminal-9999999-r5 { fill: #6c6d4c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #feffac } + .terminal-9999999-r8 { fill: #606060 } + .terminal-9999999-r9 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r10 { fill: #8a8a8a;font-style: italic; } + .terminal-9999999-r11 { fill: #0a1411 } + .terminal-9999999-r12 { fill: #8a8a8a;font-weight: bold } + .terminal-9999999-r13 { fill: #8a8a8a } + .terminal-9999999-r14 { fill: #777777 } + .terminal-9999999-r15 { fill: #ffb6d9 } + .terminal-9999999-r16 { fill: #45ffca } + .terminal-9999999-r17 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r18 { fill: #686868 } + .terminal-9999999-r19 { fill: #ededed;font-weight: bold } + .terminal-9999999-r20 { fill: #212116;font-weight: bold } + .terminal-9999999-r21 { fill: #226d58;font-weight: bold } + .terminal-9999999-r22 { fill: #226d58 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - HarlequinKeys + HarlequinKeys - - - - The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them - to a keymap. - Loaded Keymaps: vscode - ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -  Action                      ╭──────────────────────────────────────────────────────────╮ -  Quit                         -  Help                        Action: Focus Query Editor -  Focus Next                   -  Focus Previous              Use the buttons below to replace, remove, or  -  Focus Query Editor          add bindings for this action. -  Focus Results Viewer        Enter: Select Button; Tab: Next Button -  Focus Data Catalog           -  Toggle Sidebar              ▇▇ -  Toggle Full Screen          ╭──────────────────╮╭───╮ -  Show Query History                   Key:   f3  X  -  Show Data Exporter          ╰──────────────────╯╰───╯ -  Refresh Catalog             ╭──────────────────╮╭───╮ -  Run Query                            Key:   f4  X  -  Cancel Query                ╰──────────────────╯╰───╯ -  Code Editor: New Buffer     ╭──────────────────╮ -  Code Editor: Close Buffer    Add Key  -  Code Editor: Next Buffer    ╰──────────────────╯ -  Code Editor: Run Query      ╭────────────────────────────────╮ -  Code Editor: Format Buffer   Key Display:  (Optional) -  Code Editor: Save Buffer    ╰────────────────────────────────╯ -  Code Editor: Load Buffer     -  Code Editor: Find            -  Code Editor: Find Next       Cancel  Submit  -  Code Editor: Goto Line       -  Code Editor: Cursor Up       -  Code Editor: Cursor Down    ╰──────────────────────────────────────────────────────────╯ -  Code Editor: Cursor Left              left                                                                          -  Code Editor: Cursor Right             right                                                                         -  Code Editor: Cursor Word Left         ctrl+left                                                                     - ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  ⏎ Edit  + + + + The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them + to a keymap. + Loaded Keymaps: vscode + ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +  Action                      ╭──────────────────────────────────────────────────────────╮ +  Quit                         +  Help                        Action: Focus Query Editor +  Focus Next                   +  Focus Previous              Use the buttons below to replace, remove, or  +  Focus Query Editor          add bindings for this action. +  Focus Results Viewer        Enter: Select Button; Tab: Next Button +  Focus Data Catalog           +  Toggle Sidebar               +  Toggle Full Screen          ╭──────────────────╮╭───╮ +  Show Query History                   Key:   f3  X  +  Show Data Exporter          ╰──────────────────╯╰───╯ +  Refresh Catalog             ╭──────────────────╮╭───╮ +  Run Query                            Key:   f4  X  +  Cancel Query                ╰──────────────────╯╰───╯ +  Code Editor: New Buffer     ╭──────────────────╮ +  Code Editor: Close Buffer    Add Key  +  Code Editor: Next Buffer    ╰──────────────────╯ +  Code Editor: Run Query      ╭────────────────────────────────╮ +  Code Editor: Format Buffer   Key Display:  (Optional) +  Code Editor: Save Buffer    ╰────────────────────────────────╯ +  Code Editor: Load Buffer     +  Code Editor: Find            +  Code Editor: Find Next       Cancel  Submit  +  Code Editor: Goto Line       +  Code Editor: Cursor Up       +  Code Editor: Cursor Down    ╰──────────────────────────────────────────────────────────╯ +  Code Editor: Cursor Left              left                                                                          +  Code Editor: Cursor Right             right                                                                         +  Code Editor: Cursor Word Left         ctrl+left                                                                     + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  ⏎ Edit  @@ -246,200 +245,199 @@ font-weight: 700; } - .terminal-4240007273-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4240007273-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4240007273-r1 { fill: #dfdfdf } - .terminal-4240007273-r2 { fill: #606060;font-style: italic; } - .terminal-4240007273-r3 { fill: #c5c8c6 } - .terminal-4240007273-r4 { fill: #606060;font-weight: bold } - .terminal-4240007273-r5 { fill: #6c6d4c } - .terminal-4240007273-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-4240007273-r7 { fill: #606060 } - .terminal-4240007273-r8 { fill: #feffac } - .terminal-4240007273-r9 { fill: #dfdfdf;font-weight: bold } - .terminal-4240007273-r10 { fill: #0a1411 } - .terminal-4240007273-r11 { fill: #8a8a8a;font-style: italic; } - .terminal-4240007273-r12 { fill: #8a8a8a;font-weight: bold } - .terminal-4240007273-r13 { fill: #8a8a8a } - .terminal-4240007273-r14 { fill: #121212 } - .terminal-4240007273-r15 { fill: #45ffca } - .terminal-4240007273-r16 { fill: #777777 } - .terminal-4240007273-r17 { fill: #ffb6d9 } - .terminal-4240007273-r18 { fill: #686868 } - .terminal-4240007273-r19 { fill: #ededed;font-weight: bold } - .terminal-4240007273-r20 { fill: #212116;font-weight: bold } - .terminal-4240007273-r21 { fill: #226d58;font-weight: bold } - .terminal-4240007273-r22 { fill: #226d58 } + .terminal-9999999-r1 { fill: #dfdfdf } + .terminal-9999999-r2 { fill: #606060;font-style: italic; } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #606060;font-weight: bold } + .terminal-9999999-r5 { fill: #6c6d4c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #606060 } + .terminal-9999999-r8 { fill: #feffac } + .terminal-9999999-r9 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r10 { fill: #0a1411 } + .terminal-9999999-r11 { fill: #8a8a8a;font-style: italic; } + .terminal-9999999-r12 { fill: #8a8a8a;font-weight: bold } + .terminal-9999999-r13 { fill: #8a8a8a } + .terminal-9999999-r14 { fill: #45ffca } + .terminal-9999999-r15 { fill: #777777 } + .terminal-9999999-r16 { fill: #ffb6d9 } + .terminal-9999999-r17 { fill: #686868 } + .terminal-9999999-r18 { fill: #ededed;font-weight: bold } + .terminal-9999999-r19 { fill: #212116;font-weight: bold } + .terminal-9999999-r20 { fill: #226d58;font-weight: bold } + .terminal-9999999-r21 { fill: #226d58 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - HarlequinKeys + HarlequinKeys - - - - The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them - to a keymap. - Loaded Keymaps: vscode - ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -  Action                                Keys                        Key Display  -  Quit                                  ctrl+q                                                                        -  Help                        ╭──────────────────────────────────────────────────────────╮ -  Focus Next                   -  Focus Previous              Action: Focus Query Editor -  Focus Query Editor           -  Focus Results Viewer        Use the buttons below to replace, remove, or  -  Focus Data Catalog          add bindings for this action. -  Toggle Sidebar              Enter: Select Button; Tab: Next Button▇▇ -  Toggle Full Screen           -  Show Query History           -  Show Data Exporter          ╭──────────────────╮╭───╮ -  Refresh Catalog                      Key:   f3  X  -  Run Query                   ╰──────────────────╯╰───╯ -  Cancel Query                ╭──────────────────╮ -  Code Editor: New Buffer      Add Key  -  Code Editor: Close Buffer   ╰──────────────────╯ -  Code Editor: Next Buffer    ╭────────────────────────────────╮ -  Code Editor: Run Query       Key Display:  (Optional) -  Code Editor: Format Buffer  ╰────────────────────────────────╯ -  Code Editor: Save Buffer     -  Code Editor: Load Buffer     -  Code Editor: Find            Cancel  Submit  -  Code Editor: Find Next       -  Code Editor: Goto Line       -  Code Editor: Cursor Up      ╰──────────────────────────────────────────────────────────╯ -  Code Editor: Cursor Down              down                                                                          -  Code Editor: Cursor Left              left                                                                          -  Code Editor: Cursor Right             right                                                                         -  Code Editor: Cursor Word Left         ctrl+left                                                                     - ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  ⏎ Edit  + + + + The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them + to a keymap. + Loaded Keymaps: vscode + ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +  Action                                Keys                        Key Display  +  Quit                                  ctrl+q                                                                        +  Help                        ╭──────────────────────────────────────────────────────────╮ +  Focus Next                   +  Focus Previous              Action: Focus Query Editor +  Focus Query Editor           +  Focus Results Viewer        Use the buttons below to replace, remove, or  +  Focus Data Catalog          add bindings for this action. +  Toggle Sidebar              Enter: Select Button; Tab: Next Button +  Toggle Full Screen           +  Show Query History           +  Show Data Exporter          ╭──────────────────╮╭───╮ +  Refresh Catalog                      Key:   f3  X  +  Run Query                   ╰──────────────────╯╰───╯ +  Cancel Query                ╭──────────────────╮ +  Code Editor: New Buffer      Add Key  +  Code Editor: Close Buffer   ╰──────────────────╯ +  Code Editor: Next Buffer    ╭────────────────────────────────╮ +  Code Editor: Run Query       Key Display:  (Optional) +  Code Editor: Format Buffer  ╰────────────────────────────────╯ +  Code Editor: Save Buffer     +  Code Editor: Load Buffer     +  Code Editor: Find            Cancel  Submit  +  Code Editor: Find Next       +  Code Editor: Goto Line       +  Code Editor: Cursor Up      ╰──────────────────────────────────────────────────────────╯ +  Code Editor: Cursor Down              down                                                                          +  Code Editor: Cursor Left              left                                                                          +  Code Editor: Cursor Right             right                                                                         +  Code Editor: Cursor Word Left         ctrl+left                                                                     + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  ⏎ Edit  @@ -469,200 +467,199 @@ font-weight: 700; } - .terminal-4274610281-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4274610281-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4274610281-r1 { fill: #dfdfdf } - .terminal-4274610281-r2 { fill: #606060;font-style: italic; } - .terminal-4274610281-r3 { fill: #c5c8c6 } - .terminal-4274610281-r4 { fill: #606060;font-weight: bold } - .terminal-4274610281-r5 { fill: #6c6d4c } - .terminal-4274610281-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-4274610281-r7 { fill: #606060 } - .terminal-4274610281-r8 { fill: #feffac } - .terminal-4274610281-r9 { fill: #dfdfdf;font-weight: bold } - .terminal-4274610281-r10 { fill: #0a1411 } - .terminal-4274610281-r11 { fill: #8a8a8a;font-style: italic; } - .terminal-4274610281-r12 { fill: #8a8a8a;font-weight: bold } - .terminal-4274610281-r13 { fill: #8a8a8a } - .terminal-4274610281-r14 { fill: #121212 } - .terminal-4274610281-r15 { fill: #777777 } - .terminal-4274610281-r16 { fill: #45ffca } - .terminal-4274610281-r17 { fill: #ffb6d9;font-weight: bold } - .terminal-4274610281-r18 { fill: #686868 } - .terminal-4274610281-r19 { fill: #ededed;font-weight: bold } - .terminal-4274610281-r20 { fill: #212116;font-weight: bold } - .terminal-4274610281-r21 { fill: #226d58;font-weight: bold } - .terminal-4274610281-r22 { fill: #226d58 } + .terminal-9999999-r1 { fill: #dfdfdf } + .terminal-9999999-r2 { fill: #606060;font-style: italic; } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #606060;font-weight: bold } + .terminal-9999999-r5 { fill: #6c6d4c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #606060 } + .terminal-9999999-r8 { fill: #feffac } + .terminal-9999999-r9 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r10 { fill: #0a1411 } + .terminal-9999999-r11 { fill: #8a8a8a;font-style: italic; } + .terminal-9999999-r12 { fill: #8a8a8a;font-weight: bold } + .terminal-9999999-r13 { fill: #8a8a8a } + .terminal-9999999-r14 { fill: #777777 } + .terminal-9999999-r15 { fill: #45ffca } + .terminal-9999999-r16 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r17 { fill: #686868 } + .terminal-9999999-r18 { fill: #ededed;font-weight: bold } + .terminal-9999999-r19 { fill: #212116;font-weight: bold } + .terminal-9999999-r20 { fill: #226d58;font-weight: bold } + .terminal-9999999-r21 { fill: #226d58 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - HarlequinKeys + HarlequinKeys - - - - The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them - to a keymap. - Loaded Keymaps: vscode - ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -  Action                                Keys                        Key Display  -  Quit                                  ctrl+q                                                                        -  Help                        ╭──────────────────────────────────────────────────────────╮ -  Focus Next                   -  Focus Previous              Action: Focus Query Editor -  Focus Query Editor           -  Focus Results Viewer        Use the buttons below to replace, remove, or  -  Focus Data Catalog          add bindings for this action. -  Toggle Sidebar              Enter: Select Button; Tab: Next Button▇▇ -  Toggle Full Screen           -  Show Query History           -  Show Data Exporter          ╭──────────────────╮╭───╮ -  Refresh Catalog                      Key:   f3  X  -  Run Query                   ╰──────────────────╯╰───╯ -  Cancel Query                ╭──────────────────╮ -  Code Editor: New Buffer      Add Key  -  Code Editor: Close Buffer   ╰──────────────────╯ -  Code Editor: Next Buffer    ╭────────────────────────────────╮ -  Code Editor: Run Query       Key Display:  (Optional) -  Code Editor: Format Buffer  ╰────────────────────────────────╯ -  Code Editor: Save Buffer     -  Code Editor: Load Buffer     -  Code Editor: Find            Cancel  Submit  -  Code Editor: Find Next       -  Code Editor: Goto Line       -  Code Editor: Cursor Up      ╰──────────────────────────────────────────────────────────╯ -  Code Editor: Cursor Down              down                                                                          -  Code Editor: Cursor Left              left                                                                          -  Code Editor: Cursor Right             right                                                                         -  Code Editor: Cursor Word Left         ctrl+left                                                                     - ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  ⏎ Edit  + + + + The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them + to a keymap. + Loaded Keymaps: vscode + ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +  Action                                Keys                        Key Display  +  Quit                                  ctrl+q                                                                        +  Help                        ╭──────────────────────────────────────────────────────────╮ +  Focus Next                   +  Focus Previous              Action: Focus Query Editor +  Focus Query Editor           +  Focus Results Viewer        Use the buttons below to replace, remove, or  +  Focus Data Catalog          add bindings for this action. +  Toggle Sidebar              Enter: Select Button; Tab: Next Button +  Toggle Full Screen           +  Show Query History           +  Show Data Exporter          ╭──────────────────╮╭───╮ +  Refresh Catalog                      Key:   f3  X  +  Run Query                   ╰──────────────────╯╰───╯ +  Cancel Query                ╭──────────────────╮ +  Code Editor: New Buffer      Add Key  +  Code Editor: Close Buffer   ╰──────────────────╯ +  Code Editor: Next Buffer    ╭────────────────────────────────╮ +  Code Editor: Run Query       Key Display:  (Optional) +  Code Editor: Format Buffer  ╰────────────────────────────────╯ +  Code Editor: Save Buffer     +  Code Editor: Load Buffer     +  Code Editor: Find            Cancel  Submit  +  Code Editor: Find Next       +  Code Editor: Goto Line       +  Code Editor: Cursor Up      ╰──────────────────────────────────────────────────────────╯ +  Code Editor: Cursor Down              down                                                                          +  Code Editor: Cursor Left              left                                                                          +  Code Editor: Cursor Right             right                                                                         +  Code Editor: Cursor Word Left         ctrl+left                                                                     + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  ⏎ Edit  @@ -692,200 +689,199 @@ font-weight: 700; } - .terminal-1368219752-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1368219752-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1368219752-r1 { fill: #dfdfdf } - .terminal-1368219752-r2 { fill: #606060;font-style: italic; } - .terminal-1368219752-r3 { fill: #c5c8c6 } - .terminal-1368219752-r4 { fill: #606060;font-weight: bold } - .terminal-1368219752-r5 { fill: #6c6d4c } - .terminal-1368219752-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-1368219752-r7 { fill: #606060 } - .terminal-1368219752-r8 { fill: #feffac } - .terminal-1368219752-r9 { fill: #dfdfdf;font-weight: bold } - .terminal-1368219752-r10 { fill: #0a1411 } - .terminal-1368219752-r11 { fill: #8a8a8a;font-style: italic; } - .terminal-1368219752-r12 { fill: #8a8a8a;font-weight: bold } - .terminal-1368219752-r13 { fill: #8a8a8a } - .terminal-1368219752-r14 { fill: #121212 } - .terminal-1368219752-r15 { fill: #45ffca } - .terminal-1368219752-r16 { fill: #777777 } - .terminal-1368219752-r17 { fill: #ffb6d9 } - .terminal-1368219752-r18 { fill: #686868 } - .terminal-1368219752-r19 { fill: #ededed;font-weight: bold } - .terminal-1368219752-r20 { fill: #212116;font-weight: bold } - .terminal-1368219752-r21 { fill: #226d58;font-weight: bold } - .terminal-1368219752-r22 { fill: #226d58 } + .terminal-9999999-r1 { fill: #dfdfdf } + .terminal-9999999-r2 { fill: #606060;font-style: italic; } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #606060;font-weight: bold } + .terminal-9999999-r5 { fill: #6c6d4c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #606060 } + .terminal-9999999-r8 { fill: #feffac } + .terminal-9999999-r9 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r10 { fill: #0a1411 } + .terminal-9999999-r11 { fill: #8a8a8a;font-style: italic; } + .terminal-9999999-r12 { fill: #8a8a8a;font-weight: bold } + .terminal-9999999-r13 { fill: #8a8a8a } + .terminal-9999999-r14 { fill: #45ffca } + .terminal-9999999-r15 { fill: #777777 } + .terminal-9999999-r16 { fill: #ffb6d9 } + .terminal-9999999-r17 { fill: #686868 } + .terminal-9999999-r18 { fill: #ededed;font-weight: bold } + .terminal-9999999-r19 { fill: #212116;font-weight: bold } + .terminal-9999999-r20 { fill: #226d58;font-weight: bold } + .terminal-9999999-r21 { fill: #226d58 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - HarlequinKeys + HarlequinKeys - - - - The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them - to a keymap. - Loaded Keymaps: vscode - ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -  Action                                Keys                        Key Display  -  Quit                                  ctrl+q                                                                        -  Help                        ╭──────────────────────────────────────────────────────────╮ -  Focus Next                   -  Focus Previous              Action: Focus Query Editor -  Focus Query Editor           -  Focus Results Viewer        Use the buttons below to replace, remove, or  -  Focus Data Catalog          add bindings for this action. -  Toggle Sidebar              Enter: Select Button; Tab: Next Button▇▇ -  Toggle Full Screen           -  Show Query History           -  Show Data Exporter          ╭──────────────────╮╭───╮ -  Refresh Catalog                      Key:   f2  X  -  Run Query                   ╰──────────────────╯╰───╯ -  Cancel Query                ╭──────────────────╮ -  Code Editor: New Buffer      Add Key  -  Code Editor: Close Buffer   ╰──────────────────╯ -  Code Editor: Next Buffer    ╭────────────────────────────────╮ -  Code Editor: Run Query       Key Display:  (Optional) -  Code Editor: Format Buffer  ╰────────────────────────────────╯ -  Code Editor: Save Buffer     -  Code Editor: Load Buffer     -  Code Editor: Find            Cancel  Submit  -  Code Editor: Find Next       -  Code Editor: Goto Line       -  Code Editor: Cursor Up      ╰──────────────────────────────────────────────────────────╯ -  Code Editor: Cursor Down              down                                                                          -  Code Editor: Cursor Left              left                                                                          -  Code Editor: Cursor Right             right                                                                         -  Code Editor: Cursor Word Left         ctrl+left                                                                     - ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  ⏎ Edit  + + + + The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them + to a keymap. + Loaded Keymaps: vscode + ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +  Action                                Keys                        Key Display  +  Quit                                  ctrl+q                                                                        +  Help                        ╭──────────────────────────────────────────────────────────╮ +  Focus Next                   +  Focus Previous              Action: Focus Query Editor +  Focus Query Editor           +  Focus Results Viewer        Use the buttons below to replace, remove, or  +  Focus Data Catalog          add bindings for this action. +  Toggle Sidebar              Enter: Select Button; Tab: Next Button +  Toggle Full Screen           +  Show Query History           +  Show Data Exporter          ╭──────────────────╮╭───╮ +  Refresh Catalog                      Key:   f2  X  +  Run Query                   ╰──────────────────╯╰───╯ +  Cancel Query                ╭──────────────────╮ +  Code Editor: New Buffer      Add Key  +  Code Editor: Close Buffer   ╰──────────────────╯ +  Code Editor: Next Buffer    ╭────────────────────────────────╮ +  Code Editor: Run Query       Key Display:  (Optional) +  Code Editor: Format Buffer  ╰────────────────────────────────╯ +  Code Editor: Save Buffer     +  Code Editor: Load Buffer     +  Code Editor: Find            Cancel  Submit  +  Code Editor: Find Next       +  Code Editor: Goto Line       +  Code Editor: Cursor Up      ╰──────────────────────────────────────────────────────────╯ +  Code Editor: Cursor Down              down                                                                          +  Code Editor: Cursor Left              left                                                                          +  Code Editor: Cursor Right             right                                                                         +  Code Editor: Cursor Word Left         ctrl+left                                                                     + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  ⏎ Edit  @@ -915,200 +911,199 @@ font-weight: 700; } - .terminal-527851385-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-527851385-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-527851385-r1 { fill: #606060 } - .terminal-527851385-r2 { fill: #2d2d2d;font-style: italic; } - .terminal-527851385-r3 { fill: #c5c8c6 } - .terminal-527851385-r4 { fill: #2d2d2d;font-weight: bold } - .terminal-527851385-r5 { fill: #323225 } - .terminal-527851385-r6 { fill: #323225;font-weight: bold } - .terminal-527851385-r7 { fill: #2d2d2d } - .terminal-527851385-r8 { fill: #6c6d4c } - .terminal-527851385-r9 { fill: #dfdfdf } - .terminal-527851385-r10 { fill: #606060;font-weight: bold } - .terminal-527851385-r11 { fill: #0b0f0e } - .terminal-527851385-r12 { fill: #3e3e3e;font-style: italic; } - .terminal-527851385-r13 { fill: #3e3e3e;font-weight: bold } - .terminal-527851385-r14 { fill: #3e3e3e } - .terminal-527851385-r15 { fill: #0e0e0e } - .terminal-527851385-r16 { fill: #feffac } - .terminal-527851385-r17 { fill: #363636 } - .terminal-527851385-r18 { fill: #303030 } - .terminal-527851385-r19 { fill: #666666;font-weight: bold } - .terminal-527851385-r20 { fill: #141410;font-weight: bold } - .terminal-527851385-r21 { fill: #14322a;font-weight: bold } - .terminal-527851385-r22 { fill: #14322a } + .terminal-9999999-r1 { fill: #606060 } + .terminal-9999999-r2 { fill: #2d2d2d;font-style: italic; } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #2d2d2d;font-weight: bold } + .terminal-9999999-r5 { fill: #323225 } + .terminal-9999999-r6 { fill: #323225;font-weight: bold } + .terminal-9999999-r7 { fill: #2d2d2d } + .terminal-9999999-r8 { fill: #6c6d4c } + .terminal-9999999-r9 { fill: #dfdfdf } + .terminal-9999999-r10 { fill: #606060;font-weight: bold } + .terminal-9999999-r11 { fill: #0b0f0e } + .terminal-9999999-r12 { fill: #3e3e3e;font-style: italic; } + .terminal-9999999-r13 { fill: #3e3e3e;font-weight: bold } + .terminal-9999999-r14 { fill: #3e3e3e } + .terminal-9999999-r15 { fill: #feffac } + .terminal-9999999-r16 { fill: #363636 } + .terminal-9999999-r17 { fill: #303030 } + .terminal-9999999-r18 { fill: #666666;font-weight: bold } + .terminal-9999999-r19 { fill: #141410;font-weight: bold } + .terminal-9999999-r20 { fill: #14322a;font-weight: bold } + .terminal-9999999-r21 { fill: #14322a } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - HarlequinKeys + HarlequinKeys - - - - The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them - to a keymap. - Loaded Keymaps: vscode - ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -  Action                                Keys                        Key Display  -  Quit                                  ctrl+q                                                                        -  Help                        ╭──────────────────────────────────────────────────────────╮ -  Focus Next                   -  Focus Previous              Action: Focus Query Editor -  Focus Query Editor           -  Focus Results Viewer        Use the buttons below to replace, remove, or  -  Focus Data Catalog          add bindings for this action. -  Toggle Sidebar              Enter: Select Button; Tab: Next Button▇▇ -  Toggle Full Screen           -  Show Query History          ╭──────────────────────────────────────────────╮ -  Show Data Exporter           -  Refresh Catalog              -  Run Query                            Press a key combination           -  Cancel Query                 -  Code Editor: New Buffer      -  Code Editor: Close Buffer   ╰──────────────────────────────────────────────╯ -  Code Editor: Next Buffer    ╭────────────────────────────────╮ -  Code Editor: Run Query       Key Display:  (Optional) -  Code Editor: Format Buffer  ╰────────────────────────────────╯ -  Code Editor: Save Buffer     -  Code Editor: Load Buffer     -  Code Editor: Find            Cancel  Submit  -  Code Editor: Find Next       -  Code Editor: Goto Line       -  Code Editor: Cursor Up      ╰──────────────────────────────────────────────────────────╯ -  Code Editor: Cursor Down              down                                                                          -  Code Editor: Cursor Left              left                                                                          -  Code Editor: Cursor Right             right                                                                         -  Code Editor: Cursor Word Left         ctrl+left                                                                     - ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  ⏎ Edit  + + + + The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them + to a keymap. + Loaded Keymaps: vscode + ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +  Action                                Keys                        Key Display  +  Quit                                  ctrl+q                                                                        +  Help                        ╭──────────────────────────────────────────────────────────╮ +  Focus Next                   +  Focus Previous              Action: Focus Query Editor +  Focus Query Editor           +  Focus Results Viewer        Use the buttons below to replace, remove, or  +  Focus Data Catalog          add bindings for this action. +  Toggle Sidebar              Enter: Select Button; Tab: Next Button +  Toggle Full Screen           +  Show Query History          ╭──────────────────────────────────────────────╮ +  Show Data Exporter           +  Refresh Catalog              +  Run Query                            Press a key combination           +  Cancel Query                 +  Code Editor: New Buffer      +  Code Editor: Close Buffer   ╰──────────────────────────────────────────────╯ +  Code Editor: Next Buffer    ╭────────────────────────────────╮ +  Code Editor: Run Query       Key Display:  (Optional) +  Code Editor: Format Buffer  ╰────────────────────────────────╯ +  Code Editor: Save Buffer     +  Code Editor: Load Buffer     +  Code Editor: Find            Cancel  Submit  +  Code Editor: Find Next       +  Code Editor: Goto Line       +  Code Editor: Cursor Up      ╰──────────────────────────────────────────────────────────╯ +  Code Editor: Cursor Down              down                                                                          +  Code Editor: Cursor Left              left                                                                          +  Code Editor: Cursor Right             right                                                                         +  Code Editor: Cursor Word Left         ctrl+left                                                                     + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  ⏎ Edit  @@ -1138,188 +1133,187 @@ font-weight: 700; } - .terminal-1093854887-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1093854887-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1093854887-r1 { fill: #c5c8c6 } - .terminal-1093854887-r2 { fill: #dfdfdf;font-style: italic; } - .terminal-1093854887-r3 { fill: #dfdfdf;font-weight: bold } - .terminal-1093854887-r4 { fill: #feffac } - .terminal-1093854887-r5 { fill: #feffac;font-weight: bold } - .terminal-1093854887-r6 { fill: #dfdfdf } - .terminal-1093854887-r7 { fill: #08211a } - .terminal-1093854887-r8 { fill: #1d1d1d } - .terminal-1093854887-r9 { fill: #45ffca;font-weight: bold } - .terminal-1093854887-r10 { fill: #45ffca } + .terminal-9999999-r1 { fill: #c5c8c6 } + .terminal-9999999-r2 { fill: #dfdfdf;font-style: italic; } + .terminal-9999999-r3 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r4 { fill: #feffac } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dfdfdf } + .terminal-9999999-r7 { fill: #08211a } + .terminal-9999999-r8 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r9 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - HarlequinKeys + HarlequinKeys - - - - The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them - to a keymap. - Loaded Keymaps: vscode - ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -  Action                                Keys                        Key Display  -  Quit                                  ctrl+q                      -  Help                                  f1                          -  Focus Next                            tab                         -  Focus Previous                        shift+tab                   -  Focus Query Editor                    f2                          -  Focus Results Viewer                  f5                          -  Focus Data Catalog                    f6                          -  Toggle Sidebar                        ctrl+b,f9                  ▇▇ -  Toggle Full Screen                    f10                         -  Show Query History                    f8                          -  Show Data Exporter                    ctrl+e                      -  Refresh Catalog                       ctrl+r                      -  Run Query                             -  Cancel Query                          -  Code Editor: New Buffer               ctrl+n                      -  Code Editor: Close Buffer             ctrl+w                      -  Code Editor: Next Buffer              ctrl+k                      -  Code Editor: Run Query                ctrl+enter,ctrl+j           ^⏎ or ^j     -  Code Editor: Format Buffer            f4                          -  Code Editor: Save Buffer              ctrl+s                      -  Code Editor: Load Buffer              ctrl+o                      -  Code Editor: Find                     ctrl+f                      -  Code Editor: Find Next                f3                          -  Code Editor: Goto Line                ctrl+g                      -  Code Editor: Cursor Up                up                          -  Code Editor: Cursor Down              down                        -  Code Editor: Cursor Left              left                        -  Code Editor: Cursor Right             right                       -  Code Editor: Cursor Word Left         ctrl+left                   - ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  ⏎ Edit  + + + + The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them + to a keymap. + Loaded Keymaps: vscode + ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +  Action                                Keys                        Key Display  +  Quit                                  ctrl+q                      +  Help                                  f1                          +  Focus Next                            tab                         +  Focus Previous                        shift+tab                   +  Focus Query Editor                    f2                          +  Focus Results Viewer                  f5                          +  Focus Data Catalog                    f6                          +  Toggle Sidebar                        ctrl+b,f9                   +  Toggle Full Screen                    f10                         +  Show Query History                    f8                          +  Show Data Exporter                    ctrl+e                      +  Refresh Catalog                       ctrl+r                      +  Run Query                             +  Cancel Query                          +  Code Editor: New Buffer               ctrl+n                      +  Code Editor: Close Buffer             ctrl+w                      +  Code Editor: Next Buffer              ctrl+k                      +  Code Editor: Run Query                ctrl+enter,ctrl+j           ^⏎ or ^j     +  Code Editor: Format Buffer            f4                          +  Code Editor: Save Buffer              ctrl+s                      +  Code Editor: Load Buffer              ctrl+o                      +  Code Editor: Find                     ctrl+f                      +  Code Editor: Find Next                f3                          +  Code Editor: Goto Line                ctrl+g                      +  Code Editor: Cursor Up                up                          +  Code Editor: Cursor Down              down                        +  Code Editor: Cursor Left              left                        +  Code Editor: Cursor Right             right                       +  Code Editor: Cursor Word Left         ctrl+left                   + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  ⏎ Edit  @@ -1349,188 +1343,187 @@ font-weight: 700; } - .terminal-3270960808-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3270960808-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3270960808-r1 { fill: #c5c8c6 } - .terminal-3270960808-r2 { fill: #dfdfdf;font-style: italic; } - .terminal-3270960808-r3 { fill: #dfdfdf;font-weight: bold } - .terminal-3270960808-r4 { fill: #feffac } - .terminal-3270960808-r5 { fill: #feffac;font-weight: bold } - .terminal-3270960808-r6 { fill: #dfdfdf } - .terminal-3270960808-r7 { fill: #08211a } - .terminal-3270960808-r8 { fill: #1d1d1d } - .terminal-3270960808-r9 { fill: #45ffca;font-weight: bold } - .terminal-3270960808-r10 { fill: #45ffca } + .terminal-9999999-r1 { fill: #c5c8c6 } + .terminal-9999999-r2 { fill: #dfdfdf;font-style: italic; } + .terminal-9999999-r3 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r4 { fill: #feffac } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dfdfdf } + .terminal-9999999-r7 { fill: #08211a } + .terminal-9999999-r8 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r9 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - HarlequinKeys + HarlequinKeys - - - - The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them - to a keymap. - Loaded Keymaps: vscode - ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -  Action                                Keys                        Key Display  -  Quit                                  ctrl+q                      -  Help                                  f1                          -  Focus Next                            tab                         -  Focus Previous                        shift+tab                   -  Focus Query Editor                    f3                          -  Focus Results Viewer                  f5                          -  Focus Data Catalog                    f6                          -  Toggle Sidebar                        ctrl+b,f9                  ▇▇ -  Toggle Full Screen                    f10                         -  Show Query History                    f8                          -  Show Data Exporter                    ctrl+e                      -  Refresh Catalog                       ctrl+r                      -  Run Query                             -  Cancel Query                          -  Code Editor: New Buffer               ctrl+n                      -  Code Editor: Close Buffer             ctrl+w                      -  Code Editor: Next Buffer              ctrl+k                      -  Code Editor: Run Query                ctrl+enter,ctrl+j           ^⏎ or ^j     -  Code Editor: Format Buffer            f4                          -  Code Editor: Save Buffer              ctrl+s                      -  Code Editor: Load Buffer              ctrl+o                      -  Code Editor: Find                     ctrl+f                      -  Code Editor: Find Next                f3                          -  Code Editor: Goto Line                ctrl+g                      -  Code Editor: Cursor Up                up                          -  Code Editor: Cursor Down              down                        -  Code Editor: Cursor Left              left                        -  Code Editor: Cursor Right             right                       -  Code Editor: Cursor Word Left         ctrl+left                   - ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  ⏎ Edit  + + + + The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them + to a keymap. + Loaded Keymaps: vscode + ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +  Action                                Keys                        Key Display  +  Quit                                  ctrl+q                      +  Help                                  f1                          +  Focus Next                            tab                         +  Focus Previous                        shift+tab                   +  Focus Query Editor                    f3                          +  Focus Results Viewer                  f5                          +  Focus Data Catalog                    f6                          +  Toggle Sidebar                        ctrl+b,f9                   +  Toggle Full Screen                    f10                         +  Show Query History                    f8                          +  Show Data Exporter                    ctrl+e                      +  Refresh Catalog                       ctrl+r                      +  Run Query                             +  Cancel Query                          +  Code Editor: New Buffer               ctrl+n                      +  Code Editor: Close Buffer             ctrl+w                      +  Code Editor: Next Buffer              ctrl+k                      +  Code Editor: Run Query                ctrl+enter,ctrl+j           ^⏎ or ^j     +  Code Editor: Format Buffer            f4                          +  Code Editor: Save Buffer              ctrl+s                      +  Code Editor: Load Buffer              ctrl+o                      +  Code Editor: Find                     ctrl+f                      +  Code Editor: Find Next                f3                          +  Code Editor: Goto Line                ctrl+g                      +  Code Editor: Cursor Up                up                          +  Code Editor: Cursor Down              down                        +  Code Editor: Cursor Left              left                        +  Code Editor: Cursor Right             right                       +  Code Editor: Cursor Word Left         ctrl+left                   + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  ⏎ Edit  @@ -1560,197 +1553,196 @@ font-weight: 700; } - .terminal-2225497621-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2225497621-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2225497621-r1 { fill: #dfdfdf } - .terminal-2225497621-r2 { fill: #606060;font-style: italic; } - .terminal-2225497621-r3 { fill: #c5c8c6 } - .terminal-2225497621-r4 { fill: #606060;font-weight: bold } - .terminal-2225497621-r5 { fill: #6c6d4c } - .terminal-2225497621-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-2225497621-r7 { fill: #606060 } - .terminal-2225497621-r8 { fill: #feffac } - .terminal-2225497621-r9 { fill: #0a1411 } - .terminal-2225497621-r10 { fill: #777777 } - .terminal-2225497621-r11 { fill: #121212 } - .terminal-2225497621-r12 { fill: #45ffca } - .terminal-2225497621-r13 { fill: #0c0c0c } - .terminal-2225497621-r14 { fill: #686868 } - .terminal-2225497621-r15 { fill: #ededed;font-weight: bold } - .terminal-2225497621-r16 { fill: #21171c;font-weight: bold } - .terminal-2225497621-r17 { fill: #212116;font-weight: bold } - .terminal-2225497621-r18 { fill: #226d58;font-weight: bold } - .terminal-2225497621-r19 { fill: #226d58 } + .terminal-9999999-r1 { fill: #dfdfdf } + .terminal-9999999-r2 { fill: #606060;font-style: italic; } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #606060;font-weight: bold } + .terminal-9999999-r5 { fill: #6c6d4c } + .terminal-9999999-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-9999999-r7 { fill: #606060 } + .terminal-9999999-r8 { fill: #feffac } + .terminal-9999999-r9 { fill: #0a1411 } + .terminal-9999999-r10 { fill: #777777 } + .terminal-9999999-r11 { fill: #45ffca } + .terminal-9999999-r12 { fill: #0c0c0c } + .terminal-9999999-r13 { fill: #686868 } + .terminal-9999999-r14 { fill: #ededed;font-weight: bold } + .terminal-9999999-r15 { fill: #21171c;font-weight: bold } + .terminal-9999999-r16 { fill: #212116;font-weight: bold } + .terminal-9999999-r17 { fill: #226d58;font-weight: bold } + .terminal-9999999-r18 { fill: #226d58 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - HarlequinKeys + HarlequinKeys - - - - The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them - to a keymap. - Loaded Keymaps: vscode - ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -  Action                                Keys                        Key Display  -  Quit                                  ctrl+q                                                                        -  Help                                  f1                                                                            -  Focus Next                            tab                                                                           -  Focus Previous╭──────────────────────────────────────────────────────────────────────────────────────╮ -  Focus Query Ed -  Focus Results  -  Focus Data Cat╭────────────────────────────────────────────────────────────╮ -  Toggle Sidebar Config Path:  /tmp/harlequin/config.toml                              ▇▇ -  Toggle Full Sc╰────────────────────────────────────────────────────────────╯ -  Show Query His -  Show Data Expo -  Refresh Catalo╭────────────────────────────────────────────────────────────╮ -  Run Query      Keymap Name:  Enter a name for this keymap -  Cancel Query  ╰────────────────────────────────────────────────────────────╯ -  Code Editor: N -  Code Editor: C -  Code Editor: N -  Code Editor: R -  Code Editor: F Keep Editing  Discard + Quit  Save + Quit  -  Code Editor: S -  Code Editor: L -  Code Editor: F -  Code Editor: F╰──────────────────────────────────────────────────────────────────────────────────────╯ -  Code Editor: Goto Line                ctrl+g                                                                        -  Code Editor: Cursor Up                up                                                                            -  Code Editor: Cursor Down              down                                                                          -  Code Editor: Cursor Left              left                                                                          -  Code Editor: Cursor Right             right                                                                         -  Code Editor: Cursor Word Left         ctrl+left                                                                     - ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  ⏎ Edit  + + + + The table below shows the active key bindings loaded from your config. Edit the key bindings, then quit to save them + to a keymap. + Loaded Keymaps: vscode + ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +  Action                                Keys                        Key Display  +  Quit                                  ctrl+q                                                                        +  Help                                  f1                                                                            +  Focus Next                            tab                                                                           +  Focus Previous╭──────────────────────────────────────────────────────────────────────────────────────╮ +  Focus Query Ed +  Focus Results  +  Focus Data Cat╭────────────────────────────────────────────────────────────╮ +  Toggle Sidebar Config Path:  /tmp/harlequin/config.toml                               +  Toggle Full Sc╰────────────────────────────────────────────────────────────╯ +  Show Query His +  Show Data Expo +  Refresh Catalo╭────────────────────────────────────────────────────────────╮ +  Run Query      Keymap Name:  Enter a name for this keymap +  Cancel Query  ╰────────────────────────────────────────────────────────────╯ +  Code Editor: N +  Code Editor: C +  Code Editor: N +  Code Editor: R +  Code Editor: F Keep Editing  Discard + Quit  Save + Quit  +  Code Editor: S +  Code Editor: L +  Code Editor: F +  Code Editor: F╰──────────────────────────────────────────────────────────────────────────────────────╯ +  Code Editor: Goto Line                ctrl+g                                                                        +  Code Editor: Cursor Up                up                                                                            +  Code Editor: Cursor Down              down                                                                          +  Code Editor: Cursor Left              left                                                                          +  Code Editor: Cursor Right             right                                                                         +  Code Editor: Cursor Word Left         ctrl+left                                                                     + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  ⏎ Edit  diff --git a/tests/functional_tests/__snapshots__/test_layout.ambr b/tests/functional_tests/__snapshots__/test_layout.ambr index bb8f8ac4..7d83c92e 100644 --- a/tests/functional_tests/__snapshots__/test_layout.ambr +++ b/tests/functional_tests/__snapshots__/test_layout.ambr @@ -22,139 +22,139 @@ font-weight: 700; } - .terminal-1885436802-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1885436802-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1885436802-r1 { fill: #feffac } - .terminal-1885436802-r2 { fill: #c5c8c6 } - .terminal-1885436802-r3 { fill: #858585 } - .terminal-1885436802-r4 { fill: #181818 } - .terminal-1885436802-r5 { fill: #dddddd } - .terminal-1885436802-r6 { fill: #dfdfdf } - .terminal-1885436802-r7 { fill: #777777 } - .terminal-1885436802-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-1885436802-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r1 { fill: #feffac } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #858585 } + .terminal-9999999-r4 { fill: #181818 } + .terminal-9999999-r5 { fill: #dddddd } + .terminal-9999999-r6 { fill: #dfdfdf } + .terminal-9999999-r7 { fill: #777777 } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Query Editor ───────────────────────────────────────────────────────────────╮ - 1   - - - - - - - - - - - - - - - - - - - - - ╰──────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  + + ╭─ Query Editor ───────────────────────────────────────────────────────────────╮ + 1   + + + + + + + + + + + + + + + + + + + + + ╰──────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  @@ -184,139 +184,139 @@ font-weight: 700; } - .terminal-3787778908-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3787778908-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3787778908-r1 { fill: #777777 } - .terminal-3787778908-r2 { fill: #feffac } - .terminal-3787778908-r3 { fill: #c5c8c6 } - .terminal-3787778908-r4 { fill: #dfdfdf } - .terminal-3787778908-r5 { fill: #858585 } - .terminal-3787778908-r6 { fill: #181818 } - .terminal-3787778908-r7 { fill: #dddddd } - .terminal-3787778908-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-3787778908-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #181818 } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db1   - - - - - - - - - - - - - - - - - - - - - ╰──────────────────────────────────────────────────────────╯ - ╰──────────────────╯X Limit 500         Run Query  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db1   + + + + + + + + + + + + + + + + + + + + + ╰──────────────────────────────────────────────────────────╯ + ╰──────────────────╯X Limit 500         Run Query  @@ -346,139 +346,139 @@ font-weight: 700; } - .terminal-1885436802-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1885436802-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1885436802-r1 { fill: #feffac } - .terminal-1885436802-r2 { fill: #c5c8c6 } - .terminal-1885436802-r3 { fill: #858585 } - .terminal-1885436802-r4 { fill: #181818 } - .terminal-1885436802-r5 { fill: #dddddd } - .terminal-1885436802-r6 { fill: #dfdfdf } - .terminal-1885436802-r7 { fill: #777777 } - .terminal-1885436802-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-1885436802-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r1 { fill: #feffac } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #858585 } + .terminal-9999999-r4 { fill: #181818 } + .terminal-9999999-r5 { fill: #dddddd } + .terminal-9999999-r6 { fill: #dfdfdf } + .terminal-9999999-r7 { fill: #777777 } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Query Editor ───────────────────────────────────────────────────────────────╮ - 1   - - - - - - - - - - - - - - - - - - - - - ╰──────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  + + ╭─ Query Editor ───────────────────────────────────────────────────────────────╮ + 1   + + + + + + + + + + + + + + + + + + + + + ╰──────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  @@ -508,140 +508,140 @@ font-weight: 700; } - .terminal-3789326413-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3789326413-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3789326413-r1 { fill: #777777 } - .terminal-3789326413-r2 { fill: #feffac } - .terminal-3789326413-r3 { fill: #c5c8c6 } - .terminal-3789326413-r4 { fill: #dfdfdf } - .terminal-3789326413-r5 { fill: #858585 } - .terminal-3789326413-r6 { fill: #181818 } - .terminal-3789326413-r7 { fill: #dddddd } - .terminal-3789326413-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-3789326413-r9 { fill: #212116;font-weight: bold } - .terminal-3789326413-r10 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #181818 } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db1   - - - - - - - - - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db1   + + + + + + + + + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -671,140 +671,140 @@ font-weight: 700; } - .terminal-2633981075-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2633981075-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2633981075-r1 { fill: #feffac } - .terminal-2633981075-r2 { fill: #c5c8c6 } - .terminal-2633981075-r3 { fill: #858585 } - .terminal-2633981075-r4 { fill: #181818 } - .terminal-2633981075-r5 { fill: #dddddd } - .terminal-2633981075-r6 { fill: #dfdfdf } - .terminal-2633981075-r7 { fill: #777777 } - .terminal-2633981075-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-2633981075-r9 { fill: #212116;font-weight: bold } - .terminal-2633981075-r10 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #feffac } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #858585 } + .terminal-9999999-r4 { fill: #181818 } + .terminal-9999999-r5 { fill: #dddddd } + .terminal-9999999-r6 { fill: #dfdfdf } + .terminal-9999999-r7 { fill: #777777 } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Query Editor ───────────────────────────────────────────────────────────────╮ - 1   - - - - - - - - - ╰──────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results ──────────────────────────────────────────────────────────────╮ - - - - - - - - - - ╰──────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Query Editor ───────────────────────────────────────────────────────────────╮ + 1   + + + + + + + + + ╰──────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results ──────────────────────────────────────────────────────────────╮ + + + + + + + + + + ╰──────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -834,144 +834,144 @@ font-weight: 700; } - .terminal-3528888178-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3528888178-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3528888178-r1 { fill: #777777 } - .terminal-3528888178-r2 { fill: #c5c8c6 } - .terminal-3528888178-r3 { fill: #dfdfdf } - .terminal-3528888178-r4 { fill: #858585 } - .terminal-3528888178-r5 { fill: #feffac;font-weight: bold } - .terminal-3528888178-r6 { fill: #dddddd } - .terminal-3528888178-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-3528888178-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-3528888178-r9 { fill: #212116;font-weight: bold } - .terminal-3528888178-r10 { fill: #feffac } - .terminal-3528888178-r11 { fill: #777777;font-weight: bold } - .terminal-3528888178-r12 { fill: #08211a } - .terminal-3528888178-r13 { fill: #45ffca;font-weight: bold } - .terminal-3528888178-r14 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #08211a } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db││1  select1 - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (1 Records) ──────────────────────────────╮ -  1 #                                                     │ -    1  - - - - - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db││1  select1 + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (1 Records) ──────────────────────────────╮ +  1 #                                                     │ +    1  + + + + + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -1001,140 +1001,140 @@ font-weight: 700; } - .terminal-3789326413-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3789326413-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3789326413-r1 { fill: #777777 } - .terminal-3789326413-r2 { fill: #feffac } - .terminal-3789326413-r3 { fill: #c5c8c6 } - .terminal-3789326413-r4 { fill: #dfdfdf } - .terminal-3789326413-r5 { fill: #858585 } - .terminal-3789326413-r6 { fill: #181818 } - .terminal-3789326413-r7 { fill: #dddddd } - .terminal-3789326413-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-3789326413-r9 { fill: #212116;font-weight: bold } - .terminal-3789326413-r10 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #181818 } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db1   - - - - - - - - - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db1   + + + + + + + + + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -1164,137 +1164,137 @@ font-weight: 700; } - .terminal-249506557-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-249506557-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-249506557-r1 { fill: #777777 } - .terminal-249506557-r2 { fill: #feffac } - .terminal-249506557-r3 { fill: #c5c8c6 } - .terminal-249506557-r4 { fill: #dfdfdf } - .terminal-249506557-r5 { fill: #feffac;font-weight: bold } - .terminal-249506557-r6 { fill: #777777;font-weight: bold } - .terminal-249506557-r7 { fill: #08211a } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #777777;font-weight: bold } + .terminal-9999999-r7 { fill: #08211a } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Results (1 Records) ──────────────────────────────╮ - ▶ memory db 1 #                                                     │ -    1  - - - - - - - - - - - - - - - - - - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ + + ╭─ Data Catalog ───╮╭─ Query Results (1 Records) ──────────────────────────────╮ + ▶ memory db 1 #                                                     │ +    1  + + + + + + + + + + + + + + + + + + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ @@ -1324,136 +1324,136 @@ font-weight: 700; } - .terminal-2265234196-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2265234196-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2265234196-r1 { fill: #feffac } - .terminal-2265234196-r2 { fill: #c5c8c6 } - .terminal-2265234196-r3 { fill: #feffac;font-weight: bold } - .terminal-2265234196-r4 { fill: #777777;font-weight: bold } - .terminal-2265234196-r5 { fill: #08211a } - .terminal-2265234196-r6 { fill: #dfdfdf } + .terminal-9999999-r1 { fill: #feffac } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #feffac;font-weight: bold } + .terminal-9999999-r4 { fill: #777777;font-weight: bold } + .terminal-9999999-r5 { fill: #08211a } + .terminal-9999999-r6 { fill: #dfdfdf } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Query Results (1 Records) ──────────────────────────────────────────────────╮ -  1 #                                                                         │ -    1  - - - - - - - - - - - - - - - - - - - - - ╰──────────────────────────────────────────────────────────────────────────────╯ + + ╭─ Query Results (1 Records) ──────────────────────────────────────────────────╮ +  1 #                                                                         │ +    1  + + + + + + + + + + + + + + + + + + + + + ╰──────────────────────────────────────────────────────────────────────────────╯ @@ -1483,140 +1483,140 @@ font-weight: 700; } - .terminal-2633981075-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2633981075-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2633981075-r1 { fill: #feffac } - .terminal-2633981075-r2 { fill: #c5c8c6 } - .terminal-2633981075-r3 { fill: #858585 } - .terminal-2633981075-r4 { fill: #181818 } - .terminal-2633981075-r5 { fill: #dddddd } - .terminal-2633981075-r6 { fill: #dfdfdf } - .terminal-2633981075-r7 { fill: #777777 } - .terminal-2633981075-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-2633981075-r9 { fill: #212116;font-weight: bold } - .terminal-2633981075-r10 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #feffac } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #858585 } + .terminal-9999999-r4 { fill: #181818 } + .terminal-9999999-r5 { fill: #dddddd } + .terminal-9999999-r6 { fill: #dfdfdf } + .terminal-9999999-r7 { fill: #777777 } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Query Editor ───────────────────────────────────────────────────────────────╮ - 1   - - - - - - - - - ╰──────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results ──────────────────────────────────────────────────────────────╮ - - - - - - - - - - ╰──────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Query Editor ───────────────────────────────────────────────────────────────╮ + 1   + + + + + + + + + ╰──────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results ──────────────────────────────────────────────────────────────╮ + + + + + + + + + + ╰──────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -1646,140 +1646,140 @@ font-weight: 700; } - .terminal-2633981075-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2633981075-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2633981075-r1 { fill: #feffac } - .terminal-2633981075-r2 { fill: #c5c8c6 } - .terminal-2633981075-r3 { fill: #858585 } - .terminal-2633981075-r4 { fill: #181818 } - .terminal-2633981075-r5 { fill: #dddddd } - .terminal-2633981075-r6 { fill: #dfdfdf } - .terminal-2633981075-r7 { fill: #777777 } - .terminal-2633981075-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-2633981075-r9 { fill: #212116;font-weight: bold } - .terminal-2633981075-r10 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #feffac } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #858585 } + .terminal-9999999-r4 { fill: #181818 } + .terminal-9999999-r5 { fill: #dddddd } + .terminal-9999999-r6 { fill: #dfdfdf } + .terminal-9999999-r7 { fill: #777777 } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Query Editor ───────────────────────────────────────────────────────────────╮ - 1   - - - - - - - - - ╰──────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results ──────────────────────────────────────────────────────────────╮ - - - - - - - - - - ╰──────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Query Editor ───────────────────────────────────────────────────────────────╮ + 1   + + + + + + + + + ╰──────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results ──────────────────────────────────────────────────────────────╮ + + + + + + + + + + ╰──────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -1809,140 +1809,140 @@ font-weight: 700; } - .terminal-2633981075-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2633981075-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2633981075-r1 { fill: #feffac } - .terminal-2633981075-r2 { fill: #c5c8c6 } - .terminal-2633981075-r3 { fill: #858585 } - .terminal-2633981075-r4 { fill: #181818 } - .terminal-2633981075-r5 { fill: #dddddd } - .terminal-2633981075-r6 { fill: #dfdfdf } - .terminal-2633981075-r7 { fill: #777777 } - .terminal-2633981075-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-2633981075-r9 { fill: #212116;font-weight: bold } - .terminal-2633981075-r10 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #feffac } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #858585 } + .terminal-9999999-r4 { fill: #181818 } + .terminal-9999999-r5 { fill: #dddddd } + .terminal-9999999-r6 { fill: #dfdfdf } + .terminal-9999999-r7 { fill: #777777 } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Query Editor ───────────────────────────────────────────────────────────────╮ - 1   - - - - - - - - - ╰──────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results ──────────────────────────────────────────────────────────────╮ - - - - - - - - - - ╰──────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Query Editor ───────────────────────────────────────────────────────────────╮ + 1   + + + + + + + + + ╰──────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results ──────────────────────────────────────────────────────────────╮ + + + + + + + + + + ╰──────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -1972,140 +1972,140 @@ font-weight: 700; } - .terminal-3789326413-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3789326413-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3789326413-r1 { fill: #777777 } - .terminal-3789326413-r2 { fill: #feffac } - .terminal-3789326413-r3 { fill: #c5c8c6 } - .terminal-3789326413-r4 { fill: #dfdfdf } - .terminal-3789326413-r5 { fill: #858585 } - .terminal-3789326413-r6 { fill: #181818 } - .terminal-3789326413-r7 { fill: #dddddd } - .terminal-3789326413-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-3789326413-r9 { fill: #212116;font-weight: bold } - .terminal-3789326413-r10 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #181818 } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db1   - - - - - - - - - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db1   + + + + + + + + + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -2135,140 +2135,140 @@ font-weight: 700; } - .terminal-3789326413-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3789326413-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3789326413-r1 { fill: #777777 } - .terminal-3789326413-r2 { fill: #feffac } - .terminal-3789326413-r3 { fill: #c5c8c6 } - .terminal-3789326413-r4 { fill: #dfdfdf } - .terminal-3789326413-r5 { fill: #858585 } - .terminal-3789326413-r6 { fill: #181818 } - .terminal-3789326413-r7 { fill: #dddddd } - .terminal-3789326413-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-3789326413-r9 { fill: #212116;font-weight: bold } - .terminal-3789326413-r10 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #181818 } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db1   - - - - - - - - - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db1   + + + + + + + + + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer diff --git a/tests/functional_tests/__snapshots__/test_query_editor.ambr b/tests/functional_tests/__snapshots__/test_query_editor.ambr index d86fbc07..605f2253 100644 --- a/tests/functional_tests/__snapshots__/test_query_editor.ambr +++ b/tests/functional_tests/__snapshots__/test_query_editor.ambr @@ -22,144 +22,144 @@ font-weight: 700; } - .terminal-3008006675-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3008006675-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3008006675-r1 { fill: #777777 } - .terminal-3008006675-r2 { fill: #feffac } - .terminal-3008006675-r3 { fill: #c5c8c6 } - .terminal-3008006675-r4 { fill: #dfdfdf } - .terminal-3008006675-r5 { fill: #858585 } - .terminal-3008006675-r6 { fill: #dddddd } - .terminal-3008006675-r7 { fill: #181818 } - .terminal-3008006675-r8 { fill: #08211a;font-weight: bold } - .terminal-3008006675-r9 { fill: #777777;font-weight: bold } - .terminal-3008006675-r10 { fill: #e3e3e3 } - .terminal-3008006675-r11 { fill: #1d1d1d } - .terminal-3008006675-r12 { fill: #0c0c0c;font-weight: bold } - .terminal-3008006675-r13 { fill: #212116;font-weight: bold } - .terminal-3008006675-r14 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #08211a;font-weight: bold } + .terminal-9999999-r9 { fill: #777777;font-weight: bold } + .terminal-9999999-r10 { fill: #e3e3e3 } + .terminal-9999999-r11 { fill: #1d1d1d } + .terminal-9999999-r12 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r13 { fill: #212116;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - - - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ small db1  "drivers". - "drivers".code s - "drivers".dob d - "drivers".driverId ## - "drivers".driverRef s - "drivers".forename s - "drivers".nationality s - "drivers".number s - "drivers".surname s▇▇ - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▼ small db1  "drivers". + ├─ empty sch"drivers".code s + └─ ▼ main sch"drivers".dob d +    └─ ▶ drivers "drivers".driverId ## + "drivers".driverRef s + "drivers".forename s + "drivers".nationality s + "drivers".number s + "drivers".surname s▇▇ + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -189,140 +189,140 @@ font-weight: 700; } - .terminal-3087847148-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3087847148-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3087847148-r1 { fill: #777777 } - .terminal-3087847148-r2 { fill: #feffac } - .terminal-3087847148-r3 { fill: #c5c8c6 } - .terminal-3087847148-r4 { fill: #dfdfdf } - .terminal-3087847148-r5 { fill: #858585 } - .terminal-3087847148-r6 { fill: #dddddd } - .terminal-3087847148-r7 { fill: #181818 } - .terminal-3087847148-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-3087847148-r9 { fill: #212116;font-weight: bold } - .terminal-3087847148-r10 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - - - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ small db1  "drivers"."code" - - - - - - - - - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▼ small db1  "drivers"."code" + ├─ empty sch + └─ ▼ main sch +    └─ ▶ drivers  + + + + + + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -352,144 +352,144 @@ font-weight: 700; } - .terminal-2228193831-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2228193831-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2228193831-r1 { fill: #777777 } - .terminal-2228193831-r2 { fill: #feffac } - .terminal-2228193831-r3 { fill: #c5c8c6 } - .terminal-2228193831-r4 { fill: #dfdfdf } - .terminal-2228193831-r5 { fill: #858585 } - .terminal-2228193831-r6 { fill: #dddddd } - .terminal-2228193831-r7 { fill: #181818 } - .terminal-2228193831-r8 { fill: #08211a;font-weight: bold } - .terminal-2228193831-r9 { fill: #777777;font-weight: bold } - .terminal-2228193831-r10 { fill: #e3e3e3 } - .terminal-2228193831-r11 { fill: #1d1d1d } - .terminal-2228193831-r12 { fill: #0c0c0c;font-weight: bold } - .terminal-2228193831-r13 { fill: #212116;font-weight: bold } - .terminal-2228193831-r14 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #08211a;font-weight: bold } + .terminal-9999999-r9 { fill: #777777;font-weight: bold } + .terminal-9999999-r10 { fill: #e3e3e3 } + .terminal-9999999-r11 { fill: #1d1d1d } + .terminal-9999999-r12 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r13 { fill: #212116;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - - - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ small db1  "drivers"."" - "drivers"."code s - "drivers"."dob d - "drivers"."driverId ## - "drivers"."driverRef s - "drivers"."forename s - "drivers"."nationality s - "drivers"."number s - "drivers"."surname s▇▇ - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▼ small db1  "drivers"."" + ├─ empty sch"drivers"."code s + └─ ▼ main sch"drivers"."dob d +    └─ ▶ drivers "drivers"."driverId ## + "drivers"."driverRef s + "drivers"."forename s + "drivers"."nationality s + "drivers"."number s + "drivers"."surname s▇▇ + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -519,188 +519,188 @@ font-weight: 700; } - .terminal-272243032-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-272243032-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-272243032-r1 { fill: #777777 } - .terminal-272243032-r2 { fill: #feffac } - .terminal-272243032-r3 { fill: #c5c8c6 } - .terminal-272243032-r4 { fill: #dfdfdf } - .terminal-272243032-r5 { fill: #858585 } - .terminal-272243032-r6 { fill: #181818 } - .terminal-272243032-r7 { fill: #dddddd } - .terminal-272243032-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-272243032-r9 { fill: #212116;font-weight: bold } - .terminal-272243032-r10 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #181818 } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db1  tab 1                                                                               - - - - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db1  tab 1                                                                               + + + + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -730,191 +730,191 @@ font-weight: 700; } - .terminal-1415915373-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1415915373-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1415915373-r1 { fill: #777777 } - .terminal-1415915373-r2 { fill: #feffac } - .terminal-1415915373-r3 { fill: #c5c8c6 } - .terminal-1415915373-r4 { fill: #dfdfdf } - .terminal-1415915373-r5 { fill: #dfdfdf;font-weight: bold } - .terminal-1415915373-r6 { fill: #686868 } - .terminal-1415915373-r7 { fill: #232323 } - .terminal-1415915373-r8 { fill: #858585 } - .terminal-1415915373-r9 { fill: #181818 } - .terminal-1415915373-r10 { fill: #dddddd } - .terminal-1415915373-r11 { fill: #0c0c0c;font-weight: bold } - .terminal-1415915373-r12 { fill: #212116;font-weight: bold } - .terminal-1415915373-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r6 { fill: #686868 } + .terminal-9999999-r7 { fill: #232323 } + .terminal-9999999-r8 { fill: #858585 } + .terminal-9999999-r9 { fill: #181818 } + .terminal-9999999-r10 { fill: #dddddd } + .terminal-9999999-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r12 { fill: #212116;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db - Tab 1Tab 2Tab 3 - ━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - 1  tab 1                                                                               - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db + Tab 1Tab 2Tab 3 + ━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 1  tab 1                                                                               + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -944,191 +944,191 @@ font-weight: 700; } - .terminal-206094009-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-206094009-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-206094009-r1 { fill: #777777 } - .terminal-206094009-r2 { fill: #feffac } - .terminal-206094009-r3 { fill: #c5c8c6 } - .terminal-206094009-r4 { fill: #dfdfdf } - .terminal-206094009-r5 { fill: #dfdfdf;font-weight: bold } - .terminal-206094009-r6 { fill: #686868 } - .terminal-206094009-r7 { fill: #232323 } - .terminal-206094009-r8 { fill: #858585 } - .terminal-206094009-r9 { fill: #181818 } - .terminal-206094009-r10 { fill: #dddddd } - .terminal-206094009-r11 { fill: #0c0c0c;font-weight: bold } - .terminal-206094009-r12 { fill: #212116;font-weight: bold } - .terminal-206094009-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r6 { fill: #686868 } + .terminal-9999999-r7 { fill: #232323 } + .terminal-9999999-r8 { fill: #858585 } + .terminal-9999999-r9 { fill: #181818 } + .terminal-9999999-r10 { fill: #dddddd } + .terminal-9999999-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r12 { fill: #212116;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db - Tab 1Tab 3 - ━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - 1  tab 1                                                                               - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db + Tab 1Tab 3 + ━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 1  tab 1                                                                               + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -1158,191 +1158,191 @@ font-weight: 700; } - .terminal-926269113-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-926269113-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-926269113-r1 { fill: #777777 } - .terminal-926269113-r2 { fill: #feffac } - .terminal-926269113-r3 { fill: #c5c8c6 } - .terminal-926269113-r4 { fill: #dfdfdf } - .terminal-926269113-r5 { fill: #686868 } - .terminal-926269113-r6 { fill: #dfdfdf;font-weight: bold } - .terminal-926269113-r7 { fill: #232323 } - .terminal-926269113-r8 { fill: #858585 } - .terminal-926269113-r9 { fill: #181818 } - .terminal-926269113-r10 { fill: #dddddd } - .terminal-926269113-r11 { fill: #0c0c0c;font-weight: bold } - .terminal-926269113-r12 { fill: #212116;font-weight: bold } - .terminal-926269113-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #686868 } + .terminal-9999999-r6 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r7 { fill: #232323 } + .terminal-9999999-r8 { fill: #858585 } + .terminal-9999999-r9 { fill: #181818 } + .terminal-9999999-r10 { fill: #dddddd } + .terminal-9999999-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r12 { fill: #212116;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db - Tab 1Tab 2 - ━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - 1  tab 2                                                                               - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db + Tab 1Tab 2 + ━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 1  tab 2                                                                               + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -1372,191 +1372,191 @@ font-weight: 700; } - .terminal-1342383982-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1342383982-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1342383982-r1 { fill: #777777 } - .terminal-1342383982-r2 { fill: #feffac } - .terminal-1342383982-r3 { fill: #c5c8c6 } - .terminal-1342383982-r4 { fill: #dfdfdf } - .terminal-1342383982-r5 { fill: #686868 } - .terminal-1342383982-r6 { fill: #dfdfdf;font-weight: bold } - .terminal-1342383982-r7 { fill: #232323 } - .terminal-1342383982-r8 { fill: #858585 } - .terminal-1342383982-r9 { fill: #181818 } - .terminal-1342383982-r10 { fill: #dddddd } - .terminal-1342383982-r11 { fill: #0c0c0c;font-weight: bold } - .terminal-1342383982-r12 { fill: #212116;font-weight: bold } - .terminal-1342383982-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #686868 } + .terminal-9999999-r6 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r7 { fill: #232323 } + .terminal-9999999-r8 { fill: #858585 } + .terminal-9999999-r9 { fill: #181818 } + .terminal-9999999-r10 { fill: #dddddd } + .terminal-9999999-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r12 { fill: #212116;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db - Tab 1Tab 2Tab 3 - ━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - 1  tab 2                                                                               - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db + Tab 1Tab 2Tab 3 + ━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 1  tab 2                                                                               + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -1586,191 +1586,191 @@ font-weight: 700; } - .terminal-1269573487-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1269573487-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1269573487-r1 { fill: #777777 } - .terminal-1269573487-r2 { fill: #feffac } - .terminal-1269573487-r3 { fill: #c5c8c6 } - .terminal-1269573487-r4 { fill: #dfdfdf } - .terminal-1269573487-r5 { fill: #686868 } - .terminal-1269573487-r6 { fill: #dfdfdf;font-weight: bold } - .terminal-1269573487-r7 { fill: #232323 } - .terminal-1269573487-r8 { fill: #858585 } - .terminal-1269573487-r9 { fill: #181818 } - .terminal-1269573487-r10 { fill: #dddddd } - .terminal-1269573487-r11 { fill: #0c0c0c;font-weight: bold } - .terminal-1269573487-r12 { fill: #212116;font-weight: bold } - .terminal-1269573487-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #686868 } + .terminal-9999999-r6 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r7 { fill: #232323 } + .terminal-9999999-r8 { fill: #858585 } + .terminal-9999999-r9 { fill: #181818 } + .terminal-9999999-r10 { fill: #dddddd } + .terminal-9999999-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r12 { fill: #212116;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db - Tab 1Tab 2Tab 3 - ━━━━━━━━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - 1  tab 3                                                                               - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db + Tab 1Tab 2Tab 3 + ━━━━━━━━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 1  tab 3                                                                               + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -1800,191 +1800,191 @@ font-weight: 700; } - .terminal-3323510459-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3323510459-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3323510459-r1 { fill: #777777 } - .terminal-3323510459-r2 { fill: #feffac } - .terminal-3323510459-r3 { fill: #c5c8c6 } - .terminal-3323510459-r4 { fill: #dfdfdf } - .terminal-3323510459-r5 { fill: #686868 } - .terminal-3323510459-r6 { fill: #dfdfdf;font-weight: bold } - .terminal-3323510459-r7 { fill: #232323 } - .terminal-3323510459-r8 { fill: #858585 } - .terminal-3323510459-r9 { fill: #181818 } - .terminal-3323510459-r10 { fill: #dddddd } - .terminal-3323510459-r11 { fill: #0c0c0c;font-weight: bold } - .terminal-3323510459-r12 { fill: #212116;font-weight: bold } - .terminal-3323510459-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #686868 } + .terminal-9999999-r6 { fill: #dfdfdf;font-weight: bold } + .terminal-9999999-r7 { fill: #232323 } + .terminal-9999999-r8 { fill: #858585 } + .terminal-9999999-r9 { fill: #181818 } + .terminal-9999999-r10 { fill: #dddddd } + .terminal-9999999-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r12 { fill: #212116;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ memory db - Tab 1Tab 3 - ━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - 1  tab 3                                                                               - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ memory db + Tab 1Tab 3 + ━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + 1  tab 3                                                                               + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -2014,143 +2014,143 @@ font-weight: 700; } - .terminal-347505482-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-347505482-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-347505482-r1 { fill: #777777 } - .terminal-347505482-r2 { fill: #feffac } - .terminal-347505482-r3 { fill: #c5c8c6 } - .terminal-347505482-r4 { fill: #dfdfdf } - .terminal-347505482-r5 { fill: #858585 } - .terminal-347505482-r6 { fill: #dddddd } - .terminal-347505482-r7 { fill: #181818 } - .terminal-347505482-r8 { fill: #08211a;font-weight: bold } - .terminal-347505482-r9 { fill: #777777;font-weight: bold } - .terminal-347505482-r10 { fill: #e3e3e3 } - .terminal-347505482-r11 { fill: #0c0c0c;font-weight: bold } - .terminal-347505482-r12 { fill: #212116;font-weight: bold } - .terminal-347505482-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #08211a;font-weight: bold } + .terminal-9999999-r9 { fill: #777777;font-weight: bold } + .terminal-9999999-r10 { fill: #e3e3e3 } + .terminal-9999999-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r12 { fill: #212116;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db1  s - schema kw - select kw - sequence kw - set kw - show kw - similar kw - some kw - summarize kw - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db1  s + schema kw + select kw + sequence kw + set kw + show kw + similar kw + some kw + summarize kw + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -2180,144 +2180,144 @@ font-weight: 700; } - .terminal-3864822385-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3864822385-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3864822385-r1 { fill: #777777 } - .terminal-3864822385-r2 { fill: #feffac } - .terminal-3864822385-r3 { fill: #c5c8c6 } - .terminal-3864822385-r4 { fill: #dfdfdf } - .terminal-3864822385-r5 { fill: #858585 } - .terminal-3864822385-r6 { fill: #dddddd } - .terminal-3864822385-r7 { fill: #181818 } - .terminal-3864822385-r8 { fill: #08211a;font-weight: bold } - .terminal-3864822385-r9 { fill: #777777;font-weight: bold } - .terminal-3864822385-r10 { fill: #e3e3e3 } - .terminal-3864822385-r11 { fill: #1d1d1d } - .terminal-3864822385-r12 { fill: #0c0c0c;font-weight: bold } - .terminal-3864822385-r13 { fill: #212116;font-weight: bold } - .terminal-3864822385-r14 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #08211a;font-weight: bold } + .terminal-9999999-r9 { fill: #777777;font-weight: bold } + .terminal-9999999-r10 { fill: #e3e3e3 } + .terminal-9999999-r11 { fill: #1d1d1d } + .terminal-9999999-r12 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r13 { fill: #212116;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db1  se - select kw - sequence kw - set kw▁▁ - search kw - second kw - second fn - seconds kw - secret kw - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db1  se + select kw + sequence kw + set kw▁▁ + search kw + second kw + second fn + seconds kw + secret kw + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -2347,144 +2347,144 @@ font-weight: 700; } - .terminal-3864822385-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3864822385-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3864822385-r1 { fill: #777777 } - .terminal-3864822385-r2 { fill: #feffac } - .terminal-3864822385-r3 { fill: #c5c8c6 } - .terminal-3864822385-r4 { fill: #dfdfdf } - .terminal-3864822385-r5 { fill: #858585 } - .terminal-3864822385-r6 { fill: #dddddd } - .terminal-3864822385-r7 { fill: #181818 } - .terminal-3864822385-r8 { fill: #08211a;font-weight: bold } - .terminal-3864822385-r9 { fill: #777777;font-weight: bold } - .terminal-3864822385-r10 { fill: #e3e3e3 } - .terminal-3864822385-r11 { fill: #1d1d1d } - .terminal-3864822385-r12 { fill: #0c0c0c;font-weight: bold } - .terminal-3864822385-r13 { fill: #212116;font-weight: bold } - .terminal-3864822385-r14 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #08211a;font-weight: bold } + .terminal-9999999-r9 { fill: #777777;font-weight: bold } + .terminal-9999999-r10 { fill: #e3e3e3 } + .terminal-9999999-r11 { fill: #1d1d1d } + .terminal-9999999-r12 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r13 { fill: #212116;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db1  se - select kw - sequence kw - set kw▁▁ - search kw - second kw - second fn - seconds kw - secret kw - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db1  se + select kw + sequence kw + set kw▁▁ + search kw + second kw + second fn + seconds kw + secret kw + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -2514,142 +2514,142 @@ font-weight: 700; } - .terminal-4022852970-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4022852970-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4022852970-r1 { fill: #777777 } - .terminal-4022852970-r2 { fill: #feffac } - .terminal-4022852970-r3 { fill: #c5c8c6 } - .terminal-4022852970-r4 { fill: #dfdfdf } - .terminal-4022852970-r5 { fill: #858585 } - .terminal-4022852970-r6 { fill: #dddddd } - .terminal-4022852970-r7 { fill: #181818 } - .terminal-4022852970-r8 { fill: #08211a;font-weight: bold } - .terminal-4022852970-r9 { fill: #777777;font-weight: bold } - .terminal-4022852970-r10 { fill: #0c0c0c;font-weight: bold } - .terminal-4022852970-r11 { fill: #212116;font-weight: bold } - .terminal-4022852970-r12 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #08211a;font-weight: bold } + .terminal-9999999-r9 { fill: #777777;font-weight: bold } + .terminal-9999999-r10 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r11 { fill: #212116;font-weight: bold } + .terminal-9999999-r12 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db1  sel - select kw - - - - - - - - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db1  sel + select kw + + + + + + + + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -2679,141 +2679,141 @@ font-weight: 700; } - .terminal-2382680475-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2382680475-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2382680475-r1 { fill: #777777 } - .terminal-2382680475-r2 { fill: #feffac } - .terminal-2382680475-r3 { fill: #c5c8c6 } - .terminal-2382680475-r4 { fill: #dfdfdf } - .terminal-2382680475-r5 { fill: #858585 } - .terminal-2382680475-r6 { fill: #feffac;font-weight: bold } - .terminal-2382680475-r7 { fill: #181818 } - .terminal-2382680475-r8 { fill: #dddddd } - .terminal-2382680475-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-2382680475-r10 { fill: #212116;font-weight: bold } - .terminal-2382680475-r11 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #feffac;font-weight: bold } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #dddddd } + .terminal-9999999-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r10 { fill: #212116;font-weight: bold } + .terminal-9999999-r11 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db1  select - - - - - - - - - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db1  select + + + + + + + + + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -2843,144 +2843,144 @@ font-weight: 700; } - .terminal-3246534041-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3246534041-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3246534041-r1 { fill: #777777 } - .terminal-3246534041-r2 { fill: #feffac } - .terminal-3246534041-r3 { fill: #c5c8c6 } - .terminal-3246534041-r4 { fill: #dfdfdf } - .terminal-3246534041-r5 { fill: #858585 } - .terminal-3246534041-r6 { fill: #dddddd } - .terminal-3246534041-r7 { fill: #181818 } - .terminal-3246534041-r8 { fill: #08211a;font-weight: bold } - .terminal-3246534041-r9 { fill: #777777;font-weight: bold } - .terminal-3246534041-r10 { fill: #e3e3e3 } - .terminal-3246534041-r11 { fill: #1d1d1d } - .terminal-3246534041-r12 { fill: #0c0c0c;font-weight: bold } - .terminal-3246534041-r13 { fill: #212116;font-weight: bold } - .terminal-3246534041-r14 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #08211a;font-weight: bold } + .terminal-9999999-r9 { fill: #777777;font-weight: bold } + .terminal-9999999-r10 { fill: #e3e3e3 } + .terminal-9999999-r11 { fill: #1d1d1d } + .terminal-9999999-r12 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r13 { fill: #212116;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - main db1  s - savepoint kw - schema kw - select kw▃▃ - sequence kw - set kw - similar kw - sqrt fn - sum agg - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + main db1  s + savepoint kw + schema kw + select kw▃▃ + sequence kw + set kw + similar kw + sqrt fn + sum agg + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -3010,143 +3010,143 @@ font-weight: 700; } - .terminal-2367134888-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2367134888-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2367134888-r1 { fill: #777777 } - .terminal-2367134888-r2 { fill: #feffac } - .terminal-2367134888-r3 { fill: #c5c8c6 } - .terminal-2367134888-r4 { fill: #dfdfdf } - .terminal-2367134888-r5 { fill: #858585 } - .terminal-2367134888-r6 { fill: #dddddd } - .terminal-2367134888-r7 { fill: #181818 } - .terminal-2367134888-r8 { fill: #08211a;font-weight: bold } - .terminal-2367134888-r9 { fill: #777777;font-weight: bold } - .terminal-2367134888-r10 { fill: #e3e3e3 } - .terminal-2367134888-r11 { fill: #0c0c0c;font-weight: bold } - .terminal-2367134888-r12 { fill: #212116;font-weight: bold } - .terminal-2367134888-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #08211a;font-weight: bold } + .terminal-9999999-r9 { fill: #777777;font-weight: bold } + .terminal-9999999-r10 { fill: #e3e3e3 } + .terminal-9999999-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r12 { fill: #212116;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - main db1  se - select kw - sequence kw - set kw - secure_delete pragma - - - - - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + main db1  se + select kw + sequence kw + set kw + secure_delete pragma + + + + + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -3176,143 +3176,143 @@ font-weight: 700; } - .terminal-2367134888-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2367134888-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2367134888-r1 { fill: #777777 } - .terminal-2367134888-r2 { fill: #feffac } - .terminal-2367134888-r3 { fill: #c5c8c6 } - .terminal-2367134888-r4 { fill: #dfdfdf } - .terminal-2367134888-r5 { fill: #858585 } - .terminal-2367134888-r6 { fill: #dddddd } - .terminal-2367134888-r7 { fill: #181818 } - .terminal-2367134888-r8 { fill: #08211a;font-weight: bold } - .terminal-2367134888-r9 { fill: #777777;font-weight: bold } - .terminal-2367134888-r10 { fill: #e3e3e3 } - .terminal-2367134888-r11 { fill: #0c0c0c;font-weight: bold } - .terminal-2367134888-r12 { fill: #212116;font-weight: bold } - .terminal-2367134888-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #08211a;font-weight: bold } + .terminal-9999999-r9 { fill: #777777;font-weight: bold } + .terminal-9999999-r10 { fill: #e3e3e3 } + .terminal-9999999-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r12 { fill: #212116;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - main db1  se - select kw - sequence kw - set kw - secure_delete pragma - - - - - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + main db1  se + select kw + sequence kw + set kw + secure_delete pragma + + + + + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -3342,142 +3342,142 @@ font-weight: 700; } - .terminal-2694482159-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2694482159-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2694482159-r1 { fill: #777777 } - .terminal-2694482159-r2 { fill: #feffac } - .terminal-2694482159-r3 { fill: #c5c8c6 } - .terminal-2694482159-r4 { fill: #dfdfdf } - .terminal-2694482159-r5 { fill: #858585 } - .terminal-2694482159-r6 { fill: #dddddd } - .terminal-2694482159-r7 { fill: #181818 } - .terminal-2694482159-r8 { fill: #08211a;font-weight: bold } - .terminal-2694482159-r9 { fill: #777777;font-weight: bold } - .terminal-2694482159-r10 { fill: #0c0c0c;font-weight: bold } - .terminal-2694482159-r11 { fill: #212116;font-weight: bold } - .terminal-2694482159-r12 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #08211a;font-weight: bold } + .terminal-9999999-r9 { fill: #777777;font-weight: bold } + .terminal-9999999-r10 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r11 { fill: #212116;font-weight: bold } + .terminal-9999999-r12 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - main db1  sel - select kw - - - - - - - - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + main db1  sel + select kw + + + + + + + + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -3507,141 +3507,141 @@ font-weight: 700; } - .terminal-942636320-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-942636320-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-942636320-r1 { fill: #777777 } - .terminal-942636320-r2 { fill: #feffac } - .terminal-942636320-r3 { fill: #c5c8c6 } - .terminal-942636320-r4 { fill: #dfdfdf } - .terminal-942636320-r5 { fill: #858585 } - .terminal-942636320-r6 { fill: #feffac;font-weight: bold } - .terminal-942636320-r7 { fill: #181818 } - .terminal-942636320-r8 { fill: #dddddd } - .terminal-942636320-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-942636320-r10 { fill: #212116;font-weight: bold } - .terminal-942636320-r11 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #feffac;font-weight: bold } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #dddddd } + .terminal-9999999-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r10 { fill: #212116;font-weight: bold } + .terminal-9999999-r11 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - main db1  select - - - - - - - - - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + main db1  select + + + + + + + + + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer diff --git a/tests/functional_tests/__snapshots__/test_results_viewer.ambr b/tests/functional_tests/__snapshots__/test_results_viewer.ambr index bcd890cc..64aa67af 100644 --- a/tests/functional_tests/__snapshots__/test_results_viewer.ambr +++ b/tests/functional_tests/__snapshots__/test_results_viewer.ambr @@ -22,145 +22,145 @@ font-weight: 700; } - .terminal-3210702884-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3210702884-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3210702884-r1 { fill: #777777 } - .terminal-3210702884-r2 { fill: #feffac } - .terminal-3210702884-r3 { fill: #c5c8c6 } - .terminal-3210702884-r4 { fill: #dfdfdf } - .terminal-3210702884-r5 { fill: #858585 } - .terminal-3210702884-r6 { fill: #dddddd } - .terminal-3210702884-r7 { fill: #181818 } - .terminal-3210702884-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-3210702884-r9 { fill: #212116;font-weight: bold } - .terminal-3210702884-r10 { fill: #feffac;font-weight: bold } - .terminal-3210702884-r11 { fill: #777777;font-weight: bold } - .terminal-3210702884-r12 { fill: #e3efeb } - .terminal-3210702884-r13 { fill: #08211a } - .terminal-3210702884-r14 { fill: #1d1d1d } - .terminal-3210702884-r15 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac;font-weight: bold } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #e3efeb } + .terminal-9999999-r13 { fill: #08211a } + .terminal-9999999-r14 { fill: #1d1d1d } + .terminal-9999999-r15 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db1  7  German  http://en.wikipedia.org/wiki/Nico_Rosberg - - - - - - - - - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results (1 Records) ──────────────────────────────╮ - ││ '1985-06-27' s 'German' s 'http://en.wikipedia.org/wi…  - ││ 1985-06-27      German      http://en.wikipedia.org/wik…  - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db1  7  German  http://en.wikipedia.org/wiki/Nico_Rosberg + + + + + + + + + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results (1 Records) ──────────────────────────────╮ + ││ '1985-06-27' s 'German' s 'http://en.wikipedia.org/wi…  + ││ 1985-06-27      German      http://en.wikipedia.org/wik…  + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -190,145 +190,145 @@ font-weight: 700; } - .terminal-4144962469-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4144962469-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4144962469-r1 { fill: #777777 } - .terminal-4144962469-r2 { fill: #feffac } - .terminal-4144962469-r3 { fill: #c5c8c6 } - .terminal-4144962469-r4 { fill: #dfdfdf } - .terminal-4144962469-r5 { fill: #858585 } - .terminal-4144962469-r6 { fill: #dddddd } - .terminal-4144962469-r7 { fill: #181818 } - .terminal-4144962469-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-4144962469-r9 { fill: #212116;font-weight: bold } - .terminal-4144962469-r10 { fill: #feffac;font-weight: bold } - .terminal-4144962469-r11 { fill: #777777;font-weight: bold } - .terminal-4144962469-r12 { fill: #e3efeb } - .terminal-4144962469-r13 { fill: #08211a } - .terminal-4144962469-r14 { fill: #1d1d1d } - .terminal-4144962469-r15 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #181818 } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac;font-weight: bold } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #e3efeb } + .terminal-9999999-r13 { fill: #08211a } + .terminal-9999999-r14 { fill: #1d1d1d } + .terminal-9999999-r15 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - main db1  7  German  http://en.wikipedia.org/wiki/Nico_Rosberg - - - - - - - - - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results (1 Records) ──────────────────────────────╮ - ││ '1985-06-27' s 'German' s 'http://en.wikipedia.org/wi…  - ││ 1985-06-27      German      http://en.wikipedia.org/wik…  - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + main db1  7  German  http://en.wikipedia.org/wiki/Nico_Rosberg + + + + + + + + + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results (1 Records) ──────────────────────────────╮ + ││ '1985-06-27' s 'German' s 'http://en.wikipedia.org/wi…  + ││ 1985-06-27      German      http://en.wikipedia.org/wik…  + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer @@ -358,143 +358,143 @@ font-weight: 700; } - .terminal-359026021-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-359026021-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-359026021-r1 { fill: #777777 } - .terminal-359026021-r2 { fill: #c5c8c6 } - .terminal-359026021-r3 { fill: #dfdfdf } - .terminal-359026021-r4 { fill: #858585 } - .terminal-359026021-r5 { fill: #feffac;font-weight: bold } - .terminal-359026021-r6 { fill: #dddddd } - .terminal-359026021-r7 { fill: #ffb6d9 } - .terminal-359026021-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-359026021-r9 { fill: #212116;font-weight: bold } - .terminal-359026021-r10 { fill: #feffac } - .terminal-359026021-r11 { fill: #08211a } - .terminal-359026021-r12 { fill: #45ffca;font-weight: bold } - .terminal-359026021-r13 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9 } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #08211a } + .terminal-9999999-r12 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db││1  select'supercalifragilisticexpialidocious' - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (1 Records) ──────────────────────────────╮ -  'supercalifragilisticexpial…                             │ -  supercalifragilisticexpiali…  - ╭────────────────────────────╮ - supercalifragilisticexpial - idocious - ╰────────────────────────────╯ - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db││1  select'supercalifragilisticexpialidocious' + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (1 Records) ──────────────────────────────╮ +  'supercalifragilisticexpial…                             │ +  supercalifragilisticexpiali…  + ╭────────────────────────────╮ + supercalifragilisticexpial + idocious + ╰────────────────────────────╯ + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -524,143 +524,143 @@ font-weight: 700; } - .terminal-1292302555-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1292302555-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1292302555-r1 { fill: #777777 } - .terminal-1292302555-r2 { fill: #c5c8c6 } - .terminal-1292302555-r3 { fill: #dfdfdf } - .terminal-1292302555-r4 { fill: #858585 } - .terminal-1292302555-r5 { fill: #feffac;font-weight: bold } - .terminal-1292302555-r6 { fill: #dddddd } - .terminal-1292302555-r7 { fill: #ffb6d9 } - .terminal-1292302555-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-1292302555-r9 { fill: #212116;font-weight: bold } - .terminal-1292302555-r10 { fill: #feffac } - .terminal-1292302555-r11 { fill: #08211a } - .terminal-1292302555-r12 { fill: #45ffca;font-weight: bold } - .terminal-1292302555-r13 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9 } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #08211a } + .terminal-9999999-r12 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - main db││1  select'supercalifragilisticexpialidocious' - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (1 Records) ──────────────────────────────╮ -  'supercalifragilisticexpial…                             │ -  supercalifragilisticexpiali…  - ╭────────────────────────────╮ - supercalifragilisticexpial - idocious - ╰────────────────────────────╯ - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + main db││1  select'supercalifragilisticexpialidocious' + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (1 Records) ──────────────────────────────╮ +  'supercalifragilisticexpial…                             │ +  supercalifragilisticexpiali…  + ╭────────────────────────────╮ + supercalifragilisticexpial + idocious + ╰────────────────────────────╯ + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -690,144 +690,144 @@ font-weight: 700; } - .terminal-987111947-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-987111947-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-987111947-r1 { fill: #777777 } - .terminal-987111947-r2 { fill: #c5c8c6 } - .terminal-987111947-r3 { fill: #dfdfdf } - .terminal-987111947-r4 { fill: #858585 } - .terminal-987111947-r5 { fill: #feffac;font-weight: bold } - .terminal-987111947-r6 { fill: #dddddd } - .terminal-987111947-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-987111947-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-987111947-r9 { fill: #212116;font-weight: bold } - .terminal-987111947-r10 { fill: #feffac } - .terminal-987111947-r11 { fill: #777777;font-weight: bold } - .terminal-987111947-r12 { fill: #08211a } - .terminal-987111947-r13 { fill: #45ffca;font-weight: bold } - .terminal-987111947-r14 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #08211a } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - ▶ memory db││1  select1as a, 1as a, 2as a, 2as a                 - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (1 Records) ──────────────────────────────╮ -  a # a # a # a #                                      │ -    1    1    2    2  - - - - - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + ▶ memory db││1  select1as a, 1as a, 2as a, 2as a                 + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (1 Records) ──────────────────────────────╮ +  a # a # a # a #                                      │ +    1    1    2    2  + + + + + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -857,144 +857,144 @@ font-weight: 700; } - .terminal-1611845005-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1611845005-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1611845005-r1 { fill: #777777 } - .terminal-1611845005-r2 { fill: #c5c8c6 } - .terminal-1611845005-r3 { fill: #dfdfdf } - .terminal-1611845005-r4 { fill: #858585 } - .terminal-1611845005-r5 { fill: #feffac;font-weight: bold } - .terminal-1611845005-r6 { fill: #dddddd } - .terminal-1611845005-r7 { fill: #ffb6d9;font-weight: bold } - .terminal-1611845005-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-1611845005-r9 { fill: #212116;font-weight: bold } - .terminal-1611845005-r10 { fill: #feffac } - .terminal-1611845005-r11 { fill: #777777;font-weight: bold } - .terminal-1611845005-r12 { fill: #08211a } - .terminal-1611845005-r13 { fill: #45ffca;font-weight: bold } - .terminal-1611845005-r14 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #ffb6d9;font-weight: bold } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #feffac } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #08211a } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r14 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ - main db││1  select1as a, 1as a, 2as a, 2as a                 - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (1 Records) ──────────────────────────────╮ -  a ## a ## a ## a ##                                  │ -     1     1     2     2  - - - - - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ───╮╭─ Query Editor ───────────────────────────────────────────╮ + main db││1  select1as a, 1as a, 2as a, 2as a                 + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (1 Records) ──────────────────────────────╮ +  a ## a ## a ## a ##                                  │ +     1     1     2     2  + + + + + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  diff --git a/tests/functional_tests/__snapshots__/test_run_query_bar.ambr b/tests/functional_tests/__snapshots__/test_run_query_bar.ambr index fe3766c3..700600d2 100644 --- a/tests/functional_tests/__snapshots__/test_run_query_bar.ambr +++ b/tests/functional_tests/__snapshots__/test_run_query_bar.ambr @@ -22,193 +22,193 @@ font-weight: 700; } - .terminal-772990662-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-772990662-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-772990662-r1 { fill: #777777 } - .terminal-772990662-r2 { fill: #c5c8c6 } - .terminal-772990662-r3 { fill: #dfdfdf } - .terminal-772990662-r4 { fill: #858585 } - .terminal-772990662-r5 { fill: #feffac;font-weight: bold } - .terminal-772990662-r6 { fill: #dddddd } - .terminal-772990662-r7 { fill: #0c0c0c;font-weight: bold } - .terminal-772990662-r8 { fill: #ffb6d9 } - .terminal-772990662-r9 { fill: #0c0c0c } - .terminal-772990662-r10 { fill: #212116;font-weight: bold } - .terminal-772990662-r11 { fill: #777777;font-weight: bold } - .terminal-772990662-r12 { fill: #08211a } - .terminal-772990662-r13 { fill: #45ffca;font-weight: bold } - .terminal-772990662-r14 { fill: #feffac } - .terminal-772990662-r15 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r8 { fill: #ffb6d9 } + .terminal-9999999-r9 { fill: #0c0c0c } + .terminal-9999999-r10 { fill: #212116;font-weight: bold } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #08211a } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r14 { fill: #feffac } + .terminal-9999999-r15 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ small db││1  select * from drivers                                                               - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit a500    Run Query  - │╭─ Query Results (500 Records) ──────────────────────────────────────────────────────────╮ - ││ driverId ## driverRef s number s code s forename s surname s - ││           1  hamilton            44        HAM     Lewis              Hamilton        - ││           2  heidfeld            \N        HEI     Nick               Heidfeld        - ││           3  rosberg             6         ROS     Nico               Rosberg         - ││           4  alonso              14        ALO     Fernando           Alonso          - ││           5  kovalainen          \N        KOV     Heikki             Kovalainen      - ││           6  nakajima            \N        NAK     Kazuki             Nakajima        - ││           7  bourdais            \N        BOU     Sébastien          Bourdais        - ││           8  raikkonen           7         RAI     Kimi               Räikkönen       - ││           9  kubica              88        KUB     Robert             Kubica          - ││          10  glock               \N        GLO     Timo               Glock           - ││          11  sato                \N        SAT     Takuma             Sato            - ││          12  piquet_jr           \N        PIQ     Nelson             Piquet Jr.      - ││          13  massa               19        MAS     Felipe             Massa           - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ small db││1  select * from drivers                                                               + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit a500    Run Query  + │╭─ Query Results (500 Records) ──────────────────────────────────────────────────────────╮ + ││ driverId ## driverRef s number s code s forename s surname s + ││           1  hamilton            44        HAM     Lewis              Hamilton        + ││           2  heidfeld            \N        HEI     Nick               Heidfeld        + ││           3  rosberg             6         ROS     Nico               Rosberg         + ││           4  alonso              14        ALO     Fernando           Alonso          + ││           5  kovalainen          \N        KOV     Heikki             Kovalainen      + ││           6  nakajima            \N        NAK     Kazuki             Nakajima        + ││           7  bourdais            \N        BOU     Sébastien          Bourdais        + ││           8  raikkonen           7         RAI     Kimi               Räikkönen       + ││           9  kubica              88        KUB     Robert             Kubica          + ││          10  glock               \N        GLO     Timo               Glock           + ││          11  sato                \N        SAT     Takuma             Sato            + ││          12  piquet_jr           \N        PIQ     Nelson             Piquet Jr.      + ││          13  massa               19        MAS     Felipe             Massa           + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -238,191 +238,191 @@ font-weight: 700; } - .terminal-1621817413-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1621817413-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1621817413-r1 { fill: #777777 } - .terminal-1621817413-r2 { fill: #c5c8c6 } - .terminal-1621817413-r3 { fill: #dfdfdf } - .terminal-1621817413-r4 { fill: #858585 } - .terminal-1621817413-r5 { fill: #feffac;font-weight: bold } - .terminal-1621817413-r6 { fill: #dddddd } - .terminal-1621817413-r7 { fill: #1d1d1d } - .terminal-1621817413-r8 { fill: #212116;font-weight: bold } - .terminal-1621817413-r9 { fill: #feffac } - .terminal-1621817413-r10 { fill: #777777;font-weight: bold } - .terminal-1621817413-r11 { fill: #08211a } - .terminal-1621817413-r12 { fill: #45ffca;font-weight: bold } - .terminal-1621817413-r13 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #1d1d1d } + .terminal-9999999-r8 { fill: #212116;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #777777;font-weight: bold } + .terminal-9999999-r11 { fill: #08211a } + .terminal-9999999-r12 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ small db││1  select * from drivers                                                               - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 100         Run Query  - ╭─ Query Results (100 Records) ──────────────────────────────────────────────────────────╮ -  driverId ## driverRef s number s code s forename s surname s do -            1  hamilton            44        HAM     Lewis            Hamilton       19 -            2  heidfeld            \N        HEI     Nick             Heidfeld       19 -            3  rosberg             6         ROS     Nico             Rosberg        19 -            4  alonso              14        ALO     Fernando         Alonso         19 -            5  kovalainen          \N        KOV     Heikki           Kovalainen     19 -            6  nakajima            \N        NAK     Kazuki           Nakajima       19 -            7  bourdais            \N        BOU     Sébastien        Bourdais       19 -            8  raikkonen           7         RAI     Kimi             Räikkönen      19 -            9  kubica              88        KUB     Robert           Kubica         19 -           10  glock               \N        GLO     Timo             Glock          19 -           11  sato                \N        SAT     Takuma           Sato           19 -           12  piquet_jr           \N        PIQ     Nelson           Piquet Jr.     19 -           13  massa               19        MAS     Felipe           Massa          19 - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ small db││1  select * from drivers                                                               + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 100         Run Query  + ╭─ Query Results (100 Records) ──────────────────────────────────────────────────────────╮ +  driverId ## driverRef s number s code s forename s surname s do +            1  hamilton            44        HAM     Lewis            Hamilton       19 +            2  heidfeld            \N        HEI     Nick             Heidfeld       19 +            3  rosberg             6         ROS     Nico             Rosberg        19 +            4  alonso              14        ALO     Fernando         Alonso         19 +            5  kovalainen          \N        KOV     Heikki           Kovalainen     19 +            6  nakajima            \N        NAK     Kazuki           Nakajima       19 +            7  bourdais            \N        BOU     Sébastien        Bourdais       19 +            8  raikkonen           7         RAI     Kimi             Räikkönen      19 +            9  kubica              88        KUB     Robert           Kubica         19 +           10  glock               \N        GLO     Timo             Glock          19 +           11  sato                \N        SAT     Takuma           Sato           19 +           12  piquet_jr           \N        PIQ     Nelson           Piquet Jr.     19 +           13  massa               19        MAS     Felipe           Massa          19 + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -452,191 +452,191 @@ font-weight: 700; } - .terminal-2061265411-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2061265411-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2061265411-r1 { fill: #777777 } - .terminal-2061265411-r2 { fill: #c5c8c6 } - .terminal-2061265411-r3 { fill: #dfdfdf } - .terminal-2061265411-r4 { fill: #858585 } - .terminal-2061265411-r5 { fill: #feffac;font-weight: bold } - .terminal-2061265411-r6 { fill: #dddddd } - .terminal-2061265411-r7 { fill: #1d1d1d } - .terminal-2061265411-r8 { fill: #212116;font-weight: bold } - .terminal-2061265411-r9 { fill: #feffac } - .terminal-2061265411-r10 { fill: #777777;font-weight: bold } - .terminal-2061265411-r11 { fill: #08211a } - .terminal-2061265411-r12 { fill: #45ffca;font-weight: bold } - .terminal-2061265411-r13 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #1d1d1d } + .terminal-9999999-r8 { fill: #212116;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #777777;font-weight: bold } + .terminal-9999999-r11 { fill: #08211a } + .terminal-9999999-r12 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ small db││1  select * from drivers                                                               - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (500 Records) ──────────────────────────────────────────────────────────╮ -  driverId ## driverRef s number s code s forename s surname s -            1  hamilton            44        HAM     Lewis              Hamilton        -            2  heidfeld            \N        HEI     Nick               Heidfeld        -            3  rosberg             6         ROS     Nico               Rosberg         -            4  alonso              14        ALO     Fernando           Alonso          -            5  kovalainen          \N        KOV     Heikki             Kovalainen      -            6  nakajima            \N        NAK     Kazuki             Nakajima        -            7  bourdais            \N        BOU     Sébastien          Bourdais        -            8  raikkonen           7         RAI     Kimi               Räikkönen       -            9  kubica              88        KUB     Robert             Kubica          -           10  glock               \N        GLO     Timo               Glock           -           11  sato                \N        SAT     Takuma             Sato            -           12  piquet_jr           \N        PIQ     Nelson             Piquet Jr.      -           13  massa               19        MAS     Felipe             Massa           - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ small db││1  select * from drivers                                                               + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (500 Records) ──────────────────────────────────────────────────────────╮ +  driverId ## driverRef s number s code s forename s surname s +            1  hamilton            44        HAM     Lewis              Hamilton        +            2  heidfeld            \N        HEI     Nick               Heidfeld        +            3  rosberg             6         ROS     Nico               Rosberg         +            4  alonso              14        ALO     Fernando           Alonso          +            5  kovalainen          \N        KOV     Heikki             Kovalainen      +            6  nakajima            \N        NAK     Kazuki             Nakajima        +            7  bourdais            \N        BOU     Sébastien          Bourdais        +            8  raikkonen           7         RAI     Kimi               Räikkönen       +            9  kubica              88        KUB     Robert             Kubica          +           10  glock               \N        GLO     Timo               Glock           +           11  sato                \N        SAT     Takuma             Sato            +           12  piquet_jr           \N        PIQ     Nelson             Piquet Jr.      +           13  massa               19        MAS     Felipe             Massa           + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -666,191 +666,191 @@ font-weight: 700; } - .terminal-1852356685-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1852356685-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1852356685-r1 { fill: #777777 } - .terminal-1852356685-r2 { fill: #c5c8c6 } - .terminal-1852356685-r3 { fill: #dfdfdf } - .terminal-1852356685-r4 { fill: #858585 } - .terminal-1852356685-r5 { fill: #feffac;font-weight: bold } - .terminal-1852356685-r6 { fill: #dddddd } - .terminal-1852356685-r7 { fill: #0c0c0c;font-weight: bold } - .terminal-1852356685-r8 { fill: #212116;font-weight: bold } - .terminal-1852356685-r9 { fill: #feffac } - .terminal-1852356685-r10 { fill: #777777;font-weight: bold } - .terminal-1852356685-r11 { fill: #08211a } - .terminal-1852356685-r12 { fill: #45ffca;font-weight: bold } - .terminal-1852356685-r13 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r8 { fill: #212116;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #777777;font-weight: bold } + .terminal-9999999-r11 { fill: #08211a } + .terminal-9999999-r12 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ small db││1  select * from drivers                                                               - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (857 Records) ──────────────────────────────────────────────────────────╮ -  driverId ## driverRef s number s code s forename s surname s -            1  hamilton            44        HAM     Lewis              Hamilton        -            2  heidfeld            \N        HEI     Nick               Heidfeld        -            3  rosberg             6         ROS     Nico               Rosberg         -            4  alonso              14        ALO     Fernando           Alonso          -            5  kovalainen          \N        KOV     Heikki             Kovalainen      -            6  nakajima            \N        NAK     Kazuki             Nakajima        -            7  bourdais            \N        BOU     Sébastien          Bourdais        -            8  raikkonen           7         RAI     Kimi               Räikkönen       -            9  kubica              88        KUB     Robert             Kubica          -           10  glock               \N        GLO     Timo               Glock           -           11  sato                \N        SAT     Takuma             Sato            -           12  piquet_jr           \N        PIQ     Nelson             Piquet Jr.      -           13  massa               19        MAS     Felipe             Massa           - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ small db││1  select * from drivers                                                               + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (857 Records) ──────────────────────────────────────────────────────────╮ +  driverId ## driverRef s number s code s forename s surname s +            1  hamilton            44        HAM     Lewis              Hamilton        +            2  heidfeld            \N        HEI     Nick               Heidfeld        +            3  rosberg             6         ROS     Nico               Rosberg         +            4  alonso              14        ALO     Fernando           Alonso          +            5  kovalainen          \N        KOV     Heikki             Kovalainen      +            6  nakajima            \N        NAK     Kazuki             Nakajima        +            7  bourdais            \N        BOU     Sébastien          Bourdais        +            8  raikkonen           7         RAI     Kimi               Räikkönen       +            9  kubica              88        KUB     Robert             Kubica          +           10  glock               \N        GLO     Timo               Glock           +           11  sato                \N        SAT     Takuma             Sato            +           12  piquet_jr           \N        PIQ     Nelson             Piquet Jr.      +           13  massa               19        MAS     Felipe             Massa           + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -880,193 +880,193 @@ font-weight: 700; } - .terminal-1787881074-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1787881074-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1787881074-r1 { fill: #777777 } - .terminal-1787881074-r2 { fill: #c5c8c6 } - .terminal-1787881074-r3 { fill: #dfdfdf } - .terminal-1787881074-r4 { fill: #858585 } - .terminal-1787881074-r5 { fill: #feffac;font-weight: bold } - .terminal-1787881074-r6 { fill: #dddddd } - .terminal-1787881074-r7 { fill: #0c0c0c;font-weight: bold } - .terminal-1787881074-r8 { fill: #ffb6d9 } - .terminal-1787881074-r9 { fill: #0c0c0c } - .terminal-1787881074-r10 { fill: #212116;font-weight: bold } - .terminal-1787881074-r11 { fill: #777777;font-weight: bold } - .terminal-1787881074-r12 { fill: #08211a } - .terminal-1787881074-r13 { fill: #45ffca;font-weight: bold } - .terminal-1787881074-r14 { fill: #feffac } - .terminal-1787881074-r15 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r8 { fill: #ffb6d9 } + .terminal-9999999-r9 { fill: #0c0c0c } + .terminal-9999999-r10 { fill: #212116;font-weight: bold } + .terminal-9999999-r11 { fill: #777777;font-weight: bold } + .terminal-9999999-r12 { fill: #08211a } + .terminal-9999999-r13 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r14 { fill: #feffac } + .terminal-9999999-r15 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ main db││1  select * from drivers                                                               - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit a500    Run Query  - │╭─ Query Results (500 Records) ──────────────────────────────────────────────────────────╮ - ││ driverId ## driverRef s number s code s forename s surname s - ││           1  hamilton            44        HAM     Lewis              Hamilton        - ││           2  heidfeld            \N        HEI     Nick               Heidfeld        - ││           3  rosberg             6         ROS     Nico               Rosberg         - ││           4  alonso              14        ALO     Fernando           Alonso          - ││           5  kovalainen          \N        KOV     Heikki             Kovalainen      - ││           6  nakajima            \N        NAK     Kazuki             Nakajima        - ││           7  bourdais            \N        BOU     Sébastien          Bourdais        - ││           8  raikkonen           7         RAI     Kimi               Räikkönen       - ││           9  kubica              88        KUB     Robert             Kubica          - ││          10  glock               \N        GLO     Timo               Glock           - ││          11  sato                \N        SAT     Takuma             Sato            - ││          12  piquet_jr           \N        PIQ     Nelson             Piquet Jr.      - ││          13  massa               19        MAS     Felipe             Massa           - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ main db││1  select * from drivers                                                               + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit a500    Run Query  + │╭─ Query Results (500 Records) ──────────────────────────────────────────────────────────╮ + ││ driverId ## driverRef s number s code s forename s surname s + ││           1  hamilton            44        HAM     Lewis              Hamilton        + ││           2  heidfeld            \N        HEI     Nick               Heidfeld        + ││           3  rosberg             6         ROS     Nico               Rosberg         + ││           4  alonso              14        ALO     Fernando           Alonso          + ││           5  kovalainen          \N        KOV     Heikki             Kovalainen      + ││           6  nakajima            \N        NAK     Kazuki             Nakajima        + ││           7  bourdais            \N        BOU     Sébastien          Bourdais        + ││           8  raikkonen           7         RAI     Kimi               Räikkönen       + ││           9  kubica              88        KUB     Robert             Kubica          + ││          10  glock               \N        GLO     Timo               Glock           + ││          11  sato                \N        SAT     Takuma             Sato            + ││          12  piquet_jr           \N        PIQ     Nelson             Piquet Jr.      + ││          13  massa               19        MAS     Felipe             Massa           + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -1096,191 +1096,191 @@ font-weight: 700; } - .terminal-2015164401-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2015164401-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2015164401-r1 { fill: #777777 } - .terminal-2015164401-r2 { fill: #c5c8c6 } - .terminal-2015164401-r3 { fill: #dfdfdf } - .terminal-2015164401-r4 { fill: #858585 } - .terminal-2015164401-r5 { fill: #feffac;font-weight: bold } - .terminal-2015164401-r6 { fill: #dddddd } - .terminal-2015164401-r7 { fill: #1d1d1d } - .terminal-2015164401-r8 { fill: #212116;font-weight: bold } - .terminal-2015164401-r9 { fill: #feffac } - .terminal-2015164401-r10 { fill: #777777;font-weight: bold } - .terminal-2015164401-r11 { fill: #08211a } - .terminal-2015164401-r12 { fill: #45ffca;font-weight: bold } - .terminal-2015164401-r13 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #1d1d1d } + .terminal-9999999-r8 { fill: #212116;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #777777;font-weight: bold } + .terminal-9999999-r11 { fill: #08211a } + .terminal-9999999-r12 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ main db││1  select * from drivers                                                               - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 100         Run Query  - ╭─ Query Results (100 Records) ──────────────────────────────────────────────────────────╮ -  driverId ## driverRef s number s code s forename s surname s do -            1  hamilton            44        HAM     Lewis            Hamilton       19 -            2  heidfeld            \N        HEI     Nick             Heidfeld       19 -            3  rosberg             6         ROS     Nico             Rosberg        19 -            4  alonso              14        ALO     Fernando         Alonso         19 -            5  kovalainen          \N        KOV     Heikki           Kovalainen     19 -            6  nakajima            \N        NAK     Kazuki           Nakajima       19 -            7  bourdais            \N        BOU     Sébastien        Bourdais       19 -            8  raikkonen           7         RAI     Kimi             Räikkönen      19 -            9  kubica              88        KUB     Robert           Kubica         19 -           10  glock               \N        GLO     Timo             Glock          19 -           11  sato                \N        SAT     Takuma           Sato           19 -           12  piquet_jr           \N        PIQ     Nelson           Piquet Jr.     19 -           13  massa               19        MAS     Felipe           Massa          19 - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ main db││1  select * from drivers                                                               + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 100         Run Query  + ╭─ Query Results (100 Records) ──────────────────────────────────────────────────────────╮ +  driverId ## driverRef s number s code s forename s surname s do +            1  hamilton            44        HAM     Lewis            Hamilton       19 +            2  heidfeld            \N        HEI     Nick             Heidfeld       19 +            3  rosberg             6         ROS     Nico             Rosberg        19 +            4  alonso              14        ALO     Fernando         Alonso         19 +            5  kovalainen          \N        KOV     Heikki           Kovalainen     19 +            6  nakajima            \N        NAK     Kazuki           Nakajima       19 +            7  bourdais            \N        BOU     Sébastien        Bourdais       19 +            8  raikkonen           7         RAI     Kimi             Räikkönen      19 +            9  kubica              88        KUB     Robert           Kubica         19 +           10  glock               \N        GLO     Timo             Glock          19 +           11  sato                \N        SAT     Takuma           Sato           19 +           12  piquet_jr           \N        PIQ     Nelson           Piquet Jr.     19 +           13  massa               19        MAS     Felipe           Massa          19 + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -1310,191 +1310,191 @@ font-weight: 700; } - .terminal-967928239-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-967928239-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-967928239-r1 { fill: #777777 } - .terminal-967928239-r2 { fill: #c5c8c6 } - .terminal-967928239-r3 { fill: #dfdfdf } - .terminal-967928239-r4 { fill: #858585 } - .terminal-967928239-r5 { fill: #feffac;font-weight: bold } - .terminal-967928239-r6 { fill: #dddddd } - .terminal-967928239-r7 { fill: #1d1d1d } - .terminal-967928239-r8 { fill: #212116;font-weight: bold } - .terminal-967928239-r9 { fill: #feffac } - .terminal-967928239-r10 { fill: #777777;font-weight: bold } - .terminal-967928239-r11 { fill: #08211a } - .terminal-967928239-r12 { fill: #45ffca;font-weight: bold } - .terminal-967928239-r13 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #1d1d1d } + .terminal-9999999-r8 { fill: #212116;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #777777;font-weight: bold } + .terminal-9999999-r11 { fill: #08211a } + .terminal-9999999-r12 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ main db││1  select * from drivers                                                               - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (500 Records) ──────────────────────────────────────────────────────────╮ -  driverId ## driverRef s number s code s forename s surname s -            1  hamilton            44        HAM     Lewis              Hamilton        -            2  heidfeld            \N        HEI     Nick               Heidfeld        -            3  rosberg             6         ROS     Nico               Rosberg         -            4  alonso              14        ALO     Fernando           Alonso          -            5  kovalainen          \N        KOV     Heikki             Kovalainen      -            6  nakajima            \N        NAK     Kazuki             Nakajima        -            7  bourdais            \N        BOU     Sébastien          Bourdais        -            8  raikkonen           7         RAI     Kimi               Räikkönen       -            9  kubica              88        KUB     Robert             Kubica          -           10  glock               \N        GLO     Timo               Glock           -           11  sato                \N        SAT     Takuma             Sato            -           12  piquet_jr           \N        PIQ     Nelson             Piquet Jr.      -           13  massa               19        MAS     Felipe             Massa           - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ main db││1  select * from drivers                                                               + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (500 Records) ──────────────────────────────────────────────────────────╮ +  driverId ## driverRef s number s code s forename s surname s +            1  hamilton            44        HAM     Lewis              Hamilton        +            2  heidfeld            \N        HEI     Nick               Heidfeld        +            3  rosberg             6         ROS     Nico               Rosberg         +            4  alonso              14        ALO     Fernando           Alonso          +            5  kovalainen          \N        KOV     Heikki             Kovalainen      +            6  nakajima            \N        NAK     Kazuki             Nakajima        +            7  bourdais            \N        BOU     Sébastien          Bourdais        +            8  raikkonen           7         RAI     Kimi               Räikkönen       +            9  kubica              88        KUB     Robert             Kubica          +           10  glock               \N        GLO     Timo               Glock           +           11  sato                \N        SAT     Takuma             Sato            +           12  piquet_jr           \N        PIQ     Nelson             Piquet Jr.      +           13  massa               19        MAS     Felipe             Massa           + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -1524,191 +1524,191 @@ font-weight: 700; } - .terminal-3682252793-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3682252793-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3682252793-r1 { fill: #777777 } - .terminal-3682252793-r2 { fill: #c5c8c6 } - .terminal-3682252793-r3 { fill: #dfdfdf } - .terminal-3682252793-r4 { fill: #858585 } - .terminal-3682252793-r5 { fill: #feffac;font-weight: bold } - .terminal-3682252793-r6 { fill: #dddddd } - .terminal-3682252793-r7 { fill: #0c0c0c;font-weight: bold } - .terminal-3682252793-r8 { fill: #212116;font-weight: bold } - .terminal-3682252793-r9 { fill: #feffac } - .terminal-3682252793-r10 { fill: #777777;font-weight: bold } - .terminal-3682252793-r11 { fill: #08211a } - .terminal-3682252793-r12 { fill: #45ffca;font-weight: bold } - .terminal-3682252793-r13 { fill: #45ffca } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #c5c8c6 } + .terminal-9999999-r3 { fill: #dfdfdf } + .terminal-9999999-r4 { fill: #858585 } + .terminal-9999999-r5 { fill: #feffac;font-weight: bold } + .terminal-9999999-r6 { fill: #dddddd } + .terminal-9999999-r7 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r8 { fill: #212116;font-weight: bold } + .terminal-9999999-r9 { fill: #feffac } + .terminal-9999999-r10 { fill: #777777;font-weight: bold } + .terminal-9999999-r11 { fill: #08211a } + .terminal-9999999-r12 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r13 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ main db││1  select * from drivers                                                               - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - │╰────────────────────────────────────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - ╭─ Query Results (857 Records) ──────────────────────────────────────────────────────────╮ -  driverId ## driverRef s number s code s forename s surname s -            1  hamilton            44        HAM     Lewis              Hamilton        -            2  heidfeld            \N        HEI     Nick               Heidfeld        -            3  rosberg             6         ROS     Nico               Rosberg         -            4  alonso              14        ALO     Fernando           Alonso          -            5  kovalainen          \N        KOV     Heikki             Kovalainen      -            6  nakajima            \N        NAK     Kazuki             Nakajima        -            7  bourdais            \N        BOU     Sébastien          Bourdais        -            8  raikkonen           7         RAI     Kimi               Räikkönen       -            9  kubica              88        KUB     Robert             Kubica          -           10  glock               \N        GLO     Timo               Glock           -           11  sato                \N        SAT     Takuma             Sato            -           12  piquet_jr           \N        PIQ     Nelson             Piquet Jr.      -           13  massa               19        MAS     Felipe             Massa           - - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ main db││1  select * from drivers                                                               + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + │╰────────────────────────────────────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + ╭─ Query Results (857 Records) ──────────────────────────────────────────────────────────╮ +  driverId ## driverRef s number s code s forename s surname s +            1  hamilton            44        HAM     Lewis              Hamilton        +            2  heidfeld            \N        HEI     Nick               Heidfeld        +            3  rosberg             6         ROS     Nico               Rosberg         +            4  alonso              14        ALO     Fernando           Alonso          +            5  kovalainen          \N        KOV     Heikki             Kovalainen      +            6  nakajima            \N        NAK     Kazuki             Nakajima        +            7  bourdais            \N        BOU     Sébastien          Bourdais        +            8  raikkonen           7         RAI     Kimi               Räikkönen       +            9  kubica              88        KUB     Robert             Kubica          +           10  glock               \N        GLO     Timo               Glock           +           11  sato                \N        SAT     Takuma             Sato            +           12  piquet_jr           \N        PIQ     Nelson             Piquet Jr.      +           13  massa               19        MAS     Felipe             Massa           + + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  @@ -1738,189 +1738,189 @@ font-weight: 700; } - .terminal-2647340148-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2647340148-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2647340148-r1 { fill: #777777 } - .terminal-2647340148-r2 { fill: #feffac } - .terminal-2647340148-r3 { fill: #c5c8c6 } - .terminal-2647340148-r4 { fill: #dfdfdf } - .terminal-2647340148-r5 { fill: #858585 } - .terminal-2647340148-r6 { fill: #181818 } - .terminal-2647340148-r7 { fill: #dddddd } - .terminal-2647340148-r8 { fill: #ffb6d9 } - .terminal-2647340148-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-2647340148-r10 { fill: #212116;font-weight: bold } - .terminal-2647340148-r11 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #181818 } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #ffb6d9 } + .terminal-9999999-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r10 { fill: #212116;font-weight: bold } + .terminal-9999999-r11 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ main db1   - - - - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ -  Tx: Manual  🡅  ⮌ X Limit 500         Run Query  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ main db1   + + + + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ +  Tx: Manual  🡅  ⮌ X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  @@ -1950,188 +1950,188 @@ font-weight: 700; } - .terminal-4124878647-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4124878647-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4124878647-r1 { fill: #777777 } - .terminal-4124878647-r2 { fill: #feffac } - .terminal-4124878647-r3 { fill: #c5c8c6 } - .terminal-4124878647-r4 { fill: #dfdfdf } - .terminal-4124878647-r5 { fill: #858585 } - .terminal-4124878647-r6 { fill: #181818 } - .terminal-4124878647-r7 { fill: #dddddd } - .terminal-4124878647-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-4124878647-r9 { fill: #212116;font-weight: bold } - .terminal-4124878647-r10 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r1 { fill: #777777 } + .terminal-9999999-r2 { fill: #feffac } + .terminal-9999999-r3 { fill: #c5c8c6 } + .terminal-9999999-r4 { fill: #dfdfdf } + .terminal-9999999-r5 { fill: #858585 } + .terminal-9999999-r6 { fill: #181818 } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r9 { fill: #212116;font-weight: bold } + .terminal-9999999-r10 { fill: #45ffca;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + Harlequin - + - - ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ - ▶ main db1   - - - - - - - - - - - - - - - ╰────────────────────────────────────────────────────────────────────────────────────────╯ -  Tx: Auto X Limit 500         Run Query  - │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  + + ╭─ Data Catalog ─────────────╮╭─ Query Editor ─────────────────────────────────────────────────────────────────────────╮ + ▶ main db1   + + + + + + + + + + + + + + + ╰────────────────────────────────────────────────────────────────────────────────────────╯ +  Tx: Auto X Limit 500         Run Query  + │╭─ Query Results ────────────────────────────────────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Query  ^o Open Query  ^f Find  f3 Find Next  diff --git a/tests/functional_tests/conftest.py b/tests/functional_tests/conftest.py index 753403e5..6a81b934 100644 --- a/tests/functional_tests/conftest.py +++ b/tests/functional_tests/conftest.py @@ -1,6 +1,11 @@ +from contextlib import suppress +from typing import Awaitable, Callable from unittest.mock import MagicMock import pytest +from textual.worker import WorkerCancelled + +from harlequin.app import Harlequin @pytest.fixture(autouse=True) @@ -42,3 +47,16 @@ def set_paste(x: str) -> None: monkeypatch.setattr("textual_textarea.text_editor.pyperclip", mock) return mock + + +@pytest.fixture +def wait_for_workers() -> Callable[[Harlequin], Awaitable[None]]: + async def wait_for_filtered_workers(app: Harlequin) -> None: + filtered_workers = [ + w for w in app.workers if w.name != "_database_tree_background_loader" + ] + if filtered_workers: + with suppress(WorkerCancelled): + await app.workers.wait_for_complete(filtered_workers) + + return wait_for_filtered_workers diff --git a/tests/functional_tests/test_app.py b/tests/functional_tests/test_app.py index 121708c3..9410087a 100644 --- a/tests/functional_tests/test_app.py +++ b/tests/functional_tests/test_app.py @@ -20,12 +20,14 @@ def transaction_button_visible(app: Harlequin) -> bool: @pytest.mark.asyncio async def test_select_1( - app_all_adapters: Harlequin, app_snapshot: Callable[..., Awaitable[bool]] + app_all_adapters: Harlequin, + app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: app = app_all_adapters messages: list[Message] = [] async with app.run_test(message_hook=messages.append) as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() assert app.title == "Harlequin" @@ -41,14 +43,14 @@ async def test_select_1( m for m in messages if isinstance(m, QuerySubmitted) ] assert query_submitted_message.query_text == q - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() [query_executed_message] = [ m for m in messages if isinstance(m, QueriesExecuted) ] assert query_executed_message.query_count == 1 assert query_executed_message.cursors - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() [results_fetched_message] = [ m for m in messages if isinstance(m, ResultsFetched) @@ -80,12 +82,13 @@ async def test_select_1( ) async def test_queries_do_not_crash_all_adapters( app_all_adapters: Harlequin, + wait_for_workers: Callable[[Harlequin], Awaitable[None]], query: str, ) -> None: app = app_all_adapters messages: list[Message] = [] async with app.run_test(message_hook=messages.append) as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() app.editor.text = query @@ -97,7 +100,7 @@ async def test_queries_do_not_crash_all_adapters( m for m in messages if isinstance(m, QuerySubmitted) ] assert query_submitted_message.query_text == query - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() [query_executed_message] = [ m for m in messages if isinstance(m, QueriesExecuted) @@ -105,7 +108,7 @@ async def test_queries_do_not_crash_all_adapters( assert query_executed_message.cursors if query and query != "select 1 where false": await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) table = app.results_viewer.get_visible_table() assert table is not None assert table.row_count >= 1 @@ -136,20 +139,23 @@ async def test_queries_do_not_crash_all_adapters( ], ) async def test_queries_do_not_crash( - app: Harlequin, query: str, app_snapshot: Callable[..., Awaitable[bool]] + app: Harlequin, + query: str, + app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: async with app.run_test() as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() app.editor.text = query await pilot.press("ctrl+a") await pilot.press("ctrl+j") - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() table = app.results_viewer.get_visible_table() assert table is not None @@ -158,13 +164,15 @@ async def test_queries_do_not_crash( @pytest.mark.asyncio async def test_multiple_queries( - app_all_adapters: Harlequin, app_snapshot: Callable[..., Awaitable[bool]] + app_all_adapters: Harlequin, + app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: app = app_all_adapters snap_results: list[bool] = [] messages: list[Message] = [] async with app.run_test(message_hook=messages.append) as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() q = "select 1; select 2" @@ -172,7 +180,7 @@ async def test_multiple_queries( await pilot.press("ctrl+j") # should only run one query - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() [query_submitted_message] = [ m for m in messages if isinstance(m, QuerySubmitted) @@ -182,7 +190,7 @@ async def test_multiple_queries( assert table assert table.row_count == table.source_row_count == 1 assert "hide-tabs" in app.results_viewer.classes - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.wait_for_scheduled_animations() snap_results.append(await app_snapshot(app, "One query")) @@ -190,7 +198,7 @@ async def test_multiple_queries( await pilot.press("ctrl+a") await pilot.press("ctrl+j") # should run both queries - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() await pilot.wait_for_scheduled_animations() [_, query_submitted_message] = [ @@ -199,7 +207,7 @@ async def test_multiple_queries( assert query_submitted_message.query_text == "select 1; select 2" assert app.results_viewer.tab_count == 2 assert "hide-tabs" not in app.results_viewer.classes - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.wait_for_scheduled_animations() snap_results.append(await app_snapshot(app, "Both queries")) assert app.results_viewer.active == "tab-2" @@ -223,11 +231,12 @@ async def test_multiple_queries( @pytest.mark.asyncio async def test_single_query_terminated_with_semicolon( app_all_adapters: Harlequin, + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: app = app_all_adapters messages: list[Message] = [] async with app.run_test(message_hook=messages.append) as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() q = "select 1; \n\t\n" @@ -235,7 +244,7 @@ async def test_single_query_terminated_with_semicolon( await pilot.press("ctrl+j") # should only run current query - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() [query_submitted_message] = [ m for m in messages if isinstance(m, QuerySubmitted) @@ -249,7 +258,7 @@ async def test_single_query_terminated_with_semicolon( # should not run whitespace query, even though included # in selection. - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() [_, query_submitted_message] = [ m for m in messages if isinstance(m, QuerySubmitted) @@ -262,7 +271,7 @@ async def test_single_query_terminated_with_semicolon( await pilot.press("ctrl+j") # should run previous query assert not app.editor.current_query - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() [*_, query_submitted_message] = [ m for m in messages if isinstance(m, QuerySubmitted) @@ -286,18 +295,19 @@ async def test_query_errors( app_all_adapters: Harlequin, bad_query: str, app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: app = app_all_adapters snap_results: list[bool] = [] async with app.run_test(size=(120, 36)) as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() app.editor.text = bad_query await pilot.press("ctrl+a") await pilot.press("ctrl+j") - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() assert len(app.screen_stack) == 2 assert isinstance(app.screen, ErrorModal) diff --git a/tests/functional_tests/test_data_catalog.py b/tests/functional_tests/test_data_catalog.py index e3a5521a..83ea2b75 100644 --- a/tests/functional_tests/test_data_catalog.py +++ b/tests/functional_tests/test_data_catalog.py @@ -7,6 +7,7 @@ from textual.geometry import Offset from harlequin import Harlequin +from harlequin.catalog import InteractiveCatalogItem from harlequin_duckdb.adapter import DuckDbAdapter @@ -32,19 +33,22 @@ def mock_boto3(monkeypatch: pytest.MonkeyPatch) -> None: mock_bucket.objects.filter.return_value = objects monkeypatch.setattr("harlequin.components.data_catalog.boto3", mock_boto3) + monkeypatch.setattr("harlequin.components.data_catalog.s3_tree.boto3", mock_boto3) @pytest.mark.asyncio async def test_data_catalog( app_multi_duck: Harlequin, app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], mock_pyperclip: MagicMock, ) -> None: snap_results: List[bool] = [] app = app_multi_duck async with app.run_test(size=(120, 36)) as pilot: - await app.workers.wait_for_complete() - await pilot.pause() + await wait_for_workers(app) + while app.editor is None: + await pilot.pause() catalog = app.data_catalog assert not catalog.database_tree.show_root snap_results.append(await app_snapshot(app, "Initialization")) @@ -61,6 +65,10 @@ async def test_data_catalog( assert dbs[0].is_expanded is False # the small db has two schemas, but you can't see them yet + # pause while the children are loaded + assert isinstance(dbs[0].data, InteractiveCatalogItem) + while not dbs[0].data.loaded: + await pilot.pause(0.1) assert len(dbs[0].children) == 2 assert all(not node.is_expanded for node in dbs[0].children) @@ -136,7 +144,8 @@ async def test_file_tree( show_files=test_dir, ) async with app.run_test(size=(120, 36)) as pilot: - await pilot.pause() + while app.editor is None: + await pilot.pause() catalog = app.data_catalog assert catalog.file_tree is not None @@ -158,6 +167,7 @@ async def test_file_tree( async def test_s3_tree( duckdb_adapter: Type[DuckDbAdapter], app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], mock_pyperclip: MagicMock, mock_boto3: None, ) -> None: @@ -167,8 +177,9 @@ async def test_s3_tree( show_s3="my-bucket", ) async with app.run_test(size=(120, 36)) as pilot: - await app.workers.wait_for_complete() - await pilot.pause() + await wait_for_workers(app) + while app.editor is None: + await pilot.pause() catalog = app.data_catalog assert catalog.s3_tree is not None @@ -193,12 +204,79 @@ async def test_s3_tree( async def test_s3_tree_does_not_crash_without_boto3( duckdb_adapter: Type[DuckDbAdapter], app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: app = Harlequin( duckdb_adapter((":memory:",)), show_s3="my-bucket", ) async with app.run_test(size=(120, 36)) as pilot: - await app.workers.wait_for_complete() - await pilot.pause() + await wait_for_workers(app) + while app.editor is None: + await pilot.pause() assert await app_snapshot(app, "Error visible") + + +@pytest.mark.asyncio +async def test_context_menu( + app_small_duck: Harlequin, + app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], +) -> None: + app = app_small_duck + snap_results: List[bool] = [] + async with app.run_test(size=(120, 36)) as pilot: + await wait_for_workers(app) + while app.editor is None: + await pilot.pause() + + # we need to expand the data catalog to load items into the completer + while ( + app.data_catalog.database_tree.loading + or not app.data_catalog.database_tree.root.children + ): + await pilot.pause() + for db_node in app.data_catalog.database_tree.root.children: + db_node.expand() + while not db_node.children: + if getattr(db_node.data, "loaded", True): + break + await pilot.pause() + for schema_node in db_node.children: + schema_node.expand() + + app.data_catalog.focus() + await pilot.press("full_stop") + await pilot.pause() + await wait_for_workers(app) + await pilot.pause() + await pilot.wait_for_scheduled_animations() + snap_results.append(await app_snapshot(app, "db context menu expanded")) + + await pilot.press("enter") + await pilot.pause() + await wait_for_workers(app) + await pilot.pause() + await pilot.wait_for_scheduled_animations() + snap_results.append(await app_snapshot(app, "db name inserted")) + + app.data_catalog.focus() + await pilot.press("down") + await pilot.press("full_stop") + await pilot.pause() + await wait_for_workers(app) + await pilot.pause() + await pilot.wait_for_scheduled_animations() + snap_results.append(await app_snapshot(app, "schema context menu expanded")) + + await pilot.press("escape") + await pilot.press("down") + await pilot.press("down") + await pilot.press("full_stop") + await pilot.pause() + await wait_for_workers(app) + await pilot.pause() + await pilot.wait_for_scheduled_animations() + snap_results.append(await app_snapshot(app, "table context menu expanded")) + + assert all(snap_results) diff --git a/tests/functional_tests/test_export.py b/tests/functional_tests/test_export.py index c256cc5b..b1d68619 100644 --- a/tests/functional_tests/test_export.py +++ b/tests/functional_tests/test_export.py @@ -29,19 +29,20 @@ async def test_export( tmp_path: Path, filename: str, app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: snap_results: List[bool] = [] async with app.run_test(size=(120, 36)) as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() app.editor.text = "select 1 as a" await pilot.press("ctrl+j") # run query - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() assert len(app.screen_stack) == 1 @@ -59,12 +60,12 @@ async def test_export( app.screen.file_input.value = str(export_path) # type: ignore await pilot.pause() await pilot.press("enter") - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() assert export_path.is_file() assert len(app.screen_stack) == 1 - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() snap_results.append(await app_snapshot(app, "After Export")) diff --git a/tests/functional_tests/test_help_screen.py b/tests/functional_tests/test_help_screen.py index 29e4155c..e52c344d 100644 --- a/tests/functional_tests/test_help_screen.py +++ b/tests/functional_tests/test_help_screen.py @@ -7,10 +7,12 @@ @pytest.mark.asyncio async def test_help_screen( - app: Harlequin, app_snapshot: Callable[..., Awaitable[bool]] + app: Harlequin, + app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: async with app.run_test(size=(120, 36)) as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() assert len(app.screen_stack) == 1 diff --git a/tests/functional_tests/test_history_screen.py b/tests/functional_tests/test_history_screen.py index 87ce4a81..ca07921a 100644 --- a/tests/functional_tests/test_history_screen.py +++ b/tests/functional_tests/test_history_screen.py @@ -27,6 +27,7 @@ def mock_time(monkeypatch: pytest.MonkeyPatch) -> None: async def test_history_screen( app: Harlequin, app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], mock_time: None, ) -> None: snap_results: list[bool] = [] @@ -40,12 +41,12 @@ async def test_history_screen( await pilot.pause() app.post_message(QuerySubmitted(query_text=q, limit=None)) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() # run a bad query app.post_message(QuerySubmitted(query_text="sel;", limit=None)) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() await pilot.press("space") @@ -64,6 +65,7 @@ async def test_history_screen( async def test_history_screen_crash( app: Harlequin, app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], mock_time: None, ) -> None: async with app.run_test() as pilot: @@ -72,7 +74,7 @@ async def test_history_screen_crash( await pilot.pause() app.post_message(QuerySubmitted(query_text=q, limit=None)) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() # https://github.com/tconbeer/harlequin/issues/485 diff --git a/tests/functional_tests/test_keymap_from_config.py b/tests/functional_tests/test_keymap_from_config.py index 2b998d8d..b2f4970e 100644 --- a/tests/functional_tests/test_keymap_from_config.py +++ b/tests/functional_tests/test_keymap_from_config.py @@ -2,6 +2,7 @@ from pathlib import Path from textwrap import dedent +from typing import Awaitable, Callable import pytest @@ -28,7 +29,9 @@ @pytest.mark.asyncio async def test_results_viewer_bindings( - duckdb_adapter: type[HarlequinAdapter], data_dir: Path + duckdb_adapter: type[HarlequinAdapter], + data_dir: Path, + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: config_path = ( data_dir / "functional_tests" / "test_keymap_from_config" / "config.toml" @@ -42,7 +45,7 @@ async def test_results_viewer_bindings( user_defined_keymaps=my_keymaps, ) async with app.run_test() as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() diff --git a/tests/functional_tests/test_keymap_vscode.py b/tests/functional_tests/test_keymap_vscode.py index d447ac35..781dd5f9 100644 --- a/tests/functional_tests/test_keymap_vscode.py +++ b/tests/functional_tests/test_keymap_vscode.py @@ -1,6 +1,7 @@ from __future__ import annotations from textwrap import dedent +from typing import Awaitable, Callable from unittest.mock import MagicMock import pytest @@ -27,9 +28,13 @@ @pytest.mark.asyncio -async def test_editor_bindings(app: Harlequin, mock_pyperclip: MagicMock) -> None: +async def test_editor_bindings( + app: Harlequin, + wait_for_workers: Callable[[Harlequin], Awaitable[None]], + mock_pyperclip: MagicMock, +) -> None: async with app.run_test() as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() @@ -163,10 +168,12 @@ async def test_editor_bindings(app: Harlequin, mock_pyperclip: MagicMock) -> Non @pytest.mark.asyncio async def test_results_viewer_bindings( - app: Harlequin, mock_pyperclip: MagicMock + app: Harlequin, + wait_for_workers: Callable[[Harlequin], Awaitable[None]], + mock_pyperclip: MagicMock, ) -> None: async with app.run_test() as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() diff --git a/tests/functional_tests/test_layout.py b/tests/functional_tests/test_layout.py index 72167b9f..2250f2c2 100644 --- a/tests/functional_tests/test_layout.py +++ b/tests/functional_tests/test_layout.py @@ -7,11 +7,13 @@ @pytest.mark.asyncio async def test_toggle_sidebar( - app: Harlequin, app_snapshot: Callable[..., Awaitable[bool]] + app: Harlequin, + app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: snap_results: List[bool] = [] async with app.run_test() as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None or app.data_catalog.database_tree.loading: await pilot.pause() # initialization @@ -44,11 +46,13 @@ async def test_toggle_sidebar( @pytest.mark.asyncio async def test_toggle_full_screen( - app: Harlequin, app_snapshot: Callable[..., Awaitable[bool]] + app: Harlequin, + app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: snap_results: List[bool] = [] async with app.run_test() as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() # initialization; all visible diff --git a/tests/functional_tests/test_query_editor.py b/tests/functional_tests/test_query_editor.py index a49ef359..35fa8799 100644 --- a/tests/functional_tests/test_query_editor.py +++ b/tests/functional_tests/test_query_editor.py @@ -17,9 +17,12 @@ def transaction_button_visible(app: Harlequin) -> bool: @pytest.mark.asyncio -async def test_query_formatting(app: Harlequin) -> None: +async def test_query_formatting( + app: Harlequin, + wait_for_workers: Callable[[Harlequin], Awaitable[None]], +) -> None: async with app.run_test() as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() app.editor.text = "select\n\n1 FROM\n\n foo" @@ -30,11 +33,13 @@ async def test_query_formatting(app: Harlequin) -> None: @pytest.mark.asyncio async def test_multiple_buffers( - app: Harlequin, app_snapshot: Callable[..., Awaitable[bool]] + app: Harlequin, + app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: snap_results: List[bool] = [] async with app.run_test(size=(120, 36)) as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() assert app.editor_collection @@ -115,51 +120,53 @@ async def test_multiple_buffers( ) @pytest.mark.asyncio async def test_word_autocomplete( - app_all_adapters: Harlequin, app_snapshot: Callable[..., Awaitable[bool]] + app_all_adapters: Harlequin, + app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: app = app_all_adapters snap_results: List[bool] = [] async with app.run_test() as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None or app.editor_collection.word_completer is None: await pilot.pause() await pilot.press("s") await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() await pilot.wait_for_scheduled_animations() snap_results.append(await app_snapshot(app, "s")) await pilot.press("e") await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() await pilot.wait_for_scheduled_animations() snap_results.append(await app_snapshot(app, "se")) await pilot.press("l") await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() await pilot.wait_for_scheduled_animations() snap_results.append(await app_snapshot(app, "sel")) await pilot.press("backspace") await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() await pilot.wait_for_scheduled_animations() snap_results.append(await app_snapshot(app, "se again")) await pilot.press("l") await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() await pilot.wait_for_scheduled_animations() await pilot.press("enter") await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() await pilot.wait_for_scheduled_animations() snap_results.append(await app_snapshot(app, "submitted")) @@ -173,12 +180,32 @@ async def test_word_autocomplete( ) @pytest.mark.asyncio async def test_member_autocomplete( - app_small_duck: Harlequin, app_snapshot: Callable[..., Awaitable[bool]] + app_small_duck: Harlequin, + app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: app = app_small_duck snap_results: List[bool] = [] async with app.run_test() as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) + + # we need to expand the data catalog to load items into the completer + while ( + app.data_catalog.database_tree.loading + or not app.data_catalog.database_tree.root.children + ): + await pilot.pause() + for db_node in app.data_catalog.database_tree.root.children: + db_node.expand() + while not db_node.children: + if getattr(db_node.data, "loaded", True): + break + await pilot.pause() + for schema_node in db_node.children: + schema_node.expand() + await pilot.pause(1) + + # now the completer should be populated while app.editor is None or app.editor_collection.member_completer is None: await pilot.pause() app.editor.text = '"drivers"' @@ -186,21 +213,21 @@ async def test_member_autocomplete( await pilot.press("full_stop") await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() await pilot.wait_for_scheduled_animations() snap_results.append(await app_snapshot(app, "driver members")) await pilot.press("quotation_mark") await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() await pilot.wait_for_scheduled_animations() snap_results.append(await app_snapshot(app, "with quote")) await pilot.press("enter") await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() await pilot.wait_for_scheduled_animations() snap_results.append(await app_snapshot(app, "submitted")) diff --git a/tests/functional_tests/test_results_viewer.py b/tests/functional_tests/test_results_viewer.py index b2389c58..f88cb86a 100644 --- a/tests/functional_tests/test_results_viewer.py +++ b/tests/functional_tests/test_results_viewer.py @@ -21,21 +21,23 @@ def transaction_button_visible(app: Harlequin) -> bool: @pytest.mark.asyncio async def test_dupe_column_names( - app_all_adapters: Harlequin, app_snapshot: Callable[..., Awaitable[bool]] + app_all_adapters: Harlequin, + app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: app = app_all_adapters query = "select 1 as a, 1 as a, 2 as a, 2 as a" async with app.run_test() as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() app.editor.text = query await pilot.press("ctrl+j") - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() if not transaction_button_visible(app): assert await app_snapshot(app, "dupe columns") @@ -45,6 +47,7 @@ async def test_dupe_column_names( async def test_copy_data( app_all_adapters: Harlequin, app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], mock_pyperclip: MagicMock, ) -> None: app = app_all_adapters @@ -52,16 +55,16 @@ async def test_copy_data( expected = "3 rosberg 6 ROS Nico Rosberg 1985-06-27 German http://en.wikipedia.org/wiki/Nico_Rosberg" messages: list[Message] = [] async with app.run_test(message_hook=messages.append) as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() app.editor.text = query await pilot.press("ctrl+j") - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() assert app.results_viewer._has_focus_within @@ -87,21 +90,23 @@ async def test_copy_data( @pytest.mark.asyncio async def test_data_truncated_with_tooltip( - app_all_adapters: Harlequin, app_snapshot: Callable[..., Awaitable[bool]] + app_all_adapters: Harlequin, + app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: app = app_all_adapters query = "select 'supercalifragilisticexpialidocious'" async with app.run_test(tooltips=True) as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() app.editor.text = query await pilot.press("ctrl+j") - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() await pilot.hover(ResultsViewer, (2, 2)) diff --git a/tests/functional_tests/test_run_query_bar.py b/tests/functional_tests/test_run_query_bar.py index 9d6fd493..565d806b 100644 --- a/tests/functional_tests/test_run_query_bar.py +++ b/tests/functional_tests/test_run_query_bar.py @@ -18,13 +18,15 @@ def transaction_button_visible(app: Harlequin) -> bool: @pytest.mark.asyncio async def test_run_query_bar( - app_all_adapters_small_db: Harlequin, app_snapshot: Callable[..., Awaitable[bool]] + app_all_adapters_small_db: Harlequin, + app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: app = app_all_adapters_small_db snap_results: list[bool] = [] messages: list[Message] = [] async with app.run_test(size=(120, 36), message_hook=messages.append) as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None: await pilot.pause() # initialization @@ -38,11 +40,11 @@ async def test_run_query_bar( assert app.editor is not None app.editor.text = "select * from drivers" await pilot.click("#run_query") - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() await pilot.wait_for_scheduled_animations() table = app.results_viewer.get_visible_table() @@ -55,11 +57,11 @@ async def test_run_query_bar( assert bar.limit_checkbox.value is True assert bar.limit_value == 500 await pilot.click("#run_query") - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() await pilot.wait_for_scheduled_animations() table = app.results_viewer.get_visible_table() @@ -90,11 +92,11 @@ async def test_run_query_bar( # run the query with a smaller limit await pilot.click("#run_query") - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() - await app.workers.wait_for_complete() + await wait_for_workers(app) await pilot.pause() await pilot.wait_for_scheduled_animations() table = app.results_viewer.get_visible_table() @@ -111,12 +113,14 @@ async def test_run_query_bar( ) @pytest.mark.asyncio async def test_transaction_button( - app_small_sqlite: Harlequin, app_snapshot: Callable[..., Awaitable[bool]] + app_small_sqlite: Harlequin, + app_snapshot: Callable[..., Awaitable[bool]], + wait_for_workers: Callable[[Harlequin], Awaitable[None]], ) -> None: app = app_small_sqlite snap_results: list[bool] = [] async with app.run_test(size=(120, 36)) as pilot: - await app.workers.wait_for_complete() + await wait_for_workers(app) while app.editor is None or app.connection is None: await pilot.pause() diff --git a/tests/unit_tests/test_s3_tree.py b/tests/unit_tests/test_s3_tree.py index d9a5d961..2e37bf65 100644 --- a/tests/unit_tests/test_s3_tree.py +++ b/tests/unit_tests/test_s3_tree.py @@ -2,7 +2,7 @@ import pytest -from harlequin.components.data_catalog import S3Tree +from harlequin.components.data_catalog.s3_tree import S3Tree @pytest.mark.parametrize(