From 4a5069a83fbb4778471efb5836fca422f1c494e9 Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Thu, 22 Aug 2024 20:28:22 +0000 Subject: [PATCH 01/21] wip: InteractiveCatalogItem type and duckdb impl --- src/harlequin/catalog.py | 65 ++++++++++- src/harlequin/driver.py | 37 ++++++ src/harlequin_duckdb/adapter.py | 8 ++ src/harlequin_duckdb/catalog.py | 169 +++++++++++++++++++++++++++ src/harlequin_duckdb/interactions.py | 24 ++++ 5 files changed, 297 insertions(+), 6 deletions(-) create mode 100644 src/harlequin/driver.py create mode 100644 src/harlequin_duckdb/catalog.py create mode 100644 src/harlequin_duckdb/interactions.py diff --git a/src/harlequin/catalog.py b/src/harlequin/catalog.py index d3d48987..ee97c79e 100644 --- a/src/harlequin/catalog.py +++ b/src/harlequin/catalog.py @@ -1,34 +1,87 @@ +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) + + +TAdapterConnection_contra = TypeVar( + "TAdapterConnection_contra", bound="HarlequinConnection", contravariant=True +) + + +class Interaction(Protocol[TAdapterConnection_contra]): + def __call__( + self, + item: "InteractiveCatalogItem", + connection: TAdapterConnection_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 + + def fetch_children( + self, connection: TAdapterConnection_contra + ) -> 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,7 +95,7 @@ class Catalog: a database object, like a database, schema, table, or column. """ - items: List[CatalogItem] + items: list[CatalogItem] class NewCatalog(Message): diff --git a/src/harlequin/driver.py b/src/harlequin/driver.py new file mode 100644 index 00000000..83c00fd6 --- /dev/null +++ b/src/harlequin/driver.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Callable + +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. + """ + + def __init__(self, app: Harlequin) -> None: + self.app = app + + def insert_text_at_cursor(self, text: str) -> None: ... + + def insert_text_in_new_buffer(self, text: str, run_query: bool = False) -> None: ... + + def show_confirmation( + self, callback: Callable[[None], None], instructions: str = "Are you sure?" + ) -> None: + """ + Display a confirmation modal in Harlequin; If the user selects "Proceed", + then Harlequin will invoke the callback. + """ + ... + + def notify(self, message: str, severity: "SeverityLevel" = "information") -> None: + """ + Show a toast notification in Harlequin + """ + self.app.notify(message=message, severity=severity) diff --git a/src/harlequin_duckdb/adapter.py b/src/harlequin_duckdb/adapter.py index a01f26a6..d14279e8 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 @@ -124,6 +125,13 @@ def cancel(self) -> None: self.conn.interrupt() def get_catalog(self) -> Catalog: + catalog_items: list[CatalogItem] = [] + databases = self._get_databases() + for (database_label,) in databases: + catalog_items.append(DatabaseCatalogItem.from_label(database_label)) + return Catalog(items=catalog_items) + + def get_catalog_old(self) -> Catalog: catalog_items: list[CatalogItem] = [] databases = self._get_databases() for (database,) in databases: diff --git a/src/harlequin_duckdb/catalog.py b/src/harlequin_duckdb/catalog.py new file mode 100644 index 00000000..942d6b68 --- /dev/null +++ b/src/harlequin_duckdb/catalog.py @@ -0,0 +1,169 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING + +from harlequin.catalog import InteractiveCatalogItem +from harlequin_duckdb.interactions import execute_use_statement + +if TYPE_CHECKING: + from harlequin_duckdb.adapter import DuckDbConnection + + +class ColumnCatalogItem(InteractiveCatalogItem): + @classmethod + def from_label( + cls, + label: str, + type_label: str, + relation_label: str, + schema_label: str, + database_label: str, + ) -> "ColumnCatalogItem": + column_query_name = f'"{label}"' + return cls( + qualified_identifier=( + f'"{database_label}"."{schema_label}"."{relation_label}"."{label}"' + ), + query_name=column_query_name, + label=label, + type_label=type_label, + ) + + +@dataclass +class RelationCatalogItem(InteractiveCatalogItem): + database_label: str = "" + schema_label: str = "" + + def fetch_children(self, connection: "DuckDbConnection") -> list[ColumnCatalogItem]: + result = connection._get_columns( + self.database_label, self.schema_label, self.label + ) + return [ + ColumnCatalogItem.from_label( + column_name, + connection._short_column_type(column_type), + self.label, + self.schema_label, + self.database_label, + ) + for column_name, column_type in result + ] + + +class ViewCatalogItem(RelationCatalogItem): + @classmethod + def from_label( + cls, label: str, schema_label: str, database_label: str + ) -> "ViewCatalogItem": + relation_query_name = f'"{schema_label}"."{label}"' + relation_qualified_identifier = f'"{database_label}".{relation_query_name}' + return cls( + qualified_identifier=relation_qualified_identifier, + query_name=relation_query_name, + label=label, + type_label="v", + database_label=database_label, + schema_label=schema_label, + ) + + +class TableCatalogItem(RelationCatalogItem): + @classmethod + def from_label( + cls, label: str, schema_label: str, database_label: str + ) -> "TableCatalogItem": + relation_query_name = f'"{schema_label}"."{label}"' + relation_qualified_identifier = f'"{database_label}".{relation_query_name}' + return cls( + qualified_identifier=relation_qualified_identifier, + query_name=relation_query_name, + label=label, + type_label="t", + database_label=database_label, + schema_label=schema_label, + ) + + +class TempTableCatalogItem(TableCatalogItem): + @classmethod + def from_label( + cls, label: str, schema_label: str, database_label: str + ) -> "TempTableCatalogItem": + relation_query_name = f'"{schema_label}"."{label}"' + relation_qualified_identifier = f'"{database_label}".{relation_query_name}' + return cls( + qualified_identifier=relation_qualified_identifier, + query_name=relation_query_name, + label=label, + type_label="tmp", + database_label=database_label, + schema_label=schema_label, + ) + + +@dataclass +class SchemaCatalogItem(InteractiveCatalogItem): + database_label: str = "" + + @classmethod + def from_label(cls, label: str, database_label: str) -> "SchemaCatalogItem": + schema_identifier = f'"{database_label}"."{label}"' + return cls( + qualified_identifier=schema_identifier, + query_name=schema_identifier, + label=label, + type_label="sch", + database_label=database_label, + ) + + def fetch_children( + self, connection: "DuckDbConnection" + ) -> list[RelationCatalogItem]: + children: list[RelationCatalogItem] = [] + result = connection._get_tables(self.database_label, self.label) + for table_label, table_type in result: + if table_type == "VIEW": + children.append( + ViewCatalogItem.from_label( + table_label, self.label, self.database_label + ) + ) + elif table_type == "LOCAL TEMPORARY": + children.append( + TempTableCatalogItem.from_label( + table_label, self.label, self.database_label + ) + ) + else: + children.append( + TableCatalogItem.from_label( + table_label, self.label, self.database_label + ) + ) + + return children + + +class DatabaseCatalogItem(InteractiveCatalogItem): + INTERACTIONS = [ + ("Switch Editor Context (USE)", execute_use_statement), + ] + + @classmethod + def from_label(cls, label: str) -> "DatabaseCatalogItem": + database_identifier = f'"{label}"' + return cls( + qualified_identifier=database_identifier, + query_name=database_identifier, + label=label, + type_label="db", + ) + + def fetch_children(self, connection: "DuckDbConnection") -> list[SchemaCatalogItem]: + schemas = connection._get_schemas(self.label) + return [ + SchemaCatalogItem.from_label(schema_label, self.qualified_identifier) + 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..875e0f5a --- /dev/null +++ b/src/harlequin_duckdb/interactions.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +from harlequin.catalog import InteractiveCatalogItem +from harlequin.exception import HarlequinQueryError + +if TYPE_CHECKING: + from harlequin.driver import HarlequinDriver + from harlequin_duckdb.adapter import DuckDbConnection + + +def execute_use_statement( + item: "InteractiveCatalogItem", + connection: "DuckDbConnection", + driver: "HarlequinDriver", +) -> None: + try: + 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}") From a3a7b7803107c0540c8ebf9c5da602fb7c78b4f9 Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Mon, 26 Aug 2024 21:09:43 +0000 Subject: [PATCH 02/21] feat: add context menu and driver impl --- CHANGELOG.md | 4 + src/harlequin/app.py | 115 ++++++++++++++++++- src/harlequin/app.tcss | 75 +++++++++++++ src/harlequin/catalog.py | 7 +- src/harlequin/components/confirm_modal.py | 34 ++++++ src/harlequin/components/data_catalog.py | 131 +++++++++++++++++++--- src/harlequin/driver.py | 54 +++++++-- src/harlequin_duckdb/catalog.py | 8 +- src/harlequin_duckdb/interactions.py | 20 ++++ 9 files changed, 417 insertions(+), 31 deletions(-) create mode 100644 src/harlequin/components/confirm_modal.py diff --git a/CHANGELOG.md b/CHANGELOG.md index c374fe5c..049aa453 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ 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). + ## [1.24.1] - 2024-09-25 ### Bug Fixes diff --git a/src/harlequin/app.py b/src/harlequin/app.py index 9ee6aee5..17feff12 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, @@ -39,7 +40,13 @@ from harlequin.app_base import AppBase from harlequin.autocomplete import completer_factory from harlequin.bindings import bind -from harlequin.catalog import Catalog, NewCatalog +from harlequin.catalog import ( + Catalog, + Interaction, + NewCatalog, + TAdapterConnection_contra, + TCatalogItem_contra, +) from harlequin.catalog_cache import ( CatalogCache, get_catalog_cache, @@ -57,7 +64,10 @@ RunQueryBar, export_callback, ) +from harlequin.components.confirm_modal import ConfirmModal +from harlequin.components.data_catalog import ContextMenu 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 ( @@ -199,6 +209,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",) @@ -390,6 +401,48 @@ 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 + self.post_message(message=message) + 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 + self.post_message(message=message) + 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(EditorCollection.EditorSwitched) def update_internal_editor_state( self, message: EditorCollection.EditorSwitched @@ -518,6 +571,19 @@ 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: + if self.connection is None: + return + self._execute_interaction( + interaction=message.interaction, + item=message.item, + connection=self.connection, + driver=self.harlequin_driver, + ) + @on(NewCatalog) def update_tree_and_completers(self, message: NewCatalog) -> None: self.catalog = message.catalog @@ -1096,6 +1162,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", + ) + def _execute_interaction( + self, + interaction: Interaction, + item: TCatalogItem_contra, + connection: TAdapterConnection_contra, + driver: HarlequinDriver, + ) -> None: + try: + interaction(item=item, connection=connection, 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..af4a7e0c 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,30 @@ DataCatalog * .directory-tree--hidden { color: $text-muted; } +DataCatalog ContextMenu { + layer: overlay; + display: none; + padding: 0 1; + margin: 0 0 0 3; + border: $border-color-nofocus vkey; + width: auto; + max-width: 100%; + max-height: 8; + background: $background-lighten-2 ; + &.open { + display: block; + } + &:focus{ + border: $border-color-focus vkey; + } + &>.option-list--option-highlighted { + color: $text; + background: $secondary; + text-style: bold; + } +} + + /* RIGHT HAND CONTAINER */ #main_panel { width: 3fr; @@ -553,3 +578,53 @@ 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 4; + padding: 1 2; + height: auto; + max-height: 30; + max-width: 88; +} + +ConfirmModal Label { + +} + +ConfirmModal Horizontal#button_row { + height: auto; + align: center bottom; + margin: 2 0 1 0; +} + +ConfirmModal Horizontal#button_row Button { + background: $primary; + height: 3; + margin: 0 6; + 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/catalog.py b/src/harlequin/catalog.py index ee97c79e..c768a148 100644 --- a/src/harlequin/catalog.py +++ b/src/harlequin/catalog.py @@ -41,15 +41,18 @@ class CatalogItem: 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[TAdapterConnection_contra]): +class Interaction(Protocol[TCatalogItem_contra, TAdapterConnection_contra]): def __call__( self, - item: "InteractiveCatalogItem", + item: TCatalogItem_contra, connection: TAdapterConnection_contra, driver: "HarlequinDriver", ) -> None: ... 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 index 6637ed92..fe09e36a 100644 --- a/src/harlequin/components/data_catalog.py +++ b/src/harlequin/components/data_catalog.py @@ -1,7 +1,7 @@ from __future__ import annotations from pathlib import Path -from typing import ClassVar, Generic, List, Set, Tuple, Union +from typing import TYPE_CHECKING, ClassVar, Generic, List, Sequence, Set, Tuple, Union from urllib.parse import urlsplit from rich.text import TextType @@ -11,6 +11,7 @@ from textual.message import Message from textual.widgets import ( DirectoryTree, + OptionList, TabbedContent, TabPane, Tabs, @@ -20,16 +21,83 @@ from textual.widgets._tree import EventTreeDataType, TreeNode from textual.worker import Worker, WorkerState -from harlequin.catalog import Catalog, CatalogItem +from harlequin.catalog import Catalog, CatalogItem, InteractiveCatalogItem from harlequin.catalog_cache import CatalogCache, recursive_dict from harlequin.messages import WidgetMounted +if TYPE_CHECKING: + from harlequin.adapter import HarlequinConnection + 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, connection: "HarlequinConnection", driver: HarlequinDriver +) -> None: + driver.insert_text_at_selection(text=item.query_name) + + +class ContextMenu(OptionList): + # TODO: BINDINGS! + + 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(label) + + self.styles.offset = (0, node.line + 1) + 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 action_hide(self) -> None: + self.remove_class("open") + + class DataCatalog(TabbedContent, can_focus=True): BORDER_TITLE = "Data Catalog" @@ -71,6 +139,14 @@ def __init__(self, catalog_type: str, error: BaseException) -> None: self.error = error super().__init__() + class ShowContextMenu(Message): + def __init__(self, node: TreeNode) -> None: + self.node = node + super().__init__() + + class HideContextMenu(Message): + pass + def __init__( self, *titles: TextType, @@ -97,7 +173,10 @@ def __init__( def on_mount(self) -> None: self.database_tree = DatabaseTree(type_color=self.type_color) - self.add_pane(TabPane("Databases", self.database_tree)) + 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)) @@ -139,6 +218,16 @@ def on_focus(self) -> None: def focus_on_widget_in_active_pane(self) -> None: self.focus() + @on(HideContextMenu) + def hide_context_menu(self, event: HideContextMenu) -> None: + event.stop() + self.database_context_menu.remove_class("open") + + @on(ShowContextMenu) + def load_interactions_and_show_context_menu(self, event: ShowContextMenu) -> None: + event.stop() + self.database_context_menu.reload(node=event.node) + def update_database_tree(self, catalog: Catalog) -> None: self.database_tree.update_tree(catalog) @@ -189,21 +278,29 @@ class HarlequinTree(Tree, inherit_bindings=False): 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() + if event.button == 1: # left button click + self.post_message(DataCatalog.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(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", + ) + 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: - 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" - ) + if node is not None and isinstance(node.data, CatalogItem): + self.post_message(DataCatalog.ShowContextMenu(node=node)) def _clear_double_click(self) -> None: self.double_click = None diff --git a/src/harlequin/driver.py b/src/harlequin/driver.py index 83c00fd6..c1692b8e 100644 --- a/src/harlequin/driver.py +++ b/src/harlequin/driver.py @@ -2,6 +2,8 @@ from typing import TYPE_CHECKING, Callable +from textual.message import Message + if TYPE_CHECKING: from textual.notifications import SeverityLevel @@ -11,27 +13,61 @@ class HarlequinDriver: """ Provides an interface for Data Catalog interactions to drive - the Harlequin UI. + the Harlequin UI. These will always be called from worker + threads, so they use Messages to update the main Harlequin + state. """ + 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 ConfirmAndExecute(Message): + def __init__(self, callback: Callable[[], None], instructions: str) -> None: + super().__init__() + self.callback = callback + self.instructions = instructions + + class Notify(Message): + def __init__(self, notify_message: str, severity: "SeverityLevel") -> None: + super().__init__() + self.notify_message = notify_message + self.severity = severity + def __init__(self, app: Harlequin) -> None: self.app = app - def insert_text_at_cursor(self, text: str) -> None: ... + 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, run_query: bool = False) -> None: ... + async 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 show_confirmation( - self, callback: Callable[[None], None], instructions: str = "Are you sure?" + def confirm_and_execute( + self, callback: Callable[[], None], instructions: str = "Are you sure?" ) -> None: """ - Display a confirmation modal in Harlequin; If the user selects "Proceed", + 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 + Show a toast notification in Harlequin. """ - self.app.notify(message=message, severity=severity) + self.app.post_message(self.Notify(notify_message=message, severity=severity)) diff --git a/src/harlequin_duckdb/catalog.py b/src/harlequin_duckdb/catalog.py index 942d6b68..59d91cb7 100644 --- a/src/harlequin_duckdb/catalog.py +++ b/src/harlequin_duckdb/catalog.py @@ -4,7 +4,10 @@ from typing import TYPE_CHECKING from harlequin.catalog import InteractiveCatalogItem -from harlequin_duckdb.interactions import execute_use_statement +from harlequin_duckdb.interactions import ( + execute_drop_database_statement, + execute_use_statement, +) if TYPE_CHECKING: from harlequin_duckdb.adapter import DuckDbConnection @@ -146,9 +149,10 @@ def fetch_children( return children -class DatabaseCatalogItem(InteractiveCatalogItem): +class DatabaseCatalogItem(InteractiveCatalogItem["DuckDbConnection"]): INTERACTIONS = [ ("Switch Editor Context (USE)", execute_use_statement), + ("Drop Database", execute_drop_database_statement), ] @classmethod diff --git a/src/harlequin_duckdb/interactions.py b/src/harlequin_duckdb/interactions.py index 875e0f5a..bf7f1832 100644 --- a/src/harlequin_duckdb/interactions.py +++ b/src/harlequin_duckdb/interactions.py @@ -22,3 +22,23 @@ def execute_use_statement( raise else: driver.notify(f"Editor context switched to {item.label}") + + +def execute_drop_database_statement( + item: "InteractiveCatalogItem", + connection: "DuckDbConnection", + driver: "HarlequinDriver", +) -> None: + def _drop_database() -> None: + try: + connection.execute(f"drop database {item.qualified_identifier}") + except HarlequinQueryError: + driver.notify("Could not drop database", severity="error") + raise + else: + driver.notify(f"Dropped database {item.label}") + + if item.children or item.fetch_children(connection=connection): + driver.confirm_and_execute(callback=_drop_database) + else: + _drop_database() From f26b3e17301079979662af57fb917f175cf790d0 Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Mon, 26 Aug 2024 21:22:23 +0000 Subject: [PATCH 03/21] feat: add bindings for showing/hiding context menu --- .pre-commit-config.yaml | 2 +- CHANGELOG.md | 5 +++++ src/harlequin/actions.py | 5 +++++ src/harlequin/components/data_catalog.py | 14 ++++++++++++-- src/harlequin_vscode/__init__.py | 2 ++ 5 files changed, 25 insertions(+), 3 deletions(-) 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 049aa453..3ca5ad89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,11 @@ All notable changes to this project will be documented in this file. - 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). +### Performance + +- 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. + + ## [1.24.1] - 2024-09-25 ### Bug Fixes 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/components/data_catalog.py b/src/harlequin/components/data_catalog.py index fe09e36a..42083bc2 100644 --- a/src/harlequin/components/data_catalog.py +++ b/src/harlequin/components/data_catalog.py @@ -43,8 +43,6 @@ def insert_name_at_cursor( class ContextMenu(OptionList): - # TODO: BINDINGS! - class ExecuteInteraction(Message): def __init__(self, interaction: "Interaction", item: CatalogItem) -> None: self.interaction = interaction @@ -94,6 +92,9 @@ def execute_interaction(self, event: OptionList.OptionSelected) -> None: ) self.remove_class("open") + def on_blur(self) -> None: + self.action_hide() + def action_hide(self) -> None: self.remove_class("open") @@ -313,6 +314,15 @@ def action_copy(self) -> None: if self.cursor_node is not None: self.post_message(DataCatalog.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(DataCatalog.ShowContextMenu(node=self.cursor_node)) + + def action_hide_context_menu(self) -> None: + self.post_message(DataCatalog.HideContextMenu()) + class DatabaseTree(HarlequinTree, Tree[CatalogItem], inherit_bindings=False): def __init__( 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"), From cae0815d4cb2baa2f532913619b506a2e3b9f646 Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Wed, 28 Aug 2024 20:47:15 +0000 Subject: [PATCH 04/21] refactor: add connection to catalogitem; improve duckdb impl --- src/harlequin/app.py | 7 +- src/harlequin/catalog.py | 8 +- src/harlequin/components/data_catalog.py | 13 +-- src/harlequin_duckdb/adapter.py | 4 +- src/harlequin_duckdb/catalog.py | 141 +++++++++++++---------- src/harlequin_duckdb/interactions.py | 13 ++- 6 files changed, 102 insertions(+), 84 deletions(-) diff --git a/src/harlequin/app.py b/src/harlequin/app.py index 17feff12..48d1091a 100644 --- a/src/harlequin/app.py +++ b/src/harlequin/app.py @@ -44,7 +44,6 @@ Catalog, Interaction, NewCatalog, - TAdapterConnection_contra, TCatalogItem_contra, ) from harlequin.catalog_cache import ( @@ -575,12 +574,9 @@ def handle_data_load_error(self, message: DataTable.DataLoadError) -> None: def execute_interaction_in_thread( self, message: ContextMenu.ExecuteInteraction ) -> None: - if self.connection is None: - return self._execute_interaction( interaction=message.interaction, item=message.item, - connection=self.connection, driver=self.harlequin_driver, ) @@ -1172,11 +1168,10 @@ def _execute_interaction( self, interaction: Interaction, item: TCatalogItem_contra, - connection: TAdapterConnection_contra, driver: HarlequinDriver, ) -> None: try: - interaction(item=item, connection=connection, driver=driver) + interaction(item=item, driver=driver) except Exception as e: self.call_from_thread( self._push_error_modal, diff --git a/src/harlequin/catalog.py b/src/harlequin/catalog.py index c768a148..903f64ac 100644 --- a/src/harlequin/catalog.py +++ b/src/harlequin/catalog.py @@ -49,11 +49,10 @@ class CatalogItem: ) -class Interaction(Protocol[TCatalogItem_contra, TAdapterConnection_contra]): +class Interaction(Protocol[TCatalogItem_contra]): def __call__( self, item: TCatalogItem_contra, - connection: TAdapterConnection_contra, driver: "HarlequinDriver", ) -> None: ... @@ -74,11 +73,10 @@ class InteractiveCatalogItem(CatalogItem, Generic[TAdapterConnection_contra]): a confirmation modal, and display a notification (toast). """ + connection: TAdapterConnection_contra | None = None INTERACTIONS: ClassVar[Sequence[tuple[str, Interaction]] | None] = None - def fetch_children( - self, connection: TAdapterConnection_contra - ) -> Sequence[CatalogItem]: + 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 diff --git a/src/harlequin/components/data_catalog.py b/src/harlequin/components/data_catalog.py index 42083bc2..057ccf24 100644 --- a/src/harlequin/components/data_catalog.py +++ b/src/harlequin/components/data_catalog.py @@ -26,7 +26,6 @@ from harlequin.messages import WidgetMounted if TYPE_CHECKING: - from harlequin.adapter import HarlequinConnection from harlequin.catalog import Interaction from harlequin.driver import HarlequinDriver @@ -36,9 +35,7 @@ boto3 = None # type: ignore -def insert_name_at_cursor( - item: CatalogItem, connection: "HarlequinConnection", driver: HarlequinDriver -) -> None: +def insert_name_at_cursor(item: CatalogItem, driver: HarlequinDriver) -> None: driver.insert_text_at_selection(text=item.query_name) @@ -152,9 +149,9 @@ def __init__( self, *titles: TextType, initial: str = "", - name: Union[str, None] = None, - id: Union[str, None] = None, # noqa: A002 - classes: Union[str, None] = None, + 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, @@ -368,6 +365,8 @@ def _build_subtree( expanded_nodes: Set[str], ) -> None: for item in items: + if isinstance(item, InteractiveCatalogItem): + item.children = list(item.fetch_children()) if item.children: new_node = parent.add( label=self._build_item_label(item.label, item.type_label), diff --git a/src/harlequin_duckdb/adapter.py b/src/harlequin_duckdb/adapter.py index d14279e8..77965f82 100644 --- a/src/harlequin_duckdb/adapter.py +++ b/src/harlequin_duckdb/adapter.py @@ -128,7 +128,9 @@ def get_catalog(self) -> Catalog: catalog_items: list[CatalogItem] = [] databases = self._get_databases() for (database_label,) in databases: - catalog_items.append(DatabaseCatalogItem.from_label(database_label)) + catalog_items.append( + DatabaseCatalogItem.from_label(label=database_label, connection=self) + ) return Catalog(items=catalog_items) def get_catalog_old(self) -> Catalog: diff --git a/src/harlequin_duckdb/catalog.py b/src/harlequin_duckdb/catalog.py index 59d91cb7..55311a3b 100644 --- a/src/harlequin_duckdb/catalog.py +++ b/src/harlequin_duckdb/catalog.py @@ -13,43 +13,44 @@ from harlequin_duckdb.adapter import DuckDbConnection -class ColumnCatalogItem(InteractiveCatalogItem): +@dataclass +class ColumnCatalogItem(InteractiveCatalogItem[DuckDbConnection]): + parent: "RelationCatalogItem" | None = None + @classmethod - def from_label( + def from_parent( cls, + parent: "RelationCatalogItem", label: str, type_label: str, - relation_label: str, - schema_label: str, - database_label: str, ) -> "ColumnCatalogItem": + column_qualified_identifier = f'{parent.qualified_identifier}."{label}"' column_query_name = f'"{label}"' return cls( - qualified_identifier=( - f'"{database_label}"."{schema_label}"."{relation_label}"."{label}"' - ), + qualified_identifier=column_qualified_identifier, query_name=column_query_name, label=label, type_label=type_label, + connection=parent.connection, + parent=parent, ) @dataclass -class RelationCatalogItem(InteractiveCatalogItem): - database_label: str = "" - schema_label: str = "" - - def fetch_children(self, connection: "DuckDbConnection") -> list[ColumnCatalogItem]: - result = connection._get_columns( - self.database_label, self.schema_label, self.label +class RelationCatalogItem(InteractiveCatalogItem[DuckDbConnection]): + 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_label( - column_name, - connection._short_column_type(column_type), - self.label, - self.schema_label, - self.database_label, + ColumnCatalogItem.from_parent( + parent=self, + label=column_name, + type_label=self.connection._short_column_type(column_type), ) for column_name, column_type in result ] @@ -57,117 +58,139 @@ def fetch_children(self, connection: "DuckDbConnection") -> list[ColumnCatalogIt class ViewCatalogItem(RelationCatalogItem): @classmethod - def from_label( - cls, label: str, schema_label: str, database_label: str + def from_parent( + cls, + parent: "SchemaCatalogItem", + label: str, ) -> "ViewCatalogItem": - relation_query_name = f'"{schema_label}"."{label}"' - relation_qualified_identifier = f'"{database_label}".{relation_query_name}' + 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", - database_label=database_label, - schema_label=schema_label, + connection=parent.connection, + parent=parent, ) class TableCatalogItem(RelationCatalogItem): @classmethod - def from_label( - cls, label: str, schema_label: str, database_label: str + def from_parent( + cls, + parent: "SchemaCatalogItem", + label: str, ) -> "TableCatalogItem": - relation_query_name = f'"{schema_label}"."{label}"' - relation_qualified_identifier = f'"{database_label}".{relation_query_name}' + 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", - database_label=database_label, - schema_label=schema_label, + connection=parent.connection, + parent=parent, ) class TempTableCatalogItem(TableCatalogItem): @classmethod - def from_label( - cls, label: str, schema_label: str, database_label: str + def from_parent( + cls, + parent: "SchemaCatalogItem", + label: str, ) -> "TempTableCatalogItem": - relation_query_name = f'"{schema_label}"."{label}"' - relation_qualified_identifier = f'"{database_label}".{relation_query_name}' + 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", - database_label=database_label, - schema_label=schema_label, + connection=parent.connection, + parent=parent, ) @dataclass -class SchemaCatalogItem(InteractiveCatalogItem): - database_label: str = "" +class SchemaCatalogItem(InteractiveCatalogItem[DuckDbConnection]): + parent: "DatabaseCatalogItem" | None = None @classmethod - def from_label(cls, label: str, database_label: str) -> "SchemaCatalogItem": - schema_identifier = f'"{database_label}"."{label}"' + 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", - database_label=database_label, + connection=parent.connection, + parent=parent, ) - def fetch_children( - self, connection: "DuckDbConnection" - ) -> list[RelationCatalogItem]: + def fetch_children(self) -> list[RelationCatalogItem]: + if self.parent is None or self.connection is None: + return [] children: list[RelationCatalogItem] = [] - result = connection._get_tables(self.database_label, self.label) + 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_label( - table_label, self.label, self.database_label + ViewCatalogItem.from_parent( + parent=self, + label=table_label, ) ) elif table_type == "LOCAL TEMPORARY": children.append( - TempTableCatalogItem.from_label( - table_label, self.label, self.database_label + TempTableCatalogItem.from_parent( + parent=self, + label=table_label, ) ) else: children.append( - TableCatalogItem.from_label( - table_label, self.label, self.database_label + TableCatalogItem.from_parent( + parent=self, + label=table_label, ) ) return children -class DatabaseCatalogItem(InteractiveCatalogItem["DuckDbConnection"]): +class DatabaseCatalogItem(InteractiveCatalogItem[DuckDbConnection]): INTERACTIONS = [ ("Switch Editor Context (USE)", execute_use_statement), ("Drop Database", execute_drop_database_statement), ] @classmethod - def from_label(cls, label: str) -> "DatabaseCatalogItem": + 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, connection: "DuckDbConnection") -> list[SchemaCatalogItem]: - schemas = connection._get_schemas(self.label) + def fetch_children(self) -> list[SchemaCatalogItem]: + if self.connection is None: + return [] + schemas = self.connection._get_schemas(self.label) return [ - SchemaCatalogItem.from_label(schema_label, self.qualified_identifier) + 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 index bf7f1832..d55ea3a4 100644 --- a/src/harlequin_duckdb/interactions.py +++ b/src/harlequin_duckdb/interactions.py @@ -7,16 +7,16 @@ if TYPE_CHECKING: from harlequin.driver import HarlequinDriver - from harlequin_duckdb.adapter import DuckDbConnection def execute_use_statement( item: "InteractiveCatalogItem", - connection: "DuckDbConnection", driver: "HarlequinDriver", ) -> None: + if item.connection is None: + return try: - connection.execute(f"use {item.qualified_identifier}") + item.connection.execute(f"use {item.qualified_identifier}") except HarlequinQueryError: driver.notify("Could not switch context", severity="error") raise @@ -26,19 +26,20 @@ def execute_use_statement( def execute_drop_database_statement( item: "InteractiveCatalogItem", - connection: "DuckDbConnection", driver: "HarlequinDriver", ) -> None: def _drop_database() -> None: + if item.connection is None: + return try: - connection.execute(f"drop database {item.qualified_identifier}") + item.connection.execute(f"drop database {item.qualified_identifier}") except HarlequinQueryError: driver.notify("Could not drop database", severity="error") raise else: driver.notify(f"Dropped database {item.label}") - if item.children or item.fetch_children(connection=connection): + if item.children or item.fetch_children(): driver.confirm_and_execute(callback=_drop_database) else: _drop_database() From de3f985b28c1c80218e2521d02040842573acdba Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Wed, 28 Aug 2024 21:08:23 +0000 Subject: [PATCH 05/21] fix: move data_catalog.py; fix runtime errors --- src/harlequin/catalog_cache.py | 8 ++++---- .../{data_catalog.py => data_catalog/__init__.py} | 0 src/harlequin_duckdb/catalog.py | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) rename src/harlequin/components/{data_catalog.py => data_catalog/__init__.py} (100%) 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/data_catalog.py b/src/harlequin/components/data_catalog/__init__.py similarity index 100% rename from src/harlequin/components/data_catalog.py rename to src/harlequin/components/data_catalog/__init__.py diff --git a/src/harlequin_duckdb/catalog.py b/src/harlequin_duckdb/catalog.py index 55311a3b..ac917080 100644 --- a/src/harlequin_duckdb/catalog.py +++ b/src/harlequin_duckdb/catalog.py @@ -14,7 +14,7 @@ @dataclass -class ColumnCatalogItem(InteractiveCatalogItem[DuckDbConnection]): +class ColumnCatalogItem(InteractiveCatalogItem["DuckDbConnection"]): parent: "RelationCatalogItem" | None = None @classmethod @@ -37,7 +37,7 @@ def from_parent( @dataclass -class RelationCatalogItem(InteractiveCatalogItem[DuckDbConnection]): +class RelationCatalogItem(InteractiveCatalogItem["DuckDbConnection"]): parent: "SchemaCatalogItem" | None = None def fetch_children(self) -> list[ColumnCatalogItem]: @@ -114,7 +114,7 @@ def from_parent( @dataclass -class SchemaCatalogItem(InteractiveCatalogItem[DuckDbConnection]): +class SchemaCatalogItem(InteractiveCatalogItem["DuckDbConnection"]): parent: "DatabaseCatalogItem" | None = None @classmethod @@ -164,7 +164,7 @@ def fetch_children(self) -> list[RelationCatalogItem]: return children -class DatabaseCatalogItem(InteractiveCatalogItem[DuckDbConnection]): +class DatabaseCatalogItem(InteractiveCatalogItem["DuckDbConnection"]): INTERACTIONS = [ ("Switch Editor Context (USE)", execute_use_statement), ("Drop Database", execute_drop_database_statement), From 8aac2eda872af505ba1dc7f67b3f5eadbbfae527 Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Wed, 28 Aug 2024 21:42:42 +0000 Subject: [PATCH 06/21] refactor: split tree classes into different modules --- src/harlequin/app.py | 13 +- .../components/data_catalog/__init__.py | 372 +----------------- .../components/data_catalog/database_tree.py | 86 ++++ .../components/data_catalog/file_tree.py | 24 ++ .../components/data_catalog/s3_tree.py | 193 +++++++++ src/harlequin/components/data_catalog/tree.py | 112 ++++++ tests/unit_tests/test_s3_tree.py | 2 +- 7 files changed, 437 insertions(+), 365 deletions(-) create mode 100644 src/harlequin/components/data_catalog/database_tree.py create mode 100644 src/harlequin/components/data_catalog/file_tree.py create mode 100644 src/harlequin/components/data_catalog/s3_tree.py create mode 100644 src/harlequin/components/data_catalog/tree.py diff --git a/src/harlequin/app.py b/src/harlequin/app.py index 48d1091a..e2cec37a 100644 --- a/src/harlequin/app.py +++ b/src/harlequin/app.py @@ -65,6 +65,7 @@ ) 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 @@ -371,8 +372,8 @@ 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 @@ -381,8 +382,8 @@ def insert_node_into_editor(self, message: DataCatalog.NodeSubmitted) -> None: 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 @@ -539,8 +540,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", diff --git a/src/harlequin/components/data_catalog/__init__.py b/src/harlequin/components/data_catalog/__init__.py index 057ccf24..48a8df81 100644 --- a/src/harlequin/components/data_catalog/__init__.py +++ b/src/harlequin/components/data_catalog/__init__.py @@ -1,13 +1,11 @@ from __future__ import annotations from pathlib import Path -from typing import TYPE_CHECKING, ClassVar, Generic, List, Sequence, Set, Tuple, Union -from urllib.parse import urlsplit +from typing import TYPE_CHECKING, ClassVar, Sequence from rich.text import TextType -from textual import on, work +from textual import on from textual.css.query import NoMatches -from textual.events import Click from textual.message import Message from textual.widgets import ( DirectoryTree, @@ -15,14 +13,14 @@ 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 textual.widgets._tree import TreeNode from harlequin.catalog import Catalog, CatalogItem, InteractiveCatalogItem -from harlequin.catalog_cache import CatalogCache, recursive_dict +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: @@ -99,52 +97,6 @@ def action_hide(self) -> None: 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__() - - class ShowContextMenu(Message): - def __init__(self, node: TreeNode) -> None: - self.node = node - super().__init__() - - class HideContextMenu(Message): - pass - def __init__( self, *titles: TextType, @@ -186,7 +138,7 @@ def on_mount(self) -> None: self.add_pane(TabPane("S3", self.s3_tree)) elif self.show_s3 is not None and boto3 is None: self.post_message( - DataCatalog.CatalogError( + S3Tree.CatalogError( catalog_type="s3", error=Exception( "Could not load s3 catalog because boto3 is not available.\n\n" @@ -216,13 +168,15 @@ def on_focus(self) -> None: def focus_on_widget_in_active_pane(self) -> None: self.focus() - @on(HideContextMenu) - def hide_context_menu(self, event: HideContextMenu) -> None: + @on(HarlequinTree.HideContextMenu) + def hide_context_menu(self, event: HarlequinTree.HideContextMenu) -> None: event.stop() self.database_context_menu.remove_class("open") - @on(ShowContextMenu) - def load_interactions_and_show_context_menu(self, event: ShowContextMenu) -> None: + @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) @@ -270,132 +224,6 @@ def action_focus_query_editor(self) -> None: 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 event.button == 1: # left button click - self.post_message(DataCatalog.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(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", - ) - 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(DataCatalog.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(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)) - - def action_show_context_menu(self) -> None: - if self.cursor_node is not None and isinstance( - self.cursor_node.data, CatalogItem - ): - self.post_message(DataCatalog.ShowContextMenu(node=self.cursor_node)) - - def action_hide_context_menu(self) -> None: - self.post_message(DataCatalog.HideContextMenu()) - - -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 isinstance(item, InteractiveCatalogItem): - item.children = list(item.fetch_children()) - 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", @@ -408,175 +236,3 @@ 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/database_tree.py b/src/harlequin/components/data_catalog/database_tree.py new file mode 100644 index 00000000..5a02ece4 --- /dev/null +++ b/src/harlequin/components/data_catalog/database_tree.py @@ -0,0 +1,86 @@ +from __future__ import annotations + +from asyncio import Queue +from typing import List, Set, Tuple, Union + +from textual.widgets._tree import TreeNode + +from harlequin.catalog import Catalog, CatalogItem, InteractiveCatalogItem +from harlequin.components.data_catalog.tree import HarlequinTree +from harlequin.messages import WidgetMounted + + +class DatabaseTree(HarlequinTree[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._load_queue: Queue[TreeNode[CatalogItem]] = Queue() + 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 isinstance(item, InteractiveCatalogItem): + item.children = list(item.fetch_children()) + 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 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..f178aab7 --- /dev/null +++ b/src/harlequin/components/data_catalog/tree.py @@ -0,0 +1,112 @@ +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 + + 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/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( From 58e370f2f4d35f830f2e152022e5b3dca4050bc7 Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Thu, 29 Aug 2024 21:16:11 +0000 Subject: [PATCH 07/21] feat: add lazy-loading for catalogs, with DuckDB impl --- CHANGELOG.md | 7 +- src/harlequin/catalog.py | 7 +- .../components/data_catalog/__init__.py | 2 +- .../components/data_catalog/database_tree.py | 351 +++++++++++++++--- src/harlequin_duckdb/catalog.py | 1 + 5 files changed, 312 insertions(+), 56 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ca5ad89..b4662951 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,10 @@ All notable changes to this project will be documented in this file. ### 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). +- 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. -### Performance - -- 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. ## [1.24.1] - 2024-09-25 diff --git a/src/harlequin/catalog.py b/src/harlequin/catalog.py index 903f64ac..76f895c2 100644 --- a/src/harlequin/catalog.py +++ b/src/harlequin/catalog.py @@ -73,8 +73,13 @@ class InteractiveCatalogItem(CatalogItem, Generic[TAdapterConnection_contra]): a confirmation modal, and display a notification (toast). """ - connection: TAdapterConnection_contra | None = None 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]: """ diff --git a/src/harlequin/components/data_catalog/__init__.py b/src/harlequin/components/data_catalog/__init__.py index 48a8df81..4226f6b0 100644 --- a/src/harlequin/components/data_catalog/__init__.py +++ b/src/harlequin/components/data_catalog/__init__.py @@ -181,7 +181,7 @@ def load_interactions_and_show_context_menu( self.database_context_menu.reload(node=event.node) def update_database_tree(self, catalog: Catalog) -> None: - self.database_tree.update_tree(catalog) + self.database_tree.catalog = catalog def update_file_tree(self) -> None: if self.file_tree is not None: diff --git a/src/harlequin/components/data_catalog/database_tree.py b/src/harlequin/components/data_catalog/database_tree.py index 5a02ece4..d61ee9a1 100644 --- a/src/harlequin/components/data_catalog/database_tree.py +++ b/src/harlequin/components/data_catalog/database_tree.py @@ -1,43 +1,56 @@ from __future__ import annotations -from asyncio import Queue -from typing import List, Set, Tuple, Union +from asyncio import PriorityQueue +from pathlib import Path +from typing import TYPE_CHECKING, Generator, Iterable, TypeVar -from textual.widgets._tree import TreeNode +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 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", - data: CatalogItem | None = None, name: str | None = None, id: str | None = None, # noqa: A002 classes: str | None = None, disabled: bool = False, ) -> None: - self._load_queue: Queue[TreeNode[CatalogItem]] = Queue() + self._load_queue: PriorityQueue[ + tuple[int, TreeNode[InteractiveCatalogItem]] + ] = PriorityQueue() self.type_color = type_color super().__init__( - "Root", data, name=name, id=id, classes=classes, disabled=disabled + label="Root", + data=CatalogItem( + qualified_identifier="__root__", + query_name="", + label="Root", + type_label="", + children=[], + ), + 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 @@ -48,39 +61,277 @@ def on_mount(self) -> None: 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( + 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() + self.loading = False + + def _add_to_load_queue( + self, node: TreeNode[InteractiveCatalogItem], priority: int = 100 + ) -> AwaitComplete: + """Add the given node to the load queue. + + The return value can optionally be awaited until the queue is empty. + + Args: + node: The node to add to the load queue. + + 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: + self._load_queue.put_nowait((priority, 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, - items: List[CatalogItem], - parent: TreeNode[CatalogItem], - expanded_nodes: Set[str], - ) -> None: - for item in items: - if isinstance(item, InteractiveCatalogItem): - item.children = list(item.fetch_children()) - 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, + 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, ) - 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 + + # 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)) - @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 + 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: + child = node.add( + self._build_item_label(item.label, item.type_label), + data=item, + allow_expand=bool(item.children) or not getattr(item, "loaded", True), + ) + # pre-fetch the node's grandchildren + if isinstance(child, InteractiveCatalogItem): + self._add_to_load_queue(child) + + @work(thread=True, exit_on_error=False) + 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: + node.data.children = list(node.data.fetch_children()) + except BaseException as e: + self.post_message(self.CatalogError(catalog_type="database", error=e)) + return [] + 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(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] diff --git a/src/harlequin_duckdb/catalog.py b/src/harlequin_duckdb/catalog.py index ac917080..81aae4dd 100644 --- a/src/harlequin_duckdb/catalog.py +++ b/src/harlequin_duckdb/catalog.py @@ -33,6 +33,7 @@ def from_parent( type_label=type_label, connection=parent.connection, parent=parent, + loaded=True, ) From eb17874e434b97bfb45c57199d6457d06688ddcc Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Sat, 31 Aug 2024 03:02:51 +0000 Subject: [PATCH 08/21] feat: add duckdb interactions; fix: option list display --- CHANGELOG.md | 2 +- src/harlequin/app.tcss | 33 ++-- .../components/data_catalog/__init__.py | 15 +- .../components/data_catalog/database_tree.py | 2 +- src/harlequin/driver.py | 2 +- src/harlequin_duckdb/adapter.py | 11 ++ src/harlequin_duckdb/catalog.py | 40 ++++- src/harlequin_duckdb/interactions.py | 154 ++++++++++++++++-- 8 files changed, 228 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4662951..9fc49b0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ All notable changes to this project will be documented in this file. - 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. +- 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. diff --git a/src/harlequin/app.tcss b/src/harlequin/app.tcss index af4a7e0c..7bf09130 100644 --- a/src/harlequin/app.tcss +++ b/src/harlequin/app.tcss @@ -88,24 +88,31 @@ DataCatalog * .directory-tree--hidden { DataCatalog ContextMenu { layer: overlay; display: none; - padding: 0 1; - margin: 0 0 0 3; - border: $border-color-nofocus vkey; - width: auto; + padding: 1 1; + border: none; + color: $text; + margin: 0 2; + overflow: hidden auto; + width: 1fr; max-width: 100%; - max-height: 8; + max-height: 10; background: $background-lighten-2 ; &.open { display: block; } &:focus{ - border: $border-color-focus vkey; + background: $secondary ; } - &>.option-list--option-highlighted { - color: $text; + &>.option-list--option-hover { + color: $background; background: $secondary; text-style: bold; } + &>.option-list--option-highlighted { + color: $background; + background: $secondary; + text-style: reverse bold; + } } @@ -590,19 +597,23 @@ ConfirmModal { ConfirmModal Vertical#outer { border: round $border-color-focus; background: $background; - margin: 2 4; - padding: 1 2; + 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; } @@ -610,7 +621,7 @@ ConfirmModal Horizontal#button_row { ConfirmModal Horizontal#button_row Button { background: $primary; height: 3; - margin: 0 6; + margin: 0 4; padding: 0 1; min-width: 16; border: none; diff --git a/src/harlequin/components/data_catalog/__init__.py b/src/harlequin/components/data_catalog/__init__.py index 4226f6b0..cb93d0d8 100644 --- a/src/harlequin/components/data_catalog/__init__.py +++ b/src/harlequin/components/data_catalog/__init__.py @@ -3,6 +3,7 @@ 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 @@ -45,7 +46,7 @@ def __init__(self, interaction: "Interaction", item: CatalogItem) -> None: super().__init__() DEFAULT_INTERACTIONS: list[tuple[str, "Interaction"]] = [ - ("Insert Name at Cursor", insert_name_at_cursor) + ("Insert Name at Cursor", insert_name_at_cursor), ] def __init__(self) -> None: @@ -70,9 +71,17 @@ def reload(self, node: TreeNode) -> None: self.interactions = [*self.DEFAULT_INTERACTIONS, *other_interactions] for label, _ in self.interactions: - self.add_option(label) + 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.styles.offset = (0, node.line + 1) self.add_class("open") self.highlighted = 0 self.focus() diff --git a/src/harlequin/components/data_catalog/database_tree.py b/src/harlequin/components/data_catalog/database_tree.py index d61ee9a1..3b40cbe3 100644 --- a/src/harlequin/components/data_catalog/database_tree.py +++ b/src/harlequin/components/data_catalog/database_tree.py @@ -263,7 +263,7 @@ def _populate_node( if isinstance(child, InteractiveCatalogItem): self._add_to_load_queue(child) - @work(thread=True, exit_on_error=False) + @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. diff --git a/src/harlequin/driver.py b/src/harlequin/driver.py index c1692b8e..9a207bff 100644 --- a/src/harlequin/driver.py +++ b/src/harlequin/driver.py @@ -49,7 +49,7 @@ def insert_text_at_selection(self, text: str) -> None: """ self.app.post_message(self.InsertTextAtSelection(text=text)) - async def insert_text_in_new_buffer(self, text: str) -> None: + def insert_text_in_new_buffer(self, text: str) -> None: """ Create a new buffer (tab) in Harlequin's editor and insert the text. """ diff --git a/src/harlequin_duckdb/adapter.py b/src/harlequin_duckdb/adapter.py index 77965f82..55677733 100644 --- a/src/harlequin_duckdb/adapter.py +++ b/src/harlequin_duckdb/adapter.py @@ -56,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 = { diff --git a/src/harlequin_duckdb/catalog.py b/src/harlequin_duckdb/catalog.py index 81aae4dd..2e418ea5 100644 --- a/src/harlequin_duckdb/catalog.py +++ b/src/harlequin_duckdb/catalog.py @@ -5,8 +5,17 @@ from harlequin.catalog import InteractiveCatalogItem from harlequin_duckdb.interactions import ( - execute_drop_database_statement, + 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: @@ -39,6 +48,12 @@ def from_parent( @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]: @@ -58,6 +73,11 @@ def fetch_children(self) -> list[ColumnCatalogItem]: class ViewCatalogItem(RelationCatalogItem): + INTERACTIONS = RelationCatalogItem.INTERACTIONS + [ + ("Show DDL", show_view_ddl), + ("Drop View", execute_drop_view_statement), + ] + @classmethod def from_parent( cls, @@ -77,6 +97,11 @@ def from_parent( class TableCatalogItem(RelationCatalogItem): + INTERACTIONS = RelationCatalogItem.INTERACTIONS + [ + ("Show DDL", show_table_ddl), + ("Drop Table", execute_drop_table_statement), + ] + @classmethod def from_parent( cls, @@ -96,6 +121,11 @@ def from_parent( class TempTableCatalogItem(TableCatalogItem): + INTERACTIONS = RelationCatalogItem.INTERACTIONS + [ + ("Drop Table", execute_drop_table_statement), + ("Show DDL", show_table_ddl), + ] + @classmethod def from_parent( cls, @@ -116,6 +146,10 @@ def from_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 @@ -167,8 +201,8 @@ def fetch_children(self) -> list[RelationCatalogItem]: class DatabaseCatalogItem(InteractiveCatalogItem["DuckDbConnection"]): INTERACTIONS = [ - ("Switch Editor Context (USE)", execute_use_statement), - ("Drop Database", execute_drop_database_statement), + ("Switch Editor Context (Use)", execute_use_statement), + ("Export Database", show_export_database), ] @classmethod diff --git a/src/harlequin_duckdb/interactions.py b/src/harlequin_duckdb/interactions.py index d55ea3a4..f9d1b028 100644 --- a/src/harlequin_duckdb/interactions.py +++ b/src/harlequin_duckdb/interactions.py @@ -1,16 +1,23 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from textwrap import dedent +from typing import TYPE_CHECKING, Literal, Sequence -from harlequin.catalog import InteractiveCatalogItem +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: "InteractiveCatalogItem", + item: "DatabaseCatalogItem" | "SchemaCatalogItem", driver: "HarlequinDriver", ) -> None: if item.connection is None: @@ -24,22 +31,147 @@ def execute_use_statement( driver.notify(f"Editor context switched to {item.label}") -def execute_drop_database_statement( - item: "InteractiveCatalogItem", +def execute_drop_schema_statement( + item: "SchemaCatalogItem", driver: "HarlequinDriver", ) -> None: - def _drop_database() -> None: + def _drop_schema() -> None: if item.connection is None: return try: - item.connection.execute(f"drop database {item.qualified_identifier}") + item.connection.execute(f"drop schema {item.qualified_identifier} cascade") except HarlequinQueryError: - driver.notify("Could not drop database", severity="error") + driver.notify(f"Could not drop schema {item.label}", severity="error") raise else: - driver.notify(f"Dropped database {item.label}") + driver.notify(f"Dropped schema {item.label}") if item.children or item.fetch_children(): - driver.confirm_and_execute(callback=_drop_database) + driver.confirm_and_execute(callback=_drop_schema) else: - _drop_database() + _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.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)) From 490759adde34f54cb0ce0fc2a09e950997101c08 Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Sat, 31 Aug 2024 03:10:42 +0000 Subject: [PATCH 09/21] fix: render children for static CatalogItem nodes --- src/harlequin/components/data_catalog/database_tree.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/harlequin/components/data_catalog/database_tree.py b/src/harlequin/components/data_catalog/database_tree.py index 3b40cbe3..5abce99d 100644 --- a/src/harlequin/components/data_catalog/database_tree.py +++ b/src/harlequin/components/data_catalog/database_tree.py @@ -332,6 +332,11 @@ async def _on_tree_node_expanded( 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 + # 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) From 50f5d2710cc3cfd3363831a95ce1bd87e51be532 Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Sat, 31 Aug 2024 03:35:21 +0000 Subject: [PATCH 10/21] fix: add desc for _execute_interaction worker for perf in dev mode --- src/harlequin/app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/harlequin/app.py b/src/harlequin/app.py index e2cec37a..df3090b2 100644 --- a/src/harlequin/app.py +++ b/src/harlequin/app.py @@ -1164,6 +1164,7 @@ def rollback(self) -> None: exclusive=True, exit_on_error=False, group="interactions", + description="_execute_interaction", ) def _execute_interaction( self, From 26814f8232d8a9ba0cca05a8d483143c855ba61e Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Mon, 30 Sep 2024 19:40:31 +0000 Subject: [PATCH 11/21] feat: add sqlite impl --- CHANGELOG.md | 1 - src/harlequin/app.py | 5 + src/harlequin/driver.py | 21 ++-- src/harlequin_duckdb/adapter.py | 52 --------- src/harlequin_duckdb/interactions.py | 2 + src/harlequin_sqlite/adapter.py | 38 ++----- src/harlequin_sqlite/catalog.py | 151 +++++++++++++++++++++++++++ src/harlequin_sqlite/interactions.py | 103 ++++++++++++++++++ 8 files changed, 282 insertions(+), 91 deletions(-) create mode 100644 src/harlequin_sqlite/catalog.py create mode 100644 src/harlequin_sqlite/interactions.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fc49b0b..273f3893 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,6 @@ All notable changes to this project will be documented in this file. - 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/src/harlequin/app.py b/src/harlequin/app.py index df3090b2..677213fa 100644 --- a/src/harlequin/app.py +++ b/src/harlequin/app.py @@ -443,6 +443,11 @@ 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 diff --git a/src/harlequin/driver.py b/src/harlequin/driver.py index 9a207bff..2c89f077 100644 --- a/src/harlequin/driver.py +++ b/src/harlequin/driver.py @@ -18,6 +18,12 @@ class HarlequinDriver: 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__() @@ -28,18 +34,15 @@ def __init__(self, text: str) -> None: super().__init__() self.text = text - class ConfirmAndExecute(Message): - def __init__(self, callback: Callable[[], None], instructions: str) -> None: - super().__init__() - self.callback = callback - self.instructions = instructions - 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 @@ -71,3 +74,9 @@ def notify(self, message: str, severity: "SeverityLevel" = "information") -> Non 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 55677733..e9ddaf82 100644 --- a/src/harlequin_duckdb/adapter.py +++ b/src/harlequin_duckdb/adapter.py @@ -144,58 +144,6 @@ def get_catalog(self) -> Catalog: ) return Catalog(items=catalog_items) - def get_catalog_old(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, - ) - ) - catalog_items.append( - CatalogItem( - qualified_identifier=database_identifier, - query_name=database_identifier, - label=database, - type_label="db", - children=schema_items, - ) - ) - return Catalog(items=catalog_items) - def get_completions(self) -> list[HarlequinCompletion]: cur = self.conn.cursor() return [ diff --git a/src/harlequin_duckdb/interactions.py b/src/harlequin_duckdb/interactions.py index f9d1b028..e3ab9ae0 100644 --- a/src/harlequin_duckdb/interactions.py +++ b/src/harlequin_duckdb/interactions.py @@ -45,6 +45,7 @@ def _drop_schema() -> None: 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) @@ -69,6 +70,7 @@ def _drop_relation() -> None: raise else: driver.notify(f"Dropped {relation_type} {item.label}") + driver.refresh_catalog() driver.confirm_and_execute(callback=_drop_relation) 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)) From 123bf42bbce97845a948a32a2c58fd60e7f2b85b Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Mon, 30 Sep 2024 22:38:06 +0000 Subject: [PATCH 12/21] fix: update tests to not wait for queue worker --- .../components/data_catalog/database_tree.py | 2 +- src/scripts/export_screenshots.py | 10 +- src/scripts/profile_buffers.py | 10 +- tests/adapter_tests/test_duckdb.py | 30 +- tests/adapter_tests/test_sqlite.py | 30 +- .../__snapshots__/test_keys_app.ambr | 1540 ++++++++--------- tests/functional_tests/conftest.py | 15 + tests/functional_tests/test_app.py | 58 +- tests/functional_tests/test_data_catalog.py | 9 +- tests/functional_tests/test_export.py | 13 +- tests/functional_tests/test_help_screen.py | 6 +- tests/functional_tests/test_history_screen.py | 8 +- .../test_keymap_from_config.py | 7 +- tests/functional_tests/test_keymap_vscode.py | 15 +- tests/functional_tests/test_layout.py | 12 +- tests/functional_tests/test_query_editor.py | 43 +- tests/functional_tests/test_results_viewer.py | 33 +- tests/functional_tests/test_run_query_bar.py | 30 +- 18 files changed, 998 insertions(+), 873 deletions(-) diff --git a/src/harlequin/components/data_catalog/database_tree.py b/src/harlequin/components/data_catalog/database_tree.py index 5abce99d..fe9bb0c2 100644 --- a/src/harlequin/components/data_catalog/database_tree.py +++ b/src/harlequin/components/data_catalog/database_tree.py @@ -293,7 +293,7 @@ def _load_children(self, node: TreeNode[CatalogItem]) -> list[CatalogItem]: key=lambda catalog_item: catalog_item.label, ) - @work(exclusive=True) + @work(name="_database_tree_background_loader", exclusive=True) async def _loader(self) -> None: """Background loading queue processor.""" worker = get_current_worker() 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_keys_app.ambr b/tests/functional_tests/__snapshots__/test_keys_app.ambr index 2646ff07..d6646358 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-1759661775-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3144241796-title { + .terminal-1759661775-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-1759661775-r1 { fill: #dfdfdf } + .terminal-1759661775-r2 { fill: #606060;font-style: italic; } + .terminal-1759661775-r3 { fill: #c5c8c6 } + .terminal-1759661775-r4 { fill: #606060;font-weight: bold } + .terminal-1759661775-r5 { fill: #6c6d4c } + .terminal-1759661775-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-1759661775-r7 { fill: #feffac } + .terminal-1759661775-r8 { fill: #606060 } + .terminal-1759661775-r9 { fill: #dfdfdf;font-weight: bold } + .terminal-1759661775-r10 { fill: #8a8a8a;font-style: italic; } + .terminal-1759661775-r11 { fill: #0a1411 } + .terminal-1759661775-r12 { fill: #8a8a8a;font-weight: bold } + .terminal-1759661775-r13 { fill: #8a8a8a } + .terminal-1759661775-r14 { fill: #777777 } + .terminal-1759661775-r15 { fill: #ffb6d9 } + .terminal-1759661775-r16 { fill: #45ffca } + .terminal-1759661775-r17 { fill: #45ffca;font-weight: bold } + .terminal-1759661775-r18 { fill: #686868 } + .terminal-1759661775-r19 { fill: #ededed;font-weight: bold } + .terminal-1759661775-r20 { fill: #212116;font-weight: bold } + .terminal-1759661775-r21 { fill: #226d58;font-weight: bold } + .terminal-1759661775-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-3621805236-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4240007273-title { + .terminal-3621805236-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-3621805236-r1 { fill: #dfdfdf } + .terminal-3621805236-r2 { fill: #606060;font-style: italic; } + .terminal-3621805236-r3 { fill: #c5c8c6 } + .terminal-3621805236-r4 { fill: #606060;font-weight: bold } + .terminal-3621805236-r5 { fill: #6c6d4c } + .terminal-3621805236-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-3621805236-r7 { fill: #606060 } + .terminal-3621805236-r8 { fill: #feffac } + .terminal-3621805236-r9 { fill: #dfdfdf;font-weight: bold } + .terminal-3621805236-r10 { fill: #0a1411 } + .terminal-3621805236-r11 { fill: #8a8a8a;font-style: italic; } + .terminal-3621805236-r12 { fill: #8a8a8a;font-weight: bold } + .terminal-3621805236-r13 { fill: #8a8a8a } + .terminal-3621805236-r14 { fill: #45ffca } + .terminal-3621805236-r15 { fill: #777777 } + .terminal-3621805236-r16 { fill: #ffb6d9 } + .terminal-3621805236-r17 { fill: #686868 } + .terminal-3621805236-r18 { fill: #ededed;font-weight: bold } + .terminal-3621805236-r19 { fill: #212116;font-weight: bold } + .terminal-3621805236-r20 { fill: #226d58;font-weight: bold } + .terminal-3621805236-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-3656408244-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4274610281-title { + .terminal-3656408244-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-3656408244-r1 { fill: #dfdfdf } + .terminal-3656408244-r2 { fill: #606060;font-style: italic; } + .terminal-3656408244-r3 { fill: #c5c8c6 } + .terminal-3656408244-r4 { fill: #606060;font-weight: bold } + .terminal-3656408244-r5 { fill: #6c6d4c } + .terminal-3656408244-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-3656408244-r7 { fill: #606060 } + .terminal-3656408244-r8 { fill: #feffac } + .terminal-3656408244-r9 { fill: #dfdfdf;font-weight: bold } + .terminal-3656408244-r10 { fill: #0a1411 } + .terminal-3656408244-r11 { fill: #8a8a8a;font-style: italic; } + .terminal-3656408244-r12 { fill: #8a8a8a;font-weight: bold } + .terminal-3656408244-r13 { fill: #8a8a8a } + .terminal-3656408244-r14 { fill: #777777 } + .terminal-3656408244-r15 { fill: #45ffca } + .terminal-3656408244-r16 { fill: #ffb6d9;font-weight: bold } + .terminal-3656408244-r17 { fill: #686868 } + .terminal-3656408244-r18 { fill: #ededed;font-weight: bold } + .terminal-3656408244-r19 { fill: #212116;font-weight: bold } + .terminal-3656408244-r20 { fill: #226d58;font-weight: bold } + .terminal-3656408244-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-750017715-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1368219752-title { + .terminal-750017715-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-750017715-r1 { fill: #dfdfdf } + .terminal-750017715-r2 { fill: #606060;font-style: italic; } + .terminal-750017715-r3 { fill: #c5c8c6 } + .terminal-750017715-r4 { fill: #606060;font-weight: bold } + .terminal-750017715-r5 { fill: #6c6d4c } + .terminal-750017715-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-750017715-r7 { fill: #606060 } + .terminal-750017715-r8 { fill: #feffac } + .terminal-750017715-r9 { fill: #dfdfdf;font-weight: bold } + .terminal-750017715-r10 { fill: #0a1411 } + .terminal-750017715-r11 { fill: #8a8a8a;font-style: italic; } + .terminal-750017715-r12 { fill: #8a8a8a;font-weight: bold } + .terminal-750017715-r13 { fill: #8a8a8a } + .terminal-750017715-r14 { fill: #45ffca } + .terminal-750017715-r15 { fill: #777777 } + .terminal-750017715-r16 { fill: #ffb6d9 } + .terminal-750017715-r17 { fill: #686868 } + .terminal-750017715-r18 { fill: #ededed;font-weight: bold } + .terminal-750017715-r19 { fill: #212116;font-weight: bold } + .terminal-750017715-r20 { fill: #226d58;font-weight: bold } + .terminal-750017715-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-1128356798-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-527851385-title { + .terminal-1128356798-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-1128356798-r1 { fill: #606060 } + .terminal-1128356798-r2 { fill: #2d2d2d;font-style: italic; } + .terminal-1128356798-r3 { fill: #c5c8c6 } + .terminal-1128356798-r4 { fill: #2d2d2d;font-weight: bold } + .terminal-1128356798-r5 { fill: #323225 } + .terminal-1128356798-r6 { fill: #323225;font-weight: bold } + .terminal-1128356798-r7 { fill: #2d2d2d } + .terminal-1128356798-r8 { fill: #6c6d4c } + .terminal-1128356798-r9 { fill: #dfdfdf } + .terminal-1128356798-r10 { fill: #606060;font-weight: bold } + .terminal-1128356798-r11 { fill: #0b0f0e } + .terminal-1128356798-r12 { fill: #3e3e3e;font-style: italic; } + .terminal-1128356798-r13 { fill: #3e3e3e;font-weight: bold } + .terminal-1128356798-r14 { fill: #3e3e3e } + .terminal-1128356798-r15 { fill: #feffac } + .terminal-1128356798-r16 { fill: #363636 } + .terminal-1128356798-r17 { fill: #303030 } + .terminal-1128356798-r18 { fill: #666666;font-weight: bold } + .terminal-1128356798-r19 { fill: #141410;font-weight: bold } + .terminal-1128356798-r20 { fill: #14322a;font-weight: bold } + .terminal-1128356798-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-3495552552-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1093854887-title { + .terminal-3495552552-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-3495552552-r1 { fill: #c5c8c6 } + .terminal-3495552552-r2 { fill: #dfdfdf;font-style: italic; } + .terminal-3495552552-r3 { fill: #dfdfdf;font-weight: bold } + .terminal-3495552552-r4 { fill: #feffac } + .terminal-3495552552-r5 { fill: #feffac;font-weight: bold } + .terminal-3495552552-r6 { fill: #dfdfdf } + .terminal-3495552552-r7 { fill: #08211a } + .terminal-3495552552-r8 { fill: #45ffca;font-weight: bold } + .terminal-3495552552-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-1378739753-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3270960808-title { + .terminal-1378739753-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-1378739753-r1 { fill: #c5c8c6 } + .terminal-1378739753-r2 { fill: #dfdfdf;font-style: italic; } + .terminal-1378739753-r3 { fill: #dfdfdf;font-weight: bold } + .terminal-1378739753-r4 { fill: #feffac } + .terminal-1378739753-r5 { fill: #feffac;font-weight: bold } + .terminal-1378739753-r6 { fill: #dfdfdf } + .terminal-1378739753-r7 { fill: #08211a } + .terminal-1378739753-r8 { fill: #45ffca;font-weight: bold } + .terminal-1378739753-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-701325920-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2225497621-title { + .terminal-701325920-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-701325920-r1 { fill: #dfdfdf } + .terminal-701325920-r2 { fill: #606060;font-style: italic; } + .terminal-701325920-r3 { fill: #c5c8c6 } + .terminal-701325920-r4 { fill: #606060;font-weight: bold } + .terminal-701325920-r5 { fill: #6c6d4c } + .terminal-701325920-r6 { fill: #6c6d4c;font-weight: bold } + .terminal-701325920-r7 { fill: #606060 } + .terminal-701325920-r8 { fill: #feffac } + .terminal-701325920-r9 { fill: #0a1411 } + .terminal-701325920-r10 { fill: #777777 } + .terminal-701325920-r11 { fill: #45ffca } + .terminal-701325920-r12 { fill: #0c0c0c } + .terminal-701325920-r13 { fill: #686868 } + .terminal-701325920-r14 { fill: #ededed;font-weight: bold } + .terminal-701325920-r15 { fill: #21171c;font-weight: bold } + .terminal-701325920-r16 { fill: #212116;font-weight: bold } + .terminal-701325920-r17 { fill: #226d58;font-weight: bold } + .terminal-701325920-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/conftest.py b/tests/functional_tests/conftest.py index 753403e5..7dabe730 100644 --- a/tests/functional_tests/conftest.py +++ b/tests/functional_tests/conftest.py @@ -1,7 +1,10 @@ +from typing import Awaitable, Callable from unittest.mock import MagicMock import pytest +from harlequin.app import Harlequin + @pytest.fixture(autouse=True) def no_use_buffer_cache( @@ -42,3 +45,15 @@ 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: + 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..5d3f9a6b 100644 --- a/tests/functional_tests/test_data_catalog.py +++ b/tests/functional_tests/test_data_catalog.py @@ -38,12 +38,13 @@ def mock_boto3(monkeypatch: pytest.MonkeyPatch) -> None: 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 wait_for_workers(app) await pilot.pause() catalog = app.data_catalog assert not catalog.database_tree.show_root @@ -158,6 +159,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,7 +169,7 @@ 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 wait_for_workers(app) await pilot.pause() catalog = app.data_catalog assert catalog.s3_tree is not None @@ -193,12 +195,13 @@ 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 wait_for_workers(app) await pilot.pause() assert await app_snapshot(app, "Error visible") 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..a81866f2 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,14 @@ 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) while app.editor is None or app.editor_collection.member_completer is None: await pilot.pause() app.editor.text = '"drivers"' @@ -186,21 +195,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() From 6a6654e7767e0a1c0399b404dc4ff26173eb80f9 Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Mon, 30 Sep 2024 22:40:55 +0000 Subject: [PATCH 13/21] fix: prefetch top children in catalog; fix s3 mock --- src/harlequin/components/data_catalog/database_tree.py | 6 +++++- tests/functional_tests/test_data_catalog.py | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/harlequin/components/data_catalog/database_tree.py b/src/harlequin/components/data_catalog/database_tree.py index fe9bb0c2..66175170 100644 --- a/src/harlequin/components/data_catalog/database_tree.py +++ b/src/harlequin/components/data_catalog/database_tree.py @@ -70,6 +70,10 @@ async def watch_catalog(self, catalog: Catalog | None) -> None: 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( @@ -102,7 +106,7 @@ def reload(self) -> AwaitComplete: self._load_queue = PriorityQueue() # ... reset the root node ... processed = self.reload_node(self.root) - # ...and replace the old loader with a new one. + # ... and replace the old loader with a new one. self._loader() return processed diff --git a/tests/functional_tests/test_data_catalog.py b/tests/functional_tests/test_data_catalog.py index 5d3f9a6b..e53bb2b3 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,6 +33,7 @@ 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 @@ -62,6 +64,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) From 8ce16f042e75fb10f731d4b1fdaa4fb22bd1301f Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Tue, 1 Oct 2024 16:52:01 +0000 Subject: [PATCH 14/21] fix: reimplement basic completer flow for lazy catalogs --- src/harlequin/app.py | 81 ++++++++++++++----- src/harlequin/autocomplete/completers.py | 15 ++++ src/harlequin/catalog.py | 7 ++ .../components/data_catalog/database_tree.py | 40 ++++++--- 4 files changed, 115 insertions(+), 28 deletions(-) diff --git a/src/harlequin/app.py b/src/harlequin/app.py index 677213fa..92d47770 100644 --- a/src/harlequin/app.py +++ b/src/harlequin/app.py @@ -39,11 +39,14 @@ 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, + CatalogItem, Interaction, NewCatalog, + NewCatalogItems, TCatalogItem_contra, ) from harlequin.catalog_cache import ( @@ -157,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. @@ -190,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 @@ -587,11 +598,21 @@ def execute_interaction_in_thread( ) @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 + self.post_message(message=message) + @on(QueriesExecuted) def fetch_data_or_reset_table(self, message: QueriesExecuted) -> None: if message.cursors: # select query @@ -752,6 +773,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. @@ -898,7 +924,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, ) @@ -1050,13 +1076,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 @@ -1067,14 +1098,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: diff --git a/src/harlequin/autocomplete/completers.py b/src/harlequin/autocomplete/completers.py index 46aa611d..d7a087ea 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], @@ -154,6 +166,9 @@ def completer_factory( ) +# TODO: MOVE THIS SOMEWHERE IN SHARED SCOPE WHERE WE CAN EASILY UPDATE +# IT WITH NEW CATALOG ITEMS AS THEY ARE LAZILY LOADED. MAYBE THAT MEANS +# PASSING A CALLBACK TO THE CATALOG? MESSAGE PASSING TOO SLOW/CLUNKY? def build_catalog_completions(catalog: Catalog) -> list[HarlequinCompletion]: return _build_children_completions(catalog.items) diff --git a/src/harlequin/catalog.py b/src/harlequin/catalog.py index 76f895c2..c4fee5ab 100644 --- a/src/harlequin/catalog.py +++ b/src/harlequin/catalog.py @@ -108,3 +108,10 @@ 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/components/data_catalog/database_tree.py b/src/harlequin/components/data_catalog/database_tree.py index 66175170..4cef9f22 100644 --- a/src/harlequin/components/data_catalog/database_tree.py +++ b/src/harlequin/components/data_catalog/database_tree.py @@ -1,6 +1,7 @@ from __future__ import annotations from asyncio import PriorityQueue +from contextlib import suppress from pathlib import Path from typing import TYPE_CHECKING, Generator, Iterable, TypeVar @@ -11,7 +12,12 @@ from textual.widgets._tree import Tree, TreeNode from textual.worker import WorkerCancelled, WorkerFailed, get_current_worker -from harlequin.catalog import Catalog, CatalogItem, InteractiveCatalogItem +from harlequin.catalog import ( + Catalog, + CatalogItem, + InteractiveCatalogItem, + NewCatalogItems, +) from harlequin.components.data_catalog.tree import HarlequinTree from harlequin.messages import WidgetMounted @@ -33,8 +39,14 @@ def __init__( disabled: bool = False, ) -> None: self._load_queue: PriorityQueue[ - tuple[int, TreeNode[InteractiveCatalogItem]] + 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", @@ -79,12 +91,13 @@ async def watch_catalog(self, catalog: Catalog | None) -> None: def _add_to_load_queue( self, node: TreeNode[InteractiveCatalogItem], priority: int = 100 ) -> AwaitComplete: - """Add the given node to the load queue. + """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 @@ -92,7 +105,10 @@ def _add_to_load_queue( """ assert node.data is not None if not node.data.loaded: - self._load_queue.put_nowait((priority, node)) + 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()) @@ -258,14 +274,11 @@ def _populate_node( """ node.remove_children() for item in content: - child = node.add( + node.add( self._build_item_label(item.label, item.type_label), data=item, allow_expand=bool(item.children) or not getattr(item, "loaded", True), ) - # pre-fetch the node's grandchildren - if isinstance(child, InteractiveCatalogItem): - self._add_to_load_queue(child) @work(thread=True, exit_on_error=False, description="_load_children") def _load_children(self, node: TreeNode[CatalogItem]) -> list[CatalogItem]: @@ -284,10 +297,13 @@ def _load_children(self, node: TreeNode[CatalogItem]) -> list[CatalogItem]: and not node.data.loaded ): try: - node.data.children = list(node.data.fetch_children()) + 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) @@ -304,7 +320,7 @@ async def _loader(self) -> None: 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() + *_, node = await self._load_queue.get() content: list[Path] = [] async with self.lock: try: @@ -344,3 +360,7 @@ async def _on_tree_node_expanded( 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] From 203419f76a943cc0ec198a29f7a049dbb89bad30 Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Tue, 1 Oct 2024 20:43:48 +0000 Subject: [PATCH 15/21] fix: update data catalog tests --- src/harlequin/app.py | 18 +- src/harlequin/autocomplete/completers.py | 3 - .../__snapshots__/test_data_catalog.ambr | 1804 +++++++++-------- .../__snapshots__/test_query_editor.ambr | 400 ++-- tests/functional_tests/test_query_editor.py | 18 + 5 files changed, 1133 insertions(+), 1110 deletions(-) diff --git a/src/harlequin/app.py b/src/harlequin/app.py index 92d47770..5aa3aeda 100644 --- a/src/harlequin/app.py +++ b/src/harlequin/app.py @@ -388,7 +388,8 @@ 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() @@ -398,7 +399,8 @@ 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 ( @@ -419,7 +421,8 @@ def driver_insert_text_into_editor( 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.text) self.editor.focus() @@ -431,7 +434,8 @@ async def driver_insert_text_in_new_buffer( 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 await self.editor_collection.insert_buffer_with_text(query_text=message.text) @@ -509,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) @@ -611,7 +616,8 @@ def handle_new_catalog_item(self, message: NewCatalogItems) -> None: self.extend_completers(parent=message.parent, items=message.items) else: # recycle message while completers are built - self.post_message(message=message) + 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: diff --git a/src/harlequin/autocomplete/completers.py b/src/harlequin/autocomplete/completers.py index d7a087ea..a65716c1 100644 --- a/src/harlequin/autocomplete/completers.py +++ b/src/harlequin/autocomplete/completers.py @@ -166,9 +166,6 @@ def completer_factory( ) -# TODO: MOVE THIS SOMEWHERE IN SHARED SCOPE WHERE WE CAN EASILY UPDATE -# IT WITH NEW CATALOG ITEMS AS THEY ARE LAZILY LOADED. MAYBE THAT MEANS -# PASSING A CALLBACK TO THE CATALOG? MESSAGE PASSING TOO SLOW/CLUNKY? def build_catalog_completions(catalog: Catalog) -> list[HarlequinCompletion]: return _build_children_completions(catalog.items) diff --git a/tests/functional_tests/__snapshots__/test_data_catalog.ambr b/tests/functional_tests/__snapshots__/test_data_catalog.ambr index bb7f9dd8..5460ea24 100644 --- a/tests/functional_tests/__snapshots__/test_data_catalog.ambr +++ b/tests/functional_tests/__snapshots__/test_data_catalog.ambr @@ -22,188 +22,188 @@ font-weight: 700; } - .terminal-420809782-matrix { + .terminal-4208397213-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-420809782-title { + .terminal-4208397213-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-4208397213-r1 { fill: #777777 } + .terminal-4208397213-r2 { fill: #feffac } + .terminal-4208397213-r3 { fill: #c5c8c6 } + .terminal-4208397213-r4 { fill: #dfdfdf } + .terminal-4208397213-r5 { fill: #858585 } + .terminal-4208397213-r6 { fill: #181818 } + .terminal-4208397213-r7 { fill: #dddddd } + .terminal-4208397213-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-4208397213-r9 { fill: #212116;font-weight: bold } + .terminal-4208397213-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 +233,190 @@ font-weight: 700; } - .terminal-1227425220-matrix { + .terminal-2796946758-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1227425220-title { + .terminal-2796946758-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-2796946758-r1 { fill: #777777 } + .terminal-2796946758-r2 { fill: #feffac } + .terminal-2796946758-r3 { fill: #c5c8c6 } + .terminal-2796946758-r4 { fill: #dfdfdf } + .terminal-2796946758-r5 { fill: #858585 } + .terminal-2796946758-r6 { fill: #dddddd } + .terminal-2796946758-r7 { fill: #feffac;font-weight: bold } + .terminal-2796946758-r8 { fill: #181818 } + .terminal-2796946758-r9 { fill: #001b14;font-weight: bold } + .terminal-2796946758-r10 { fill: #0c0c0c;font-weight: bold } + .terminal-2796946758-r11 { fill: #212116;font-weight: bold } + .terminal-2796946758-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 +446,189 @@ font-weight: 700; } - .terminal-42125519-matrix { + .terminal-2982107205-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-42125519-title { + .terminal-2982107205-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-2982107205-r1 { fill: #feffac } + .terminal-2982107205-r2 { fill: #777777 } + .terminal-2982107205-r3 { fill: #c5c8c6 } + .terminal-2982107205-r4 { fill: #dfdfdf } + .terminal-2982107205-r5 { fill: #08211a;font-weight: bold } + .terminal-2982107205-r6 { fill: #858585 } + .terminal-2982107205-r7 { fill: #dddddd } + .terminal-2982107205-r8 { fill: #45ffca;font-weight: bold } + .terminal-2982107205-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-2982107205-r10 { fill: #212116;font-weight: bold } + .terminal-2982107205-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 +658,189 @@ font-weight: 700; } - .terminal-2232766834-matrix { + .terminal-3662799077-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2232766834-title { + .terminal-3662799077-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-3662799077-r1 { fill: #feffac } + .terminal-3662799077-r2 { fill: #777777 } + .terminal-3662799077-r3 { fill: #c5c8c6 } + .terminal-3662799077-r4 { fill: #dfdfdf } + .terminal-3662799077-r5 { fill: #858585 } + .terminal-3662799077-r6 { fill: #dddddd } + .terminal-3662799077-r7 { fill: #08211a;font-weight: bold } + .terminal-3662799077-r8 { fill: #45ffca;font-weight: bold } + .terminal-3662799077-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-3662799077-r10 { fill: #212116;font-weight: bold } + .terminal-3662799077-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 +870,189 @@ font-weight: 700; } - .terminal-2022038081-matrix { + .terminal-3498695546-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2022038081-title { + .terminal-3498695546-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-3498695546-r1 { fill: #777777 } + .terminal-3498695546-r2 { fill: #feffac } + .terminal-3498695546-r3 { fill: #c5c8c6 } + .terminal-3498695546-r4 { fill: #dfdfdf } + .terminal-3498695546-r5 { fill: #858585 } + .terminal-3498695546-r6 { fill: #dddddd } + .terminal-3498695546-r7 { fill: #181818 } + .terminal-3498695546-r8 { fill: #001b14;font-weight: bold } + .terminal-3498695546-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-3498695546-r10 { fill: #212116;font-weight: bold } + .terminal-3498695546-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 +1082,190 @@ font-weight: 700; } - .terminal-422966249-matrix { + .terminal-505447714-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-422966249-title { + .terminal-505447714-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-505447714-r1 { fill: #feffac } + .terminal-505447714-r2 { fill: #777777 } + .terminal-505447714-r3 { fill: #c5c8c6 } + .terminal-505447714-r4 { fill: #dfdfdf } + .terminal-505447714-r5 { fill: #858585 } + .terminal-505447714-r6 { fill: #dddddd } + .terminal-505447714-r7 { fill: #feffac;font-weight: bold } + .terminal-505447714-r8 { fill: #08211a;font-weight: bold } + .terminal-505447714-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-505447714-r10 { fill: #212116;font-weight: bold } + .terminal-505447714-r11 { fill: #45ffca;font-weight: bold } + .terminal-505447714-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 +1295,193 @@ font-weight: 700; } - .terminal-3218704510-matrix { + .terminal-770447486-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3218704510-title { + .terminal-770447486-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-770447486-r1 { fill: #feffac } + .terminal-770447486-r2 { fill: #777777 } + .terminal-770447486-r3 { fill: #c5c8c6 } + .terminal-770447486-r4 { fill: #dfdfdf } + .terminal-770447486-r5 { fill: #858585 } + .terminal-770447486-r6 { fill: #dddddd } + .terminal-770447486-r7 { fill: #686868 } + .terminal-770447486-r8 { fill: #dfdfdf;font-weight: bold } + .terminal-770447486-r9 { fill: #232323 } + .terminal-770447486-r10 { fill: #08211a;font-weight: bold } + .terminal-770447486-r11 { fill: #45ffca;font-weight: bold } + .terminal-770447486-r12 { fill: #9d9d9d;font-style: italic; } + .terminal-770447486-r13 { fill: #0c0c0c;font-weight: bold } + .terminal-770447486-r14 { fill: #212116;font-weight: bold } + .terminal-770447486-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 +1511,193 @@ font-weight: 700; } - .terminal-2132831129-matrix { + .terminal-669318026-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2132831129-title { + .terminal-669318026-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-669318026-r1 { fill: #feffac } + .terminal-669318026-r2 { fill: #777777 } + .terminal-669318026-r3 { fill: #c5c8c6 } + .terminal-669318026-r4 { fill: #dfdfdf } + .terminal-669318026-r5 { fill: #858585 } + .terminal-669318026-r6 { fill: #dddddd } + .terminal-669318026-r7 { fill: #686868 } + .terminal-669318026-r8 { fill: #dfdfdf;font-weight: bold } + .terminal-669318026-r9 { fill: #232323 } + .terminal-669318026-r10 { fill: #08211a;font-weight: bold } + .terminal-669318026-r11 { fill: #45ffca;font-weight: bold } + .terminal-669318026-r12 { fill: #9d9d9d;font-style: italic; } + .terminal-669318026-r13 { fill: #0c0c0c;font-weight: bold } + .terminal-669318026-r14 { fill: #212116;font-weight: bold } + .terminal-669318026-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 +1727,191 @@ font-weight: 700; } - .terminal-3161496987-matrix { + .terminal-3447729563-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3161496987-title { + .terminal-3447729563-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-3447729563-r1 { fill: #feffac } + .terminal-3447729563-r2 { fill: #777777 } + .terminal-3447729563-r3 { fill: #c5c8c6 } + .terminal-3447729563-r4 { fill: #dfdfdf } + .terminal-3447729563-r5 { fill: #858585 } + .terminal-3447729563-r6 { fill: #dddddd } + .terminal-3447729563-r7 { fill: #686868 } + .terminal-3447729563-r8 { fill: #dfdfdf;font-weight: bold } + .terminal-3447729563-r9 { fill: #232323 } + .terminal-3447729563-r10 { fill: #0c0c0c;font-weight: bold } + .terminal-3447729563-r11 { fill: #212116;font-weight: bold } + .terminal-3447729563-r12 { fill: #45ffca;font-weight: bold } + .terminal-3447729563-r13 { 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,198 +1941,199 @@ font-weight: 700; } - .terminal-3234209571-matrix { + .terminal-1524346644-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3234209571-title { + .terminal-1524346644-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-1524346644-r1 { fill: #feffac } + .terminal-1524346644-r2 { fill: #777777 } + .terminal-1524346644-r3 { fill: #c5c8c6 } + .terminal-1524346644-r4 { fill: #dfdfdf } + .terminal-1524346644-r5 { fill: #858585 } + .terminal-1524346644-r6 { fill: #dddddd } + .terminal-1524346644-r7 { fill: #686868 } + .terminal-1524346644-r8 { fill: #dfdfdf;font-weight: bold } + .terminal-1524346644-r9 { fill: #232323 } + .terminal-1524346644-r10 { fill: #08211a;font-weight: bold } + .terminal-1524346644-r11 { fill: #45ffca;font-weight: bold } + .terminal-1524346644-r12 { fill: #0c0c0c;font-weight: bold } + .terminal-1524346644-r13 { fill: #212116;font-weight: bold } + .terminal-1524346644-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  ''' # --- + # name: test_s3_tree_does_not_crash_without_boto3[Error visible] ''' @@ -2343,6 +2344,7 @@ ││ ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯  ^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_query_editor.ambr b/tests/functional_tests/__snapshots__/test_query_editor.ambr index d86fbc07..337a208c 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-673038128-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3008006675-title { + .terminal-673038128-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-673038128-r1 { fill: #777777 } + .terminal-673038128-r2 { fill: #feffac } + .terminal-673038128-r3 { fill: #c5c8c6 } + .terminal-673038128-r4 { fill: #dfdfdf } + .terminal-673038128-r5 { fill: #858585 } + .terminal-673038128-r6 { fill: #dddddd } + .terminal-673038128-r7 { fill: #181818 } + .terminal-673038128-r8 { fill: #08211a;font-weight: bold } + .terminal-673038128-r9 { fill: #777777;font-weight: bold } + .terminal-673038128-r10 { fill: #e3e3e3 } + .terminal-673038128-r11 { fill: #1d1d1d } + .terminal-673038128-r12 { fill: #0c0c0c;font-weight: bold } + .terminal-673038128-r13 { fill: #212116;font-weight: bold } + .terminal-673038128-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-2942829592-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3087847148-title { + .terminal-2942829592-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-2942829592-r1 { fill: #777777 } + .terminal-2942829592-r2 { fill: #feffac } + .terminal-2942829592-r3 { fill: #c5c8c6 } + .terminal-2942829592-r4 { fill: #dfdfdf } + .terminal-2942829592-r5 { fill: #858585 } + .terminal-2942829592-r6 { fill: #dddddd } + .terminal-2942829592-r7 { fill: #181818 } + .terminal-2942829592-r8 { fill: #0c0c0c;font-weight: bold } + .terminal-2942829592-r9 { fill: #212116;font-weight: bold } + .terminal-2942829592-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-1108131652-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2228193831-title { + .terminal-1108131652-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-1108131652-r1 { fill: #777777 } + .terminal-1108131652-r2 { fill: #feffac } + .terminal-1108131652-r3 { fill: #c5c8c6 } + .terminal-1108131652-r4 { fill: #dfdfdf } + .terminal-1108131652-r5 { fill: #858585 } + .terminal-1108131652-r6 { fill: #dddddd } + .terminal-1108131652-r7 { fill: #181818 } + .terminal-1108131652-r8 { fill: #08211a;font-weight: bold } + .terminal-1108131652-r9 { fill: #777777;font-weight: bold } + .terminal-1108131652-r10 { fill: #e3e3e3 } + .terminal-1108131652-r11 { fill: #1d1d1d } + .terminal-1108131652-r12 { fill: #0c0c0c;font-weight: bold } + .terminal-1108131652-r13 { fill: #212116;font-weight: bold } + .terminal-1108131652-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 diff --git a/tests/functional_tests/test_query_editor.py b/tests/functional_tests/test_query_editor.py index a81866f2..35fa8799 100644 --- a/tests/functional_tests/test_query_editor.py +++ b/tests/functional_tests/test_query_editor.py @@ -188,6 +188,24 @@ async def test_member_autocomplete( snap_results: List[bool] = [] async with app.run_test() as pilot: 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"' From 03fe0ed6dd8dab5ce04bd2e93e02a7cab37c0149 Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Tue, 1 Oct 2024 21:05:20 +0000 Subject: [PATCH 16/21] fix: add test for context menu --- src/harlequin/components/data_catalog/tree.py | 4 + src/harlequin_duckdb/catalog.py | 2 +- .../__snapshots__/test_query_editor.ambr | 660 ++++++++++++++++++ tests/functional_tests/test_query_editor.py | 63 ++ 4 files changed, 728 insertions(+), 1 deletion(-) diff --git a/src/harlequin/components/data_catalog/tree.py b/src/harlequin/components/data_catalog/tree.py index f178aab7..e8ad2b9c 100644 --- a/src/harlequin/components/data_catalog/tree.py +++ b/src/harlequin/components/data_catalog/tree.py @@ -64,6 +64,10 @@ def __init__(self, node: TreeNode) -> None: 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) diff --git a/src/harlequin_duckdb/catalog.py b/src/harlequin_duckdb/catalog.py index 2e418ea5..67b424a8 100644 --- a/src/harlequin_duckdb/catalog.py +++ b/src/harlequin_duckdb/catalog.py @@ -122,8 +122,8 @@ def from_parent( class TempTableCatalogItem(TableCatalogItem): INTERACTIONS = RelationCatalogItem.INTERACTIONS + [ - ("Drop Table", execute_drop_table_statement), ("Show DDL", show_table_ddl), + ("Drop Table", execute_drop_table_statement), ] @classmethod diff --git a/tests/functional_tests/__snapshots__/test_query_editor.ambr b/tests/functional_tests/__snapshots__/test_query_editor.ambr index 337a208c..9cfe41fd 100644 --- a/tests/functional_tests/__snapshots__/test_query_editor.ambr +++ b/tests/functional_tests/__snapshots__/test_query_editor.ambr @@ -1,4 +1,664 @@ # 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  + + + + + + ╰──────────────────────────────────────────────────────────╯ + X Limit 500         Run Query  + │╭─ Query Results ──────────────────────────────────────────╮ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ││ + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer + + + + + ''' +# --- +# 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    ▅▅X Limit 500         Run Query  + Preview   ╭─ Query Results ──────────────────────────────────────────╮ + Data       + + + + + + + + + ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ +  ^q Quit  f1 Help  f8 History  + + + + + ''' +# --- # name: test_member_autocomplete[driver members] ''' diff --git a/tests/functional_tests/test_query_editor.py b/tests/functional_tests/test_query_editor.py index 35fa8799..77ca9b71 100644 --- a/tests/functional_tests/test_query_editor.py +++ b/tests/functional_tests/test_query_editor.py @@ -233,3 +233,66 @@ async def test_member_autocomplete( snap_results.append(await app_snapshot(app, "submitted")) assert all(snap_results) + + +@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() as pilot: + 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() + + 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) From e7a23dd5d9240060a69e2e366a25f28040279eec Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Tue, 1 Oct 2024 21:32:07 +0000 Subject: [PATCH 17/21] fix: update snapshots for history screen and s3 tree --- .../__snapshots__/test_data_catalog.ambr | 185 +++++++++-------- .../__snapshots__/test_history_screen.ambr | 187 +++++++++--------- 2 files changed, 186 insertions(+), 186 deletions(-) diff --git a/tests/functional_tests/__snapshots__/test_data_catalog.ambr b/tests/functional_tests/__snapshots__/test_data_catalog.ambr index 5460ea24..064c19e9 100644 --- a/tests/functional_tests/__snapshots__/test_data_catalog.ambr +++ b/tests/functional_tests/__snapshots__/test_data_catalog.ambr @@ -1727,191 +1727,192 @@ font-weight: 700; } - .terminal-3447729563-matrix { + .terminal-3091868817-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3447729563-title { + .terminal-3091868817-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3447729563-r1 { fill: #feffac } - .terminal-3447729563-r2 { fill: #777777 } - .terminal-3447729563-r3 { fill: #c5c8c6 } - .terminal-3447729563-r4 { fill: #dfdfdf } - .terminal-3447729563-r5 { fill: #858585 } - .terminal-3447729563-r6 { fill: #dddddd } - .terminal-3447729563-r7 { fill: #686868 } - .terminal-3447729563-r8 { fill: #dfdfdf;font-weight: bold } - .terminal-3447729563-r9 { fill: #232323 } - .terminal-3447729563-r10 { fill: #0c0c0c;font-weight: bold } - .terminal-3447729563-r11 { fill: #212116;font-weight: bold } - .terminal-3447729563-r12 { fill: #45ffca;font-weight: bold } - .terminal-3447729563-r13 { fill: #45ffca } + .terminal-3091868817-r1 { fill: #feffac } + .terminal-3091868817-r2 { fill: #777777 } + .terminal-3091868817-r3 { fill: #c5c8c6 } + .terminal-3091868817-r4 { fill: #dfdfdf } + .terminal-3091868817-r5 { fill: #858585 } + .terminal-3091868817-r6 { fill: #dddddd } + .terminal-3091868817-r7 { fill: #686868 } + .terminal-3091868817-r8 { fill: #dfdfdf;font-weight: bold } + .terminal-3091868817-r9 { fill: #232323 } + .terminal-3091868817-r10 { fill: #08211a;font-weight: bold } + .terminal-3091868817-r11 { fill: #0c0c0c;font-weight: bold } + .terminal-3091868817-r12 { fill: #212116;font-weight: bold } + .terminal-3091868817-r13 { fill: #45ffca;font-weight: bold } + .terminal-3091868817-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  . Show Context Menu  + + + + ╭─ 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  @@ -2133,7 +2134,6 @@ ''' # --- - # name: test_s3_tree_does_not_crash_without_boto3[Error visible] ''' @@ -2344,7 +2344,6 @@ ││ ╰────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────────────╯  ^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..94d39bbd 100644 --- a/tests/functional_tests/__snapshots__/test_history_screen.ambr +++ b/tests/functional_tests/__snapshots__/test_history_screen.ambr @@ -237,193 +237,194 @@ font-weight: 700; } - .terminal-119510548-matrix { + .terminal-2659470454-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-119510548-title { + .terminal-2659470454-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-2659470454-r1 { fill: #777777 } + .terminal-2659470454-r2 { fill: #feffac } + .terminal-2659470454-r3 { fill: #c5c8c6 } + .terminal-2659470454-r4 { fill: #dfdfdf } + .terminal-2659470454-r5 { fill: #001b14;font-weight: bold } + .terminal-2659470454-r6 { fill: #686868 } + .terminal-2659470454-r7 { fill: #dfdfdf;font-weight: bold } + .terminal-2659470454-r8 { fill: #232323 } + .terminal-2659470454-r9 { fill: #858585 } + .terminal-2659470454-r10 { fill: #181818;font-weight: bold } + .terminal-2659470454-r11 { fill: #feffac;font-weight: bold } + .terminal-2659470454-r12 { fill: #dddddd } + .terminal-2659470454-r13 { fill: #ffb6d9;font-weight: bold } + .terminal-2659470454-r14 { fill: #0c0c0c;font-weight: bold } + .terminal-2659470454-r15 { fill: #212116;font-weight: bold } + .terminal-2659470454-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  From 4dae54d579d5262c2007c7c806c158a275bce26e Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Tue, 1 Oct 2024 21:45:18 +0000 Subject: [PATCH 18/21] fix: suppress workercancelled in wait helper --- tests/functional_tests/conftest.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/functional_tests/conftest.py b/tests/functional_tests/conftest.py index 7dabe730..6a81b934 100644 --- a/tests/functional_tests/conftest.py +++ b/tests/functional_tests/conftest.py @@ -1,7 +1,9 @@ +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 @@ -54,6 +56,7 @@ async def wait_for_filtered_workers(app: Harlequin) -> None: w for w in app.workers if w.name != "_database_tree_background_loader" ] if filtered_workers: - await app.workers.wait_for_complete(filtered_workers) + with suppress(WorkerCancelled): + await app.workers.wait_for_complete(filtered_workers) return wait_for_filtered_workers From 5c862c48fbc8c1fdb9c31496001b324da319e29c Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Tue, 1 Oct 2024 21:48:11 +0000 Subject: [PATCH 19/21] fix: resize context menu test, move to another module --- .../__snapshots__/test_data_catalog.ambr | 1735 ++++++++++++----- .../__snapshots__/test_query_editor.ambr | 660 ------- tests/functional_tests/test_data_catalog.py | 63 + tests/functional_tests/test_query_editor.py | 63 - 4 files changed, 1356 insertions(+), 1165 deletions(-) diff --git a/tests/functional_tests/__snapshots__/test_data_catalog.ambr b/tests/functional_tests/__snapshots__/test_data_catalog.ambr index 064c19e9..e607d724 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] ''' @@ -233,190 +1084,190 @@ font-weight: 700; } - .terminal-2796946758-matrix { + .terminal-2041775416-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2796946758-title { + .terminal-2041775416-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2796946758-r1 { fill: #777777 } - .terminal-2796946758-r2 { fill: #feffac } - .terminal-2796946758-r3 { fill: #c5c8c6 } - .terminal-2796946758-r4 { fill: #dfdfdf } - .terminal-2796946758-r5 { fill: #858585 } - .terminal-2796946758-r6 { fill: #dddddd } - .terminal-2796946758-r7 { fill: #feffac;font-weight: bold } - .terminal-2796946758-r8 { fill: #181818 } - .terminal-2796946758-r9 { fill: #001b14;font-weight: bold } - .terminal-2796946758-r10 { fill: #0c0c0c;font-weight: bold } - .terminal-2796946758-r11 { fill: #212116;font-weight: bold } - .terminal-2796946758-r12 { fill: #45ffca;font-weight: bold } + .terminal-2041775416-r1 { fill: #777777 } + .terminal-2041775416-r2 { fill: #feffac } + .terminal-2041775416-r3 { fill: #c5c8c6 } + .terminal-2041775416-r4 { fill: #dfdfdf } + .terminal-2041775416-r5 { fill: #858585 } + .terminal-2041775416-r6 { fill: #dddddd } + .terminal-2041775416-r7 { fill: #feffac;font-weight: bold } + .terminal-2041775416-r8 { fill: #181818 } + .terminal-2041775416-r9 { fill: #001b14;font-weight: bold } + .terminal-2041775416-r10 { fill: #0c0c0c;font-weight: bold } + .terminal-2041775416-r11 { fill: #212116;font-weight: bold } + .terminal-2041775416-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-2982107205-matrix { + .terminal-1389451323-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2982107205-title { + .terminal-1389451323-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2982107205-r1 { fill: #feffac } - .terminal-2982107205-r2 { fill: #777777 } - .terminal-2982107205-r3 { fill: #c5c8c6 } - .terminal-2982107205-r4 { fill: #dfdfdf } - .terminal-2982107205-r5 { fill: #08211a;font-weight: bold } - .terminal-2982107205-r6 { fill: #858585 } - .terminal-2982107205-r7 { fill: #dddddd } - .terminal-2982107205-r8 { fill: #45ffca;font-weight: bold } - .terminal-2982107205-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-2982107205-r10 { fill: #212116;font-weight: bold } - .terminal-2982107205-r11 { fill: #45ffca } + .terminal-1389451323-r1 { fill: #feffac } + .terminal-1389451323-r2 { fill: #777777 } + .terminal-1389451323-r3 { fill: #c5c8c6 } + .terminal-1389451323-r4 { fill: #dfdfdf } + .terminal-1389451323-r5 { fill: #08211a;font-weight: bold } + .terminal-1389451323-r6 { fill: #858585 } + .terminal-1389451323-r7 { fill: #dddddd } + .terminal-1389451323-r8 { fill: #45ffca;font-weight: bold } + .terminal-1389451323-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-1389451323-r10 { fill: #212116;font-weight: bold } + .terminal-1389451323-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  . Show Context Menu  + + ╭─ 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-3662799077-matrix { + .terminal-883613911-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3662799077-title { + .terminal-883613911-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3662799077-r1 { fill: #feffac } - .terminal-3662799077-r2 { fill: #777777 } - .terminal-3662799077-r3 { fill: #c5c8c6 } - .terminal-3662799077-r4 { fill: #dfdfdf } - .terminal-3662799077-r5 { fill: #858585 } - .terminal-3662799077-r6 { fill: #dddddd } - .terminal-3662799077-r7 { fill: #08211a;font-weight: bold } - .terminal-3662799077-r8 { fill: #45ffca;font-weight: bold } - .terminal-3662799077-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-3662799077-r10 { fill: #212116;font-weight: bold } - .terminal-3662799077-r11 { fill: #45ffca } + .terminal-883613911-r1 { fill: #feffac } + .terminal-883613911-r2 { fill: #777777 } + .terminal-883613911-r3 { fill: #c5c8c6 } + .terminal-883613911-r4 { fill: #dfdfdf } + .terminal-883613911-r5 { fill: #858585 } + .terminal-883613911-r6 { fill: #dddddd } + .terminal-883613911-r7 { fill: #08211a;font-weight: bold } + .terminal-883613911-r8 { fill: #45ffca;font-weight: bold } + .terminal-883613911-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-883613911-r10 { fill: #212116;font-weight: bold } + .terminal-883613911-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  . Show Context Menu  + + ╭─ 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-3498695546-matrix { + .terminal-1339480787-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3498695546-title { + .terminal-1339480787-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3498695546-r1 { fill: #777777 } - .terminal-3498695546-r2 { fill: #feffac } - .terminal-3498695546-r3 { fill: #c5c8c6 } - .terminal-3498695546-r4 { fill: #dfdfdf } - .terminal-3498695546-r5 { fill: #858585 } - .terminal-3498695546-r6 { fill: #dddddd } - .terminal-3498695546-r7 { fill: #181818 } - .terminal-3498695546-r8 { fill: #001b14;font-weight: bold } - .terminal-3498695546-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-3498695546-r10 { fill: #212116;font-weight: bold } - .terminal-3498695546-r11 { fill: #45ffca;font-weight: bold } + .terminal-1339480787-r1 { fill: #777777 } + .terminal-1339480787-r2 { fill: #feffac } + .terminal-1339480787-r3 { fill: #c5c8c6 } + .terminal-1339480787-r4 { fill: #dfdfdf } + .terminal-1339480787-r5 { fill: #858585 } + .terminal-1339480787-r6 { fill: #dddddd } + .terminal-1339480787-r7 { fill: #181818 } + .terminal-1339480787-r8 { fill: #001b14;font-weight: bold } + .terminal-1339480787-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-1339480787-r10 { fill: #212116;font-weight: bold } + .terminal-1339480787-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-505447714-matrix { + .terminal-1363772539-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-505447714-title { + .terminal-1363772539-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-505447714-r1 { fill: #feffac } - .terminal-505447714-r2 { fill: #777777 } - .terminal-505447714-r3 { fill: #c5c8c6 } - .terminal-505447714-r4 { fill: #dfdfdf } - .terminal-505447714-r5 { fill: #858585 } - .terminal-505447714-r6 { fill: #dddddd } - .terminal-505447714-r7 { fill: #feffac;font-weight: bold } - .terminal-505447714-r8 { fill: #08211a;font-weight: bold } - .terminal-505447714-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-505447714-r10 { fill: #212116;font-weight: bold } - .terminal-505447714-r11 { fill: #45ffca;font-weight: bold } - .terminal-505447714-r12 { fill: #45ffca } + .terminal-1363772539-r1 { fill: #feffac } + .terminal-1363772539-r2 { fill: #777777 } + .terminal-1363772539-r3 { fill: #c5c8c6 } + .terminal-1363772539-r4 { fill: #dfdfdf } + .terminal-1363772539-r5 { fill: #858585 } + .terminal-1363772539-r6 { fill: #dddddd } + .terminal-1363772539-r7 { fill: #feffac;font-weight: bold } + .terminal-1363772539-r8 { fill: #08211a;font-weight: bold } + .terminal-1363772539-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-1363772539-r10 { fill: #212116;font-weight: bold } + .terminal-1363772539-r11 { fill: #45ffca;font-weight: bold } + .terminal-1363772539-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  . Show Context Menu  + + ╭─ 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  diff --git a/tests/functional_tests/__snapshots__/test_query_editor.ambr b/tests/functional_tests/__snapshots__/test_query_editor.ambr index 9cfe41fd..337a208c 100644 --- a/tests/functional_tests/__snapshots__/test_query_editor.ambr +++ b/tests/functional_tests/__snapshots__/test_query_editor.ambr @@ -1,664 +1,4 @@ # 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  - - - - - - ╰──────────────────────────────────────────────────────────╯ - X Limit 500         Run Query  - │╭─ Query Results ──────────────────────────────────────────╮ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ││ - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  ^⏎ or ^j Run Query  f4 Format Query  ^s Save Quer - - - - - ''' -# --- -# 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    ▅▅X Limit 500         Run Query  - Preview   ╭─ Query Results ──────────────────────────────────────────╮ - Data       - - - - - - - - - ╰──────────────────╯╰──────────────────────────────────────────────────────────╯ -  ^q Quit  f1 Help  f8 History  - - - - - ''' -# --- # name: test_member_autocomplete[driver members] ''' diff --git a/tests/functional_tests/test_data_catalog.py b/tests/functional_tests/test_data_catalog.py index e53bb2b3..fa9e2189 100644 --- a/tests/functional_tests/test_data_catalog.py +++ b/tests/functional_tests/test_data_catalog.py @@ -211,3 +211,66 @@ async def test_s3_tree_does_not_crash_without_boto3( await wait_for_workers(app) 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) + + # 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_query_editor.py b/tests/functional_tests/test_query_editor.py index 77ca9b71..35fa8799 100644 --- a/tests/functional_tests/test_query_editor.py +++ b/tests/functional_tests/test_query_editor.py @@ -233,66 +233,3 @@ async def test_member_autocomplete( snap_results.append(await app_snapshot(app, "submitted")) assert all(snap_results) - - -@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() as pilot: - 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() - - 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) From 556ef2a40805b5e045e972bbcc8c38d323ea35c0 Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Wed, 9 Oct 2024 19:42:25 +0000 Subject: [PATCH 20/21] fix: try these snapshots instead --- .../__snapshots__/test_data_catalog.ambr | 884 +++++++++--------- 1 file changed, 442 insertions(+), 442 deletions(-) diff --git a/tests/functional_tests/__snapshots__/test_data_catalog.ambr b/tests/functional_tests/__snapshots__/test_data_catalog.ambr index e607d724..5ec572f3 100644 --- a/tests/functional_tests/__snapshots__/test_data_catalog.ambr +++ b/tests/functional_tests/__snapshots__/test_data_catalog.ambr @@ -1084,190 +1084,190 @@ font-weight: 700; } - .terminal-2041775416-matrix { + .terminal-2796946758-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2041775416-title { + .terminal-2796946758-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2041775416-r1 { fill: #777777 } - .terminal-2041775416-r2 { fill: #feffac } - .terminal-2041775416-r3 { fill: #c5c8c6 } - .terminal-2041775416-r4 { fill: #dfdfdf } - .terminal-2041775416-r5 { fill: #858585 } - .terminal-2041775416-r6 { fill: #dddddd } - .terminal-2041775416-r7 { fill: #feffac;font-weight: bold } - .terminal-2041775416-r8 { fill: #181818 } - .terminal-2041775416-r9 { fill: #001b14;font-weight: bold } - .terminal-2041775416-r10 { fill: #0c0c0c;font-weight: bold } - .terminal-2041775416-r11 { fill: #212116;font-weight: bold } - .terminal-2041775416-r12 { fill: #45ffca;font-weight: bold } + .terminal-2796946758-r1 { fill: #777777 } + .terminal-2796946758-r2 { fill: #feffac } + .terminal-2796946758-r3 { fill: #c5c8c6 } + .terminal-2796946758-r4 { fill: #dfdfdf } + .terminal-2796946758-r5 { fill: #858585 } + .terminal-2796946758-r6 { fill: #dddddd } + .terminal-2796946758-r7 { fill: #feffac;font-weight: bold } + .terminal-2796946758-r8 { fill: #181818 } + .terminal-2796946758-r9 { fill: #001b14;font-weight: bold } + .terminal-2796946758-r10 { fill: #0c0c0c;font-weight: bold } + .terminal-2796946758-r11 { fill: #212116;font-weight: bold } + .terminal-2796946758-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  @@ -1297,189 +1297,189 @@ font-weight: 700; } - .terminal-1389451323-matrix { + .terminal-2982107205-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1389451323-title { + .terminal-2982107205-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1389451323-r1 { fill: #feffac } - .terminal-1389451323-r2 { fill: #777777 } - .terminal-1389451323-r3 { fill: #c5c8c6 } - .terminal-1389451323-r4 { fill: #dfdfdf } - .terminal-1389451323-r5 { fill: #08211a;font-weight: bold } - .terminal-1389451323-r6 { fill: #858585 } - .terminal-1389451323-r7 { fill: #dddddd } - .terminal-1389451323-r8 { fill: #45ffca;font-weight: bold } - .terminal-1389451323-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-1389451323-r10 { fill: #212116;font-weight: bold } - .terminal-1389451323-r11 { fill: #45ffca } + .terminal-2982107205-r1 { fill: #feffac } + .terminal-2982107205-r2 { fill: #777777 } + .terminal-2982107205-r3 { fill: #c5c8c6 } + .terminal-2982107205-r4 { fill: #dfdfdf } + .terminal-2982107205-r5 { fill: #08211a;font-weight: bold } + .terminal-2982107205-r6 { fill: #858585 } + .terminal-2982107205-r7 { fill: #dddddd } + .terminal-2982107205-r8 { fill: #45ffca;font-weight: bold } + .terminal-2982107205-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-2982107205-r10 { fill: #212116;font-weight: bold } + .terminal-2982107205-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  . Show Context Menu  + + ╭─ 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  @@ -1509,189 +1509,189 @@ font-weight: 700; } - .terminal-883613911-matrix { + .terminal-3662799077-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-883613911-title { + .terminal-3662799077-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-883613911-r1 { fill: #feffac } - .terminal-883613911-r2 { fill: #777777 } - .terminal-883613911-r3 { fill: #c5c8c6 } - .terminal-883613911-r4 { fill: #dfdfdf } - .terminal-883613911-r5 { fill: #858585 } - .terminal-883613911-r6 { fill: #dddddd } - .terminal-883613911-r7 { fill: #08211a;font-weight: bold } - .terminal-883613911-r8 { fill: #45ffca;font-weight: bold } - .terminal-883613911-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-883613911-r10 { fill: #212116;font-weight: bold } - .terminal-883613911-r11 { fill: #45ffca } + .terminal-3662799077-r1 { fill: #feffac } + .terminal-3662799077-r2 { fill: #777777 } + .terminal-3662799077-r3 { fill: #c5c8c6 } + .terminal-3662799077-r4 { fill: #dfdfdf } + .terminal-3662799077-r5 { fill: #858585 } + .terminal-3662799077-r6 { fill: #dddddd } + .terminal-3662799077-r7 { fill: #08211a;font-weight: bold } + .terminal-3662799077-r8 { fill: #45ffca;font-weight: bold } + .terminal-3662799077-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-3662799077-r10 { fill: #212116;font-weight: bold } + .terminal-3662799077-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  . Show Context Menu  + + ╭─ 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  @@ -1721,189 +1721,189 @@ font-weight: 700; } - .terminal-1339480787-matrix { + .terminal-3498695546-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1339480787-title { + .terminal-3498695546-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1339480787-r1 { fill: #777777 } - .terminal-1339480787-r2 { fill: #feffac } - .terminal-1339480787-r3 { fill: #c5c8c6 } - .terminal-1339480787-r4 { fill: #dfdfdf } - .terminal-1339480787-r5 { fill: #858585 } - .terminal-1339480787-r6 { fill: #dddddd } - .terminal-1339480787-r7 { fill: #181818 } - .terminal-1339480787-r8 { fill: #001b14;font-weight: bold } - .terminal-1339480787-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-1339480787-r10 { fill: #212116;font-weight: bold } - .terminal-1339480787-r11 { fill: #45ffca;font-weight: bold } + .terminal-3498695546-r1 { fill: #777777 } + .terminal-3498695546-r2 { fill: #feffac } + .terminal-3498695546-r3 { fill: #c5c8c6 } + .terminal-3498695546-r4 { fill: #dfdfdf } + .terminal-3498695546-r5 { fill: #858585 } + .terminal-3498695546-r6 { fill: #dddddd } + .terminal-3498695546-r7 { fill: #181818 } + .terminal-3498695546-r8 { fill: #001b14;font-weight: bold } + .terminal-3498695546-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-3498695546-r10 { fill: #212116;font-weight: bold } + .terminal-3498695546-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  @@ -1933,190 +1933,190 @@ font-weight: 700; } - .terminal-1363772539-matrix { + .terminal-505447714-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1363772539-title { + .terminal-505447714-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1363772539-r1 { fill: #feffac } - .terminal-1363772539-r2 { fill: #777777 } - .terminal-1363772539-r3 { fill: #c5c8c6 } - .terminal-1363772539-r4 { fill: #dfdfdf } - .terminal-1363772539-r5 { fill: #858585 } - .terminal-1363772539-r6 { fill: #dddddd } - .terminal-1363772539-r7 { fill: #feffac;font-weight: bold } - .terminal-1363772539-r8 { fill: #08211a;font-weight: bold } - .terminal-1363772539-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-1363772539-r10 { fill: #212116;font-weight: bold } - .terminal-1363772539-r11 { fill: #45ffca;font-weight: bold } - .terminal-1363772539-r12 { fill: #45ffca } + .terminal-505447714-r1 { fill: #feffac } + .terminal-505447714-r2 { fill: #777777 } + .terminal-505447714-r3 { fill: #c5c8c6 } + .terminal-505447714-r4 { fill: #dfdfdf } + .terminal-505447714-r5 { fill: #858585 } + .terminal-505447714-r6 { fill: #dddddd } + .terminal-505447714-r7 { fill: #feffac;font-weight: bold } + .terminal-505447714-r8 { fill: #08211a;font-weight: bold } + .terminal-505447714-r9 { fill: #0c0c0c;font-weight: bold } + .terminal-505447714-r10 { fill: #212116;font-weight: bold } + .terminal-505447714-r11 { fill: #45ffca;font-weight: bold } + .terminal-505447714-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  . Show Context Menu  + + ╭─ 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  From 4e9be7571844710c1ff14486604a05439df6f95a Mon Sep 17 00:00:00 2001 From: Ted Conbeer Date: Wed, 9 Oct 2024 20:28:29 +0000 Subject: [PATCH 21/21] fix: use normalized svgs --- poetry.lock | 60 +- .../__snapshots__/test_app.ambr | 5020 ++++++++--------- .../__snapshots__/test_data_catalog.ambr | 2684 ++++----- .../__snapshots__/test_export.ambr | 2832 +++++----- .../__snapshots__/test_help_screen.ambr | 192 +- .../__snapshots__/test_history_screen.ambr | 368 +- .../__snapshots__/test_keys_app.ambr | 1516 ++--- .../__snapshots__/test_layout.ambr | 1752 +++--- .../__snapshots__/test_query_editor.ambr | 2962 +++++----- .../__snapshots__/test_results_viewer.ambr | 804 +-- .../__snapshots__/test_run_query_bar.ambr | 1798 +++--- tests/functional_tests/test_data_catalog.py | 14 +- 12 files changed, 9975 insertions(+), 10027 deletions(-) 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/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 5ec572f3..aefb68f8 100644 --- a/tests/functional_tests/__snapshots__/test_data_catalog.ambr +++ b/tests/functional_tests/__snapshots__/test_data_catalog.ambr @@ -22,190 +22,190 @@ font-weight: 700; } - .terminal-777945586-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-777945586-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-777945586-r1 { fill: #feffac } - .terminal-777945586-r2 { fill: #777777 } - .terminal-777945586-r3 { fill: #c5c8c6 } - .terminal-777945586-r4 { fill: #dfdfdf } - .terminal-777945586-r5 { fill: #001b14;font-weight: bold } - .terminal-777945586-r6 { fill: #858585 } - .terminal-777945586-r7 { fill: #dddddd } - .terminal-777945586-r8 { fill: #45ffca;font-weight: bold } - .terminal-777945586-r9 { fill: #08211a } - .terminal-777945586-r10 { fill: #0c0c0c;font-weight: bold } - .terminal-777945586-r11 { fill: #212116;font-weight: bold } - .terminal-777945586-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: #001b14;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: #08211a } + .terminal-9999999-r10 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r11 { fill: #212116;font-weight: bold } + .terminal-9999999-r12 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + 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  + + ╭─ 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  @@ -235,189 +235,189 @@ font-weight: 700; } - .terminal-4171859219-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4171859219-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4171859219-r1 { fill: #777777 } - .terminal-4171859219-r2 { fill: #feffac } - .terminal-4171859219-r3 { fill: #c5c8c6 } - .terminal-4171859219-r4 { fill: #dfdfdf } - .terminal-4171859219-r5 { fill: #001b14;font-weight: bold } - .terminal-4171859219-r6 { fill: #858585 } - .terminal-4171859219-r7 { fill: #dddddd } - .terminal-4171859219-r8 { fill: #181818 } - .terminal-4171859219-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-4171859219-r10 { fill: #212116;font-weight: bold } - .terminal-4171859219-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: #001b14;font-weight: bold } + .terminal-9999999-r6 { fill: #858585 } + .terminal-9999999-r7 { fill: #dddddd } + .terminal-9999999-r8 { fill: #181818 } + .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  "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  + + ╭─ 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  @@ -447,190 +447,190 @@ font-weight: 700; } - .terminal-2091148032-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2091148032-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2091148032-r1 { fill: #feffac } - .terminal-2091148032-r2 { fill: #777777 } - .terminal-2091148032-r3 { fill: #c5c8c6 } - .terminal-2091148032-r4 { fill: #dfdfdf } - .terminal-2091148032-r5 { fill: #858585 } - .terminal-2091148032-r6 { fill: #dddddd } - .terminal-2091148032-r7 { fill: #001b14;font-weight: bold } - .terminal-2091148032-r8 { fill: #45ffca;font-weight: bold } - .terminal-2091148032-r9 { fill: #08211a } - .terminal-2091148032-r10 { fill: #0c0c0c;font-weight: bold } - .terminal-2091148032-r11 { fill: #212116;font-weight: bold } - .terminal-2091148032-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: #001b14;font-weight: bold } + .terminal-9999999-r8 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r9 { fill: #08211a } + .terminal-9999999-r10 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r11 { fill: #212116;font-weight: bold } + .terminal-9999999-r12 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + 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  + + ╭─ 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  @@ -660,190 +660,190 @@ font-weight: 700; } - .terminal-2477537905-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2477537905-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2477537905-r1 { fill: #feffac } - .terminal-2477537905-r2 { fill: #777777 } - .terminal-2477537905-r3 { fill: #c5c8c6 } - .terminal-2477537905-r4 { fill: #dfdfdf } - .terminal-2477537905-r5 { fill: #858585 } - .terminal-2477537905-r6 { fill: #dddddd } - .terminal-2477537905-r7 { fill: #001b14;font-weight: bold } - .terminal-2477537905-r8 { fill: #45ffca;font-weight: bold } - .terminal-2477537905-r9 { fill: #08211a } - .terminal-2477537905-r10 { fill: #0c0c0c;font-weight: bold } - .terminal-2477537905-r11 { fill: #212116;font-weight: bold } - .terminal-2477537905-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: #001b14;font-weight: bold } + .terminal-9999999-r8 { fill: #45ffca;font-weight: bold } + .terminal-9999999-r9 { fill: #08211a } + .terminal-9999999-r10 { fill: #0c0c0c;font-weight: bold } + .terminal-9999999-r11 { fill: #212116;font-weight: bold } + .terminal-9999999-r12 { fill: #45ffca } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Harlequin + 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  + + ╭─ 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  @@ -873,188 +873,188 @@ font-weight: 700; } - .terminal-4208397213-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4208397213-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4208397213-r1 { fill: #777777 } - .terminal-4208397213-r2 { fill: #feffac } - .terminal-4208397213-r3 { fill: #c5c8c6 } - .terminal-4208397213-r4 { fill: #dfdfdf } - .terminal-4208397213-r5 { fill: #858585 } - .terminal-4208397213-r6 { fill: #181818 } - .terminal-4208397213-r7 { fill: #dddddd } - .terminal-4208397213-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-4208397213-r9 { fill: #212116;font-weight: bold } - .terminal-4208397213-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  @@ -1084,190 +1084,190 @@ font-weight: 700; } - .terminal-2796946758-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2796946758-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2796946758-r1 { fill: #777777 } - .terminal-2796946758-r2 { fill: #feffac } - .terminal-2796946758-r3 { fill: #c5c8c6 } - .terminal-2796946758-r4 { fill: #dfdfdf } - .terminal-2796946758-r5 { fill: #858585 } - .terminal-2796946758-r6 { fill: #dddddd } - .terminal-2796946758-r7 { fill: #feffac;font-weight: bold } - .terminal-2796946758-r8 { fill: #181818 } - .terminal-2796946758-r9 { fill: #001b14;font-weight: bold } - .terminal-2796946758-r10 { fill: #0c0c0c;font-weight: bold } - .terminal-2796946758-r11 { fill: #212116;font-weight: bold } - .terminal-2796946758-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  @@ -1297,189 +1297,189 @@ font-weight: 700; } - .terminal-2982107205-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2982107205-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2982107205-r1 { fill: #feffac } - .terminal-2982107205-r2 { fill: #777777 } - .terminal-2982107205-r3 { fill: #c5c8c6 } - .terminal-2982107205-r4 { fill: #dfdfdf } - .terminal-2982107205-r5 { fill: #08211a;font-weight: bold } - .terminal-2982107205-r6 { fill: #858585 } - .terminal-2982107205-r7 { fill: #dddddd } - .terminal-2982107205-r8 { fill: #45ffca;font-weight: bold } - .terminal-2982107205-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-2982107205-r10 { fill: #212116;font-weight: bold } - .terminal-2982107205-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  . Show Context Menu  + + ╭─ 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  @@ -1509,189 +1509,189 @@ font-weight: 700; } - .terminal-3662799077-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3662799077-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3662799077-r1 { fill: #feffac } - .terminal-3662799077-r2 { fill: #777777 } - .terminal-3662799077-r3 { fill: #c5c8c6 } - .terminal-3662799077-r4 { fill: #dfdfdf } - .terminal-3662799077-r5 { fill: #858585 } - .terminal-3662799077-r6 { fill: #dddddd } - .terminal-3662799077-r7 { fill: #08211a;font-weight: bold } - .terminal-3662799077-r8 { fill: #45ffca;font-weight: bold } - .terminal-3662799077-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-3662799077-r10 { fill: #212116;font-weight: bold } - .terminal-3662799077-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  . Show Context Menu  + + ╭─ 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  @@ -1721,189 +1721,189 @@ font-weight: 700; } - .terminal-3498695546-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3498695546-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3498695546-r1 { fill: #777777 } - .terminal-3498695546-r2 { fill: #feffac } - .terminal-3498695546-r3 { fill: #c5c8c6 } - .terminal-3498695546-r4 { fill: #dfdfdf } - .terminal-3498695546-r5 { fill: #858585 } - .terminal-3498695546-r6 { fill: #dddddd } - .terminal-3498695546-r7 { fill: #181818 } - .terminal-3498695546-r8 { fill: #001b14;font-weight: bold } - .terminal-3498695546-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-3498695546-r10 { fill: #212116;font-weight: bold } - .terminal-3498695546-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  @@ -1933,190 +1933,190 @@ font-weight: 700; } - .terminal-505447714-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-505447714-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-505447714-r1 { fill: #feffac } - .terminal-505447714-r2 { fill: #777777 } - .terminal-505447714-r3 { fill: #c5c8c6 } - .terminal-505447714-r4 { fill: #dfdfdf } - .terminal-505447714-r5 { fill: #858585 } - .terminal-505447714-r6 { fill: #dddddd } - .terminal-505447714-r7 { fill: #feffac;font-weight: bold } - .terminal-505447714-r8 { fill: #08211a;font-weight: bold } - .terminal-505447714-r9 { fill: #0c0c0c;font-weight: bold } - .terminal-505447714-r10 { fill: #212116;font-weight: bold } - .terminal-505447714-r11 { fill: #45ffca;font-weight: bold } - .terminal-505447714-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  . Show Context Menu  + + ╭─ 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  @@ -2146,193 +2146,193 @@ font-weight: 700; } - .terminal-770447486-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-770447486-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-770447486-r1 { fill: #feffac } - .terminal-770447486-r2 { fill: #777777 } - .terminal-770447486-r3 { fill: #c5c8c6 } - .terminal-770447486-r4 { fill: #dfdfdf } - .terminal-770447486-r5 { fill: #858585 } - .terminal-770447486-r6 { fill: #dddddd } - .terminal-770447486-r7 { fill: #686868 } - .terminal-770447486-r8 { fill: #dfdfdf;font-weight: bold } - .terminal-770447486-r9 { fill: #232323 } - .terminal-770447486-r10 { fill: #08211a;font-weight: bold } - .terminal-770447486-r11 { fill: #45ffca;font-weight: bold } - .terminal-770447486-r12 { fill: #9d9d9d;font-style: italic; } - .terminal-770447486-r13 { fill: #0c0c0c;font-weight: bold } - .terminal-770447486-r14 { fill: #212116;font-weight: bold } - .terminal-770447486-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  . Show Context Menu  + + ╭─ 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  @@ -2362,193 +2362,193 @@ font-weight: 700; } - .terminal-669318026-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-669318026-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-669318026-r1 { fill: #feffac } - .terminal-669318026-r2 { fill: #777777 } - .terminal-669318026-r3 { fill: #c5c8c6 } - .terminal-669318026-r4 { fill: #dfdfdf } - .terminal-669318026-r5 { fill: #858585 } - .terminal-669318026-r6 { fill: #dddddd } - .terminal-669318026-r7 { fill: #686868 } - .terminal-669318026-r8 { fill: #dfdfdf;font-weight: bold } - .terminal-669318026-r9 { fill: #232323 } - .terminal-669318026-r10 { fill: #08211a;font-weight: bold } - .terminal-669318026-r11 { fill: #45ffca;font-weight: bold } - .terminal-669318026-r12 { fill: #9d9d9d;font-style: italic; } - .terminal-669318026-r13 { fill: #0c0c0c;font-weight: bold } - .terminal-669318026-r14 { fill: #212116;font-weight: bold } - .terminal-669318026-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  . Show Context Menu  + + ╭─ 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  @@ -2578,192 +2578,192 @@ font-weight: 700; } - .terminal-3091868817-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3091868817-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3091868817-r1 { fill: #feffac } - .terminal-3091868817-r2 { fill: #777777 } - .terminal-3091868817-r3 { fill: #c5c8c6 } - .terminal-3091868817-r4 { fill: #dfdfdf } - .terminal-3091868817-r5 { fill: #858585 } - .terminal-3091868817-r6 { fill: #dddddd } - .terminal-3091868817-r7 { fill: #686868 } - .terminal-3091868817-r8 { fill: #dfdfdf;font-weight: bold } - .terminal-3091868817-r9 { fill: #232323 } - .terminal-3091868817-r10 { fill: #08211a;font-weight: bold } - .terminal-3091868817-r11 { fill: #0c0c0c;font-weight: bold } - .terminal-3091868817-r12 { fill: #212116;font-weight: bold } - .terminal-3091868817-r13 { fill: #45ffca;font-weight: bold } - .terminal-3091868817-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: #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  . Show Context Menu  + + ╭─ 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  @@ -2793,192 +2793,192 @@ font-weight: 700; } - .terminal-1524346644-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1524346644-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1524346644-r1 { fill: #feffac } - .terminal-1524346644-r2 { fill: #777777 } - .terminal-1524346644-r3 { fill: #c5c8c6 } - .terminal-1524346644-r4 { fill: #dfdfdf } - .terminal-1524346644-r5 { fill: #858585 } - .terminal-1524346644-r6 { fill: #dddddd } - .terminal-1524346644-r7 { fill: #686868 } - .terminal-1524346644-r8 { fill: #dfdfdf;font-weight: bold } - .terminal-1524346644-r9 { fill: #232323 } - .terminal-1524346644-r10 { fill: #08211a;font-weight: bold } - .terminal-1524346644-r11 { fill: #45ffca;font-weight: bold } - .terminal-1524346644-r12 { fill: #0c0c0c;font-weight: bold } - .terminal-1524346644-r13 { fill: #212116;font-weight: bold } - .terminal-1524346644-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  . Show Context Menu  + + ╭─ 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  @@ -3008,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 94d39bbd..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,194 +237,194 @@ font-weight: 700; } - .terminal-2659470454-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2659470454-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2659470454-r1 { fill: #777777 } - .terminal-2659470454-r2 { fill: #feffac } - .terminal-2659470454-r3 { fill: #c5c8c6 } - .terminal-2659470454-r4 { fill: #dfdfdf } - .terminal-2659470454-r5 { fill: #001b14;font-weight: bold } - .terminal-2659470454-r6 { fill: #686868 } - .terminal-2659470454-r7 { fill: #dfdfdf;font-weight: bold } - .terminal-2659470454-r8 { fill: #232323 } - .terminal-2659470454-r9 { fill: #858585 } - .terminal-2659470454-r10 { fill: #181818;font-weight: bold } - .terminal-2659470454-r11 { fill: #feffac;font-weight: bold } - .terminal-2659470454-r12 { fill: #dddddd } - .terminal-2659470454-r13 { fill: #ffb6d9;font-weight: bold } - .terminal-2659470454-r14 { fill: #0c0c0c;font-weight: bold } - .terminal-2659470454-r15 { fill: #212116;font-weight: bold } - .terminal-2659470454-r16 { 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 d6646358..77387c50 100644 --- a/tests/functional_tests/__snapshots__/test_keys_app.ambr +++ b/tests/functional_tests/__snapshots__/test_keys_app.ambr @@ -22,200 +22,200 @@ font-weight: 700; } - .terminal-1759661775-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1759661775-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1759661775-r1 { fill: #dfdfdf } - .terminal-1759661775-r2 { fill: #606060;font-style: italic; } - .terminal-1759661775-r3 { fill: #c5c8c6 } - .terminal-1759661775-r4 { fill: #606060;font-weight: bold } - .terminal-1759661775-r5 { fill: #6c6d4c } - .terminal-1759661775-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-1759661775-r7 { fill: #feffac } - .terminal-1759661775-r8 { fill: #606060 } - .terminal-1759661775-r9 { fill: #dfdfdf;font-weight: bold } - .terminal-1759661775-r10 { fill: #8a8a8a;font-style: italic; } - .terminal-1759661775-r11 { fill: #0a1411 } - .terminal-1759661775-r12 { fill: #8a8a8a;font-weight: bold } - .terminal-1759661775-r13 { fill: #8a8a8a } - .terminal-1759661775-r14 { fill: #777777 } - .terminal-1759661775-r15 { fill: #ffb6d9 } - .terminal-1759661775-r16 { fill: #45ffca } - .terminal-1759661775-r17 { fill: #45ffca;font-weight: bold } - .terminal-1759661775-r18 { fill: #686868 } - .terminal-1759661775-r19 { fill: #ededed;font-weight: bold } - .terminal-1759661775-r20 { fill: #212116;font-weight: bold } - .terminal-1759661775-r21 { fill: #226d58;font-weight: bold } - .terminal-1759661775-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: #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  @@ -245,199 +245,199 @@ font-weight: 700; } - .terminal-3621805236-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3621805236-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3621805236-r1 { fill: #dfdfdf } - .terminal-3621805236-r2 { fill: #606060;font-style: italic; } - .terminal-3621805236-r3 { fill: #c5c8c6 } - .terminal-3621805236-r4 { fill: #606060;font-weight: bold } - .terminal-3621805236-r5 { fill: #6c6d4c } - .terminal-3621805236-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-3621805236-r7 { fill: #606060 } - .terminal-3621805236-r8 { fill: #feffac } - .terminal-3621805236-r9 { fill: #dfdfdf;font-weight: bold } - .terminal-3621805236-r10 { fill: #0a1411 } - .terminal-3621805236-r11 { fill: #8a8a8a;font-style: italic; } - .terminal-3621805236-r12 { fill: #8a8a8a;font-weight: bold } - .terminal-3621805236-r13 { fill: #8a8a8a } - .terminal-3621805236-r14 { fill: #45ffca } - .terminal-3621805236-r15 { fill: #777777 } - .terminal-3621805236-r16 { fill: #ffb6d9 } - .terminal-3621805236-r17 { fill: #686868 } - .terminal-3621805236-r18 { fill: #ededed;font-weight: bold } - .terminal-3621805236-r19 { fill: #212116;font-weight: bold } - .terminal-3621805236-r20 { fill: #226d58;font-weight: bold } - .terminal-3621805236-r21 { 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  @@ -467,199 +467,199 @@ font-weight: 700; } - .terminal-3656408244-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3656408244-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3656408244-r1 { fill: #dfdfdf } - .terminal-3656408244-r2 { fill: #606060;font-style: italic; } - .terminal-3656408244-r3 { fill: #c5c8c6 } - .terminal-3656408244-r4 { fill: #606060;font-weight: bold } - .terminal-3656408244-r5 { fill: #6c6d4c } - .terminal-3656408244-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-3656408244-r7 { fill: #606060 } - .terminal-3656408244-r8 { fill: #feffac } - .terminal-3656408244-r9 { fill: #dfdfdf;font-weight: bold } - .terminal-3656408244-r10 { fill: #0a1411 } - .terminal-3656408244-r11 { fill: #8a8a8a;font-style: italic; } - .terminal-3656408244-r12 { fill: #8a8a8a;font-weight: bold } - .terminal-3656408244-r13 { fill: #8a8a8a } - .terminal-3656408244-r14 { fill: #777777 } - .terminal-3656408244-r15 { fill: #45ffca } - .terminal-3656408244-r16 { fill: #ffb6d9;font-weight: bold } - .terminal-3656408244-r17 { fill: #686868 } - .terminal-3656408244-r18 { fill: #ededed;font-weight: bold } - .terminal-3656408244-r19 { fill: #212116;font-weight: bold } - .terminal-3656408244-r20 { fill: #226d58;font-weight: bold } - .terminal-3656408244-r21 { 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  @@ -689,199 +689,199 @@ font-weight: 700; } - .terminal-750017715-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-750017715-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-750017715-r1 { fill: #dfdfdf } - .terminal-750017715-r2 { fill: #606060;font-style: italic; } - .terminal-750017715-r3 { fill: #c5c8c6 } - .terminal-750017715-r4 { fill: #606060;font-weight: bold } - .terminal-750017715-r5 { fill: #6c6d4c } - .terminal-750017715-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-750017715-r7 { fill: #606060 } - .terminal-750017715-r8 { fill: #feffac } - .terminal-750017715-r9 { fill: #dfdfdf;font-weight: bold } - .terminal-750017715-r10 { fill: #0a1411 } - .terminal-750017715-r11 { fill: #8a8a8a;font-style: italic; } - .terminal-750017715-r12 { fill: #8a8a8a;font-weight: bold } - .terminal-750017715-r13 { fill: #8a8a8a } - .terminal-750017715-r14 { fill: #45ffca } - .terminal-750017715-r15 { fill: #777777 } - .terminal-750017715-r16 { fill: #ffb6d9 } - .terminal-750017715-r17 { fill: #686868 } - .terminal-750017715-r18 { fill: #ededed;font-weight: bold } - .terminal-750017715-r19 { fill: #212116;font-weight: bold } - .terminal-750017715-r20 { fill: #226d58;font-weight: bold } - .terminal-750017715-r21 { 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  @@ -911,199 +911,199 @@ font-weight: 700; } - .terminal-1128356798-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1128356798-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1128356798-r1 { fill: #606060 } - .terminal-1128356798-r2 { fill: #2d2d2d;font-style: italic; } - .terminal-1128356798-r3 { fill: #c5c8c6 } - .terminal-1128356798-r4 { fill: #2d2d2d;font-weight: bold } - .terminal-1128356798-r5 { fill: #323225 } - .terminal-1128356798-r6 { fill: #323225;font-weight: bold } - .terminal-1128356798-r7 { fill: #2d2d2d } - .terminal-1128356798-r8 { fill: #6c6d4c } - .terminal-1128356798-r9 { fill: #dfdfdf } - .terminal-1128356798-r10 { fill: #606060;font-weight: bold } - .terminal-1128356798-r11 { fill: #0b0f0e } - .terminal-1128356798-r12 { fill: #3e3e3e;font-style: italic; } - .terminal-1128356798-r13 { fill: #3e3e3e;font-weight: bold } - .terminal-1128356798-r14 { fill: #3e3e3e } - .terminal-1128356798-r15 { fill: #feffac } - .terminal-1128356798-r16 { fill: #363636 } - .terminal-1128356798-r17 { fill: #303030 } - .terminal-1128356798-r18 { fill: #666666;font-weight: bold } - .terminal-1128356798-r19 { fill: #141410;font-weight: bold } - .terminal-1128356798-r20 { fill: #14322a;font-weight: bold } - .terminal-1128356798-r21 { 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  @@ -1133,187 +1133,187 @@ font-weight: 700; } - .terminal-3495552552-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3495552552-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3495552552-r1 { fill: #c5c8c6 } - .terminal-3495552552-r2 { fill: #dfdfdf;font-style: italic; } - .terminal-3495552552-r3 { fill: #dfdfdf;font-weight: bold } - .terminal-3495552552-r4 { fill: #feffac } - .terminal-3495552552-r5 { fill: #feffac;font-weight: bold } - .terminal-3495552552-r6 { fill: #dfdfdf } - .terminal-3495552552-r7 { fill: #08211a } - .terminal-3495552552-r8 { fill: #45ffca;font-weight: bold } - .terminal-3495552552-r9 { 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  @@ -1343,187 +1343,187 @@ font-weight: 700; } - .terminal-1378739753-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1378739753-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1378739753-r1 { fill: #c5c8c6 } - .terminal-1378739753-r2 { fill: #dfdfdf;font-style: italic; } - .terminal-1378739753-r3 { fill: #dfdfdf;font-weight: bold } - .terminal-1378739753-r4 { fill: #feffac } - .terminal-1378739753-r5 { fill: #feffac;font-weight: bold } - .terminal-1378739753-r6 { fill: #dfdfdf } - .terminal-1378739753-r7 { fill: #08211a } - .terminal-1378739753-r8 { fill: #45ffca;font-weight: bold } - .terminal-1378739753-r9 { 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  @@ -1553,196 +1553,196 @@ font-weight: 700; } - .terminal-701325920-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-701325920-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-701325920-r1 { fill: #dfdfdf } - .terminal-701325920-r2 { fill: #606060;font-style: italic; } - .terminal-701325920-r3 { fill: #c5c8c6 } - .terminal-701325920-r4 { fill: #606060;font-weight: bold } - .terminal-701325920-r5 { fill: #6c6d4c } - .terminal-701325920-r6 { fill: #6c6d4c;font-weight: bold } - .terminal-701325920-r7 { fill: #606060 } - .terminal-701325920-r8 { fill: #feffac } - .terminal-701325920-r9 { fill: #0a1411 } - .terminal-701325920-r10 { fill: #777777 } - .terminal-701325920-r11 { fill: #45ffca } - .terminal-701325920-r12 { fill: #0c0c0c } - .terminal-701325920-r13 { fill: #686868 } - .terminal-701325920-r14 { fill: #ededed;font-weight: bold } - .terminal-701325920-r15 { fill: #21171c;font-weight: bold } - .terminal-701325920-r16 { fill: #212116;font-weight: bold } - .terminal-701325920-r17 { fill: #226d58;font-weight: bold } - .terminal-701325920-r18 { 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 337a208c..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-673038128-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-673038128-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-673038128-r1 { fill: #777777 } - .terminal-673038128-r2 { fill: #feffac } - .terminal-673038128-r3 { fill: #c5c8c6 } - .terminal-673038128-r4 { fill: #dfdfdf } - .terminal-673038128-r5 { fill: #858585 } - .terminal-673038128-r6 { fill: #dddddd } - .terminal-673038128-r7 { fill: #181818 } - .terminal-673038128-r8 { fill: #08211a;font-weight: bold } - .terminal-673038128-r9 { fill: #777777;font-weight: bold } - .terminal-673038128-r10 { fill: #e3e3e3 } - .terminal-673038128-r11 { fill: #1d1d1d } - .terminal-673038128-r12 { fill: #0c0c0c;font-weight: bold } - .terminal-673038128-r13 { fill: #212116;font-weight: bold } - .terminal-673038128-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". - ├─ 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 + + ╭─ 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-2942829592-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2942829592-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2942829592-r1 { fill: #777777 } - .terminal-2942829592-r2 { fill: #feffac } - .terminal-2942829592-r3 { fill: #c5c8c6 } - .terminal-2942829592-r4 { fill: #dfdfdf } - .terminal-2942829592-r5 { fill: #858585 } - .terminal-2942829592-r6 { fill: #dddddd } - .terminal-2942829592-r7 { fill: #181818 } - .terminal-2942829592-r8 { fill: #0c0c0c;font-weight: bold } - .terminal-2942829592-r9 { fill: #212116;font-weight: bold } - .terminal-2942829592-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" - ├─ 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 + + ╭─ 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-1108131652-matrix { + .terminal-9999999-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1108131652-title { + .terminal-9999999-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1108131652-r1 { fill: #777777 } - .terminal-1108131652-r2 { fill: #feffac } - .terminal-1108131652-r3 { fill: #c5c8c6 } - .terminal-1108131652-r4 { fill: #dfdfdf } - .terminal-1108131652-r5 { fill: #858585 } - .terminal-1108131652-r6 { fill: #dddddd } - .terminal-1108131652-r7 { fill: #181818 } - .terminal-1108131652-r8 { fill: #08211a;font-weight: bold } - .terminal-1108131652-r9 { fill: #777777;font-weight: bold } - .terminal-1108131652-r10 { fill: #e3e3e3 } - .terminal-1108131652-r11 { fill: #1d1d1d } - .terminal-1108131652-r12 { fill: #0c0c0c;font-weight: bold } - .terminal-1108131652-r13 { fill: #212116;font-weight: bold } - .terminal-1108131652-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"."" - ├─ 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 + + ╭─ 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/test_data_catalog.py b/tests/functional_tests/test_data_catalog.py index fa9e2189..83ea2b75 100644 --- a/tests/functional_tests/test_data_catalog.py +++ b/tests/functional_tests/test_data_catalog.py @@ -47,7 +47,8 @@ async def test_data_catalog( app = app_multi_duck async with app.run_test(size=(120, 36)) as pilot: await wait_for_workers(app) - await pilot.pause() + 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")) @@ -143,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 @@ -176,7 +178,8 @@ async def test_s3_tree( ) async with app.run_test(size=(120, 36)) as pilot: await wait_for_workers(app) - await pilot.pause() + while app.editor is None: + await pilot.pause() catalog = app.data_catalog assert catalog.s3_tree is not None @@ -209,7 +212,8 @@ async def test_s3_tree_does_not_crash_without_boto3( ) async with app.run_test(size=(120, 36)) as pilot: await wait_for_workers(app) - await pilot.pause() + while app.editor is None: + await pilot.pause() assert await app_snapshot(app, "Error visible") @@ -223,6 +227,8 @@ async def test_context_menu( 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 (